{
  "_format": "hh-sol-artifact-1",
  "contractName": "SingleStrategyERC4626",
  "sourceName": "contracts/mock/SingleStrategyERC4626.sol",
  "abi": [
    {
      "inputs": [],
      "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": "InvalidStrategyAsset",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyStrategyStorageExposed",
      "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": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DepositFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DepositFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DisconnectFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "DisconnectFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "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": [
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "oldStrategy",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        }
      ],
      "name": "StrategyChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "oldStrategy",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        }
      ],
      "name": "StrategyChanged",
      "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"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "WithdrawFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "WithdrawFailed",
      "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": "LP_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SET_STRATEGY_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": "uint8",
          "name": "method",
          "type": "uint8"
        },
        {
          "internalType": "bytes",
          "name": "extraData",
          "type": "bytes"
        }
      ],
      "name": "forwardToStrategy",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "getBytesSlot",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "admin_",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "asset_",
          "type": "address"
        },
        {
          "internalType": "contract IInvestStrategy",
          "name": "strategy_",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "initStrategyData",
          "type": "bytes"
        }
      ],
      "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": [
        {
          "internalType": "contract IInvestStrategy",
          "name": "newStrategy",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "initStrategyData",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "force",
          "type": "bool"
        }
      ],
      "name": "setStrategy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "strategy",
      "outputs": [
        {
          "internalType": "contract IInvestStrategy",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "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": "0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612f196100f95f395f81816114140152818161143d01526115a00152612f195ff3fe60806040526004361061025f575f3560e01c806370a082311161013f578063baaf36b5116100b3578063d547741f11610078578063d547741f1461072a578063d905777e14610749578063d9221bb514610768578063dd62ed3e14610787578063e1d39450146107a6578063ef8b30f7146106cd575f5ffd5b8063baaf36b51461067b578063c63d75b6146106ae578063c6e6f592146106cd578063ce96cb77146106ec578063d4f391101461070b575f5ffd5b8063a8c62e7611610104578063a8c62e76146105b3578063a9059cbb146105cf578063ad3cb1cc146105ee578063b3d7f6b91461061e578063b460af941461063d578063ba0876521461065c575f5ffd5b806370a082311461052f57806391d148541461054e57806394bf804d1461056d57806395d89b411461058c578063a217fddf146105a0575f5ffd5b806324ea54f4116101d6578063402d267d1161019b578063402d267d146104ab57806347e57533146104ca5780634cdad506146102fb5780634f1ef286146104e957806352d1902d146104fc5780636e553f6514610510575f5ffd5b806324ea54f4146103e85780632f2ff15d1461041b578063313ce5671461043a57806336568abe1461046057806338d52e0f1461047f575f5ffd5b8063095ea7b311610227578063095ea7b31461031a5780630a28a4771461033957806318160ddd146103585780631e4e00911461038b57806323b872dd146103aa578063248a9ca3146103c9575f5ffd5b806301e1d1141461026357806301ffc9a71461028a57806302a602e9146102b957806306fdde03146102da57806307a2d13a146102fb575b5f5ffd5b34801561026e575f5ffd5b506102776107d9565b6040519081526020015b60405180910390f35b348015610295575f5ffd5b506102a96102a4366004612724565b6107f3565b6040519015158152602001610281565b3480156102c4575f5ffd5b506102d86102d3366004612804565b610829565b005b3480156102e5575f5ffd5b506102ee610941565b60405161028191906128f6565b348015610306575f5ffd5b50610277610315366004612908565b610a01565b348015610325575f5ffd5b506102a961033436600461291f565b610a0c565b348015610344575f5ffd5b50610277610353366004612908565b610a23565b348015610363575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610277565b348015610396575f5ffd5b506102d86103a5366004612949565b610a2f565b3480156103b5575f5ffd5b506102a96103c4366004612969565b610a48565b3480156103d4575f5ffd5b506102776103e3366004612908565b610a6d565b3480156103f3575f5ffd5b506102777f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b348015610426575f5ffd5b506102d86104353660046129a7565b610a8d565b348015610445575f5ffd5b5061044e610aaf565b60405160ff9091168152602001610281565b34801561046b575f5ffd5b506102d861047a3660046129a7565b610ade565b34801561048a575f5ffd5b50610493610b11565b6040516001600160a01b039091168152602001610281565b3480156104b6575f5ffd5b506102776104c53660046129d5565b610b2c565b3480156104d5575f5ffd5b506102ee6104e4366004612908565b610b53565b6102d86104f73660046129f0565b610c70565b348015610507575f5ffd5b50610277610c8f565b34801561051b575f5ffd5b5061027761052a3660046129a7565b610caa565b34801561053a575f5ffd5b506102776105493660046129d5565b610d07565b348015610559575f5ffd5b506102a96105683660046129a7565b610d2d565b348015610578575f5ffd5b506102776105873660046129a7565b610d63565b348015610597575f5ffd5b506102ee610daf565b3480156105ab575f5ffd5b506102775f81565b3480156105be575f5ffd5b505f546001600160a01b0316610493565b3480156105da575f5ffd5b506102a96105e936600461291f565b610ded565b3480156105f9575f5ffd5b506102ee604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610629575f5ffd5b50610277610638366004612908565b610dfa565b348015610648575f5ffd5b50610277610657366004612a3d565b610e06565b348015610667575f5ffd5b50610277610676366004612a3d565b610e5c565b348015610686575f5ffd5b506102777f2e704739166abb26e88a93c0d60bae654bea582d8d8fa53cd8580ca0878fb54881565b3480156106b9575f5ffd5b506102776106c83660046129d5565b610ea9565b3480156106d8575f5ffd5b506102776106e7366004612908565b610ed8565b3480156106f7575f5ffd5b506102776107063660046129d5565b610ee3565b348015610716575f5ffd5b506102ee610725366004612a7c565b610f05565b348015610735575f5ffd5b506102d86107443660046129a7565b610f1e565b348015610754575f5ffd5b506102776107633660046129d5565b610f3a565b348015610773575f5ffd5b506102d8610782366004612a9d565b610f69565b348015610792575f5ffd5b506102776107a1366004612af6565b610fd7565b3480156107b1575f5ffd5b506102777fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b5f80546107ee906001600160a01b0316611020565b905090565b5f6001600160e01b03198216637965db0b60e01b148061082357506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561086e5750825b90505f8267ffffffffffffffff16600114801561088a5750303b155b905081158015610898575080155b156108b65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108e057845460ff60401b1916600160401b1785555b6108ee8b8b8b8b8b8b611089565b831561093457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020612e645f395f51905f529161097f90612b22565b80601f01602080910402602001604051908101604052809291908181526020018280546109ab90612b22565b80156109f65780601f106109cd576101008083540402835291602001916109f6565b820191905f5260205f20905b8154815290600101906020018083116109d957829003601f168201915b505050505091505090565b5f610823825f6110af565b5f33610a19818585611106565b5060019392505050565b5f610823826001611113565b5f610a3981611161565b610a43838361116e565b505050565b5f33610a558582856111ce565b610a60858585611218565b60019150505b9392505050565b5f9081525f516020612ea45f395f51905f52602052604090206001015490565b610a9682610a6d565b610a9f81611161565b610aa98383611275565b50505050565b5f805f516020612ec45f395f51905f5290505f8154610ad89190600160a01b900460ff16612b6e565b91505090565b6001600160a01b0381163314610b075760405163334bd91960e11b815260040160405180910390fd5b610a438282611316565b5f516020612ec45f395f51905f52546001600160a01b031690565b5f805461082390610b45906001600160a01b031661138f565b610b4e846113bd565b6113fa565b5f5460408051635b9a4c3560e01b815290516060926001600160a01b031691635b9a4c359160048083019260209291908290030181865afa158015610b9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbe9190612b87565b8214610bdd5760405163213109dd60e11b815260040160405180910390fd5b815482908190610bec90612b22565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1890612b22565b8015610c635780601f10610c3a57610100808354040283529160200191610c63565b820191905f5260205f20905b815481529060010190602001808311610c4657829003601f168201915b5050505050915050919050565b610c78611409565b610c81826114af565b610c8b82826114d9565b5050565b5f610c98611595565b505f516020612e845f395f51905f5290565b5f5f610cb583610b2c565b905080841115610ce757828482604051633c8097d960e11b8152600401610cde93929190612b9e565b60405180910390fd5b5f610cf185610ed8565b9050610cff338587846115de565b949350505050565b6001600160a01b03165f9081525f516020612e645f395f51905f52602052604090205490565b5f9182525f516020612ea45f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f610d6e83610ea9565b905080841115610d975782848260405163284ff66760e01b8152600401610cde93929190612b9e565b5f610da185610dfa565b9050610cff338583886115de565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020612e645f395f51905f529161097f90612b22565b5f33610a19818585611218565b5f6108238260016110af565b5f5f610e1183610ee3565b905080851115610e3a57828582604051633fa733bb60e21b8152600401610cde93929190612b9e565b5f610e4486610a23565b9050610e53338686898561160b565b95945050505050565b5f5f610e6783610f3a565b905080851115610e9057828582604051632e52afbb60e21b8152600401610cde93929190612b9e565b5f610e9a86610a01565b9050610e53338686848a61160b565b5f80548190610ec0906001600160a01b031661138f565b9050610a66610ecf825f611113565b610b4e856113bd565b5f610823825f611113565b5f805461082390610efc906001600160a01b0316611633565b610b4e84611661565b5f54606090610a66906001600160a01b03168484611674565b610f2782610a6d565b610f3081611161565b610aa98383611316565b5f80548190610f51906001600160a01b0316611633565b9050610a66610f60825f611113565b610b4e856116c6565b7f2e704739166abb26e88a93c0d60bae654bea582d8d8fa53cd8580ca0878fb548610f9381611161565b5f54610fb2906001600160a01b03168585610fac610b11565b866116d0565b50505f80546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015611065573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190612b87565b61109161181e565b61109d86868686611867565b6110a782826118c4565b505050505050565b5f610a666110bb6107d9565b6110c6906001612bbf565b6110d15f600a612cb5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546110fd9190612bbf565b85919085611916565b610a438383836001611958565b5f610a6661112282600a612cb5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461114e9190612bbf565b6111566107d9565b6110fd906001612bbf565b61116b8133611a3b565b50565b5f516020612ea45f395f51905f525f61118684610a6d565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f6111d98484610fd7565b90505f198114610aa9578181101561120a57828183604051637dc7a0d960e11b8152600401610cde93929190612b9e565b610aa984848484035f611958565b6001600160a01b03831661124157604051634b637e8f60e11b81525f6004820152602401610cde565b6001600160a01b03821661126a5760405163ec442f0560e01b81525f6004820152602401610cde565b610a43838383611a74565b5f5f516020612ea45f395f51905f5261128e8484610d2d565b61130d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556112c33390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610823565b5f915050610823565b5f5f516020612ea45f395f51905f5261132f8484610d2d565b1561130d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610823565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d9060240161104a565b5f6113e87fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a683610d2d565b6113f357505f919050565b5f19610823565b5f828218828410028218610a66565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061148f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114835f516020612e845f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156114ad5760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610c8b81611161565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611533575060408051601f3d908101601f1916820190925261153091810190612b87565b60015b61155b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610cde565b5f516020612e845f395f51905f52811461158b57604051632a87526960e21b815260048101829052602401610cde565b610a438383611b9a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114ad5760405163703e46dd60e11b815260040160405180910390fd5b6115ea84848484611bef565b5f8054611604916001600160a01b03909116908490611c6c565b5050505050565b5f8054611625916001600160a01b03909116908490611da8565b506116048585858585611ec9565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb779060240161104a565b5f61082361166e83610d07565b5f6110af565b6060610cff838360405160240161168c929190612cc3565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b03861690611f7d565b5f61082382610d07565b6116da8483611fe6565b60405163f3e0ffbf60e01b815230600482015261174c9086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa158015611722573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117469190612b87565b83611da8565b506117578582612078565b611761848461219d565b6040516370a0823160e01b81523060048201526117d39085906001600160a01b038516906370a0823190602401602060405180830381865afa1580156117a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117cd9190612b87565b83611c6c565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166114ad57604051631afcd79f60e31b815260040160405180910390fd5b61186f61181e565b6118776121eb565b61187f6121eb565b6001600160a01b0381166118a8576040516337bce3c560e11b81525f6004820152602401610cde565b6118b1816121f3565b6118bb8484612204565b610aa982612216565b6118cc61181e565b5f80546001600160a01b0319166001600160a01b0384161790556119016118f1610b11565b6001600160a01b03841690611fe6565b5f54610c8b906001600160a01b03168261219d565b5f61194361192383612228565b801561193e57505f848061193957611939612cde565b868809115b151590565b61194e868686612254565b610e539190612bbf565b5f516020612e645f395f51905f526001600160a01b03851661198f5760405163e602df0560e01b81525f6004820152602401610cde565b6001600160a01b0384166119b857604051634a1406b160e11b81525f6004820152602401610cde565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561160457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611a2c91815260200190565b60405180910390a35050505050565b611a458282610d2d565b610c8b5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610cde565b5f516020612e645f395f51905f526001600160a01b038416611aae5781816002015f828254611aa39190612bbf565b90915550611b0b9050565b6001600160a01b0384165f9081526020829052604090205482811015611aed5784818460405163391434e360e21b8152600401610cde93929190612b9e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611b29576002810180548390039055611b47565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b8c91815260200190565b60405180910390a350505050565b611ba38261230a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611be757610a438282611f7d565b610c8b61236d565b5f516020612ec45f395f51905f528054611c14906001600160a01b031686308661238c565b611c1e84836123f3565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611a2c929190918252602082015260400190565b5f8115611d4e575f5f856001600160a01b031685604051602401611c9291815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251611cc79190612cf2565b5f60405180830381855af49150503d805f8114611cff576040519150601f19603f3d011682016040523d82523d5f602084013e611d04565b606091505b509150915081611d46577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051611d3d91906128f6565b60405180910390a15b509050610a66565b611d9e83604051602401611d6491815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b03861690611f7d565b5060019050610a66565b5f8115611e79575f5f856001600160a01b031685604051602401611dce91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251611e039190612cf2565b5f60405180830381855af49150503d805f8114611e3b576040519150601f19603f3d011682016040523d82523d5f602084013e611e40565b606091505b509150915081611d46577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051611d3d91906128f6565b611d9e83604051602401611e8f91815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b03861690611f7d565b5f516020612ec45f395f51905f526001600160a01b0386811690851614611ef557611ef58487846111ce565b611eff8483612427565b8054611f15906001600160a01b0316868561245b565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051611f6d929190918252602082015260400190565b60405180910390a4505050505050565b60605f5f846001600160a01b031684604051611f999190612cf2565b5f60405180830381855af49150503d805f8114611fd1576040519150601f19603f3d011682016040523d82523d5f602084013e611fd6565b606091505b5091509150610e5385838361248c565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa15801561202d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120519190612d08565b6001600160a01b031614610c8b5760405163e76673ef60e01b815260040160405180910390fd5b801561215357604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b179052516120cf9190612cf2565b5f60405180830381855af49150503d805f8114612107576040519150601f19603f3d011682016040523d82523d5f602084013e61210c565b606091505b509150915081610aa9577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf88160405161214591906128f6565b60405180910390a150505050565b6040515f6024820152610a439060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b03841690611f7d565b610a43816040516024016121b191906128f6565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b03841690611f7d565b6114ad61181e565b6121fb61181e565b61116b816124e8565b61220c61181e565b610c8b8282612558565b61221e61181e565b610c8b5f82611275565b5f600282600381111561223d5761223d612d23565b6122479190612d37565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036122885783828161227e5761227e612cde565b0492505050610a66565b80841161229f5761229f60038515026011186125a8565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361233f57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610cde565b5f516020612e845f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b34156114ad5760405163b398979f60e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610aa99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506125b9565b6001600160a01b03821661241c5760405163ec442f0560e01b81525f6004820152602401610cde565b610c8b5f8383611a74565b6001600160a01b03821661245057604051634b637e8f60e11b81525f6004820152602401610cde565b610c8b825f83611a74565b6040516001600160a01b03838116602483015260448201839052610a4391859182169063a9059cbb906064016123c1565b6060826124a15761249c82612625565b610a66565b81511580156124b857506001600160a01b0384163b155b156124e157604051639996b31560e01b81526001600160a01b0385166004820152602401610cde565b5080610a66565b6124f061181e565b5f516020612ec45f395f51905f525f806125098461264e565b915091508161251957601261251b565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61256061181e565b5f516020612e645f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036125998482612da8565b5060048101610aa98382612da8565b634e487b715f52806020526024601cfd5b5f5f60205f8451602086015f885af1806125d8576040513d5f823e3d81fd5b50505f513d915081156125ef5780600114156125fc565b6001600160a01b0384163b155b15610aa957604051635274afe760e01b81526001600160a01b0385166004820152602401610cde565b8051156126355780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161269491612cf2565b5f60405180830381855afa9150503d805f81146126cc576040519150601f19603f3d011682016040523d82523d5f602084013e6126d1565b606091505b50915091508180156126e557506020815110155b15612718575f818060200190518101906126ff9190612b87565b905060ff8111612716576001969095509350505050565b505b505f9485945092505050565b5f60208284031215612734575f5ffd5b81356001600160e01b031981168114610a66575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261276e575f5ffd5b8135602083015f5f67ffffffffffffffff84111561278e5761278e61274b565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156127bd576127bd61274b565b6040528381529050808284018710156127d4575f5ffd5b838360208301375f602085830101528094505050505092915050565b6001600160a01b038116811461116b575f5ffd5b5f5f5f5f5f5f60c08789031215612819575f5ffd5b863567ffffffffffffffff81111561282f575f5ffd5b61283b89828a0161275f565b965050602087013567ffffffffffffffff811115612857575f5ffd5b61286389828a0161275f565b9550506040870135612874816127f0565b93506060870135612884816127f0565b92506080870135612894816127f0565b915060a087013567ffffffffffffffff8111156128af575f5ffd5b6128bb89828a0161275f565b9150509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610a6660208301846128c8565b5f60208284031215612918575f5ffd5b5035919050565b5f5f60408385031215612930575f5ffd5b823561293b816127f0565b946020939093013593505050565b5f5f6040838503121561295a575f5ffd5b50508035926020909101359150565b5f5f5f6060848603121561297b575f5ffd5b8335612986816127f0565b92506020840135612996816127f0565b929592945050506040919091013590565b5f5f604083850312156129b8575f5ffd5b8235915060208301356129ca816127f0565b809150509250929050565b5f602082840312156129e5575f5ffd5b8135610a66816127f0565b5f5f60408385031215612a01575f5ffd5b8235612a0c816127f0565b9150602083013567ffffffffffffffff811115612a27575f5ffd5b612a338582860161275f565b9150509250929050565b5f5f5f60608486031215612a4f575f5ffd5b833592506020840135612a61816127f0565b91506040840135612a71816127f0565b809150509250925092565b5f5f60408385031215612a8d575f5ffd5b823560ff81168114612a0c575f5ffd5b5f5f5f60608486031215612aaf575f5ffd5b8335612aba816127f0565b9250602084013567ffffffffffffffff811115612ad5575f5ffd5b612ae18682870161275f565b92505060408401358015158114612a71575f5ffd5b5f5f60408385031215612b07575f5ffd5b8235612b12816127f0565b915060208301356129ca816127f0565b600181811c90821680612b3657607f821691505b602082108103612b5457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561082357610823612b5a565b5f60208284031215612b97575f5ffd5b5051919050565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561082357610823612b5a565b6001815b6001841115612c0d57808504811115612bf157612bf1612b5a565b6001841615612bff57908102905b60019390931c928002612bd6565b935093915050565b5f82612c2357506001610823565b81612c2f57505f610823565b8160018114612c455760028114612c4f57612c6b565b6001915050610823565b60ff841115612c6057612c60612b5a565b50506001821b610823565b5060208310610133831016604e8410600b8410161715612c8e575081810a610823565b612c9a5f198484612bd2565b805f1904821115612cad57612cad612b5a565b029392505050565b5f610a6660ff841683612c15565b60ff83168152604060208201525f610cff60408301846128c8565b634e487b7160e01b5f52601260045260245ffd5b5f82518060208501845e5f920191825250919050565b5f60208284031215612d18575f5ffd5b8151610a66816127f0565b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680612d5557634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f821115610a4357805f5260205f20601f840160051c81016020851015612d895750805b601f840160051c820191505b81811015611604575f8155600101612d95565b815167ffffffffffffffff811115612dc257612dc261274b565b612dd681612dd08454612b22565b84612d64565b6020601f821160018114612e08575f8315612df15750848201515b5f19600385901b1c1916600184901b178455611604565b5f84815260208120601f198516915b82811015612e375787850151825560209485019460019092019101612e17565b5084821015612e5457868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a264697066735822122075956b98bfa24ac35cccace88420a64ce3eec8b3ebd9cf9d682d9327afaa762d64736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061025f575f3560e01c806370a082311161013f578063baaf36b5116100b3578063d547741f11610078578063d547741f1461072a578063d905777e14610749578063d9221bb514610768578063dd62ed3e14610787578063e1d39450146107a6578063ef8b30f7146106cd575f5ffd5b8063baaf36b51461067b578063c63d75b6146106ae578063c6e6f592146106cd578063ce96cb77146106ec578063d4f391101461070b575f5ffd5b8063a8c62e7611610104578063a8c62e76146105b3578063a9059cbb146105cf578063ad3cb1cc146105ee578063b3d7f6b91461061e578063b460af941461063d578063ba0876521461065c575f5ffd5b806370a082311461052f57806391d148541461054e57806394bf804d1461056d57806395d89b411461058c578063a217fddf146105a0575f5ffd5b806324ea54f4116101d6578063402d267d1161019b578063402d267d146104ab57806347e57533146104ca5780634cdad506146102fb5780634f1ef286146104e957806352d1902d146104fc5780636e553f6514610510575f5ffd5b806324ea54f4146103e85780632f2ff15d1461041b578063313ce5671461043a57806336568abe1461046057806338d52e0f1461047f575f5ffd5b8063095ea7b311610227578063095ea7b31461031a5780630a28a4771461033957806318160ddd146103585780631e4e00911461038b57806323b872dd146103aa578063248a9ca3146103c9575f5ffd5b806301e1d1141461026357806301ffc9a71461028a57806302a602e9146102b957806306fdde03146102da57806307a2d13a146102fb575b5f5ffd5b34801561026e575f5ffd5b506102776107d9565b6040519081526020015b60405180910390f35b348015610295575f5ffd5b506102a96102a4366004612724565b6107f3565b6040519015158152602001610281565b3480156102c4575f5ffd5b506102d86102d3366004612804565b610829565b005b3480156102e5575f5ffd5b506102ee610941565b60405161028191906128f6565b348015610306575f5ffd5b50610277610315366004612908565b610a01565b348015610325575f5ffd5b506102a961033436600461291f565b610a0c565b348015610344575f5ffd5b50610277610353366004612908565b610a23565b348015610363575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610277565b348015610396575f5ffd5b506102d86103a5366004612949565b610a2f565b3480156103b5575f5ffd5b506102a96103c4366004612969565b610a48565b3480156103d4575f5ffd5b506102776103e3366004612908565b610a6d565b3480156103f3575f5ffd5b506102777f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b348015610426575f5ffd5b506102d86104353660046129a7565b610a8d565b348015610445575f5ffd5b5061044e610aaf565b60405160ff9091168152602001610281565b34801561046b575f5ffd5b506102d861047a3660046129a7565b610ade565b34801561048a575f5ffd5b50610493610b11565b6040516001600160a01b039091168152602001610281565b3480156104b6575f5ffd5b506102776104c53660046129d5565b610b2c565b3480156104d5575f5ffd5b506102ee6104e4366004612908565b610b53565b6102d86104f73660046129f0565b610c70565b348015610507575f5ffd5b50610277610c8f565b34801561051b575f5ffd5b5061027761052a3660046129a7565b610caa565b34801561053a575f5ffd5b506102776105493660046129d5565b610d07565b348015610559575f5ffd5b506102a96105683660046129a7565b610d2d565b348015610578575f5ffd5b506102776105873660046129a7565b610d63565b348015610597575f5ffd5b506102ee610daf565b3480156105ab575f5ffd5b506102775f81565b3480156105be575f5ffd5b505f546001600160a01b0316610493565b3480156105da575f5ffd5b506102a96105e936600461291f565b610ded565b3480156105f9575f5ffd5b506102ee604051806040016040528060058152602001640352e302e360dc1b81525081565b348015610629575f5ffd5b50610277610638366004612908565b610dfa565b348015610648575f5ffd5b50610277610657366004612a3d565b610e06565b348015610667575f5ffd5b50610277610676366004612a3d565b610e5c565b348015610686575f5ffd5b506102777f2e704739166abb26e88a93c0d60bae654bea582d8d8fa53cd8580ca0878fb54881565b3480156106b9575f5ffd5b506102776106c83660046129d5565b610ea9565b3480156106d8575f5ffd5b506102776106e7366004612908565b610ed8565b3480156106f7575f5ffd5b506102776107063660046129d5565b610ee3565b348015610716575f5ffd5b506102ee610725366004612a7c565b610f05565b348015610735575f5ffd5b506102d86107443660046129a7565b610f1e565b348015610754575f5ffd5b506102776107633660046129d5565b610f3a565b348015610773575f5ffd5b506102d8610782366004612a9d565b610f69565b348015610792575f5ffd5b506102776107a1366004612af6565b610fd7565b3480156107b1575f5ffd5b506102777fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a681565b5f80546107ee906001600160a01b0316611020565b905090565b5f6001600160e01b03198216637965db0b60e01b148061082357506301ffc9a760e01b6001600160e01b03198316145b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561086e5750825b90505f8267ffffffffffffffff16600114801561088a5750303b155b905081158015610898575080155b156108b65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108e057845460ff60401b1916600160401b1785555b6108ee8b8b8b8b8b8b611089565b831561093457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f516020612e645f395f51905f529161097f90612b22565b80601f01602080910402602001604051908101604052809291908181526020018280546109ab90612b22565b80156109f65780601f106109cd576101008083540402835291602001916109f6565b820191905f5260205f20905b8154815290600101906020018083116109d957829003601f168201915b505050505091505090565b5f610823825f6110af565b5f33610a19818585611106565b5060019392505050565b5f610823826001611113565b5f610a3981611161565b610a43838361116e565b505050565b5f33610a558582856111ce565b610a60858585611218565b60019150505b9392505050565b5f9081525f516020612ea45f395f51905f52602052604090206001015490565b610a9682610a6d565b610a9f81611161565b610aa98383611275565b50505050565b5f805f516020612ec45f395f51905f5290505f8154610ad89190600160a01b900460ff16612b6e565b91505090565b6001600160a01b0381163314610b075760405163334bd91960e11b815260040160405180910390fd5b610a438282611316565b5f516020612ec45f395f51905f52546001600160a01b031690565b5f805461082390610b45906001600160a01b031661138f565b610b4e846113bd565b6113fa565b5f5460408051635b9a4c3560e01b815290516060926001600160a01b031691635b9a4c359160048083019260209291908290030181865afa158015610b9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbe9190612b87565b8214610bdd5760405163213109dd60e11b815260040160405180910390fd5b815482908190610bec90612b22565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1890612b22565b8015610c635780601f10610c3a57610100808354040283529160200191610c63565b820191905f5260205f20905b815481529060010190602001808311610c4657829003601f168201915b5050505050915050919050565b610c78611409565b610c81826114af565b610c8b82826114d9565b5050565b5f610c98611595565b505f516020612e845f395f51905f5290565b5f5f610cb583610b2c565b905080841115610ce757828482604051633c8097d960e11b8152600401610cde93929190612b9e565b60405180910390fd5b5f610cf185610ed8565b9050610cff338587846115de565b949350505050565b6001600160a01b03165f9081525f516020612e645f395f51905f52602052604090205490565b5f9182525f516020612ea45f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f5f610d6e83610ea9565b905080841115610d975782848260405163284ff66760e01b8152600401610cde93929190612b9e565b5f610da185610dfa565b9050610cff338583886115de565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f516020612e645f395f51905f529161097f90612b22565b5f33610a19818585611218565b5f6108238260016110af565b5f5f610e1183610ee3565b905080851115610e3a57828582604051633fa733bb60e21b8152600401610cde93929190612b9e565b5f610e4486610a23565b9050610e53338686898561160b565b95945050505050565b5f5f610e6783610f3a565b905080851115610e9057828582604051632e52afbb60e21b8152600401610cde93929190612b9e565b5f610e9a86610a01565b9050610e53338686848a61160b565b5f80548190610ec0906001600160a01b031661138f565b9050610a66610ecf825f611113565b610b4e856113bd565b5f610823825f611113565b5f805461082390610efc906001600160a01b0316611633565b610b4e84611661565b5f54606090610a66906001600160a01b03168484611674565b610f2782610a6d565b610f3081611161565b610aa98383611316565b5f80548190610f51906001600160a01b0316611633565b9050610a66610f60825f611113565b610b4e856116c6565b7f2e704739166abb26e88a93c0d60bae654bea582d8d8fa53cd8580ca0878fb548610f9381611161565b5f54610fb2906001600160a01b03168585610fac610b11565b866116d0565b50505f80546001600160a01b0319166001600160a01b03939093169290921790915550565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b60405163f3e0ffbf60e01b81523060048201525f906001600160a01b0383169063f3e0ffbf906024015b602060405180830381865afa158015611065573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190612b87565b61109161181e565b61109d86868686611867565b6110a782826118c4565b505050505050565b5f610a666110bb6107d9565b6110c6906001612bbf565b6110d15f600a612cb5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546110fd9190612bbf565b85919085611916565b610a438383836001611958565b5f610a6661112282600a612cb5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461114e9190612bbf565b6111566107d9565b6110fd906001612bbf565b61116b8133611a3b565b50565b5f516020612ea45f395f51905f525f61118684610a6d565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f6111d98484610fd7565b90505f198114610aa9578181101561120a57828183604051637dc7a0d960e11b8152600401610cde93929190612b9e565b610aa984848484035f611958565b6001600160a01b03831661124157604051634b637e8f60e11b81525f6004820152602401610cde565b6001600160a01b03821661126a5760405163ec442f0560e01b81525f6004820152602401610cde565b610a43838383611a74565b5f5f516020612ea45f395f51905f5261128e8484610d2d565b61130d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556112c33390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610823565b5f915050610823565b5f5f516020612ea45f395f51905f5261132f8484610d2d565b1561130d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610823565b60405163402d267d60e01b81523060048201525f906001600160a01b0383169063402d267d9060240161104a565b5f6113e87fb0296ea8dd3227371927b1c1cea2b12ea394743ddf2f32f58024ce26f83a24a683610d2d565b6113f357505f919050565b5f19610823565b5f828218828410028218610a66565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061148f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114835f516020612e845f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156114ad5760405163703e46dd60e11b815260040160405180910390fd5b565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610c8b81611161565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611533575060408051601f3d908101601f1916820190925261153091810190612b87565b60015b61155b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610cde565b5f516020612e845f395f51905f52811461158b57604051632a87526960e21b815260048101829052602401610cde565b610a438383611b9a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114ad5760405163703e46dd60e11b815260040160405180910390fd5b6115ea84848484611bef565b5f8054611604916001600160a01b03909116908490611c6c565b5050505050565b5f8054611625916001600160a01b03909116908490611da8565b506116048585858585611ec9565b60405163ce96cb7760e01b81523060048201525f906001600160a01b0383169063ce96cb779060240161104a565b5f61082361166e83610d07565b5f6110af565b6060610cff838360405160240161168c929190612cc3565b60408051601f198184030181529190526020810180516001600160e01b03166304c0d8e160e11b1790526001600160a01b03861690611f7d565b5f61082382610d07565b6116da8483611fe6565b60405163f3e0ffbf60e01b815230600482015261174c9086906001600160a01b0382169063f3e0ffbf90602401602060405180830381865afa158015611722573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117469190612b87565b83611da8565b506117578582612078565b611761848461219d565b6040516370a0823160e01b81523060048201526117d39085906001600160a01b038516906370a0823190602401602060405180830381865afa1580156117a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117cd9190612b87565b83611c6c565b50604080516001600160a01b038088168252861660208201527f254c88e7a2ea123aeeb89b7cc413fb949188fefcdb7584c4f3d493294daf65c5910160405180910390a15050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166114ad57604051631afcd79f60e31b815260040160405180910390fd5b61186f61181e565b6118776121eb565b61187f6121eb565b6001600160a01b0381166118a8576040516337bce3c560e11b81525f6004820152602401610cde565b6118b1816121f3565b6118bb8484612204565b610aa982612216565b6118cc61181e565b5f80546001600160a01b0319166001600160a01b0384161790556119016118f1610b11565b6001600160a01b03841690611fe6565b5f54610c8b906001600160a01b03168261219d565b5f61194361192383612228565b801561193e57505f848061193957611939612cde565b868809115b151590565b61194e868686612254565b610e539190612bbf565b5f516020612e645f395f51905f526001600160a01b03851661198f5760405163e602df0560e01b81525f6004820152602401610cde565b6001600160a01b0384166119b857604051634a1406b160e11b81525f6004820152602401610cde565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561160457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611a2c91815260200190565b60405180910390a35050505050565b611a458282610d2d565b610c8b5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610cde565b5f516020612e645f395f51905f526001600160a01b038416611aae5781816002015f828254611aa39190612bbf565b90915550611b0b9050565b6001600160a01b0384165f9081526020829052604090205482811015611aed5784818460405163391434e360e21b8152600401610cde93929190612b9e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611b29576002810180548390039055611b47565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b8c91815260200190565b60405180910390a350505050565b611ba38261230a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611be757610a438282611f7d565b610c8b61236d565b5f516020612ec45f395f51905f528054611c14906001600160a01b031686308661238c565b611c1e84836123f3565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051611a2c929190918252602082015260400190565b5f8115611d4e575f5f856001600160a01b031685604051602401611c9291815260200190565b60408051601f198184030181529181526020820180516001600160e01b031663b6b55f2560e01b17905251611cc79190612cf2565b5f60405180830381855af49150503d805f8114611cff576040519150601f19603f3d011682016040523d82523d5f602084013e611d04565b606091505b509150915081611d46577ff8e68f23d3b33772e986cc9861e94e8fd6b9461d62bc1fb21cd754bbaf726bd381604051611d3d91906128f6565b60405180910390a15b509050610a66565b611d9e83604051602401611d6491815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663b6b55f2560e01b1790526001600160a01b03861690611f7d565b5060019050610a66565b5f8115611e79575f5f856001600160a01b031685604051602401611dce91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316632e1a7d4d60e01b17905251611e039190612cf2565b5f60405180830381855af49150503d805f8114611e3b576040519150601f19603f3d011682016040523d82523d5f602084013e611e40565b606091505b509150915081611d46577fad0ad28a12a6ed800f1a7b398454913afe6826c175e6cc28f2e8e2c175b0d72881604051611d3d91906128f6565b611d9e83604051602401611e8f91815260200190565b60408051601f198184030181529190526020810180516001600160e01b0316632e1a7d4d60e01b1790526001600160a01b03861690611f7d565b5f516020612ec45f395f51905f526001600160a01b0386811690851614611ef557611ef58487846111ce565b611eff8483612427565b8054611f15906001600160a01b0316868561245b565b836001600160a01b0316856001600160a01b0316876001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8686604051611f6d929190918252602082015260400190565b60405180910390a4505050505050565b60605f5f846001600160a01b031684604051611f999190612cf2565b5f60405180830381855af49150503d805f8114611fd1576040519150601f19603f3d011682016040523d82523d5f602084013e611fd6565b606091505b5091509150610e5385838361248c565b604051634e2333d160e11b81523060048201526001600160a01b038083169190841690639c4667a290602401602060405180830381865afa15801561202d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120519190612d08565b6001600160a01b031614610c8b5760405163e76673ef60e01b815260040160405180910390fd5b801561215357604051600160248201525f9081906001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b0316632d08ba2b60e11b179052516120cf9190612cf2565b5f60405180830381855af49150503d805f8114612107576040519150601f19603f3d011682016040523d82523d5f602084013e61210c565b606091505b509150915081610aa9577f9f864ace9f45c2734f9444cb9a0c1ade6f1b15a8c202c17175b759728a4a0bf88160405161214591906128f6565b60405180910390a150505050565b6040515f6024820152610a439060440160408051601f198184030181529190526020810180516001600160e01b0316632d08ba2b60e11b1790526001600160a01b03841690611f7d565b610a43816040516024016121b191906128f6565b60408051601f198184030181529190526020810180516001600160e01b031663139a8e2560e31b1790526001600160a01b03841690611f7d565b6114ad61181e565b6121fb61181e565b61116b816124e8565b61220c61181e565b610c8b8282612558565b61221e61181e565b610c8b5f82611275565b5f600282600381111561223d5761223d612d23565b6122479190612d37565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f036122885783828161227e5761227e612cde565b0492505050610a66565b80841161229f5761229f60038515026011186125a8565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806001600160a01b03163b5f0361233f57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610cde565b5f516020612e845f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b34156114ad5760405163b398979f60e01b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610aa99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506125b9565b6001600160a01b03821661241c5760405163ec442f0560e01b81525f6004820152602401610cde565b610c8b5f8383611a74565b6001600160a01b03821661245057604051634b637e8f60e11b81525f6004820152602401610cde565b610c8b825f83611a74565b6040516001600160a01b03838116602483015260448201839052610a4391859182169063a9059cbb906064016123c1565b6060826124a15761249c82612625565b610a66565b81511580156124b857506001600160a01b0384163b155b156124e157604051639996b31560e01b81526001600160a01b0385166004820152602401610cde565b5080610a66565b6124f061181e565b5f516020612ec45f395f51905f525f806125098461264e565b915091508161251957601261251b565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61256061181e565b5f516020612e645f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036125998482612da8565b5060048101610aa98382612da8565b634e487b715f52806020526024601cfd5b5f5f60205f8451602086015f885af1806125d8576040513d5f823e3d81fd5b50505f513d915081156125ef5780600114156125fc565b6001600160a01b0384163b155b15610aa957604051635274afe760e01b81526001600160a01b0385166004820152602401610cde565b8051156126355780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161269491612cf2565b5f60405180830381855afa9150503d805f81146126cc576040519150601f19603f3d011682016040523d82523d5f602084013e6126d1565b606091505b50915091508180156126e557506020815110155b15612718575f818060200190518101906126ff9190612b87565b905060ff8111612716576001969095509350505050565b505b505f9485945092505050565b5f60208284031215612734575f5ffd5b81356001600160e01b031981168114610a66575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261276e575f5ffd5b8135602083015f5f67ffffffffffffffff84111561278e5761278e61274b565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff821117156127bd576127bd61274b565b6040528381529050808284018710156127d4575f5ffd5b838360208301375f602085830101528094505050505092915050565b6001600160a01b038116811461116b575f5ffd5b5f5f5f5f5f5f60c08789031215612819575f5ffd5b863567ffffffffffffffff81111561282f575f5ffd5b61283b89828a0161275f565b965050602087013567ffffffffffffffff811115612857575f5ffd5b61286389828a0161275f565b9550506040870135612874816127f0565b93506060870135612884816127f0565b92506080870135612894816127f0565b915060a087013567ffffffffffffffff8111156128af575f5ffd5b6128bb89828a0161275f565b9150509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610a6660208301846128c8565b5f60208284031215612918575f5ffd5b5035919050565b5f5f60408385031215612930575f5ffd5b823561293b816127f0565b946020939093013593505050565b5f5f6040838503121561295a575f5ffd5b50508035926020909101359150565b5f5f5f6060848603121561297b575f5ffd5b8335612986816127f0565b92506020840135612996816127f0565b929592945050506040919091013590565b5f5f604083850312156129b8575f5ffd5b8235915060208301356129ca816127f0565b809150509250929050565b5f602082840312156129e5575f5ffd5b8135610a66816127f0565b5f5f60408385031215612a01575f5ffd5b8235612a0c816127f0565b9150602083013567ffffffffffffffff811115612a27575f5ffd5b612a338582860161275f565b9150509250929050565b5f5f5f60608486031215612a4f575f5ffd5b833592506020840135612a61816127f0565b91506040840135612a71816127f0565b809150509250925092565b5f5f60408385031215612a8d575f5ffd5b823560ff81168114612a0c575f5ffd5b5f5f5f60608486031215612aaf575f5ffd5b8335612aba816127f0565b9250602084013567ffffffffffffffff811115612ad5575f5ffd5b612ae18682870161275f565b92505060408401358015158114612a71575f5ffd5b5f5f60408385031215612b07575f5ffd5b8235612b12816127f0565b915060208301356129ca816127f0565b600181811c90821680612b3657607f821691505b602082108103612b5457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561082357610823612b5a565b5f60208284031215612b97575f5ffd5b5051919050565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561082357610823612b5a565b6001815b6001841115612c0d57808504811115612bf157612bf1612b5a565b6001841615612bff57908102905b60019390931c928002612bd6565b935093915050565b5f82612c2357506001610823565b81612c2f57505f610823565b8160018114612c455760028114612c4f57612c6b565b6001915050610823565b60ff841115612c6057612c60612b5a565b50506001821b610823565b5060208310610133831016604e8410600b8410161715612c8e575081810a610823565b612c9a5f198484612bd2565b805f1904821115612cad57612cad612b5a565b029392505050565b5f610a6660ff841683612c15565b60ff83168152604060208201525f610cff60408301846128c8565b634e487b7160e01b5f52601260045260245ffd5b5f82518060208501845e5f920191825250919050565b5f60208284031215612d18575f5ffd5b8151610a66816127f0565b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680612d5557634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b601f821115610a4357805f5260205f20601f840160051c81016020851015612d895750805b601f840160051c820191505b81811015611604575f8155600101612d95565b815167ffffffffffffffff811115612dc257612dc261274b565b612dd681612dd08454612b22565b84612d64565b6020601f821160018114612e08575f8315612df15750848201515b5f19600385901b1c1916600184901b178455611604565b5f84815260208120601f198516915b82811015612e375787850151825560209485019460019092019101612e17565b5084821015612e5457868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268000773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00a264697066735822122075956b98bfa24ac35cccace88420a64ce3eec8b3ebd9cf9d682d9327afaa762d64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
