{
  "_format": "hh-sol-artifact-1",
  "contractName": "CompoundV3ERC4626",
  "sourceName": "contracts/CompoundV3ERC4626.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ICompoundV3",
          "name": "cToken_",
          "type": "address"
        },
        {
          "internalType": "contract ICometRewards",
          "name": "rewardsManager_",
          "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": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "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": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "InvalidAsset",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "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": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "rewards",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "receivedInAsset",
          "type": "uint256"
        }
      ],
      "name": "RewardsClaimed",
      "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"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "enum SwapLibrary.SwapProtocol",
              "name": "protocol",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "maxSlippage",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "customParams",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct SwapLibrary.SwapConfig",
          "name": "oldConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "enum SwapLibrary.SwapProtocol",
              "name": "protocol",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "maxSlippage",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "customParams",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct SwapLibrary.SwapConfig",
          "name": "newConfig",
          "type": "tuple"
        }
      ],
      "name": "SwapConfigChanged",
      "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": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "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": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "GUARDIAN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "HARVEST_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "LP_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SWAP_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "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": [
        {
          "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": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getSwapConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "enum SwapLibrary.SwapProtocol",
              "name": "protocol",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "maxSlippage",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "customParams",
              "type": "bytes"
            }
          ],
          "internalType": "struct SwapLibrary.SwapConfig",
          "name": "",
          "type": "tuple"
        }
      ],
      "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": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "harvestRewards",
      "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": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "admin_",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "enum SwapLibrary.SwapProtocol",
              "name": "protocol",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "maxSlippage",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "customParams",
              "type": "bytes"
            }
          ],
          "internalType": "struct SwapLibrary.SwapConfig",
          "name": "swapConfig_",
          "type": "tuple"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": [
        {
          "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": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "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": "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": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "adminRole",
          "type": "bytes32"
        }
      ],
      "name": "setRoleAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "enum SwapLibrary.SwapProtocol",
              "name": "protocol",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "maxSlippage",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "customParams",
              "type": "bytes"
            }
          ],
          "internalType": "struct SwapLibrary.SwapConfig",
          "name": "swapConfig_",
          "type": "tuple"
        }
      ],
      "name": "setSwapConfig",
      "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": [],
      "name": "totalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "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": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "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": "0x60e060405230608052348015610013575f5ffd5b506040516135923803806135928339810160408190526100329161011a565b6001600160a01b0380831660a052811660c05261004d610054565b5050610152565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114610103575f5ffd5b5f5f6040838503121561012b575f5ffd5b825161013681610106565b602084015190925061014781610106565b809150509250929050565b60805160a05160c0516133c26101d05f395f8181610caf0152610d7f01525f81816107ea01528181610b7701528181610c8501528181610d4a015281816113e30152818161149501528181611a8201528181611b0001528181611baa0152611c5701525f8181611899015281816118c20152611a2501526133c25ff3fe60806040526004361061025f575f3560e01c80636e553f651161013f578063ba087652116100b3578063d547741f11610078578063d547741f14610710578063d905777e1461072f578063dd62ed3e1461074e578063e1d394501461076d578063ef8b30f7146106d2578063fbb12d07146107a0575f5ffd5b8063ba08765214610694578063c2f09e2b146106b3578063c63d75b6146104e0578063c6e6f592146106d2578063ce96cb77146106f1575f5ffd5b8063a217fddf11610104578063a217fddf146105d5578063a9059cbb146105e8578063ad3cb1cc14610607578063b3d7f6b914610637578063b460af9414610656578063b740a83f14610675575f5ffd5b80636e553f651461054557806370a082311461056457806391d148541461058357806394bf804d146105a257806395d89b41146105c1575f5ffd5b8063248a9ca3116101d657806338d52e0f1161019b57806338d52e0f146104b4578063402d267d146104e05780634cdad506146102da5780634f1ef286146104ff57806352d1902d1461051257806357126d0d14610526575f5ffd5b8063248a9ca3146103fe57806324ea54f41461041d5780632f2ff15d14610450578063313ce5671461046f57806336568abe14610495575f5ffd5b80630a28a477116102275780630a28a477146103185780630b2ce411146103375780631389c0291461035857806318160ddd1461038b5780631e4e0091146103be57806323b872dd146103df575f5ffd5b806301e1d1141461026357806301ffc9a71461028a57806306fdde03146102b957806307a2d13a146102da578063095ea7b3146102f9575b5f5ffd5b34801561026e575f5ffd5b506102776107d3565b6040519081526020015b60405180910390f35b348015610295575f5ffd5b506102a96102a43660046127d3565b610860565b6040519015158152602001610281565b3480156102c4575f5ffd5b506102cd610896565b6040516102819190612828565b3480156102e5575f5ffd5b506102776102f436600461283a565b610956565b348015610304575f5ffd5b506102a9610313366004612865565b610961565b348015610323575f5ffd5b5061027761033236600461283a565b610978565b348015610342575f5ffd5b5061034b610984565b60405161028191906128c3565b348015610363575f5ffd5b506102777f471cfe1a44bf1b786db7d7104d51e6728ed7b90a35394ad7cc424adf8ed1681681565b348015610396575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610277565b3480156103c9575f5ffd5b506103dd6103d83660046128f8565b610a77565b005b3480156103ea575f5ffd5b506102a96103f9366004612918565b610a90565b348015610409575f5ffd5b5061027761041836600461283a565b610ab5565b348015610428575f5ffd5b506102777f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561045b575f5ffd5b506103dd61046a366004612956565b610ad5565b34801561047a575f5ffd5b50610483610af7565b60405160ff9091168152602001610281565b3480156104a0575f5ffd5b506103dd6104af366004612956565b610b26565b3480156104bf575f5ffd5b506104c8610b59565b6040516001600160a01b039091168152602001610281565b3480156104eb575f5ffd5b506102776104fa366004612984565b610b74565b6103dd61050d366004612a42565b610c0a565b34801561051d575f5ffd5b50610277610c29565b348015610531575f5ffd5b506103dd61054036600461283a565b610c44565b348015610550575f5ffd5b5061027761055f366004612956565b610fea565b34801561056f575f5ffd5b5061027761057e366004612984565b611047565b34801561058e575f5ffd5b506102a961059d366004612956565b61106d565b3480156105ad575f5ffd5b506102776105bc366004612956565b6110a3565b3480156105cc575f5ffd5b506102cd6110ef565b3480156105e0575f5ffd5b506102775f81565b3480156105f3575f5ffd5b506102a9610602366004612865565b61112d565b348015610612575f5ffd5b506102cd604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610642575f5ffd5b5061027761065136600461283a565b61113a565b348015610661575f5ffd5b50610277610670366004612a8e565b611146565b348015610680575f5ffd5b506103dd61068f366004612ae3565b61119c565b34801561069f575f5ffd5b506102776106ae366004612a8e565b611276565b3480156106be575f5ffd5b506103dd6106cd366004612b14565b6112c3565b3480156106dd575f5ffd5b506102776106ec36600461283a565b6113d5565b3480156106fc575f5ffd5b5061027761070b366004612984565b6113e0565b34801561071b575f5ffd5b506103dd61072a366004612956565b611476565b34801561073a575f5ffd5b50610277610749366004612984565b611492565b348015610759575f5ffd5b50610277610768366004612bb2565b611528565b348015610778575f5ffd5b506102777fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b3480156107ab575f5ffd5b506102777f90ff0fdc2a5e2f52090b2c8a629804c58d5c1156b5405c8437a00da5abba239c81565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610837573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085b9190612bde565b905090565b5f6001600160e01b03198216637965db0b60e01b148061089057506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f51602061330d5f395f51905f52916108d490612bf5565b80601f016020809104026020016040519081016040528092919081815260200182805461090090612bf5565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505091505090565b5f610890825f611571565b5f3361096e8185856115c8565b5060019392505050565b5f6108908260016115d5565b60408051606080820183525f80835260208301529181019190915260408051606081019091525f8054829060ff1660028111156109c3576109c361288f565b60028111156109d4576109d461288f565b8152602001600182015481526020016002820180546109f290612bf5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90612bf5565b8015610a695780601f10610a4057610100808354040283529160200191610a69565b820191905f5260205f20905b815481529060010190602001808311610a4c57829003601f168201915b505050505081525050905090565b5f610a8181611623565b610a8b8383611630565b505050565b5f33610a9d858285611690565b610aa88585856116da565b60019150505b9392505050565b5f9081525f51602061334d5f395f51905f52602052604090206001015490565b610ade82610ab5565b610ae781611623565b610af18383611737565b50505050565b5f805f51602061336d5f395f51905f5290505f8154610b209190600160a01b900460ff16612c3b565b91505090565b6001600160a01b0381163314610b4f5760405163334bd91960e11b815260040160405180910390fd5b610a8b82826117d8565b5f51602061336d5f395f51905f52546001600160a01b031690565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630bc47ad16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190612c68565b15610c0157505f919050565b61089082611851565b610c1261188e565b610c1b82611934565b610c25828261195e565b5050565b5f610c32611a1a565b505f51602061332d5f395f51905f5290565b7f90ff0fdc2a5e2f52090b2c8a629804c58d5c1156b5405c8437a00da5abba239c610c6e81611623565b60405163045136d760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f917f000000000000000000000000000000000000000000000000000000000000000090911690632289b6b8906024016060604051808303815f875af1158015610cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1b9190612c81565b50909150506001600160a01b038116610d3357505050565b604051635b81a7bf60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152600160448301527f0000000000000000000000000000000000000000000000000000000000000000169063b7034f7e906064015f604051808303815f87803b158015610dc0575f5ffd5b505af1158015610dd2573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92506001600160a01b03841691506370a0823190602401602060405180830381865afa158015610e1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3e9190612bde565b60408051606081019091525f8054929350918290829060ff166002811115610e6857610e6861288f565b6002811115610e7957610e7961288f565b815260200160018201548152602001600282018054610e9790612bf5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec390612bf5565b8015610f0e5780601f10610ee557610100808354040283529160200191610f0e565b820191905f5260205f20905b815481529060010190602001808311610ef157829003601f168201915b50505050508152505073__$acbb9ece542dcf2065f41aa3c8cca5827e$__6377566915909185610f3c610b59565b868a6040518663ffffffff1660e01b8152600401610f5e959493929190612d00565b602060405180830381865af4158015610f79573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9d9190612bde565b9050610fa881611a63565b7fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325838383604051610fdb93929190612d3f565b60405180910390a15050505050565b5f5f610ff583610b74565b90508084111561102757828482604051633c8097d960e11b815260040161101e93929190612d3f565b60405180910390fd5b5f611031856113d5565b905061103f33858784611b93565b949350505050565b6001600160a01b03165f9081525f51602061330d5f395f51905f52602052604090205490565b5f9182525f51602061334d5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f6110ae83610b74565b9050808411156110d75782848260405163284ff66760e01b815260040161101e93929190612d3f565b5f6110e18561113a565b905061103f33858388611b93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f51602061330d5f395f51905f52916108d490612bf5565b5f3361096e8185856116da565b5f610890826001611571565b5f5f611151836113e0565b90508085111561117a57828582604051633fa733bb60e21b815260040161101e93929190612d3f565b5f61118486610978565b90506111933386868985611ba8565b95945050505050565b7f471cfe1a44bf1b786db7d7104d51e6728ed7b90a35394ad7cc424adf8ed168166111c681611623565b6111cf82612d6c565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916112059190600401612de8565b5f6040518083038186803b15801561121b575f5ffd5b505af415801561122d573d5f5f3e3d5ffd5b505050507fca7f7aa563866a1d31c74deba224724d1da9c35cbb6f783f2ccf0182f91e34f85f83604051611262929190612e8e565b60405180910390a1815f610af1828261304c565b5f5f61128183611492565b9050808511156112aa57828582604051632e52afbb60e21b815260040161101e93929190612d3f565b5f6112b486610956565b9050611193338686848a611ba8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156113075750825b90505f826001600160401b031660011480156113225750303b155b905081158015611330575080155b1561134e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561137857845460ff60401b1916600160401b1785555b61138489898989611c47565b83156113ca57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f610890825f6115d5565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367800b5f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190612c68565b1561146d57505f919050565b61089082611ce3565b61147f82610ab5565b61148881611623565b610af183836117d8565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367800b5f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ef573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115139190612c68565b1561151f57505f919050565b61089082611cf6565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f610aae61157d6107d3565b6115889060016130dc565b6115935f600a6131d2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546115bf91906130dc565b85919085611d00565b610a8b8383836001611d42565b5f610aae6115e482600a6131d2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461161091906130dc565b6116186107d3565b6115bf9060016130dc565b61162d8133611e25565b50565b5f51602061334d5f395f51905f525f61164884610ab5565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f61169b8484611528565b90505f198114610af157818110156116cc57828183604051637dc7a0d960e11b815260040161101e93929190612d3f565b610af184848484035f611d42565b6001600160a01b03831661170357604051634b637e8f60e11b81525f600482015260240161101e565b6001600160a01b03821661172c5760405163ec442f0560e01b81525f600482015260240161101e565b610a8b838383611e5e565b5f5f51602061334d5f395f51905f52611750848461106d565b6117cf575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117853390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610890565b5f915050610890565b5f5f51602061334d5f395f51905f526117f1848461106d565b156117cf575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610890565b5f61187c7fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a68361106d565b61188757505f919050565b5f19610890565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061191457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166119085f51602061332d5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156119325760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610c2581611623565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156119b8575060408051601f3d908101601f191682019092526119b591810190612bde565b60015b6119e057604051634c9c8ce360e01b81526001600160a01b038316600482015260240161101e565b5f51602061332d5f395f51905f528114611a1057604051632a87526960e21b81526004810182905260240161101e565b610a8b8383611f84565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119325760405163703e46dd60e11b815260040160405180910390fd5b611a6b610b59565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052919091169063095ea7b3906044016020604051808303815f875af1158015611ad9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611afd9190612c68565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2b9fdb8611b35610b59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015611b7a575f5ffd5b505af1158015611b8c573d5f5f3e3d5ffd5b5050505050565b611b9f84848484611fd9565b610af182611a63565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3fef3a3611bdf610b59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044015f604051808303815f87803b158015611c24575f5ffd5b505af1158015611c36573d5f5f3e3d5ffd5b50505050611b8c8585858585612056565b611c4f61210a565b611cda8484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c55dae636040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd591906131e0565b612153565b610af1816121b0565b5f610890611cf083611047565b5f611571565b5f61089082611047565b5f611d2d611d0d83612231565b8015611d2857505f8480611d2357611d236131fb565b868809115b151590565b611d3886868661225d565b61119391906130dc565b5f51602061330d5f395f51905f526001600160a01b038516611d795760405163e602df0560e01b81525f600482015260240161101e565b6001600160a01b038416611da257604051634a1406b160e11b81525f600482015260240161101e565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611b8c57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611e1691815260200190565b60405180910390a35050505050565b611e2f828261106d565b610c255760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161101e565b5f51602061330d5f395f51905f526001600160a01b038416611e985781816002015f828254611e8d91906130dc565b90915550611ef59050565b6001600160a01b0384165f9081526020829052604090205482811015611ed75784818460405163391434e360e21b815260040161101e93929190612d3f565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611f13576002810180548390039055611f31565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f7691815260200190565b60405180910390a350505050565b611f8d82612313565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611fd157610a8b8282612376565b610c256123df565b5f51602061336d5f395f51905f528054611ffe906001600160a01b03168630866123fe565b6120088483612465565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611e16929190918252602082015260400190565b5f51602061336d5f395f51905f526001600160a01b038681169085161461208257612082848784611690565b61208c8483612499565b80546120a2906001600160a01b031686856124cd565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db86866040516120fa929190918252602082015260400190565b60405180910390a4505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661193257604051631afcd79f60e31b815260040160405180910390fd5b61215b61210a565b6121636124fe565b61216b6124fe565b6001600160a01b038116612194576040516337bce3c560e11b81525f600482015260240161101e565b61219d81612506565b6121a78484612517565b610af182612529565b6121b861210a565b6121c181612d6c565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916121f79190600401612de8565b5f6040518083038186803b15801561220d575f5ffd5b505af415801561221f573d5f5f3e3d5ffd5b50505050805f8181610a8b919061304c565b5f60028260038111156122465761224661288f565b612250919061320f565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361229157838281612287576122876131fb565b0492505050610aae565b8084116122a8576122a8600385150260111861253b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361234857604051634c9c8ce360e01b81526001600160a01b038216600482015260240161101e565b5f51602061332d5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612392919061323c565b5f60405180830381855af49150503d805f81146123ca576040519150601f19603f3d011682016040523d82523d5f602084013e6123cf565b606091505b509150915061119385838361254c565b34156119325760405163b398979f60e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610af19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506125a8565b6001600160a01b03821661248e5760405163ec442f0560e01b81525f600482015260240161101e565b610c255f8383611e5e565b6001600160a01b0382166124c257604051634b637e8f60e11b81525f600482015260240161101e565b610c25825f83611e5e565b6040516001600160a01b03838116602483015260448201839052610a8b91859182169063a9059cbb90606401612433565b61193261210a565b61250e61210a565b61162d81612614565b61251f61210a565b610c258282612684565b61253161210a565b610c255f82611737565b634e487b715f52806020526024601cfd5b6060826125615761255c826126d4565b610aae565b815115801561257857506001600160a01b0384163b155b156125a157604051639996b31560e01b81526001600160a01b038516600482015260240161101e565b5080610aae565b5f5f60205f8451602086015f885af1806125c7576040513d5f823e3d81fd5b50505f513d915081156125de5780600114156125eb565b6001600160a01b0384163b155b15610af157604051635274afe760e01b81526001600160a01b038516600482015260240161101e565b61261c61210a565b5f51602061336d5f395f51905f525f80612635846126fd565b9150915081612645576012612647565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61268c61210a565b5f51602061330d5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036126c58482613252565b5060048101610af18382613252565b8051156126e45780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916127439161323c565b5f60405180830381855afa9150503d805f811461277b576040519150601f19603f3d011682016040523d82523d5f602084013e612780565b606091505b509150915081801561279457506020815110155b156127c7575f818060200190518101906127ae9190612bde565b905060ff81116127c5576001969095509350505050565b505b505f9485945092505050565b5f602082840312156127e3575f5ffd5b81356001600160e01b031981168114610aae575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610aae60208301846127fa565b5f6020828403121561284a575f5ffd5b5035919050565b6001600160a01b038116811461162d575f5ffd5b5f5f60408385031215612876575f5ffd5b823561288181612851565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b600381106128bf57634e487b7160e01b5f52602160045260245ffd5b9052565b602081526128d56020820183516128a3565b602082015160408201525f604083015160608084015261103f60808401826127fa565b5f5f60408385031215612909575f5ffd5b50508035926020909101359150565b5f5f5f6060848603121561292a575f5ffd5b833561293581612851565b9250602084013561294581612851565b929592945050506040919091013590565b5f5f60408385031215612967575f5ffd5b82359150602083013561297981612851565b809150509250929050565b5f60208284031215612994575f5ffd5b8135610aae81612851565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126129c2575f5ffd5b8135602083015f5f6001600160401b038411156129e1576129e161299f565b50604051601f19601f85018116603f011681018181106001600160401b0382111715612a0f57612a0f61299f565b604052838152905080828401871015612a26575f5ffd5b838360208301375f602085830101528094505050505092915050565b5f5f60408385031215612a53575f5ffd5b8235612a5e81612851565b915060208301356001600160401b03811115612a78575f5ffd5b612a84858286016129b3565b9150509250929050565b5f5f5f60608486031215612aa0575f5ffd5b833592506020840135612ab281612851565b91506040840135612ac281612851565b809150509250925092565b5f60608284031215612add575f5ffd5b50919050565b5f60208284031215612af3575f5ffd5b81356001600160401b03811115612b08575f5ffd5b61103f84828501612acd565b5f5f5f5f60808587031215612b27575f5ffd5b84356001600160401b03811115612b3c575f5ffd5b612b48878288016129b3565b94505060208501356001600160401b03811115612b63575f5ffd5b612b6f878288016129b3565b9350506040850135612b8081612851565b915060608501356001600160401b03811115612b9a575f5ffd5b612ba687828801612acd565b91505092959194509250565b5f5f60408385031215612bc3575f5ffd5b8235612bce81612851565b9150602083013561297981612851565b5f60208284031215612bee575f5ffd5b5051919050565b600181811c90821680612c0957607f821691505b602082108103612add57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561089057610890612c27565b80518015158114612c63575f5ffd5b919050565b5f60208284031215612c78575f5ffd5b610aae82612c54565b5f5f5f60608486031215612c93575f5ffd5b8351612c9e81612851565b60208501519093506001600160401b0381168114612cba575f5ffd5b9150612cc860408501612c54565b90509250925092565b612cdc8282516128a3565b602081015160208301525f60408201516060604085015261103f60608501826127fa565b60a081525f612d1260a0830188612cd1565b6001600160a01b039687166020840152949095166040820152606081019290925260809091015292915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6003811061162d575f5ffd5b5f60608236031215612d7c575f5ffd5b604051606081016001600160401b0381118282101715612d9e57612d9e61299f565b6040528235612dac81612d60565b81526020838101359082015260408301356001600160401b03811115612dd0575f5ffd5b612ddc368286016129b3565b60408301525092915050565b602081525f610aae6020830184612cd1565b5f8135612e0681612d60565b612e1084826128a3565b5060208281013590840152604082013536839003601e19018112612e32575f5ffd5b82016020810190356001600160401b03811115612e4d575f5ffd5b803603821315612e5b575f5ffd5b60606040860152806060860152808260808701375f608082870101526080601f19601f8301168601019250505092915050565b60408152612ea36040820160ff8554166128a3565b600183015460608201525f60028401606060808401525f8154612ec581612bf5565b8060a0870152600182165f8114612ee35760018114612eff57612f30565b60ff19831660c088015260c082151560051b8801019350612f30565b845f5260205f205f5b83811015612f2757815489820160c00152600190910190602001612f08565b880160c0019450505b5050508381036020850152612f458186612dfa565b9695505050505050565b601f821115610a8b57805f5260205f20601f840160051c81016020851015612f745750805b601f840160051c820191505b81811015611b8c575f8155600101612f80565b6001600160401b03831115612faa57612faa61299f565b612fbe83612fb88354612bf5565b83612f4f565b5f601f841160018114612fef575f8515612fd85750838201355b5f19600387901b1c1916600186901b178355611b8c565b5f83815260208120601f198716915b8281101561301e5786850135825560209485019460019092019101612ffe565b508682101561303a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813561305781612d60565b6003811061307357634e487b7160e01b5f52602160045260245ffd5b60ff1982541660ff8216811783555050602082013560018201556040820135601e198336030181126130a3575f5ffd5b820180356001600160401b038111156130ba575f5ffd5b6020820191508036038213156130ce575f5ffd5b610af1818360028601612f93565b8082018082111561089057610890612c27565b6001815b600184111561312a5780850481111561310e5761310e612c27565b600184161561311c57908102905b60019390931c9280026130f3565b935093915050565b5f8261314057506001610890565b8161314c57505f610890565b8160018114613162576002811461316c57613188565b6001915050610890565b60ff84111561317d5761317d612c27565b50506001821b610890565b5060208310610133831016604e8410600b84101617156131ab575081810a610890565b6131b75f1984846130ef565b805f19048211156131ca576131ca612c27565b029392505050565b5f610aae60ff841683613132565b5f602082840312156131f0575f5ffd5b8151610aae81612851565b634e487b7160e01b5f52601260045260245ffd5b5f60ff83168061322d57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f82518060208501845e5f920191825250919050565b81516001600160401b0381111561326b5761326b61299f565b61327f816132798454612bf5565b84612f4f565b6020601f8211600181146132b1575f831561329a5750848201515b5f19600385901b1c1916600184901b178455611b8c565b5f84815260208120601f198516915b828110156132e057878501518255602094850194600190920191016132c0565b50848210156132fd57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a2646970667358221220956370b520922652ce5fd0ab2fbc6dd17d3149760845197f6257148b55ec523464736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061025f575f3560e01c80636e553f651161013f578063ba087652116100b3578063d547741f11610078578063d547741f14610710578063d905777e1461072f578063dd62ed3e1461074e578063e1d394501461076d578063ef8b30f7146106d2578063fbb12d07146107a0575f5ffd5b8063ba08765214610694578063c2f09e2b146106b3578063c63d75b6146104e0578063c6e6f592146106d2578063ce96cb77146106f1575f5ffd5b8063a217fddf11610104578063a217fddf146105d5578063a9059cbb146105e8578063ad3cb1cc14610607578063b3d7f6b914610637578063b460af9414610656578063b740a83f14610675575f5ffd5b80636e553f651461054557806370a082311461056457806391d148541461058357806394bf804d146105a257806395d89b41146105c1575f5ffd5b8063248a9ca3116101d657806338d52e0f1161019b57806338d52e0f146104b4578063402d267d146104e05780634cdad506146102da5780634f1ef286146104ff57806352d1902d1461051257806357126d0d14610526575f5ffd5b8063248a9ca3146103fe57806324ea54f41461041d5780632f2ff15d14610450578063313ce5671461046f57806336568abe14610495575f5ffd5b80630a28a477116102275780630a28a477146103185780630b2ce411146103375780631389c0291461035857806318160ddd1461038b5780631e4e0091146103be57806323b872dd146103df575f5ffd5b806301e1d1141461026357806301ffc9a71461028a57806306fdde03146102b957806307a2d13a146102da578063095ea7b3146102f9575b5f5ffd5b34801561026e575f5ffd5b506102776107d3565b6040519081526020015b60405180910390f35b348015610295575f5ffd5b506102a96102a43660046127d3565b610860565b6040519015158152602001610281565b3480156102c4575f5ffd5b506102cd610896565b6040516102819190612828565b3480156102e5575f5ffd5b506102776102f436600461283a565b610956565b348015610304575f5ffd5b506102a9610313366004612865565b610961565b348015610323575f5ffd5b5061027761033236600461283a565b610978565b348015610342575f5ffd5b5061034b610984565b60405161028191906128c3565b348015610363575f5ffd5b506102777f471cfe1a44bf1b786db7d7104d51e6728ed7b90a35394ad7cc424adf8ed1681681565b348015610396575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610277565b3480156103c9575f5ffd5b506103dd6103d83660046128f8565b610a77565b005b3480156103ea575f5ffd5b506102a96103f9366004612918565b610a90565b348015610409575f5ffd5b5061027761041836600461283a565b610ab5565b348015610428575f5ffd5b506102777f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561045b575f5ffd5b506103dd61046a366004612956565b610ad5565b34801561047a575f5ffd5b50610483610af7565b60405160ff9091168152602001610281565b3480156104a0575f5ffd5b506103dd6104af366004612956565b610b26565b3480156104bf575f5ffd5b506104c8610b59565b6040516001600160a01b039091168152602001610281565b3480156104eb575f5ffd5b506102776104fa366004612984565b610b74565b6103dd61050d366004612a42565b610c0a565b34801561051d575f5ffd5b50610277610c29565b348015610531575f5ffd5b506103dd61054036600461283a565b610c44565b348015610550575f5ffd5b5061027761055f366004612956565b610fea565b34801561056f575f5ffd5b5061027761057e366004612984565b611047565b34801561058e575f5ffd5b506102a961059d366004612956565b61106d565b3480156105ad575f5ffd5b506102776105bc366004612956565b6110a3565b3480156105cc575f5ffd5b506102cd6110ef565b3480156105e0575f5ffd5b506102775f81565b3480156105f3575f5ffd5b506102a9610602366004612865565b61112d565b348015610612575f5ffd5b506102cd604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610642575f5ffd5b5061027761065136600461283a565b61113a565b348015610661575f5ffd5b50610277610670366004612a8e565b611146565b348015610680575f5ffd5b506103dd61068f366004612ae3565b61119c565b34801561069f575f5ffd5b506102776106ae366004612a8e565b611276565b3480156106be575f5ffd5b506103dd6106cd366004612b14565b6112c3565b3480156106dd575f5ffd5b506102776106ec36600461283a565b6113d5565b3480156106fc575f5ffd5b5061027761070b366004612984565b6113e0565b34801561071b575f5ffd5b506103dd61072a366004612956565b611476565b34801561073a575f5ffd5b50610277610749366004612984565b611492565b348015610759575f5ffd5b50610277610768366004612bb2565b611528565b348015610778575f5ffd5b506102777fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b3480156107ab575f5ffd5b506102777f90ff0fdc2a5e2f52090b2c8a629804c58d5c1156b5405c8437a00da5abba239c81565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610837573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085b9190612bde565b905090565b5f6001600160e01b03198216637965db0b60e01b148061089057506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f51602061330d5f395f51905f52916108d490612bf5565b80601f016020809104026020016040519081016040528092919081815260200182805461090090612bf5565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505091505090565b5f610890825f611571565b5f3361096e8185856115c8565b5060019392505050565b5f6108908260016115d5565b60408051606080820183525f80835260208301529181019190915260408051606081019091525f8054829060ff1660028111156109c3576109c361288f565b60028111156109d4576109d461288f565b8152602001600182015481526020016002820180546109f290612bf5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90612bf5565b8015610a695780601f10610a4057610100808354040283529160200191610a69565b820191905f5260205f20905b815481529060010190602001808311610a4c57829003601f168201915b505050505081525050905090565b5f610a8181611623565b610a8b8383611630565b505050565b5f33610a9d858285611690565b610aa88585856116da565b60019150505b9392505050565b5f9081525f51602061334d5f395f51905f52602052604090206001015490565b610ade82610ab5565b610ae781611623565b610af18383611737565b50505050565b5f805f51602061336d5f395f51905f5290505f8154610b209190600160a01b900460ff16612c3b565b91505090565b6001600160a01b0381163314610b4f5760405163334bd91960e11b815260040160405180910390fd5b610a8b82826117d8565b5f51602061336d5f395f51905f52546001600160a01b031690565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630bc47ad16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf59190612c68565b15610c0157505f919050565b61089082611851565b610c1261188e565b610c1b82611934565b610c25828261195e565b5050565b5f610c32611a1a565b505f51602061332d5f395f51905f5290565b7f90ff0fdc2a5e2f52090b2c8a629804c58d5c1156b5405c8437a00da5abba239c610c6e81611623565b60405163045136d760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f917f000000000000000000000000000000000000000000000000000000000000000090911690632289b6b8906024016060604051808303815f875af1158015610cf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1b9190612c81565b50909150506001600160a01b038116610d3357505050565b604051635b81a7bf60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152600160448301527f0000000000000000000000000000000000000000000000000000000000000000169063b7034f7e906064015f604051808303815f87803b158015610dc0575f5ffd5b505af1158015610dd2573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92506001600160a01b03841691506370a0823190602401602060405180830381865afa158015610e1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3e9190612bde565b60408051606081019091525f8054929350918290829060ff166002811115610e6857610e6861288f565b6002811115610e7957610e7961288f565b815260200160018201548152602001600282018054610e9790612bf5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec390612bf5565b8015610f0e5780601f10610ee557610100808354040283529160200191610f0e565b820191905f5260205f20905b815481529060010190602001808311610ef157829003601f168201915b50505050508152505073__$acbb9ece542dcf2065f41aa3c8cca5827e$__6377566915909185610f3c610b59565b868a6040518663ffffffff1660e01b8152600401610f5e959493929190612d00565b602060405180830381865af4158015610f79573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9d9190612bde565b9050610fa881611a63565b7fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325838383604051610fdb93929190612d3f565b60405180910390a15050505050565b5f5f610ff583610b74565b90508084111561102757828482604051633c8097d960e11b815260040161101e93929190612d3f565b60405180910390fd5b5f611031856113d5565b905061103f33858784611b93565b949350505050565b6001600160a01b03165f9081525f51602061330d5f395f51905f52602052604090205490565b5f9182525f51602061334d5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f6110ae83610b74565b9050808411156110d75782848260405163284ff66760e01b815260040161101e93929190612d3f565b5f6110e18561113a565b905061103f33858388611b93565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f51602061330d5f395f51905f52916108d490612bf5565b5f3361096e8185856116da565b5f610890826001611571565b5f5f611151836113e0565b90508085111561117a57828582604051633fa733bb60e21b815260040161101e93929190612d3f565b5f61118486610978565b90506111933386868985611ba8565b95945050505050565b7f471cfe1a44bf1b786db7d7104d51e6728ed7b90a35394ad7cc424adf8ed168166111c681611623565b6111cf82612d6c565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916112059190600401612de8565b5f6040518083038186803b15801561121b575f5ffd5b505af415801561122d573d5f5f3e3d5ffd5b505050507fca7f7aa563866a1d31c74deba224724d1da9c35cbb6f783f2ccf0182f91e34f85f83604051611262929190612e8e565b60405180910390a1815f610af1828261304c565b5f5f61128183611492565b9050808511156112aa57828582604051632e52afbb60e21b815260040161101e93929190612d3f565b5f6112b486610956565b9050611193338686848a611ba8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156113075750825b90505f826001600160401b031660011480156113225750303b155b905081158015611330575080155b1561134e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561137857845460ff60401b1916600160401b1785555b61138489898989611c47565b83156113ca57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f610890825f6115d5565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367800b5f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190612c68565b1561146d57505f919050565b61089082611ce3565b61147f82610ab5565b61148881611623565b610af183836117d8565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166367800b5f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ef573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115139190612c68565b1561151f57505f919050565b61089082611cf6565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f610aae61157d6107d3565b6115889060016130dc565b6115935f600a6131d2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546115bf91906130dc565b85919085611d00565b610a8b8383836001611d42565b5f610aae6115e482600a6131d2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461161091906130dc565b6116186107d3565b6115bf9060016130dc565b61162d8133611e25565b50565b5f51602061334d5f395f51905f525f61164884610ab5565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f61169b8484611528565b90505f198114610af157818110156116cc57828183604051637dc7a0d960e11b815260040161101e93929190612d3f565b610af184848484035f611d42565b6001600160a01b03831661170357604051634b637e8f60e11b81525f600482015260240161101e565b6001600160a01b03821661172c5760405163ec442f0560e01b81525f600482015260240161101e565b610a8b838383611e5e565b5f5f51602061334d5f395f51905f52611750848461106d565b6117cf575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556117853390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610890565b5f915050610890565b5f5f51602061334d5f395f51905f526117f1848461106d565b156117cf575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610890565b5f61187c7fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a68361106d565b61188757505f919050565b5f19610890565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061191457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166119085f51602061332d5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156119325760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610c2581611623565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156119b8575060408051601f3d908101601f191682019092526119b591810190612bde565b60015b6119e057604051634c9c8ce360e01b81526001600160a01b038316600482015260240161101e565b5f51602061332d5f395f51905f528114611a1057604051632a87526960e21b81526004810182905260240161101e565b610a8b8383611f84565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119325760405163703e46dd60e11b815260040160405180910390fd5b611a6b610b59565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052919091169063095ea7b3906044016020604051808303815f875af1158015611ad9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611afd9190612c68565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2b9fdb8611b35610b59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015611b7a575f5ffd5b505af1158015611b8c573d5f5f3e3d5ffd5b5050505050565b611b9f84848484611fd9565b610af182611a63565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3fef3a3611bdf610b59565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044015f604051808303815f87803b158015611c24575f5ffd5b505af1158015611c36573d5f5f3e3d5ffd5b50505050611b8c8585858585612056565b611c4f61210a565b611cda8484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c55dae636040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd591906131e0565b612153565b610af1816121b0565b5f610890611cf083611047565b5f611571565b5f61089082611047565b5f611d2d611d0d83612231565b8015611d2857505f8480611d2357611d236131fb565b868809115b151590565b611d3886868661225d565b61119391906130dc565b5f51602061330d5f395f51905f526001600160a01b038516611d795760405163e602df0560e01b81525f600482015260240161101e565b6001600160a01b038416611da257604051634a1406b160e11b81525f600482015260240161101e565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611b8c57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611e1691815260200190565b60405180910390a35050505050565b611e2f828261106d565b610c255760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161101e565b5f51602061330d5f395f51905f526001600160a01b038416611e985781816002015f828254611e8d91906130dc565b90915550611ef59050565b6001600160a01b0384165f9081526020829052604090205482811015611ed75784818460405163391434e360e21b815260040161101e93929190612d3f565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611f13576002810180548390039055611f31565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f7691815260200190565b60405180910390a350505050565b611f8d82612313565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611fd157610a8b8282612376565b610c256123df565b5f51602061336d5f395f51905f528054611ffe906001600160a01b03168630866123fe565b6120088483612465565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611e16929190918252602082015260400190565b5f51602061336d5f395f51905f526001600160a01b038681169085161461208257612082848784611690565b61208c8483612499565b80546120a2906001600160a01b031686856124cd565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db86866040516120fa929190918252602082015260400190565b60405180910390a4505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661193257604051631afcd79f60e31b815260040160405180910390fd5b61215b61210a565b6121636124fe565b61216b6124fe565b6001600160a01b038116612194576040516337bce3c560e11b81525f600482015260240161101e565b61219d81612506565b6121a78484612517565b610af182612529565b6121b861210a565b6121c181612d6c565b604051632cbf28cb60e21b815273__$acbb9ece542dcf2065f41aa3c8cca5827e$__9163b2fca32c916121f79190600401612de8565b5f6040518083038186803b15801561220d575f5ffd5b505af415801561221f573d5f5f3e3d5ffd5b50505050805f8181610a8b919061304c565b5f60028260038111156122465761224661288f565b612250919061320f565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361229157838281612287576122876131fb565b0492505050610aae565b8084116122a8576122a8600385150260111861253b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361234857604051634c9c8ce360e01b81526001600160a01b038216600482015260240161101e565b5f51602061332d5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612392919061323c565b5f60405180830381855af49150503d805f81146123ca576040519150601f19603f3d011682016040523d82523d5f602084013e6123cf565b606091505b509150915061119385838361254c565b34156119325760405163b398979f60e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610af19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506125a8565b6001600160a01b03821661248e5760405163ec442f0560e01b81525f600482015260240161101e565b610c255f8383611e5e565b6001600160a01b0382166124c257604051634b637e8f60e11b81525f600482015260240161101e565b610c25825f83611e5e565b6040516001600160a01b03838116602483015260448201839052610a8b91859182169063a9059cbb90606401612433565b61193261210a565b61250e61210a565b61162d81612614565b61251f61210a565b610c258282612684565b61253161210a565b610c255f82611737565b634e487b715f52806020526024601cfd5b6060826125615761255c826126d4565b610aae565b815115801561257857506001600160a01b0384163b155b156125a157604051639996b31560e01b81526001600160a01b038516600482015260240161101e565b5080610aae565b5f5f60205f8451602086015f885af1806125c7576040513d5f823e3d81fd5b50505f513d915081156125de5780600114156125eb565b6001600160a01b0384163b155b15610af157604051635274afe760e01b81526001600160a01b038516600482015260240161101e565b61261c61210a565b5f51602061336d5f395f51905f525f80612635846126fd565b9150915081612645576012612647565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61268c61210a565b5f51602061330d5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036126c58482613252565b5060048101610af18382613252565b8051156126e45780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916127439161323c565b5f60405180830381855afa9150503d805f811461277b576040519150601f19603f3d011682016040523d82523d5f602084013e612780565b606091505b509150915081801561279457506020815110155b156127c7575f818060200190518101906127ae9190612bde565b905060ff81116127c5576001969095509350505050565b505b505f9485945092505050565b5f602082840312156127e3575f5ffd5b81356001600160e01b031981168114610aae575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610aae60208301846127fa565b5f6020828403121561284a575f5ffd5b5035919050565b6001600160a01b038116811461162d575f5ffd5b5f5f60408385031215612876575f5ffd5b823561288181612851565b946020939093013593505050565b634e487b7160e01b5f52602160045260245ffd5b600381106128bf57634e487b7160e01b5f52602160045260245ffd5b9052565b602081526128d56020820183516128a3565b602082015160408201525f604083015160608084015261103f60808401826127fa565b5f5f60408385031215612909575f5ffd5b50508035926020909101359150565b5f5f5f6060848603121561292a575f5ffd5b833561293581612851565b9250602084013561294581612851565b929592945050506040919091013590565b5f5f60408385031215612967575f5ffd5b82359150602083013561297981612851565b809150509250929050565b5f60208284031215612994575f5ffd5b8135610aae81612851565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126129c2575f5ffd5b8135602083015f5f6001600160401b038411156129e1576129e161299f565b50604051601f19601f85018116603f011681018181106001600160401b0382111715612a0f57612a0f61299f565b604052838152905080828401871015612a26575f5ffd5b838360208301375f602085830101528094505050505092915050565b5f5f60408385031215612a53575f5ffd5b8235612a5e81612851565b915060208301356001600160401b03811115612a78575f5ffd5b612a84858286016129b3565b9150509250929050565b5f5f5f60608486031215612aa0575f5ffd5b833592506020840135612ab281612851565b91506040840135612ac281612851565b809150509250925092565b5f60608284031215612add575f5ffd5b50919050565b5f60208284031215612af3575f5ffd5b81356001600160401b03811115612b08575f5ffd5b61103f84828501612acd565b5f5f5f5f60808587031215612b27575f5ffd5b84356001600160401b03811115612b3c575f5ffd5b612b48878288016129b3565b94505060208501356001600160401b03811115612b63575f5ffd5b612b6f878288016129b3565b9350506040850135612b8081612851565b915060608501356001600160401b03811115612b9a575f5ffd5b612ba687828801612acd565b91505092959194509250565b5f5f60408385031215612bc3575f5ffd5b8235612bce81612851565b9150602083013561297981612851565b5f60208284031215612bee575f5ffd5b5051919050565b600181811c90821680612c0957607f821691505b602082108103612add57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561089057610890612c27565b80518015158114612c63575f5ffd5b919050565b5f60208284031215612c78575f5ffd5b610aae82612c54565b5f5f5f60608486031215612c93575f5ffd5b8351612c9e81612851565b60208501519093506001600160401b0381168114612cba575f5ffd5b9150612cc860408501612c54565b90509250925092565b612cdc8282516128a3565b602081015160208301525f60408201516060604085015261103f60608501826127fa565b60a081525f612d1260a0830188612cd1565b6001600160a01b039687166020840152949095166040820152606081019290925260809091015292915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6003811061162d575f5ffd5b5f60608236031215612d7c575f5ffd5b604051606081016001600160401b0381118282101715612d9e57612d9e61299f565b6040528235612dac81612d60565b81526020838101359082015260408301356001600160401b03811115612dd0575f5ffd5b612ddc368286016129b3565b60408301525092915050565b602081525f610aae6020830184612cd1565b5f8135612e0681612d60565b612e1084826128a3565b5060208281013590840152604082013536839003601e19018112612e32575f5ffd5b82016020810190356001600160401b03811115612e4d575f5ffd5b803603821315612e5b575f5ffd5b60606040860152806060860152808260808701375f608082870101526080601f19601f8301168601019250505092915050565b60408152612ea36040820160ff8554166128a3565b600183015460608201525f60028401606060808401525f8154612ec581612bf5565b8060a0870152600182165f8114612ee35760018114612eff57612f30565b60ff19831660c088015260c082151560051b8801019350612f30565b845f5260205f205f5b83811015612f2757815489820160c00152600190910190602001612f08565b880160c0019450505b5050508381036020850152612f458186612dfa565b9695505050505050565b601f821115610a8b57805f5260205f20601f840160051c81016020851015612f745750805b601f840160051c820191505b81811015611b8c575f8155600101612f80565b6001600160401b03831115612faa57612faa61299f565b612fbe83612fb88354612bf5565b83612f4f565b5f601f841160018114612fef575f8515612fd85750838201355b5f19600387901b1c1916600186901b178355611b8c565b5f83815260208120601f198716915b8281101561301e5786850135825560209485019460019092019101612ffe565b508682101561303a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813561305781612d60565b6003811061307357634e487b7160e01b5f52602160045260245ffd5b60ff1982541660ff8216811783555050602082013560018201556040820135601e198336030181126130a3575f5ffd5b820180356001600160401b038111156130ba575f5ffd5b6020820191508036038213156130ce575f5ffd5b610af1818360028601612f93565b8082018082111561089057610890612c27565b6001815b600184111561312a5780850481111561310e5761310e612c27565b600184161561311c57908102905b60019390931c9280026130f3565b935093915050565b5f8261314057506001610890565b8161314c57505f610890565b8160018114613162576002811461316c57613188565b6001915050610890565b60ff84111561317d5761317d612c27565b50506001821b610890565b5060208310610133831016604e8410600b84101617156131ab575081810a610890565b6131b75f1984846130ef565b805f19048211156131ca576131ca612c27565b029392505050565b5f610aae60ff841683613132565b5f602082840312156131f0575f5ffd5b8151610aae81612851565b634e487b7160e01b5f52601260045260245ffd5b5f60ff83168061322d57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f82518060208501845e5f920191825250919050565b81516001600160401b0381111561326b5761326b61299f565b61327f816132798454612bf5565b84612f4f565b6020601f8211600181146132b1575f831561329a5750848201515b5f19600385901b1c1916600184901b178455611b8c565b5f84815260208120601f198516915b828110156132e057878501518255602094850194600190920191016132c0565b50848210156132fd57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a2646970667358221220956370b520922652ce5fd0ab2fbc6dd17d3149760845197f6257148b55ec523464736f6c634300081c0033",
  "linkReferences": {
    "@ensuro/swaplibrary/contracts/SwapLibrary.sol": {
      "SwapLibrary": [
        {
          "length": 20,
          "start": 4329
        },
        {
          "length": 20,
          "start": 5038
        },
        {
          "length": 20,
          "start": 9120
        }
      ]
    }
  },
  "deployedLinkReferences": {
    "@ensuro/swaplibrary/contracts/SwapLibrary.sol": {
      "SwapLibrary": [
        {
          "length": 20,
          "start": 3865
        },
        {
          "length": 20,
          "start": 4574
        },
        {
          "length": 20,
          "start": 8656
        }
      ]
    }
  }
}
