{
  "_format": "hh-sol-artifact-1",
  "contractName": "VaultV2Mock",
  "sourceName": "contracts/mock/VaultV2Mock.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "contract IERC20Metadata",
          "name": "asset_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "allowance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSpender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxMint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxRedeem",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxWithdraw",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "VaultIsBroken",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Deposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "OVERRIDE_UNSET",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "_totalAssets",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "asset",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "broken",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "convertToAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "convertToShares",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "assets",
          "type": "int256"
        }
      ],
      "name": "discreteEarning",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastUpdate",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "redeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "broken_",
          "type": "bool"
        }
      ],
      "name": "setBroken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum TestERC4626.OverrideOption",
          "name": "option",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "newValue",
          "type": "uint256"
        }
      ],
      "name": "setOverride",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateCachedTotalAssets",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405234801561000f575f5ffd5b50604051611b75380380611b7583398101604081905261002e91610200565b82828280838360036100408382610309565b50600461004d8282610309565b5050505f5f610061836100b160201b60201c565b9150915081610071576012610073565b805b60ff1660a05250506001600160a01b031660805261009360635f196103c3565b600681905560078190556008819055600955506103e8945050505050565b5f80806100bd60405190565b6040805160048152602481019091526020810180516001600160e01b0390811663313ce56760e01b179091529192505f9182916100fd9188919061014216565b50909250905061010c83604052565b81801561011a575060203d10155b8015610127575060ff8111155b610132575f5f610136565b6001815b94509450505050915091565b5f5f5f60405f855160208701885afa92505f51915060205190509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610186575f5ffd5b81516001600160401b0381111561019f5761019f610163565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101cd576101cd610163565b6040528181528382016020018510156101e4575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f60608486031215610212575f5ffd5b83516001600160401b03811115610227575f5ffd5b61023386828701610177565b602086015190945090506001600160401b03811115610250575f5ffd5b61025c86828701610177565b604086015190935090506001600160a01b038116811461027a575f5ffd5b809150509250925092565b600181811c9082168061029957607f821691505b6020821081036102b757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561030457805f5260205f20601f840160051c810160208510156102e25750805b601f840160051c820191505b81811015610301575f81556001016102ee565b50505b505050565b81516001600160401b0381111561032257610322610163565b610336816103308454610285565b846102bd565b6020601f821160018114610368575f83156103515750848201515b5f19600385901b1c1916600184901b178455610301565b5f84815260208120601f198516915b828110156103975787850151825560209485019460019092019101610377565b50848210156103b457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b818103818111156103e257634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05161174961042c5f395f6106a601525f81816102ef0152818161052a015281816108b60152818161091301528181610fd8015261108a01526117495ff3fe608060405234801561000f575f5ffd5b506004361061021e575f3560e01c806394bf804d1161012a578063c7361ed2116100b4578063d905777e11610079578063d905777e146104cc578063dd62ed3e146104df578063ef8b30f71461044c578063f0fe6ef814610517578063f3c0b8921461051f575f5ffd5b8063c7361ed21461045f578063cc7fcc6014610472578063ce04bebb1461047b578063ce96cb77146104a6578063d6dd0234146104b9575f5ffd5b8063b460af94116100fa578063b460af94146103df578063ba087652146103f2578063c046371114610405578063c63d75b614610439578063c6e6f5921461044c575f5ffd5b806394bf804d1461039e57806395d89b41146103b1578063a9059cbb146103b9578063b3d7f6b9146103cc575f5ffd5b806338359018116101ab5780634cdad5061161017b5780634cdad5061461025b5780636e553f651461033557806370a08231146103485780637fb1ad621461037057806386de9e4f1461037b575f5ffd5b806338359018146102d957806338d52e0f146102e257806339d88aff14610319578063402d267d14610322575f5ffd5b8063095ea7b3116101f1578063095ea7b31461026e5780630a28a4771461029157806318160ddd146102a457806323b872dd146102ac578063313ce567146102bf575f5ffd5b806301e1d11414610222578063034548cd1461023d57806306fdde031461024657806307a2d13a1461025b575b5f5ffd5b61022a610527565b6040519081526020015b60405180910390f35b61022a60075481565b61024e6105b6565b60405161023491906112e6565b61022a61026936600461131b565b610646565b61028161027c36600461134d565b610657565b6040519015158152602001610234565b61022a61029f36600461131b565b61066e565b60025461022a565b6102816102ba366004611375565b61067a565b6102c761069f565b60405160ff9091168152602001610234565b61022a60085481565b6040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610234565b61022a60065481565b61022a6103303660046113af565b6106ca565b61022a6103433660046113c8565b6106ee565b61022a6103563660046113af565b6001600160a01b03165f9081526020819052604090205490565b60055460ff16610281565b61039c6103893660046113f2565b6005805460ff1916911515919091179055565b005b61022a6103ac3660046113c8565b61074b565b61024e610797565b6102816103c736600461134d565b6107a6565b61022a6103da36600461131b565b6107b3565b61022a6103ed366004611411565b6107bf565b61022a610400366004611411565b610815565b600a5461042090600160801b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610234565b61022a6104473660046113af565b610862565b61022a61045a36600461131b565b61087f565b61039c61046d36600461131b565b61088a565b61022a60095481565b600a5461048e906001600160801b031681565b6040516001600160801b039091168152602001610234565b61022a6104b43660046113af565b61097b565b61039c6104c736600461144a565b6109a1565b61022a6104da3660046113af565b610a20565b61022a6104ed366004611469565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61039c610a46565b61022a610a84565b5f7f00000000000000000000000000000000000000000000000000000000000000006040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561058d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b19190611491565b905090565b6060600380546105c5906114a8565b80601f01602080910402602001604051908101604052809291908181526020018280546105f1906114a8565b801561063c5780601f106106135761010080835404028352916020019161063c565b820191905f5260205f20905b81548152906001019060200180831161061f57829003601f168201915b5050505050905090565b5f610651825f610a93565b92915050565b5f33610664818585610acb565b5060019392505050565b5f610651826001610add565b5f33610687858285610b0c565b610692858585610b75565b60019150505b9392505050565b5f6105b1817f00000000000000000000000000000000000000000000000000000000000000006114f4565b5f6106d760635f1961150d565b600654146106e757600654610651565b5f19610651565b5f5f6106f9836106ca565b90508084111561072b57828482604051633c8097d960e11b815260040161072293929190611520565b60405180910390fd5b5f6107358561087f565b905061074333858784610bd2565b949350505050565b5f5f61075683610862565b90508084111561077f5782848260405163284ff66760e01b815260040161072293929190611520565b5f610789856107b3565b905061074333858388610bd2565b6060600480546105c5906114a8565b5f33610664818585610b75565b5f610651826001610a93565b5f5f6107ca8361097b565b9050808511156107f357828582604051633fa733bb60e21b815260040161072293929190611520565b5f6107fd8661066e565b905061080c3386868985610be6565b95945050505050565b5f5f61082083610a20565b90508085111561084957828582604051632e52afbb60e21b815260040161072293929190611520565b5f61085386610646565b905061080c338686848a610be6565b5f61086f60635f1961150d565b600754146106e757600754610651565b5f610651825f610add565b5f811315610911576040516340c10f1960e01b8152306004820152602481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b5f604051808303815f87803b1580156108f8575f5ffd5b505af115801561090a573d5f5f3e3d5ffd5b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639dc29fac3061094a84611541565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016108e1565b5f61098860635f1961150d565b6008541461099857600854610651565b61065182610bfb565b5f8260038111156109b4576109b461155b565b036109bf5760068190555b60018260038111156109d3576109d361155b565b036109de5760078190555b60028260038111156109f2576109f261155b565b036109fd5760088190555b6003826003811115610a1157610a1161155b565b03610a1c5760098190555b5050565b5f610a2d60635f1961150d565b60095414610a3d57600954610651565b61065182610c08565b610a4e610527565b600a80546001600160801b03929092166001600160c01b031990921691909117600160801b4267ffffffffffffffff1602179055565b610a9060635f1961150d565b81565b5f610698610a9f610527565b610aaa90600161156f565b610ab55f600a611665565b600254610ac2919061156f565b85919085610c25565b610ad88383836001610c67565b505050565b5f610698610aec82600a611665565b600254610af9919061156f565b610b01610527565b610ac290600161156f565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610b6f5781811015610b6157828183604051637dc7a0d960e11b815260040161072293929190611520565b610b6f84848484035f610c67565b50505050565b6001600160a01b038316610b9e57604051634b637e8f60e11b81525f6004820152602401610722565b6001600160a01b038216610bc75760405163ec442f0560e01b81525f6004820152602401610722565b610ad8838383610d39565b610bde84848484610e4c565b610b6f610a46565b610bf38585858585610ea1565b61090a610a46565b5f61065161026983610a20565b6001600160a01b0381165f90815260208190526040812054610651565b5f610c52610c3283610ef7565b8015610c4d57505f8480610c4857610c48611673565b868809115b151590565b610c5d868686610f23565b61080c919061156f565b6001600160a01b038416610c905760405163e602df0560e01b81525f6004820152602401610722565b6001600160a01b038316610cb957604051634a1406b160e11b81525f6004820152602401610722565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610b6f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d2b91815260200190565b60405180910390a350505050565b6001600160a01b038316610d63578060025f828254610d58919061156f565b90915550610dc09050565b6001600160a01b0383165f9081526020819052604090205481811015610da25783818360405163391434e360e21b815260040161072293929190611520565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610ddc57600280548290039055610dfa565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3f91815260200190565b60405180910390a3505050565b60055460ff1615610e6060045f3681611687565b610e69916116ae565b90610e94576040516340c2fd5360e11b81526001600160e01b03199091166004820152602401610722565b50610b6f84848484610fd3565b60055460ff1615610eb560045f3681611687565b610ebe916116ae565b90610ee9576040516340c2fd5360e11b81526001600160e01b03199091166004820152602401610722565b5061090a8585858585611057565b5f6002826003811115610f0c57610f0c61155b565b610f1691906116e6565b60ff166001149050919050565b5f5f5f610f308686611117565b91509150815f03610f5457838181610f4a57610f4a611673565b0492505050610698565b818411610f6b57610f6b6003851502601118611133565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b610fff7f0000000000000000000000000000000000000000000000000000000000000000853085611144565b611009838261117a565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610d2b929190918252602082015260400190565b826001600160a01b0316856001600160a01b03161461107b5761107b838683610b0c565b61108583826111ae565b6110b07f000000000000000000000000000000000000000000000000000000000000000085846111e2565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051611108929190918252602082015260400190565b60405180910390a45050505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b611152848484846001611217565b610b6f57604051635274afe760e01b81526001600160a01b0385166004820152602401610722565b6001600160a01b0382166111a35760405163ec442f0560e01b81525f6004820152602401610722565b610a1c5f8383610d39565b6001600160a01b0382166111d757604051634b637e8f60e11b81525f6004820152602401610722565b610a1c825f83610d39565b6111ef8383836001611284565b610ad857604051635274afe760e01b81526001600160a01b0384166004820152602401610722565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316611273578383151615611267573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166112da5783831516156112ce573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561132b575f5ffd5b5035919050565b80356001600160a01b0381168114611348575f5ffd5b919050565b5f5f6040838503121561135e575f5ffd5b61136783611332565b946020939093013593505050565b5f5f5f60608486031215611387575f5ffd5b61139084611332565b925061139e60208501611332565b929592945050506040919091013590565b5f602082840312156113bf575f5ffd5b61069882611332565b5f5f604083850312156113d9575f5ffd5b823591506113e960208401611332565b90509250929050565b5f60208284031215611402575f5ffd5b81358015158114610698575f5ffd5b5f5f5f60608486031215611423575f5ffd5b8335925061143360208501611332565b915061144160408501611332565b90509250925092565b5f5f6040838503121561145b575f5ffd5b823560048110611367575f5ffd5b5f5f6040838503121561147a575f5ffd5b61148383611332565b91506113e960208401611332565b5f602082840312156114a1575f5ffd5b5051919050565b600181811c908216806114bc57607f821691505b6020821081036114da57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610651576106516114e0565b81810381811115610651576106516114e0565b6001600160a01b039390931683526020830191909152604082015260600190565b5f600160ff1b8201611555576115556114e0565b505f0390565b634e487b7160e01b5f52602160045260245ffd5b80820180821115610651576106516114e0565b6001815b60018411156115bd578085048111156115a1576115a16114e0565b60018416156115af57908102905b60019390931c928002611586565b935093915050565b5f826115d357506001610651565b816115df57505f610651565b81600181146115f557600281146115ff5761161b565b6001915050610651565b60ff841115611610576116106114e0565b50506001821b610651565b5060208310610133831016604e8410600b841016171561163e575081810a610651565b61164a5f198484611582565b805f190482111561165d5761165d6114e0565b029392505050565b5f61069860ff8416836115c5565b634e487b7160e01b5f52601260045260245ffd5b5f5f85851115611695575f5ffd5b838611156116a1575f5ffd5b5050820193919092039150565b80356001600160e01b031981169060048410156116df576001600160e01b0319600485900360031b81901b82161691505b5092915050565b5f60ff83168061170457634e487b7160e01b5f52601260045260245ffd5b8060ff8416069150509291505056fea2646970667358221220707e46fbe4e821febfd486cff17e5084815ceb26aff5470004a675034c61447764736f6c634300081e0033",
  "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061021e575f3560e01c806394bf804d1161012a578063c7361ed2116100b4578063d905777e11610079578063d905777e146104cc578063dd62ed3e146104df578063ef8b30f71461044c578063f0fe6ef814610517578063f3c0b8921461051f575f5ffd5b8063c7361ed21461045f578063cc7fcc6014610472578063ce04bebb1461047b578063ce96cb77146104a6578063d6dd0234146104b9575f5ffd5b8063b460af94116100fa578063b460af94146103df578063ba087652146103f2578063c046371114610405578063c63d75b614610439578063c6e6f5921461044c575f5ffd5b806394bf804d1461039e57806395d89b41146103b1578063a9059cbb146103b9578063b3d7f6b9146103cc575f5ffd5b806338359018116101ab5780634cdad5061161017b5780634cdad5061461025b5780636e553f651461033557806370a08231146103485780637fb1ad621461037057806386de9e4f1461037b575f5ffd5b806338359018146102d957806338d52e0f146102e257806339d88aff14610319578063402d267d14610322575f5ffd5b8063095ea7b3116101f1578063095ea7b31461026e5780630a28a4771461029157806318160ddd146102a457806323b872dd146102ac578063313ce567146102bf575f5ffd5b806301e1d11414610222578063034548cd1461023d57806306fdde031461024657806307a2d13a1461025b575b5f5ffd5b61022a610527565b6040519081526020015b60405180910390f35b61022a60075481565b61024e6105b6565b60405161023491906112e6565b61022a61026936600461131b565b610646565b61028161027c36600461134d565b610657565b6040519015158152602001610234565b61022a61029f36600461131b565b61066e565b60025461022a565b6102816102ba366004611375565b61067a565b6102c761069f565b60405160ff9091168152602001610234565b61022a60085481565b6040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610234565b61022a60065481565b61022a6103303660046113af565b6106ca565b61022a6103433660046113c8565b6106ee565b61022a6103563660046113af565b6001600160a01b03165f9081526020819052604090205490565b60055460ff16610281565b61039c6103893660046113f2565b6005805460ff1916911515919091179055565b005b61022a6103ac3660046113c8565b61074b565b61024e610797565b6102816103c736600461134d565b6107a6565b61022a6103da36600461131b565b6107b3565b61022a6103ed366004611411565b6107bf565b61022a610400366004611411565b610815565b600a5461042090600160801b900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610234565b61022a6104473660046113af565b610862565b61022a61045a36600461131b565b61087f565b61039c61046d36600461131b565b61088a565b61022a60095481565b600a5461048e906001600160801b031681565b6040516001600160801b039091168152602001610234565b61022a6104b43660046113af565b61097b565b61039c6104c736600461144a565b6109a1565b61022a6104da3660046113af565b610a20565b61022a6104ed366004611469565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61039c610a46565b61022a610a84565b5f7f00000000000000000000000000000000000000000000000000000000000000006040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561058d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b19190611491565b905090565b6060600380546105c5906114a8565b80601f01602080910402602001604051908101604052809291908181526020018280546105f1906114a8565b801561063c5780601f106106135761010080835404028352916020019161063c565b820191905f5260205f20905b81548152906001019060200180831161061f57829003601f168201915b5050505050905090565b5f610651825f610a93565b92915050565b5f33610664818585610acb565b5060019392505050565b5f610651826001610add565b5f33610687858285610b0c565b610692858585610b75565b60019150505b9392505050565b5f6105b1817f00000000000000000000000000000000000000000000000000000000000000006114f4565b5f6106d760635f1961150d565b600654146106e757600654610651565b5f19610651565b5f5f6106f9836106ca565b90508084111561072b57828482604051633c8097d960e11b815260040161072293929190611520565b60405180910390fd5b5f6107358561087f565b905061074333858784610bd2565b949350505050565b5f5f61075683610862565b90508084111561077f5782848260405163284ff66760e01b815260040161072293929190611520565b5f610789856107b3565b905061074333858388610bd2565b6060600480546105c5906114a8565b5f33610664818585610b75565b5f610651826001610a93565b5f5f6107ca8361097b565b9050808511156107f357828582604051633fa733bb60e21b815260040161072293929190611520565b5f6107fd8661066e565b905061080c3386868985610be6565b95945050505050565b5f5f61082083610a20565b90508085111561084957828582604051632e52afbb60e21b815260040161072293929190611520565b5f61085386610646565b905061080c338686848a610be6565b5f61086f60635f1961150d565b600754146106e757600754610651565b5f610651825f610add565b5f811315610911576040516340c10f1960e01b8152306004820152602481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b5f604051808303815f87803b1580156108f8575f5ffd5b505af115801561090a573d5f5f3e3d5ffd5b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639dc29fac3061094a84611541565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016108e1565b5f61098860635f1961150d565b6008541461099857600854610651565b61065182610bfb565b5f8260038111156109b4576109b461155b565b036109bf5760068190555b60018260038111156109d3576109d361155b565b036109de5760078190555b60028260038111156109f2576109f261155b565b036109fd5760088190555b6003826003811115610a1157610a1161155b565b03610a1c5760098190555b5050565b5f610a2d60635f1961150d565b60095414610a3d57600954610651565b61065182610c08565b610a4e610527565b600a80546001600160801b03929092166001600160c01b031990921691909117600160801b4267ffffffffffffffff1602179055565b610a9060635f1961150d565b81565b5f610698610a9f610527565b610aaa90600161156f565b610ab55f600a611665565b600254610ac2919061156f565b85919085610c25565b610ad88383836001610c67565b505050565b5f610698610aec82600a611665565b600254610af9919061156f565b610b01610527565b610ac290600161156f565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610b6f5781811015610b6157828183604051637dc7a0d960e11b815260040161072293929190611520565b610b6f84848484035f610c67565b50505050565b6001600160a01b038316610b9e57604051634b637e8f60e11b81525f6004820152602401610722565b6001600160a01b038216610bc75760405163ec442f0560e01b81525f6004820152602401610722565b610ad8838383610d39565b610bde84848484610e4c565b610b6f610a46565b610bf38585858585610ea1565b61090a610a46565b5f61065161026983610a20565b6001600160a01b0381165f90815260208190526040812054610651565b5f610c52610c3283610ef7565b8015610c4d57505f8480610c4857610c48611673565b868809115b151590565b610c5d868686610f23565b61080c919061156f565b6001600160a01b038416610c905760405163e602df0560e01b81525f6004820152602401610722565b6001600160a01b038316610cb957604051634a1406b160e11b81525f6004820152602401610722565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610b6f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d2b91815260200190565b60405180910390a350505050565b6001600160a01b038316610d63578060025f828254610d58919061156f565b90915550610dc09050565b6001600160a01b0383165f9081526020819052604090205481811015610da25783818360405163391434e360e21b815260040161072293929190611520565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610ddc57600280548290039055610dfa565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3f91815260200190565b60405180910390a3505050565b60055460ff1615610e6060045f3681611687565b610e69916116ae565b90610e94576040516340c2fd5360e11b81526001600160e01b03199091166004820152602401610722565b50610b6f84848484610fd3565b60055460ff1615610eb560045f3681611687565b610ebe916116ae565b90610ee9576040516340c2fd5360e11b81526001600160e01b03199091166004820152602401610722565b5061090a8585858585611057565b5f6002826003811115610f0c57610f0c61155b565b610f1691906116e6565b60ff166001149050919050565b5f5f5f610f308686611117565b91509150815f03610f5457838181610f4a57610f4a611673565b0492505050610698565b818411610f6b57610f6b6003851502601118611133565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b610fff7f0000000000000000000000000000000000000000000000000000000000000000853085611144565b611009838261117a565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610d2b929190918252602082015260400190565b826001600160a01b0316856001600160a01b03161461107b5761107b838683610b0c565b61108583826111ae565b6110b07f000000000000000000000000000000000000000000000000000000000000000085846111e2565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051611108929190918252602082015260400190565b60405180910390a45050505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b611152848484846001611217565b610b6f57604051635274afe760e01b81526001600160a01b0385166004820152602401610722565b6001600160a01b0382166111a35760405163ec442f0560e01b81525f6004820152602401610722565b610a1c5f8383610d39565b6001600160a01b0382166111d757604051634b637e8f60e11b81525f6004820152602401610722565b610a1c825f83610d39565b6111ef8383836001611284565b610ad857604051635274afe760e01b81526001600160a01b0384166004820152602401610722565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316611273578383151615611267573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166112da5783831516156112ce573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561132b575f5ffd5b5035919050565b80356001600160a01b0381168114611348575f5ffd5b919050565b5f5f6040838503121561135e575f5ffd5b61136783611332565b946020939093013593505050565b5f5f5f60608486031215611387575f5ffd5b61139084611332565b925061139e60208501611332565b929592945050506040919091013590565b5f602082840312156113bf575f5ffd5b61069882611332565b5f5f604083850312156113d9575f5ffd5b823591506113e960208401611332565b90509250929050565b5f60208284031215611402575f5ffd5b81358015158114610698575f5ffd5b5f5f5f60608486031215611423575f5ffd5b8335925061143360208501611332565b915061144160408501611332565b90509250925092565b5f5f6040838503121561145b575f5ffd5b823560048110611367575f5ffd5b5f5f6040838503121561147a575f5ffd5b61148383611332565b91506113e960208401611332565b5f602082840312156114a1575f5ffd5b5051919050565b600181811c908216806114bc57607f821691505b6020821081036114da57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610651576106516114e0565b81810381811115610651576106516114e0565b6001600160a01b039390931683526020830191909152604082015260600190565b5f600160ff1b8201611555576115556114e0565b505f0390565b634e487b7160e01b5f52602160045260245ffd5b80820180821115610651576106516114e0565b6001815b60018411156115bd578085048111156115a1576115a16114e0565b60018416156115af57908102905b60019390931c928002611586565b935093915050565b5f826115d357506001610651565b816115df57505f610651565b81600181146115f557600281146115ff5761161b565b6001915050610651565b60ff841115611610576116106114e0565b50506001821b610651565b5060208310610133831016604e8410600b841016171561163e575081810a610651565b61164a5f198484611582565b805f190482111561165d5761165d6114e0565b029392505050565b5f61069860ff8416836115c5565b634e487b7160e01b5f52601260045260245ffd5b5f5f85851115611695575f5ffd5b838611156116a1575f5ffd5b5050820193919092039150565b80356001600160e01b031981169060048410156116df576001600160e01b0319600485900360031b81901b82161691505b5092915050565b5f60ff83168061170457634e487b7160e01b5f52601260045260245ffd5b8060ff8416069150509291505056fea2646970667358221220707e46fbe4e821febfd486cff17e5084815ceb26aff5470004a675034c61447764736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
