{
  "_format": "hh-sol-artifact-1",
  "contractName": "MockERC721K",
  "sourceName": "contracts/mocks/MockERC721K.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "erc721Storage",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AlreadyMinted",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidRecipient",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NewOwnerIsZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoHandoverRequest",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotAuthorized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotMinted",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnsafeRecipient",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "WrongFrom",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "erc721Storage",
          "type": "address"
        }
      ],
      "name": "ERC721StorageUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "RolesUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cancelOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "completeOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "contractURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getERC721Storage",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "grantRoles",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "hasAllRoles",
      "outputs": [
        {
          "internalType": "bool",
          "name": "result",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "hasAnyRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "result",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "ordinalsFromRoles",
      "outputs": [
        {
          "internalType": "uint8[]",
          "name": "ordinals",
          "type": "uint8[]"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "result",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "ownershipHandoverExpiresAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ownershipHandoverValidFor",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "renounceRoles",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "requestOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "revokeRoles",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8[]",
          "name": "ordinals",
          "type": "uint8[]"
        }
      ],
      "name": "rolesFromOrdinals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        }
      ],
      "name": "rolesOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "erc721Storage",
          "type": "address"
        }
      ],
      "name": "setStorage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b506040516200196038038062001960833981016040819052620000349162000194565b82828282826000620000478382620002b0565b506001620000568282620002b0565b5050600780546001600160a01b0319166001600160a01b038416179055506200007f336200008b565b5050505050506200037c565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000ef57600080fd5b81516001600160401b03808211156200010c576200010c620000c7565b604051601f8301601f19908116603f01168101908282118183101715620001375762000137620000c7565b816040528381526020925086838588010111156200015457600080fd5b600091505b8382101562000178578582018301518183018401529082019062000159565b838211156200018a5760008385830101525b9695505050505050565b600080600060608486031215620001aa57600080fd5b83516001600160401b0380821115620001c257600080fd5b620001d087838801620000dd565b94506020860151915080821115620001e757600080fd5b50620001f686828701620000dd565b604086015190935090506001600160a01b03811681146200021657600080fd5b809150509250925092565b600181811c908216806200023657607f821691505b6020821081036200025757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ab57600081815260208120601f850160051c81016020861015620002865750805b601f850160051c820191505b81811015620002a75782815560010162000292565b5050505b505050565b81516001600160401b03811115620002cc57620002cc620000c7565b620002e481620002dd845462000221565b846200025d565b602080601f8311600181146200031c5760008415620003035750858301515b600019600386901b1c1916600185901b178555620002a7565b600085815260208120601f198616915b828110156200034d578886015182559484019460019091019084016200032c565b50858210156200036c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6115d4806200038c6000396000f3fe6080604052600436106101ee5760003560e01c80636352211e1161010d578063a22cb465116100a0578063e8a3d4851161006f578063e8a3d48514610584578063e985e9c514610599578063f04e283e146105d4578063f2fde38b146105e7578063fee81cf4146105fa57600080fd5b8063a22cb46514610506578063b88d4fde14610526578063c87b56dd14610546578063d7533f021461056657600080fd5b806387a89ee6116100dc57806387a89ee61461049a5780638da5cb5b146104b85780639137c1a7146104d157806395d89b41146104f157600080fd5b80636352211e1461042557806370a0823114610445578063715018a6146104655780637359e41f1461046d57600080fd5b80631cd64df41161018557806342842e0e1161015457806342842e0e146103b35780634a4ee7b1146103d3578063514e62fc146103e657806354d1f13d1461041d57600080fd5b80631cd64df41461032357806323b872dd1461035a578063256929621461037a5780632de948071461038257600080fd5b806313a661ed116101c157806313a661ed146102ba57806318160ddd146102e8578063183a4f6e146102fd5780631c10893f1461031057600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611095565b61062b565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d61063c565b60405161021f9190611115565b34801561025657600080fd5b50610280610265366004611128565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b3480156102a457600080fd5b506102b86102b3366004611158565b6106ca565b005b3480156102c657600080fd5b506102da6102d53660046111c9565b610790565b60405190815260200161021f565b3480156102f457600080fd5b506006546102da565b6102b861030b366004611128565b6107c3565b6102b861031e366004611158565b6107d0565b34801561032f57600080fd5b5061021361033e366004611158565b60609190911b638b78c6d8176000908152602090205481161490565b34801561036657600080fd5b506102b8610375366004611282565b6107f9565b6102b8610967565b34801561038e57600080fd5b506102da61039d3660046112be565b60601b638b78c6d8176000908152602090205490565b3480156103bf57600080fd5b506102b86103ce366004611282565b6109b8565b6102b86103e1366004611158565b610a8b565b3480156103f257600080fd5b50610213610401366004611158565b60609190911b638b78c6d8176000908152602090205416151590565b6102b8610ab0565b34801561043157600080fd5b50610280610440366004611128565b610aed565b34801561045157600080fd5b506102da6104603660046112be565b610b28565b6102b8610b6d565b34801561047957600080fd5b5061048d610488366004611128565b610bbb565b60405161021f91906112d9565b3480156104a657600080fd5b506007546001600160a01b0316610280565b3480156104c457600080fd5b50638b78c6d81954610280565b3480156104dd57600080fd5b506102b86104ec3660046112be565b610c03565b3480156104fd57600080fd5b5061023d610c72565b34801561051257600080fd5b506102b8610521366004611320565b610c7f565b34801561053257600080fd5b506102b861054136600461135c565b610ceb565b34801561055257600080fd5b5061023d610561366004611128565b610dae565b34801561057257600080fd5b506040516202a300815260200161021f565b34801561059057600080fd5b5061023d610e34565b3480156105a557600080fd5b506102136105b43660046113f7565b600560209081526000928352604080842090915290825290205460ff1681565b6102b86105e23660046112be565b610eab565b6102b86105f53660046112be565b610f2d565b34801561060657600080fd5b506102da6106153660046112be565b60601b63389a75e1176000908152602090205490565b600061063682610f94565b92915050565b600080546106499061142a565b80601f01602080910402602001604051908101604052809291908181526020018280546106759061142a565b80156106c25780601f10610697576101008083540402835291602001916106c2565b820191906000526020600020905b8154815290600101906020018083116106a557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b031633811480159061071657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff16155b156107345760405163ea8e4eb560e01b815260040160405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600060208201825160051b81015b8082146107bc57600160ff8351161b8317925060208201915061079e565b5050919050565b6107cd3382610fe2565b50565b638b78c6d8195433146107eb576382b429006000526004601cfd5b6107f58282611033565b5050565b6000818152600260205260409020546001600160a01b038481169116146108335760405163c6de3f2560e01b815260040160405180910390fd5b6001600160a01b03821661085a57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061089757506001600160a01b038316600090815260056020908152604080832033845290915290205460ff16155b80156108ba57506000818152600460205260409020546001600160a01b03163314155b156108d85760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006202a30067ffffffffffffffff164201905063389a75e13360601b1760005280602060002055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6109c38383836107f9565b6001600160a01b0382163b15610a8657604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5e9190611464565b6001600160e01b03191614610a8657604051633da6393160e01b815260040160405180910390fd5b505050565b638b78c6d819543314610aa6576382b429006000526004601cfd5b6107f58282610fe2565b63389a75e13360601b176000526000602060002055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6000818152600260205260409020546001600160a01b031680610b2357604051634d5e5fb360e01b815260040160405180910390fd5b919050565b60006001600160a01b038216610b515760405163d92e233d60e01b815260040160405180910390fd5b506001600160a01b031660009081526003602052604090205490565b638b78c6d819543314610b88576382b429006000526004601cfd5b6000337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36000638b78c6d81955565b606060206040510160005b8082526001841660051b820191508360011c93508315610be857600101610bc6565b5060405191508060405260208201810360051c825250919050565b638b78c6d819543314610c1e576382b429006000526004601cfd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd833c7cea3bce2562e201bf7e85016d0bc1173580c719f63378cc5d0457552b69060200160405180910390a150565b600180546106499061142a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610cf68585856107f9565b6001600160a01b0384163b15610da757604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d3c9033908a90899089908990600401611481565b6020604051808303816000875af1158015610d5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7f9190611464565b6001600160e01b03191614610da757604051633da6393160e01b815260040160405180910390fd5b5050505050565b600754604051637833cb0b60e11b8152606091829182916001600160a01b03169063f067961690610de7908790859081906004016114d5565b600060405180830381865afa158015610e04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e2c919081019061150a565b949350505050565b60075460408051631c97e82760e21b815290516060926001600160a01b03169163725fa09c9160048083019260009291908290030181865afa158015610e7e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ea6919081019061150a565b905090565b638b78c6d819543314610ec6576382b429006000526004601cfd5b8060601b60601c905063389a75e18160601b1760005260206000208054421115610ef857636f5e88186000526004601cfd5b600081555080337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b638b78c6d819543314610f48576382b429006000526004601cfd5b6001600160a01b031680610f6457637448fbae6000526004601cfd5b80337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b60006301ffc9a760e01b6001600160e01b031983161480610fc557506380ac58cd60e01b6001600160e01b03198316145b806106365750506001600160e01b031916635b5e139f60e01b1490565b638b78c6d88260601b176000526020600020805482811681189050808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b638b78c6d88260601b17600052602060002081815417808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b6001600160e01b0319811681146107cd57600080fd5b6000602082840312156110a757600080fd5b81356110b28161107f565b9392505050565b60005b838110156110d45781810151838201526020016110bc565b838111156110e3576000848401525b50505050565b600081518084526111018160208601602086016110b9565b601f01601f19169290920160200192915050565b6020815260006110b260208301846110e9565b60006020828403121561113a57600080fd5b5035919050565b80356001600160a01b0381168114610b2357600080fd5b6000806040838503121561116b57600080fd5b61117483611141565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156111c1576111c1611182565b604052919050565b600060208083850312156111dc57600080fd5b823567ffffffffffffffff808211156111f457600080fd5b818501915085601f83011261120857600080fd5b81358181111561121a5761121a611182565b8060051b915061122b848301611198565b818152918301840191848101908884111561124557600080fd5b938501935b83851015611276578435925060ff831683146112665760008081fd5b828252938501939085019061124a565b98975050505050505050565b60008060006060848603121561129757600080fd5b6112a084611141565b92506112ae60208501611141565b9150604084013590509250925092565b6000602082840312156112d057600080fd5b6110b282611141565b6020808252825182820181905260009190848201906040850190845b8181101561131457835160ff16835292840192918401916001016112f5565b50909695505050505050565b6000806040838503121561133357600080fd5b61133c83611141565b91506020830135801515811461135157600080fd5b809150509250929050565b60008060008060006080868803121561137457600080fd5b61137d86611141565b945061138b60208701611141565b935060408601359250606086013567ffffffffffffffff808211156113af57600080fd5b818801915088601f8301126113c357600080fd5b8135818111156113d257600080fd5b8960208285010111156113e457600080fd5b9699959850939650602001949392505050565b6000806040838503121561140a57600080fd5b61141383611141565b915061142160208401611141565b90509250929050565b600181811c9082168061143e57607f821691505b60208210810361145e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561147657600080fd5b81516110b28161107f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b8381526060602082015260006114ee60608301856110e9565b828103604084015261150081856110e9565b9695505050505050565b60006020828403121561151c57600080fd5b815167ffffffffffffffff8082111561153457600080fd5b818401915084601f83011261154857600080fd5b81518181111561155a5761155a611182565b61156d601f8201601f1916602001611198565b915080825285602082850101111561158457600080fd5b6115958160208401602086016110b9565b5094935050505056fea264697066735822122010083e5b8217fe6aec9729846127d9ae66455fcf987c54d2f34bf4e9c3b2a49364736f6c634300080f0033",
  "deployedBytecode": "0x6080604052600436106101ee5760003560e01c80636352211e1161010d578063a22cb465116100a0578063e8a3d4851161006f578063e8a3d48514610584578063e985e9c514610599578063f04e283e146105d4578063f2fde38b146105e7578063fee81cf4146105fa57600080fd5b8063a22cb46514610506578063b88d4fde14610526578063c87b56dd14610546578063d7533f021461056657600080fd5b806387a89ee6116100dc57806387a89ee61461049a5780638da5cb5b146104b85780639137c1a7146104d157806395d89b41146104f157600080fd5b80636352211e1461042557806370a0823114610445578063715018a6146104655780637359e41f1461046d57600080fd5b80631cd64df41161018557806342842e0e1161015457806342842e0e146103b35780634a4ee7b1146103d3578063514e62fc146103e657806354d1f13d1461041d57600080fd5b80631cd64df41461032357806323b872dd1461035a578063256929621461037a5780632de948071461038257600080fd5b806313a661ed116101c157806313a661ed146102ba57806318160ddd146102e8578063183a4f6e146102fd5780631c10893f1461031057600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611095565b61062b565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d61063c565b60405161021f9190611115565b34801561025657600080fd5b50610280610265366004611128565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b3480156102a457600080fd5b506102b86102b3366004611158565b6106ca565b005b3480156102c657600080fd5b506102da6102d53660046111c9565b610790565b60405190815260200161021f565b3480156102f457600080fd5b506006546102da565b6102b861030b366004611128565b6107c3565b6102b861031e366004611158565b6107d0565b34801561032f57600080fd5b5061021361033e366004611158565b60609190911b638b78c6d8176000908152602090205481161490565b34801561036657600080fd5b506102b8610375366004611282565b6107f9565b6102b8610967565b34801561038e57600080fd5b506102da61039d3660046112be565b60601b638b78c6d8176000908152602090205490565b3480156103bf57600080fd5b506102b86103ce366004611282565b6109b8565b6102b86103e1366004611158565b610a8b565b3480156103f257600080fd5b50610213610401366004611158565b60609190911b638b78c6d8176000908152602090205416151590565b6102b8610ab0565b34801561043157600080fd5b50610280610440366004611128565b610aed565b34801561045157600080fd5b506102da6104603660046112be565b610b28565b6102b8610b6d565b34801561047957600080fd5b5061048d610488366004611128565b610bbb565b60405161021f91906112d9565b3480156104a657600080fd5b506007546001600160a01b0316610280565b3480156104c457600080fd5b50638b78c6d81954610280565b3480156104dd57600080fd5b506102b86104ec3660046112be565b610c03565b3480156104fd57600080fd5b5061023d610c72565b34801561051257600080fd5b506102b8610521366004611320565b610c7f565b34801561053257600080fd5b506102b861054136600461135c565b610ceb565b34801561055257600080fd5b5061023d610561366004611128565b610dae565b34801561057257600080fd5b506040516202a300815260200161021f565b34801561059057600080fd5b5061023d610e34565b3480156105a557600080fd5b506102136105b43660046113f7565b600560209081526000928352604080842090915290825290205460ff1681565b6102b86105e23660046112be565b610eab565b6102b86105f53660046112be565b610f2d565b34801561060657600080fd5b506102da6106153660046112be565b60601b63389a75e1176000908152602090205490565b600061063682610f94565b92915050565b600080546106499061142a565b80601f01602080910402602001604051908101604052809291908181526020018280546106759061142a565b80156106c25780601f10610697576101008083540402835291602001916106c2565b820191906000526020600020905b8154815290600101906020018083116106a557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b031633811480159061071657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff16155b156107345760405163ea8e4eb560e01b815260040160405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600060208201825160051b81015b8082146107bc57600160ff8351161b8317925060208201915061079e565b5050919050565b6107cd3382610fe2565b50565b638b78c6d8195433146107eb576382b429006000526004601cfd5b6107f58282611033565b5050565b6000818152600260205260409020546001600160a01b038481169116146108335760405163c6de3f2560e01b815260040160405180910390fd5b6001600160a01b03821661085a57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061089757506001600160a01b038316600090815260056020908152604080832033845290915290205460ff16155b80156108ba57506000818152600460205260409020546001600160a01b03163314155b156108d85760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006202a30067ffffffffffffffff164201905063389a75e13360601b1760005280602060002055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6109c38383836107f9565b6001600160a01b0382163b15610a8657604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5e9190611464565b6001600160e01b03191614610a8657604051633da6393160e01b815260040160405180910390fd5b505050565b638b78c6d819543314610aa6576382b429006000526004601cfd5b6107f58282610fe2565b63389a75e13360601b176000526000602060002055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6000818152600260205260409020546001600160a01b031680610b2357604051634d5e5fb360e01b815260040160405180910390fd5b919050565b60006001600160a01b038216610b515760405163d92e233d60e01b815260040160405180910390fd5b506001600160a01b031660009081526003602052604090205490565b638b78c6d819543314610b88576382b429006000526004601cfd5b6000337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36000638b78c6d81955565b606060206040510160005b8082526001841660051b820191508360011c93508315610be857600101610bc6565b5060405191508060405260208201810360051c825250919050565b638b78c6d819543314610c1e576382b429006000526004601cfd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd833c7cea3bce2562e201bf7e85016d0bc1173580c719f63378cc5d0457552b69060200160405180910390a150565b600180546106499061142a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610cf68585856107f9565b6001600160a01b0384163b15610da757604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d3c9033908a90899089908990600401611481565b6020604051808303816000875af1158015610d5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7f9190611464565b6001600160e01b03191614610da757604051633da6393160e01b815260040160405180910390fd5b5050505050565b600754604051637833cb0b60e11b8152606091829182916001600160a01b03169063f067961690610de7908790859081906004016114d5565b600060405180830381865afa158015610e04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e2c919081019061150a565b949350505050565b60075460408051631c97e82760e21b815290516060926001600160a01b03169163725fa09c9160048083019260009291908290030181865afa158015610e7e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ea6919081019061150a565b905090565b638b78c6d819543314610ec6576382b429006000526004601cfd5b8060601b60601c905063389a75e18160601b1760005260206000208054421115610ef857636f5e88186000526004601cfd5b600081555080337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b638b78c6d819543314610f48576382b429006000526004601cfd5b6001600160a01b031680610f6457637448fbae6000526004601cfd5b80337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b60006301ffc9a760e01b6001600160e01b031983161480610fc557506380ac58cd60e01b6001600160e01b03198316145b806106365750506001600160e01b031916635b5e139f60e01b1490565b638b78c6d88260601b176000526020600020805482811681189050808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b638b78c6d88260601b17600052602060002081815417808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b6001600160e01b0319811681146107cd57600080fd5b6000602082840312156110a757600080fd5b81356110b28161107f565b9392505050565b60005b838110156110d45781810151838201526020016110bc565b838111156110e3576000848401525b50505050565b600081518084526111018160208601602086016110b9565b601f01601f19169290920160200192915050565b6020815260006110b260208301846110e9565b60006020828403121561113a57600080fd5b5035919050565b80356001600160a01b0381168114610b2357600080fd5b6000806040838503121561116b57600080fd5b61117483611141565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156111c1576111c1611182565b604052919050565b600060208083850312156111dc57600080fd5b823567ffffffffffffffff808211156111f457600080fd5b818501915085601f83011261120857600080fd5b81358181111561121a5761121a611182565b8060051b915061122b848301611198565b818152918301840191848101908884111561124557600080fd5b938501935b83851015611276578435925060ff831683146112665760008081fd5b828252938501939085019061124a565b98975050505050505050565b60008060006060848603121561129757600080fd5b6112a084611141565b92506112ae60208501611141565b9150604084013590509250925092565b6000602082840312156112d057600080fd5b6110b282611141565b6020808252825182820181905260009190848201906040850190845b8181101561131457835160ff16835292840192918401916001016112f5565b50909695505050505050565b6000806040838503121561133357600080fd5b61133c83611141565b91506020830135801515811461135157600080fd5b809150509250929050565b60008060008060006080868803121561137457600080fd5b61137d86611141565b945061138b60208701611141565b935060408601359250606086013567ffffffffffffffff808211156113af57600080fd5b818801915088601f8301126113c357600080fd5b8135818111156113d257600080fd5b8960208285010111156113e457600080fd5b9699959850939650602001949392505050565b6000806040838503121561140a57600080fd5b61141383611141565b915061142160208401611141565b90509250929050565b600181811c9082168061143e57607f821691505b60208210810361145e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561147657600080fd5b81516110b28161107f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b8381526060602082015260006114ee60608301856110e9565b828103604084015261150081856110e9565b9695505050505050565b60006020828403121561151c57600080fd5b815167ffffffffffffffff8082111561153457600080fd5b818401915084601f83011261154857600080fd5b81518181111561155a5761155a611182565b61156d601f8201601f1916602001611198565b915080825285602082850101111561158457600080fd5b6115958160208401602086016110b9565b5094935050505056fea264697066735822122010083e5b8217fe6aec9729846127d9ae66455fcf987c54d2f34bf4e9c3b2a49364736f6c634300080f0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
