{
  "contractName": "TestStorageManager",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "AgreementFundsDeposited",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "AgreementFundsPayout",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "AgreementFundsWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        }
      ],
      "name": "AgreementStopped",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "period",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "price",
          "type": "uint128"
        }
      ],
      "name": "BillingPlanSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes32[]",
          "name": "message",
          "type": "bytes32[]"
        }
      ],
      "name": "MessageEmitted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "agreementCreator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "size",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "billingPeriod",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "billingPrice",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "availableFunds",
          "type": "uint256"
        }
      ],
      "name": "NewAgreement",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "capacity",
          "type": "uint64"
        }
      ],
      "name": "TotalCapacitySet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        }
      ],
      "name": "depositFunds",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "message",
          "type": "bytes32[]"
        }
      ],
      "name": "emitMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "creator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getAgreementReference",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "storer",
          "type": "address"
        }
      ],
      "name": "hasUtilizedCapacity",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isWhitelistedProvider",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isWhitelistedToken",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "size",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "billingPeriod",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[][]",
          "name": "dataReferencesOfAgreementToPayOut",
          "type": "bytes32[][]"
        },
        {
          "internalType": "address[]",
          "name": "creatorsOfAgreementToPayOut",
          "type": "address[]"
        },
        {
          "internalType": "address",
          "name": "tokenOfAgreementsToPayOut",
          "type": "address"
        }
      ],
      "name": "newAgreement",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "offerRegistry",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "utilizedCapacity",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "totalCapacity",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[][]",
          "name": "dataReferencesOfAgreementToPayOut",
          "type": "bytes32[][]"
        },
        {
          "internalType": "address[]",
          "name": "creatorsOfAgreementToPayOut",
          "type": "address[]"
        },
        {
          "internalType": "address",
          "name": "tokensOfAgreementsToPayOut",
          "type": "address"
        },
        {
          "internalType": "address payable",
          "name": "provider",
          "type": "address"
        }
      ],
      "name": "payoutFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64[][]",
          "name": "billingPeriods",
          "type": "uint64[][]"
        },
        {
          "internalType": "uint128[][]",
          "name": "billingPrices",
          "type": "uint128[][]"
        },
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        }
      ],
      "name": "setBillingPlans",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "capacity",
          "type": "uint64"
        },
        {
          "internalType": "uint64[][]",
          "name": "billingPeriods",
          "type": "uint64[][]"
        },
        {
          "internalType": "uint128[][]",
          "name": "billingPrices",
          "type": "uint128[][]"
        },
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "message",
          "type": "bytes32[]"
        }
      ],
      "name": "setOffer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "capacity",
          "type": "uint64"
        }
      ],
      "name": "setTotalCapacity",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "providerAddress",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isWhiteListed",
          "type": "bool"
        }
      ],
      "name": "setWhitelistedProvider",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isWhiteListed",
          "type": "bool"
        }
      ],
      "name": "setWhitelistedTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "terminateOffer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "withdrawFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "increment",
          "type": "uint256"
        }
      ],
      "name": "incrementTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newTime",
          "type": "uint256"
        }
      ],
      "name": "setTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        }
      ],
      "name": "getOfferUtilizedCapacity",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AgreementFundsDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AgreementFundsPayout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AgreementFundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"}],\"name\":\"AgreementStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"period\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"name\":\"BillingPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32[]\",\"name\":\"message\",\"type\":\"bytes32[]\"}],\"name\":\"MessageEmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"agreementCreator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"size\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"billingPeriod\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"billingPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"availableFunds\",\"type\":\"uint256\"}],\"name\":\"NewAgreement\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"capacity\",\"type\":\"uint64\"}],\"name\":\"TotalCapacitySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"depositFunds\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"message\",\"type\":\"bytes32[]\"}],\"name\":\"emitMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getAgreementReference\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"getOfferUtilizedCapacity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"storer\",\"type\":\"address\"}],\"name\":\"hasUtilizedCapacity\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"incrementTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWhitelistedProvider\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWhitelistedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"size\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"billingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[][]\",\"name\":\"dataReferencesOfAgreementToPayOut\",\"type\":\"bytes32[][]\"},{\"internalType\":\"address[]\",\"name\":\"creatorsOfAgreementToPayOut\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"tokenOfAgreementsToPayOut\",\"type\":\"address\"}],\"name\":\"newAgreement\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"offerRegistry\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"utilizedCapacity\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"totalCapacity\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[][]\",\"name\":\"dataReferencesOfAgreementToPayOut\",\"type\":\"bytes32[][]\"},{\"internalType\":\"address[]\",\"name\":\"creatorsOfAgreementToPayOut\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"tokensOfAgreementsToPayOut\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"payoutFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[][]\",\"name\":\"billingPeriods\",\"type\":\"uint64[][]\"},{\"internalType\":\"uint128[][]\",\"name\":\"billingPrices\",\"type\":\"uint128[][]\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"setBillingPlans\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"capacity\",\"type\":\"uint64\"},{\"internalType\":\"uint64[][]\",\"name\":\"billingPeriods\",\"type\":\"uint64[][]\"},{\"internalType\":\"uint128[][]\",\"name\":\"billingPrices\",\"type\":\"uint128[][]\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"message\",\"type\":\"bytes32[]\"}],\"name\":\"setOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newTime\",\"type\":\"uint256\"}],\"name\":\"setTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"capacity\",\"type\":\"uint64\"}],\"name\":\"setTotalCapacity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isWhiteListed\",\"type\":\"bool\"}],\"name\":\"setWhitelistedProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isWhiteListed\",\"type\":\"bool\"}],\"name\":\"setWhitelistedTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"terminateOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"depositFunds(address,uint256,bytes32[],address)\":{\"details\":\"- depositing funds to Agreement that is linked to terminated Offer is not possible - depositing funds to Agreement that already is expired (eq. ran out of funds at some point) is not possible. Call NewAgreement instead. The data needs to be re-provided though. - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.\",\"params\":{\"dataReference\":\"data reference where should be deposited funds.\",\"provider\":\"the address of the provider of the Offer.\"}},\"emitMessage(bytes32[])\":{\"params\":{\"message\":\"the Provider may send a message (e.g. his nodeID). Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID\"}},\"getAgreementReference(bytes32[],address,address)\":{\"params\":{\"creator\":\"the creator of the agreement\",\"dataReference\":\"the dataReference of the agreement\",\"token\":\"the token, which is used as a means of payment for the agreement.\"}},\"newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)\":{\"details\":\"- The to-be-pinned data reference's size in MB (rounded up) must be equal in size to param size. - Provider can reject to pin data reference when it exceeds specified size. - The ownership of Agreement is enforced with agreementReference structure which is calculated as: hash(msg.sender, dataReference) - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession. Contains execution of the transferFrom on external token contract before all the stage changes are performed. As a result if a token will perform a callback to the StorageManager, it may lead to a reentrancy attack. Hence additional attention should be paid while reviewing this method of a token before whitelisting.\",\"params\":{\"amount\":\"if token is set, this is the amount of tokens that is transfered\",\"billingPeriod\":\"the chosen period for billing.\",\"creatorsOfAgreementToPayOut\":\"the creators of agreements which must be payed out. Pass this when there is no capacity. The order should match the order of dataReferenceOfAgreementToPayOut and tokensOfAgreementToPayOut\",\"dataReference\":\"the reference to an Data Source, can be several things.\",\"dataReferencesOfAgreementToPayOut\":\"the data references of agreements which must be payed out. Pass this when there is no capacity. Order should equal order of creatorsOfAgreementToPayOut and tokensOfAgreementToPayOut\",\"provider\":\"the provider from which is proposed to take a Offer.\",\"size\":\"the size of the to-be-pinned file in MB (rounded up).\",\"token\":\"the token in which you want to make the agreement. By convention: address(0) is the native currency\",\"tokenOfAgreementsToPayOut\":\"the token address of agreements which must be payed out. Pass this when there is no capacity.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pause()\":{\"details\":\"Called by a pauser to pause, triggers stopped state.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"payoutFunds(bytes32[][],address[],address,address)\":{\"details\":\"- Provider must call an expired agreement themselves as soon as the agreement is expired, to add back the capacity to their Offer. - Payout can be triggered by other events as well. Like in newAgreement call with either existing agreement or when other Agreements are passed to the agreementsReferencesToBePayedOut array.\",\"params\":{\"creatorsOfAgreementToPayOut\":\"the creators that made the agreement to pay\",\"dataReferencesOfAgreementToPayOut\":\"the data references of the agreement to pay\",\"tokensOfAgreementsToPayOut\":\"the tokens of the agreement to pay out\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBillingPlans(uint64[][],uint128[][],address[])\":{\"details\":\"- setting the price to 0 means that a particular period is not offered, which can be used to remove a period from the offer. - make sure that any period * prices does not cause an overflow, as this can never be accepted and hence is pointless. - the length of tokens array must always be one shorter than the length of the boundaries array (otherwise you get an array index out of bounds error) - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered\",\"params\":{\"billingPeriods\":\"the offered periods. Length must be equal to billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index\",\"billingPrices\":\"the prices for the offered periods. Each entry at index corresponds to the same index at periods. 0 means that the particular period is not offered. The first index of the multi dem array corresponds with the address in tokens at the same index\"}},\"setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])\":{\"details\":\"- Use this function when initiating an Offer or when the users wants to change more than one parameter at once. - make sure that any period * prices does not cause an overflow, as this can never be accepted (REF_MAX_PRICE) and hence is pointless - only whitelisted tokens are allowed to make an offer for - if there are two tokens, and two billingPrice/periods pairs per token, then boundaries[0] == 1. This makes the first two billingPeriod/prices pairs to apply to the first token ([tokens[0]]) and the second pairs to the second token. - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered\",\"params\":{\"billingPeriods\":\"the offered periods. Length must be equal to the length of billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index\",\"billingPrices\":\"the prices for the offered periods. Each entry at index corresponds to the same index at periods. The first index of the multi dem array corresponds with the address in tokens at the same index\",\"capacity\":\"the amount of MB offered. If already active before and set to 0, existing contracts can't be prolonged / re-started, no new contracts can be started.\",\"message\":\"the Provider may include a message (e.g. his nodeID).  Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID\",\"tokens\":\"the tokens for which an offer is made. By convention, address(0) is the native currency.\"}},\"setTotalCapacity(uint64)\":{\"params\":{\"capacity\":\"the new capacity\"}},\"setWhitelistedProvider(address,bool)\":{\"params\":{\"isWhiteListed\":\"whether you want to whitelist the provider or put it from the whitelist.\",\"providerAddress\":\"the providerAddress from whom you want to set the whitelisted\"}},\"setWhitelistedTokens(address,bool)\":{\"params\":{\"isWhiteListed\":\"whether you want to whitelist the token or put it from the whitelist.\",\"token\":\"the token from whom you want to set the whitelisted\"}},\"terminateOffer()\":{\"details\":\"no new Agreement can be created and no existing Agreement can be prolonged. All existing Agreement are still valid for the amount of periods still deposited.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unpause()\":{\"details\":\"Called by a pauser to unpause, returns to normal state.\"},\"withdrawFunds(bytes32[],address,address[],uint256[])\":{\"details\":\"- if amount is zero then all withdrawable funds are transferred (eq. all available funds minus funds for still non-payed out periods and current period) - if Agreement is terminated Consumer can withdraw all remaining funds - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.\",\"params\":{\"amounts\":\"the value you want to withdraw for each token\",\"dataReference\":\"the data reference of agreement to be funds withdrawn from\",\"provider\":\"the address of the provider of the Offer.\",\"tokens\":\"the tokens in which to withdraw. By convention, address(0) is the native currency.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"depositFunds(address,uint256,bytes32[],address)\":{\"notice\":\">> FOR CONSUMERdeposits new funds to the Agreement.\"},\"emitMessage(bytes32[])\":{\"notice\":\">> FOR PROVIDER\"},\"getAgreementReference(bytes32[],address,address)\":{\"notice\":\"get the agreementReference. the agreementReference consists of the hash of the dataReference, msg.sender and the tokenAdddress, to allow: - multiple people to register an agreement for the same file - one person to register multiple agreements for the same file, but with different tokens - link the token to the agreement, such that we do the accounting properly\"},\"newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)\":{\"notice\":\">> FOR CONSUMERnew Agreement for given Offer\"},\"payoutFunds(bytes32[][],address[],address,address)\":{\"notice\":\">> FOR PROVIDERpayout already earned funds of one or more Agreement\"},\"setBillingPlans(uint64[][],uint128[][],address[])\":{\"notice\":\">> FOR PROVIDERset the billing plans for an Offer.\"},\"setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])\":{\"notice\":\">> FOR PROVIDERset the totalCapacity and billingPlans of a Offer.\"},\"setTotalCapacity(uint64)\":{\"notice\":\">> FOR PROVIDERsets total capacity of Offer.\"},\"setWhitelistedProvider(address,bool)\":{\"notice\":\"whitelist a provider or remove the provider from whitelist\"},\"setWhitelistedTokens(address,bool)\":{\"notice\":\"whitelist a token or remove the token from whitelist\"},\"terminateOffer()\":{\"notice\":\">> FOR PROVIDERstops the Offer. It sets the totalCapacity to 0 which indicates terminated Offer.\"},\"withdrawFunds(bytes32[],address,address[],uint256[])\":{\"notice\":\">> FOR CONSUMERwithdraw funds from Agreement.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManager.sol\":\"TestStorageManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/StorageManager.sol\":{\"keccak256\":\"0xb39dec9f5da8aa5bf10ca169d3e1ea12d08678d2f9d999dcbd22f52711dab8f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07fab32db88ce5f2f79e08db9c81095fc398d8ce7ac8dde69e6885197396ebd1\",\"dweb:/ipfs/QmXHa2SsauGepF6TbDkGsMeqKYgxHsFKsrVWbvC8Cw5q1m\"]},\"/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManager.sol\":{\"keccak256\":\"0x2db3efc997008d9ce7cbf5f3751942adca7dc1667fd6de2148230531938da393\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://36c642f6591ba97d776dacfe65f59ca476ad49f6225ab42d2a0726e21393c25e\",\"dweb:/ipfs/QmefTMYPhGbh7FvUt8AQ4GnyD9euNbV5DmNas2cq6P9sf3\"]},\"@openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol\":{\"keccak256\":\"0xe81686511d62f18b2d9c693c2c94c0a789c690de63aa90e15451ebf65c5bfd3e\",\"urls\":[\"bzz-raw://1332ee1d2b096456bf2e5795b5871d0fed47be6a31c9a2f2cef9206a299565ea\",\"dweb:/ipfs/Qmdu1847Y4UL3gTjbLUManMGfxYEoyGPSodM3Br89SKzwx\"]},\"@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol\":{\"keccak256\":\"0x9bfec92e36234ecc99b5d37230acb6cd1f99560233753162204104a4897e8721\",\"urls\":[\"bzz-raw://5cf7c208583d4d046d75bd99f5507412ab01cce9dd9f802ce9768a416d93ea2f\",\"dweb:/ipfs/QmcQS1BBMPpVEkXP3qzwSjxHNrqDek8YeR7xbVWDC9ApC7\"]},\"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\":{\"keccak256\":\"0x04a69a78363214b4e3055db8e620bed222349f0c81e9d1cbe769eb849b69b73f\",\"urls\":[\"bzz-raw://b3115459376196d6c2c3817439c169d9b052b27b70e8ee2e28963cda760736da\",\"dweb:/ipfs/QmXaNF5rmcDSAzBiFMQjf979qb9xNXqD9eZtgo4uM9VEis\"]},\"@openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol\":{\"keccak256\":\"0x2ad5473fe88d9ab30c6cd495ab8895daae8c4a48cf8231282a2d339387b35006\",\"urls\":[\"bzz-raw://a737c60474c063efc28e5922b6a1d073588c010eb67f883273d3ec29d8e52d6b\",\"dweb:/ipfs/QmWCeqeZhR45S1mcjPRYEMy1DCHMy9sXDfwYLPycFRh2Nk\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7f8d45329fecbf0836ad7543330c3ecd0f8d0ffa42d4016278c3eb2215fdcdfe\",\"dweb:/ipfs/QmXWLT7GcnHtA5NiD6MFi2CV3EWJY4wv5mLNnypqYDrxL3\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08\",\"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC\"]},\"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0xf12dfbe97e6276980b83d2830bb0eb75e0cf4f3e626c2471137f82158ae6a0fc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3a849c2d95e85463909e5b5c920b13e7a11216ca14127085e16d22b9379d52a\",\"dweb:/ipfs/QmUg3CZDbCCcQdroEpexBy5ZFd5vD1UWijWQq9qHZjtJNQ\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0\",\"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b506135f1806100206000396000f3fe6080604052600436106101815760003560e01c806382c4dba5116100d1578063b58596931161008a578063dc4aac9e11610064578063dc4aac9e1461041f578063ec5cdf991461043f578063f2fde38b1461045f578063f650ca741461047f57610181565b8063b5859693146103d7578063bf317abb146103ec578063d245599e1461040c57610181565b806382c4dba5146103125780638456cb59146103325780638da5cb5b146103475780638f5c5fc8146103695780639aad18ca14610397578063ab37f486146103b757610181565b8063398887051161013e5780635c975abb116101185780635c975abb146102a6578063699ca55f146102c8578063715018a6146102e85780638129fc1c146102fd57610181565b806339888705146102515780633beb26c4146102715780633f4ba83a1461029157610181565b80631f3477a5146101865780632691c085146101a857806327beac27146101bb5780632fd09ef9146101f1578063325b29411461021157806337f4329d14610231575b600080fd5b34801561019257600080fd5b506101a66101a1366004612806565b61049f565b005b6101a66101b636600461260d565b61074e565b3480156101c757600080fd5b506101db6101d63660046125b9565b610a4b565b6040516101e89190612c99565b60405180910390f35b3480156101fd57600080fd5b506101a661020c366004612773565b610a6f565b34801561021d57600080fd5b506101a661022c3660046126f0565b610a7b565b34801561023d57600080fd5b506101a661024c366004612a32565b610b1d565b34801561025d57600080fd5b506101a661026c3660046125d5565b610bac565b34801561027d57600080fd5b506101a661028c3660046129f3565b610c0c565b34801561029d57600080fd5b506101a6610c11565b3480156102b257600080fd5b506102bb610c72565b6040516101e89190612c8e565b3480156102d457600080fd5b506101a66102e33660046129f3565b610c7b565b3480156102f457600080fd5b506101a6610c86565b34801561030957600080fd5b506101a6610d05565b34801561031e57600080fd5b506101a661032d3660046125d5565b610d97565b34801561033e57600080fd5b506101a6610df7565b34801561035357600080fd5b5061035c610e57565b6040516101e89190612b9d565b34801561037557600080fd5b506103896103843660046125b9565b610e66565b6040516101e89291906134f8565b3480156103a357600080fd5b506102bb6103b23660046125b9565b610e8c565b3480156103c357600080fd5b506102bb6103d23660046125b9565b610ea1565b3480156103e357600080fd5b506101a6610eb6565b3480156103f857600080fd5b506101db6104073660046127a5565b610f73565b6101a661041a3660046128f1565b610faa565b34801561042b57600080fd5b506101a661043a366004612676565b61141e565b34801561044b57600080fd5b506102bb61045a3660046125b9565b611464565b34801561046b57600080fd5b506101a661047a3660046125b9565b61148a565b34801561048b57600080fd5b506101a661049a366004612a0b565b611541565b6001600160a01b038316600090815260c960205260408120905b83518110156107465760008382815181106104d057fe5b6020026020010151905060008583815181106104e857fe5b6020026020010151905060006104ff893384610f73565b60008181526002808801602052604090912090810154919250906001600160401b03166105475760405162461bcd60e51b815260040161053e90613139565b60405180910390fd5b6002810154600090600160401b90046001600160801b031661056e575060018101546105f5565b600282015482546040805160a0810182526001600160801b03808416808352600160801b9094046001600160401b03908116602084015260018801549383019390935291841660608201819052600160401b909404821660808201526105f2939290920216906105ec906105e19061162c565b6001860154906116d8565b906116d8565b90505b846105fe578094505b8085111561061e5760405162461bcd60e51b815260040161053e90612f38565b600182015461062d90866116d8565b60018301558461064f5760405162461bcd60e51b815260040161053e90612f79565b61065884611723565b156106df576000336001600160a01b03168660405161067690612b9a565b60006040518083038185875af1925050503d80600081146106b3576040519150601f19603f3d011682016040523d82523d6000602084013e6106b8565b606091505b50509050806106d95760405162461bcd60e51b815260040161053e906133c3565b506106f3565b6106f36001600160a01b0385163387611730565b836001600160a01b0316837f579b45b1ee6c41a979ca183763f8a18021bb54fcd590cf1be2821e4abe31fd8e8760405161072d9190612c99565b60405180910390a35050600190930192506104b9915050565b505050505050565b60975460ff16156107715760405162461bcd60e51b815260040161053e9061310f565b6001600160a01b038116600090815260cb6020526040902054819060ff166107ab5760405162461bcd60e51b815260040161053e906131d7565b60006107b8843388610f73565b6001600160a01b038716600090815260ca602052604090205490915060ff166107f35760405162461bcd60e51b815260040161053e9061318f565b6001600160a01b038316600090815260c9602052604090208054600160401b90046001600160401b03166108395760405162461bcd60e51b815260040161053e90612e91565b600082815260028083016020526040909120908101546001600160401b03166108745760405162461bcd60e51b815260040161053e90613139565b6002810154600160401b90046001600160801b03166108a55760405162461bcd60e51b815260040161053e90613222565b80546001600160a01b038916600090815260018401602090815260408083206001600160401b03600160801b86041684529091529020546001600160801b039081169116146109065760405162461bcd60e51b815260040161053e906130c4565b6002810154815461092b916001600160801b03909116906001600160401b031661178b565b6040805160a08101825283546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018601549383019390935260028501549081166060830152600160401b9004909116608082015261099b906109909061162c565b6001840154906116d8565b10156109b95760405162461bcd60e51b815260040161053e90612ee6565b60006109c489611723565b905080156109d0573497505b60018201546109df90896117c5565b6001830155806109fe576109fe6001600160a01b038a1633308b6117ea565b886001600160a01b0316847f5ac5c9c49f143d64d36d4eb69c1624c8670cb426b3f952830187c279a51009cc8a604051610a389190612c99565b60405180910390a3505050505050505050565b6001600160a01b0316600090815260c960205260409020546001600160401b031690565b610a7881611811565b50565b60975460ff1615610a9e5760405162461bcd60e51b815260040161053e9061310f565b33600081815260cb602052604090205460ff16610acd5760405162461bcd60e51b815260040161053e906131d7565b33600090815260c9602052604090208054600160401b90046001600160401b0316610b0a5760405162461bcd60e51b815260040161053e90612e91565b610b1681868686611855565b5050505050565b60975460ff1615610b405760405162461bcd60e51b815260040161053e9061310f565b33600081815260cb602052604090205460ff16610b6f5760405162461bcd60e51b815260040161053e906131d7565b33600090815260c960205260409020610b8787611541565b610b9381878787611855565b825115610ba357610ba383611811565b50505050505050565b610bb46118fc565b6065546001600160a01b03908116911614610be15760405162461bcd60e51b815260040161053e906132a7565b6001600160a01b0391909116600090815260ca60205260409020805460ff1916911515919091179055565b60cc55565b610c196118fc565b6065546001600160a01b03908116911614610c465760405162461bcd60e51b815260040161053e906132a7565b60975460ff16610c685760405162461bcd60e51b815260040161053e90612ce9565b610c70611900565b565b60975460ff1690565b60cc80549091019055565b610c8e6118fc565b6065546001600160a01b03908116911614610cbb5760405162461bcd60e51b815260040161053e906132a7565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff1680610d1e5750610d1e61196c565b80610d2c575060005460ff16155b610d485760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff16158015610d73576000805460ff1961ff0019909116610100171660011790555b610d7b611972565b610d836119f0565b8015610a78576000805461ff001916905550565b610d9f6118fc565b6065546001600160a01b03908116911614610dcc5760405162461bcd60e51b815260040161053e906132a7565b6001600160a01b0391909116600090815260cb60205260409020805460ff1916911515919091179055565b610dff6118fc565b6065546001600160a01b03908116911614610e2c5760405162461bcd60e51b815260040161053e906132a7565b60975460ff1615610e4f5760405162461bcd60e51b815260040161053e9061310f565b610c70611a6e565b6065546001600160a01b031690565b60c9602052600090815260409020546001600160401b0380821691600160401b90041682565b60cb6020526000908152604090205460ff1681565b60ca6020526000908152604090205460ff1681565b33600081815260cb602052604090205460ff16610ee55760405162461bcd60e51b815260040161053e906131d7565b33600090815260c9602052604090208054600160401b90046001600160401b0316610f225760405162461bcd60e51b815260040161053e90612e91565b805467ffffffffffffffff60401b1916815560405133907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae390610f6790600090612ca2565b60405180910390a25050565b6000828483604051602001610f8a93929190612b25565b6040516020818303038152906040528051906020012090505b9392505050565b60975460ff1615610fcd5760405162461bcd60e51b815260040161053e9061310f565b6001600160a01b038816600090815260cb602052604090205460ff166110055760405162461bcd60e51b815260040161053e906131d7565b6001600160a01b038816600090815260c9602052604090206001600160401b0387166110435760405162461bcd60e51b815260040161053e90612d17565b6000886001600160401b03161161106c5760405162461bcd60e51b815260040161053e90613078565b8054600160401b90046001600160401b031661109a5760405162461bcd60e51b815260040161053e90612e91565b6001600160a01b038616600090815260ca602052604090205460ff166110d25760405162461bcd60e51b815260040161053e90612de3565b8351156110e5576110e58484848c611ac7565b60006110f28b3389610f73565b6000818152600284810160205260409091200154909150600160401b90046001600160801b0316156111c557604080516001808252818301909252606091816020015b606081526020019060019003908161113557505060408051600180825281830190925291925060609190602080830190803683370190505090508c8260008151811061117d57fe5b6020026020010181905250338160008151811061119657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506111c282828b8f611ac7565b50505b6001600160a01b038716600090815260018301602090815260408083206001600160401b038c1684529091529020546001600160801b03168061121a5760405162461bcd60e51b815260040161053e90613424565b6000828152600284016020526040902061123389611723565b1561123c573497505b600181015461124b90896117c5565b600182015561126c6001600160401b038c166001600160801b03841661178b565b8160010154101561128f5760405162461bcd60e51b815260040161053e90612fbc565b60028101805467ffffffffffffffff19166001600160401b038d81169190911790915581546001600160801b0319166001600160801b0384161767ffffffffffffffff60801b1916600160801b918c16919091021781556112ee611df7565b6002820180546001600160801b0392909216600160401b02600160401b600160c01b03199092169190911790556001600160a01b038c16600090815260c960205260409020805490945061134f906001600160401b03908116908d166117c5565b845467ffffffffffffffff19166001600160401b0391821617808655600160401b81048216911611156113945760405162461bcd60e51b815260040161053e9061302b565b61139d89611723565b6113b6576113b66001600160a01b038a1633308b6117ea565b8b6001600160a01b0316336001600160a01b03167f8c1ead7cd014d31bcde974cc4762a98cce33de4fbda569fbcc73f8f276212fff8f8e8e878f886001015460405161140796959493929190612c34565b60405180910390a350505050505050505050505050565b6001600160a01b038116600090815260cb6020526040902054819060ff166114585760405162461bcd60e51b815260040161053e906131d7565b610b1685858585611ac7565b6001600160a01b0316600090815260c960205260409020546001600160401b0316151590565b6114926118fc565b6065546001600160a01b039081169116146114bf5760405162461bcd60e51b815260040161053e906132a7565b6001600160a01b0381166114e55760405162461bcd60e51b815260040161053e90612d66565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b60975460ff16156115645760405162461bcd60e51b815260040161053e9061310f565b33600081815260cb602052604090205460ff166115935760405162461bcd60e51b815260040161053e906131d7565b6001600160401b0382166115b95760405162461bcd60e51b815260040161053e906132dc565b33600081815260c9602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b0387160217815590519091907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae39061161f908690612ca2565b60405180910390a2505050565b60008061165c83600001516001600160801b031684606001516001600160401b031661178b90919063ffffffff16565b9050600061169084602001516001600160401b031661168a86608001516001600160801b03166105ec611df7565b90611dfd565b9050600061169e828461178b565b905084604001518111156116d0576116cd836116c7858860400151611dfd90919063ffffffff16565b9061178b565b90505b949350505050565b600061171a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e3f565b90505b92915050565b6001600160a01b03161590565b6117868363a9059cbb60e01b848460405160240161174f929190612bd5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e6b565b505050565b60008261179a5750600061171d565b828202828482816117a757fe5b041461171a5760405162461bcd60e51b815260040161053e90613266565b60008282018381101561171a5760405162461bcd60e51b815260040161053e90612dac565b61180b846323b872dd60e01b85858560405160240161174f93929190612bb1565b50505050565b336001600160a01b03167f8e9ae80d46259102dfbf4ae6121dbe6548e85c8c0494163e8e0bf0e87bcd58768260405161184a9190612c21565b60405180910390a250565b60005b8151811015610b165760005b84828151811061187057fe5b6020026020010151518110156118f3576118eb8684848151811061189057fe5b60200260200101518785815181106118a457fe5b602002602001015184815181106118b757fe5b60200260200101518786815181106118cb57fe5b602002602001015185815181106118de57fe5b6020026020010151611efa565b600101611864565b50600101611858565b3390565b60975460ff166119225760405162461bcd60e51b815260040161053e90612ce9565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6119556118fc565b6040516119629190612b9d565b60405180910390a1565b303b1590565b600054610100900460ff168061198b575061198b61196c565b80611999575060005460ff16155b6119b55760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff161580156119e0576000805460ff1961ff0019909116610100171660011790555b6119e8611fe9565b610d8361206a565b600054610100900460ff1680611a095750611a0961196c565b80611a17575060005460ff16155b611a335760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff16158015611a5e576000805460ff1961ff0019909116610100171660011790555b611a66611fe9565b610d83612144565b60975460ff1615611a915760405162461bcd60e51b815260040161053e9061310f565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119556118fc565b6001600160a01b038116600090815260c96020526040812090805b86518160ff161015611d4c576000611b27888360ff1681518110611b0257fe5b6020026020010151888460ff1681518110611b1957fe5b602002602001015188610f73565b60008181526002808701602052604090912090810154919250906001600160401b0316611b665760405162461bcd60e51b815260040161053e90613139565b6002810154600160401b90046001600160801b0316611b975760405162461bcd60e51b815260040161053e9061337e565b6040805160a08101825282546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018501549383019390935260028401549081166060830152600160401b90049091166080820152600090611bfb9061162c565b90508015611d41576001820154611c1290826116d8565b6001830155611c2185826117c5565b60028301548354919650611c47916001600160801b0316906001600160401b031661178b565b82600101541015611ccd57600282018054600160401b600160c01b031981169091558654611c81916001600160401b0391821691166116d8565b865467ffffffffffffffff19166001600160401b039190911617865560405183907f28b8eb5ccfb9c485b6ee9be3b0153679351f87ca0753786218a455bc3bbe5fdf90600090a2611cfe565b611cd5611df7565b8260020160086101000a8154816001600160801b0302191690836001600160801b031602179055505b876001600160a01b0316837f14f0f588a0fd7eb2bc9954bd5b8b1ff7006d486ac28b7541bc966bf102b9756183604051611d389190612c99565b60405180910390a35b505050600101611ae2565b50801561074657611d5c84611723565b15611de3576000836001600160a01b031682604051611d7a90612b9a565b60006040518083038185875af1925050503d8060008114611db7576040519150601f19603f3d011682016040523d82523d6000602084013e611dbc565b606091505b5050905080611ddd5760405162461bcd60e51b815260040161053e906134c3565b50610746565b6107466001600160a01b0385168483611730565b60cc5490565b600061171a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121d0565b60008184841115611e635760405162461bcd60e51b815260040161053e9190612cb6565b505050900390565b6060611ec0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122079092919063ffffffff16565b8051909150156117865780806020019051810190611ede91906129d7565b6117865760405162461bcd60e51b815260040161053e90613479565b62ed4e006001600160401b0383161115611f265760405162461bcd60e51b815260040161053e90612e40565b6001600160a01b038316600090815260ca602052604090205460ff16611f5e5760405162461bcd60e51b815260040161053e9061318f565b6001600160a01b038316600090815260018501602090815260408083206001600160401b03861684529091529081902080546001600160801b0319166001600160801b0384161790555133907f7eec1797ef3c639736e76e7f22565caf759bb674dab35235349e6879d0a2c14890611fdb90869086908690612bee565b60405180910390a250505050565b600054610100900460ff1680612002575061200261196c565b80612010575060005460ff16155b61202c5760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff16158015610d83576000805460ff1961ff0019909116610100171660011790558015610a78576000805461ff001916905550565b600054610100900460ff1680612083575061208361196c565b80612091575060005460ff16155b6120ad5760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff161580156120d8576000805460ff1961ff0019909116610100171660011790555b60006120e26118fc565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610a78576000805461ff001916905550565b600054610100900460ff168061215d575061215d61196c565b8061216b575060005460ff16155b6121875760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff161580156121b2576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015610a78576000805461ff001916905550565b600081836121f15760405162461bcd60e51b815260040161053e9190612cb6565b5060008385816121fd57fe5b0495945050505050565b60606116d084846000858561221b856122b1565b6122375760405162461bcd60e51b815260040161053e906133ed565b60006060866001600160a01b031685876040516122549190612b7e565b60006040518083038185875af1925050503d8060008114612291576040519150601f19603f3d011682016040523d82523d6000602084013e612296565b606091505b50915091506122a68282866122b7565b979650505050505050565b3b151590565b606083156122c6575081610fa3565b8251156122d65782518084602001fd5b8160405162461bcd60e51b815260040161053e9190612cb6565b803561171d81613583565b600082601f83011261230b578081fd5b813561231e61231982613538565b613512565b81815291506020808301908481018184028601820187101561233f57600080fd5b60005b8481101561236757813561235581613583565b84529282019290820190600101612342565b505050505092915050565b600082601f830112612382578081fd5b813561239061231982613538565b818152915060208083019084810160005b84811015612367576123b8888484358a0101612544565b845292820192908201906001016123a1565b600082601f8301126123da578081fd5b81356123e861231982613538565b818152915060208083019084810160005b84811015612367578135870188603f82011261241457600080fd5b8381013561242461231982613538565b818152858101906040848101888502860182018e101561244357600080fd5b600095505b84861015612472578035915061245d826135a6565b81845260019590950194928801928801612448565b5050875250505092820192908201906001016123f9565b600082601f830112612499578081fd5b81356124a761231982613538565b818152915060208083019084810160005b84811015612367578135870188603f8201126124d357600080fd5b838101356124e361231982613538565b818152858101906040848101888502860182018e101561250257600080fd5b600095505b8486101561252d576125198e826125a2565b845260019590950194928801928801612507565b5050875250505092820192908201906001016124b8565b600082601f830112612554578081fd5b813561256261231982613538565b81815291506020808301908481018184028601820187101561258357600080fd5b60005b8481101561236757813584529282019290820190600101612586565b80356001600160401b038116811461171d57600080fd5b6000602082840312156125ca578081fd5b813561171a81613583565b600080604083850312156125e7578081fd5b82356125f281613583565b9150602083013561260281613598565b809150509250929050565b60008060008060808587031215612622578182fd5b843561262d81613583565b93506020850135925060408501356001600160401b0381111561264e578283fd5b61265a87828801612544565b925050606085013561266b81613583565b939692955090935050565b6000806000806080858703121561268b578384fd5b84356001600160401b03808211156126a1578586fd5b6126ad88838901612372565b955060208701359150808211156126c2578485fd5b506126cf878288016122fb565b93505060408501356126e081613583565b9150606085013561266b81613583565b600080600060608486031215612704578081fd5b83356001600160401b038082111561271a578283fd5b61272687838801612489565b9450602086013591508082111561273b578283fd5b612747878388016123ca565b9350604086013591508082111561275c578283fd5b50612769868287016122fb565b9150509250925092565b600060208284031215612784578081fd5b81356001600160401b03811115612799578182fd5b6116d084828501612544565b6000806000606084860312156127b9578081fd5b83356001600160401b038111156127ce578182fd5b6127da86828701612544565b93505060208401356127eb81613583565b915060408401356127fb81613583565b809150509250925092565b6000806000806080858703121561281b578182fd5b84356001600160401b0380821115612831578384fd5b61283d88838901612544565b9550602091508187013561285081613583565b9450604087013581811115612863578485fd5b61286f89828a016122fb565b945050606087013581811115612883578384fd5b87019050601f81018813612895578283fd5b80356128a361231982613538565b81815283810190838501858402850186018c10156128bf578687fd5b8694505b838510156128e15780358352600194909401939185019185016128c3565b50979a9699509497505050505050565b60008060008060008060008060006101208a8c03121561290f578687fd5b89356001600160401b0380821115612925578889fd5b6129318d838e01612544565b9a506129408d60208e016122f0565b995061294f8d60408e016125a2565b985061295e8d60608e016125a2565b975061296d8d60808e016122f0565b965060a08c0135955060c08c0135915080821115612989578485fd5b6129958d838e01612372565b945060e08c01359150808211156129aa578384fd5b506129b78c828d016122fb565b9250506129c88b6101008c016122f0565b90509295985092959850929598565b6000602082840312156129e8578081fd5b815161171a81613598565b600060208284031215612a04578081fd5b5035919050565b600060208284031215612a1c578081fd5b81356001600160401b038116811461171a578182fd5b600080600080600060a08688031215612a49578283fd5b612a5387876125a2565b945060208601356001600160401b0380821115612a6e578485fd5b612a7a89838a01612489565b95506040880135915080821115612a8f578485fd5b612a9b89838a016123ca565b94506060880135915080821115612ab0578283fd5b612abc89838a016122fb565b93506080880135915080821115612ad1578283fd5b50612ade88828901612544565b9150509295509295909350565b6000815180845260208085019450808401835b83811015612b1a57815187529582019590820190600101612afe565b509495945050505050565b60006bffffffffffffffffffffffff19808660601b1683526014830185516020808801855b83811015612b6657815185529382019390820190600101612b4a565b5050505060609490941b168352505060140192915050565b60008251612b90818460208701613557565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526001600160401b039190911660208301526001600160801b0316604082015260600190565b60006020825261171a6020830184612aeb565b600060c08252612c4760c0830189612aeb565b6001600160401b0397881660208401529590961660408201526001600160801b039390931660608401526001600160a01b0391909116608083015260a09091015292915050565b901515815260200190565b90815260200190565b6001600160401b0391909116815260200190565b6000602082528251806020840152612cd5816040850160208701613557565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602f908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f64206f60408201526e19880c081b9bdd08185b1b1bddd959608a1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526039908201527f53746f726167654d616e616765723a206e6f7420706f737369626c6520746f2060408201527f696e746572616374207769746874207468697320746f6b656e00000000000000606082015260800190565b60208082526031908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f6420656040820152700f0c6cacac840dac2f05c40d8cadccee8d607b1b606082015260800190565b60208082526035908201527f53746f726167654d616e616765723a204f6666657220666f72207468697320506040820152741c9bdd9a59195c88191bd95cdb89dd08195e1a5cdd605a1b606082015260800190565b60208082526032908201527f53746f726167654d616e616765723a2041677265656d656e7420616c72656164604082015271792072616e206f7574206f662066756e647360701b606082015260800190565b60208082526021908201527f53746f726167654d616e616765723a20416d6f756e7420697320746f6f2062696040820152606760f81b606082015260800190565b60208082526023908201527f53746f726167654d616e616765723a204e6f7468696e6720746f20776974686460408201526272617760e81b606082015260800190565b60208082526049908201527f53746f726167654d616e616765723a2046756e6473206465706f73697465642060408201527f68617320746f20626520666f72206174206c65617374206f6e652062696c6c696060820152681b99c81c195c9a5bd960ba1b608082015260a00190565b6020808252602d908201527f53746f726167654d616e616765723a20496e73756666696369656e74204f666660408201526c6572277320636170616369747960981b606082015260800190565b6020808252602c908201527f53746f726167654d616e616765723a2053697a652068617320746f206265206260408201526b06967676572207468656e20360a41b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a205072696365206e6f7420617661696c6160408201526a626c6520616e796d6f726560a81b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526036908201527f53746f726167654d616e616765723a2041677265656d656e7420666f722074686040820152751a5cc813d999995c88191bd95cdb89dd08195e1a5cdd60521b606082015260800190565b60208082526028908201527f53746f726167654d616e616765723a20546f6b656e206973206e6f74207768696040820152671d195b1a5cdd195960c21b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a2070726f7669646572206973206e6f742060408201526a1dda1a5d195b1a5cdd195960aa1b606082015260800190565b60208082526024908201527f53746f726167654d616e616765723a2041677265656d656e74206e6f742061636040820152637469766560e01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526034908201527f53746f726167654d616e616765723a2043617061636974792068617320746f2060408201527362652067726561746572207468656e207a65726f60601b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f53746f726167654d616e616765723a2041677265656d656e7420697320696e61604082015264637469766560d81b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f53746f726167654d616e616765723a2042696c6c696e6720707269636520646f60408201527432b9b713ba1032bc34b9ba103337b91027b33332b960591b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252818101527f53746f726167654d616e616765723a205472616e73666572206661696c65642e604082015260600190565b6001600160401b0392831681529116602082015260400190565b6040518181016001600160401b038111828210171561353057600080fd5b604052919050565b60006001600160401b0382111561354d578081fd5b5060209081020190565b60005b8381101561357257818101518382015260200161355a565b8381111561180b5750506000910152565b6001600160a01b0381168114610a7857600080fd5b8015158114610a7857600080fd5b6001600160801b0381168114610a7857600080fdfea2646970667358221220554072cf6065a6484c639b2105706903aa9b589eb9d2aea632bbfaf2ad71781664736f6c634300060c0033",
  "deployedBytecode": "0x6080604052600436106101815760003560e01c806382c4dba5116100d1578063b58596931161008a578063dc4aac9e11610064578063dc4aac9e1461041f578063ec5cdf991461043f578063f2fde38b1461045f578063f650ca741461047f57610181565b8063b5859693146103d7578063bf317abb146103ec578063d245599e1461040c57610181565b806382c4dba5146103125780638456cb59146103325780638da5cb5b146103475780638f5c5fc8146103695780639aad18ca14610397578063ab37f486146103b757610181565b8063398887051161013e5780635c975abb116101185780635c975abb146102a6578063699ca55f146102c8578063715018a6146102e85780638129fc1c146102fd57610181565b806339888705146102515780633beb26c4146102715780633f4ba83a1461029157610181565b80631f3477a5146101865780632691c085146101a857806327beac27146101bb5780632fd09ef9146101f1578063325b29411461021157806337f4329d14610231575b600080fd5b34801561019257600080fd5b506101a66101a1366004612806565b61049f565b005b6101a66101b636600461260d565b61074e565b3480156101c757600080fd5b506101db6101d63660046125b9565b610a4b565b6040516101e89190612c99565b60405180910390f35b3480156101fd57600080fd5b506101a661020c366004612773565b610a6f565b34801561021d57600080fd5b506101a661022c3660046126f0565b610a7b565b34801561023d57600080fd5b506101a661024c366004612a32565b610b1d565b34801561025d57600080fd5b506101a661026c3660046125d5565b610bac565b34801561027d57600080fd5b506101a661028c3660046129f3565b610c0c565b34801561029d57600080fd5b506101a6610c11565b3480156102b257600080fd5b506102bb610c72565b6040516101e89190612c8e565b3480156102d457600080fd5b506101a66102e33660046129f3565b610c7b565b3480156102f457600080fd5b506101a6610c86565b34801561030957600080fd5b506101a6610d05565b34801561031e57600080fd5b506101a661032d3660046125d5565b610d97565b34801561033e57600080fd5b506101a6610df7565b34801561035357600080fd5b5061035c610e57565b6040516101e89190612b9d565b34801561037557600080fd5b506103896103843660046125b9565b610e66565b6040516101e89291906134f8565b3480156103a357600080fd5b506102bb6103b23660046125b9565b610e8c565b3480156103c357600080fd5b506102bb6103d23660046125b9565b610ea1565b3480156103e357600080fd5b506101a6610eb6565b3480156103f857600080fd5b506101db6104073660046127a5565b610f73565b6101a661041a3660046128f1565b610faa565b34801561042b57600080fd5b506101a661043a366004612676565b61141e565b34801561044b57600080fd5b506102bb61045a3660046125b9565b611464565b34801561046b57600080fd5b506101a661047a3660046125b9565b61148a565b34801561048b57600080fd5b506101a661049a366004612a0b565b611541565b6001600160a01b038316600090815260c960205260408120905b83518110156107465760008382815181106104d057fe5b6020026020010151905060008583815181106104e857fe5b6020026020010151905060006104ff893384610f73565b60008181526002808801602052604090912090810154919250906001600160401b03166105475760405162461bcd60e51b815260040161053e90613139565b60405180910390fd5b6002810154600090600160401b90046001600160801b031661056e575060018101546105f5565b600282015482546040805160a0810182526001600160801b03808416808352600160801b9094046001600160401b03908116602084015260018801549383019390935291841660608201819052600160401b909404821660808201526105f2939290920216906105ec906105e19061162c565b6001860154906116d8565b906116d8565b90505b846105fe578094505b8085111561061e5760405162461bcd60e51b815260040161053e90612f38565b600182015461062d90866116d8565b60018301558461064f5760405162461bcd60e51b815260040161053e90612f79565b61065884611723565b156106df576000336001600160a01b03168660405161067690612b9a565b60006040518083038185875af1925050503d80600081146106b3576040519150601f19603f3d011682016040523d82523d6000602084013e6106b8565b606091505b50509050806106d95760405162461bcd60e51b815260040161053e906133c3565b506106f3565b6106f36001600160a01b0385163387611730565b836001600160a01b0316837f579b45b1ee6c41a979ca183763f8a18021bb54fcd590cf1be2821e4abe31fd8e8760405161072d9190612c99565b60405180910390a35050600190930192506104b9915050565b505050505050565b60975460ff16156107715760405162461bcd60e51b815260040161053e9061310f565b6001600160a01b038116600090815260cb6020526040902054819060ff166107ab5760405162461bcd60e51b815260040161053e906131d7565b60006107b8843388610f73565b6001600160a01b038716600090815260ca602052604090205490915060ff166107f35760405162461bcd60e51b815260040161053e9061318f565b6001600160a01b038316600090815260c9602052604090208054600160401b90046001600160401b03166108395760405162461bcd60e51b815260040161053e90612e91565b600082815260028083016020526040909120908101546001600160401b03166108745760405162461bcd60e51b815260040161053e90613139565b6002810154600160401b90046001600160801b03166108a55760405162461bcd60e51b815260040161053e90613222565b80546001600160a01b038916600090815260018401602090815260408083206001600160401b03600160801b86041684529091529020546001600160801b039081169116146109065760405162461bcd60e51b815260040161053e906130c4565b6002810154815461092b916001600160801b03909116906001600160401b031661178b565b6040805160a08101825283546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018601549383019390935260028501549081166060830152600160401b9004909116608082015261099b906109909061162c565b6001840154906116d8565b10156109b95760405162461bcd60e51b815260040161053e90612ee6565b60006109c489611723565b905080156109d0573497505b60018201546109df90896117c5565b6001830155806109fe576109fe6001600160a01b038a1633308b6117ea565b886001600160a01b0316847f5ac5c9c49f143d64d36d4eb69c1624c8670cb426b3f952830187c279a51009cc8a604051610a389190612c99565b60405180910390a3505050505050505050565b6001600160a01b0316600090815260c960205260409020546001600160401b031690565b610a7881611811565b50565b60975460ff1615610a9e5760405162461bcd60e51b815260040161053e9061310f565b33600081815260cb602052604090205460ff16610acd5760405162461bcd60e51b815260040161053e906131d7565b33600090815260c9602052604090208054600160401b90046001600160401b0316610b0a5760405162461bcd60e51b815260040161053e90612e91565b610b1681868686611855565b5050505050565b60975460ff1615610b405760405162461bcd60e51b815260040161053e9061310f565b33600081815260cb602052604090205460ff16610b6f5760405162461bcd60e51b815260040161053e906131d7565b33600090815260c960205260409020610b8787611541565b610b9381878787611855565b825115610ba357610ba383611811565b50505050505050565b610bb46118fc565b6065546001600160a01b03908116911614610be15760405162461bcd60e51b815260040161053e906132a7565b6001600160a01b0391909116600090815260ca60205260409020805460ff1916911515919091179055565b60cc55565b610c196118fc565b6065546001600160a01b03908116911614610c465760405162461bcd60e51b815260040161053e906132a7565b60975460ff16610c685760405162461bcd60e51b815260040161053e90612ce9565b610c70611900565b565b60975460ff1690565b60cc80549091019055565b610c8e6118fc565b6065546001600160a01b03908116911614610cbb5760405162461bcd60e51b815260040161053e906132a7565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff1680610d1e5750610d1e61196c565b80610d2c575060005460ff16155b610d485760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff16158015610d73576000805460ff1961ff0019909116610100171660011790555b610d7b611972565b610d836119f0565b8015610a78576000805461ff001916905550565b610d9f6118fc565b6065546001600160a01b03908116911614610dcc5760405162461bcd60e51b815260040161053e906132a7565b6001600160a01b0391909116600090815260cb60205260409020805460ff1916911515919091179055565b610dff6118fc565b6065546001600160a01b03908116911614610e2c5760405162461bcd60e51b815260040161053e906132a7565b60975460ff1615610e4f5760405162461bcd60e51b815260040161053e9061310f565b610c70611a6e565b6065546001600160a01b031690565b60c9602052600090815260409020546001600160401b0380821691600160401b90041682565b60cb6020526000908152604090205460ff1681565b60ca6020526000908152604090205460ff1681565b33600081815260cb602052604090205460ff16610ee55760405162461bcd60e51b815260040161053e906131d7565b33600090815260c9602052604090208054600160401b90046001600160401b0316610f225760405162461bcd60e51b815260040161053e90612e91565b805467ffffffffffffffff60401b1916815560405133907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae390610f6790600090612ca2565b60405180910390a25050565b6000828483604051602001610f8a93929190612b25565b6040516020818303038152906040528051906020012090505b9392505050565b60975460ff1615610fcd5760405162461bcd60e51b815260040161053e9061310f565b6001600160a01b038816600090815260cb602052604090205460ff166110055760405162461bcd60e51b815260040161053e906131d7565b6001600160a01b038816600090815260c9602052604090206001600160401b0387166110435760405162461bcd60e51b815260040161053e90612d17565b6000886001600160401b03161161106c5760405162461bcd60e51b815260040161053e90613078565b8054600160401b90046001600160401b031661109a5760405162461bcd60e51b815260040161053e90612e91565b6001600160a01b038616600090815260ca602052604090205460ff166110d25760405162461bcd60e51b815260040161053e90612de3565b8351156110e5576110e58484848c611ac7565b60006110f28b3389610f73565b6000818152600284810160205260409091200154909150600160401b90046001600160801b0316156111c557604080516001808252818301909252606091816020015b606081526020019060019003908161113557505060408051600180825281830190925291925060609190602080830190803683370190505090508c8260008151811061117d57fe5b6020026020010181905250338160008151811061119657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506111c282828b8f611ac7565b50505b6001600160a01b038716600090815260018301602090815260408083206001600160401b038c1684529091529020546001600160801b03168061121a5760405162461bcd60e51b815260040161053e90613424565b6000828152600284016020526040902061123389611723565b1561123c573497505b600181015461124b90896117c5565b600182015561126c6001600160401b038c166001600160801b03841661178b565b8160010154101561128f5760405162461bcd60e51b815260040161053e90612fbc565b60028101805467ffffffffffffffff19166001600160401b038d81169190911790915581546001600160801b0319166001600160801b0384161767ffffffffffffffff60801b1916600160801b918c16919091021781556112ee611df7565b6002820180546001600160801b0392909216600160401b02600160401b600160c01b03199092169190911790556001600160a01b038c16600090815260c960205260409020805490945061134f906001600160401b03908116908d166117c5565b845467ffffffffffffffff19166001600160401b0391821617808655600160401b81048216911611156113945760405162461bcd60e51b815260040161053e9061302b565b61139d89611723565b6113b6576113b66001600160a01b038a1633308b6117ea565b8b6001600160a01b0316336001600160a01b03167f8c1ead7cd014d31bcde974cc4762a98cce33de4fbda569fbcc73f8f276212fff8f8e8e878f886001015460405161140796959493929190612c34565b60405180910390a350505050505050505050505050565b6001600160a01b038116600090815260cb6020526040902054819060ff166114585760405162461bcd60e51b815260040161053e906131d7565b610b1685858585611ac7565b6001600160a01b0316600090815260c960205260409020546001600160401b0316151590565b6114926118fc565b6065546001600160a01b039081169116146114bf5760405162461bcd60e51b815260040161053e906132a7565b6001600160a01b0381166114e55760405162461bcd60e51b815260040161053e90612d66565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b60975460ff16156115645760405162461bcd60e51b815260040161053e9061310f565b33600081815260cb602052604090205460ff166115935760405162461bcd60e51b815260040161053e906131d7565b6001600160401b0382166115b95760405162461bcd60e51b815260040161053e906132dc565b33600081815260c9602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b0387160217815590519091907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae39061161f908690612ca2565b60405180910390a2505050565b60008061165c83600001516001600160801b031684606001516001600160401b031661178b90919063ffffffff16565b9050600061169084602001516001600160401b031661168a86608001516001600160801b03166105ec611df7565b90611dfd565b9050600061169e828461178b565b905084604001518111156116d0576116cd836116c7858860400151611dfd90919063ffffffff16565b9061178b565b90505b949350505050565b600061171a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e3f565b90505b92915050565b6001600160a01b03161590565b6117868363a9059cbb60e01b848460405160240161174f929190612bd5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e6b565b505050565b60008261179a5750600061171d565b828202828482816117a757fe5b041461171a5760405162461bcd60e51b815260040161053e90613266565b60008282018381101561171a5760405162461bcd60e51b815260040161053e90612dac565b61180b846323b872dd60e01b85858560405160240161174f93929190612bb1565b50505050565b336001600160a01b03167f8e9ae80d46259102dfbf4ae6121dbe6548e85c8c0494163e8e0bf0e87bcd58768260405161184a9190612c21565b60405180910390a250565b60005b8151811015610b165760005b84828151811061187057fe5b6020026020010151518110156118f3576118eb8684848151811061189057fe5b60200260200101518785815181106118a457fe5b602002602001015184815181106118b757fe5b60200260200101518786815181106118cb57fe5b602002602001015185815181106118de57fe5b6020026020010151611efa565b600101611864565b50600101611858565b3390565b60975460ff166119225760405162461bcd60e51b815260040161053e90612ce9565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6119556118fc565b6040516119629190612b9d565b60405180910390a1565b303b1590565b600054610100900460ff168061198b575061198b61196c565b80611999575060005460ff16155b6119b55760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff161580156119e0576000805460ff1961ff0019909116610100171660011790555b6119e8611fe9565b610d8361206a565b600054610100900460ff1680611a095750611a0961196c565b80611a17575060005460ff16155b611a335760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff16158015611a5e576000805460ff1961ff0019909116610100171660011790555b611a66611fe9565b610d83612144565b60975460ff1615611a915760405162461bcd60e51b815260040161053e9061310f565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119556118fc565b6001600160a01b038116600090815260c96020526040812090805b86518160ff161015611d4c576000611b27888360ff1681518110611b0257fe5b6020026020010151888460ff1681518110611b1957fe5b602002602001015188610f73565b60008181526002808701602052604090912090810154919250906001600160401b0316611b665760405162461bcd60e51b815260040161053e90613139565b6002810154600160401b90046001600160801b0316611b975760405162461bcd60e51b815260040161053e9061337e565b6040805160a08101825282546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018501549383019390935260028401549081166060830152600160401b90049091166080820152600090611bfb9061162c565b90508015611d41576001820154611c1290826116d8565b6001830155611c2185826117c5565b60028301548354919650611c47916001600160801b0316906001600160401b031661178b565b82600101541015611ccd57600282018054600160401b600160c01b031981169091558654611c81916001600160401b0391821691166116d8565b865467ffffffffffffffff19166001600160401b039190911617865560405183907f28b8eb5ccfb9c485b6ee9be3b0153679351f87ca0753786218a455bc3bbe5fdf90600090a2611cfe565b611cd5611df7565b8260020160086101000a8154816001600160801b0302191690836001600160801b031602179055505b876001600160a01b0316837f14f0f588a0fd7eb2bc9954bd5b8b1ff7006d486ac28b7541bc966bf102b9756183604051611d389190612c99565b60405180910390a35b505050600101611ae2565b50801561074657611d5c84611723565b15611de3576000836001600160a01b031682604051611d7a90612b9a565b60006040518083038185875af1925050503d8060008114611db7576040519150601f19603f3d011682016040523d82523d6000602084013e611dbc565b606091505b5050905080611ddd5760405162461bcd60e51b815260040161053e906134c3565b50610746565b6107466001600160a01b0385168483611730565b60cc5490565b600061171a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121d0565b60008184841115611e635760405162461bcd60e51b815260040161053e9190612cb6565b505050900390565b6060611ec0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122079092919063ffffffff16565b8051909150156117865780806020019051810190611ede91906129d7565b6117865760405162461bcd60e51b815260040161053e90613479565b62ed4e006001600160401b0383161115611f265760405162461bcd60e51b815260040161053e90612e40565b6001600160a01b038316600090815260ca602052604090205460ff16611f5e5760405162461bcd60e51b815260040161053e9061318f565b6001600160a01b038316600090815260018501602090815260408083206001600160401b03861684529091529081902080546001600160801b0319166001600160801b0384161790555133907f7eec1797ef3c639736e76e7f22565caf759bb674dab35235349e6879d0a2c14890611fdb90869086908690612bee565b60405180910390a250505050565b600054610100900460ff1680612002575061200261196c565b80612010575060005460ff16155b61202c5760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff16158015610d83576000805460ff1961ff0019909116610100171660011790558015610a78576000805461ff001916905550565b600054610100900460ff1680612083575061208361196c565b80612091575060005460ff16155b6120ad5760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff161580156120d8576000805460ff1961ff0019909116610100171660011790555b60006120e26118fc565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610a78576000805461ff001916905550565b600054610100900460ff168061215d575061215d61196c565b8061216b575060005460ff16155b6121875760405162461bcd60e51b815260040161053e90613330565b600054610100900460ff161580156121b2576000805460ff1961ff0019909116610100171660011790555b6097805460ff191690558015610a78576000805461ff001916905550565b600081836121f15760405162461bcd60e51b815260040161053e9190612cb6565b5060008385816121fd57fe5b0495945050505050565b60606116d084846000858561221b856122b1565b6122375760405162461bcd60e51b815260040161053e906133ed565b60006060866001600160a01b031685876040516122549190612b7e565b60006040518083038185875af1925050503d8060008114612291576040519150601f19603f3d011682016040523d82523d6000602084013e612296565b606091505b50915091506122a68282866122b7565b979650505050505050565b3b151590565b606083156122c6575081610fa3565b8251156122d65782518084602001fd5b8160405162461bcd60e51b815260040161053e9190612cb6565b803561171d81613583565b600082601f83011261230b578081fd5b813561231e61231982613538565b613512565b81815291506020808301908481018184028601820187101561233f57600080fd5b60005b8481101561236757813561235581613583565b84529282019290820190600101612342565b505050505092915050565b600082601f830112612382578081fd5b813561239061231982613538565b818152915060208083019084810160005b84811015612367576123b8888484358a0101612544565b845292820192908201906001016123a1565b600082601f8301126123da578081fd5b81356123e861231982613538565b818152915060208083019084810160005b84811015612367578135870188603f82011261241457600080fd5b8381013561242461231982613538565b818152858101906040848101888502860182018e101561244357600080fd5b600095505b84861015612472578035915061245d826135a6565b81845260019590950194928801928801612448565b5050875250505092820192908201906001016123f9565b600082601f830112612499578081fd5b81356124a761231982613538565b818152915060208083019084810160005b84811015612367578135870188603f8201126124d357600080fd5b838101356124e361231982613538565b818152858101906040848101888502860182018e101561250257600080fd5b600095505b8486101561252d576125198e826125a2565b845260019590950194928801928801612507565b5050875250505092820192908201906001016124b8565b600082601f830112612554578081fd5b813561256261231982613538565b81815291506020808301908481018184028601820187101561258357600080fd5b60005b8481101561236757813584529282019290820190600101612586565b80356001600160401b038116811461171d57600080fd5b6000602082840312156125ca578081fd5b813561171a81613583565b600080604083850312156125e7578081fd5b82356125f281613583565b9150602083013561260281613598565b809150509250929050565b60008060008060808587031215612622578182fd5b843561262d81613583565b93506020850135925060408501356001600160401b0381111561264e578283fd5b61265a87828801612544565b925050606085013561266b81613583565b939692955090935050565b6000806000806080858703121561268b578384fd5b84356001600160401b03808211156126a1578586fd5b6126ad88838901612372565b955060208701359150808211156126c2578485fd5b506126cf878288016122fb565b93505060408501356126e081613583565b9150606085013561266b81613583565b600080600060608486031215612704578081fd5b83356001600160401b038082111561271a578283fd5b61272687838801612489565b9450602086013591508082111561273b578283fd5b612747878388016123ca565b9350604086013591508082111561275c578283fd5b50612769868287016122fb565b9150509250925092565b600060208284031215612784578081fd5b81356001600160401b03811115612799578182fd5b6116d084828501612544565b6000806000606084860312156127b9578081fd5b83356001600160401b038111156127ce578182fd5b6127da86828701612544565b93505060208401356127eb81613583565b915060408401356127fb81613583565b809150509250925092565b6000806000806080858703121561281b578182fd5b84356001600160401b0380821115612831578384fd5b61283d88838901612544565b9550602091508187013561285081613583565b9450604087013581811115612863578485fd5b61286f89828a016122fb565b945050606087013581811115612883578384fd5b87019050601f81018813612895578283fd5b80356128a361231982613538565b81815283810190838501858402850186018c10156128bf578687fd5b8694505b838510156128e15780358352600194909401939185019185016128c3565b50979a9699509497505050505050565b60008060008060008060008060006101208a8c03121561290f578687fd5b89356001600160401b0380821115612925578889fd5b6129318d838e01612544565b9a506129408d60208e016122f0565b995061294f8d60408e016125a2565b985061295e8d60608e016125a2565b975061296d8d60808e016122f0565b965060a08c0135955060c08c0135915080821115612989578485fd5b6129958d838e01612372565b945060e08c01359150808211156129aa578384fd5b506129b78c828d016122fb565b9250506129c88b6101008c016122f0565b90509295985092959850929598565b6000602082840312156129e8578081fd5b815161171a81613598565b600060208284031215612a04578081fd5b5035919050565b600060208284031215612a1c578081fd5b81356001600160401b038116811461171a578182fd5b600080600080600060a08688031215612a49578283fd5b612a5387876125a2565b945060208601356001600160401b0380821115612a6e578485fd5b612a7a89838a01612489565b95506040880135915080821115612a8f578485fd5b612a9b89838a016123ca565b94506060880135915080821115612ab0578283fd5b612abc89838a016122fb565b93506080880135915080821115612ad1578283fd5b50612ade88828901612544565b9150509295509295909350565b6000815180845260208085019450808401835b83811015612b1a57815187529582019590820190600101612afe565b509495945050505050565b60006bffffffffffffffffffffffff19808660601b1683526014830185516020808801855b83811015612b6657815185529382019390820190600101612b4a565b5050505060609490941b168352505060140192915050565b60008251612b90818460208701613557565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526001600160401b039190911660208301526001600160801b0316604082015260600190565b60006020825261171a6020830184612aeb565b600060c08252612c4760c0830189612aeb565b6001600160401b0397881660208401529590961660408201526001600160801b039390931660608401526001600160a01b0391909116608083015260a09091015292915050565b901515815260200190565b90815260200190565b6001600160401b0391909116815260200190565b6000602082528251806020840152612cd5816040850160208701613557565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602f908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f64206f60408201526e19880c081b9bdd08185b1b1bddd959608a1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526039908201527f53746f726167654d616e616765723a206e6f7420706f737369626c6520746f2060408201527f696e746572616374207769746874207468697320746f6b656e00000000000000606082015260800190565b60208082526031908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f6420656040820152700f0c6cacac840dac2f05c40d8cadccee8d607b1b606082015260800190565b60208082526035908201527f53746f726167654d616e616765723a204f6666657220666f72207468697320506040820152741c9bdd9a59195c88191bd95cdb89dd08195e1a5cdd605a1b606082015260800190565b60208082526032908201527f53746f726167654d616e616765723a2041677265656d656e7420616c72656164604082015271792072616e206f7574206f662066756e647360701b606082015260800190565b60208082526021908201527f53746f726167654d616e616765723a20416d6f756e7420697320746f6f2062696040820152606760f81b606082015260800190565b60208082526023908201527f53746f726167654d616e616765723a204e6f7468696e6720746f20776974686460408201526272617760e81b606082015260800190565b60208082526049908201527f53746f726167654d616e616765723a2046756e6473206465706f73697465642060408201527f68617320746f20626520666f72206174206c65617374206f6e652062696c6c696060820152681b99c81c195c9a5bd960ba1b608082015260a00190565b6020808252602d908201527f53746f726167654d616e616765723a20496e73756666696369656e74204f666660408201526c6572277320636170616369747960981b606082015260800190565b6020808252602c908201527f53746f726167654d616e616765723a2053697a652068617320746f206265206260408201526b06967676572207468656e20360a41b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a205072696365206e6f7420617661696c6160408201526a626c6520616e796d6f726560a81b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526036908201527f53746f726167654d616e616765723a2041677265656d656e7420666f722074686040820152751a5cc813d999995c88191bd95cdb89dd08195e1a5cdd60521b606082015260800190565b60208082526028908201527f53746f726167654d616e616765723a20546f6b656e206973206e6f74207768696040820152671d195b1a5cdd195960c21b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a2070726f7669646572206973206e6f742060408201526a1dda1a5d195b1a5cdd195960aa1b606082015260800190565b60208082526024908201527f53746f726167654d616e616765723a2041677265656d656e74206e6f742061636040820152637469766560e01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526034908201527f53746f726167654d616e616765723a2043617061636974792068617320746f2060408201527362652067726561746572207468656e207a65726f60601b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f53746f726167654d616e616765723a2041677265656d656e7420697320696e61604082015264637469766560d81b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f53746f726167654d616e616765723a2042696c6c696e6720707269636520646f60408201527432b9b713ba1032bc34b9ba103337b91027b33332b960591b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252818101527f53746f726167654d616e616765723a205472616e73666572206661696c65642e604082015260600190565b6001600160401b0392831681529116602082015260400190565b6040518181016001600160401b038111828210171561353057600080fd5b604052919050565b60006001600160401b0382111561354d578081fd5b5060209081020190565b60005b8381101561357257818101518382015260200161355a565b8381111561180b5750506000910152565b6001600160a01b0381168114610a7857600080fd5b8015158114610a7857600080fd5b6001600160801b0381168114610a7857600080fdfea2646970667358221220554072cf6065a6484c639b2105706903aa9b589eb9d2aea632bbfaf2ad71781664736f6c634300060c0033",
  "immutableReferences": {},
  "sourceMap": "123:488:4:-:0;;;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "123:488:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19283:1931:2;;;;;;;;;;-1:-1:-1;19283:1931:2;;;;;:::i;:::-;;:::i;:::-;;16849:1649;;;;;;:::i;:::-;;:::i;463:146:4:-;;;;;;;;;;-1:-1:-1;463:146:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9831:92:2;;;;;;;;;;-1:-1:-1;9831:92:2;;;;;:::i;:::-;;:::i;9138:455::-;;;;;;;;;;-1:-1:-1;9138:455:2;;;;;:::i;:::-;;:::i;6343:522::-;;;;;;;;;;-1:-1:-1;6343:522:2;;;;;:::i;:::-;;:::i;3947:140::-;;;;;;;;;;-1:-1:-1;3947:140:2;;;;;:::i;:::-;;:::i;383:74:4:-;;;;;;;;;;-1:-1:-1;383:74:4;;;;;:::i;:::-;;:::i;26959::2:-;;;;;;;;;;;;;:::i;1248:76:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;286:91:4:-;;;;;;;;;;-1:-1:-1;286:91:4;;;;;:::i;:::-;;:::i;1894:145:8:-;;;;;;;;;;;;;:::i;3596:101:2:-;;;;;;;;;;;;;:::i;4366:165::-;;;;;;;;;;-1:-1:-1;4366:165:2;;;;;:::i;:::-;;:::i;26796:73::-;;;;;;;;;;;;;:::i;1271:77:8:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2326:46:2:-;;;;;;;;;;-1:-1:-1;2326:46:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2629:53::-;;;;;;;;;;-1:-1:-1;2629:53:2;;;;;:::i;:::-;;:::i;2495:50::-;;;;;;;;;;-1:-1:-1;2495:50:2;;;;;:::i;:::-;;:::i;7628:308::-;;;;;;;;;;;;;:::i;27640:237::-;;;;;;;;;;-1:-1:-1;27640:237:2;;;;;:::i;:::-;;:::i;11869:4319::-;;;;;;:::i;:::-;;:::i;21915:447::-;;;;;;;;;;-1:-1:-1;21915:447:2;;;;;:::i;:::-;;:::i;24124:141::-;;;;;;;;;;-1:-1:-1;24124:141:2;;;;;:::i;:::-;;:::i;2188:240:8:-;;;;;;;;;;-1:-1:-1;2188:240:8;;;;;:::i;:::-;;:::i;6985:341:2:-;;;;;;;;;;-1:-1:-1;6985:341:2;;;;;:::i;:::-;;:::i;19283:1931::-;-1:-1:-1;;;;;19484:23:2;;19462:19;19484:23;;;:13;:23;;;;;;19517:1691;19537:6;:13;19533:1;:17;19517:1691;;;19571:14;19588:7;19596:1;19588:10;;;;;;;;;;;;;;19571:27;;19612:13;19628:6;19635:1;19628:9;;;;;;;;;;;;;;19612:25;;19651:26;19680:55;19702:13;19717:10;19729:5;19680:21;:55::i;:::-;19749:27;19779:43;;;:23;;;;:43;;;;;;19844:14;;;;19651:84;;-1:-1:-1;19779:43:2;-1:-1:-1;;;;;19844:14:2;19836:86;;;;-1:-1:-1;;;19836:86:2;;;;;;;:::i;:::-;;;;;;;;;19982:24;;;;19936:28;;-1:-1:-1;;;19982:24:2;;-1:-1:-1;;;;;19982:24:2;19978:545;;-1:-1:-1;20128:24:2;;;;19978:545;;;20475:14;;;;20450:22;;20391:31;;;;;;;;-1:-1:-1;;;;;20450:22:2;;;20391:31;;;-1:-1:-1;;;20391:31:2;;;-1:-1:-1;;;;;20391:31:2;;;;;;;20475:14;20391:31;;;;;;;;;;20475:14;;;20391:31;;;;;;-1:-1:-1;;;20391:31:2;;;;;;;;;20362:146;;20450:39;;;;20362:146;;:61;;20391:31;;:20;:31::i;:::-;20362:24;;;;;:28;:61::i;:::-;:65;;:146::i;:::-;20339:169;;19978:545;20541:11;20537:79;;20581:20;20572:29;;20537:79;20647:20;20637:6;:30;;20629:76;;;;-1:-1:-1;;;20629:76:2;;;;;;;:::i;:::-;20746:24;;;;:36;;20775:6;20746:28;:36::i;:::-;20719:24;;;:63;20804:10;20796:58;;;;-1:-1:-1;;;20796:58:2;;;;;;;:::i;:::-;20873:21;20888:5;20873:14;:21::i;:::-;20869:252;;;20915:12;20933:10;-1:-1:-1;;;;;20933:15:2;20956:6;20933:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20914:53;;;20993:7;20985:36;;;;-1:-1:-1;;;20985:36:2;;;;;;;:::i;:::-;20869:252;;;;21060:46;-1:-1:-1;;;;;21060:26:2;;21087:10;21099:6;21060:26;:46::i;:::-;21191:5;-1:-1:-1;;;;;21139:58:2;21163:18;21139:58;21183:6;21139:58;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;19552:3:2;;;;;-1:-1:-1;19517:1691:2;;-1:-1:-1;;19517:1691:2;;;19283:1931;;;;;:::o;16849:1649::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;29673:31:2;::::1;;::::0;;;:21:::1;:31;::::0;;;;;17039:8;;29673:31:::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;17059:26:::2;17088:55;17110:13;17125:10;17137:5;17088:21;:55::i;:::-;-1:-1:-1::0;;;;;17161:25:2;::::2;;::::0;;;:18:::2;:25;::::0;;;;;17059:84;;-1:-1:-1;17161:25:2::2;;17153:78;;;;-1:-1:-1::0;;;17153:78:2::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17263:23:2;::::2;17241:19;17263:23:::0;;;:13:::2;:23;::::0;;;;17304:19;;-1:-1:-1;;;17304:19:2;::::2;-1:-1:-1::0;;;;;17304:19:2::2;17296:90;;;;-1:-1:-1::0;;;17296:90:2::2;;;;;;;:::i;:::-;17396:27;17426:43:::0;;;:23:::2;::::0;;::::2;:43;::::0;;;;;17487:14;;::::2;::::0;-1:-1:-1;;;;;17487:14:2::2;17479:86;;;;-1:-1:-1::0;;;17479:86:2::2;;;;;;;:::i;:::-;17583:24;::::0;::::2;::::0;-1:-1:-1;;;17583:24:2;::::2;-1:-1:-1::0;;;;;17583:24:2::2;17575:78;;;;-1:-1:-1::0;;;17575:78:2::2;;;;;;;:::i;:::-;17746:22:::0;;-1:-1:-1;;;;;17684:33:2;::::2;17746:22;17684:33:::0;;;17746:22;17684:26;::::2;:33;::::0;;;;;;;-1:-1:-1;;;;;;;;17718:23:2;::::2;;17684:58:::0;;;;;;;;-1:-1:-1;;;;;17684:58:2;;::::2;17746:22:::0;::::2;17684:84;17663:174;;;;-1:-1:-1::0;;;17663:174:2::2;;;;;;;:::i;:::-;17960:14;::::0;::::2;::::0;17933:22;;:42:::2;::::0;-1:-1:-1;;;;;17933:22:2;;::::2;::::0;-1:-1:-1;;;;;17960:14:2::2;17933:26;:42::i;:::-;17897:31;::::0;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;17897:31:2;;::::2;::::0;;-1:-1:-1;;;;;;;;17897:31:2;;::::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;-1:-1:-1;;;17897:31:2;::::2;::::0;;::::2;::::0;;;;17868:61:::2;::::0;17897:31:::2;::::0;:20:::2;:31::i;:::-;17868:24;::::0;::::2;::::0;;:28:::2;:61::i;:::-;:107;;17847:204;;;;-1:-1:-1::0;;;17847:204:2::2;;;;;;;:::i;:::-;18061:18;18082:21;18097:5;18082:14;:21::i;:::-;18061:42;;18117:13;18113:62;;;18155:9;18146:18;;18113:62;18211:24;::::0;::::2;::::0;:36:::2;::::0;18240:6;18211:28:::2;:36::i;:::-;18184:24;::::0;::::2;:63:::0;18262:13;18257:162:::2;;18343:65;-1:-1:-1::0;;;;;18343:30:2;::::2;18374:10;18394:4;18401:6:::0;18343:30:::2;:65::i;:::-;18485:5;-1:-1:-1::0;;;;;18433:58:2::2;18457:18;18433:58;18477:6;18433:58;;;;;;:::i;:::-;;;;;;;;29762:1;;;;1515::9::1;16849:1649:2::0;;;;:::o;463:146:4:-;-1:-1:-1;;;;;562:23:4;536:7;562:23;;;:13;:23;;;;;:40;-1:-1:-1;;;;;562:40:4;;463:146::o;9831:92:2:-;9895:21;9908:7;9895:12;:21::i;:::-;9831:92;:::o;9138:455::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;9327:10:2::1;29673:31;::::0;;;:21:::1;:31;::::0;;;;;::::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;9385:10:::2;9349:19;9371:25:::0;;;:13:::2;:25;::::0;;;;9414:19;;-1:-1:-1;;;9414:19:2;::::2;-1:-1:-1::0;;;;;9414:19:2::2;9406:90;;;;-1:-1:-1::0;;;9406:90:2::2;;;;;;;:::i;:::-;9506:80;9541:5;9548:14;9564:13;9579:6;9506:34;:80::i;:::-;29762:1;1515::9::1;9138:455:2::0;;;:::o;6343:522::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;6584:10:2::1;29673:31;::::0;;;:21:::1;:31;::::0;;;;;::::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;6642:10:::2;6606:19;6628:25:::0;;;:13:::2;:25;::::0;;;;6663:26:::2;6680:8:::0;6663:16:::2;:26::i;:::-;6699:80;6734:5;6741:14;6757:13;6772:6;6699:34;:80::i;:::-;6793:14:::0;;:18;6789:70:::2;;6827:21;6840:7;6827:12;:21::i;:::-;29762:1;1515::9::1;6343:522:2::0;;;;;:::o;3947:140::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;4039:25:2;;;::::1;;::::0;;;:18:::1;:25;::::0;;;;:41;;-1:-1:-1;;4039:41:2::1;::::0;::::1;;::::0;;;::::1;::::0;;3947:140::o;383:74:4:-;436:4;:14;383:74::o;26959::2:-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;1668:7:9::1;::::0;::::1;;1660:40;;;;-1:-1:-1::0;;;1660:40:9::1;;;;;;;:::i;:::-;27016:10:2::2;:8;:10::i;:::-;26959:74::o:0;1248:76:9:-;1310:7;;;;1248:76;:::o;286:91:4:-;354:4;;;:16;;;347:23;;286:91::o;1894:145:8:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;1984:6:::1;::::0;1963:40:::1;::::0;2000:1:::1;::::0;-1:-1:-1;;;;;1984:6:8::1;::::0;1963:40:::1;::::0;2000:1;;1963:40:::1;2013:6;:19:::0;;-1:-1:-1;;;;;;2013:19:8::1;::::0;;1894:145::o;3596:101:2:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;3647:16:2::1;:14;:16::i;:::-;3673:17;:15;:17::i;:::-;1268:14:7::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;3596:101:2;:::o;4366:165::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;4470:38:2;;;::::1;;::::0;;;:21:::1;:38;::::0;;;;:54;;-1:-1:-1;;4470:54:2::1;::::0;::::1;;::::0;;;::::1;::::0;;4366:165::o;26796:73::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;1477:7:9::1;::::0;::::1;;1476:8;1468:37;;;;-1:-1:-1::0;;;1468:37:9::1;;;;;;;:::i;:::-;26854:8:2::2;:6;:8::i;1271:77:8:-:0;1335:6;;-1:-1:-1;;;;;1335:6:8;1271:77;:::o;2326:46:2:-;;;;;;;;;;;;-1:-1:-1;;;;;2326:46:2;;;;-1:-1:-1;;;2326:46:2;;;;:::o;2629:53::-;;;;;;;;;;;;;;;:::o;2495:50::-;;;;;;;;;;;;;;;:::o;7628:308::-;7681:10;29673:31;;;;:21;:31;;;;;;;;29665:87;;;;-1:-1:-1;;;29665:87:2;;;;;;;:::i;:::-;7739:10:::1;7703:19;7725:25:::0;;;:13:::1;:25;::::0;;;;7768:19;;-1:-1:-1;;;7768:19:2;::::1;-1:-1:-1::0;;;;;7768:19:2::1;7760:90;;;;-1:-1:-1::0;;;7760:90:2::1;;;;;;;:::i;:::-;7860:23:::0;;-1:-1:-1;;;;7860:23:2::1;::::0;;7898:31:::1;::::0;7915:10:::1;::::0;7898:31:::1;::::0;::::1;::::0;7882:1:::1;::::0;7898:31:::1;:::i;:::-;;;;;;;;29762:1;7628:308:::0;:::o;27640:237::-;27786:7;27839;27848:13;27863:5;27822:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27812:58;;;;;;27805:65;;27640:237;;;;;;:::o;11869:4319::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;12350:31:2;::::1;;::::0;;;:21:::1;:31;::::0;;;;;::::1;;12342:87;;;;-1:-1:-1::0;;;12342:87:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12461:23:2;::::1;12439:19;12461:23:::0;;;:13:::1;:23;::::0;;;;-1:-1:-1;;;;;12502:18:2;::::1;12494:78;;;;-1:-1:-1::0;;;12494:78:2::1;;;;;;;:::i;:::-;12597:1;12590:4;-1:-1:-1::0;;;;;12590:8:2::1;;12582:65;;;;-1:-1:-1::0;;;12582:65:2::1;;;;;;;:::i;:::-;12665:19:::0;;-1:-1:-1;;;12665:19:2;::::1;-1:-1:-1::0;;;;;12665:19:2::1;12657:90;;;;-1:-1:-1::0;;;12657:90:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12765:25:2;::::1;;::::0;;;:18:::1;:25;::::0;;;;;::::1;;12757:95;;;;-1:-1:-1::0;;;12757:95:2::1;;;;;;;:::i;:::-;13041:40:::0;;:44;13037:275:::1;;13101:200;13131:33;13182:27;13227:25;13278:8;13101:12;:200::i;:::-;13701:26;13730:55;13752:13;13767:10;13779:5;13730:21;:55::i;:::-;14023:43;::::0;;;:23:::1;::::0;;::::1;:43;::::0;;;;;:58:::1;::::0;:43;;-1:-1:-1;;;;14023:58:2;::::1;-1:-1:-1::0;;;;;14023:58:2::1;:63:::0;14019:423:::1;;14156:18;::::0;;14172:1:::1;14156:18:::0;;;;;::::1;::::0;;;14102:51:::1;::::0;14156:18:::1;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14216:16:2::1;::::0;;14230:1:::1;14216:16:::0;;;;;::::1;::::0;;;14102:72;;-1:-1:-1;14188:25:2::1;::::0;14216:16;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;14216:16:2::1;14188:44;;14284:13;14246:32;14279:1;14246:35;;;;;;;;;;;;;:51;;;;14325:10;14311:8;14320:1;14311:11;;;;;;;;;;;;;:24;-1:-1:-1::0;;;;;14311:24:2::1;;;-1:-1:-1::0;;;;;14311:24:2::1;;;::::0;::::1;14349:82;14362:32;14396:8;14406:5;14421:8;14349:12;:82::i;:::-;14019:423;;;-1:-1:-1::0;;;;;14474:33:2;::::1;14451:20;14474:33:::0;;;:26:::1;::::0;::::1;:33;::::0;;;;;;;-1:-1:-1;;;;;14474:48:2;::::1;::::0;;;;;;;;-1:-1:-1;;;;;14474:48:2::1;14540:17:::0;14532:83:::1;;;;-1:-1:-1::0;;;14532:83:2::1;;;;;;;:::i;:::-;14705:27;14735:43:::0;;;:23:::1;::::0;::::1;:43;::::0;;;;14967:21:::1;14982:5:::0;14967:14:::1;:21::i;:::-;14963:70;;;15013:9;15004:18;;14963:70;15070:24;::::0;::::1;::::0;:36:::1;::::0;15099:6;15070:28:::1;:36::i;:::-;15043:24;::::0;::::1;:63:::0;15165:22:::1;-1:-1:-1::0;;;;;15165:8:2;::::1;-1:-1:-1::0;;;;;15165:22:2;::::1;:8;:22::i;:::-;15137:9;:24;;;:50;;15116:170;;;;-1:-1:-1::0;;;15116:170:2::1;;;;;;;:::i;:::-;15296:14;::::0;::::1;:21:::0;;-1:-1:-1;;15296:21:2::1;-1:-1:-1::0;;;;;15296:21:2;;::::1;::::0;;;::::1;::::0;;;15327:37;;-1:-1:-1;;;;;;15327:37:2::1;-1:-1:-1::0;;;;;15327:37:2;::::1;;-1:-1:-1::0;;;;15374:39:2::1;-1:-1:-1::0;;;15374:39:2;;::::1;::::0;;;::::1;;::::0;;15578:7:::1;:5;:7::i;:::-;15543:24;::::0;::::1;:43:::0;;-1:-1:-1;;;;;15543:43:2;;;::::1;-1:-1:-1::0;;;15543:43:2::1;-1:-1:-1::0;;;;;;;;15543:43:2;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;15604:23:2;::::1;-1:-1:-1::0;15604:23:2;;;:13:::1;:23;::::0;;;;15669:22;;15604:23;;-1:-1:-1;15669:32:2::1;::::0;-1:-1:-1;;;;;15669:22:2;;::::1;::::0;:32;::::1;:26;:32::i;:::-;15637:65:::0;;-1:-1:-1;;15637:65:2::1;-1:-1:-1::0;;;;;15637:65:2;;::::1;;::::0;;;-1:-1:-1;;;15746:19:2;::::1;::::0;::::1;15720:22:::0;::::1;:45;;15712:103;;;;-1:-1:-1::0;;;15712:103:2::1;;;;;;;:::i;:::-;15831:21;15846:5;15831:14;:21::i;:::-;15826:118;;15868:65;-1:-1:-1::0;;;;;15868:30:2;::::1;15899:10;15919:4;15926:6:::0;15868:30:::1;:65::i;:::-;16035:8;-1:-1:-1::0;;;;;15958:223:2::1;16011:10;-1:-1:-1::0;;;;;15958:223:2::1;;15984:13;16057:4;16075:13;16102:12;16128:5;16147:9;:24;;;15958:223;;;;;;;;;;;:::i;:::-;;;;;;;;1515:1:9;;;;11869:4319:2::0;;;;;;;;;:::o;21915:447::-;-1:-1:-1;;;;;29673:31:2;;;;;;:21;:31;;;;;;22163:8;;29673:31;;29665:87;;;;-1:-1:-1;;;29665:87:2;;;;;;;:::i;:::-;22183:172:::1;22209:33;22256:27;22297:26;22337:8;22183:12;:172::i;24124:141::-:0;-1:-1:-1;;;;;24214:21:2;24190:4;24214:21;;;:13;:21;;;;;:38;-1:-1:-1;;;;;24214:38:2;:43;;;24124:141::o;2188:240:8:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;2276:22:8;::::1;2268:73;;;;-1:-1:-1::0;;;2268:73:8::1;;;;;;;:::i;:::-;2377:6;::::0;2356:38:::1;::::0;-1:-1:-1;;;;;2356:38:8;;::::1;::::0;2377:6:::1;::::0;2356:38:::1;::::0;2377:6:::1;::::0;2356:38:::1;2404:6;:17:::0;;-1:-1:-1;;;;;;2404:17:8::1;-1:-1:-1::0;;;;;2404:17:8;;;::::1;::::0;;;::::1;::::0;;2188:240::o;6985:341:2:-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;7069:10:2::1;29673:31;::::0;;;:21:::1;:31;::::0;;;;;::::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7099:13:2;::::2;7091:78;;;;-1:-1:-1::0;;;7091:78:2::2;;;;;;;:::i;:::-;7215:10;7179:19;7201:25:::0;;;:13:::2;:25;::::0;;;;;;7236:30;;-1:-1:-1;;;;7236:30:2::2;-1:-1:-1::0;;;;;;;;7236:30:2;::::2;;;::::0;;7281:38;;7201:25;;7215:10;7281:38:::2;::::0;::::2;::::0;7236:30;;7281:38:::2;:::i;:::-;;;;;;;;29762:1;1515::9::1;6985:341:2::0;:::o;27883:662::-;27964:7;28042:24;28069:42;28088:9;:22;;;-1:-1:-1;;;;;28069:42:2;:9;:14;;;-1:-1:-1;;;;;28069:18:2;;;:42;;;;:::i;:::-;28042:69;;28121:30;28154:66;28196:9;:23;;;-1:-1:-1;;;;;28154:66:2;:37;28166:9;:24;;;-1:-1:-1;;;;;28154:37:2;:7;:5;:7::i;:37::-;:41;;:66::i;:::-;28121:99;-1:-1:-1;28230:18:2;28251:44;28121:99;28278:16;28251:26;:44::i;:::-;28230:65;;28379:9;:24;;;28366:10;:37;28362:149;;;28432:68;28483:16;28432:46;28461:16;28432:9;:24;;;:28;;:46;;;;:::i;:::-;:50;;:68::i;:::-;28419:81;;28362:149;28528:10;27883:662;-1:-1:-1;;;;27883:662:2:o;1329:134:12:-;1387:7;1413:43;1417:1;1420;1413:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1406:50;;1329:134;;;;;:::o;29491:111:2:-;-1:-1:-1;;;;;29576:19:2;;;29491:111::o;704:175:15:-;786:86;806:5;836:23;;;861:2;865:5;813:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;813:58:15;;;;;;;;;;;;;;-1:-1:-1;;;;;813:58:15;-1:-1:-1;;;;;;813:58:15;;;;;;;;;;786:19;:86::i;:::-;704:175;;;:::o;2188:459:12:-;2246:7;2487:6;2483:45;;-1:-1:-1;2516:1:12;2509:8;;2483:45;2550:5;;;2554:1;2550;:5;:1;2573:5;;;;;:10;2565:56;;;;-1:-1:-1;;;2565:56:12;;;;;;;:::i;882:176::-;940:7;971:5;;;994:6;;;;986:46;;;;-1:-1:-1;;;986:46:12;;;;;;;:::i;885:203:15:-;985:96;1005:5;1035:27;;;1064:4;1070:2;1074:5;1012:68;;;;;;;;;;:::i;985:96::-;885:203;;;;:::o;29141:114:2:-;29228:10;-1:-1:-1;;;;;29213:35:2;;29240:7;29213:35;;;;;;:::i;:::-;;;;;;;;29141:114;:::o;23567:551::-;23826:9;23821:291;23841:6;:13;23837:1;:17;23821:291;;;23939:9;23934:168;23954:14;23969:1;23954:17;;;;;;;;;;;;;;:24;23950:1;:28;23934:168;;;24003:84;24027:5;24034:6;24041:1;24034:9;;;;;;;;;;;;;;24045:14;24060:1;24045:17;;;;;;;;;;;;;;24063:1;24045:20;;;;;;;;;;;;;;24067:13;24081:1;24067:16;;;;;;;;;;;;;;24084:1;24067:19;;;;;;;;;;;;;;24003:23;:84::i;:::-;23980:3;;23934:168;;;-1:-1:-1;23856:3:2;;23821:291;;931:104:6;1018:10;931:104;:::o;1950:117:9:-;1668:7;;;;1660:40;;;;-1:-1:-1;;;1660:40:9;;;;;;;:::i;:::-;2008:7:::1;:15:::0;;-1:-1:-1;;2008:15:9::1;::::0;;2038:22:::1;2047:12;:10;:12::i;:::-;2038:22;;;;;;:::i;:::-;;;;;;;;1950:117::o:0;1409:498:7:-;1820:4;1864:17;1895:7;1409:498;:::o;867:126:8:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;924:26:8::1;:24;:26::i;:::-;960;:24;:26::i;925:128:9:-:0;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;983:26:9::1;:24;:26::i;:::-;1019:27;:25;:27::i;1776:115::-:0;1477:7;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;1835:7:::1;:14:::0;;-1:-1:-1;;1835:14:9::1;1845:4;1835:14;::::0;;1864:20:::1;1871:12;:10;:12::i;24316:2393:2:-:0;-1:-1:-1;;;;;24577:23:2;;24555:19;24577:23;;;:13;:23;;;;;;24555:19;24639:1698;24661:32;:39;24657:1;:43;;;24639:1698;;;24721:26;24766:195;24809:32;24842:1;24809:35;;;;;;;;;;;;;;;;24866:27;24894:1;24866:30;;;;;;;;;;;;;;;;24918:25;24766:21;:195::i;:::-;24975:27;25005:43;;;:23;;;;:43;;;;;;25070:14;;;;24721:240;;-1:-1:-1;25005:43:2;-1:-1:-1;;;;;25070:14:2;25062:86;;;;-1:-1:-1;;;25062:86:2;;;;;;;:::i;:::-;25222:24;;;;-1:-1:-1;;;25222:24:2;;-1:-1:-1;;;;;25222:24:2;25214:79;;;;-1:-1:-1;;;25214:79:2;;;;;;;:::i;:::-;25329:31;;;;;;;;;;-1:-1:-1;;;;;25329:31:2;;;;;-1:-1:-1;;;;;;;;25329:31:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25329:31:2;;;;;;;;;25308:18;;25329:31;;:20;:31::i;:::-;25308:52;-1:-1:-1;25378:14:2;;25374:953;;25439:24;;;;:40;;25468:10;25439:28;:40::i;:::-;25412:24;;;:67;25510:26;:10;25525;25510:14;:26::i;:::-;25685:14;;;;25658:22;;25497:39;;-1:-1:-1;25658:42:2;;-1:-1:-1;;;;;25658:22:2;;-1:-1:-1;;;;;25685:14:2;25658:26;:42::i;:::-;25631:9;:24;;;:69;25627:583;;;25774:24;;;:28;;-1:-1:-1;;;;;;;;25774:28:2;;;;;25898:22;;:42;;-1:-1:-1;;;;;25898:22:2;;;;25925:14;25898:26;:42::i;:::-;25866:75;;-1:-1:-1;;25866:75:2;-1:-1:-1;;;;;25866:75:2;;;;;;;25968:36;;25985:18;;25968:36;;-1:-1:-1;;25968:36:2;25627:583;;;26183:7;:5;:7::i;:::-;26148:9;:24;;;:43;;;;;-1:-1:-1;;;;;26148:43:2;;;;;-1:-1:-1;;;;;26148:43:2;;;;;;25627:583;26286:25;-1:-1:-1;;;;;26233:79:2;26254:18;26233:79;26274:10;26233:79;;;;;;:::i;:::-;;;;;;;;25374:953;-1:-1:-1;;;24702:3:2;;24639:1698;;;-1:-1:-1;26351:14:2;;26347:356;;26385:41;26400:25;26385:14;:41::i;:::-;26381:312;;;26447:12;26465:8;-1:-1:-1;;;;;26465:13:2;26486:10;26465:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26446:55;;;26527:7;26519:52;;;;-1:-1:-1;;;26519:52:2;;;;;;;:::i;:::-;26381:312;;;;26610:68;-1:-1:-1;;;;;26610:46:2;;26657:8;26667:10;26610:46;:68::i;194:86:4:-;269:4;;194:86;:::o;3109:130:12:-;3167:7;3193:39;3197:1;3200;3193:39;;;;;;;;;;;;;;;;;:3;:39::i;1754:187::-;1840:7;1875:12;1867:6;;;;1859:29;;;;-1:-1:-1;;;1859:29:12;;;;;;;;:::i;:::-;-1:-1:-1;;;1910:5:12;;;1754:187::o;2967:751:15:-;3386:23;3412:69;3440:4;3412:69;;;;;;;;;;;;;;;;;3420:5;-1:-1:-1;;;;;3412:27:15;;;:69;;;;;:::i;:::-;3495:17;;3386:95;;-1:-1:-1;3495:21:15;3491:221;;3635:10;3624:30;;;;;;;;;;;;:::i;:::-;3616:85;;;;-1:-1:-1;;;3616:85:15;;;;;;;:::i;28672:463:2:-;893:8;-1:-1:-1;;;;;28836:28:2;;;;28828:90;;;;-1:-1:-1;;;28828:90:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;28936:25:2;;;;;;:18;:25;;;;;;;;28928:78;;;;-1:-1:-1;;;28928:78:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;29016:33:2;;;;;;:26;;;:33;;;;;;;;-1:-1:-1;;;;;29016:41:2;;;;;;;;;;;:49;;-1:-1:-1;;;;;;29016:49:2;-1:-1:-1;;;;;29016:49:2;;;;;29080:48;29095:10;;29080:48;;;;29016:33;;:41;;:49;;29080:48;:::i;:::-;;;;;;;;28672:463;;;;:::o;858:66:6:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1268:14;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;858:66:6;:::o;999:195:8:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;1068:17:8::1;1088:12;:10;:12::i;:::-;1110:6;:18:::0;;-1:-1:-1;;;;;;1110:18:8::1;-1:-1:-1::0;;;;;1110:18:8;::::1;::::0;;::::1;::::0;;;1143:43:::1;::::0;1110:18;;-1:-1:-1;1110:18:8;-1:-1:-1;;1143:43:8::1;::::0;-1:-1:-1;;1143:43:8::1;1256:1:7;1268:14:::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;999:195:8;:::o;1059:93:9:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;1129:7:9::1;:15:::0;;-1:-1:-1;;1129:15:9::1;::::0;;1264:55:7;;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;1059:93:9;:::o;3721:272:12:-;3807:7;3841:12;3834:5;3826:28;;;;-1:-1:-1;;;3826:28:12;;;;;;;;:::i;:::-;;3864:9;3880:1;3876;:5;;;;;;;3721:272;-1:-1:-1;;;;;3721:272:12:o;3581:193:16:-;3684:12;3715:52;3737:6;3745:4;3751:1;3754:12;3684;4858:18;4869:6;4858:10;:18::i;:::-;4850:60;;;;-1:-1:-1;;;4850:60:16;;;;;;;:::i;:::-;4981:12;4995:23;5022:6;-1:-1:-1;;;;;5022:11:16;5042:5;5050:4;5022:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4980:75;;;;5072:52;5090:7;5099:10;5111:12;5072:17;:52::i;:::-;5065:59;4608:523;-1:-1:-1;;;;;;;4608:523:16:o;726:413::-;1086:20;1124:8;;;726:413::o;6111:725::-;6226:12;6254:7;6250:580;;;-1:-1:-1;6284:10:16;6277:17;;6250:580;6395:17;;:21;6391:429;;6653:10;6647:17;6713:15;6700:10;6696:2;6692:19;6685:44;6602:145;6792:12;6785:20;;-1:-1:-1;;;6785:20:16;;;;;;;;:::i;5:130:-1:-;72:20;;97:33;72:20;97:33;:::i;313:707::-;;430:3;423:4;415:6;411:17;407:27;397:2;;-1:-1;;438:12;397:2;485:6;472:20;507:80;522:64;579:6;522:64;:::i;:::-;507:80;:::i;:::-;615:21;;;498:89;-1:-1;659:4;672:14;;;;647:17;;;761;;;752:27;;;;749:36;-1:-1;746:2;;;798:1;;788:12;746:2;823:1;808:206;833:6;830:1;827:13;808:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;901:50;;965:14;;;;993;;;;855:1;848:9;808:206;;;812:14;;;;;390:630;;;;:::o;1048:753::-;;1190:3;1183:4;1175:6;1171:17;1167:27;1157:2;;-1:-1;;1198:12;1157:2;1245:6;1232:20;1267:105;1282:89;1364:6;1282:89;:::i;1267:105::-;1400:21;;;1258:114;-1:-1;1444:4;1457:14;;;;1432:17;;;1552:1;1537:258;1562:6;1559:1;1556:13;1537:258;;;1669:62;1727:3;1444:4;1645:3;1632:17;1436:6;1620:30;;1669:62;:::i;:::-;1657:75;;1746:14;;;;1774;;;;1584:1;1577:9;1537:258;;1829:753;;1971:3;1964:4;1956:6;1952:17;1948:27;1938:2;;-1:-1;;1979:12;1938:2;2026:6;2013:20;2048:105;2063:89;2145:6;2063:89;:::i;2048:105::-;2181:21;;;2039:114;-1:-1;2225:4;2238:14;;;;2213:17;;;2333:1;2318:258;2343:6;2340:1;2337:13;2318:258;;;2426:3;2413:17;2217:6;2401:30;4235:3;4216:17;2401:30;4216:17;4212:27;4202:2;;2333:1;;4243:12;4202:2;2225:4;2401:30;;4277:20;4312:80;4327:64;4384:6;4327:64;:::i;4312:80::-;4420:21;;;4477:14;;;;4452:17;;;;4566;;;4557:27;;;;4554:36;-1:-1;4551:2;;;2333:1;;4593:12;4551:2;2333:1;4619:10;;4613:206;4638:6;4635:1;4632:13;4613:206;;;6778:6;6765:20;6756:29;;6790:33;6817:5;6790:33;:::i;:::-;4706:50;;;2365:1;4653:9;;;;;4770:14;;;;4798;;4613:206;;;-1:-1;;2438:75;;-1:-1;;;2527:14;;;;2555;;;;2365:1;2358:9;2318:258;;2609:750;;2750:3;2743:4;2735:6;2731:17;2727:27;2717:2;;-1:-1;;2758:12;2717:2;2805:6;2792:20;2827:104;2842:88;2923:6;2842:88;:::i;2827:104::-;2959:21;;;2818:113;-1:-1;3003:4;3016:14;;;;2991:17;;;3111:1;3096:257;3121:6;3118:1;3115:13;3096:257;;;3204:3;3191:17;2995:6;3179:30;5699:3;5680:17;3179:30;5680:17;5676:27;5666:2;;3111:1;;5707:12;5666:2;3003:4;3179:30;;5741:20;5776:79;5791:63;5847:6;5791:63;:::i;5776:79::-;5883:21;;;5940:14;;;;5915:17;;;;6029;;;6020:27;;;;6017:36;-1:-1;6014:2;;;3111:1;;6056:12;6014:2;3111:1;6082:10;;6076:205;6101:6;6098:1;6095:13;6076:205;;;6181:36;6213:3;6201:10;6181:36;:::i;:::-;6169:49;;3143:1;6116:9;;;;;6232:14;;;;6260;;6076:205;;;-1:-1;;3216:74;;-1:-1;;;3304:14;;;;3332;;;;3143:1;3136:9;3096:257;;3385:707;;3502:3;3495:4;3487:6;3483:17;3479:27;3469:2;;-1:-1;;3510:12;3469:2;3557:6;3544:20;3579:80;3594:64;3651:6;3594:64;:::i;3579:80::-;3687:21;;;3570:89;-1:-1;3731:4;3744:14;;;;3719:17;;;3833;;;3824:27;;;;3821:36;-1:-1;3818:2;;;3870:1;;3860:12;3818:2;3895:1;3880:206;3905:6;3902:1;3899:13;3880:206;;;6628:20;;3973:50;;4037:14;;;;4065;;;;3927:1;3920:9;3880:206;;6972:128;7038:20;;-1:-1;;;;;55744:30;;57780:34;;57770:2;;57828:1;;57818:12;7107:241;;7211:2;7199:9;7190:7;7186:23;7182:32;7179:2;;;-1:-1;;7217:12;7179:2;85:6;72:20;97:33;124:5;97:33;:::i;7355:360::-;;;7473:2;7461:9;7452:7;7448:23;7444:32;7441:2;;;-1:-1;;7479:12;7441:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7531:63;-1:-1;7631:2;7667:22;;6359:20;6384:30;6359:20;6384:30;:::i;:::-;7639:60;;;;7435:280;;;;;:::o;7722:753::-;;;;;7902:3;7890:9;7881:7;7877:23;7873:33;7870:2;;;-1:-1;;7909:12;7870:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7961:63;-1:-1;8061:2;8100:22;;6902:20;;-1:-1;8197:2;8182:18;;8169:32;-1:-1;;;;;8210:30;;8207:2;;;-1:-1;;8243:12;8207:2;8273:78;8343:7;8334:6;8323:9;8319:22;8273:78;:::i;:::-;8263:88;;;8388:2;8431:9;8427:22;72:20;97:33;124:5;97:33;:::i;:::-;7864:611;;;;-1:-1;7864:611;;-1:-1;;7864:611::o;8482:955::-;;;;;8720:3;8708:9;8699:7;8695:23;8691:33;8688:2;;;-1:-1;;8727:12;8688:2;8785:17;8772:31;-1:-1;;;;;8823:18;8815:6;8812:30;8809:2;;;-1:-1;;8845:12;8809:2;8875:103;8970:7;8961:6;8950:9;8946:22;8875:103;:::i;:::-;8865:113;;9043:2;9032:9;9028:18;9015:32;9001:46;;8823:18;9059:6;9056:30;9053:2;;;-1:-1;;9089:12;9053:2;;9119:78;9189:7;9180:6;9169:9;9165:22;9119:78;:::i;:::-;9109:88;;;9234:2;9277:9;9273:22;72:20;97:33;124:5;97:33;:::i;:::-;9242:63;-1:-1;9342:2;9389:22;;217:20;242:41;217:20;242:41;:::i;9444:997::-;;;;9706:2;9694:9;9685:7;9681:23;9677:32;9674:2;;;-1:-1;;9712:12;9674:2;9770:17;9757:31;-1:-1;;;;;9808:18;9800:6;9797:30;9794:2;;;-1:-1;;9830:12;9794:2;9860:102;9954:7;9945:6;9934:9;9930:22;9860:102;:::i;:::-;9850:112;;10027:2;10016:9;10012:18;9999:32;9985:46;;9808:18;10043:6;10040:30;10037:2;;;-1:-1;;10073:12;10037:2;10103:103;10198:7;10189:6;10178:9;10174:22;10103:103;:::i;:::-;10093:113;;10271:2;10260:9;10256:18;10243:32;10229:46;;9808:18;10287:6;10284:30;10281:2;;;-1:-1;;10317:12;10281:2;;10347:78;10417:7;10408:6;10397:9;10393:22;10347:78;:::i;:::-;10337:88;;;9668:773;;;;;:::o;10448:377::-;;10577:2;10565:9;10556:7;10552:23;10548:32;10545:2;;;-1:-1;;10583:12;10545:2;10641:17;10628:31;-1:-1;;;;;10671:6;10668:30;10665:2;;;-1:-1;;10701:12;10665:2;10731:78;10801:7;10792:6;10781:9;10777:22;10731:78;:::i;10832:627::-;;;;10995:2;10983:9;10974:7;10970:23;10966:32;10963:2;;;-1:-1;;11001:12;10963:2;11059:17;11046:31;-1:-1;;;;;11089:6;11086:30;11083:2;;;-1:-1;;11119:12;11083:2;11149:78;11219:7;11210:6;11199:9;11195:22;11149:78;:::i;:::-;11139:88;;;11264:2;11307:9;11303:22;72:20;97:33;124:5;97:33;:::i;:::-;11272:63;-1:-1;11372:2;11411:22;;72:20;97:33;72:20;97:33;:::i;:::-;11380:63;;;;10957:502;;;;;:::o;11466:1025::-;;;;;11696:3;11684:9;11675:7;11671:23;11667:33;11664:2;;;-1:-1;;11703:12;11664:2;11761:17;11748:31;-1:-1;;;;;11799:18;11791:6;11788:30;11785:2;;;-1:-1;;11821:12;11785:2;11851:78;11921:7;11912:6;11901:9;11897:22;11851:78;:::i;:::-;11841:88;;11966:2;;;;12009:9;12005:22;72:20;97:33;124:5;97:33;:::i;:::-;11974:63;-1:-1;12102:2;12087:18;;12074:32;12115:30;;;12112:2;;;-1:-1;;12148:12;12112:2;12178:78;12248:7;12239:6;12228:9;12224:22;12178:78;:::i;:::-;12168:88;;;12321:2;12310:9;12306:18;12293:32;11799:18;12337:6;12334:30;12331:2;;;-1:-1;;12367:12;12331:2;12443:22;;;-1:-1;4961:4;4949:17;;4945:27;-1:-1;4935:2;;-1:-1;;4976:12;4935:2;5023:6;5010:20;5045:80;5060:64;5117:6;5060:64;:::i;5045:80::-;5153:21;;;5210:14;;;;5185:17;;;5299;;;5290:27;;;;5287:36;-1:-1;5284:2;;;-1:-1;;5326:12;5284:2;-1:-1;5352:10;;5346:206;5371:6;5368:1;5365:13;5346:206;;;6902:20;;5439:50;;5393:1;5386:9;;;;;5503:14;;;;5531;;5346:206;;;-1:-1;11658:833;;;;-1:-1;11658:833;;-1:-1;;;;;;11658:833::o;12498:1701::-;;;;;;;;;;12836:3;12824:9;12815:7;12811:23;12807:33;12804:2;;;-1:-1;;12843:12;12804:2;12901:17;12888:31;-1:-1;;;;;12939:18;12931:6;12928:30;12925:2;;;-1:-1;;12961:12;12925:2;12991:78;13061:7;13052:6;13041:9;13037:22;12991:78;:::i;:::-;12981:88;;13124:53;13169:7;13106:2;13149:9;13145:22;13124:53;:::i;:::-;13114:63;;13232:52;13276:7;13214:2;13256:9;13252:22;13232:52;:::i;:::-;13222:62;;13339:52;13383:7;13321:2;13363:9;13359:22;13339:52;:::i;:::-;13329:62;;13447:53;13492:7;13428:3;13472:9;13468:22;13447:53;:::i;:::-;13437:63;;13537:3;13581:9;13577:22;6902:20;13546:63;;13674:3;13663:9;13659:19;13646:33;13632:47;;12939:18;13691:6;13688:30;13685:2;;;-1:-1;;13721:12;13685:2;13751:103;13846:7;13837:6;13826:9;13822:22;13751:103;:::i;:::-;13741:113;;13919:3;13908:9;13904:19;13891:33;13877:47;;12939:18;13936:6;13933:30;13930:2;;;-1:-1;;13966:12;13930:2;;13996:78;14066:7;14057:6;14046:9;14042:22;13996:78;:::i;:::-;13986:88;;;14130:53;14175:7;14111:3;14155:9;14151:22;14130:53;:::i;:::-;14120:63;;12798:1401;;;;;;;;;;;:::o;14206:257::-;;14318:2;14306:9;14297:7;14293:23;14289:32;14286:2;;;-1:-1;;14324:12;14286:2;6507:6;6501:13;6519:30;6543:5;6519:30;:::i;14470:241::-;;14574:2;14562:9;14553:7;14549:23;14545:32;14542:2;;;-1:-1;;14580:12;14542:2;-1:-1;6902:20;;14536:175;-1:-1;14536:175::o;14718:239::-;;14821:2;14809:9;14800:7;14796:23;14792:32;14789:2;;;-1:-1;;14827:12;14789:2;7051:6;7038:20;-1:-1;;;;;57807:5;55744:30;57783:5;57780:34;57770:2;;-1:-1;;57818:12;14964:1383;;;;;;15284:3;15272:9;15263:7;15259:23;15255:33;15252:2;;;-1:-1;;15291:12;15252:2;15353:52;15397:7;15373:22;15353:52;:::i;:::-;15343:62;;15470:2;15459:9;15455:18;15442:32;-1:-1;;;;;15494:18;15486:6;15483:30;15480:2;;;-1:-1;;15516:12;15480:2;15546:102;15640:7;15631:6;15620:9;15616:22;15546:102;:::i;:::-;15536:112;;15713:2;15702:9;15698:18;15685:32;15671:46;;15494:18;15729:6;15726:30;15723:2;;;-1:-1;;15759:12;15723:2;15789:103;15884:7;15875:6;15864:9;15860:22;15789:103;:::i;:::-;15779:113;;15957:2;15946:9;15942:18;15929:32;15915:46;;15494:18;15973:6;15970:30;15967:2;;;-1:-1;;16003:12;15967:2;16033:78;16103:7;16094:6;16083:9;16079:22;16033:78;:::i;:::-;16023:88;;16176:3;16165:9;16161:19;16148:33;16134:47;;15494:18;16193:6;16190:30;16187:2;;;-1:-1;;16223:12;16187:2;;16253:78;16323:7;16314:6;16303:9;16299:22;16253:78;:::i;:::-;16243:88;;;15246:1101;;;;;;;;:::o;17193:690::-;;17386:5;53887:12;54431:6;54426:3;54419:19;54468:4;;54463:3;54459:14;17398:93;;54468:4;17562:5;53741:14;-1:-1;17601:260;17626:6;17623:1;17620:13;17601:260;;;17687:13;;18836:37;;16508:14;;;;54274;;;;17648:1;17641:9;17601:260;;;-1:-1;17867:10;;17317:566;-1:-1;;;;;17317:566::o;32020:613::-;;56936:14;;;17142:5;56940:2;56936:14;;17099:3;17092:58;32351:2;32346:3;32342:12;18133:5;53887:12;53750:4;;18327:5;53741:14;-1:-1;18366:268;18391:6;18388:1;18385:13;18366:268;;;18452:13;;18836:37;;16508:14;;;;54274;;;;18413:1;18406:9;18366:268;;;-1:-1;;;;56940:2;56936:14;;;;;17092:58;;-1:-1;;32351:2;32596:12;;32242:391;-1:-1;;32242:391::o;32640:271::-;;19283:5;53887:12;19394:52;19439:6;19434:3;19427:4;19420:5;19416:16;19394:52;:::i;:::-;19458:16;;;;;32774:137;-1:-1;;32774:137::o;32918:379::-;33282:10;33106:191::o;33304:222::-;-1:-1;;;;;55538:54;;;;16954:37;;33431:2;33416:18;;33402:124::o;33778:444::-;-1:-1;;;;;55538:54;;;16954:37;;55538:54;;;;34125:2;34110:18;;16954:37;34208:2;34193:18;;18836:37;;;;33961:2;33946:18;;33932:290::o;34229:333::-;-1:-1;;;;;55538:54;;;;16954:37;;34548:2;34533:18;;18836:37;34384:2;34369:18;;34355:207::o;34569:440::-;-1:-1;;;;;55538:54;;;;16954:37;;-1:-1;;;;;55744:30;;;;34912:2;34897:18;;31972:36;-1:-1;;;;;55418:46;34995:2;34980:18;;31734:37;34750:2;34735:18;;34721:288::o;35016:370::-;;35193:2;35214:17;35207:47;35268:108;35193:2;35182:9;35178:18;35362:6;35268:108;:::i;35393:920::-;;35706:3;35728:17;35721:47;35782:108;35706:3;35695:9;35691:19;35876:6;35782:108;:::i;:::-;-1:-1;;;;;55744:30;;;35967:2;35952:18;;31972:36;55744:30;;;;36048:2;36033:18;;31972:36;-1:-1;;;;;55418:46;;;;36131:2;36116:18;;31734:37;-1:-1;;;;;55538:54;;;;36214:3;36199:19;;16954:37;56936:14;36283:19;;;18836:37;35774:116;35677:636;-1:-1;;35677:636::o;36320:210::-;55251:13;;55244:21;18729:34;;36441:2;36426:18;;36412:118::o;36537:222::-;18836:37;;;36664:2;36649:18;;36635:124::o;36766:236::-;-1:-1;;;;;55744:30;;;;19564:57;;36900:2;36885:18;;36871:131::o;37009:310::-;;37156:2;37177:17;37170:47;19778:5;53887:12;54431:6;37156:2;37145:9;37141:18;54419:19;19872:52;19917:6;54459:14;37145:9;54459:14;37156:2;19898:5;19894:16;19872:52;:::i;:::-;56845:7;56829:14;-1:-1;;56825:28;19936:39;;;;54459:14;19936:39;;37127:192;-1:-1;;37127:192::o;37326:416::-;37526:2;37540:47;;;20212:2;37511:18;;;54419:19;-1:-1;;;54459:14;;;20228:43;20290:12;;;37497:245::o;37749:416::-;37949:2;37963:47;;;20541:2;37934:18;;;54419:19;20577:34;54459:14;;;20557:55;-1:-1;;;20632:12;;;20625:39;20683:12;;;37920:245::o;38172:416::-;38372:2;38386:47;;;20934:2;38357:18;;;54419:19;20970:34;54459:14;;;20950:55;-1:-1;;;21025:12;;;21018:30;21067:12;;;38343:245::o;38595:416::-;38795:2;38809:47;;;21318:2;38780:18;;;54419:19;21354:29;54459:14;;;21334:50;21403:12;;;38766:245::o;39018:416::-;39218:2;39232:47;;;21654:2;39203:18;;;54419:19;21690:34;54459:14;;;21670:55;21759:27;21745:12;;;21738:49;21806:12;;;39189:245::o;39441:416::-;39641:2;39655:47;;;22057:2;39626:18;;;54419:19;22093:34;54459:14;;;22073:55;-1:-1;;;22148:12;;;22141:41;22201:12;;;39612:245::o;39864:416::-;40064:2;40078:47;;;22452:2;40049:18;;;54419:19;22488:34;54459:14;;;22468:55;-1:-1;;;22543:12;;;22536:45;22600:12;;;40035:245::o;40287:416::-;40487:2;40501:47;;;22851:2;40472:18;;;54419:19;22887:34;54459:14;;;22867:55;-1:-1;;;22942:12;;;22935:42;22996:12;;;40458:245::o;40710:416::-;40910:2;40924:47;;;23247:2;40895:18;;;54419:19;23283:34;54459:14;;;23263:55;-1:-1;;;23338:12;;;23331:25;23375:12;;;40881:245::o;41556:416::-;41756:2;41770:47;;;24010:2;41741:18;;;54419:19;24046:34;54459:14;;;24026:55;-1:-1;;;24101:12;;;24094:27;24140:12;;;41727:245::o;41979:416::-;42179:2;42193:47;;;24391:2;42164:18;;;54419:19;24427:34;54459:14;;;24407:55;24496:34;24482:12;;;24475:56;-1:-1;;;24551:12;;;24544:33;24596:12;;;42150:245::o;42402:416::-;42602:2;42616:47;;;24847:2;42587:18;;;54419:19;24883:34;54459:14;;;24863:55;-1:-1;;;24938:12;;;24931:37;24987:12;;;42573:245::o;42825:416::-;43025:2;43039:47;;;25238:2;43010:18;;;54419:19;25274:34;54459:14;;;25254:55;-1:-1;;;25329:12;;;25322:36;25377:12;;;42996:245::o;43248:416::-;43448:2;43462:47;;;25628:2;43433:18;;;54419:19;25664:34;54459:14;;;25644:55;-1:-1;;;25719:12;;;25712:35;25766:12;;;43419:245::o;43671:416::-;43871:2;43885:47;;;26017:2;43856:18;;;54419:19;-1:-1;;;54459:14;;;26033:39;26091:12;;;43842:245::o;44094:416::-;44294:2;44308:47;;;26342:2;44279:18;;;54419:19;26378:34;54459:14;;;26358:55;-1:-1;;;26433:12;;;26426:46;26491:12;;;44265:245::o;44517:416::-;44717:2;44731:47;;;26742:2;44702:18;;;54419:19;26778:34;54459:14;;;26758:55;-1:-1;;;26833:12;;;26826:32;26877:12;;;44688:245::o;44940:416::-;45140:2;45154:47;;;27128:2;45125:18;;;54419:19;27164:34;54459:14;;;27144:55;-1:-1;;;27219:12;;;27212:35;27266:12;;;45111:245::o;45363:416::-;45563:2;45577:47;;;27517:2;45548:18;;;54419:19;27553:34;54459:14;;;27533:55;-1:-1;;;27608:12;;;27601:28;27648:12;;;45534:245::o;45786:416::-;45986:2;46000:47;;;27899:2;45971:18;;;54419:19;27935:34;54459:14;;;27915:55;-1:-1;;;27990:12;;;27983:25;28027:12;;;45957:245::o;46209:416::-;46409:2;46423:47;;;46394:18;;;54419:19;28314:34;54459:14;;;28294:55;28368:12;;;46380:245::o;46632:416::-;46832:2;46846:47;;;28619:2;46817:18;;;54419:19;28655:34;54459:14;;;28635:55;-1:-1;;;28710:12;;;28703:44;28766:12;;;46803:245::o;47055:416::-;47255:2;47269:47;;;29017:2;47240:18;;;54419:19;29053:34;54459:14;;;29033:55;-1:-1;;;29108:12;;;29101:38;29158:12;;;47226:245::o;47478:416::-;47678:2;47692:47;;;29409:2;47663:18;;;54419:19;29445:34;54459:14;;;29425:55;-1:-1;;;29500:12;;;29493:29;29541:12;;;47649:245::o;47901:416::-;48101:2;48115:47;;;30097:2;48086:18;;;54419:19;-1:-1;;;54459:14;;;30113:39;30171:12;;;48072:245::o;48324:416::-;48524:2;48538:47;;;30422:2;48509:18;;;54419:19;30458:31;54459:14;;;30438:52;30509:12;;;48495:245::o;48747:416::-;48947:2;48961:47;;;30760:2;48932:18;;;54419:19;30796:34;54459:14;;;30776:55;-1:-1;;;30851:12;;;30844:45;30908:12;;;48918:245::o;49170:416::-;49370:2;49384:47;;;31159:2;49355:18;;;54419:19;31195:34;54459:14;;;31175:55;-1:-1;;;31250:12;;;31243:34;31296:12;;;49341:245::o;49593:416::-;49793:2;49807:47;;;49778:18;;;54419:19;31583:34;54459:14;;;31563:55;31637:12;;;49764:245::o;50470:325::-;-1:-1;;;;;55744:30;;;31972:36;;55744:30;;50781:2;50766:18;;31972:36;50621:2;50606:18;;50592:203::o;50802:256::-;50864:2;50858:9;50890:17;;;-1:-1;;;;;50950:34;;50986:22;;;50947:62;50944:2;;;51022:1;;51012:12;50944:2;50864;51031:22;50842:216;;-1:-1;50842:216::o;51065:304::-;;-1:-1;;;;;51216:6;51213:30;51210:2;;;-1:-1;;51246:12;51210:2;-1:-1;51291:4;51279:17;;;51344:15;;51147:222::o;56287:268::-;56352:1;56359:101;56373:6;56370:1;56367:13;56359:101;;;56440:11;;;56434:18;56421:11;;;56414:39;56395:2;56388:10;56359:101;;;56475:6;56472:1;56469:13;56466:2;;;-1:-1;;56352:1;56522:16;;56515:27;56336:219::o;56968:117::-;-1:-1;;;;;55538:54;;57027:35;;57017:2;;57076:1;;57066:12;57232:111;57313:5;55251:13;55244:21;57291:5;57288:32;57278:2;;57334:1;;57324:12;57474:117;-1:-1;;;;;57561:5;55418:46;57536:5;57533:35;57523:2;;57582:1;;57572:12",
  "source": "// SPDX-License-Identifier: MIT\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\nimport \"../StorageManager.sol\";\n\ncontract TestStorageManager is StorageManager {\n    uint256 time;\n\n    function _time() internal view override returns (uint256) {\n        return time;\n    }\n\n    function incrementTime(uint256 increment) external {\n        time = time + increment;\n    }\n\n    function setTime(uint256 newTime) external {\n        time = newTime;\n    }\n\n    function getOfferUtilizedCapacity(address provider) public view returns (uint256) {\n        return offerRegistry[provider].utilizedCapacity;\n    }\n}\n",
  "sourcePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManager.sol",
  "ast": {
    "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManager.sol",
    "exportedSymbols": {
      "TestStorageManager": [
        2048
      ]
    },
    "id": 2049,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1997,
        "literals": [
          "solidity",
          "0.6",
          ".12"
        ],
        "nodeType": "PragmaDirective",
        "src": "32:23:4"
      },
      {
        "id": 1998,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "56:33:4"
      },
      {
        "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/StorageManager.sol",
        "file": "../StorageManager.sol",
        "id": 1999,
        "nodeType": "ImportDirective",
        "scope": 2049,
        "sourceUnit": 1911,
        "src": "90:31:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 2000,
              "name": "StorageManager",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1910,
              "src": "154:14:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_StorageManager_$1910",
                "typeString": "contract StorageManager"
              }
            },
            "id": 2001,
            "nodeType": "InheritanceSpecifier",
            "src": "154:14:4"
          }
        ],
        "contractDependencies": [
          1910,
          2108,
          2183,
          2313,
          2424
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 2048,
        "linearizedBaseContracts": [
          2048,
          1910,
          2424,
          2313,
          2108,
          2183
        ],
        "name": "TestStorageManager",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 2003,
            "mutability": "mutable",
            "name": "time",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2048,
            "src": "175:12:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2002,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "175:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1880
            ],
            "body": {
              "id": 2011,
              "nodeType": "Block",
              "src": "252:28:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2009,
                    "name": "time",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2003,
                    "src": "269:4:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2008,
                  "id": 2010,
                  "nodeType": "Return",
                  "src": "262:11:4"
                }
              ]
            },
            "documentation": null,
            "id": 2012,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_time",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 2005,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "225:8:4"
            },
            "parameters": {
              "id": 2004,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "208:2:4"
            },
            "returnParameters": {
              "id": 2008,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2007,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2012,
                  "src": "243:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2006,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "243:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "242:9:4"
            },
            "scope": 2048,
            "src": "194:86:4",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2023,
              "nodeType": "Block",
              "src": "337:40:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2021,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2017,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2003,
                      "src": "347:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2020,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 2018,
                        "name": "time",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2003,
                        "src": "354:4:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 2019,
                        "name": "increment",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2014,
                        "src": "361:9:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "354:16:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "347:23:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2022,
                  "nodeType": "ExpressionStatement",
                  "src": "347:23:4"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "699ca55f",
            "id": 2024,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "incrementTime",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2015,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2014,
                  "mutability": "mutable",
                  "name": "increment",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2024,
                  "src": "309:17:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2013,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "309:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "308:19:4"
            },
            "returnParameters": {
              "id": 2016,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "337:0:4"
            },
            "scope": 2048,
            "src": "286:91:4",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2033,
              "nodeType": "Block",
              "src": "426:31:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2031,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2029,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2003,
                      "src": "436:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2030,
                      "name": "newTime",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2026,
                      "src": "443:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "436:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2032,
                  "nodeType": "ExpressionStatement",
                  "src": "436:14:4"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "3beb26c4",
            "id": 2034,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setTime",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2027,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2026,
                  "mutability": "mutable",
                  "name": "newTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2034,
                  "src": "400:15:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2025,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "400:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "399:17:4"
            },
            "returnParameters": {
              "id": 2028,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "426:0:4"
            },
            "scope": 2048,
            "src": "383:74:4",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2046,
              "nodeType": "Block",
              "src": "545:64:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2041,
                        "name": "offerRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 496,
                        "src": "562:13:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Offer_$481_storage_$",
                          "typeString": "mapping(address => struct StorageManager.Offer storage ref)"
                        }
                      },
                      "id": 2043,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2042,
                        "name": "provider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2036,
                        "src": "576:8:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "562:23:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Offer_$481_storage",
                        "typeString": "struct StorageManager.Offer storage ref"
                      }
                    },
                    "id": 2044,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "utilizedCapacity",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 468,
                    "src": "562:40:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "functionReturnParameters": 2040,
                  "id": 2045,
                  "nodeType": "Return",
                  "src": "555:47:4"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "27beac27",
            "id": 2047,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getOfferUtilizedCapacity",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2037,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2036,
                  "mutability": "mutable",
                  "name": "provider",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2047,
                  "src": "497:16:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "497:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "496:18:4"
            },
            "returnParameters": {
              "id": 2040,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2039,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2047,
                  "src": "536:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2038,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "536:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "535:9:4"
            },
            "scope": 2048,
            "src": "463:146:4",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2049,
        "src": "123:488:4"
      }
    ],
    "src": "32:580:4"
  },
  "legacyAST": {
    "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManager.sol",
    "exportedSymbols": {
      "TestStorageManager": [
        2048
      ]
    },
    "id": 2049,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1997,
        "literals": [
          "solidity",
          "0.6",
          ".12"
        ],
        "nodeType": "PragmaDirective",
        "src": "32:23:4"
      },
      {
        "id": 1998,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "56:33:4"
      },
      {
        "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/StorageManager.sol",
        "file": "../StorageManager.sol",
        "id": 1999,
        "nodeType": "ImportDirective",
        "scope": 2049,
        "sourceUnit": 1911,
        "src": "90:31:4",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 2000,
              "name": "StorageManager",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1910,
              "src": "154:14:4",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_StorageManager_$1910",
                "typeString": "contract StorageManager"
              }
            },
            "id": 2001,
            "nodeType": "InheritanceSpecifier",
            "src": "154:14:4"
          }
        ],
        "contractDependencies": [
          1910,
          2108,
          2183,
          2313,
          2424
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 2048,
        "linearizedBaseContracts": [
          2048,
          1910,
          2424,
          2313,
          2108,
          2183
        ],
        "name": "TestStorageManager",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 2003,
            "mutability": "mutable",
            "name": "time",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2048,
            "src": "175:12:4",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2002,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "175:7:4",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1880
            ],
            "body": {
              "id": 2011,
              "nodeType": "Block",
              "src": "252:28:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2009,
                    "name": "time",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2003,
                    "src": "269:4:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2008,
                  "id": 2010,
                  "nodeType": "Return",
                  "src": "262:11:4"
                }
              ]
            },
            "documentation": null,
            "id": 2012,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_time",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 2005,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "225:8:4"
            },
            "parameters": {
              "id": 2004,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "208:2:4"
            },
            "returnParameters": {
              "id": 2008,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2007,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2012,
                  "src": "243:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2006,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "243:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "242:9:4"
            },
            "scope": 2048,
            "src": "194:86:4",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2023,
              "nodeType": "Block",
              "src": "337:40:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2021,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2017,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2003,
                      "src": "347:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2020,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 2018,
                        "name": "time",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2003,
                        "src": "354:4:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 2019,
                        "name": "increment",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2014,
                        "src": "361:9:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "354:16:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "347:23:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2022,
                  "nodeType": "ExpressionStatement",
                  "src": "347:23:4"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "699ca55f",
            "id": 2024,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "incrementTime",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2015,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2014,
                  "mutability": "mutable",
                  "name": "increment",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2024,
                  "src": "309:17:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2013,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "309:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "308:19:4"
            },
            "returnParameters": {
              "id": 2016,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "337:0:4"
            },
            "scope": 2048,
            "src": "286:91:4",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2033,
              "nodeType": "Block",
              "src": "426:31:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2031,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2029,
                      "name": "time",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2003,
                      "src": "436:4:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2030,
                      "name": "newTime",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2026,
                      "src": "443:7:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "436:14:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2032,
                  "nodeType": "ExpressionStatement",
                  "src": "436:14:4"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "3beb26c4",
            "id": 2034,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setTime",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2027,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2026,
                  "mutability": "mutable",
                  "name": "newTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2034,
                  "src": "400:15:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2025,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "400:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "399:17:4"
            },
            "returnParameters": {
              "id": 2028,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "426:0:4"
            },
            "scope": 2048,
            "src": "383:74:4",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 2046,
              "nodeType": "Block",
              "src": "545:64:4",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2041,
                        "name": "offerRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 496,
                        "src": "562:13:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Offer_$481_storage_$",
                          "typeString": "mapping(address => struct StorageManager.Offer storage ref)"
                        }
                      },
                      "id": 2043,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 2042,
                        "name": "provider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2036,
                        "src": "576:8:4",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "562:23:4",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Offer_$481_storage",
                        "typeString": "struct StorageManager.Offer storage ref"
                      }
                    },
                    "id": 2044,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "utilizedCapacity",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 468,
                    "src": "562:40:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "functionReturnParameters": 2040,
                  "id": 2045,
                  "nodeType": "Return",
                  "src": "555:47:4"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "27beac27",
            "id": 2047,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getOfferUtilizedCapacity",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2037,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2036,
                  "mutability": "mutable",
                  "name": "provider",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2047,
                  "src": "497:16:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "497:7:4",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "496:18:4"
            },
            "returnParameters": {
              "id": 2040,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2039,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2047,
                  "src": "536:7:4",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2038,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "536:7:4",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "535:9:4"
            },
            "scope": 2048,
            "src": "463:146:4",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 2049,
        "src": "123:488:4"
      }
    ],
    "src": "32:580:4"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.12+commit.27d51765.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.3.2",
  "updatedAt": "2021-03-04T12:24:19.850Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "depositFunds(address,uint256,bytes32[],address)": {
        "details": "- depositing funds to Agreement that is linked to terminated Offer is not possible - depositing funds to Agreement that already is expired (eq. ran out of funds at some point) is not possible. Call NewAgreement instead. The data needs to be re-provided though. - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.",
        "params": {
          "dataReference": "data reference where should be deposited funds.",
          "provider": "the address of the provider of the Offer."
        }
      },
      "emitMessage(bytes32[])": {
        "params": {
          "message": "the Provider may send a message (e.g. his nodeID). Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID"
        }
      },
      "getAgreementReference(bytes32[],address,address)": {
        "params": {
          "creator": "the creator of the agreement",
          "dataReference": "the dataReference of the agreement",
          "token": "the token, which is used as a means of payment for the agreement."
        }
      },
      "newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)": {
        "details": "- The to-be-pinned data reference's size in MB (rounded up) must be equal in size to param size. - Provider can reject to pin data reference when it exceeds specified size. - The ownership of Agreement is enforced with agreementReference structure which is calculated as: hash(msg.sender, dataReference) - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession. Contains execution of the transferFrom on external token contract before all the stage changes are performed. As a result if a token will perform a callback to the StorageManager, it may lead to a reentrancy attack. Hence additional attention should be paid while reviewing this method of a token before whitelisting.",
        "params": {
          "amount": "if token is set, this is the amount of tokens that is transfered",
          "billingPeriod": "the chosen period for billing.",
          "creatorsOfAgreementToPayOut": "the creators of agreements which must be payed out. Pass this when there is no capacity. The order should match the order of dataReferenceOfAgreementToPayOut and tokensOfAgreementToPayOut",
          "dataReference": "the reference to an Data Source, can be several things.",
          "dataReferencesOfAgreementToPayOut": "the data references of agreements which must be payed out. Pass this when there is no capacity. Order should equal order of creatorsOfAgreementToPayOut and tokensOfAgreementToPayOut",
          "provider": "the provider from which is proposed to take a Offer.",
          "size": "the size of the to-be-pinned file in MB (rounded up).",
          "token": "the token in which you want to make the agreement. By convention: address(0) is the native currency",
          "tokenOfAgreementsToPayOut": "the token address of agreements which must be payed out. Pass this when there is no capacity."
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "pause()": {
        "details": "Called by a pauser to pause, triggers stopped state."
      },
      "paused()": {
        "details": "Returns true if the contract is paused, and false otherwise."
      },
      "payoutFunds(bytes32[][],address[],address,address)": {
        "details": "- Provider must call an expired agreement themselves as soon as the agreement is expired, to add back the capacity to their Offer. - Payout can be triggered by other events as well. Like in newAgreement call with either existing agreement or when other Agreements are passed to the agreementsReferencesToBePayedOut array.",
        "params": {
          "creatorsOfAgreementToPayOut": "the creators that made the agreement to pay",
          "dataReferencesOfAgreementToPayOut": "the data references of the agreement to pay",
          "tokensOfAgreementsToPayOut": "the tokens of the agreement to pay out"
        }
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setBillingPlans(uint64[][],uint128[][],address[])": {
        "details": "- setting the price to 0 means that a particular period is not offered, which can be used to remove a period from the offer. - make sure that any period * prices does not cause an overflow, as this can never be accepted and hence is pointless. - the length of tokens array must always be one shorter than the length of the boundaries array (otherwise you get an array index out of bounds error) - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered",
        "params": {
          "billingPeriods": "the offered periods. Length must be equal to billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index",
          "billingPrices": "the prices for the offered periods. Each entry at index corresponds to the same index at periods. 0 means that the particular period is not offered. The first index of the multi dem array corresponds with the address in tokens at the same index"
        }
      },
      "setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])": {
        "details": "- Use this function when initiating an Offer or when the users wants to change more than one parameter at once. - make sure that any period * prices does not cause an overflow, as this can never be accepted (REF_MAX_PRICE) and hence is pointless - only whitelisted tokens are allowed to make an offer for - if there are two tokens, and two billingPrice/periods pairs per token, then boundaries[0] == 1. This makes the first two billingPeriod/prices pairs to apply to the first token ([tokens[0]]) and the second pairs to the second token. - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered",
        "params": {
          "billingPeriods": "the offered periods. Length must be equal to the length of billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index",
          "billingPrices": "the prices for the offered periods. Each entry at index corresponds to the same index at periods. The first index of the multi dem array corresponds with the address in tokens at the same index",
          "capacity": "the amount of MB offered. If already active before and set to 0, existing contracts can't be prolonged / re-started, no new contracts can be started.",
          "message": "the Provider may include a message (e.g. his nodeID).  Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID",
          "tokens": "the tokens for which an offer is made. By convention, address(0) is the native currency."
        }
      },
      "setTotalCapacity(uint64)": {
        "params": {
          "capacity": "the new capacity"
        }
      },
      "setWhitelistedProvider(address,bool)": {
        "params": {
          "isWhiteListed": "whether you want to whitelist the provider or put it from the whitelist.",
          "providerAddress": "the providerAddress from whom you want to set the whitelisted"
        }
      },
      "setWhitelistedTokens(address,bool)": {
        "params": {
          "isWhiteListed": "whether you want to whitelist the token or put it from the whitelist.",
          "token": "the token from whom you want to set the whitelisted"
        }
      },
      "terminateOffer()": {
        "details": "no new Agreement can be created and no existing Agreement can be prolonged. All existing Agreement are still valid for the amount of periods still deposited."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "unpause()": {
        "details": "Called by a pauser to unpause, returns to normal state."
      },
      "withdrawFunds(bytes32[],address,address[],uint256[])": {
        "details": "- if amount is zero then all withdrawable funds are transferred (eq. all available funds minus funds for still non-payed out periods and current period) - if Agreement is terminated Consumer can withdraw all remaining funds - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.",
        "params": {
          "amounts": "the value you want to withdraw for each token",
          "dataReference": "the data reference of agreement to be funds withdrawn from",
          "provider": "the address of the provider of the Offer.",
          "tokens": "the tokens in which to withdraw. By convention, address(0) is the native currency."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "depositFunds(address,uint256,bytes32[],address)": {
        "notice": ">> FOR CONSUMERdeposits new funds to the Agreement."
      },
      "emitMessage(bytes32[])": {
        "notice": ">> FOR PROVIDER"
      },
      "getAgreementReference(bytes32[],address,address)": {
        "notice": "get the agreementReference. the agreementReference consists of the hash of the dataReference, msg.sender and the tokenAdddress, to allow: - multiple people to register an agreement for the same file - one person to register multiple agreements for the same file, but with different tokens - link the token to the agreement, such that we do the accounting properly"
      },
      "newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)": {
        "notice": ">> FOR CONSUMERnew Agreement for given Offer"
      },
      "payoutFunds(bytes32[][],address[],address,address)": {
        "notice": ">> FOR PROVIDERpayout already earned funds of one or more Agreement"
      },
      "setBillingPlans(uint64[][],uint128[][],address[])": {
        "notice": ">> FOR PROVIDERset the billing plans for an Offer."
      },
      "setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])": {
        "notice": ">> FOR PROVIDERset the totalCapacity and billingPlans of a Offer."
      },
      "setTotalCapacity(uint64)": {
        "notice": ">> FOR PROVIDERsets total capacity of Offer."
      },
      "setWhitelistedProvider(address,bool)": {
        "notice": "whitelist a provider or remove the provider from whitelist"
      },
      "setWhitelistedTokens(address,bool)": {
        "notice": "whitelist a token or remove the token from whitelist"
      },
      "terminateOffer()": {
        "notice": ">> FOR PROVIDERstops the Offer. It sets the totalCapacity to 0 which indicates terminated Offer."
      },
      "withdrawFunds(bytes32[],address,address[],uint256[])": {
        "notice": ">> FOR CONSUMERwithdraw funds from Agreement."
      }
    },
    "version": 1
  }
}