{
  "_format": "hh-sol-artifact-1",
  "contractName": "CashFlowLender",
  "sourceName": "contracts/CashFlowLender.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trustedForwarder_",
          "type": "address"
        },
        {
          "internalType": "contract IPolicyPool",
          "name": "policyPool_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "balanceReduction",
          "type": "uint256"
        }
      ],
      "name": "BalanceDecreasedOnResolve",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotDeactivateTarget",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotDeinvestYieldVault",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "int256",
          "name": "debtAfter",
          "type": "int256"
        }
      ],
      "name": "CashOutExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "currentDebt",
          "type": "int256"
        },
        {
          "internalType": "uint96",
          "name": "debtLimit",
          "type": "uint96"
        }
      ],
      "name": "DebtLimitExceeded",
      "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": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidPolicyPool",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSlotSize",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotEnoughCash",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "OnlyPolicyPool",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "int256",
          "name": "debtAfter",
          "type": "int256"
        }
      ],
      "name": "RepaymentExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "bits",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintDowncast",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintToInt",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TargetAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "status",
          "type": "uint8"
        }
      ],
      "name": "TargetNotActive",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "TargetNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "requiredSelector",
          "type": "bytes4"
        }
      ],
      "name": "UnauthorizedForward",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "YieldVaultIsRequired",
      "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": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "debtAfterChange",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "destination",
          "type": "address"
        }
      ],
      "name": "CashOutPayout",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "value",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "debtAfterChange",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "totalDebtAfterChange",
          "type": "int256"
        }
      ],
      "name": "DebtChanged",
      "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": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "debtAfterChange",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "payer",
          "type": "address"
        }
      ],
      "name": "RepayDebt",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "slotSize",
              "type": "uint32"
            },
            {
              "internalType": "enum CashFlowLender.TargetStatus",
              "name": "status",
              "type": "uint8"
            },
            {
              "internalType": "uint96",
              "name": "debtLimit",
              "type": "uint96"
            },
            {
              "internalType": "uint96",
              "name": "minLiquidity",
              "type": "uint96"
            }
          ],
          "indexed": false,
          "internalType": "struct CashFlowLender.TargetConfig",
          "name": "config",
          "type": "tuple"
        }
      ],
      "name": "TargetAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "oldDebtLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newDebtLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "oldMinLiquidity",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newMinLiquidity",
          "type": "uint256"
        }
      ],
      "name": "TargetLimitsChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "oldSlotSize",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "newSlotSize",
          "type": "uint32"
        }
      ],
      "name": "TargetSlotSizeChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "oldStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "newStatus",
          "type": "uint8"
        }
      ],
      "name": "TargetStatusChanged",
      "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": "contract IERC4626",
          "name": "oldVault",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "contract IERC4626",
          "name": "newVault",
          "type": "address"
        }
      ],
      "name": "YieldVaultChanged",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "OWN_POLICY_SELECTOR",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SLOTSIZE_CALENDAR_MONTH",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "debtLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minLiquidity",
          "type": "uint256"
        }
      ],
      "name": "addTarget",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "destination",
          "type": "address"
        }
      ],
      "name": "cashOutPayouts",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cashWithdrawable",
      "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": "currentDebt",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "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": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "depositIntoYieldVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes[]",
          "name": "inputData",
          "type": "bytes[]"
        },
        {
          "internalType": "address",
          "name": "onBehalfOf",
          "type": "address"
        }
      ],
      "name": "forwardNewPoliciesV3",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "forwardNewPolicy",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "forwardNewPolicyBatch",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "result",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "inputData",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "onBehalfOf",
          "type": "address"
        }
      ],
      "name": "forwardNewPolicyV3",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "id",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "payout",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srScr",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lossProb",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "purePremium",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ensuroCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "partnerCommission",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "jrCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "srCoc",
              "type": "uint256"
            },
            {
              "internalType": "uint40",
              "name": "start",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "expiration",
              "type": "uint40"
            }
          ],
          "internalType": "struct Policy.PolicyData",
          "name": "policy",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "forwardResolvePolicy",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "forwardResolvePolicyBatch",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "result",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        }
      ],
      "name": "getDebtForPeriod",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "getTargetStatus",
      "outputs": [
        {
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "contract IERC4626",
          "name": "yieldVault_",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "forwarder",
          "type": "address"
        }
      ],
      "name": "isTrustedForwarder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "makeFakeSelector",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "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": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC721Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "onPayoutReceived",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "purePremiumRefund",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "jrCocRefund",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "srCocRefund",
          "type": "uint256"
        }
      ],
      "name": "onPolicyCancelled",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "onPolicyExpired",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "onPolicyReplaced",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "policyPool",
      "outputs": [
        {
          "internalType": "contract IPolicyPool",
          "name": "",
          "type": "address"
        }
      ],
      "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": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "slotSize",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "slotIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "repayDebt",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "debtLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minLiquidity",
          "type": "uint256"
        }
      ],
      "name": "setTargetLimits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "newSlotSize",
          "type": "uint32"
        }
      ],
      "name": "setTargetSlotSize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "enum CashFlowLender.TargetStatus",
          "name": "newStatus",
          "type": "uint8"
        }
      ],
      "name": "setTargetStatus",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC4626",
          "name": "yieldVault_",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "force",
          "type": "bool"
        }
      ],
      "name": "setYieldVault",
      "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": [],
      "name": "trustedForwarder",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "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"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdrawFromYieldVault",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "yieldVault",
      "outputs": [
        {
          "internalType": "contract IERC4626",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60e06040523060a052348015610013575f5ffd5b5060405161583b38038061583b8339810160408190526100329161011a565b6001600160a01b03808316608052811660c05261004d610054565b5050610152565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a45760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101035780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6001600160a01b0381168114610103575f5ffd5b5f5f6040838503121561012b575f5ffd5b825161013681610106565b602084015190925061014781610106565b809150509250929050565b60805160a05160c05161565d6101de5f395f81816106c6015281816111450152818161156b0152818161167d015281816116e8015281816122f6015281816126720152818161272d01528181612aeb0152818161381601526138ab01525f818161336b0152818161339401526134b701525f818161072d015281816108110152613983015261565d5ff3fe608060405260043610610392575f3560e01c80637da0a877116101de578063bfdb20da11610108578063d6281d3e1161009d578063e8e617b71161006d578063e8e617b714610b42578063ee07abbb14610b61578063ef8b30f714610a1c578063f7a3933314610b80575f5ffd5b8063d6281d3e14610ab9578063d905777e14610ad8578063dd62ed3e14610af7578063e77659fd14610b16575f5ffd5b8063cc671a18116100d8578063cc671a1814610a3b578063ce96cb7714610a4f578063d336078c14610a6e578063d52f99ce14610a8d575f5ffd5b8063bfdb20da146109de578063c0c51217146109fd578063c63d75b614610698578063c6e6f59214610a1c575f5ffd5b8063a9059cbb1161017e578063b3d7f6b91161014e578063b3d7f6b914610962578063b460af9414610981578063ba087652146109a0578063bdb5371d146109bf575f5ffd5b8063a9059cbb146108d9578063a9ed1487146108f8578063ac860f7414610913578063ad3cb1cc14610932575f5ffd5b806394bf804d116101b957806394bf804d1461087357806395d89b4114610892578063a3ac9390146108a6578063a7f8a5e2146108c5575f5ffd5b80637da0a8771461080357806382dbbd711461083557806386b4408314610854575f5ffd5b8063313ce567116102bf5780634f1ef2861161025f57806362eb345e1161022f57806362eb345e1461077c5780636e553f651461079b57806370a08231146107ba578063759076e5146107d9575f5ffd5b80634f1ef286146106ea57806352d1902d146106fd578063572b6c05146107115780635ee0c7dd1461075d575f5ffd5b80633edeb2571161029a5780633edeb2571461066c578063402d267d146106985780634cdad5061461042e5780634d15eb03146106b8575f5ffd5b8063313ce567146105fb57806333bded3c1461062157806338d52e0f14610640575f5ffd5b8063091ea8a61161033557806318160ddd1161030557806318160ddd1461056b578063194448e51461059e578063225c531e146105bd57806323b872dd146105dc575f5ffd5b8063091ea8a61461048b578063095ea7b3146104f55780630a28a47714610514578063150b7a0214610533575f5ffd5b8063077f224a11610370578063077f224a1461040d57806307a2d13a1461042e57806307c2e8781461044d57806308742d901461046c575f5ffd5b806301e1d1141461039657806301ffc9a7146103bd57806306fdde03146103ec575b5f5ffd5b3480156103a1575f5ffd5b506103aa610b9f565b6040519081526020015b60405180910390f35b3480156103c8575f5ffd5b506103dc6103d73660046144b3565b610ce1565b60405190151581526020016103b4565b3480156103f7575f5ffd5b50610400610d83565b6040516103b491906144fa565b348015610418575f5ffd5b5061042c6104273660046145f0565b610e43565b005b348015610439575f5ffd5b506103aa610448366004614666565b610f3e565b348015610458575f5ffd5b5061042c6104673660046146c4565b610f49565b348015610477575f5ffd5b5061042c610486366004614738565b611070565b348015610496575f5ffd5b506104e86104a536600461476f565b6001600160a01b03165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040902054600160201b900460ff1690565b6040516103b491906147be565b348015610500575f5ffd5b506103dc61050f3660046147cc565b61110c565b34801561051f575f5ffd5b506103aa61052e366004614666565b61112d565b34801561053e575f5ffd5b5061055261054d366004614833565b611139565b6040516001600160e01b031990911681526020016103b4565b348015610576575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546103aa565b3480156105a9575f5ffd5b5061042c6105b83660046148ad565b6111a3565b3480156105c8575f5ffd5b5061042c6105d73660046148d9565b6112c6565b3480156105e7575f5ffd5b506103dc6105f636600461493d565b6113ea565b348015610606575f5ffd5b5061060f611419565b60405160ff90911681526020016103b4565b34801561062c575f5ffd5b5061040061063b36600461497b565b611455565b34801561064b575f5ffd5b50610654611612565b6040516001600160a01b0390911681526020016103b4565b348015610677575f5ffd5b5061068363ffffffff81565b60405163ffffffff90911681526020016103b4565b3480156106a3575f5ffd5b506103aa6106b236600461476f565b505f1990565b3480156106c3575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610654565b61042c6106f83660046149cb565b611640565b348015610708575f5ffd5b506103aa611656565b34801561071c575f5ffd5b506103dc61072b36600461476f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b348015610768575f5ffd5b50610552610777366004614a2a565b611671565b348015610787575f5ffd5b50610552610796366004614a6d565b6116dc565b3480156107a6575f5ffd5b506103aa6107b5366004614ac2565b611812565b3480156107c5575f5ffd5b506103aa6107d436600461476f565b611834565b3480156107e4575f5ffd5b505f5160206156085f395f51905f5254600160a01b9004600b0b6103aa565b34801561080e575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610654565b348015610840575f5ffd5b5061042c61084f366004614ae5565b61185a565b34801561085f575f5ffd5b5061040061086e36600461497b565b611944565b34801561087e575f5ffd5b506103aa61088d366004614ac2565b611a70565b34801561089d575f5ffd5b50610400611a92565b3480156108b1575f5ffd5b506103aa6108c0366004614b33565b611ad0565b3480156108d0575f5ffd5b50610654611b24565b3480156108e4575f5ffd5b506103dc6108f33660046147cc565b611b43565b348015610903575f5ffd5b506105526001600160e01b031981565b34801561091e575f5ffd5b5061042c61092d366004614666565b611b5a565b34801561093d575f5ffd5b50610400604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561096d575f5ffd5b506103aa61097c366004614666565b611c1f565b34801561098c575f5ffd5b506103aa61099b366004614b70565b611c2b565b3480156109ab575f5ffd5b506103aa6109ba366004614b70565b611c88565b3480156109ca575f5ffd5b5061042c6109d9366004614ba4565b611cdc565b3480156109e9575f5ffd5b5061042c6109f8366004614bd6565b611dc6565b348015610a08575f5ffd5b50610552610a17366004614c04565b611fb2565b348015610a27575f5ffd5b506103aa610a36366004614666565b611ffc565b348015610a46575f5ffd5b506103aa612007565b348015610a5a575f5ffd5b506103aa610a6936600461476f565b612093565b348015610a79575f5ffd5b5061042c610a88366004614666565b6120ad565b348015610a98575f5ffd5b50610aac610aa7366004614c37565b61215d565b6040516103b49190614c7b565b348015610ac4575f5ffd5b50610552610ad3366004614a2a565b6122ea565b348015610ae3575f5ffd5b506103aa610af236600461476f565b6123fa565b348015610b02575f5ffd5b506103aa610b11366004614d1a565b612412565b348015610b21575f5ffd5b50610b35610b30366004614d46565b61245b565b6040516103b49190614d89565b348015610b4d575f5ffd5b50610552610b5c36600461493d565b612721565b348015610b6c575f5ffd5b50610b35610b7b366004614d46565b612789565b348015610b8b575f5ffd5b5061042c610b9a366004614dec565b612983565b5f5f5160206156085f395f51905f52610bb6612a42565b81546040516370a0823160e01b81523060048201529193506001600160a01b0316906307a2d13a9082906370a0823190602401602060405180830381865afa158015610c04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c289190614e1b565b6040518263ffffffff1660e01b8152600401610c4691815260200190565b602060405180830381865afa158015610c61573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c859190614e1b565b610c8f9083614e46565b81549092505f600160a01b909104600b0b1215610ccb578054610cbb90600160a01b9004600b0b614e59565b610cc59083614e73565b91505090565b8054610cc590600160a01b9004600b0b83614e46565b5f6001600160e01b03198216630a85bd0160e11b1480610d1157506001600160e01b03198216630162fc8560e11b145b80610d2c57506001600160e01b031982166336372b0760e01b145b80610d4757506001600160e01b0319821663a219a02560e01b145b80610d6257506001600160e01b0319821663043eff2d60e51b145b80610d7d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206155c85f395f51905f5291610dc190614e86565b80601f0160208091040260200160405190810160405280929190818152602001828054610ded90614e86565b8015610e385780601f10610e0f57610100808354040283529160200191610e38565b820191905f5260205f20905b815481529060010190602001808311610e1b57829003601f168201915b505050505091505090565b5f610e4c612ab8565b805490915060ff600160401b82041615906001600160401b03165f81158015610e725750825b90505f826001600160401b03166001148015610e8d5750303b155b905081158015610e9b575080155b15610eb95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ee357845460ff60401b1916600160401b1785555b610eee888888612ae0565b8315610f3457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610d7d825f612b87565b835f610f5482612bde565b905060018154600160201b900460ff166003811115610f7557610f7561478a565b82548492600160201b90910460ff169114610fae57604051630e851c7960e31b8152600401610fa5929190614ebe565b60405180910390fd5b50505f610fba82612c76565b9050610fd5610fc7612cca565b886346d58ca960e11b612cd3565b6001600160a01b0384163014610fff57610fff610ff0612cca565b886001600160e01b0319612cd3565b6040516303e1e7c360e31b81526001600160a01b03881690631f0f3e189061102f90899089908990600401614f03565b5f604051808303815f87803b158015611046575f5ffd5b505af1158015611058573d5f5f3e3d5ffd5b50505050611067838383612dd5565b50505050505050565b8063ffffffff165f036110965760405163294da6c760e21b815260040160405180910390fd5b5f6110a083612bde565b80546040805163ffffffff928316815291851660208301529192506001600160a01b038516917f4345ec61f717774fdb684b701c34934889550330da2b93f2c3a33379db77f817910160405180910390a2805463ffffffff191663ffffffff9290921691909117905550565b5f5f611116612cca565b9050611123818585612e5e565b5060019392505050565b5f610d7d826001612e6b565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146111905760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b50630a85bd0160e11b9695505050505050565b5f5f5160206156085f395f51905f5280546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906307a2d13a9082906370a0823190602401602060405180830381865afa158015611204573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112289190614e1b565b6040518263ffffffff1660e01b815260040161124691815260200190565b602060405180830381865afa158015611261573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112859190614e1b565b90508061129182612eb9565b148061129a5750825b6112b75760405163292d4c4b60e11b815260040160405180910390fd5b6112c084612fb2565b50505050565b6112cf85612bde565b505f6112e58686866112e087613147565b613177565b905082815f81131561131357604051630c97a6bf60e41b815260048101929092526024820152604401610fa5565b50505f61131e612a42565b905083811015611362576113328185614e73565b61134461133f8387614e73565b612eb9565b146113625760405163af8075e960e01b815260040160405180910390fd5b61137f838561136f611612565b6001600160a01b03169190613276565b6040805163ffffffff808916825287166020820152908101859052606081018390526001600160a01b0384811660808301528816907fcc010dd322eb2bc19138cf20160ad5643925810f442fc6c5d48b9b4c59b34efe9060a00160405180910390a250505050505050565b5f5f6113f4612cca565b90506114018582856132ab565b61140c8585856132f6565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f8154610cc59190600160a01b900460ff16614fae565b6060835f61146282612bde565b905060018154600160201b900460ff1660038111156114835761148361478a565b82548492600160201b90910460ff1691146114b357604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f6114bf82612c76565b90506114e86114cc612cca565b886114da60045f8a8c614fc7565b6114e391614fee565b612cd3565b61153186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b1692915050613353565b93505f848060200190518101906115489190614e1b565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156115b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d49190615024565b6001600160a01b0316146115fc576115fc6115ed612cca565b896001600160e01b0319612cd3565b50611608838383612dd5565b5050509392505050565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b611648613360565b61165282826133f0565b5050565b5f61165f6134ac565b505f5160206155e85f395f51905f5290565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146116c85760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b50635ee0c7dd60e01b90505b949350505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146117335760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b505f61173e88612bde565b905060018154600160201b900460ff16600381111561175f5761175f61478a565b1480611787575060028154600160201b900460ff1660038111156117855761178561478a565b145b81548991600160201b90910460ff16906117b657604051630e851c7960e31b8152600401610fa5929190614ebe565b505f9050836117c58688614e46565b6117cf9190614e46565b82549091506117fc908a9063ffffffff166117ea81426134f5565b6117f385613147565b6112e090614e59565b506331759a2f60e11b9998505050505050505050565b5f5f195f61181f85611ffc565b90506116d461182c612cca565b858784613521565b6001600160a01b03165f9081525f5160206155c85f395f51905f52602052604090205490565b61186384612bde565b505f6118748585856117f386613147565b905081815f8112156118a25760405163239de57160e11b815260048101929092526024820152604401610fa5565b50506118ca6118af612cca565b30846118b9611612565b6001600160a01b031692919061359a565b846001600160a01b03167ffe14813540c7709c2d7e702f39b104eeed265dd484f899e9f2f89c801aa6395c85858585611901612cca565b6040805163ffffffff96871681529590941660208601529284019190915260608301526001600160a01b0316608082015260a00160405180910390a25050505050565b6060835f61195182612bde565b905060018154600160201b900460ff1660038111156119725761197261478a565b148061199a575060028154600160201b900460ff1660038111156119985761199861478a565b145b81548391600160201b90910460ff16906119c957604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f6119d4612a42565b90506119e16114cc612cca565b611a2a86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b1692915050613353565b93505f611a35612a42565b905081811015611a6557611a498183614e73565b6040516351f5977560e11b8152600401610fa591815260200190565b505050509392505050565b5f5f195f611a7d85611c1f565b90506116d4611a8a612cca565b858388613521565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206155c85f395f51905f5291610dc190614e86565b5f5f5160206156085f395f51905f527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af0282611b0c8787876135d0565b81526020019081526020015f20549150509392505050565b5f5f5160206156085f395f51905f525b546001600160a01b0316919050565b5f5f611b4d612cca565b90506111238185856132f6565b5f198103611b7157611b6a612a42565b9050611b99565b611b79612a42565b811115611b995760405163af8075e960e01b815260040160405180910390fd5b5f5f5160206156085f395f51905f528054604051636e553f6560e01b8152600481018590523060248201529192506001600160a01b031690636e553f65906044016020604051808303815f875af1158015611bf6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1a9190614e1b565b505050565b5f610d7d826001612b87565b5f5f611c3683612093565b905080851115611c5f57828582604051633fa733bb60e21b8152600401610fa59392919061503f565b5f611c698661112d565b9050611c7f611c76612cca565b86868985613618565b95945050505050565b5f5f611c93836123fa565b905080851115611cbc57828582604051632e52afbb60e21b8152600401610fa59392919061503f565b5f611cc686610f3e565b9050611c7f611cd3612cca565b8686848a613618565b5f611ce684612bde565b8054604080516001600160601b03600160281b84048116825260208201889052600160881b90930490921690820152606081018490529091506001600160a01b038516907f7e293d291e9dd159f2fbde9523c4191674384553a72c0833ba9cf7dcb5381fb79060800160405180910390a2611d608361376b565b81546001600160601b0391909116600160281b0270ffffffffffffffffffffffff000000000019909116178155611d968261376b565b81546001600160601b0391909116600160881b026bffffffffffffffffffffffff60881b19909116179055505050565b6001600160a01b0384165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040812080545f5160206156085f395f51905f529290600160201b900460ff166003811115611e2957611e2961478a565b14611e475760405163cd43efa160e01b815260040160405180910390fd5b8463ffffffff165f03611e6d5760405163294da6c760e21b815260040160405180910390fd5b6040805160808101825263ffffffff8716815260016020820152908101611e938661376b565b6001600160601b03168152602001611eaa8561376b565b6001600160601b031690526001600160a01b0387165f90815260018401602090815260409091208251815463ffffffff90911663ffffffff19821681178355928401519192839164ffffffffff191617600160201b836003811115611f1157611f1161478a565b0217905550604082810151825460609094015165010000000000600160e81b0319909416600160281b6001600160601b03928316026bffffffffffffffffffffffff60881b191617600160881b9190941602929092179055516001600160a01b038716907f422c963a67d52178b43a807b8c9df3a99468f416b736f9f040b6392cf790752e90611fa2908490615060565b60405180910390a2505050505050565b6040516001600160601b0319606084901b1660208201526001600160e01b0319821660348201525f9061141290603801604051602081830303815290604052805160209091012090565b5f610d7d825f612e6b565b5f805f5160206156085f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561205d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120819190614e1b565b612089612a42565b610cc59190614e46565b5f610d7d6120a08361379e565b6120a8612007565b6137ab565b5f198103612132575f5f5160206156085f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561210a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212e9190614e1b565b9150505b8061213c82612eb9565b1461215a5760405163af8075e960e01b815260040160405180910390fd5b50565b6121c36040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f64ffffffffff1681526020015f64ffffffffff1681525090565b845f6121ce82612bde565b905060018154600160201b900460ff1660038111156121ef576121ef61478a565b82548492600160201b90910460ff16911461221f57604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f61222b82612c76565b9050612246612238612cca565b896346d58ca960e11b612cd3565b6001600160a01b0385163014612261576122616115ed612cca565b6040516346d58ca960e11b81526001600160a01b03891690638dab195290612291908a908a908a906004016150b0565b610180604051808303815f875af11580156122ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d291906150ef565b93506122df838383612dd5565b505050949350505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146123415760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b505f61234c86612bde565b905060018154600160201b900460ff16600381111561236d5761236d61478a565b1480612395575060028154600160201b900460ff1660038111156123935761239361478a565b145b81548791600160201b90910460ff16906123c457604051630e851c7960e31b8152600401610fa5929190614ebe565b505080546123e790879063ffffffff166123de81426134f5565b6117f387613147565b50636b140e9f60e11b9695505050505050565b5f610d7d612407836137ba565b6120a8610a36612007565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060835f61246882612bde565b905060018154600160201b900460ff1660038111156124895761248961478a565b82548492600160201b90910460ff1691146124b957604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f6124c582612c76565b90505f80866001600160401b038111156124e1576124e161450c565b60405190808252806020026020018201604052801561251457816020015b60608152602001906001900390816124ff5790505b5095505f5b87811015612713575f89898381811061253457612534615197565b905060200281019061254691906151ab565b612554916004915f91614fc7565b61255d91614fee565b905081158061257957506001600160e01b031981811690851614155b1561259457612590612589612cca565b8c83612cd3565b8093505b6125ff8a8a848181106125a9576125a9615197565b90506020028101906125bb91906151ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038f1692915050613353565b88838151811061261157612611615197565b60200260200101819052508261270a575f88838151811061263457612634615197565b602002602001015180602001905181019061264f9190614e1b565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156126b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126db9190615024565b6001600160a01b031614612708576127036126f4612cca565b8d6001600160e01b0319612cd3565b600193505b505b50600101612519565b505050611608838383612dd5565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146127785760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b5063e8e617b760e01b949350505050565b6060835f61279682612bde565b905060018154600160201b900460ff1660038111156127b7576127b761478a565b14806127df575060028154600160201b900460ff1660038111156127dd576127dd61478a565b145b81548391600160201b90910460ff169061280e57604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f612819612a42565b90505f856001600160401b038111156128345761283461450c565b60405190808252806020026020018201604052801561286757816020015b60608152602001906001900390816128525790505b5094505f5b86811015612978575f88888381811061288757612887615197565b905060200281019061289991906151ab565b6128a7916004915f91614fc7565b6128b091614fee565b90508115806128cc57506001600160e01b031981811690841614155b156128e7576128e36128dc612cca565b8b83612cd3565b8092505b6129528989848181106128fc576128fc615197565b905060200281019061290e91906151ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038e1692915050613353565b87838151811061296457612964615197565b60209081029190910101525060010161286c565b50505f611a35612a42565b5f8160038111156129965761299661478a565b036129b457604051635e64536560e11b815260040160405180910390fd5b5f6129be83612bde565b9050826001600160a01b03167f0638a5c17c348b99c05e7985ee5ee8bc0c41bc7a12265aec4a488d62350c1d24825f0160049054906101000a900460ff1684604051612a0b9291906151ed565b60405180910390a280548290829064ff000000001916600160201b836003811115612a3857612a3861478a565b0217905550505050565b5f612a4b611612565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612a8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ab39190614e1b565b905090565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610d7d565b612ae86137c4565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b699190615024565b9050612b74816137e9565b612b7e84846137fa565b6112c08261380c565b5f611412612b93610b9f565b612b9e906001614e46565b612ba95f600a6152eb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612bd59190614e46565b85919085613930565b6001600160a01b0381165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af0160205260408120805490915f5160206156085f395f51905f5291600160201b900460ff166003811115612c4257612c4261478a565b14158390612c6f57604051632dad902160e01b81526001600160a01b039091166004820152602401610fa5565b5050919050565b5f612c7f612a42565b8254909150600160881b90046001600160601b0316811015612cc5578154612cbc9061133f908390600160881b90046001600160601b0316614e73565b50610d7d612a42565b919050565b5f612ab3613972565b5f612cde8383611fb2565b90505f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d419190615024565b6001600160a01b031663b70096138630856040518463ffffffff1660e01b8152600401612d70939291906152f9565b6040805180830381865afa158015612d8a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dae9190615326565b50905084848383610f345760405163c294136d60e01b8152600401610fa5939291906152f9565b5f612dde612a42565b9050818110156112c05782545f90612e1490869063ffffffff16612e0281426134f5565b6112e0612e0f8789614e73565b613147565b84549091508190600160281b90046001600160601b0316808213156110675760405163395192c560e21b815260048101929092526001600160601b03166024820152604401610fa5565b611c1a83838360016139dc565b5f611412612e7a82600a6152eb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612ea69190614e46565b612eae610b9f565b612bd5906001614e46565b5f805f5160206156085f395f51905f52805460405163ce96cb7760e01b8152306004820152919250612f399185916001600160a01b03169063ce96cb7790602401602060405180830381865afa158015612f15573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a89190614e1b565b8154604051632d182be560e21b815260048101839052306024820181905260448201529193506001600160a01b03169063b460af94906064016020604051808303815f875af1158015612f8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6f9190614e1b565b6001600160a01b038116612fd9576040516347ddf9c760e01b815260040160405180910390fd5b5f5160206156085f395f51905f5280546001600160a01b038381166001600160a01b0319831617835516801561308457613011611612565b60405163095ea7b360e01b81526001600160a01b0383811660048301525f6024830152919091169063095ea7b3906044016020604051808303815f875af115801561305e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130829190615353565b505b61308c611612565b60405163095ea7b360e01b81526001600160a01b0385811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af11580156130da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130fe9190615353565b50604080516001600160a01b038084168252851660208201527f9baaddad37a65ca0df0360563fca87a13c1ce354be76d7ec35eac48bd766332a910160405180910390a1505050565b5f6001600160ff1b038211156131735760405163123baf0360e11b815260048101839052602401610fa5565b5090565b5f5f5160206156085f395f51905f52816131928787876135d0565b905083826002015f8381526020019081526020015f205f8282546131b6919061536e565b9182905550835490945085915083906014906131dd908490600160a01b9004600b0b615395565b82546001600160601b039182166101009390930a92830291909202199091161790555081546040805163ffffffff808a1682528816602082015290810186905260608101859052600160a01b909104600b0b60808201526001600160a01b038816907fbc0ff1d27e119160a9a107d0725b9ed31b90773cf47e89332a35a8c1a319eaee9060a00160405180910390a25050949350505050565b6132838383836001613ac0565b611c1a57604051635274afe760e01b81526001600160a01b0384166004820152602401610fa5565b5f6132b68484612412565b90505f198110156112c057818110156132e857828183604051637dc7a0d960e11b8152600401610fa59392919061503f565b6112c084848484035f6139dc565b6001600160a01b03831661331f57604051634b637e8f60e11b81525f6004820152602401610fa5565b6001600160a01b0382166133485760405163ec442f0560e01b81525f6004820152602401610fa5565b611c1a838383613b22565b606061141283835f613c3a565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806133d057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166133c4613d06565b6001600160a01b031614155b156133ee5760405163703e46dd60e11b815260040160405180910390fd5b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561344a575060408051601f3d908101601f1916820190925261344791810190614e1b565b60015b61347257604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610fa5565b5f5160206155e85f395f51905f5281146134a257604051632a87526960e21b815260048101829052602401610fa5565b611c1a8383613d1a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146133ee5760405163703e46dd60e11b815260040160405180910390fd5b5f63ffffffff838116146135185761351363ffffffff8416836153e0565b611412565b61141282613d6f565b61353461352c611612565b85308561359a565b61353e8382613e4c565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7848460405161358c929190918252602082015260400190565b60405180910390a350505050565b6135a8848484846001613e80565b6112c057604051635274afe760e01b81526001600160a01b0385166004820152602401610fa5565b6bffffffffffffffff000000006001600160e01b031960e09390931b9290921660c09190911b63ffffffff60c01b161760a01c1660609190911b6001600160601b0319161790565b5f613621612a42565b905082811015613756575f5f5160206156085f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa158015613680573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a49190614e1b565b6136ae8386614e73565b11156136cd5760405163af8075e960e01b815260040160405180910390fd5b80546001600160a01b031663b460af946136e78487614e73565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af115801561372f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137539190614e1b565b50505b6137638686868686613eed565b505050505050565b5f6001600160601b03821115613173576040516306dfcc6560e41b81526060600482015260248101839052604401610fa5565b5f610d7d610448836123fa565b5f828218828410028218611412565b5f610d7d82611834565b6137cc613f94565b6133ee57604051631afcd79f60e31b815260040160405180910390fd5b6137f16137c4565b61215a81613fad565b6138026137c4565b6116528282614030565b6138146137c4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613870573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138949190615024565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af1158015613902573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139269190615353565b5061215a81612fb2565b5f61395d61393d83614080565b801561395857505f8480613953576139536153cc565b868809115b151590565b6139688686866140ac565b611c7f9190614e46565b5f3660148082108015906139ae57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156139d4576139c136828403815f614fc7565b6139ca916153f3565b60601c9250505090565b339250505090565b5f5160206155c85f395f51905f526001600160a01b038516613a135760405163e602df0560e01b81525f6004820152602401610fa5565b6001600160a01b038416613a3c57604051634a1406b160e11b81525f6004820152602401610fa5565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115613ab957836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051613ab091815260200190565b60405180910390a35b5050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316613b16578383151615613b0a573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5160206155c85f395f51905f526001600160a01b038416613b5c5781816002015f828254613b519190614e46565b90915550613bb99050565b6001600160a01b0384165f9081526020829052604090205482811015613b9b5784818460405163391434e360e21b8152600401610fa59392919061503f565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316613bd7576002810180548390039055613bf5565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161358c91815260200190565b606081471015613c665760405163cf47918160e01b815247600482015260248101839052604401610fa5565b5f613c7285848661415c565b9050808015613c9357505f3d1180613c9357505f856001600160a01b03163b115b15613ca857613ca0614171565b915050611412565b8015613cd257604051639996b31560e01b81526001600160a01b0386166004820152602401610fa5565b3d15613ce557613ce061418a565b613cfe565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b5f5f5160206155e85f395f51905f52611b34565b613d2382614195565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613d6757611c1a82826141f8565b61165261427a565b6107e95f8062015180613d86636774858086614e73565b613d9091906153e0565b90505b81613da05761016d613da4565b61016e5b61ffff168110613e275781613dbb5761016d613dbf565b61016e5b613dcd9061ffff1682614e73565b9050613dd883615429565b9250613de560048461544d565b63ffffffff16158015613e205750613dfe60648461544d565b63ffffffff16151580613e205750613e186101908461544d565b63ffffffff16155b9150613d93565b613e318183614299565b613e3c846064615474565b63ffffffff166116d49190614e46565b6001600160a01b038216613e755760405163ec442f0560e01b81525f6004820152602401610fa5565b6116525f8383613b22565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316613edc578383151615613ed0573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b826001600160a01b0316856001600160a01b031614613f1157613f118386836132ab565b613f1b838261437c565b613f2d613f26611612565b8584613276565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051613f85929190918252602082015260400190565b60405180910390a45050505050565b5f613f9d612ab8565b54600160401b900460ff16919050565b613fb56137c4565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80613fe1846143b0565b9150915081613ff1576012613ff3565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b6140386137c4565b5f5160206155c85f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361407184826154d7565b50600481016112c083826154d7565b5f60028260038111156140955761409561478a565b61409f9190615591565b60ff166001149050919050565b5f5f5f6140b9868661443b565b91509150815f036140dd578381816140d3576140d36153cc565b0492505050611412565b8184116140f4576140f46003851502601118614457565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b806001600160a01b03163b5f036141ca57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610fa5565b5f5160206155e85f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f6142058484614468565b905080801561422657505f3d118061422657505f846001600160a01b03163b115b1561423b57614233614171565b915050610d7d565b801561426557604051639996b31560e01b81526001600160a01b0385166004820152602401610fa5565b3d15613ce55761427361418a565b5092915050565b34156133ee5760405163b398979f60e01b815260040160405180910390fd5b5f601f8310156142ab57506001610d7d565b81156142d457603c8310156142c257506002610d7d565b826142cc816155b2565b9350506142e5565b603b8310156142e557506002610d7d565b605a831061436f576078831061436857609783106143615760b5831061435a5760d483106143535760f3831061434c57610111831061434557610130831061433e5761014e831061433757600c614372565b600b614372565b600a614372565b6009614372565b6008614372565b6007614372565b6006614372565b6005614372565b6004614372565b60035b60ff169392505050565b6001600160a01b0382166143a557604051634b637e8f60e11b81525f6004820152602401610fa5565b611652825f83613b22565b5f5f5f6143bc60405190565b6040805160048152602481019091526020810180516001600160e01b031663313ce56760e01b1790529091505f9081906143f790879061447b565b509150915061440583604052565b818015614413575060203d10155b8015614420575060ff8111155b61442b575f5f61442f565b6001815b94509450505050915091565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f5f835160208501865af49392505050565b5f5f5f60405f855160208701885afa92505f51915060205190509250925092565b80356001600160e01b031981168114612cc5575f5ffd5b5f602082840312156144c3575f5ffd5b6114128261449c565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61141260208301846144cc565b634e487b7160e01b5f52604160045260245ffd5b60405161018081016001600160401b03811182821017156145435761454361450c565b60405290565b5f5f6001600160401b038411156145625761456261450c565b50604051601f19601f85018116603f011681018181106001600160401b03821117156145905761459061450c565b6040528381529050808284018510156145a7575f5ffd5b838360208301375f60208583010152509392505050565b5f82601f8301126145cd575f5ffd5b61141283833560208501614549565b6001600160a01b038116811461215a575f5ffd5b5f5f5f60608486031215614602575f5ffd5b83356001600160401b03811115614617575f5ffd5b614623868287016145be565b93505060208401356001600160401b0381111561463e575f5ffd5b61464a868287016145be565b925050604084013561465b816145dc565b809150509250925092565b5f60208284031215614676575f5ffd5b5035919050565b5f5f83601f84011261468d575f5ffd5b5081356001600160401b038111156146a3575f5ffd5b6020830191508360208260051b85010111156146bd575f5ffd5b9250929050565b5f5f5f5f606085870312156146d7575f5ffd5b84356146e2816145dc565b935060208501356001600160401b038111156146fc575f5ffd5b6147088782880161467d565b909450925050604085013561471c816145dc565b939692955090935050565b63ffffffff8116811461215a575f5ffd5b5f5f60408385031215614749575f5ffd5b8235614754816145dc565b9150602083013561476481614727565b809150509250929050565b5f6020828403121561477f575f5ffd5b8135611412816145dc565b634e487b7160e01b5f52602160045260245ffd5b600481106147ba57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610d7d828461479e565b5f5f604083850312156147dd575f5ffd5b82356147e8816145dc565b946020939093013593505050565b5f5f83601f840112614806575f5ffd5b5081356001600160401b0381111561481c575f5ffd5b6020830191508360208285010111156146bd575f5ffd5b5f5f5f5f5f60808688031215614847575f5ffd5b8535614852816145dc565b94506020860135614862816145dc565b93506040860135925060608601356001600160401b03811115614883575f5ffd5b61488f888289016147f6565b969995985093965092949392505050565b801515811461215a575f5ffd5b5f5f604083850312156148be575f5ffd5b82356148c9816145dc565b91506020830135614764816148a0565b5f5f5f5f5f60a086880312156148ed575f5ffd5b85356148f8816145dc565b9450602086013561490881614727565b9350604086013561491881614727565b925060608601359150608086013561492f816145dc565b809150509295509295909350565b5f5f5f6060848603121561494f575f5ffd5b833561495a816145dc565b9250602084013561496a816145dc565b929592945050506040919091013590565b5f5f5f6040848603121561498d575f5ffd5b8335614998816145dc565b925060208401356001600160401b038111156149b2575f5ffd5b6149be868287016147f6565b9497909650939450505050565b5f5f604083850312156149dc575f5ffd5b82356149e7816145dc565b915060208301356001600160401b03811115614a01575f5ffd5b8301601f81018513614a11575f5ffd5b614a2085823560208401614549565b9150509250929050565b5f5f5f5f60808587031215614a3d575f5ffd5b8435614a48816145dc565b93506020850135614a58816145dc565b93969395505050506040820135916060013590565b5f5f5f5f5f5f60c08789031215614a82575f5ffd5b8635614a8d816145dc565b95506020870135614a9d816145dc565b95989597505050506040840135936060810135936080820135935060a0909101359150565b5f5f60408385031215614ad3575f5ffd5b823591506020830135614764816145dc565b5f5f5f5f60808587031215614af8575f5ffd5b8435614b03816145dc565b93506020850135614b1381614727565b92506040850135614b2381614727565b9396929550929360600135925050565b5f5f5f60608486031215614b45575f5ffd5b8335614b50816145dc565b92506020840135614b6081614727565b9150604084013561465b81614727565b5f5f5f60608486031215614b82575f5ffd5b833592506020840135614b94816145dc565b9150604084013561465b816145dc565b5f5f5f60608486031215614bb6575f5ffd5b8335614bc1816145dc565b95602085013595506040909401359392505050565b5f5f5f5f60808587031215614be9575f5ffd5b8435614bf4816145dc565b93506020850135614a5881614727565b5f5f60408385031215614c15575f5ffd5b8235614c20816145dc565b9150614c2e6020840161449c565b90509250929050565b5f5f5f5f60608587031215614c4a575f5ffd5b8435614c55816145dc565b935060208501356001600160401b03811115614c6f575f5ffd5b614708878288016147f6565b5f61018082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100830151610100830152610120830151610120830152610140830151614cff61014084018264ffffffffff169052565b5061016083015161427361016084018264ffffffffff169052565b5f5f60408385031215614d2b575f5ffd5b8235614d36816145dc565b91506020830135614764816145dc565b5f5f5f60408486031215614d58575f5ffd5b8335614d63816145dc565b925060208401356001600160401b03811115614d7d575f5ffd5b6149be8682870161467d565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614de057603f19878603018452614dcb8583516144cc565b94506020938401939190910190600101614daf565b50929695505050505050565b5f5f60408385031215614dfd575f5ffd5b8235614e08816145dc565b9150602083013560048110614764575f5ffd5b5f60208284031215614e2b575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d7d57610d7d614e32565b5f600160ff1b8201614e6d57614e6d614e32565b505f0390565b81810381811115610d7d57610d7d614e32565b600181811c90821680614e9a57607f821691505b602082108103614eb857634e487b7160e01b5f52602260045260245ffd5b50919050565b6001600160a01b038316815260408101611412602083018461479e565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604080825281018390525f6060600585901b830181019083018683601e1936839003015b88821015614f9457868503605f190184528235818112614f45575f5ffd5b8a016020810190356001600160401b03811115614f60575f5ffd5b803603821315614f6e575f5ffd5b614f79878284614edb565b96505050602083019250602084019350600182019150614f27565b5050506001600160a01b03851660208501525090506116d4565b60ff8181168382160190811115610d7d57610d7d614e32565b5f5f85851115614fd5575f5ffd5b83861115614fe1575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015614273576001600160e01b031960049490940360031b84901b1690921692915050565b5f60208284031215615034575f5ffd5b8151611412816145dc565b6001600160a01b039390931683526020830191909152604082015260600190565b5f608082019050825463ffffffff811683526150856020840160ff8360201c1661479e565b6001600160601b038160281c1660408401526001600160601b038160881c1660608401525092915050565b604081525f6150c3604083018587614edb565b905060018060a01b0383166020830152949350505050565b805164ffffffffff81168114612cc5575f5ffd5b5f610180828403128015615101575f5ffd5b5061510a614520565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e080840151908201526101008084015190820152610120808401519082015261517761014084016150db565b61014082015261518a61016084016150db565b6101608201529392505050565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e198436030181126151c0575f5ffd5b8301803591506001600160401b038211156151d9575f5ffd5b6020019150368190038213156146bd575f5ffd5b604081016151fb828561479e565b611412602083018461479e565b6001815b60018411156152435780850481111561522757615227614e32565b600184161561523557908102905b60019390931c92800261520c565b935093915050565b5f8261525957506001610d7d565b8161526557505f610d7d565b816001811461527b5760028114615285576152a1565b6001915050610d7d565b60ff84111561529657615296614e32565b50506001821b610d7d565b5060208310610133831016604e8410600b84101617156152c4575081810a610d7d565b6152d05f198484615208565b805f19048211156152e3576152e3614e32565b029392505050565b5f61141260ff84168361524b565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f5f60408385031215615337575f5ffd5b8251615342816148a0565b602084015190925061476481614727565b5f60208284031215615363575f5ffd5b8151611412816148a0565b8082018281125f83128015821682158216171561538d5761538d614e32565b505092915050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff1982121715610d7d57610d7d614e32565b634e487b7160e01b5f52601260045260245ffd5b5f826153ee576153ee6153cc565b500490565b80356001600160601b03198116906014841015614273576001600160601b031960149490940360031b84901b1690921692915050565b5f63ffffffff821663ffffffff810361544457615444614e32565b60010192915050565b5f63ffffffff831680615462576154626153cc565b8063ffffffff84160691505092915050565b63ffffffff818116838216029081169081811461427357614273614e32565b601f821115611c1a57805f5260205f20601f840160051c810160208510156154b85750805b601f840160051c820191505b81811015613ab9575f81556001016154c4565b81516001600160401b038111156154f0576154f061450c565b615504816154fe8454614e86565b84615493565b6020601f821160018114615536575f831561551f5750848201515b5f19600385901b1c1916600184901b178455613ab9565b5f84815260208120601f198516915b828110156155655787850151825560209485019460019092019101615545565b508482101561558257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff8316806155a3576155a36153cc565b8060ff84160691505092915050565b5f816155c0576155c0614e32565b505f19019056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af00a26469706673582212203faa8777e79c7e94e6f208b881608764231d9f4d05936629119d589c2645769264736f6c634300081e0033",
  "deployedBytecode": "0x608060405260043610610392575f3560e01c80637da0a877116101de578063bfdb20da11610108578063d6281d3e1161009d578063e8e617b71161006d578063e8e617b714610b42578063ee07abbb14610b61578063ef8b30f714610a1c578063f7a3933314610b80575f5ffd5b8063d6281d3e14610ab9578063d905777e14610ad8578063dd62ed3e14610af7578063e77659fd14610b16575f5ffd5b8063cc671a18116100d8578063cc671a1814610a3b578063ce96cb7714610a4f578063d336078c14610a6e578063d52f99ce14610a8d575f5ffd5b8063bfdb20da146109de578063c0c51217146109fd578063c63d75b614610698578063c6e6f59214610a1c575f5ffd5b8063a9059cbb1161017e578063b3d7f6b91161014e578063b3d7f6b914610962578063b460af9414610981578063ba087652146109a0578063bdb5371d146109bf575f5ffd5b8063a9059cbb146108d9578063a9ed1487146108f8578063ac860f7414610913578063ad3cb1cc14610932575f5ffd5b806394bf804d116101b957806394bf804d1461087357806395d89b4114610892578063a3ac9390146108a6578063a7f8a5e2146108c5575f5ffd5b80637da0a8771461080357806382dbbd711461083557806386b4408314610854575f5ffd5b8063313ce567116102bf5780634f1ef2861161025f57806362eb345e1161022f57806362eb345e1461077c5780636e553f651461079b57806370a08231146107ba578063759076e5146107d9575f5ffd5b80634f1ef286146106ea57806352d1902d146106fd578063572b6c05146107115780635ee0c7dd1461075d575f5ffd5b80633edeb2571161029a5780633edeb2571461066c578063402d267d146106985780634cdad5061461042e5780634d15eb03146106b8575f5ffd5b8063313ce567146105fb57806333bded3c1461062157806338d52e0f14610640575f5ffd5b8063091ea8a61161033557806318160ddd1161030557806318160ddd1461056b578063194448e51461059e578063225c531e146105bd57806323b872dd146105dc575f5ffd5b8063091ea8a61461048b578063095ea7b3146104f55780630a28a47714610514578063150b7a0214610533575f5ffd5b8063077f224a11610370578063077f224a1461040d57806307a2d13a1461042e57806307c2e8781461044d57806308742d901461046c575f5ffd5b806301e1d1141461039657806301ffc9a7146103bd57806306fdde03146103ec575b5f5ffd5b3480156103a1575f5ffd5b506103aa610b9f565b6040519081526020015b60405180910390f35b3480156103c8575f5ffd5b506103dc6103d73660046144b3565b610ce1565b60405190151581526020016103b4565b3480156103f7575f5ffd5b50610400610d83565b6040516103b491906144fa565b348015610418575f5ffd5b5061042c6104273660046145f0565b610e43565b005b348015610439575f5ffd5b506103aa610448366004614666565b610f3e565b348015610458575f5ffd5b5061042c6104673660046146c4565b610f49565b348015610477575f5ffd5b5061042c610486366004614738565b611070565b348015610496575f5ffd5b506104e86104a536600461476f565b6001600160a01b03165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040902054600160201b900460ff1690565b6040516103b491906147be565b348015610500575f5ffd5b506103dc61050f3660046147cc565b61110c565b34801561051f575f5ffd5b506103aa61052e366004614666565b61112d565b34801561053e575f5ffd5b5061055261054d366004614833565b611139565b6040516001600160e01b031990911681526020016103b4565b348015610576575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546103aa565b3480156105a9575f5ffd5b5061042c6105b83660046148ad565b6111a3565b3480156105c8575f5ffd5b5061042c6105d73660046148d9565b6112c6565b3480156105e7575f5ffd5b506103dc6105f636600461493d565b6113ea565b348015610606575f5ffd5b5061060f611419565b60405160ff90911681526020016103b4565b34801561062c575f5ffd5b5061040061063b36600461497b565b611455565b34801561064b575f5ffd5b50610654611612565b6040516001600160a01b0390911681526020016103b4565b348015610677575f5ffd5b5061068363ffffffff81565b60405163ffffffff90911681526020016103b4565b3480156106a3575f5ffd5b506103aa6106b236600461476f565b505f1990565b3480156106c3575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610654565b61042c6106f83660046149cb565b611640565b348015610708575f5ffd5b506103aa611656565b34801561071c575f5ffd5b506103dc61072b36600461476f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b348015610768575f5ffd5b50610552610777366004614a2a565b611671565b348015610787575f5ffd5b50610552610796366004614a6d565b6116dc565b3480156107a6575f5ffd5b506103aa6107b5366004614ac2565b611812565b3480156107c5575f5ffd5b506103aa6107d436600461476f565b611834565b3480156107e4575f5ffd5b505f5160206156085f395f51905f5254600160a01b9004600b0b6103aa565b34801561080e575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610654565b348015610840575f5ffd5b5061042c61084f366004614ae5565b61185a565b34801561085f575f5ffd5b5061040061086e36600461497b565b611944565b34801561087e575f5ffd5b506103aa61088d366004614ac2565b611a70565b34801561089d575f5ffd5b50610400611a92565b3480156108b1575f5ffd5b506103aa6108c0366004614b33565b611ad0565b3480156108d0575f5ffd5b50610654611b24565b3480156108e4575f5ffd5b506103dc6108f33660046147cc565b611b43565b348015610903575f5ffd5b506105526001600160e01b031981565b34801561091e575f5ffd5b5061042c61092d366004614666565b611b5a565b34801561093d575f5ffd5b50610400604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561096d575f5ffd5b506103aa61097c366004614666565b611c1f565b34801561098c575f5ffd5b506103aa61099b366004614b70565b611c2b565b3480156109ab575f5ffd5b506103aa6109ba366004614b70565b611c88565b3480156109ca575f5ffd5b5061042c6109d9366004614ba4565b611cdc565b3480156109e9575f5ffd5b5061042c6109f8366004614bd6565b611dc6565b348015610a08575f5ffd5b50610552610a17366004614c04565b611fb2565b348015610a27575f5ffd5b506103aa610a36366004614666565b611ffc565b348015610a46575f5ffd5b506103aa612007565b348015610a5a575f5ffd5b506103aa610a6936600461476f565b612093565b348015610a79575f5ffd5b5061042c610a88366004614666565b6120ad565b348015610a98575f5ffd5b50610aac610aa7366004614c37565b61215d565b6040516103b49190614c7b565b348015610ac4575f5ffd5b50610552610ad3366004614a2a565b6122ea565b348015610ae3575f5ffd5b506103aa610af236600461476f565b6123fa565b348015610b02575f5ffd5b506103aa610b11366004614d1a565b612412565b348015610b21575f5ffd5b50610b35610b30366004614d46565b61245b565b6040516103b49190614d89565b348015610b4d575f5ffd5b50610552610b5c36600461493d565b612721565b348015610b6c575f5ffd5b50610b35610b7b366004614d46565b612789565b348015610b8b575f5ffd5b5061042c610b9a366004614dec565b612983565b5f5f5160206156085f395f51905f52610bb6612a42565b81546040516370a0823160e01b81523060048201529193506001600160a01b0316906307a2d13a9082906370a0823190602401602060405180830381865afa158015610c04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c289190614e1b565b6040518263ffffffff1660e01b8152600401610c4691815260200190565b602060405180830381865afa158015610c61573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c859190614e1b565b610c8f9083614e46565b81549092505f600160a01b909104600b0b1215610ccb578054610cbb90600160a01b9004600b0b614e59565b610cc59083614e73565b91505090565b8054610cc590600160a01b9004600b0b83614e46565b5f6001600160e01b03198216630a85bd0160e11b1480610d1157506001600160e01b03198216630162fc8560e11b145b80610d2c57506001600160e01b031982166336372b0760e01b145b80610d4757506001600160e01b0319821663a219a02560e01b145b80610d6257506001600160e01b0319821663043eff2d60e51b145b80610d7d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f5160206155c85f395f51905f5291610dc190614e86565b80601f0160208091040260200160405190810160405280929190818152602001828054610ded90614e86565b8015610e385780601f10610e0f57610100808354040283529160200191610e38565b820191905f5260205f20905b815481529060010190602001808311610e1b57829003601f168201915b505050505091505090565b5f610e4c612ab8565b805490915060ff600160401b82041615906001600160401b03165f81158015610e725750825b90505f826001600160401b03166001148015610e8d5750303b155b905081158015610e9b575080155b15610eb95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ee357845460ff60401b1916600160401b1785555b610eee888888612ae0565b8315610f3457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610d7d825f612b87565b835f610f5482612bde565b905060018154600160201b900460ff166003811115610f7557610f7561478a565b82548492600160201b90910460ff169114610fae57604051630e851c7960e31b8152600401610fa5929190614ebe565b60405180910390fd5b50505f610fba82612c76565b9050610fd5610fc7612cca565b886346d58ca960e11b612cd3565b6001600160a01b0384163014610fff57610fff610ff0612cca565b886001600160e01b0319612cd3565b6040516303e1e7c360e31b81526001600160a01b03881690631f0f3e189061102f90899089908990600401614f03565b5f604051808303815f87803b158015611046575f5ffd5b505af1158015611058573d5f5f3e3d5ffd5b50505050611067838383612dd5565b50505050505050565b8063ffffffff165f036110965760405163294da6c760e21b815260040160405180910390fd5b5f6110a083612bde565b80546040805163ffffffff928316815291851660208301529192506001600160a01b038516917f4345ec61f717774fdb684b701c34934889550330da2b93f2c3a33379db77f817910160405180910390a2805463ffffffff191663ffffffff9290921691909117905550565b5f5f611116612cca565b9050611123818585612e5e565b5060019392505050565b5f610d7d826001612e6b565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146111905760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b50630a85bd0160e11b9695505050505050565b5f5f5160206156085f395f51905f5280546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906307a2d13a9082906370a0823190602401602060405180830381865afa158015611204573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112289190614e1b565b6040518263ffffffff1660e01b815260040161124691815260200190565b602060405180830381865afa158015611261573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112859190614e1b565b90508061129182612eb9565b148061129a5750825b6112b75760405163292d4c4b60e11b815260040160405180910390fd5b6112c084612fb2565b50505050565b6112cf85612bde565b505f6112e58686866112e087613147565b613177565b905082815f81131561131357604051630c97a6bf60e41b815260048101929092526024820152604401610fa5565b50505f61131e612a42565b905083811015611362576113328185614e73565b61134461133f8387614e73565b612eb9565b146113625760405163af8075e960e01b815260040160405180910390fd5b61137f838561136f611612565b6001600160a01b03169190613276565b6040805163ffffffff808916825287166020820152908101859052606081018390526001600160a01b0384811660808301528816907fcc010dd322eb2bc19138cf20160ad5643925810f442fc6c5d48b9b4c59b34efe9060a00160405180910390a250505050505050565b5f5f6113f4612cca565b90506114018582856132ab565b61140c8585856132f6565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f8154610cc59190600160a01b900460ff16614fae565b6060835f61146282612bde565b905060018154600160201b900460ff1660038111156114835761148361478a565b82548492600160201b90910460ff1691146114b357604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f6114bf82612c76565b90506114e86114cc612cca565b886114da60045f8a8c614fc7565b6114e391614fee565b612cd3565b61153186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b1692915050613353565b93505f848060200190518101906115489190614e1b565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156115b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d49190615024565b6001600160a01b0316146115fc576115fc6115ed612cca565b896001600160e01b0319612cd3565b50611608838383612dd5565b5050509392505050565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b611648613360565b61165282826133f0565b5050565b5f61165f6134ac565b505f5160206155e85f395f51905f5290565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146116c85760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b50635ee0c7dd60e01b90505b949350505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146117335760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b505f61173e88612bde565b905060018154600160201b900460ff16600381111561175f5761175f61478a565b1480611787575060028154600160201b900460ff1660038111156117855761178561478a565b145b81548991600160201b90910460ff16906117b657604051630e851c7960e31b8152600401610fa5929190614ebe565b505f9050836117c58688614e46565b6117cf9190614e46565b82549091506117fc908a9063ffffffff166117ea81426134f5565b6117f385613147565b6112e090614e59565b506331759a2f60e11b9998505050505050505050565b5f5f195f61181f85611ffc565b90506116d461182c612cca565b858784613521565b6001600160a01b03165f9081525f5160206155c85f395f51905f52602052604090205490565b61186384612bde565b505f6118748585856117f386613147565b905081815f8112156118a25760405163239de57160e11b815260048101929092526024820152604401610fa5565b50506118ca6118af612cca565b30846118b9611612565b6001600160a01b031692919061359a565b846001600160a01b03167ffe14813540c7709c2d7e702f39b104eeed265dd484f899e9f2f89c801aa6395c85858585611901612cca565b6040805163ffffffff96871681529590941660208601529284019190915260608301526001600160a01b0316608082015260a00160405180910390a25050505050565b6060835f61195182612bde565b905060018154600160201b900460ff1660038111156119725761197261478a565b148061199a575060028154600160201b900460ff1660038111156119985761199861478a565b145b81548391600160201b90910460ff16906119c957604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f6119d4612a42565b90506119e16114cc612cca565b611a2a86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038b1692915050613353565b93505f611a35612a42565b905081811015611a6557611a498183614e73565b6040516351f5977560e11b8152600401610fa591815260200190565b505050509392505050565b5f5f195f611a7d85611c1f565b90506116d4611a8a612cca565b858388613521565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206155c85f395f51905f5291610dc190614e86565b5f5f5160206156085f395f51905f527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af0282611b0c8787876135d0565b81526020019081526020015f20549150509392505050565b5f5f5160206156085f395f51905f525b546001600160a01b0316919050565b5f5f611b4d612cca565b90506111238185856132f6565b5f198103611b7157611b6a612a42565b9050611b99565b611b79612a42565b811115611b995760405163af8075e960e01b815260040160405180910390fd5b5f5f5160206156085f395f51905f528054604051636e553f6560e01b8152600481018590523060248201529192506001600160a01b031690636e553f65906044016020604051808303815f875af1158015611bf6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1a9190614e1b565b505050565b5f610d7d826001612b87565b5f5f611c3683612093565b905080851115611c5f57828582604051633fa733bb60e21b8152600401610fa59392919061503f565b5f611c698661112d565b9050611c7f611c76612cca565b86868985613618565b95945050505050565b5f5f611c93836123fa565b905080851115611cbc57828582604051632e52afbb60e21b8152600401610fa59392919061503f565b5f611cc686610f3e565b9050611c7f611cd3612cca565b8686848a613618565b5f611ce684612bde565b8054604080516001600160601b03600160281b84048116825260208201889052600160881b90930490921690820152606081018490529091506001600160a01b038516907f7e293d291e9dd159f2fbde9523c4191674384553a72c0833ba9cf7dcb5381fb79060800160405180910390a2611d608361376b565b81546001600160601b0391909116600160281b0270ffffffffffffffffffffffff000000000019909116178155611d968261376b565b81546001600160601b0391909116600160881b026bffffffffffffffffffffffff60881b19909116179055505050565b6001600160a01b0384165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af016020526040812080545f5160206156085f395f51905f529290600160201b900460ff166003811115611e2957611e2961478a565b14611e475760405163cd43efa160e01b815260040160405180910390fd5b8463ffffffff165f03611e6d5760405163294da6c760e21b815260040160405180910390fd5b6040805160808101825263ffffffff8716815260016020820152908101611e938661376b565b6001600160601b03168152602001611eaa8561376b565b6001600160601b031690526001600160a01b0387165f90815260018401602090815260409091208251815463ffffffff90911663ffffffff19821681178355928401519192839164ffffffffff191617600160201b836003811115611f1157611f1161478a565b0217905550604082810151825460609094015165010000000000600160e81b0319909416600160281b6001600160601b03928316026bffffffffffffffffffffffff60881b191617600160881b9190941602929092179055516001600160a01b038716907f422c963a67d52178b43a807b8c9df3a99468f416b736f9f040b6392cf790752e90611fa2908490615060565b60405180910390a2505050505050565b6040516001600160601b0319606084901b1660208201526001600160e01b0319821660348201525f9061141290603801604051602081830303815290604052805160209091012090565b5f610d7d825f612e6b565b5f805f5160206156085f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561205d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120819190614e1b565b612089612a42565b610cc59190614e46565b5f610d7d6120a08361379e565b6120a8612007565b6137ab565b5f198103612132575f5f5160206156085f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa15801561210a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212e9190614e1b565b9150505b8061213c82612eb9565b1461215a5760405163af8075e960e01b815260040160405180910390fd5b50565b6121c36040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f64ffffffffff1681526020015f64ffffffffff1681525090565b845f6121ce82612bde565b905060018154600160201b900460ff1660038111156121ef576121ef61478a565b82548492600160201b90910460ff16911461221f57604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f61222b82612c76565b9050612246612238612cca565b896346d58ca960e11b612cd3565b6001600160a01b0385163014612261576122616115ed612cca565b6040516346d58ca960e11b81526001600160a01b03891690638dab195290612291908a908a908a906004016150b0565b610180604051808303815f875af11580156122ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d291906150ef565b93506122df838383612dd5565b505050949350505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146123415760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b505f61234c86612bde565b905060018154600160201b900460ff16600381111561236d5761236d61478a565b1480612395575060028154600160201b900460ff1660038111156123935761239361478a565b145b81548791600160201b90910460ff16906123c457604051630e851c7960e31b8152600401610fa5929190614ebe565b505080546123e790879063ffffffff166123de81426134f5565b6117f387613147565b50636b140e9f60e11b9695505050505050565b5f610d7d612407836137ba565b6120a8610a36612007565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6060835f61246882612bde565b905060018154600160201b900460ff1660038111156124895761248961478a565b82548492600160201b90910460ff1691146124b957604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f6124c582612c76565b90505f80866001600160401b038111156124e1576124e161450c565b60405190808252806020026020018201604052801561251457816020015b60608152602001906001900390816124ff5790505b5095505f5b87811015612713575f89898381811061253457612534615197565b905060200281019061254691906151ab565b612554916004915f91614fc7565b61255d91614fee565b905081158061257957506001600160e01b031981811690851614155b1561259457612590612589612cca565b8c83612cd3565b8093505b6125ff8a8a848181106125a9576125a9615197565b90506020028101906125bb91906151ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038f1692915050613353565b88838151811061261157612611615197565b60200260200101819052508261270a575f88838151811061263457612634615197565b602002602001015180602001905181019061264f9190614e1b565b6040516331a9108f60e11b81526004810182905290915030906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156126b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126db9190615024565b6001600160a01b031614612708576127036126f4612cca565b8d6001600160e01b0319612cd3565b600193505b505b50600101612519565b505050611608838383612dd5565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146127785760405163950d88bf60e01b81526001600160a01b039091166004820152602401610fa5565b5063e8e617b760e01b949350505050565b6060835f61279682612bde565b905060018154600160201b900460ff1660038111156127b7576127b761478a565b14806127df575060028154600160201b900460ff1660038111156127dd576127dd61478a565b145b81548391600160201b90910460ff169061280e57604051630e851c7960e31b8152600401610fa5929190614ebe565b50505f612819612a42565b90505f856001600160401b038111156128345761283461450c565b60405190808252806020026020018201604052801561286757816020015b60608152602001906001900390816128525790505b5094505f5b86811015612978575f88888381811061288757612887615197565b905060200281019061289991906151ab565b6128a7916004915f91614fc7565b6128b091614fee565b90508115806128cc57506001600160e01b031981811690841614155b156128e7576128e36128dc612cca565b8b83612cd3565b8092505b6129528989848181106128fc576128fc615197565b905060200281019061290e91906151ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250506001600160a01b038e1692915050613353565b87838151811061296457612964615197565b60209081029190910101525060010161286c565b50505f611a35612a42565b5f8160038111156129965761299661478a565b036129b457604051635e64536560e11b815260040160405180910390fd5b5f6129be83612bde565b9050826001600160a01b03167f0638a5c17c348b99c05e7985ee5ee8bc0c41bc7a12265aec4a488d62350c1d24825f0160049054906101000a900460ff1684604051612a0b9291906151ed565b60405180910390a280548290829064ff000000001916600160201b836003811115612a3857612a3861478a565b0217905550505050565b5f612a4b611612565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612a8f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ab39190614e1b565b905090565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610d7d565b612ae86137c4565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b699190615024565b9050612b74816137e9565b612b7e84846137fa565b6112c08261380c565b5f611412612b93610b9f565b612b9e906001614e46565b612ba95f600a6152eb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612bd59190614e46565b85919085613930565b6001600160a01b0381165f9081527f0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af0160205260408120805490915f5160206156085f395f51905f5291600160201b900460ff166003811115612c4257612c4261478a565b14158390612c6f57604051632dad902160e01b81526001600160a01b039091166004820152602401610fa5565b5050919050565b5f612c7f612a42565b8254909150600160881b90046001600160601b0316811015612cc5578154612cbc9061133f908390600160881b90046001600160601b0316614e73565b50610d7d612a42565b919050565b5f612ab3613972565b5f612cde8383611fb2565b90505f306001600160a01b0316633a7b7a396040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d419190615024565b6001600160a01b031663b70096138630856040518463ffffffff1660e01b8152600401612d70939291906152f9565b6040805180830381865afa158015612d8a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dae9190615326565b50905084848383610f345760405163c294136d60e01b8152600401610fa5939291906152f9565b5f612dde612a42565b9050818110156112c05782545f90612e1490869063ffffffff16612e0281426134f5565b6112e0612e0f8789614e73565b613147565b84549091508190600160281b90046001600160601b0316808213156110675760405163395192c560e21b815260048101929092526001600160601b03166024820152604401610fa5565b611c1a83838360016139dc565b5f611412612e7a82600a6152eb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254612ea69190614e46565b612eae610b9f565b612bd5906001614e46565b5f805f5160206156085f395f51905f52805460405163ce96cb7760e01b8152306004820152919250612f399185916001600160a01b03169063ce96cb7790602401602060405180830381865afa158015612f15573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a89190614e1b565b8154604051632d182be560e21b815260048101839052306024820181905260448201529193506001600160a01b03169063b460af94906064016020604051808303815f875af1158015612f8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6f9190614e1b565b6001600160a01b038116612fd9576040516347ddf9c760e01b815260040160405180910390fd5b5f5160206156085f395f51905f5280546001600160a01b038381166001600160a01b0319831617835516801561308457613011611612565b60405163095ea7b360e01b81526001600160a01b0383811660048301525f6024830152919091169063095ea7b3906044016020604051808303815f875af115801561305e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130829190615353565b505b61308c611612565b60405163095ea7b360e01b81526001600160a01b0385811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af11580156130da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130fe9190615353565b50604080516001600160a01b038084168252851660208201527f9baaddad37a65ca0df0360563fca87a13c1ce354be76d7ec35eac48bd766332a910160405180910390a1505050565b5f6001600160ff1b038211156131735760405163123baf0360e11b815260048101839052602401610fa5565b5090565b5f5f5160206156085f395f51905f52816131928787876135d0565b905083826002015f8381526020019081526020015f205f8282546131b6919061536e565b9182905550835490945085915083906014906131dd908490600160a01b9004600b0b615395565b82546001600160601b039182166101009390930a92830291909202199091161790555081546040805163ffffffff808a1682528816602082015290810186905260608101859052600160a01b909104600b0b60808201526001600160a01b038816907fbc0ff1d27e119160a9a107d0725b9ed31b90773cf47e89332a35a8c1a319eaee9060a00160405180910390a25050949350505050565b6132838383836001613ac0565b611c1a57604051635274afe760e01b81526001600160a01b0384166004820152602401610fa5565b5f6132b68484612412565b90505f198110156112c057818110156132e857828183604051637dc7a0d960e11b8152600401610fa59392919061503f565b6112c084848484035f6139dc565b6001600160a01b03831661331f57604051634b637e8f60e11b81525f6004820152602401610fa5565b6001600160a01b0382166133485760405163ec442f0560e01b81525f6004820152602401610fa5565b611c1a838383613b22565b606061141283835f613c3a565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806133d057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166133c4613d06565b6001600160a01b031614155b156133ee5760405163703e46dd60e11b815260040160405180910390fd5b565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561344a575060408051601f3d908101601f1916820190925261344791810190614e1b565b60015b61347257604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610fa5565b5f5160206155e85f395f51905f5281146134a257604051632a87526960e21b815260048101829052602401610fa5565b611c1a8383613d1a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146133ee5760405163703e46dd60e11b815260040160405180910390fd5b5f63ffffffff838116146135185761351363ffffffff8416836153e0565b611412565b61141282613d6f565b61353461352c611612565b85308561359a565b61353e8382613e4c565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7848460405161358c929190918252602082015260400190565b60405180910390a350505050565b6135a8848484846001613e80565b6112c057604051635274afe760e01b81526001600160a01b0385166004820152602401610fa5565b6bffffffffffffffff000000006001600160e01b031960e09390931b9290921660c09190911b63ffffffff60c01b161760a01c1660609190911b6001600160601b0319161790565b5f613621612a42565b905082811015613756575f5f5160206156085f395f51905f52805460405163ce96cb7760e01b81523060048201529192506001600160a01b03169063ce96cb7790602401602060405180830381865afa158015613680573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a49190614e1b565b6136ae8386614e73565b11156136cd5760405163af8075e960e01b815260040160405180910390fd5b80546001600160a01b031663b460af946136e78487614e73565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af115801561372f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137539190614e1b565b50505b6137638686868686613eed565b505050505050565b5f6001600160601b03821115613173576040516306dfcc6560e41b81526060600482015260248101839052604401610fa5565b5f610d7d610448836123fa565b5f828218828410028218611412565b5f610d7d82611834565b6137cc613f94565b6133ee57604051631afcd79f60e31b815260040160405180910390fd5b6137f16137c4565b61215a81613fad565b6138026137c4565b6116528282614030565b6138146137c4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613870573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138949190615024565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f196024830152919091169063095ea7b3906044016020604051808303815f875af1158015613902573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139269190615353565b5061215a81612fb2565b5f61395d61393d83614080565b801561395857505f8480613953576139536153cc565b868809115b151590565b6139688686866140ac565b611c7f9190614e46565b5f3660148082108015906139ae57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156139d4576139c136828403815f614fc7565b6139ca916153f3565b60601c9250505090565b339250505090565b5f5160206155c85f395f51905f526001600160a01b038516613a135760405163e602df0560e01b81525f6004820152602401610fa5565b6001600160a01b038416613a3c57604051634a1406b160e11b81525f6004820152602401610fa5565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115613ab957836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051613ab091815260200190565b60405180910390a35b5050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316613b16578383151615613b0a573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f5160206155c85f395f51905f526001600160a01b038416613b5c5781816002015f828254613b519190614e46565b90915550613bb99050565b6001600160a01b0384165f9081526020829052604090205482811015613b9b5784818460405163391434e360e21b8152600401610fa59392919061503f565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316613bd7576002810180548390039055613bf5565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161358c91815260200190565b606081471015613c665760405163cf47918160e01b815247600482015260248101839052604401610fa5565b5f613c7285848661415c565b9050808015613c9357505f3d1180613c9357505f856001600160a01b03163b115b15613ca857613ca0614171565b915050611412565b8015613cd257604051639996b31560e01b81526001600160a01b0386166004820152602401610fa5565b3d15613ce557613ce061418a565b613cfe565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b5f5f5160206155e85f395f51905f52611b34565b613d2382614195565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613d6757611c1a82826141f8565b61165261427a565b6107e95f8062015180613d86636774858086614e73565b613d9091906153e0565b90505b81613da05761016d613da4565b61016e5b61ffff168110613e275781613dbb5761016d613dbf565b61016e5b613dcd9061ffff1682614e73565b9050613dd883615429565b9250613de560048461544d565b63ffffffff16158015613e205750613dfe60648461544d565b63ffffffff16151580613e205750613e186101908461544d565b63ffffffff16155b9150613d93565b613e318183614299565b613e3c846064615474565b63ffffffff166116d49190614e46565b6001600160a01b038216613e755760405163ec442f0560e01b81525f6004820152602401610fa5565b6116525f8383613b22565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316613edc578383151615613ed0573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b826001600160a01b0316856001600160a01b031614613f1157613f118386836132ab565b613f1b838261437c565b613f2d613f26611612565b8584613276565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051613f85929190918252602082015260400190565b60405180910390a45050505050565b5f613f9d612ab8565b54600160401b900460ff16919050565b613fb56137c4565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80613fe1846143b0565b9150915081613ff1576012613ff3565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b6140386137c4565b5f5160206155c85f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361407184826154d7565b50600481016112c083826154d7565b5f60028260038111156140955761409561478a565b61409f9190615591565b60ff166001149050919050565b5f5f5f6140b9868661443b565b91509150815f036140dd578381816140d3576140d36153cc565b0492505050611412565b8184116140f4576140f46003851502601118614457565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b806001600160a01b03163b5f036141ca57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610fa5565b5f5160206155e85f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f6142058484614468565b905080801561422657505f3d118061422657505f846001600160a01b03163b115b1561423b57614233614171565b915050610d7d565b801561426557604051639996b31560e01b81526001600160a01b0385166004820152602401610fa5565b3d15613ce55761427361418a565b5092915050565b34156133ee5760405163b398979f60e01b815260040160405180910390fd5b5f601f8310156142ab57506001610d7d565b81156142d457603c8310156142c257506002610d7d565b826142cc816155b2565b9350506142e5565b603b8310156142e557506002610d7d565b605a831061436f576078831061436857609783106143615760b5831061435a5760d483106143535760f3831061434c57610111831061434557610130831061433e5761014e831061433757600c614372565b600b614372565b600a614372565b6009614372565b6008614372565b6007614372565b6006614372565b6005614372565b6004614372565b60035b60ff169392505050565b6001600160a01b0382166143a557604051634b637e8f60e11b81525f6004820152602401610fa5565b611652825f83613b22565b5f5f5f6143bc60405190565b6040805160048152602481019091526020810180516001600160e01b031663313ce56760e01b1790529091505f9081906143f790879061447b565b509150915061440583604052565b818015614413575060203d10155b8015614420575060ff8111155b61442b575f5f61442f565b6001815b94509450505050915091565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f5f835160208501865af49392505050565b5f5f5f60405f855160208701885afa92505f51915060205190509250925092565b80356001600160e01b031981168114612cc5575f5ffd5b5f602082840312156144c3575f5ffd5b6114128261449c565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61141260208301846144cc565b634e487b7160e01b5f52604160045260245ffd5b60405161018081016001600160401b03811182821017156145435761454361450c565b60405290565b5f5f6001600160401b038411156145625761456261450c565b50604051601f19601f85018116603f011681018181106001600160401b03821117156145905761459061450c565b6040528381529050808284018510156145a7575f5ffd5b838360208301375f60208583010152509392505050565b5f82601f8301126145cd575f5ffd5b61141283833560208501614549565b6001600160a01b038116811461215a575f5ffd5b5f5f5f60608486031215614602575f5ffd5b83356001600160401b03811115614617575f5ffd5b614623868287016145be565b93505060208401356001600160401b0381111561463e575f5ffd5b61464a868287016145be565b925050604084013561465b816145dc565b809150509250925092565b5f60208284031215614676575f5ffd5b5035919050565b5f5f83601f84011261468d575f5ffd5b5081356001600160401b038111156146a3575f5ffd5b6020830191508360208260051b85010111156146bd575f5ffd5b9250929050565b5f5f5f5f606085870312156146d7575f5ffd5b84356146e2816145dc565b935060208501356001600160401b038111156146fc575f5ffd5b6147088782880161467d565b909450925050604085013561471c816145dc565b939692955090935050565b63ffffffff8116811461215a575f5ffd5b5f5f60408385031215614749575f5ffd5b8235614754816145dc565b9150602083013561476481614727565b809150509250929050565b5f6020828403121561477f575f5ffd5b8135611412816145dc565b634e487b7160e01b5f52602160045260245ffd5b600481106147ba57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610d7d828461479e565b5f5f604083850312156147dd575f5ffd5b82356147e8816145dc565b946020939093013593505050565b5f5f83601f840112614806575f5ffd5b5081356001600160401b0381111561481c575f5ffd5b6020830191508360208285010111156146bd575f5ffd5b5f5f5f5f5f60808688031215614847575f5ffd5b8535614852816145dc565b94506020860135614862816145dc565b93506040860135925060608601356001600160401b03811115614883575f5ffd5b61488f888289016147f6565b969995985093965092949392505050565b801515811461215a575f5ffd5b5f5f604083850312156148be575f5ffd5b82356148c9816145dc565b91506020830135614764816148a0565b5f5f5f5f5f60a086880312156148ed575f5ffd5b85356148f8816145dc565b9450602086013561490881614727565b9350604086013561491881614727565b925060608601359150608086013561492f816145dc565b809150509295509295909350565b5f5f5f6060848603121561494f575f5ffd5b833561495a816145dc565b9250602084013561496a816145dc565b929592945050506040919091013590565b5f5f5f6040848603121561498d575f5ffd5b8335614998816145dc565b925060208401356001600160401b038111156149b2575f5ffd5b6149be868287016147f6565b9497909650939450505050565b5f5f604083850312156149dc575f5ffd5b82356149e7816145dc565b915060208301356001600160401b03811115614a01575f5ffd5b8301601f81018513614a11575f5ffd5b614a2085823560208401614549565b9150509250929050565b5f5f5f5f60808587031215614a3d575f5ffd5b8435614a48816145dc565b93506020850135614a58816145dc565b93969395505050506040820135916060013590565b5f5f5f5f5f5f60c08789031215614a82575f5ffd5b8635614a8d816145dc565b95506020870135614a9d816145dc565b95989597505050506040840135936060810135936080820135935060a0909101359150565b5f5f60408385031215614ad3575f5ffd5b823591506020830135614764816145dc565b5f5f5f5f60808587031215614af8575f5ffd5b8435614b03816145dc565b93506020850135614b1381614727565b92506040850135614b2381614727565b9396929550929360600135925050565b5f5f5f60608486031215614b45575f5ffd5b8335614b50816145dc565b92506020840135614b6081614727565b9150604084013561465b81614727565b5f5f5f60608486031215614b82575f5ffd5b833592506020840135614b94816145dc565b9150604084013561465b816145dc565b5f5f5f60608486031215614bb6575f5ffd5b8335614bc1816145dc565b95602085013595506040909401359392505050565b5f5f5f5f60808587031215614be9575f5ffd5b8435614bf4816145dc565b93506020850135614a5881614727565b5f5f60408385031215614c15575f5ffd5b8235614c20816145dc565b9150614c2e6020840161449c565b90509250929050565b5f5f5f5f60608587031215614c4a575f5ffd5b8435614c55816145dc565b935060208501356001600160401b03811115614c6f575f5ffd5b614708878288016147f6565b5f61018082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100830151610100830152610120830151610120830152610140830151614cff61014084018264ffffffffff169052565b5061016083015161427361016084018264ffffffffff169052565b5f5f60408385031215614d2b575f5ffd5b8235614d36816145dc565b91506020830135614764816145dc565b5f5f5f60408486031215614d58575f5ffd5b8335614d63816145dc565b925060208401356001600160401b03811115614d7d575f5ffd5b6149be8682870161467d565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614de057603f19878603018452614dcb8583516144cc565b94506020938401939190910190600101614daf565b50929695505050505050565b5f5f60408385031215614dfd575f5ffd5b8235614e08816145dc565b9150602083013560048110614764575f5ffd5b5f60208284031215614e2b575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d7d57610d7d614e32565b5f600160ff1b8201614e6d57614e6d614e32565b505f0390565b81810381811115610d7d57610d7d614e32565b600181811c90821680614e9a57607f821691505b602082108103614eb857634e487b7160e01b5f52602260045260245ffd5b50919050565b6001600160a01b038316815260408101611412602083018461479e565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604080825281018390525f6060600585901b830181019083018683601e1936839003015b88821015614f9457868503605f190184528235818112614f45575f5ffd5b8a016020810190356001600160401b03811115614f60575f5ffd5b803603821315614f6e575f5ffd5b614f79878284614edb565b96505050602083019250602084019350600182019150614f27565b5050506001600160a01b03851660208501525090506116d4565b60ff8181168382160190811115610d7d57610d7d614e32565b5f5f85851115614fd5575f5ffd5b83861115614fe1575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015614273576001600160e01b031960049490940360031b84901b1690921692915050565b5f60208284031215615034575f5ffd5b8151611412816145dc565b6001600160a01b039390931683526020830191909152604082015260600190565b5f608082019050825463ffffffff811683526150856020840160ff8360201c1661479e565b6001600160601b038160281c1660408401526001600160601b038160881c1660608401525092915050565b604081525f6150c3604083018587614edb565b905060018060a01b0383166020830152949350505050565b805164ffffffffff81168114612cc5575f5ffd5b5f610180828403128015615101575f5ffd5b5061510a614520565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e080840151908201526101008084015190820152610120808401519082015261517761014084016150db565b61014082015261518a61016084016150db565b6101608201529392505050565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e198436030181126151c0575f5ffd5b8301803591506001600160401b038211156151d9575f5ffd5b6020019150368190038213156146bd575f5ffd5b604081016151fb828561479e565b611412602083018461479e565b6001815b60018411156152435780850481111561522757615227614e32565b600184161561523557908102905b60019390931c92800261520c565b935093915050565b5f8261525957506001610d7d565b8161526557505f610d7d565b816001811461527b5760028114615285576152a1565b6001915050610d7d565b60ff84111561529657615296614e32565b50506001821b610d7d565b5060208310610133831016604e8410600b84101617156152c4575081810a610d7d565b6152d05f198484615208565b805f19048211156152e3576152e3614e32565b029392505050565b5f61141260ff84168361524b565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f5f60408385031215615337575f5ffd5b8251615342816148a0565b602084015190925061476481614727565b5f60208284031215615363575f5ffd5b8151611412816148a0565b8082018281125f83128015821682158216171561538d5761538d614e32565b505092915050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff1982121715610d7d57610d7d614e32565b634e487b7160e01b5f52601260045260245ffd5b5f826153ee576153ee6153cc565b500490565b80356001600160601b03198116906014841015614273576001600160601b031960149490940360031b84901b1690921692915050565b5f63ffffffff821663ffffffff810361544457615444614e32565b60010192915050565b5f63ffffffff831680615462576154626153cc565b8063ffffffff84160691505092915050565b63ffffffff818116838216029081169081811461427357614273614e32565b601f821115611c1a57805f5260205f20601f840160051c810160208510156154b85750805b601f840160051c820191505b81811015613ab9575f81556001016154c4565b81516001600160401b038111156154f0576154f061450c565b615504816154fe8454614e86565b84615493565b6020601f821160018114615536575f831561551f5750848201515b5f19600385901b1c1916600184901b178455613ab9565b5f84815260208120601f198516915b828110156155655787850151825560209485019460019092019101615545565b508482101561558257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff8316806155a3576155a36153cc565b8060ff84160691505092915050565b5f816155c0576155c0614e32565b505f19019056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc0dff660c705ec490383ffafc9e8e3ab4714559f9ec8567c5380d4ad2dff5af00a26469706673582212203faa8777e79c7e94e6f208b881608764231d9f4d05936629119d589c2645769264736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
