{
  "contractName": "ProxySafeSimpleRestrictedFDT",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "addedAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "whitelist",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "addedBy",
          "type": "address"
        }
      ],
      "name": "AddressAddedToWhitelist",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "removedAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "whitelist",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "removedBy",
          "type": "address"
        }
      ],
      "name": "AddressRemovedFromWhitelist",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "addedAdmin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "addedBy",
          "type": "address"
        }
      ],
      "name": "AdminAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "removedAdmin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "removedBy",
          "type": "address"
        }
      ],
      "name": "AdminRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fundsDistributed",
          "type": "uint256"
        }
      ],
      "name": "FundsDistributed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fundsWithdrawn",
          "type": "uint256"
        }
      ],
      "name": "FundsWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "updatedBy",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "sourceWhitelist",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "destinationWhitelist",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "from",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "to",
          "type": "bool"
        }
      ],
      "name": "OutboundWhitelistUpdated",
      "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": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "RestrictionsDisabled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "FAILURE_NON_WHITELIST",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FAILURE_NON_WHITELIST_MESSAGE",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SUCCESS_CODE",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SUCCESS_MESSAGE",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UNKNOWN_ERROR",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "accumulativeFundsOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "adminToAdd",
          "type": "address"
        }
      ],
      "name": "addAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addressToAdd",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "whitelist",
          "type": "uint8"
        }
      ],
      "name": "addToWhitelist",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "addressWhitelists",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "administrators",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "checkWhitelistAllowed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableRestrictions",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fundsToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fundsTokenBalance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addressToTest",
          "type": "address"
        }
      ],
      "name": "isAdministrator",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isRestrictionEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "name": "outboundWhitelistsEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "adminToRemove",
          "type": "address"
        }
      ],
      "name": "removeAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addressToRemove",
          "type": "address"
        }
      ],
      "name": "removeFromWhitelist",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "sourceWhitelist",
          "type": "uint8"
        },
        {
          "internalType": "uint8",
          "name": "destinationWhitelist",
          "type": "uint8"
        },
        {
          "internalType": "bool",
          "name": "newEnabledValue",
          "type": "bool"
        }
      ],
      "name": "updateOutboundWhitelistEnabled",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "withdrawableFundsOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "withdrawnFundsOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdrawFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateFundsReceived",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        },
        {
          "internalType": "contract IERC20",
          "name": "_fundsToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "initialAmount",
          "type": "uint256"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "owners",
          "type": "address[]"
        }
      ],
      "name": "pushFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "detectTransferRestriction",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "restrictionCode",
          "type": "uint8"
        }
      ],
      "name": "messageForTransferRestriction",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.11+commit.5ef660b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addedAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"whitelist\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addedBy\",\"type\":\"address\"}],\"name\":\"AddressAddedToWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"removedAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"whitelist\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"removedBy\",\"type\":\"address\"}],\"name\":\"AddressRemovedFromWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addedAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addedBy\",\"type\":\"address\"}],\"name\":\"AdminAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"removedAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"removedBy\",\"type\":\"address\"}],\"name\":\"AdminRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsDistributed\",\"type\":\"uint256\"}],\"name\":\"FundsDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsWithdrawn\",\"type\":\"uint256\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"updatedBy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"sourceWhitelist\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"destinationWhitelist\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"from\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"to\",\"type\":\"bool\"}],\"name\":\"OutboundWhitelistUpdated\",\"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\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RestrictionsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FAILURE_NON_WHITELIST\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FAILURE_NON_WHITELIST_MESSAGE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUCCESS_CODE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUCCESS_MESSAGE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UNKNOWN_ERROR\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"accumulativeFundsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"adminToAdd\",\"type\":\"address\"}],\"name\":\"addAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addressToAdd\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"whitelist\",\"type\":\"uint8\"}],\"name\":\"addToWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"addressWhitelists\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"administrators\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"checkWhitelistAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"detectTransferRestriction\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableRestrictions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fundsToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fundsTokenBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"_fundsToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"initialAmount\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addressToTest\",\"type\":\"address\"}],\"name\":\"isAdministrator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRestrictionEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"restrictionCode\",\"type\":\"uint8\"}],\"name\":\"messageForTransferRestriction\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"outboundWhitelistsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"}],\"name\":\"pushFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"adminToRemove\",\"type\":\"address\"}],\"name\":\"removeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addressToRemove\",\"type\":\"address\"}],\"name\":\"removeFromWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateFundsReceived\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"sourceWhitelist\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"destinationWhitelist\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"newEnabledValue\",\"type\":\"bool\"}],\"name\":\"updateOutboundWhitelistEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"withdrawableFundsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"withdrawnFundsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accumulativeFundsOf(address)\":{\"details\":\"accumulativeFundsOf(_owner) = withdrawableFundsOf(_owner) + withdrawnFundsOf(_owner) = (pointsPerShare * balanceOf(_owner) + pointsCorrection[_owner]) / pointsMultiplier\",\"params\":{\"_owner\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount of funds that `_owner` has earned in total.\"}},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(string,string,address,address,uint256)\":{\"details\":\"\\\"constructor\\\" to be called on deployment\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"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.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateFundsReceived()\":{\"details\":\"Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()\"},\"withdrawableFundsOf(address)\":{\"params\":{\"_owner\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount funds that `_owner` can withdraw.\"}},\"withdrawnFundsOf(address)\":{\"params\":{\"_owner\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount of funds that `_owner` has withdrawn.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"accumulativeFundsOf(address)\":{\"notice\":\"prev. accumulativeDividendOfView the amount of funds that an address has earned in total.\"},\"addAdmin(address)\":{\"notice\":\"Add an admin to the list.  This should only be callable by the owner of the contract.\"},\"addToWhitelist(address,uint8)\":{\"notice\":\"Sets an address's white list ID.  Only administrators should be allowed to update this. If an address is on an existing whitelist, it will just get updated to the new value (removed from previous).\"},\"burn(address,uint256)\":{\"notice\":\"Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT.\"},\"checkWhitelistAllowed(address,address)\":{\"notice\":\"Determine if the a sender is allowed to send to the receiver. The source whitelist must be enabled to send to the whitelist where the receive exists.\"},\"detectTransferRestriction(address,address,uint256)\":{\"notice\":\"This function detects whether a transfer should be restricted and not allowed. If the function returns SUCCESS_CODE (0) then it should be allowed.\"},\"disableRestrictions()\":{\"notice\":\"Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call. This is a permanent change that cannot be undone\"},\"initialize(string,string,address,address,uint256)\":{\"notice\":\"Initialize a new instance storage\"},\"isAdministrator(address)\":{\"notice\":\"Determine if the message sender is in the administrators list.\"},\"isRestrictionEnabled()\":{\"notice\":\"View function to determine if restrictions are enabled\"},\"messageForTransferRestriction(uint8)\":{\"notice\":\"This function allows a wallet or other client to get a human readable string to show a user if a transfer was restricted.  It should return enough information for the user to know why it failed.\"},\"mint(address,uint256)\":{\"notice\":\"Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT.\"},\"pushFunds(address[])\":{\"notice\":\"Withdraws funds for a set of token holders\"},\"removeAdmin(address)\":{\"notice\":\"Remove an admin from the list.  This should only be callable by the owner of the contract.\"},\"removeFromWhitelist(address)\":{\"notice\":\"Clears out an address's white list ID.  Only administrators should be allowed to update this.\"},\"transfer(address,uint256)\":{\"notice\":\"Overrides the parent class token transfer function to enforce restrictions.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Overrides the parent class token transferFrom function to enforce restrictions.\"},\"updateFundsReceived()\":{\"notice\":\"Register a payment of funds in tokens. May be called directly after a deposit is made.\"},\"updateOutboundWhitelistEnabled(uint8,uint8,bool)\":{\"notice\":\"Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist. Only administrators should be allowed to update this.\"},\"withdrawFunds()\":{\"notice\":\"Withdraws all available funds for a token holder\"},\"withdrawableFundsOf(address)\":{\"notice\":\"prev. withdrawableDividendOfView the amount of funds that an address can withdraw.\"},\"withdrawnFundsOf(address)\":{\"notice\":\"prev. withdrawnDividendOfView the amount of funds that an address has withdrawn.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol\":\"ProxySafeSimpleRestrictedFDT\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol\":{\"keccak256\":\"0x91b13e01fdef718f2d5a64d9d4051dd8495913ac78c2309342e6af7656d1ee21\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d9a17efea849552722739b1ffb0878a80da99072e6af5d8c2bd563dce00ebc29\",\"dweb:/ipfs/QmamL6A7LoLuqwNngKY3NPzZgpihiBPERFCbVB5G5wuPT5\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol\":{\"keccak256\":\"0x357c01314146027ec6d250d5b29824bd795e00578b0b888b8c8063d1f49bfec8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4ba4486b5f8d60500cc1f8af3c9859c4bd0ee07a279f94b67ba1393391e54154\",\"dweb:/ipfs/QmNxYYnyPLh2vNJLzoPAVhHBxvuczBo24GDmRS61nD4ABv\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol\":{\"keccak256\":\"0x367de24e2fcd7cd02aabe65af0afc0c5184781135bb826835a82d406f33c93b5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f08d02e99e8daf2be5f2067c12f2c81aff1983fa49eebbe9cf5bea75ae4f308c\",\"dweb:/ipfs/QmX1xtraEs8QwFF9tBTBPnuoU5mP3k9X9U1Y9eMoEjNyB7\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol\":{\"keccak256\":\"0x3cbae3a5c69a96dad8db5de755d9a17a7b635aeb9c25770855ac7899a5a0665d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1ad9eaacfed275668030c96df6cf42a7ba5bbb54a088876ac32284f463692746\",\"dweb:/ipfs/QmSKbdDZz9YpGVaZYfB4FkA7Y3cvGCRVJQ6Jpd2SFg5TaL\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/math/SafeMathInt.sol\":{\"keccak256\":\"0xc53b786fe1e9a4a207e503272ca7bf485f4872a196fcdf9b209ff18a025857ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://99aef73723a7dac14a7a407036d85fe6070ea280e8509f214bf709321c1b7d68\",\"dweb:/ipfs/QmQW5ygUX2EJMQkUmNt3q18VrtrCEiNeape7JaUh19p1tF\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/math/SafeMathUint.sol\":{\"keccak256\":\"0xdba5f11842c7ef0d82b4fdccf5430ae81d677c426a8bbe1c5dd4df62ab9e43d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://216bba31081f8f7bae15fbd79648300a04740c472f23957963354497d82d86b2\",\"dweb:/ipfs/QmXMnSfoSKbobfQkcRExx8RC5ZSPCCiNdcb1xy3v3vGgWV\"]},\"@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/math/SafeMath.sol\":{\"keccak256\":\"0x04d34b3cd5677bea25f8dfceb6dec0eaa071d4d4b789a43f13fe0c415ba4c296\",\"urls\":[\"bzz-raw://e7e8b526a6839e5ba14f0d23a830387fec47f7043ce01d42c9f285b709a9d080\",\"dweb:/ipfs/QmXmhhFmX5gcAvVzNiDPAGA35iHMPNaYtQkACswRHBVTNw\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x9c2d859bc9de93ced0875d226598e56067fe4d6b2dde0e1fd53ca60fa9603db0\",\"urls\":[\"bzz-raw://5df1baba4ea42a94d0e0aed4a87271369ef2cd54d86e89cab7ef1428ff387210\",\"dweb:/ipfs/QmV5ErriAFQWqEPAfWhJ6DxmujH6vBPB3F5Breaq9vUWGu\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x6cc1cb934a3ac2137a7dcaed018af9e235392236ceecfd3687259702b9c767ad\",\"urls\":[\"bzz-raw://0055fa88138cd1c3c6440370f8580f85857f8fe9dec41c99af9eafbeb8d9c3ce\",\"dweb:/ipfs/QmX1xDh8vwGLLCH8ti45eXjQ7Wcxv1FEGTR3jkFnd5Nv6F\"]},\"@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol\":{\"keccak256\":\"0x5f7da58ee3d9faa9b8999a93d49c8ff978f1afc88ae9bcfc6f9cbb44da011c2b\",\"urls\":[\"bzz-raw://4f089d954b3ecaa26949412fe63e9a184b056562c6c13dd4a0529a5d9a2e685a\",\"dweb:/ipfs/QmVK5iCNAMcEJQxT59bsC5E53JQASDQPU6khHox3d5ZXCn\"]}},\"version\":1}",
  "bytecode": "0x608060405260cf805460ff1916600117905534801561001d57600080fd5b50612cdc8061002d6000396000f3fe608060405234801561001057600080fd5b50600436106102735760003560e01c806370a0823111610151578063a457c2d7116100c3578063d4ce141511610087578063d4ce141514610910578063dce306ad14610946578063dd62ed3e1461094e578063e7984d171461097c578063e959450814610984578063f2fde38b146109ac57610273565b8063a457c2d714610763578063a9059cbb1461078f578063a9691f3f146107bb578063c8934462146107c3578063c9aba0aa146107cb57610273565b80638da5cb5b116101155780638da5cb5b146106cb57806392e6d68b146106d35780639437e2fe146106f957806395d89b411461072757806397af67441461072f5780639dc29fac1461073757610273565b806370a0823114610631578063715018a61461065757806376be15851461065f5780637f4ab1dd146106855780638ab1d681146106a557610273565b80632a642407116101ea578063443bb293116101ae578063443bb293146104f057806345f634f21461051657806346c162de146105b95780634e97415f146105c157806363f04b15146105e7578063704802751461060b57610273565b80632a64240714610456578063313ce5671461045e57806339509351146104665780633973b5961461049257806340c10f19146104c457610273565b80630e969a051161023c5780630e969a05146103c45780631785f53c146103e257806318160ddd146104085780631fb45ec01461041057806323b872dd1461041857806324600fc31461044e57610273565b806241c52c146102785780630263b858146102b057806306fdde03146102e1578063095ea7b31461035e5780630a2eb3011461039e575b600080fd5b61029e6004803603602081101561028e57600080fd5b50356001600160a01b03166109d2565b60408051918252519081900360200190f35b6102df600480360360408110156102c657600080fd5b5080356001600160a01b0316906020013560ff166109f1565b005b6102e9610b35565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032357818101518382015260200161030b565b50505050905090810190601f1680156103505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61038a6004803603604081101561037457600080fd5b506001600160a01b038135169060200135610bcc565b604080519115158252519081900360200190f35b61038a600480360360208110156103b457600080fd5b50356001600160a01b0316610bea565b6103cc610c08565b6040805160ff9092168252519081900360200190f35b6102df600480360360208110156103f857600080fd5b50356001600160a01b0316610c0d565b61029e610d0c565b6103cc610d12565b61038a6004803603606081101561042e57600080fd5b506001600160a01b03813581169160208101359091169060400135610d17565b6102df610dda565b61038a610de5565b6103cc610dee565b61038a6004803603604081101561047c57600080fd5b506001600160a01b038135169060200135610df7565b6102df600480360360608110156104a857600080fd5b5060ff8135811691602081013590911690604001351515610e50565b61038a600480360360408110156104da57600080fd5b506001600160a01b038135169060200135610f0d565b61029e6004803603602081101561050657600080fd5b50356001600160a01b0316610f71565b6102df6004803603602081101561052c57600080fd5b81019060208101813564010000000081111561054757600080fd5b82018360208201111561055957600080fd5b8035906020019184602083028401116401000000008311171561057b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610fa3945050505050565b6102df610fd7565b61029e600480360360208110156105d757600080fd5b50356001600160a01b0316611000565b6105ef611069565b604080516001600160a01b039092168252519081900360200190f35b6102df6004803603602081101561062157600080fd5b50356001600160a01b031661107d565b61029e6004803603602081101561064757600080fd5b50356001600160a01b031661117b565b6102df611196565b61038a6004803603602081101561067557600080fd5b50356001600160a01b0316611238565b6102e96004803603602081101561069b57600080fd5b503560ff1661124d565b6102df600480360360208110156106bb57600080fd5b50356001600160a01b03166112d5565b6105ef611370565b6103cc600480360360208110156106e957600080fd5b50356001600160a01b031661137f565b61038a6004803603604081101561070f57600080fd5b506001600160a01b0381358116916020013516611394565b6102e9611406565b6102e9611467565b61038a6004803603604081101561074d57600080fd5b506001600160a01b038135169060200135611495565b61038a6004803603604081101561077957600080fd5b506001600160a01b0381351690602001356114f9565b61038a600480360360408110156107a557600080fd5b506001600160a01b038135169060200135611567565b61029e6115eb565b6102e96115f1565b6102df600480360360a08110156107e157600080fd5b8101906020810181356401000000008111156107fc57600080fd5b82018360208201111561080e57600080fd5b8035906020019184600183028401116401000000008311171561083057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561088357600080fd5b82018360208201111561089557600080fd5b803590602001918460018302840111640100000000831117156108b757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335811694506020840135169260400135915061160d9050565b6103cc6004803603606081101561092657600080fd5b506001600160a01b0381358116916020810135909116906040013561173e565b6102df61179e565b61029e6004803603604081101561096457600080fd5b506001600160a01b038135811691602001351661186e565b6102e9611899565b61038a6004803603604081101561099a57600080fd5b5060ff813581169160200135166118bc565b6102df600480360360208110156109c257600080fd5b50356001600160a01b03166118dc565b6001600160a01b0381166000908152609960205260409020545b919050565b6109fa33610bea565b610a355760405162461bcd60e51b8152600401808060200182810382526028815260200180612a946028913960400191505060405180910390fd5b60ff8116610a8a576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c69642077686974656c69737420494420737570706c696564000000604482015290519081900360640190fd5b6001600160a01b038216600090815260cd60205260409020805460ff83811660ff19831617909255168015610af557604051339060ff8316906001600160a01b038616907fb50a30a0fa972f89fbb2b514d12b31f5a5d64f53603402de7939742cd8507f6e90600090a45b604051339060ff8416906001600160a01b038616907fca6d1e885708b837a7647aeb7f4163ee4ca96058e08ac767be8d23c972c5027090600090a4505050565b60688054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bc15780601f10610b9657610100808354040283529160200191610bc1565b820191906000526020600020905b815481529060010190602001808311610ba457829003601f168201915b505050505090505b90565b6000610be0610bd96119d5565b84846119d9565b5060015b92915050565b6001600160a01b0316600090815260cc602052604090205460ff1690565b600081565b610c156119d5565b609a546001600160a01b03908116911614610c65576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260cc602052604090205460ff161515600114610cc15760405162461bcd60e51b815260040180806020018281038252603d8152602001806129fa603d913960400191505060405180910390fd5b6001600160a01b038116600081815260cc6020526040808220805460ff19169055513392917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b60675490565b600181565b60008383836000610d2984848461173e565b905060ff811615610d398261124d565b90610dc25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d87578181015183820152602001610d6f565b50505050905090810190601f168015610db45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610dce888888611ac5565b98975050505050505050565b610de333611b4d565b565b60cf5460ff1690565b606a5460ff1690565b6000610be0610e046119d5565b84610e4b8560666000610e156119d5565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611c2916565b6119d9565b610e5933610bea565b610e945760405162461bcd60e51b8152600401808060200182810382526028815260200180612a946028913960400191505060405180910390fd5b60ff838116600081815260ce6020908152604080832087861680855290835292819020805487151560ff1982168117909255825196168015158752928601528051919492939233927fb0353d563a9aa5231878c83727dc723a3cb8a38c2917f8ac2b777aa564c8a0d5929181900390910190a450505050565b6000610f176119d5565b609a546001600160a01b03908116911614610f67576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b610be08383611c83565b6001600160a01b038116600090815260996020526040812054610be490610f9784611000565b9063ffffffff611ced16565b60005b8151811015610fd357610fcb828281518110610fbe57fe5b6020026020010151611b4d565b600101610fa6565b5050565b6000610fe1611d2f565b90506000811315610ffd57610ffd610ff882611dca565b611ddd565b50565b6001600160a01b038116600090815260986020526040812054600160801b9061105b906110569061104a6110456110368861117b565b6097549063ffffffff611e9c16565b611ef5565b9063ffffffff611f0516565b611dca565b8161106257fe5b0492915050565b60cf5461010090046001600160a01b031681565b6110856119d5565b609a546001600160a01b039081169116146110d5576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260cc602052604090205460ff161561112d5760405162461bcd60e51b8152600401808060200182810382526035815260200180612c726035913960400191505060405180910390fd5b6001600160a01b038116600081815260cc6020526040808220805460ff19166001179055513392917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b6001600160a01b031660009081526065602052604090205490565b61119e6119d5565b609a546001600160a01b039081169116146111ee576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b609a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609a80546001600160a01b0319169055565b60cc6020526000908152604090205460ff1681565b606060ff821661127b57506040805180820190915260078152665355434345535360c81b60208201526109ec565b60ff8216600114156112a7576040518060600160405280603c8152602001612bdf603c913990506109ec565b5050604080518082019091526012815271556e6b6e6f776e204572726f7220436f646560701b602082015290565b6112de33610bea565b6113195760405162461bcd60e51b8152600401808060200182810382526028815260200180612a946028913960400191505060405180910390fd5b6001600160a01b038116600081815260cd6020526040808220805460ff198116909155905160ff90911692339284927fb50a30a0fa972f89fbb2b514d12b31f5a5d64f53603402de7939742cd8507f6e9190a45050565b609a546001600160a01b031690565b60cd6020526000908152604090205460ff1681565b6001600160a01b03808316600090815260cd6020526040808220549284168252812054909160ff90811691168115806113ce575060ff8116155b156113de57600092505050610be4565b60ff918216600090815260ce6020908152604080832093851683529290522054169392505050565b60698054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bc15780601f10610b9657610100808354040283529160200191610bc1565b60405180604001604052806012815260200171556e6b6e6f776e204572726f7220436f646560701b81525081565b600061149f6119d5565b609a546001600160a01b039081169116146114ef576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b610be08383611f38565b6000610be06115066119d5565b84610e4b85604051806060016040528060258152602001612c1b60259139606660006115306119d5565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611f8216565b6000338383600061157984848461173e565b905060ff8116156115898261124d565b906115d55760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610d87578181015183820152602001610d6f565b506115e08787611fdc565b979650505050505050565b60d05481565b6040518060600160405280603c8152602001612bdf603c913981565b600054610100900460ff16806116265750611626611ff0565b80611634575060005460ff16155b61166f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff1615801561169a576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166116df5760405162461bcd60e51b81526004018080602001828103825260308152602001806129ca6030913960400191505060405180910390fd5b6116e98686611ff6565b6116f16120ab565b60cf8054610100600160a81b0319166101006001600160a01b0387160217905561171a836118dc565b6117248383611c83565b8015611736576000805461ff00191690555b505050505050565b6000611748610de5565b61175457506000611797565b61175c611370565b6001600160a01b0316846001600160a01b0316141561177d57506000611797565b6117878484611394565b61179357506001611797565b5060005b9392505050565b6117a66119d5565b609a546001600160a01b039081169116146117f6576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b60cf5460ff166118375760405162461bcd60e51b8152600401808060200182810382526022815260200180612b536022913960400191505060405180910390fd5b60cf805460ff1916905560405133907f3c13a557aa89734e312c348465096b4ddc97709822675c45090f4e2a8d6c4f2b90600090a2565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b604051806040016040528060078152602001665355434345535360c81b81525081565b60ce60209081526000928352604080842090915290825290205460ff1681565b6118e46119d5565b609a546001600160a01b03908116911614611934576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b6001600160a01b0381166119795760405162461bcd60e51b81526004018080602001828103825260268152602001806129826026913960400191505060405180910390fd5b609a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609a80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611a1e5760405162461bcd60e51b8152600401808060200182810382526024815260200180612bbb6024913960400191505060405180910390fd5b6001600160a01b038216611a635760405162461bcd60e51b81526004018080602001828103825260228152602001806129a86022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000611ad284848461215c565b611b4384611ade6119d5565b610e4b85604051806060016040528060288152602001612add602891396001600160a01b038a16600090815260666020526040812090611b1c6119d5565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611f8216565b5060019392505050565b6000611b5882612204565b60cf546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151939450610100909204169163a9059cbb916044808201926020929091908290030181600087803b158015611bb557600080fd5b505af1158015611bc9573d6000803e3d6000fd5b505050506040513d6020811015611bdf57600080fd5b5051611c1c5760405162461bcd60e51b8152600401808060200182810382526032815260200180612c406032913960400191505060405180910390fd5b611c24611d2f565b505050565b600082820183811015611797576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b611c8d8282612294565b611ccd611ca861104583609754611e9c90919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff61239216565b6001600160a01b0390921660009081526098602052604090209190915550565b600061179783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f82565b60d05460cf54604080516370a0823160e01b815230600482015290516000939261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611d8357600080fd5b505afa158015611d97573d6000803e3d6000fd5b505050506040513d6020811015611dad57600080fd5b505160d0819055611dc4908263ffffffff61239216565b91505090565b600080821215611dd957600080fd5b5090565b6000611de7610d0c565b11611e235760405162461bcd60e51b8152600401808060200182810382526037815260200180612a5d6037913960400191505060405180910390fd5b8015610ffd57611e60611e34610d0c565b611e4883600160801b63ffffffff611e9c16565b81611e4f57fe5b60975491900463ffffffff611c2916565b60975560408051828152905133917f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd919081900360200190a250565b600082611eab57506000610be4565b82820282848281611eb857fe5b04146117975760405162461bcd60e51b8152600401808060200182810382526021815260200180612abc6021913960400191505060405180910390fd5b60008181811215610be457600080fd5b6000828201818312801590611f1a5750838112155b80611f2f5750600083128015611f2f57508381125b61179757600080fd5b611f4282826123cc565b611ccd611f5d61104583609754611e9c90919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff611f0516565b60008184841115611fd45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610d87578181015183820152602001610d6f565b505050900390565b6000610be0611fe96119d5565b848461215c565b303b1590565b600054610100900460ff168061200f575061200f611ff0565b8061201d575060005460ff16155b6120585760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612083576000805460ff1961ff0019909116610100171660011790555b61208b6124d4565b6120958383612574565b8015611c24576000805461ff0019169055505050565b600054610100900460ff16806120c457506120c4611ff0565b806120d2575060005460ff16155b61210d5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612138576000805460ff1961ff0019909116610100171660011790555b6121406124d4565b61214861264c565b8015610ffd576000805461ff001916905550565b612167838383612745565b600061218161104583609754611e9c90919063ffffffff16565b6001600160a01b0385166000908152609860205260409020549091506121ad908263ffffffff611f0516565b6001600160a01b0380861660009081526098602052604080822093909355908516815220546121e2908263ffffffff61239216565b6001600160a01b03909316600090815260986020526040902092909255505050565b60008061221083610f71565b6001600160a01b03841660009081526099602052604090205490915061223c908263ffffffff611c2916565b6001600160a01b038416600081815260996020908152604091829020939093558051848152905191927feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d92918290030190a292915050565b6001600160a01b0382166122ef576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6122fb60008383611c24565b60675461230e908263ffffffff611c2916565b6067556001600160a01b03821660009081526065602052604090205461233a908263ffffffff611c2916565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008082121580156123a657508282840313155b806123bd57506000821280156123bd575082828403135b6123c657600080fd5b50900390565b6001600160a01b0382166124115760405162461bcd60e51b8152600401808060200182810382526021815260200180612b756021913960400191505060405180910390fd5b61241d82600083611c24565b61246081604051806060016040528060228152602001612960602291396001600160a01b038516600090815260656020526040902054919063ffffffff611f8216565b6001600160a01b03831660009081526065602052604090205560675461248c908263ffffffff611ced16565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600054610100900460ff16806124ed57506124ed611ff0565b806124fb575060005460ff16155b6125365760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612148576000805460ff1961ff0019909116610100171660011790558015610ffd576000805461ff001916905550565b600054610100900460ff168061258d575061258d611ff0565b8061259b575060005460ff16155b6125d65760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612601576000805460ff1961ff0019909116610100171660011790555b82516126149060689060208601906128ae565b5081516126289060699060208501906128ae565b50606a805460ff191660121790558015611c24576000805461ff0019169055505050565b600054610100900460ff16806126655750612665611ff0565b80612673575060005460ff16155b6126ae5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff161580156126d9576000805460ff1961ff0019909116610100171660011790555b60006126e36119d5565b609a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610ffd576000805461ff001916905550565b6001600160a01b03831661278a5760405162461bcd60e51b8152600401808060200182810382526025815260200180612b966025913960400191505060405180910390fd5b6001600160a01b0382166127cf5760405162461bcd60e51b815260040180806020018281038252602381526020018061293d6023913960400191505060405180910390fd5b6127da838383611c24565b61281d81604051806060016040528060268152602001612a37602691396001600160a01b038616600090815260656020526040902054919063ffffffff611f8216565b6001600160a01b038085166000908152606560205260408082209390935590841681522054612852908263ffffffff611c2916565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128ef57805160ff191683800117855561291c565b8280016001018555821561291c579182015b8281111561291c578251825591602001919060010190612901565b50611dd992610bc99250905b80821115611dd9576000815560010161292856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737353696d706c65526573747269637465644644543a20494e56414c49445f46554e44535f544f4b454e5f414444524553534163636f756e7420746f2062652072656d6f7665642066726f6d2061646d696e206c697374206973206e6f7420616c726561647920616e2061646d696e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6473446973747269627574696f6e546f6b656e2e5f6469737472696275746546756e64733a20535550504c595f49535f5a45524f43616c6c696e67206163636f756e74206973206e6f7420616e2061646d696e6973747261746f722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645265737472696374696f6e732061726520616c72656164792064697361626c65642e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865207472616e736665722077617320726573747269637465642064756520746f207768697465206c69737420636f6e66696775726174696f6e2e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f53696d706c65526573747269637465644644542e776974686472617746756e64733a205452414e534645525f4641494c45444163636f756e7420746f20626520616464656420746f2061646d696e206c69737420697320616c726561647920616e2061646d696ea2646970667358221220151144357c875d43ea3d5eecc57f1f73f2058738d59e6d5f12d08ce3d815d19664736f6c634300060b0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102735760003560e01c806370a0823111610151578063a457c2d7116100c3578063d4ce141511610087578063d4ce141514610910578063dce306ad14610946578063dd62ed3e1461094e578063e7984d171461097c578063e959450814610984578063f2fde38b146109ac57610273565b8063a457c2d714610763578063a9059cbb1461078f578063a9691f3f146107bb578063c8934462146107c3578063c9aba0aa146107cb57610273565b80638da5cb5b116101155780638da5cb5b146106cb57806392e6d68b146106d35780639437e2fe146106f957806395d89b411461072757806397af67441461072f5780639dc29fac1461073757610273565b806370a0823114610631578063715018a61461065757806376be15851461065f5780637f4ab1dd146106855780638ab1d681146106a557610273565b80632a642407116101ea578063443bb293116101ae578063443bb293146104f057806345f634f21461051657806346c162de146105b95780634e97415f146105c157806363f04b15146105e7578063704802751461060b57610273565b80632a64240714610456578063313ce5671461045e57806339509351146104665780633973b5961461049257806340c10f19146104c457610273565b80630e969a051161023c5780630e969a05146103c45780631785f53c146103e257806318160ddd146104085780631fb45ec01461041057806323b872dd1461041857806324600fc31461044e57610273565b806241c52c146102785780630263b858146102b057806306fdde03146102e1578063095ea7b31461035e5780630a2eb3011461039e575b600080fd5b61029e6004803603602081101561028e57600080fd5b50356001600160a01b03166109d2565b60408051918252519081900360200190f35b6102df600480360360408110156102c657600080fd5b5080356001600160a01b0316906020013560ff166109f1565b005b6102e9610b35565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032357818101518382015260200161030b565b50505050905090810190601f1680156103505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61038a6004803603604081101561037457600080fd5b506001600160a01b038135169060200135610bcc565b604080519115158252519081900360200190f35b61038a600480360360208110156103b457600080fd5b50356001600160a01b0316610bea565b6103cc610c08565b6040805160ff9092168252519081900360200190f35b6102df600480360360208110156103f857600080fd5b50356001600160a01b0316610c0d565b61029e610d0c565b6103cc610d12565b61038a6004803603606081101561042e57600080fd5b506001600160a01b03813581169160208101359091169060400135610d17565b6102df610dda565b61038a610de5565b6103cc610dee565b61038a6004803603604081101561047c57600080fd5b506001600160a01b038135169060200135610df7565b6102df600480360360608110156104a857600080fd5b5060ff8135811691602081013590911690604001351515610e50565b61038a600480360360408110156104da57600080fd5b506001600160a01b038135169060200135610f0d565b61029e6004803603602081101561050657600080fd5b50356001600160a01b0316610f71565b6102df6004803603602081101561052c57600080fd5b81019060208101813564010000000081111561054757600080fd5b82018360208201111561055957600080fd5b8035906020019184602083028401116401000000008311171561057b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610fa3945050505050565b6102df610fd7565b61029e600480360360208110156105d757600080fd5b50356001600160a01b0316611000565b6105ef611069565b604080516001600160a01b039092168252519081900360200190f35b6102df6004803603602081101561062157600080fd5b50356001600160a01b031661107d565b61029e6004803603602081101561064757600080fd5b50356001600160a01b031661117b565b6102df611196565b61038a6004803603602081101561067557600080fd5b50356001600160a01b0316611238565b6102e96004803603602081101561069b57600080fd5b503560ff1661124d565b6102df600480360360208110156106bb57600080fd5b50356001600160a01b03166112d5565b6105ef611370565b6103cc600480360360208110156106e957600080fd5b50356001600160a01b031661137f565b61038a6004803603604081101561070f57600080fd5b506001600160a01b0381358116916020013516611394565b6102e9611406565b6102e9611467565b61038a6004803603604081101561074d57600080fd5b506001600160a01b038135169060200135611495565b61038a6004803603604081101561077957600080fd5b506001600160a01b0381351690602001356114f9565b61038a600480360360408110156107a557600080fd5b506001600160a01b038135169060200135611567565b61029e6115eb565b6102e96115f1565b6102df600480360360a08110156107e157600080fd5b8101906020810181356401000000008111156107fc57600080fd5b82018360208201111561080e57600080fd5b8035906020019184600183028401116401000000008311171561083057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561088357600080fd5b82018360208201111561089557600080fd5b803590602001918460018302840111640100000000831117156108b757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335811694506020840135169260400135915061160d9050565b6103cc6004803603606081101561092657600080fd5b506001600160a01b0381358116916020810135909116906040013561173e565b6102df61179e565b61029e6004803603604081101561096457600080fd5b506001600160a01b038135811691602001351661186e565b6102e9611899565b61038a6004803603604081101561099a57600080fd5b5060ff813581169160200135166118bc565b6102df600480360360208110156109c257600080fd5b50356001600160a01b03166118dc565b6001600160a01b0381166000908152609960205260409020545b919050565b6109fa33610bea565b610a355760405162461bcd60e51b8152600401808060200182810382526028815260200180612a946028913960400191505060405180910390fd5b60ff8116610a8a576040805162461bcd60e51b815260206004820152601d60248201527f496e76616c69642077686974656c69737420494420737570706c696564000000604482015290519081900360640190fd5b6001600160a01b038216600090815260cd60205260409020805460ff83811660ff19831617909255168015610af557604051339060ff8316906001600160a01b038616907fb50a30a0fa972f89fbb2b514d12b31f5a5d64f53603402de7939742cd8507f6e90600090a45b604051339060ff8416906001600160a01b038616907fca6d1e885708b837a7647aeb7f4163ee4ca96058e08ac767be8d23c972c5027090600090a4505050565b60688054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bc15780601f10610b9657610100808354040283529160200191610bc1565b820191906000526020600020905b815481529060010190602001808311610ba457829003601f168201915b505050505090505b90565b6000610be0610bd96119d5565b84846119d9565b5060015b92915050565b6001600160a01b0316600090815260cc602052604090205460ff1690565b600081565b610c156119d5565b609a546001600160a01b03908116911614610c65576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260cc602052604090205460ff161515600114610cc15760405162461bcd60e51b815260040180806020018281038252603d8152602001806129fa603d913960400191505060405180910390fd5b6001600160a01b038116600081815260cc6020526040808220805460ff19169055513392917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b60675490565b600181565b60008383836000610d2984848461173e565b905060ff811615610d398261124d565b90610dc25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d87578181015183820152602001610d6f565b50505050905090810190601f168015610db45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610dce888888611ac5565b98975050505050505050565b610de333611b4d565b565b60cf5460ff1690565b606a5460ff1690565b6000610be0610e046119d5565b84610e4b8560666000610e156119d5565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611c2916565b6119d9565b610e5933610bea565b610e945760405162461bcd60e51b8152600401808060200182810382526028815260200180612a946028913960400191505060405180910390fd5b60ff838116600081815260ce6020908152604080832087861680855290835292819020805487151560ff1982168117909255825196168015158752928601528051919492939233927fb0353d563a9aa5231878c83727dc723a3cb8a38c2917f8ac2b777aa564c8a0d5929181900390910190a450505050565b6000610f176119d5565b609a546001600160a01b03908116911614610f67576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b610be08383611c83565b6001600160a01b038116600090815260996020526040812054610be490610f9784611000565b9063ffffffff611ced16565b60005b8151811015610fd357610fcb828281518110610fbe57fe5b6020026020010151611b4d565b600101610fa6565b5050565b6000610fe1611d2f565b90506000811315610ffd57610ffd610ff882611dca565b611ddd565b50565b6001600160a01b038116600090815260986020526040812054600160801b9061105b906110569061104a6110456110368861117b565b6097549063ffffffff611e9c16565b611ef5565b9063ffffffff611f0516565b611dca565b8161106257fe5b0492915050565b60cf5461010090046001600160a01b031681565b6110856119d5565b609a546001600160a01b039081169116146110d5576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260cc602052604090205460ff161561112d5760405162461bcd60e51b8152600401808060200182810382526035815260200180612c726035913960400191505060405180910390fd5b6001600160a01b038116600081815260cc6020526040808220805460ff19166001179055513392917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b6001600160a01b031660009081526065602052604090205490565b61119e6119d5565b609a546001600160a01b039081169116146111ee576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b609a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609a80546001600160a01b0319169055565b60cc6020526000908152604090205460ff1681565b606060ff821661127b57506040805180820190915260078152665355434345535360c81b60208201526109ec565b60ff8216600114156112a7576040518060600160405280603c8152602001612bdf603c913990506109ec565b5050604080518082019091526012815271556e6b6e6f776e204572726f7220436f646560701b602082015290565b6112de33610bea565b6113195760405162461bcd60e51b8152600401808060200182810382526028815260200180612a946028913960400191505060405180910390fd5b6001600160a01b038116600081815260cd6020526040808220805460ff198116909155905160ff90911692339284927fb50a30a0fa972f89fbb2b514d12b31f5a5d64f53603402de7939742cd8507f6e9190a45050565b609a546001600160a01b031690565b60cd6020526000908152604090205460ff1681565b6001600160a01b03808316600090815260cd6020526040808220549284168252812054909160ff90811691168115806113ce575060ff8116155b156113de57600092505050610be4565b60ff918216600090815260ce6020908152604080832093851683529290522054169392505050565b60698054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bc15780601f10610b9657610100808354040283529160200191610bc1565b60405180604001604052806012815260200171556e6b6e6f776e204572726f7220436f646560701b81525081565b600061149f6119d5565b609a546001600160a01b039081169116146114ef576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b610be08383611f38565b6000610be06115066119d5565b84610e4b85604051806060016040528060258152602001612c1b60259139606660006115306119d5565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611f8216565b6000338383600061157984848461173e565b905060ff8116156115898261124d565b906115d55760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610d87578181015183820152602001610d6f565b506115e08787611fdc565b979650505050505050565b60d05481565b6040518060600160405280603c8152602001612bdf603c913981565b600054610100900460ff16806116265750611626611ff0565b80611634575060005460ff16155b61166f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff1615801561169a576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166116df5760405162461bcd60e51b81526004018080602001828103825260308152602001806129ca6030913960400191505060405180910390fd5b6116e98686611ff6565b6116f16120ab565b60cf8054610100600160a81b0319166101006001600160a01b0387160217905561171a836118dc565b6117248383611c83565b8015611736576000805461ff00191690555b505050505050565b6000611748610de5565b61175457506000611797565b61175c611370565b6001600160a01b0316846001600160a01b0316141561177d57506000611797565b6117878484611394565b61179357506001611797565b5060005b9392505050565b6117a66119d5565b609a546001600160a01b039081169116146117f6576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b60cf5460ff166118375760405162461bcd60e51b8152600401808060200182810382526022815260200180612b536022913960400191505060405180910390fd5b60cf805460ff1916905560405133907f3c13a557aa89734e312c348465096b4ddc97709822675c45090f4e2a8d6c4f2b90600090a2565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b604051806040016040528060078152602001665355434345535360c81b81525081565b60ce60209081526000928352604080842090915290825290205460ff1681565b6118e46119d5565b609a546001600160a01b03908116911614611934576040805162461bcd60e51b81526020600482018190526024820152600080516020612b05833981519152604482015290519081900360640190fd5b6001600160a01b0381166119795760405162461bcd60e51b81526004018080602001828103825260268152602001806129826026913960400191505060405180910390fd5b609a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609a80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316611a1e5760405162461bcd60e51b8152600401808060200182810382526024815260200180612bbb6024913960400191505060405180910390fd5b6001600160a01b038216611a635760405162461bcd60e51b81526004018080602001828103825260228152602001806129a86022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000611ad284848461215c565b611b4384611ade6119d5565b610e4b85604051806060016040528060288152602001612add602891396001600160a01b038a16600090815260666020526040812090611b1c6119d5565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611f8216565b5060019392505050565b6000611b5882612204565b60cf546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151939450610100909204169163a9059cbb916044808201926020929091908290030181600087803b158015611bb557600080fd5b505af1158015611bc9573d6000803e3d6000fd5b505050506040513d6020811015611bdf57600080fd5b5051611c1c5760405162461bcd60e51b8152600401808060200182810382526032815260200180612c406032913960400191505060405180910390fd5b611c24611d2f565b505050565b600082820183811015611797576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b611c8d8282612294565b611ccd611ca861104583609754611e9c90919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff61239216565b6001600160a01b0390921660009081526098602052604090209190915550565b600061179783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f82565b60d05460cf54604080516370a0823160e01b815230600482015290516000939261010090046001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611d8357600080fd5b505afa158015611d97573d6000803e3d6000fd5b505050506040513d6020811015611dad57600080fd5b505160d0819055611dc4908263ffffffff61239216565b91505090565b600080821215611dd957600080fd5b5090565b6000611de7610d0c565b11611e235760405162461bcd60e51b8152600401808060200182810382526037815260200180612a5d6037913960400191505060405180910390fd5b8015610ffd57611e60611e34610d0c565b611e4883600160801b63ffffffff611e9c16565b81611e4f57fe5b60975491900463ffffffff611c2916565b60975560408051828152905133917f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd919081900360200190a250565b600082611eab57506000610be4565b82820282848281611eb857fe5b04146117975760405162461bcd60e51b8152600401808060200182810382526021815260200180612abc6021913960400191505060405180910390fd5b60008181811215610be457600080fd5b6000828201818312801590611f1a5750838112155b80611f2f5750600083128015611f2f57508381125b61179757600080fd5b611f4282826123cc565b611ccd611f5d61104583609754611e9c90919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff611f0516565b60008184841115611fd45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610d87578181015183820152602001610d6f565b505050900390565b6000610be0611fe96119d5565b848461215c565b303b1590565b600054610100900460ff168061200f575061200f611ff0565b8061201d575060005460ff16155b6120585760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612083576000805460ff1961ff0019909116610100171660011790555b61208b6124d4565b6120958383612574565b8015611c24576000805461ff0019169055505050565b600054610100900460ff16806120c457506120c4611ff0565b806120d2575060005460ff16155b61210d5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612138576000805460ff1961ff0019909116610100171660011790555b6121406124d4565b61214861264c565b8015610ffd576000805461ff001916905550565b612167838383612745565b600061218161104583609754611e9c90919063ffffffff16565b6001600160a01b0385166000908152609860205260409020549091506121ad908263ffffffff611f0516565b6001600160a01b0380861660009081526098602052604080822093909355908516815220546121e2908263ffffffff61239216565b6001600160a01b03909316600090815260986020526040902092909255505050565b60008061221083610f71565b6001600160a01b03841660009081526099602052604090205490915061223c908263ffffffff611c2916565b6001600160a01b038416600081815260996020908152604091829020939093558051848152905191927feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d92918290030190a292915050565b6001600160a01b0382166122ef576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6122fb60008383611c24565b60675461230e908263ffffffff611c2916565b6067556001600160a01b03821660009081526065602052604090205461233a908263ffffffff611c2916565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008082121580156123a657508282840313155b806123bd57506000821280156123bd575082828403135b6123c657600080fd5b50900390565b6001600160a01b0382166124115760405162461bcd60e51b8152600401808060200182810382526021815260200180612b756021913960400191505060405180910390fd5b61241d82600083611c24565b61246081604051806060016040528060228152602001612960602291396001600160a01b038516600090815260656020526040902054919063ffffffff611f8216565b6001600160a01b03831660009081526065602052604090205560675461248c908263ffffffff611ced16565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600054610100900460ff16806124ed57506124ed611ff0565b806124fb575060005460ff16155b6125365760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612148576000805460ff1961ff0019909116610100171660011790558015610ffd576000805461ff001916905550565b600054610100900460ff168061258d575061258d611ff0565b8061259b575060005460ff16155b6125d65760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff16158015612601576000805460ff1961ff0019909116610100171660011790555b82516126149060689060208601906128ae565b5081516126289060699060208501906128ae565b50606a805460ff191660121790558015611c24576000805461ff0019169055505050565b600054610100900460ff16806126655750612665611ff0565b80612673575060005460ff16155b6126ae5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b25602e913960400191505060405180910390fd5b600054610100900460ff161580156126d9576000805460ff1961ff0019909116610100171660011790555b60006126e36119d5565b609a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610ffd576000805461ff001916905550565b6001600160a01b03831661278a5760405162461bcd60e51b8152600401808060200182810382526025815260200180612b966025913960400191505060405180910390fd5b6001600160a01b0382166127cf5760405162461bcd60e51b815260040180806020018281038252602381526020018061293d6023913960400191505060405180910390fd5b6127da838383611c24565b61281d81604051806060016040528060268152602001612a37602691396001600160a01b038616600090815260656020526040902054919063ffffffff611f8216565b6001600160a01b038085166000908152606560205260408082209390935590841681522054612852908263ffffffff611c2916565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128ef57805160ff191683800117855561291c565b8280016001018555821561291c579182015b8281111561291c578251825591602001919060010190612901565b50611dd992610bc99250905b80821115611dd9576000815560010161292856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737353696d706c65526573747269637465644644543a20494e56414c49445f46554e44535f544f4b454e5f414444524553534163636f756e7420746f2062652072656d6f7665642066726f6d2061646d696e206c697374206973206e6f7420616c726561647920616e2061646d696e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6473446973747269627574696f6e546f6b656e2e5f6469737472696275746546756e64733a20535550504c595f49535f5a45524f43616c6c696e67206163636f756e74206973206e6f7420616e2061646d696e6973747261746f722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645265737472696374696f6e732061726520616c72656164792064697361626c65642e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865207472616e736665722077617320726573747269637465642064756520746f207768697465206c69737420636f6e66696775726174696f6e2e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f53696d706c65526573747269637465644644542e776974686472617746756e64733a205452414e534645525f4641494c45444163636f756e7420746f20626520616464656420746f2061646d696e206c69737420697320616c726561647920616e2061646d696ea2646970667358221220151144357c875d43ea3d5eecc57f1f73f2058738d59e6d5f12d08ce3d815d19664736f6c634300060b0033",
  "immutableReferences": {},
  "sourceMap": "9713:6921:51:-:0;;;7895:40;;;-1:-1:-1;;7895:40:51;7931:4;7895:40;;;9713:6921;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "9713:6921:51:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3761:117:48;;;;;;;;;;;;;;;;-1:-1:-1;3761:117:48;-1:-1:-1;;;;;3761:117:48;;:::i;:::-;;;;;;;;;;;;;;;;4326:908:51;;;;;;;;;;;;;;;;-1:-1:-1;4326:908:51;;-1:-1:-1;;;;;4326:908:51;;;;;;;;:::i;:::-;;2469:81:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4505:166;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4505:166:111;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2590:128:51;;;;;;;;;;;;;;;;-1:-1:-1;2590:128:51;-1:-1:-1;;;;;2590:128:51;;:::i;10000:38::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1986:504;;;;;;;;;;;;;;;;-1:-1:-1;1986:504:51;-1:-1:-1;;;;;1986:504:51;;:::i;3512:98:111:-;;;:::i;10044:47:51:-;;;:::i;13190:257::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13190:257:51;;;;;;;;;;;;;;;;;:::i;11212:89::-;;;:::i;8597:103::-;;;:::i;3371:81:111:-;;;:::i;5843:215::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5843:215:111;;;;;;;;:::i;6059:666:51:-;;;;;;;;;;;;;;;;-1:-1:-1;6059:666:51;;;;;;;;;;;;;;;;;;;;:::i;13581:139::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13581:139:51;;;;;;;;:::i;3357:162:48:-;;;;;;;;;;;;;;;;-1:-1:-1;3357:162:48;-1:-1:-1;;;;;3357:162:48;;:::i;12565:164:51:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12565:164:51;;-1:-1:-1;12565:164:51;;-1:-1:-1;;;;;12565:164:51:i;11644:196::-;;;:::i;4324:228:48:-;;;;;;;;;;;;;;;;-1:-1:-1;4324:228:48;-1:-1:-1;;;;;4324:228:48;;:::i;10416:24:51:-;;;:::i;:::-;;;;-1:-1:-1;;;;;10416:24:51;;;;;;;;;;;;;;1372:486;;;;;;;;;;;;;;;;-1:-1:-1;1372:486:51;-1:-1:-1;;;;;1372:486:51;;:::i;3668:117:111:-;;;;;;;;;;;;;;;;-1:-1:-1;3668:117:111;-1:-1:-1;;;;;3668:117:111;;:::i;1894:145:109:-;;;:::i;736:46:51:-;;;;;;;;;;;;;;;;-1:-1:-1;736:46:51;-1:-1:-1;;;;;736:46:51;;:::i;15290:439::-;;;;;;;;;;;;;;;;-1:-1:-1;15290:439:51;;;;:::i;5365:500::-;;;;;;;;;;;;;;;;-1:-1:-1;5365:500:51;-1:-1:-1;;;;;5365:500:51;;:::i;1271:77:109:-;;;:::i;3265:50:51:-;;;;;;;;;;;;;;;;-1:-1:-1;3265:50:51;-1:-1:-1;;;;;3265:50:51;;:::i;6919:689::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6919:689:51;;;;;;;;;;:::i;2663:85:111:-;;;:::i;10276:59:51:-;;;:::i;13860:139::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13860:139:51;;;;;;;;:::i;6545:266:111:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6545:266:111;;;;;;;;:::i;12840:235:51:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12840:235:51;;;;;;;;:::i;10524:32::-;;;:::i;10153:117::-;;;:::i;11964:521::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11964:521:51;;;;;;;;-1:-1:-1;11964:521:51;;-1:-1:-1;;11964:521:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11964:521:51;;-1:-1:-1;;;;;;;11964:521:51;;;;;-1:-1:-1;11964:521:51;;;;;;;;;;-1:-1:-1;11964:521:51;;-1:-1:-1;11964:521:51:i;14187:861::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14187:861:51;;;;;;;;;;;;;;;;;:::i;8233:272::-;;;:::i;4218:149:111:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4218:149:111;;;;;;;;;;:::i;10097:50:51:-;;;:::i;3471:73::-;;;;;;;;;;;;;;;;-1:-1:-1;3471:73:51;;;;;;;;;;;:::i;2188:240:109:-;;;;;;;;;;;;;;;;-1:-1:-1;2188:240:109;-1:-1:-1;;;;;2188:240:109;;:::i;3761:117:48:-;-1:-1:-1;;;;;3849:22:48;;3823:7;3849:22;;;:14;:22;;;;;;3761:117;;;;:::o;4326:908:51:-;1138:27;1154:10;1138:15;:27::i;:::-;1117:114;;;;-1:-1:-1;;;1117:114:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4493:25:::1;::::0;::::1;4485:67;;;::::0;;-1:-1:-1;;;4485:67:51;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;4633:31:51;::::1;4607:23;4633:31:::0;;;:17:::1;:31;::::0;;;;;;::::1;4718:43:::0;;::::1;-1:-1:-1::0;;4718:43:51;::::1;;::::0;;;4633:31:::1;4866:33:::0;;4862:246:::1;;4963:134;::::0;5073:10:::1;::::0;4963:134:::1;::::0;::::1;::::0;-1:-1:-1;;;;;4963:134:51;::::1;::::0;::::1;::::0;;;::::1;4862:246;5167:60;::::0;5216:10:::1;::::0;5167:60:::1;::::0;::::1;::::0;-1:-1:-1;;;;;5167:60:51;::::1;::::0;::::1;::::0;;;::::1;1241:1;4326:908:::0;;:::o;2469:81:111:-;2538:5;2531:12;;;;;;;;-1:-1:-1;;2531:12:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2506:13;;2531:12;;2538:5;;2531:12;;2538:5;2531:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2469:81;;:::o;4505:166::-;4588:4;4604:39;4613:12;:10;:12::i;:::-;4627:7;4636:6;4604:8;:39::i;:::-;-1:-1:-1;4660:4:111;4505:166;;;;;:::o;2590:128:51:-;-1:-1:-1;;;;;2682:29:51;2659:4;2682:29;;;:14;:29;;;;;;;;;2590:128::o;10000:38::-;10037:1;10000:38;:::o;1986:504::-;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;-1:-1:-1;;;;;2120:29:51;::::1;;::::0;;;:14:::1;:29;::::0;;;;;::::1;;:37;;:29:::0;:37:::1;2099:145;;;;-1:-1:-1::0;;;2099:145:51::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;2347:29:51;::::1;2379:5;2347:29:::0;;;:14:::1;:29;::::0;;;;;:37;;-1:-1:-1;;2347:37:51::1;::::0;;2444:39;2472:10:::1;::::0;2347:29;2444:39:::1;::::0;::::1;1986:504:::0;:::o;3512:98:111:-;3591:12;;3512:98;:::o;10044:47:51:-;10090:1;10044:47;:::o;13190:257::-;13367:12;13290:4;13296:2;13300:5;10916:21;10940:42;10966:4;10972:2;10976:5;10940:25;:42::i;:::-;10916:66;-1:-1:-1;11013:31:51;;;;11058:46;10916:66;11058:29;:46::i;:::-;10992:122;;;;;-1:-1:-1;;;10992:122:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13405:35:::1;13424:4;13430:2;13434:5;13405:18;:35::i;:::-;13395:45:::0;13190:257;-1:-1:-1;;;;;;;;13190:257:51:o;11212:89::-;11265:29;11283:10;11265:17;:29::i;:::-;11212:89::o;8597:103::-;8673:20;;;;8597:103;:::o;3371:81:111:-;3436:9;;;;3371:81;:::o;5843:215::-;5931:4;5947:83;5956:12;:10;:12::i;:::-;5970:7;5979:50;6018:10;5979:11;:25;5991:12;:10;:12::i;:::-;-1:-1:-1;;;;;5979:25:111;;;;;;;;;;;;;;;;;-1:-1:-1;5979:25:111;;;:34;;;;;;;;;;;:50;:38;:50;:::i;:::-;5947:8;:83::i;6059:666:51:-;1138:27;1154:10;1138:15;:27::i;:::-;1117:114;;;;-1:-1:-1;;;1117:114:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6296:42:::1;::::0;;::::1;6273:20;6296:42:::0;;;:25:::1;:42;::::0;;;;;;;:64;;::::1;::::0;;;;;;;;;;;;6406:82;::::1;;-1:-1:-1::0;;6406:82:51;::::1;::::0;::::1;::::0;;;6539:179;;6296:64;::::1;6539:179:::0;::::1;;::::0;;;;::::1;::::0;;;6296:64;;;;:42;6577:10:::1;::::0;6539:179:::1;::::0;;;;;;;;;::::1;1241:1;6059:666:::0;;;:::o;13581:139::-;13654:4;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;13670:22:51::1;13676:7;13685:6;13670:5;:22::i;3357:162:48:-:0;-1:-1:-1;;;;;3489:22:48;;3431:7;3489:22;;;:14;:22;;;;;;3457:55;;:27;3504:6;3457:19;:27::i;:::-;:31;:55;:31;:55;:::i;12565:164:51:-;12631:9;12626:97;12650:6;:13;12646:1;:17;12626:97;;;12684:28;12702:6;12709:1;12702:9;;;;;;;;;;;;;;12684:17;:28::i;:::-;12665:3;;12626:97;;;;12565:164;:::o;11644:196::-;11694:15;11712:26;:24;:26::i;:::-;11694:44;;11764:1;11753:8;:12;11749:85;;;11781:42;11798:24;:8;:22;:24::i;:::-;11781:16;:42::i;:::-;11644:196;:::o;4324:228:48:-;-1:-1:-1;;;;;4485:24:48;;4389:7;4485:24;;;:16;:24;;;;;;-1:-1:-1;;;1282:6:48;4415:111;;:95;;:52;:37;4434:17;4502:6;4434:9;:17::i;:::-;4415:14;;;:37;:18;:37;:::i;:::-;:50;:52::i;:::-;:69;:95;:69;:95;:::i;:::-;:109;:111::i;:::-;:130;;;;;;;4324:228;-1:-1:-1;;4324:228:48:o;10416:24:51:-;;;;;;-1:-1:-1;;;;;10416:24:51;;:::o;1372:486::-;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:26:51;::::1;;::::0;;;:14:::1;:26;::::0;;;;;::::1;;:35;1491:135;;;;-1:-1:-1::0;;;1491:135:51::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;1724:26:51;::::1;;::::0;;;:14:::1;:26;::::0;;;;;:33;;-1:-1:-1;;1724:33:51::1;1753:4;1724:33;::::0;;1817:34;1840:10:::1;::::0;1724:26;1817:34:::1;::::0;::::1;1372:486:::0;:::o;3668:117:111:-;-1:-1:-1;;;;;3760:18:111;3734:7;3760:18;;;:9;:18;;;;;;;3668:117::o;1894:145:109:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;1984:6:::1;::::0;1963:40:::1;::::0;2000:1:::1;::::0;-1:-1:-1;;;;;1984:6:109::1;::::0;1963:40:::1;::::0;2000:1;;1963:40:::1;2013:6;:19:::0;;-1:-1:-1;;;;;;2013:19:109::1;::::0;;1894:145::o;736:46:51:-;;;;;;;;;;;;;;;:::o;15290:439::-;15414:13;15447:31;;;15443:84;;-1:-1:-1;15501:15:51;;;;;;;;;;;;-1:-1:-1;;;15501:15:51;;;;15494:22;;15443:84;15541:40;;;10090:1;15541:40;15537:107;;;15604:29;;;;;;;;;;;;;;;;;15597:36;;;;15537:107;-1:-1:-1;;15709:13:51;;;;;;;;;;;;-1:-1:-1;;;15709:13:51;;;;;15290:439::o;5365:500::-;1138:27;1154:10;1138:15;:27::i;:::-;1117:114;;;;-1:-1:-1;;;1117:114:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5544:34:51;::::1;5518:23;5544:34:::0;;;:17:::1;:34;::::0;;;;;;;-1:-1:-1;;5633:49:51;::::1;::::0;;;5737:121;;5544:34:::1;::::0;;::::1;::::0;5838:10:::1;::::0;5544:34;;5737:121:::1;::::0;5518:23;5737:121:::1;1241:1;5365:500:::0;:::o;1271:77:109:-;1335:6;;-1:-1:-1;;;;;1335:6:109;1271:77;:::o;3265:50:51:-;;;;;;;;;;;;;;;:::o;6919:689::-;-1:-1:-1;;;;;7118:25:51;;;7029:4;7118:25;;;:17;:25;;;;;;;7179:27;;;;;;;;7029:4;;7118:25;;;;;7179:27;7313:31;;;:68;;-1:-1:-1;7348:33:51;;;;7313:68;7296:133;;;7413:5;7406:12;;;;;;7296:133;7540:42;;;;;;;;:25;:42;;;;;;;;:61;;;;;;;;;;;;6919:689;-1:-1:-1;;;6919:689:51:o;2663:85:111:-;2734:7;2727:14;;;;;;;;-1:-1:-1;;2727:14:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2702:13;;2727:14;;2734:7;;2727:14;;2734:7;2727:14;;;;;;;;;;;;;;;;;;;;;;;;10276:59:51;;;;;;;;;;;;;;-1:-1:-1;;;10276:59:51;;;;:::o;13860:139::-;13933:4;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;13949:22:51::1;13955:7;13964:6;13949:5;:22::i;6545:266:111:-:0;6638:4;6654:129;6663:12;:10;:12::i;:::-;6677:7;6686:96;6725:15;6686:96;;;;;;;;;;;;;;;;;:11;:25;6698:12;:10;:12::i;:::-;-1:-1:-1;;;;;6686:25:111;;;;;;;;;;;;;;;;;-1:-1:-1;6686:25:111;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;12840:235:51:-;13005:12;12922:10;12934:2;12938:5;10916:21;10940:42;10966:4;10972:2;10976:5;10940:25;:42::i;:::-;10916:66;-1:-1:-1;11013:31:51;;;;11058:46;10916:66;11058:29;:46::i;:::-;10992:122;;;;;-1:-1:-1;;;10992:122:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13043:25:::1;13058:2;13062:5;13043:14;:25::i;:::-;13033:35:::0;12840:235;-1:-1:-1;;;;;;;12840:235:51:o;10524:32::-;;;;:::o;10153:117::-;;;;;;;;;;;;;;;;;;;:::o;11964:521::-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;-1:-1:-1;;;;;12189:34:51;::::1;12168:129;;;;-1:-1:-1::0;;;12168:129:51::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12308:32;12327:4;12333:6;12308:18;:32::i;:::-;12350:22;:20;:22::i;:::-;12383:10;:24:::0;;-1:-1:-1;;;;;;12383:24:51::1;;-1:-1:-1::0;;;;;12383:24:51;::::1;;;::::0;;12417::::1;12435:5:::0;12417:17:::1;:24::i;:::-;12451:27;12457:5;12464:13;12451:5;:27::i;:::-;1268:14:108::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;1264:55;11964:521:51;;;;;;:::o;14187:861::-;14319:5;14488:22;:20;:22::i;:::-;14483:73;;-1:-1:-1;10037:1:51;14526:19;;14483:73;14654:7;:5;:7::i;:::-;-1:-1:-1;;;;;14646:15:51;:4;-1:-1:-1;;;;;14646:15:51;;14642:65;;;-1:-1:-1;10037:1:51;14677:19;;14642:65;14866:31;14888:4;14894:2;14866:21;:31::i;:::-;14861:91;;-1:-1:-1;10090:1:51;14913:28;;14861:91;-1:-1:-1;10037:1:51;14187:861;;;;;;:::o;8233:272::-;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;8299:20:51::1;::::0;::::1;;8291:67;;;;-1:-1:-1::0;;;8291:67:51::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8393:20;:28:::0;;-1:-1:-1;;8393:28:51::1;::::0;;8466:32:::1;::::0;8487:10:::1;::::0;8466:32:::1;::::0;8416:5:::1;::::0;8466:32:::1;8233:272::o:0;4218:149:111:-;-1:-1:-1;;;;;4333:18:111;;;4307:7;4333:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4218:149::o;10097:50:51:-;;;;;;;;;;;;;;-1:-1:-1;;;10097:50:51;;;;:::o;3471:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2188:240:109:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;-1:-1:-1;;;;;2276:22:109;::::1;2268:73;;;;-1:-1:-1::0;;;2268:73:109::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:6;::::0;2356:38:::1;::::0;-1:-1:-1;;;;;2356:38:109;;::::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:109::1;-1:-1:-1::0;;;;;2404:17:109;;;::::1;::::0;;;::::1;::::0;;2188:240::o;931:104:107:-;1018:10;931:104;:::o;9609:340:111:-;-1:-1:-1;;;;;9710:19:111;;9702:68;;;;-1:-1:-1;;;9702:68:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9788:21:111;;9780:68;;;;-1:-1:-1;;;9780:68:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9859:18:111;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9910:32;;;;;;;;;;;;;;;;;9609:340;;;:::o;5131:317::-;5237:4;5253:36;5263:6;5271:9;5282:6;5253:9;:36::i;:::-;5299:121;5308:6;5316:12;:10;:12::i;:::-;5330:89;5368:6;5330:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5330:19:111;;;;;;:11;:19;;;;;;5350:12;:10;:12::i;:::-;-1:-1:-1;;;;;5330:33:111;;;;;;;;;;;;-1:-1:-1;5330:33:111;;;:89;;:37;:89;:::i;5299:121::-;-1:-1:-1;5437:4:111;5131:317;;;;;:::o;15815:312:51:-;15876:25;15904:26;15924:5;15904:19;:26::i;:::-;15962:10;;:45;;;-1:-1:-1;;;15962:45:51;;-1:-1:-1;;;;;15962:45:51;;;;;;;;;;;;;;;15876:54;;-1:-1:-1;15962:10:51;;;;;;:19;;:45;;;;;;;;;;;;;;;-1:-1:-1;15962:10:51;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15962:45:51;15941:142;;;;-1:-1:-1;;;15941:142:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16094:26;:24;:26::i;:::-;;15815:312;;:::o;834:176:110:-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:110;;;;;;;;;;;;;;;;;;;;;;;;;;;5472:236:48;5547:27;5559:7;5568:5;5547:11;:27::i;:::-;5613:88;5657:42;5658:25;5677:5;5658:14;;:18;;:25;;;;:::i;5657:42::-;-1:-1:-1;;;;;5613:25:48;;;;;;:16;:25;;;;;;;:88;:42;:88;:::i;:::-;-1:-1:-1;;;;;5585:25:48;;;;;;;:16;:25;;;;;:116;;;;-1:-1:-1;5472:236:48:o;1274:134:110:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;16360:272:51:-;16464:17;;16512:10;;:35;;;-1:-1:-1;;;16512:35:51;;16541:4;16512:35;;;;;;-1:-1:-1;;16464:17:51;16512:10;;;-1:-1:-1;;;;;16512:10:51;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16512:35:51;16492:17;:55;;;16565:60;;16602:21;16565:60;:29;:60;:::i;:::-;16558:67;;;16360:272;:::o;1386:124:55:-;1442:7;1474:1;1469;:6;;1461:15;;;;;;-1:-1:-1;1501:1:55;1386:124::o;2227:366:48:-;2311:1;2295:13;:11;:13::i;:::-;:17;2287:85;;;;-1:-1:-1;;;2287:85:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2387:9;;2383:204;;2429:93;2495:13;:11;:13::i;:::-;2465:27;:5;-1:-1:-1;;;2465:27:48;:9;:27;:::i;:::-;:43;;;;;2429:14;;;2465:43;;2429:93;:18;:93;:::i;:::-;2412:14;:110;2541:35;;;;;;;;2558:10;;2541:35;;;;;;;;;;2227:366;:::o;2119:459:110:-;2177:7;2418:6;2414:45;;-1:-1:-1;2447:1:110;2440:8;;2414:45;2481:5;;;2485:1;2481;:5;:1;2504:5;;;;;:10;2496:56;;;;-1:-1:-1;;;2496:56:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;190:146:56;246:6;282:1;303:6;;;;295:15;;;;;1208:172:55;1264:6;1293:5;;;1317:6;;;;;;:16;;;1332:1;1327;:6;;1317:16;1316:38;;;;1343:1;1339;:5;:14;;;;;1352:1;1348;:5;1339:14;1308:47;;;;;5983:236:48;6058:27;6070:7;6079:5;6058:11;:27::i;:::-;6124:88;6168:42;6169:25;6188:5;6169:14;;:18;;:25;;;;:::i;6168:42::-;-1:-1:-1;;;;;6124:25:48;;;;;;:16;:25;;;;;;;:88;:42;:88;:::i;1692:187:110:-;1778:7;1813:12;1805:6;;;;1797:29;;;;-1:-1:-1;;;1797:29:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1848:5:110;;;1692:187::o;3988:172:111:-;4074:4;4090:42;4100:12;:10;:12::i;:::-;4114:9;4125:6;4090:9;:42::i;1409:498:108:-;1820:4;1864:17;1895:7;1409:498;:::o;2046:174:111:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;2141:26:111::1;:24;:26::i;:::-;2177:36;2200:4;2206:6;2177:22;:36::i;:::-;1268:14:108::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;2046:174:111;;;:::o;867:126:109:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;924:26:109::1;:24;:26::i;:::-;960;:24;:26::i;:::-;1268:14:108::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;867:126:109;:::o;4854:352:48:-;4942:32;4958:4;4964:2;4968:5;4942:15;:32::i;:::-;4985:21;5009:40;:25;5028:5;5009:14;;:18;;:25;;;;:::i;:40::-;-1:-1:-1;;;;;5084:22:48;;;;;;:16;:22;;;;;;4985:64;;-1:-1:-1;5084:42:48;;4985:64;5084:42;:26;:42;:::i;:::-;-1:-1:-1;;;;;5059:22:48;;;;;;;:16;:22;;;;;;:67;;;;5159:20;;;;;;;:40;;5184:14;5159:40;:24;:40;:::i;:::-;-1:-1:-1;;;;;5136:20:48;;;;;;;:16;:20;;;;;:63;;;;-1:-1:-1;;;4854:352:48:o;2784:333::-;2847:7;2866:29;2898:27;2918:6;2898:19;:27::i;:::-;-1:-1:-1;;;;;2961:22:48;;;;;;:14;:22;;;;;;2866:59;;-1:-1:-1;2961:49:48;;2866:59;2961:49;:26;:49;:::i;:::-;-1:-1:-1;;;;;2936:22:48;;;;;;:14;:22;;;;;;;;;:74;;;;3026:45;;;;;;;2936:22;;3026:45;;;;;;;;;3089:21;2784:333;-1:-1:-1;;2784:333:48:o;8085:370:111:-;-1:-1:-1;;;;;8168:21:111;;8160:65;;;;;-1:-1:-1;;;8160:65:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;8236:49;8265:1;8269:7;8278:6;8236:20;:49::i;:::-;8311:12;;:24;;8328:6;8311:24;:16;:24;:::i;:::-;8296:12;:39;-1:-1:-1;;;;;8366:18:111;;;;;;:9;:18;;;;;;:30;;8389:6;8366:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;8345:18:111;;;;;;:9;:18;;;;;;;;:51;;;;8411:37;;;;;;;8345:18;;;;8411:37;;;;;;;;;;8085:370;;:::o;1043:159:55:-;1099:6;1131:1;1126;:6;;:20;;;;;1145:1;1140;1136;:5;:10;;1126:20;1125:46;;;;1156:1;1152;:5;:18;;;;;1169:1;1165;1161;:5;:9;1152:18;1117:55;;;;;;-1:-1:-1;1190:5:55;;;1043:159::o;8774:410:111:-;-1:-1:-1;;;;;8857:21:111;;8849:67;;;;-1:-1:-1;;;8849:67:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8927:49;8948:7;8965:1;8969:6;8927:20;:49::i;:::-;9008:68;9031:6;9008:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9008:18:111;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;8987:18:111;;;;;;:9;:18;;;;;:89;9101:12;;:24;;9118:6;9101:24;:16;:24;:::i;:::-;9086:12;:39;9140:37;;;;;;;;9166:1;;-1:-1:-1;;;;;9140:37:111;;;;;;;;;;;;8774:410;;:::o;858:66:107:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1268:14;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;858:66:107;:::o;2226:177:111:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;2333:12:111;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2355:16:111;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2381:9:111::1;:14:::0;;-1:-1:-1;;2381:14:111::1;2393:2;2381:14;::::0;;1264:55:108;;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;2226:177:111;;;:::o;999:195:109:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;1068:17:109::1;1088:12;:10;:12::i;:::-;1110:6;:18:::0;;-1:-1:-1;;;;;;1110:18:109::1;-1:-1:-1::0;;;;;1110:18:109;::::1;::::0;;::::1;::::0;;;1143:43:::1;::::0;1110:18;;-1:-1:-1;1110:18:109;-1:-1:-1;;1143:43:109::1;::::0;-1:-1:-1;;1143:43:109::1;1256:1:108;1268:14:::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;999:195:109;:::o;7285:530:111:-;-1:-1:-1;;;;;7390:20:111;;7382:70;;;;-1:-1:-1;;;7382:70:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7470:23:111;;7462:71;;;;-1:-1:-1;;;7462:71:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7544:47;7565:6;7573:9;7584:6;7544:20;:47::i;:::-;7622:71;7644:6;7622:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7622:17:111;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;7602:17:111;;;;;;;:9;:17;;;;;;:91;;;;7726:20;;;;;;;:32;;7751:6;7726:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;7703:20:111;;;;;;;:9;:20;;;;;;;;;:55;;;;7773:35;;;;;;;7703:20;;7773:35;;;;;;;;;;;;;7285:530;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
  "source": "// \"SPDX-License-Identifier: Apache-2.0\"\npragma solidity ^0.6.10;\n\nimport \"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\";\nimport \"./FundsDistributionToken.sol\";\nimport \"./IFundsDistributionToken.sol\";\nimport \"./IInitializableFDT.sol\";\n\n/**\n * @notice This contract allows a list of administrators to be tracked. This list can then be enforced\n * on functions with administrative permissions.  Only the owner of the contract should be allowed\n * to modify the administrator list.\n */\ncontract Administratable is OwnableUpgradeSafe {\n    // The mapping to track administrator accounts - true is reserved for admin addresses.\n    mapping(address => bool) public administrators;\n\n    // Events to allow tracking add/remove.\n    event AdminAdded(address indexed addedAdmin, address indexed addedBy);\n    event AdminRemoved(address indexed removedAdmin, address indexed removedBy);\n\n    /**\n     * @notice Function modifier to enforce administrative permissions.\n     */\n    modifier onlyAdministrator() {\n        require(\n            isAdministrator(msg.sender),\n            \"Calling account is not an administrator.\"\n        );\n        _;\n    }\n\n    /**\n     * @notice Add an admin to the list.  This should only be callable by the owner of the contract.\n     */\n    function addAdmin(address adminToAdd) public onlyOwner {\n        // Verify the account is not already an admin\n        require(\n            administrators[adminToAdd] == false,\n            \"Account to be added to admin list is already an admin\"\n        );\n\n        // Set the address mapping to true to indicate it is an administrator account.\n        administrators[adminToAdd] = true;\n\n        // Emit the event for any watchers.\n        emit AdminAdded(adminToAdd, msg.sender);\n    }\n\n    /**\n     * @notice Remove an admin from the list.  This should only be callable by the owner of the contract.\n     */\n    function removeAdmin(address adminToRemove) public onlyOwner {\n        // Verify the account is an admin\n        require(\n            administrators[adminToRemove] == true,\n            \"Account to be removed from admin list is not already an admin\"\n        );\n\n        // Set the address mapping to false to indicate it is NOT an administrator account.\n        administrators[adminToRemove] = false;\n\n        // Emit the event for any watchers.\n        emit AdminRemoved(adminToRemove, msg.sender);\n    }\n\n    /**\n     * @notice Determine if the message sender is in the administrators list.\n     */\n    function isAdministrator(address addressToTest) public view returns (bool) {\n        return administrators[addressToTest];\n    }\n}\n\n/**\n * @notice Keeps track of whitelists and can check if sender and reciever are configured to allow a transfer.\n * Only administrators can update the whitelists.\n * Any address can only be a member of one whitelist at a time.\n */\ncontract Whitelistable is Administratable {\n    // Zero is reserved for indicating it is not on a whitelist\n    uint8 constant internal NO_WHITELIST = 0;\n\n    // The mapping to keep track of which whitelist any address belongs to.\n    // 0 is reserved for no whitelist and is the default for all addresses.\n    mapping(address => uint8) public addressWhitelists;\n\n    // The mapping to keep track of each whitelist's outbound whitelist flags.\n    // Boolean flag indicates whether outbound transfers are enabled.\n    mapping(uint8 => mapping(uint8 => bool)) public outboundWhitelistsEnabled;\n\n    // Events to allow tracking add/remove.\n    event AddressAddedToWhitelist(\n        address indexed addedAddress,\n        uint8 indexed whitelist,\n        address indexed addedBy\n    );\n    event AddressRemovedFromWhitelist(\n        address indexed removedAddress,\n        uint8 indexed whitelist,\n        address indexed removedBy\n    );\n    event OutboundWhitelistUpdated(\n        address indexed updatedBy,\n        uint8 indexed sourceWhitelist,\n        uint8 indexed destinationWhitelist,\n        bool from,\n        bool to\n    );\n\n    /**\n     * @notice Sets an address's white list ID.  Only administrators should be allowed to update this.\n     * If an address is on an existing whitelist, it will just get updated to the new value (removed from previous).\n     */\n    function addToWhitelist(address addressToAdd, uint8 whitelist)\n        public\n        onlyAdministrator\n    {\n        // Verify the whitelist is valid\n        require(whitelist != NO_WHITELIST, \"Invalid whitelist ID supplied\");\n\n        // Save off the previous white list\n        uint8 previousWhitelist = addressWhitelists[addressToAdd];\n\n        // Set the address's white list ID\n        addressWhitelists[addressToAdd] = whitelist;\n\n        // If the previous whitelist existed then we want to indicate it has been removed\n        if (previousWhitelist != NO_WHITELIST) {\n            // Emit the event for tracking\n            emit AddressRemovedFromWhitelist(\n                addressToAdd,\n                previousWhitelist,\n                msg.sender\n            );\n        }\n\n        // Emit the event for new whitelist\n        emit AddressAddedToWhitelist(addressToAdd, whitelist, msg.sender);\n    }\n\n    /**\n     * @notice Clears out an address's white list ID.  Only administrators should be allowed to update this.\n     */\n    function removeFromWhitelist(address addressToRemove)\n        public\n        onlyAdministrator\n    {\n        // Save off the previous white list\n        uint8 previousWhitelist = addressWhitelists[addressToRemove];\n\n        // Zero out the previous white list\n        addressWhitelists[addressToRemove] = NO_WHITELIST;\n\n        // Emit the event for tracking\n        emit AddressRemovedFromWhitelist(\n            addressToRemove,\n            previousWhitelist,\n            msg.sender\n        );\n    }\n\n    /**\n     * @notice Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist.\n     * Only administrators should be allowed to update this.\n     */\n    function updateOutboundWhitelistEnabled(\n        uint8 sourceWhitelist,\n        uint8 destinationWhitelist,\n        bool newEnabledValue\n    ) public onlyAdministrator {\n        // Get the old enabled flag\n        bool oldEnabledValue = outboundWhitelistsEnabled[sourceWhitelist][destinationWhitelist];\n\n        // Update to the new value\n        outboundWhitelistsEnabled[sourceWhitelist][destinationWhitelist] = newEnabledValue;\n\n        // Emit event for tracking\n        emit OutboundWhitelistUpdated(\n            msg.sender,\n            sourceWhitelist,\n            destinationWhitelist,\n            oldEnabledValue,\n            newEnabledValue\n        );\n    }\n\n    /**\n     * @notice Determine if the a sender is allowed to send to the receiver.\n     * The source whitelist must be enabled to send to the whitelist where the receive exists.\n     */\n    function checkWhitelistAllowed(address sender, address receiver)\n        public\n        view\n        returns (bool)\n    {\n        // First get each address white list\n        uint8 senderWhiteList = addressWhitelists[sender];\n        uint8 receiverWhiteList = addressWhitelists[receiver];\n\n        // If either address is not on a white list then the check should fail\n        if (\n            senderWhiteList == NO_WHITELIST || receiverWhiteList == NO_WHITELIST\n        ) {\n            return false;\n        }\n\n        // Determine if the sending whitelist is allowed to send to the destination whitelist\n        return outboundWhitelistsEnabled[senderWhiteList][receiverWhiteList];\n    }\n}\n\n/**\n * @notice Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled.\n * Only the owner may disable restrictions.\n */\ncontract Restrictable is OwnableUpgradeSafe {\n    // State variable to track whether restrictions are enabled.  Defaults to true.\n    bool private _restrictionsEnabled = true;\n\n    // Event emitted when flag is disabled\n    event RestrictionsDisabled(address indexed owner);\n\n    /**\n     * @notice Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call.\n     * This is a permanent change that cannot be undone\n     */\n    function disableRestrictions() public onlyOwner {\n        require(_restrictionsEnabled, \"Restrictions are already disabled.\");\n\n        // Set the flag\n        _restrictionsEnabled = false;\n\n        // Trigger the event\n        emit RestrictionsDisabled(msg.sender);\n    }\n\n    /**\n     * @notice View function to determine if restrictions are enabled\n     */\n    function isRestrictionEnabled() public view returns (bool) {\n        return _restrictionsEnabled;\n    }\n}\n\nabstract contract ERC1404 is IERC20 {\n\n    /**\n     * @notice Detects if a transfer will be reverted and if so returns an appropriate reference code\n     * @param from Sending address\n     * @param to Receiving address\n     * @param value Amount of tokens being transferred\n     * @return Code by which to reference message for rejection reasoning\n     * @dev Overwrite with your custom transfer restriction logic\n     */\n    function detectTransferRestriction(address from, address to, uint256 value)\n        public\n        view\n        virtual\n        returns (uint8);\n\n    /**\n     * @notice Returns a human-readable message for a given restriction code\n     * @param restrictionCode Identifier for looking up a message\n     * @return Text showing the restriction's reasoning\n     * @dev Overwrite with your custom message and restrictionCode handling\n     */\n    function messageForTransferRestriction(uint8 restrictionCode)\n        public\n        view\n        virtual\n        returns (string memory);\n}\n\ncontract ProxySafeSimpleRestrictedFDT is\n    IFundsDistributionToken,\n    IInitializableFDT,\n    FundsDistributionToken,\n    ERC1404,\n    Whitelistable,\n    Restrictable\n{\n    using SafeMathUint for uint256;\n    using SafeMathInt for int256;\n\n    // ERC1404 Error codes and messages\n    uint8 public constant SUCCESS_CODE = 0;\n    uint8 public constant FAILURE_NON_WHITELIST = 1;\n    string public constant SUCCESS_MESSAGE = \"SUCCESS\";\n    string public constant FAILURE_NON_WHITELIST_MESSAGE = \"The transfer was restricted due to white list configuration.\";\n    string public constant UNKNOWN_ERROR = \"Unknown Error Code\";\n\n    // token in which the funds can be sent to the FundsDistributionToken\n    IERC20 public fundsToken;\n\n    // balance of fundsToken that the FundsDistributionToken currently holds\n    uint256 public fundsTokenBalance;\n\n    modifier onlyFundsToken() {\n        require(\n            msg.sender == address(fundsToken),\n            \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\"\n        );\n        _;\n    }\n\n    /**\n  \t * @notice Evaluates whether a transfer should be allowed or not.\n  \t */\n    modifier notRestricted(address from, address to, uint256 value) {\n        uint8 restrictionCode = detectTransferRestriction(from, to, value);\n        require(\n            restrictionCode == SUCCESS_CODE,\n            messageForTransferRestriction(restrictionCode)\n        );\n        _;\n    }\n\n    /**\n\t * @notice Withdraws all available funds for a token holder\n\t */\n    function withdrawFunds() external override {\n        _withdrawFundsFor(msg.sender);\n    }\n\n    /**\n\t * @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n\t * @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n\t * funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()\n\t */\n    function updateFundsReceived() external {\n        int256 newFunds = _updateFundsTokenBalance();\n\n        if (newFunds > 0) {\n            _distributeFunds(newFunds.toUint256Safe());\n        }\n    }\n\n    /**\n     * @notice Initialize a new instance storage\n     * @dev \"constructor\" to be called on deployment\n     */\n    function initialize(\n        string memory name,\n        string memory symbol,\n        IERC20 _fundsToken,\n        address owner,\n        uint256 initialAmount\n    ) public override initializer {\n        require(\n            address(_fundsToken) != address(0),\n            \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\"\n        );\n\n        super.__ERC20_init(name, symbol);\n        super.__Ownable_init();\n\n        fundsToken = _fundsToken;\n        transferOwnership(owner);\n        _mint(owner, initialAmount);\n    }\n\n    /**\n     * @notice Withdraws funds for a set of token holders\n     */\n    function pushFunds(address[] memory owners) public {\n        for (uint256 i = 0; i < owners.length; i++) {\n            _withdrawFundsFor(owners[i]);\n        }\n    }\n\n    /**\n  \t * @notice Overrides the parent class token transfer function to enforce restrictions.\n  \t */\n    function transfer(address to, uint256 value)\n        public\n        notRestricted(msg.sender, to, value)\n        override(IERC20, ERC20UpgradeSafe)\n        returns (bool success)\n    {\n        success = super.transfer(to, value);\n    }\n\n    /**\n  \t * @notice Overrides the parent class token transferFrom function to enforce restrictions.\n  \t */\n    function transferFrom(address from, address to, uint256 value)\n        public\n        notRestricted(from, to, value)\n        override(IERC20, ERC20UpgradeSafe)\n        returns (bool success)\n    {\n        success = super.transferFrom(from, to, value);\n    }\n\n    /**\n     * @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT.\n     */\n    function mint(address account, uint256 amount) public onlyOwner returns (bool) {\n        _mint(account, amount);\n        return true;\n    }\n\n    /**\n     * @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT.\n     */\n    function burn(address account, uint256 amount) public onlyOwner returns (bool) {\n        _burn(account, amount);\n        return true;\n    }\n\n    /**\n  \t * @notice This function detects whether a transfer should be restricted and not allowed.\n  \t * If the function returns SUCCESS_CODE (0) then it should be allowed.\n  \t */\n    function detectTransferRestriction(address from, address to, uint256)\n        public\n        view\n        override\n        returns (uint8)\n    {\n        // If the restrictions have been disabled by the owner, then just return success\n        // Logic defined in Restrictable parent class\n        if (!isRestrictionEnabled()) {\n            return SUCCESS_CODE;\n        }\n\n        // If the contract owner is transferring, then ignore reistrictions\n        if (from == owner()) {\n            return SUCCESS_CODE;\n        }\n\n        // Restrictions are enabled, so verify the whitelist config allows the transfer.\n        // Logic defined in Whitelistable parent class\n        if (!checkWhitelistAllowed(from, to)) {\n            return FAILURE_NON_WHITELIST;\n        }\n\n        // If no restrictions were triggered return success\n        return SUCCESS_CODE;\n    }\n\n    /**\n  \t * @notice This function allows a wallet or other client to get a human readable string to show\n  \t * a user if a transfer was restricted.  It should return enough information for the user\n  \t * to know why it failed.\n  \t */\n    function messageForTransferRestriction(uint8 restrictionCode)\n        public\n        view\n        override\n        returns (string memory)\n    {\n        if (restrictionCode == SUCCESS_CODE) {\n            return SUCCESS_MESSAGE;\n        }\n\n        if (restrictionCode == FAILURE_NON_WHITELIST) {\n            return FAILURE_NON_WHITELIST_MESSAGE;\n        }\n\n        // An unknown error code was passed in.\n        return UNKNOWN_ERROR;\n    }\n\n    /**\n     * @notice Withdraws all available funds for a token holder\n     */\n    function _withdrawFundsFor(address owner) internal {\n        uint256 withdrawableFunds = _prepareWithdrawFor(owner);\n\n        require(\n            fundsToken.transfer(owner, withdrawableFunds),\n            \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\"\n        );\n\n        _updateFundsTokenBalance();\n    }\n\n    /**\n\t * @dev Updates the current funds token balance\n\t * and returns the difference of new and previous funds token balances\n\t * @return A int256 representing the difference of the new and previous funds token balance\n\t */\n    function _updateFundsTokenBalance() internal returns (int256) {\n        uint256 prevFundsTokenBalance = fundsTokenBalance;\n\n        fundsTokenBalance = fundsToken.balanceOf(address(this));\n\n        return int256(fundsTokenBalance).sub(int256(prevFundsTokenBalance));\n    }\n}\n",
  "sourcePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol",
  "ast": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol",
    "exportedSymbols": {
      "Administratable": [
        18474
      ],
      "ERC1404": [
        18738
      ],
      "ProxySafeSimpleRestrictedFDT": [
        19155
      ],
      "Restrictable": [
        18715
      ],
      "Whitelistable": [
        18674
      ]
    },
    "id": 19156,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 18363,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:51"
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "id": 18364,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 37428,
        "src": "67:79:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "id": 18365,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 38236,
        "src": "147:83:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol",
        "file": "./FundsDistributionToken.sol",
        "id": 18366,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18315,
        "src": "231:38:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol",
        "file": "./IFundsDistributionToken.sol",
        "id": 18367,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18344,
        "src": "270:39:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol",
        "file": "./IInitializableFDT.sol",
        "id": 18368,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18362,
        "src": "310:33:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18370,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "620:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18371,
            "nodeType": "InheritanceSpecifier",
            "src": "620:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18369,
          "nodeType": "StructuredDocumentation",
          "src": "345:246:51",
          "text": " @notice This contract allows a list of administrators to be tracked. This list can then be enforced\n on functions with administrative permissions.  Only the owner of the contract should be allowed\n to modify the administrator list."
        },
        "fullyImplemented": true,
        "id": 18474,
        "linearizedBaseContracts": [
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Administratable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "76be1585",
            "id": 18375,
            "mutability": "mutable",
            "name": "administrators",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18474,
            "src": "736:46:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 18374,
              "keyType": {
                "id": 18372,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "744:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "736:24:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 18373,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "755:4:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18381,
            "name": "AdminAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18377,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "850:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18376,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "850:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18379,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "878:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18378,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "878:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "849:53:51"
            },
            "src": "833:70:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18387,
            "name": "AdminRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18386,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18383,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "927:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18382,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "927:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18385,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "957:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18384,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "957:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "926:57:51"
            },
            "src": "908:76:51"
          },
          {
            "body": {
              "id": 18399,
              "nodeType": "Block",
              "src": "1107:142:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 18392,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1154:3:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 18393,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1154:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 18391,
                          "name": "isAdministrator",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18473,
                          "src": "1138:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 18394,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1138:27:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616c6c696e67206163636f756e74206973206e6f7420616e2061646d696e6973747261746f722e",
                        "id": 18395,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1179:42:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        },
                        "value": "Calling account is not an administrator."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        }
                      ],
                      "id": 18390,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1117:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18396,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1117:114:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18397,
                  "nodeType": "ExpressionStatement",
                  "src": "1117:114:51"
                },
                {
                  "id": 18398,
                  "nodeType": "PlaceholderStatement",
                  "src": "1241:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18388,
              "nodeType": "StructuredDocumentation",
              "src": "990:83:51",
              "text": " @notice Function modifier to enforce administrative permissions."
            },
            "id": 18400,
            "name": "onlyAdministrator",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18389,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1104:2:51"
            },
            "src": "1078:171:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18429,
              "nodeType": "Block",
              "src": "1427:431:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18413,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18409,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "1512:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18411,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18410,
                            "name": "adminToAdd",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18403,
                            "src": "1527:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1512:26:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1542:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "src": "1512:35:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f20626520616464656420746f2061646d696e206c69737420697320616c726561647920616e2061646d696e",
                        "id": 18414,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1561:55:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        },
                        "value": "Account to be added to admin list is already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        }
                      ],
                      "id": 18408,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1491:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18415,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1491:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18416,
                  "nodeType": "ExpressionStatement",
                  "src": "1491:135:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18421,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18417,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "1724:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18419,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18418,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1739:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1724:26:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 18420,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1753:4:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1724:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18422,
                  "nodeType": "ExpressionStatement",
                  "src": "1724:33:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18424,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1828:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18425,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1840:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18426,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1840:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18423,
                      "name": "AdminAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18381,
                      "src": "1817:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18427,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1817:34:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18428,
                  "nodeType": "EmitStatement",
                  "src": "1812:39:51"
                }
              ]
            },
            "documentation": {
              "id": 18401,
              "nodeType": "StructuredDocumentation",
              "src": "1255:112:51",
              "text": " @notice Add an admin to the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "70480275",
            "id": 18430,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18406,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18405,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "1417:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1417:9:51"
              }
            ],
            "name": "addAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18404,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18403,
                  "mutability": "mutable",
                  "name": "adminToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18430,
                  "src": "1390:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18402,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1390:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1389:20:51"
            },
            "returnParameters": {
              "id": 18407,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1427:0:51"
            },
            "scope": 18474,
            "src": "1372:486:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18459,
              "nodeType": "Block",
              "src": "2047:443:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18443,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18439,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "2120:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18441,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18440,
                            "name": "adminToRemove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18433,
                            "src": "2135:13:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2120:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 18442,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2153:4:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "src": "2120:37:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f2062652072656d6f7665642066726f6d2061646d696e206c697374206973206e6f7420616c726561647920616e2061646d696e",
                        "id": 18444,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2171:63:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        },
                        "value": "Account to be removed from admin list is not already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        }
                      ],
                      "id": 18438,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2099:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18445,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2099:145:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18446,
                  "nodeType": "ExpressionStatement",
                  "src": "2099:145:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18451,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18447,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "2347:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18449,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18448,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2362:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2347:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18450,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2379:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "2347:37:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18452,
                  "nodeType": "ExpressionStatement",
                  "src": "2347:37:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18454,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2457:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18455,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "2472:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18456,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2472:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18453,
                      "name": "AdminRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18387,
                      "src": "2444:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18457,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2444:39:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18458,
                  "nodeType": "EmitStatement",
                  "src": "2439:44:51"
                }
              ]
            },
            "documentation": {
              "id": 18431,
              "nodeType": "StructuredDocumentation",
              "src": "1864:117:51",
              "text": " @notice Remove an admin from the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "1785f53c",
            "id": 18460,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18436,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18435,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "2037:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2037:9:51"
              }
            ],
            "name": "removeAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18434,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18433,
                  "mutability": "mutable",
                  "name": "adminToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18460,
                  "src": "2007:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18432,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2007:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2006:23:51"
            },
            "returnParameters": {
              "id": 18437,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2047:0:51"
            },
            "scope": 18474,
            "src": "1986:504:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18472,
              "nodeType": "Block",
              "src": "2665:53:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18468,
                      "name": "administrators",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18375,
                      "src": "2682:14:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 18470,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18469,
                      "name": "addressToTest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18463,
                      "src": "2697:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2682:29:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18467,
                  "id": 18471,
                  "nodeType": "Return",
                  "src": "2675:36:51"
                }
              ]
            },
            "documentation": {
              "id": 18461,
              "nodeType": "StructuredDocumentation",
              "src": "2496:89:51",
              "text": " @notice Determine if the message sender is in the administrators list."
            },
            "functionSelector": "0a2eb301",
            "id": 18473,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isAdministrator",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18464,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18463,
                  "mutability": "mutable",
                  "name": "addressToTest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2615:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18462,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2615:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2614:23:51"
            },
            "returnParameters": {
              "id": 18467,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18466,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2659:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18465,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2659:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2658:6:51"
            },
            "scope": 18474,
            "src": "2590:128:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "592:2128:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18476,
              "name": "Administratable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18474,
              "src": "2980:15:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Administratable_$18474",
                "typeString": "contract Administratable"
              }
            },
            "id": 18477,
            "nodeType": "InheritanceSpecifier",
            "src": "2980:15:51"
          }
        ],
        "contractDependencies": [
          18474,
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18475,
          "nodeType": "StructuredDocumentation",
          "src": "2722:231:51",
          "text": " @notice Keeps track of whitelists and can check if sender and reciever are configured to allow a transfer.\n Only administrators can update the whitelists.\n Any address can only be a member of one whitelist at a time."
        },
        "fullyImplemented": true,
        "id": 18674,
        "linearizedBaseContracts": [
          18674,
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Whitelistable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 18480,
            "mutability": "constant",
            "name": "NO_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3066:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18478,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "3066:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18479,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "3105:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "functionSelector": "92e6d68b",
            "id": 18484,
            "mutability": "mutable",
            "name": "addressWhitelists",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3265:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
              "typeString": "mapping(address => uint8)"
            },
            "typeName": {
              "id": 18483,
              "keyType": {
                "id": 18481,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "3273:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "3265:25:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                "typeString": "mapping(address => uint8)"
              },
              "valueType": {
                "id": 18482,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3284:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "e9594508",
            "id": 18490,
            "mutability": "mutable",
            "name": "outboundWhitelistsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3471:73:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
              "typeString": "mapping(uint8 => mapping(uint8 => bool))"
            },
            "typeName": {
              "id": 18489,
              "keyType": {
                "id": 18485,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3479:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "3471:40:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                "typeString": "mapping(uint8 => mapping(uint8 => bool))"
              },
              "valueType": {
                "id": 18488,
                "keyType": {
                  "id": 18486,
                  "name": "uint8",
                  "nodeType": "ElementaryTypeName",
                  "src": "3496:5:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  }
                },
                "nodeType": "Mapping",
                "src": "3488:22:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                  "typeString": "mapping(uint8 => bool)"
                },
                "valueType": {
                  "id": 18487,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "3505:4:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18498,
            "name": "AddressAddedToWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18492,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3634:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18491,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3634:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18494,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3672:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18493,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3672:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18496,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3705:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18495,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3705:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3624:110:51"
            },
            "src": "3595:140:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18506,
            "name": "AddressRemovedFromWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18505,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18500,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3783:30:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18499,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3783:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18502,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3823:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18501,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3823:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18504,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3856:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18503,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3856:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3773:114:51"
            },
            "src": "3740:148:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18518,
            "name": "OutboundWhitelistUpdated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18508,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "updatedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3933:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18507,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3933:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18510,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3968:29:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18509,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3968:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18512,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4007:34:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18511,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4007:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18514,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4051:9:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18513,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4051:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18516,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4070:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18515,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4070:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3923:160:51"
            },
            "src": "3893:191:51"
          },
          {
            "body": {
              "id": 18566,
              "nodeType": "Block",
              "src": "4434:800:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18531,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18529,
                          "name": "whitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18523,
                          "src": "4493:9:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18530,
                          "name": "NO_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18480,
                          "src": "4506:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "4493:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "496e76616c69642077686974656c69737420494420737570706c696564",
                        "id": 18532,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4520:31:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        },
                        "value": "Invalid whitelist ID supplied"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        }
                      ],
                      "id": 18528,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4485:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18533,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4485:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18534,
                  "nodeType": "ExpressionStatement",
                  "src": "4485:67:51"
                },
                {
                  "assignments": [
                    18536
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18536,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18566,
                      "src": "4607:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18535,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "4607:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18540,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18537,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "4633:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18539,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18538,
                      "name": "addressToAdd",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18521,
                      "src": "4651:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4633:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4607:57:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18545,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18541,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "4718:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18543,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18542,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "4736:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4718:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18544,
                      "name": "whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18523,
                      "src": "4752:9:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4718:43:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18546,
                  "nodeType": "ExpressionStatement",
                  "src": "4718:43:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 18549,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18547,
                      "name": "previousWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18536,
                      "src": "4866:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 18548,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "4887:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4866:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18558,
                  "nodeType": "IfStatement",
                  "src": "4862:246:51",
                  "trueBody": {
                    "id": 18557,
                    "nodeType": "Block",
                    "src": "4901:207:51",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18551,
                              "name": "addressToAdd",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18521,
                              "src": "5008:12:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 18552,
                              "name": "previousWhitelist",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18536,
                              "src": "5038:17:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 18553,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5073:3:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 18554,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5073:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 18550,
                            "name": "AddressRemovedFromWhitelist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18506,
                            "src": "4963:27:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                              "typeString": "function (address,uint8,address)"
                            }
                          },
                          "id": 18555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4963:134:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18556,
                        "nodeType": "EmitStatement",
                        "src": "4958:139:51"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18560,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "5191:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18561,
                        "name": "whitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18523,
                        "src": "5205:9:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18562,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5216:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18563,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5216:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18559,
                      "name": "AddressAddedToWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18498,
                      "src": "5167:23:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18564,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5167:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18565,
                  "nodeType": "EmitStatement",
                  "src": "5162:65:51"
                }
              ]
            },
            "documentation": {
              "id": 18519,
              "nodeType": "StructuredDocumentation",
              "src": "4090:231:51",
              "text": " @notice Sets an address's white list ID.  Only administrators should be allowed to update this.\n If an address is on an existing whitelist, it will just get updated to the new value (removed from previous)."
            },
            "functionSelector": "0263b858",
            "id": 18567,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18526,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18525,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "4412:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4412:17:51"
              }
            ],
            "name": "addToWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18521,
                  "mutability": "mutable",
                  "name": "addressToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4350:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18520,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4350:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18523,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4372:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18522,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4372:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4349:39:51"
            },
            "returnParameters": {
              "id": 18527,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4434:0:51"
            },
            "scope": 18674,
            "src": "4326:908:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18594,
              "nodeType": "Block",
              "src": "5464:401:51",
              "statements": [
                {
                  "assignments": [
                    18576
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18576,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18594,
                      "src": "5518:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18575,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5518:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18580,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18577,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "5544:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18579,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18578,
                      "name": "addressToRemove",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18570,
                      "src": "5562:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "5544:34:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5518:60:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18585,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18581,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "5633:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18583,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18582,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5651:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "5633:34:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18584,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "5670:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "5633:49:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18586,
                  "nodeType": "ExpressionStatement",
                  "src": "5633:49:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18588,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5778:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18589,
                        "name": "previousWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18576,
                        "src": "5807:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18590,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5838:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18591,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5838:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18587,
                      "name": "AddressRemovedFromWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18506,
                      "src": "5737:27:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18592,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5737:121:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18593,
                  "nodeType": "EmitStatement",
                  "src": "5732:126:51"
                }
              ]
            },
            "documentation": {
              "id": 18568,
              "nodeType": "StructuredDocumentation",
              "src": "5240:120:51",
              "text": " @notice Clears out an address's white list ID.  Only administrators should be allowed to update this."
            },
            "functionSelector": "8ab1d681",
            "id": 18595,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18573,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18572,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "5442:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5442:17:51"
              }
            ],
            "name": "removeFromWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18571,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18570,
                  "mutability": "mutable",
                  "name": "addressToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18595,
                  "src": "5394:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18569,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5394:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5393:25:51"
            },
            "returnParameters": {
              "id": 18574,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5464:0:51"
            },
            "scope": 18674,
            "src": "5365:500:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18632,
              "nodeType": "Block",
              "src": "6227:498:51",
              "statements": [
                {
                  "assignments": [
                    18608
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18608,
                      "mutability": "mutable",
                      "name": "oldEnabledValue",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18632,
                      "src": "6273:20:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 18607,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "6273:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18614,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18609,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "6296:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18611,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18610,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6322:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6296:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18613,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18612,
                      "name": "destinationWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18600,
                      "src": "6339:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6296:64:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6273:87:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18621,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 18615,
                          "name": "outboundWhitelistsEnabled",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18490,
                          "src": "6406:25:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                            "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                          }
                        },
                        "id": 18618,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 18616,
                          "name": "sourceWhitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18598,
                          "src": "6432:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6406:42:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                          "typeString": "mapping(uint8 => bool)"
                        }
                      },
                      "id": 18619,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18617,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6449:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "6406:64:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18620,
                      "name": "newEnabledValue",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18602,
                      "src": "6473:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6406:82:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18622,
                  "nodeType": "ExpressionStatement",
                  "src": "6406:82:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18624,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "6577:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18625,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "6577:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18626,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6601:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18627,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6630:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18628,
                        "name": "oldEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18608,
                        "src": "6664:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18629,
                        "name": "newEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18602,
                        "src": "6693:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 18623,
                      "name": "OutboundWhitelistUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18518,
                      "src": "6539:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_uint8_$_t_bool_$_t_bool_$returns$__$",
                        "typeString": "function (address,uint8,uint8,bool,bool)"
                      }
                    },
                    "id": 18630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6539:179:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18631,
                  "nodeType": "EmitStatement",
                  "src": "6534:184:51"
                }
              ]
            },
            "documentation": {
              "id": 18596,
              "nodeType": "StructuredDocumentation",
              "src": "5871:183:51",
              "text": " @notice Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist.\n Only administrators should be allowed to update this."
            },
            "functionSelector": "3973b596",
            "id": 18633,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18605,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18604,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "6209:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "6209:17:51"
              }
            ],
            "name": "updateOutboundWhitelistEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18603,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18598,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6108:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18597,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6108:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18600,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6139:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18599,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6139:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18602,
                  "mutability": "mutable",
                  "name": "newEnabledValue",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6175:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18601,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6175:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6098:103:51"
            },
            "returnParameters": {
              "id": 18606,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6227:0:51"
            },
            "scope": 18674,
            "src": "6059:666:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18672,
              "nodeType": "Block",
              "src": "7039:569:51",
              "statements": [
                {
                  "assignments": [
                    18644
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18644,
                      "mutability": "mutable",
                      "name": "senderWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7094:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18643,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7094:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18648,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18645,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7118:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18647,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18646,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18636,
                      "src": "7136:6:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7118:25:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7094:49:51"
                },
                {
                  "assignments": [
                    18650
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18650,
                      "mutability": "mutable",
                      "name": "receiverWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7153:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18649,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7153:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18654,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18651,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7179:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18653,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18652,
                      "name": "receiver",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18638,
                      "src": "7197:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7179:27:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7153:53:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 18661,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18657,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18655,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7313:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18656,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7332:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7313:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18660,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18658,
                        "name": "receiverWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18650,
                        "src": "7348:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18659,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7369:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7348:33:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "7313:68:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18665,
                  "nodeType": "IfStatement",
                  "src": "7296:133:51",
                  "trueBody": {
                    "id": 18664,
                    "nodeType": "Block",
                    "src": "7392:37:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7413:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "functionReturnParameters": 18642,
                        "id": 18663,
                        "nodeType": "Return",
                        "src": "7406:12:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18666,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "7540:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18668,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18667,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7566:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7540:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18670,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18669,
                      "name": "receiverWhiteList",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18650,
                      "src": "7583:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7540:61:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18642,
                  "id": 18671,
                  "nodeType": "Return",
                  "src": "7533:68:51"
                }
              ]
            },
            "documentation": {
              "id": 18634,
              "nodeType": "StructuredDocumentation",
              "src": "6731:183:51",
              "text": " @notice Determine if the a sender is allowed to send to the receiver.\n The source whitelist must be enabled to send to the whitelist where the receive exists."
            },
            "functionSelector": "9437e2fe",
            "id": 18673,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "checkWhitelistAllowed",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18639,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18636,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6950:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18635,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6950:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18638,
                  "mutability": "mutable",
                  "name": "receiver",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6966:16:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18637,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6966:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6949:34:51"
            },
            "returnParameters": {
              "id": 18642,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18641,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "7029:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18640,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "7029:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7028:6:51"
            },
            "scope": 18674,
            "src": "6919:689:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "2954:4656:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18676,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "7786:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18677,
            "nodeType": "InheritanceSpecifier",
            "src": "7786:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18675,
          "nodeType": "StructuredDocumentation",
          "src": "7612:148:51",
          "text": " @notice Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled.\n Only the owner may disable restrictions."
        },
        "fullyImplemented": true,
        "id": 18715,
        "linearizedBaseContracts": [
          18715,
          37427,
          37222,
          37297
        ],
        "name": "Restrictable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 18680,
            "mutability": "mutable",
            "name": "_restrictionsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18715,
            "src": "7895:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 18678,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "7895:4:51",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "74727565",
              "id": 18679,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "bool",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7931:4:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              },
              "value": "true"
            },
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18684,
            "name": "RestrictionsDisabled",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18683,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18682,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18684,
                  "src": "8012:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18681,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8012:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8011:23:51"
            },
            "src": "7985:50:51"
          },
          {
            "body": {
              "id": 18704,
              "nodeType": "Block",
              "src": "8281:224:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18691,
                        "name": "_restrictionsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18680,
                        "src": "8299:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5265737472696374696f6e732061726520616c72656164792064697361626c65642e",
                        "id": 18692,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8321:36:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        },
                        "value": "Restrictions are already disabled."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        }
                      ],
                      "id": 18690,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8291:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8291:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18694,
                  "nodeType": "ExpressionStatement",
                  "src": "8291:67:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18697,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18695,
                      "name": "_restrictionsEnabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18680,
                      "src": "8393:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18696,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8416:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "8393:28:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18698,
                  "nodeType": "ExpressionStatement",
                  "src": "8393:28:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18700,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "8487:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18701,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "8487:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18699,
                      "name": "RestrictionsDisabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18684,
                      "src": "8466:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18702,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8466:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18703,
                  "nodeType": "EmitStatement",
                  "src": "8461:37:51"
                }
              ]
            },
            "documentation": {
              "id": 18685,
              "nodeType": "StructuredDocumentation",
              "src": "8041:187:51",
              "text": " @notice Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call.\n This is a permanent change that cannot be undone"
            },
            "functionSelector": "dce306ad",
            "id": 18705,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18688,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18687,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "8271:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "8271:9:51"
              }
            ],
            "name": "disableRestrictions",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18686,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8261:2:51"
            },
            "returnParameters": {
              "id": 18689,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8281:0:51"
            },
            "scope": 18715,
            "src": "8233:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18713,
              "nodeType": "Block",
              "src": "8656:44:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18711,
                    "name": "_restrictionsEnabled",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18680,
                    "src": "8673:20:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18710,
                  "id": 18712,
                  "nodeType": "Return",
                  "src": "8666:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18706,
              "nodeType": "StructuredDocumentation",
              "src": "8511:81:51",
              "text": " @notice View function to determine if restrictions are enabled"
            },
            "functionSelector": "2a642407",
            "id": 18714,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isRestrictionEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18707,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8626:2:51"
            },
            "returnParameters": {
              "id": 18710,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18709,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18714,
                  "src": "8650:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18708,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8650:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8649:6:51"
            },
            "scope": 18715,
            "src": "8597:103:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "7761:941:51"
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18716,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "8733:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "id": 18717,
            "nodeType": "InheritanceSpecifier",
            "src": "8733:6:51"
          }
        ],
        "contractDependencies": [
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": false,
        "id": 18738,
        "linearizedBaseContracts": [
          18738,
          38235
        ],
        "name": "ERC1404",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": {
              "id": 18718,
              "nodeType": "StructuredDocumentation",
              "src": "8747:378:51",
              "text": " @notice Detects if a transfer will be reverted and if so returns an appropriate reference code\n @param from Sending address\n @param to Receiving address\n @param value Amount of tokens being transferred\n @return Code by which to reference message for rejection reasoning\n @dev Overwrite with your custom transfer restriction logic"
            },
            "functionSelector": "d4ce1415",
            "id": 18729,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18725,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18720,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9165:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9165:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18722,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9179:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18721,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9179:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18724,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9191:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18723,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9191:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9164:41:51"
            },
            "returnParameters": {
              "id": 18728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18727,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9267:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18726,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9267:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9266:7:51"
            },
            "scope": 18738,
            "src": "9130:144:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 18730,
              "nodeType": "StructuredDocumentation",
              "src": "9280:286:51",
              "text": " @notice Returns a human-readable message for a given restriction code\n @param restrictionCode Identifier for looking up a message\n @return Text showing the restriction's reasoning\n @dev Overwrite with your custom message and restrictionCode handling"
            },
            "functionSelector": "7f4ab1dd",
            "id": 18737,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18732,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9610:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18731,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9610:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9609:23:51"
            },
            "returnParameters": {
              "id": 18736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18735,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9694:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18734,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9694:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9693:15:51"
            },
            "scope": 18738,
            "src": "9571:138:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "8704:1007:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18739,
              "name": "IFundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18343,
              "src": "9758:23:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IFundsDistributionToken_$18343",
                "typeString": "contract IFundsDistributionToken"
              }
            },
            "id": 18740,
            "nodeType": "InheritanceSpecifier",
            "src": "9758:23:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18741,
              "name": "IInitializableFDT",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18361,
              "src": "9787:17:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IInitializableFDT_$18361",
                "typeString": "contract IInitializableFDT"
              }
            },
            "id": 18742,
            "nodeType": "InheritanceSpecifier",
            "src": "9787:17:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18743,
              "name": "FundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18314,
              "src": "9810:22:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_FundsDistributionToken_$18314",
                "typeString": "contract FundsDistributionToken"
              }
            },
            "id": 18744,
            "nodeType": "InheritanceSpecifier",
            "src": "9810:22:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18745,
              "name": "ERC1404",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18738,
              "src": "9838:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC1404_$18738",
                "typeString": "contract ERC1404"
              }
            },
            "id": 18746,
            "nodeType": "InheritanceSpecifier",
            "src": "9838:7:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18747,
              "name": "Whitelistable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18674,
              "src": "9851:13:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Whitelistable_$18674",
                "typeString": "contract Whitelistable"
              }
            },
            "id": 18748,
            "nodeType": "InheritanceSpecifier",
            "src": "9851:13:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18749,
              "name": "Restrictable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18715,
              "src": "9870:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Restrictable_$18715",
                "typeString": "contract Restrictable"
              }
            },
            "id": 18750,
            "nodeType": "InheritanceSpecifier",
            "src": "9870:12:51"
          }
        ],
        "contractDependencies": [
          18314,
          18343,
          18361,
          18474,
          18674,
          18715,
          18738,
          37222,
          37297,
          37427,
          38157,
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 19155,
        "linearizedBaseContracts": [
          19155,
          18715,
          18674,
          18474,
          37427,
          18738,
          18314,
          38157,
          38235,
          37222,
          37297,
          18361,
          18343
        ],
        "name": "ProxySafeSimpleRestrictedFDT",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 18753,
            "libraryName": {
              "contractScope": null,
              "id": 18751,
              "name": "SafeMathUint",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19732,
              "src": "9895:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathUint_$19732",
                "typeString": "library SafeMathUint"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9889:31:51",
            "typeName": {
              "id": 18752,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "9912:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 18756,
            "libraryName": {
              "contractScope": null,
              "id": 18754,
              "name": "SafeMathInt",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19705,
              "src": "9931:11:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathInt_$19705",
                "typeString": "library SafeMathInt"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9925:29:51",
            "typeName": {
              "id": 18755,
              "name": "int256",
              "nodeType": "ElementaryTypeName",
              "src": "9947:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_int256",
                "typeString": "int256"
              }
            }
          },
          {
            "constant": true,
            "functionSelector": "0e969a05",
            "id": 18759,
            "mutability": "constant",
            "name": "SUCCESS_CODE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10000:38:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18757,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10000:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18758,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10037:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "1fb45ec0",
            "id": 18762,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10044:47:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18760,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10044:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "31",
              "id": 18761,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10090:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "e7984d17",
            "id": 18765,
            "mutability": "constant",
            "name": "SUCCESS_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10097:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18763,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10097:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "53554343455353",
              "id": 18764,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10138:9:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_39bf027dd97f3bae0cf8cfb909695ec63313a9bd61ad52fc7f52cf565b141da8",
                "typeString": "literal_string \"SUCCESS\""
              },
              "value": "SUCCESS"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "c8934462",
            "id": 18768,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10153:117:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18766,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10153:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "546865207472616e736665722077617320726573747269637465642064756520746f207768697465206c69737420636f6e66696775726174696f6e2e",
              "id": 18767,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10208:62:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_e2c08a66f2b86feb88c976c9f1fd6dfebdf34e61c54a5cf461a34d6ed427b2fc",
                "typeString": "literal_string \"The transfer was restricted due to white list configuration.\""
              },
              "value": "The transfer was restricted due to white list configuration."
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "97af6744",
            "id": 18771,
            "mutability": "constant",
            "name": "UNKNOWN_ERROR",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10276:59:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18769,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10276:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "556e6b6e6f776e204572726f7220436f6465",
              "id": 18770,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10315:20:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_eff12b0856ae7501c8b50262ed26026205f1ee274bd4090cd444e8ef0358a146",
                "typeString": "literal_string \"Unknown Error Code\""
              },
              "value": "Unknown Error Code"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "63f04b15",
            "id": 18773,
            "mutability": "mutable",
            "name": "fundsToken",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10416:24:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$38235",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 18772,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "10416:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "a9691f3f",
            "id": 18775,
            "mutability": "mutable",
            "name": "fundsTokenBalance",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10524:32:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 18774,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "10524:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18789,
              "nodeType": "Block",
              "src": "10589:163:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18784,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 18778,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "10620:3:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 18779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10620:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18782,
                              "name": "fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18773,
                              "src": "10642:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18781,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "10634:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18780,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "10634:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18783,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10634:19:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "10620:33:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e6f6e6c7946756e6473546f6b656e3a20554e415554484f52495a45445f53454e444552",
                        "id": 18785,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10667:57:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        },
                        "value": "SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 18777,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10599:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18786,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10599:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18787,
                  "nodeType": "ExpressionStatement",
                  "src": "10599:135:51"
                },
                {
                  "id": 18788,
                  "nodeType": "PlaceholderStatement",
                  "src": "10744:1:51"
                }
              ]
            },
            "documentation": null,
            "id": 18790,
            "name": "onlyFundsToken",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18776,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10586:2:51"
            },
            "src": "10563:189:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18817,
              "nodeType": "Block",
              "src": "10906:226:51",
              "statements": [
                {
                  "assignments": [
                    18800
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18800,
                      "mutability": "mutable",
                      "name": "restrictionCode",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18817,
                      "src": "10916:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18799,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "10916:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18806,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18802,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18793,
                        "src": "10966:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18803,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18795,
                        "src": "10972:2:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18804,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18797,
                        "src": "10976:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18801,
                      "name": "detectTransferRestriction",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        19071
                      ],
                      "referencedDeclaration": 19071,
                      "src": "10940:25:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$returns$_t_uint8_$",
                        "typeString": "function (address,address,uint256) view returns (uint8)"
                      }
                    },
                    "id": 18805,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10940:42:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10916:66:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18810,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18808,
                          "name": "restrictionCode",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18800,
                          "src": "11013:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18809,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "11032:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "11013:31:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 18812,
                            "name": "restrictionCode",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18800,
                            "src": "11088:15:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          ],
                          "id": 18811,
                          "name": "messageForTransferRestriction",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [
                            19097
                          ],
                          "referencedDeclaration": 19097,
                          "src": "11058:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint8_$returns$_t_string_memory_ptr_$",
                            "typeString": "function (uint8) view returns (string memory)"
                          }
                        },
                        "id": 18813,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11058:46:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 18807,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10992:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18814,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10992:122:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18815,
                  "nodeType": "ExpressionStatement",
                  "src": "10992:122:51"
                },
                {
                  "id": 18816,
                  "nodeType": "PlaceholderStatement",
                  "src": "11124:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18791,
              "nodeType": "StructuredDocumentation",
              "src": "10758:79:51",
              "text": " @notice Evaluates whether a transfer should be allowed or not."
            },
            "id": 18818,
            "name": "notRestricted",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18798,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18793,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10865:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18792,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10865:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18795,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10879:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18794,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10879:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18797,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10891:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18796,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10864:41:51"
            },
            "src": "10842:290:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18328
            ],
            "body": {
              "id": 18828,
              "nodeType": "Block",
              "src": "11255:46:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18824,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "11283:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18825,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "11283:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18823,
                      "name": "_withdrawFundsFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19122,
                      "src": "11265:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18826,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11265:29:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18827,
                  "nodeType": "ExpressionStatement",
                  "src": "11265:29:51"
                }
              ]
            },
            "documentation": {
              "id": 18819,
              "nodeType": "StructuredDocumentation",
              "src": "11138:69:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "functionSelector": "24600fc3",
            "id": 18829,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawFunds",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18821,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "11246:8:51"
            },
            "parameters": {
              "id": 18820,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11234:2:51"
            },
            "returnParameters": {
              "id": 18822,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11255:0:51"
            },
            "scope": 19155,
            "src": "11212:89:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 18849,
              "nodeType": "Block",
              "src": "11684:156:51",
              "statements": [
                {
                  "assignments": [
                    18834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18834,
                      "mutability": "mutable",
                      "name": "newFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18849,
                      "src": "11694:15:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      },
                      "typeName": {
                        "id": 18833,
                        "name": "int256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11694:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18837,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 18835,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "11712:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 18836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11712:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11694:44:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    },
                    "id": 18840,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18838,
                      "name": "newFunds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18834,
                      "src": "11753:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18839,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "11764:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "11753:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18848,
                  "nodeType": "IfStatement",
                  "src": "11749:85:51",
                  "trueBody": {
                    "id": 18847,
                    "nodeType": "Block",
                    "src": "11767:67:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18842,
                                  "name": "newFunds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18834,
                                  "src": "11798:8:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "id": 18843,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint256Safe",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 19704,
                                "src": "11798:22:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$",
                                  "typeString": "function (int256) pure returns (uint256)"
                                }
                              },
                              "id": 18844,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11798:24:51",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 18841,
                            "name": "_distributeFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18102,
                            "src": "11781:16:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 18845,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11781:42:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18846,
                        "nodeType": "ExpressionStatement",
                        "src": "11781:42:51"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 18830,
              "nodeType": "StructuredDocumentation",
              "src": "11307:332:51",
              "text": " @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
            },
            "functionSelector": "46c162de",
            "id": 18850,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateFundsReceived",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18831,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11672:2:51"
            },
            "returnParameters": {
              "id": 18832,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11684:0:51"
            },
            "scope": 19155,
            "src": "11644:196:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18360
            ],
            "body": {
              "id": 18905,
              "nodeType": "Block",
              "src": "12158:327:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18876,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18870,
                              "name": "_fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18857,
                              "src": "12197:11:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12189:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18868,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12189:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18871,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12189:20:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 18874,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12221:1:51",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 18873,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12213:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18872,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12213:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18875,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12213:10:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "12189:34:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644543a20494e56414c49445f46554e44535f544f4b454e5f41444452455353",
                        "id": 18877,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "12237:50:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        },
                        "value": "SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        }
                      ],
                      "id": 18867,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "12168:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18878,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12168:129:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18879,
                  "nodeType": "ExpressionStatement",
                  "src": "12168:129:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18883,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18853,
                        "src": "12327:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18884,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18855,
                        "src": "12333:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18880,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12308:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18882,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__ERC20_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37680,
                      "src": "12308:18:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 18885,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12308:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18886,
                  "nodeType": "ExpressionStatement",
                  "src": "12308:32:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18887,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12350:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18889,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__Ownable_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37327,
                      "src": "12350:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 18890,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12350:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18891,
                  "nodeType": "ExpressionStatement",
                  "src": "12350:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18892,
                      "name": "fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18773,
                      "src": "12383:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18893,
                      "name": "_fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18857,
                      "src": "12396:11:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "12383:24:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 18895,
                  "nodeType": "ExpressionStatement",
                  "src": "12383:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18897,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12435:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 18896,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37422,
                      "src": "12417:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12417:24:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18899,
                  "nodeType": "ExpressionStatement",
                  "src": "12417:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18901,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12457:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18902,
                        "name": "initialAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18861,
                        "src": "12464:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18900,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "12451:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 18903,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12451:27:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18904,
                  "nodeType": "ExpressionStatement",
                  "src": "12451:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18851,
              "nodeType": "StructuredDocumentation",
              "src": "11846:113:51",
              "text": " @notice Initialize a new instance storage\n @dev \"constructor\" to be called on deployment"
            },
            "functionSelector": "c9aba0aa",
            "id": 18906,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18865,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18864,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37270,
                  "src": "12146:11:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12146:11:51"
              }
            ],
            "name": "initialize",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18863,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "12137:8:51"
            },
            "parameters": {
              "id": 18862,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18853,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "11993:18:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18852,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "11993:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18855,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12021:20:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18854,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "12021:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18857,
                  "mutability": "mutable",
                  "name": "_fundsToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12051:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 18856,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 38235,
                    "src": "12051:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18859,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12079:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18858,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12079:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18861,
                  "mutability": "mutable",
                  "name": "initialAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12102:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18860,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12102:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11983:146:51"
            },
            "returnParameters": {
              "id": 18866,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12158:0:51"
            },
            "scope": 19155,
            "src": "11964:521:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18932,
              "nodeType": "Block",
              "src": "12616:113:51",
              "statements": [
                {
                  "body": {
                    "id": 18930,
                    "nodeType": "Block",
                    "src": "12670:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 18925,
                                "name": "owners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18910,
                                "src": "12702:6:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 18927,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 18926,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18914,
                                "src": "12709:1:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "12702:9:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 18924,
                            "name": "_withdrawFundsFor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19122,
                            "src": "12684:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 18928,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12684:28:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18929,
                        "nodeType": "ExpressionStatement",
                        "src": "12684:28:51"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 18920,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18917,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18914,
                      "src": "12646:1:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 18918,
                        "name": "owners",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18910,
                        "src": "12650:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 18919,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "12650:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "12646:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18931,
                  "initializationExpression": {
                    "assignments": [
                      18914
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 18914,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18931,
                        "src": "12631:9:51",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18913,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12631:7:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 18916,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18915,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "12643:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "12631:13:51"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 18922,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "12665:3:51",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 18921,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18914,
                        "src": "12665:1:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 18923,
                    "nodeType": "ExpressionStatement",
                    "src": "12665:3:51"
                  },
                  "nodeType": "ForStatement",
                  "src": "12626:97:51"
                }
              ]
            },
            "documentation": {
              "id": 18907,
              "nodeType": "StructuredDocumentation",
              "src": "12491:69:51",
              "text": " @notice Withdraws funds for a set of token holders"
            },
            "functionSelector": "45f634f2",
            "id": 18933,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pushFunds",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18910,
                  "mutability": "mutable",
                  "name": "owners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18933,
                  "src": "12584:23:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 18908,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "12584:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 18909,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "12584:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12583:25:51"
            },
            "returnParameters": {
              "id": 18912,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12616:0:51"
            },
            "scope": 19155,
            "src": "12565:164:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37774,
              38184
            ],
            "body": {
              "id": 18960,
              "nodeType": "Block",
              "src": "13023:52:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18952,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18950,
                      "src": "13033:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18955,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18936,
                          "src": "13058:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18956,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18938,
                          "src": "13062:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18953,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13043:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18954,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transfer",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37774,
                        "src": "13043:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,uint256) returns (bool)"
                        }
                      },
                      "id": 18957,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13043:25:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13033:35:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18959,
                  "nodeType": "ExpressionStatement",
                  "src": "13033:35:51"
                }
              ]
            },
            "documentation": {
              "id": 18934,
              "nodeType": "StructuredDocumentation",
              "src": "12735:100:51",
              "text": " @notice Overrides the parent class token transfer function to enforce restrictions."
            },
            "functionSelector": "a9059cbb",
            "id": 18961,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 18941,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -15,
                      "src": "12922:3:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 18942,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "12922:10:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18943,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18936,
                    "src": "12934:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18944,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18938,
                    "src": "12938:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18945,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18940,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "12908:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12908:36:51"
              }
            ],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18948,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18946,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "12962:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18947,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "12970:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "12953:34:51"
            },
            "parameters": {
              "id": 18939,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18936,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12858:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18935,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12858:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18938,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12870:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18937,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12870:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12857:27:51"
            },
            "returnParameters": {
              "id": 18951,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18950,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "13005:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18949,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13005:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13004:14:51"
            },
            "scope": 19155,
            "src": "12840:235:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37851,
              38216
            ],
            "body": {
              "id": 18990,
              "nodeType": "Block",
              "src": "13385:62:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18981,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18979,
                      "src": "13395:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18984,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18964,
                          "src": "13424:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18985,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18966,
                          "src": "13430:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18986,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18968,
                          "src": "13434:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18982,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13405:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18983,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferFrom",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37851,
                        "src": "13405:18:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,address,uint256) returns (bool)"
                        }
                      },
                      "id": 18987,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13405:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13395:45:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18989,
                  "nodeType": "ExpressionStatement",
                  "src": "13395:45:51"
                }
              ]
            },
            "documentation": {
              "id": 18962,
              "nodeType": "StructuredDocumentation",
              "src": "13081:104:51",
              "text": " @notice Overrides the parent class token transferFrom function to enforce restrictions."
            },
            "functionSelector": "23b872dd",
            "id": 18991,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 18971,
                    "name": "from",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18964,
                    "src": "13290:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18972,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18966,
                    "src": "13296:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18973,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18968,
                    "src": "13300:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18974,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18970,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "13276:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13276:30:51"
              }
            ],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18977,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18975,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "13324:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18976,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "13332:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "13315:34:51"
            },
            "parameters": {
              "id": 18969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18964,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13212:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18963,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13212:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18966,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13226:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18965,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13226:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18968,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13238:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18967,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13238:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13211:41:51"
            },
            "returnParameters": {
              "id": 18980,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18979,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13367:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18978,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13367:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13366:14:51"
            },
            "scope": 19155,
            "src": "13190:257:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19010,
              "nodeType": "Block",
              "src": "13660:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19004,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18994,
                        "src": "13676:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19005,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18996,
                        "src": "13685:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19003,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "13670:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13670:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19007,
                  "nodeType": "ExpressionStatement",
                  "src": "13670:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19008,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13709:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19002,
                  "id": 19009,
                  "nodeType": "Return",
                  "src": "13702:11:51"
                }
              ]
            },
            "documentation": {
              "id": 18992,
              "nodeType": "StructuredDocumentation",
              "src": "13453:123:51",
              "text": " @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "40c10f19",
            "id": 19011,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18999,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18998,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13635:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13635:9:51"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18994,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13595:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18993,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13595:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18996,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13612:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13612:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13594:33:51"
            },
            "returnParameters": {
              "id": 19002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19001,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13654:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19000,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13654:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13653:6:51"
            },
            "scope": 19155,
            "src": "13581:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19030,
              "nodeType": "Block",
              "src": "13939:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19024,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19014,
                        "src": "13955:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19025,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19016,
                        "src": "13964:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19023,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18313
                      ],
                      "referencedDeclaration": 18313,
                      "src": "13949:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19026,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13949:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19027,
                  "nodeType": "ExpressionStatement",
                  "src": "13949:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13988:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19022,
                  "id": 19029,
                  "nodeType": "Return",
                  "src": "13981:11:51"
                }
              ]
            },
            "documentation": {
              "id": 19012,
              "nodeType": "StructuredDocumentation",
              "src": "13726:129:51",
              "text": " @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "9dc29fac",
            "id": 19031,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19019,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19018,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13914:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13914:9:51"
              }
            ],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19017,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19014,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13874:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19013,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13874:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19016,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13891:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19015,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13873:33:51"
            },
            "returnParameters": {
              "id": 19022,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19021,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13933:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19020,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13933:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13932:6:51"
            },
            "scope": 19155,
            "src": "13860:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18729
            ],
            "body": {
              "id": 19070,
              "nodeType": "Block",
              "src": "14330:718:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19046,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14487:23:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19044,
                        "name": "isRestrictionEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18714,
                        "src": "14488:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                          "typeString": "function () view returns (bool)"
                        }
                      },
                      "id": 19045,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14488:22:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19050,
                  "nodeType": "IfStatement",
                  "src": "14483:73:51",
                  "trueBody": {
                    "id": 19049,
                    "nodeType": "Block",
                    "src": "14512:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19047,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14533:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19048,
                        "nodeType": "Return",
                        "src": "14526:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 19054,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19051,
                      "name": "from",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19034,
                      "src": "14646:4:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19052,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 37359,
                        "src": "14654:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 19053,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14654:7:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "14646:15:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19058,
                  "nodeType": "IfStatement",
                  "src": "14642:65:51",
                  "trueBody": {
                    "id": 19057,
                    "nodeType": "Block",
                    "src": "14663:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19055,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14684:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19056,
                        "nodeType": "Return",
                        "src": "14677:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19063,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14865:32:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 19060,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19034,
                          "src": "14888:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 19061,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19036,
                          "src": "14894:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 19059,
                        "name": "checkWhitelistAllowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18673,
                        "src": "14866:21:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                          "typeString": "function (address,address) view returns (bool)"
                        }
                      },
                      "id": 19062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14866:31:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19067,
                  "nodeType": "IfStatement",
                  "src": "14861:91:51",
                  "trueBody": {
                    "id": 19066,
                    "nodeType": "Block",
                    "src": "14899:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19064,
                          "name": "FAILURE_NON_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18762,
                          "src": "14920:21:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19065,
                        "nodeType": "Return",
                        "src": "14913:28:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19068,
                    "name": "SUCCESS_CODE",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18759,
                    "src": "15029:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "functionReturnParameters": 19043,
                  "id": 19069,
                  "nodeType": "Return",
                  "src": "15022:19:51"
                }
              ]
            },
            "documentation": {
              "id": 19032,
              "nodeType": "StructuredDocumentation",
              "src": "14005:177:51",
              "text": " @notice This function detects whether a transfer should be restricted and not allowed.\n If the function returns SUCCESS_CODE (0) then it should be allowed."
            },
            "functionSelector": "d4ce1415",
            "id": 19071,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19040,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "14293:8:51"
            },
            "parameters": {
              "id": 19039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19034,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14222:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19033,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14222:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19036,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14236:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14236:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19038,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14248:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19037,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14248:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14221:35:51"
            },
            "returnParameters": {
              "id": 19043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19042,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14319:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19041,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "14319:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14318:7:51"
            },
            "scope": 19155,
            "src": "14187:861:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18737
            ],
            "body": {
              "id": 19096,
              "nodeType": "Block",
              "src": "15433:296:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19080,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15447:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19081,
                      "name": "SUCCESS_CODE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18759,
                      "src": "15466:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15447:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19086,
                  "nodeType": "IfStatement",
                  "src": "15443:84:51",
                  "trueBody": {
                    "id": 19085,
                    "nodeType": "Block",
                    "src": "15480:47:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19083,
                          "name": "SUCCESS_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18765,
                          "src": "15501:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19084,
                        "nodeType": "Return",
                        "src": "15494:22:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19089,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19087,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15541:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19088,
                      "name": "FAILURE_NON_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18762,
                      "src": "15560:21:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15541:40:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19093,
                  "nodeType": "IfStatement",
                  "src": "15537:107:51",
                  "trueBody": {
                    "id": 19092,
                    "nodeType": "Block",
                    "src": "15583:61:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19090,
                          "name": "FAILURE_NON_WHITELIST_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18768,
                          "src": "15604:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19091,
                        "nodeType": "Return",
                        "src": "15597:36:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19094,
                    "name": "UNKNOWN_ERROR",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18771,
                    "src": "15709:13:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "functionReturnParameters": 19079,
                  "id": 19095,
                  "nodeType": "Return",
                  "src": "15702:20:51"
                }
              ]
            },
            "documentation": {
              "id": 19072,
              "nodeType": "StructuredDocumentation",
              "src": "15054:231:51",
              "text": " @notice This function allows a wallet or other client to get a human readable string to show\n a user if a transfer was restricted.  It should return enough information for the user\n to know why it failed."
            },
            "functionSelector": "7f4ab1dd",
            "id": 19097,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19076,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "15388:8:51"
            },
            "parameters": {
              "id": 19075,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19074,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15329:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19073,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "15329:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15328:23:51"
            },
            "returnParameters": {
              "id": 19079,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19078,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15414:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19077,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "15414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15413:15:51"
            },
            "scope": 19155,
            "src": "15290:439:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19121,
              "nodeType": "Block",
              "src": "15866:261:51",
              "statements": [
                {
                  "assignments": [
                    19104
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19104,
                      "mutability": "mutable",
                      "name": "withdrawableFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19121,
                      "src": "15876:25:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19103,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "15876:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19108,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19106,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19100,
                        "src": "15924:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19105,
                      "name": "_prepareWithdrawFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18135,
                      "src": "15904:19:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 19107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15904:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "15876:54:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19112,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19100,
                            "src": "15982:5:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 19113,
                            "name": "withdrawableFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19104,
                            "src": "15989:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 19110,
                            "name": "fundsToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18773,
                            "src": "15962:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$38235",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 19111,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transfer",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 38184,
                          "src": "15962:19:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 19114,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15962:45:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e776974686472617746756e64733a205452414e534645525f4641494c4544",
                        "id": 19115,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16021:52:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        },
                        "value": "SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        }
                      ],
                      "id": 19109,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "15941:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19116,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15941:142:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19117,
                  "nodeType": "ExpressionStatement",
                  "src": "15941:142:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19118,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "16094:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19119,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16094:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "id": 19120,
                  "nodeType": "ExpressionStatement",
                  "src": "16094:26:51"
                }
              ]
            },
            "documentation": {
              "id": 19098,
              "nodeType": "StructuredDocumentation",
              "src": "15735:75:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "id": 19122,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawFundsFor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19101,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19100,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19122,
                  "src": "15842:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19099,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15842:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15841:15:51"
            },
            "returnParameters": {
              "id": 19102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "15866:0:51"
            },
            "scope": 19155,
            "src": "15815:312:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19153,
              "nodeType": "Block",
              "src": "16422:210:51",
              "statements": [
                {
                  "assignments": [
                    19129
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19129,
                      "mutability": "mutable",
                      "name": "prevFundsTokenBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19153,
                      "src": "16432:29:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19128,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "16432:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19131,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 19130,
                    "name": "fundsTokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18775,
                    "src": "16464:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16432:49:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19140,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19132,
                      "name": "fundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18775,
                      "src": "16492:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19137,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "16541:4:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            ],
                            "id": 19136,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "16533:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19135,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "16533:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19138,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16533:13:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 19133,
                          "name": "fundsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18773,
                          "src": "16512:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$38235",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 19134,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 38174,
                        "src": "16512:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 19139,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "16512:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "16492:55:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 19141,
                  "nodeType": "ExpressionStatement",
                  "src": "16492:55:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19149,
                            "name": "prevFundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19129,
                            "src": "16602:21:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16595:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19147,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16595:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16595:29:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19144,
                            "name": "fundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18775,
                            "src": "16572:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16565:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19142,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16565:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19145,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16565:25:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "id": 19146,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19647,
                      "src": "16565:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$",
                        "typeString": "function (int256,int256) pure returns (int256)"
                      }
                    },
                    "id": 19151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16565:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "functionReturnParameters": 19127,
                  "id": 19152,
                  "nodeType": "Return",
                  "src": "16558:67:51"
                }
              ]
            },
            "documentation": {
              "id": 19123,
              "nodeType": "StructuredDocumentation",
              "src": "16133:222:51",
              "text": " @dev Updates the current funds token balance\n and returns the difference of new and previous funds token balances\n @return A int256 representing the difference of the new and previous funds token balance"
            },
            "id": 19154,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateFundsTokenBalance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19124,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16393:2:51"
            },
            "returnParameters": {
              "id": 19127,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19126,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19154,
                  "src": "16414:6:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 19125,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16413:8:51"
            },
            "scope": 19155,
            "src": "16360:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 19156,
        "src": "9713:6921:51"
      }
    ],
    "src": "41:16594:51"
  },
  "legacyAST": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol",
    "exportedSymbols": {
      "Administratable": [
        18474
      ],
      "ERC1404": [
        18738
      ],
      "ProxySafeSimpleRestrictedFDT": [
        19155
      ],
      "Restrictable": [
        18715
      ],
      "Whitelistable": [
        18674
      ]
    },
    "id": 19156,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 18363,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:51"
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "id": 18364,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 37428,
        "src": "67:79:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "id": 18365,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 38236,
        "src": "147:83:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol",
        "file": "./FundsDistributionToken.sol",
        "id": 18366,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18315,
        "src": "231:38:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol",
        "file": "./IFundsDistributionToken.sol",
        "id": 18367,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18344,
        "src": "270:39:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol",
        "file": "./IInitializableFDT.sol",
        "id": 18368,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18362,
        "src": "310:33:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18370,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "620:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18371,
            "nodeType": "InheritanceSpecifier",
            "src": "620:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18369,
          "nodeType": "StructuredDocumentation",
          "src": "345:246:51",
          "text": " @notice This contract allows a list of administrators to be tracked. This list can then be enforced\n on functions with administrative permissions.  Only the owner of the contract should be allowed\n to modify the administrator list."
        },
        "fullyImplemented": true,
        "id": 18474,
        "linearizedBaseContracts": [
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Administratable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "76be1585",
            "id": 18375,
            "mutability": "mutable",
            "name": "administrators",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18474,
            "src": "736:46:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 18374,
              "keyType": {
                "id": 18372,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "744:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "736:24:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 18373,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "755:4:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18381,
            "name": "AdminAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18377,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "850:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18376,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "850:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18379,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "878:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18378,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "878:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "849:53:51"
            },
            "src": "833:70:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18387,
            "name": "AdminRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18386,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18383,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "927:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18382,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "927:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18385,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "957:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18384,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "957:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "926:57:51"
            },
            "src": "908:76:51"
          },
          {
            "body": {
              "id": 18399,
              "nodeType": "Block",
              "src": "1107:142:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 18392,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1154:3:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 18393,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1154:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 18391,
                          "name": "isAdministrator",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18473,
                          "src": "1138:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 18394,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1138:27:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616c6c696e67206163636f756e74206973206e6f7420616e2061646d696e6973747261746f722e",
                        "id": 18395,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1179:42:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        },
                        "value": "Calling account is not an administrator."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        }
                      ],
                      "id": 18390,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1117:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18396,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1117:114:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18397,
                  "nodeType": "ExpressionStatement",
                  "src": "1117:114:51"
                },
                {
                  "id": 18398,
                  "nodeType": "PlaceholderStatement",
                  "src": "1241:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18388,
              "nodeType": "StructuredDocumentation",
              "src": "990:83:51",
              "text": " @notice Function modifier to enforce administrative permissions."
            },
            "id": 18400,
            "name": "onlyAdministrator",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18389,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1104:2:51"
            },
            "src": "1078:171:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18429,
              "nodeType": "Block",
              "src": "1427:431:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18413,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18409,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "1512:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18411,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18410,
                            "name": "adminToAdd",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18403,
                            "src": "1527:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1512:26:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1542:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "src": "1512:35:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f20626520616464656420746f2061646d696e206c69737420697320616c726561647920616e2061646d696e",
                        "id": 18414,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1561:55:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        },
                        "value": "Account to be added to admin list is already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        }
                      ],
                      "id": 18408,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1491:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18415,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1491:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18416,
                  "nodeType": "ExpressionStatement",
                  "src": "1491:135:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18421,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18417,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "1724:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18419,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18418,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1739:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1724:26:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 18420,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1753:4:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1724:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18422,
                  "nodeType": "ExpressionStatement",
                  "src": "1724:33:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18424,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1828:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18425,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1840:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18426,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1840:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18423,
                      "name": "AdminAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18381,
                      "src": "1817:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18427,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1817:34:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18428,
                  "nodeType": "EmitStatement",
                  "src": "1812:39:51"
                }
              ]
            },
            "documentation": {
              "id": 18401,
              "nodeType": "StructuredDocumentation",
              "src": "1255:112:51",
              "text": " @notice Add an admin to the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "70480275",
            "id": 18430,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18406,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18405,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "1417:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1417:9:51"
              }
            ],
            "name": "addAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18404,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18403,
                  "mutability": "mutable",
                  "name": "adminToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18430,
                  "src": "1390:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18402,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1390:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1389:20:51"
            },
            "returnParameters": {
              "id": 18407,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1427:0:51"
            },
            "scope": 18474,
            "src": "1372:486:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18459,
              "nodeType": "Block",
              "src": "2047:443:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18443,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18439,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "2120:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18441,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18440,
                            "name": "adminToRemove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18433,
                            "src": "2135:13:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2120:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 18442,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2153:4:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "src": "2120:37:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f2062652072656d6f7665642066726f6d2061646d696e206c697374206973206e6f7420616c726561647920616e2061646d696e",
                        "id": 18444,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2171:63:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        },
                        "value": "Account to be removed from admin list is not already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        }
                      ],
                      "id": 18438,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2099:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18445,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2099:145:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18446,
                  "nodeType": "ExpressionStatement",
                  "src": "2099:145:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18451,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18447,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "2347:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18449,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18448,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2362:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2347:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18450,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2379:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "2347:37:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18452,
                  "nodeType": "ExpressionStatement",
                  "src": "2347:37:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18454,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2457:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18455,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "2472:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18456,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2472:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18453,
                      "name": "AdminRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18387,
                      "src": "2444:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18457,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2444:39:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18458,
                  "nodeType": "EmitStatement",
                  "src": "2439:44:51"
                }
              ]
            },
            "documentation": {
              "id": 18431,
              "nodeType": "StructuredDocumentation",
              "src": "1864:117:51",
              "text": " @notice Remove an admin from the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "1785f53c",
            "id": 18460,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18436,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18435,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "2037:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2037:9:51"
              }
            ],
            "name": "removeAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18434,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18433,
                  "mutability": "mutable",
                  "name": "adminToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18460,
                  "src": "2007:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18432,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2007:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2006:23:51"
            },
            "returnParameters": {
              "id": 18437,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2047:0:51"
            },
            "scope": 18474,
            "src": "1986:504:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18472,
              "nodeType": "Block",
              "src": "2665:53:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18468,
                      "name": "administrators",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18375,
                      "src": "2682:14:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 18470,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18469,
                      "name": "addressToTest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18463,
                      "src": "2697:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2682:29:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18467,
                  "id": 18471,
                  "nodeType": "Return",
                  "src": "2675:36:51"
                }
              ]
            },
            "documentation": {
              "id": 18461,
              "nodeType": "StructuredDocumentation",
              "src": "2496:89:51",
              "text": " @notice Determine if the message sender is in the administrators list."
            },
            "functionSelector": "0a2eb301",
            "id": 18473,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isAdministrator",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18464,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18463,
                  "mutability": "mutable",
                  "name": "addressToTest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2615:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18462,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2615:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2614:23:51"
            },
            "returnParameters": {
              "id": 18467,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18466,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2659:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18465,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2659:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2658:6:51"
            },
            "scope": 18474,
            "src": "2590:128:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "592:2128:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18476,
              "name": "Administratable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18474,
              "src": "2980:15:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Administratable_$18474",
                "typeString": "contract Administratable"
              }
            },
            "id": 18477,
            "nodeType": "InheritanceSpecifier",
            "src": "2980:15:51"
          }
        ],
        "contractDependencies": [
          18474,
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18475,
          "nodeType": "StructuredDocumentation",
          "src": "2722:231:51",
          "text": " @notice Keeps track of whitelists and can check if sender and reciever are configured to allow a transfer.\n Only administrators can update the whitelists.\n Any address can only be a member of one whitelist at a time."
        },
        "fullyImplemented": true,
        "id": 18674,
        "linearizedBaseContracts": [
          18674,
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Whitelistable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 18480,
            "mutability": "constant",
            "name": "NO_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3066:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18478,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "3066:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18479,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "3105:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "functionSelector": "92e6d68b",
            "id": 18484,
            "mutability": "mutable",
            "name": "addressWhitelists",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3265:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
              "typeString": "mapping(address => uint8)"
            },
            "typeName": {
              "id": 18483,
              "keyType": {
                "id": 18481,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "3273:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "3265:25:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                "typeString": "mapping(address => uint8)"
              },
              "valueType": {
                "id": 18482,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3284:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "e9594508",
            "id": 18490,
            "mutability": "mutable",
            "name": "outboundWhitelistsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3471:73:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
              "typeString": "mapping(uint8 => mapping(uint8 => bool))"
            },
            "typeName": {
              "id": 18489,
              "keyType": {
                "id": 18485,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3479:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "3471:40:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                "typeString": "mapping(uint8 => mapping(uint8 => bool))"
              },
              "valueType": {
                "id": 18488,
                "keyType": {
                  "id": 18486,
                  "name": "uint8",
                  "nodeType": "ElementaryTypeName",
                  "src": "3496:5:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  }
                },
                "nodeType": "Mapping",
                "src": "3488:22:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                  "typeString": "mapping(uint8 => bool)"
                },
                "valueType": {
                  "id": 18487,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "3505:4:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18498,
            "name": "AddressAddedToWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18492,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3634:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18491,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3634:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18494,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3672:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18493,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3672:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18496,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3705:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18495,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3705:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3624:110:51"
            },
            "src": "3595:140:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18506,
            "name": "AddressRemovedFromWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18505,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18500,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3783:30:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18499,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3783:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18502,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3823:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18501,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3823:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18504,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3856:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18503,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3856:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3773:114:51"
            },
            "src": "3740:148:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18518,
            "name": "OutboundWhitelistUpdated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18508,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "updatedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3933:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18507,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3933:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18510,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3968:29:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18509,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3968:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18512,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4007:34:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18511,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4007:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18514,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4051:9:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18513,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4051:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18516,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4070:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18515,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4070:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3923:160:51"
            },
            "src": "3893:191:51"
          },
          {
            "body": {
              "id": 18566,
              "nodeType": "Block",
              "src": "4434:800:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18531,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18529,
                          "name": "whitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18523,
                          "src": "4493:9:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18530,
                          "name": "NO_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18480,
                          "src": "4506:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "4493:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "496e76616c69642077686974656c69737420494420737570706c696564",
                        "id": 18532,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4520:31:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        },
                        "value": "Invalid whitelist ID supplied"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        }
                      ],
                      "id": 18528,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4485:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18533,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4485:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18534,
                  "nodeType": "ExpressionStatement",
                  "src": "4485:67:51"
                },
                {
                  "assignments": [
                    18536
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18536,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18566,
                      "src": "4607:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18535,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "4607:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18540,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18537,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "4633:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18539,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18538,
                      "name": "addressToAdd",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18521,
                      "src": "4651:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4633:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4607:57:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18545,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18541,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "4718:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18543,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18542,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "4736:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4718:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18544,
                      "name": "whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18523,
                      "src": "4752:9:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4718:43:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18546,
                  "nodeType": "ExpressionStatement",
                  "src": "4718:43:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 18549,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18547,
                      "name": "previousWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18536,
                      "src": "4866:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 18548,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "4887:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4866:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18558,
                  "nodeType": "IfStatement",
                  "src": "4862:246:51",
                  "trueBody": {
                    "id": 18557,
                    "nodeType": "Block",
                    "src": "4901:207:51",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18551,
                              "name": "addressToAdd",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18521,
                              "src": "5008:12:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 18552,
                              "name": "previousWhitelist",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18536,
                              "src": "5038:17:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 18553,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5073:3:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 18554,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5073:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 18550,
                            "name": "AddressRemovedFromWhitelist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18506,
                            "src": "4963:27:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                              "typeString": "function (address,uint8,address)"
                            }
                          },
                          "id": 18555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4963:134:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18556,
                        "nodeType": "EmitStatement",
                        "src": "4958:139:51"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18560,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "5191:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18561,
                        "name": "whitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18523,
                        "src": "5205:9:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18562,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5216:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18563,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5216:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18559,
                      "name": "AddressAddedToWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18498,
                      "src": "5167:23:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18564,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5167:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18565,
                  "nodeType": "EmitStatement",
                  "src": "5162:65:51"
                }
              ]
            },
            "documentation": {
              "id": 18519,
              "nodeType": "StructuredDocumentation",
              "src": "4090:231:51",
              "text": " @notice Sets an address's white list ID.  Only administrators should be allowed to update this.\n If an address is on an existing whitelist, it will just get updated to the new value (removed from previous)."
            },
            "functionSelector": "0263b858",
            "id": 18567,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18526,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18525,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "4412:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4412:17:51"
              }
            ],
            "name": "addToWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18521,
                  "mutability": "mutable",
                  "name": "addressToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4350:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18520,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4350:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18523,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4372:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18522,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4372:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4349:39:51"
            },
            "returnParameters": {
              "id": 18527,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4434:0:51"
            },
            "scope": 18674,
            "src": "4326:908:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18594,
              "nodeType": "Block",
              "src": "5464:401:51",
              "statements": [
                {
                  "assignments": [
                    18576
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18576,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18594,
                      "src": "5518:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18575,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5518:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18580,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18577,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "5544:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18579,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18578,
                      "name": "addressToRemove",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18570,
                      "src": "5562:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "5544:34:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5518:60:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18585,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18581,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "5633:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18583,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18582,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5651:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "5633:34:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18584,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "5670:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "5633:49:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18586,
                  "nodeType": "ExpressionStatement",
                  "src": "5633:49:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18588,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5778:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18589,
                        "name": "previousWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18576,
                        "src": "5807:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18590,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5838:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18591,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5838:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18587,
                      "name": "AddressRemovedFromWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18506,
                      "src": "5737:27:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18592,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5737:121:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18593,
                  "nodeType": "EmitStatement",
                  "src": "5732:126:51"
                }
              ]
            },
            "documentation": {
              "id": 18568,
              "nodeType": "StructuredDocumentation",
              "src": "5240:120:51",
              "text": " @notice Clears out an address's white list ID.  Only administrators should be allowed to update this."
            },
            "functionSelector": "8ab1d681",
            "id": 18595,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18573,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18572,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "5442:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5442:17:51"
              }
            ],
            "name": "removeFromWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18571,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18570,
                  "mutability": "mutable",
                  "name": "addressToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18595,
                  "src": "5394:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18569,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5394:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5393:25:51"
            },
            "returnParameters": {
              "id": 18574,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5464:0:51"
            },
            "scope": 18674,
            "src": "5365:500:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18632,
              "nodeType": "Block",
              "src": "6227:498:51",
              "statements": [
                {
                  "assignments": [
                    18608
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18608,
                      "mutability": "mutable",
                      "name": "oldEnabledValue",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18632,
                      "src": "6273:20:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 18607,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "6273:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18614,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18609,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "6296:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18611,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18610,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6322:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6296:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18613,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18612,
                      "name": "destinationWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18600,
                      "src": "6339:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6296:64:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6273:87:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18621,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 18615,
                          "name": "outboundWhitelistsEnabled",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18490,
                          "src": "6406:25:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                            "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                          }
                        },
                        "id": 18618,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 18616,
                          "name": "sourceWhitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18598,
                          "src": "6432:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6406:42:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                          "typeString": "mapping(uint8 => bool)"
                        }
                      },
                      "id": 18619,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18617,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6449:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "6406:64:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18620,
                      "name": "newEnabledValue",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18602,
                      "src": "6473:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6406:82:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18622,
                  "nodeType": "ExpressionStatement",
                  "src": "6406:82:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18624,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "6577:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18625,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "6577:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18626,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6601:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18627,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6630:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18628,
                        "name": "oldEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18608,
                        "src": "6664:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18629,
                        "name": "newEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18602,
                        "src": "6693:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 18623,
                      "name": "OutboundWhitelistUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18518,
                      "src": "6539:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_uint8_$_t_bool_$_t_bool_$returns$__$",
                        "typeString": "function (address,uint8,uint8,bool,bool)"
                      }
                    },
                    "id": 18630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6539:179:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18631,
                  "nodeType": "EmitStatement",
                  "src": "6534:184:51"
                }
              ]
            },
            "documentation": {
              "id": 18596,
              "nodeType": "StructuredDocumentation",
              "src": "5871:183:51",
              "text": " @notice Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist.\n Only administrators should be allowed to update this."
            },
            "functionSelector": "3973b596",
            "id": 18633,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18605,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18604,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "6209:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "6209:17:51"
              }
            ],
            "name": "updateOutboundWhitelistEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18603,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18598,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6108:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18597,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6108:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18600,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6139:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18599,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6139:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18602,
                  "mutability": "mutable",
                  "name": "newEnabledValue",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6175:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18601,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6175:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6098:103:51"
            },
            "returnParameters": {
              "id": 18606,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6227:0:51"
            },
            "scope": 18674,
            "src": "6059:666:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18672,
              "nodeType": "Block",
              "src": "7039:569:51",
              "statements": [
                {
                  "assignments": [
                    18644
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18644,
                      "mutability": "mutable",
                      "name": "senderWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7094:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18643,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7094:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18648,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18645,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7118:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18647,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18646,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18636,
                      "src": "7136:6:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7118:25:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7094:49:51"
                },
                {
                  "assignments": [
                    18650
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18650,
                      "mutability": "mutable",
                      "name": "receiverWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7153:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18649,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7153:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18654,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18651,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7179:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18653,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18652,
                      "name": "receiver",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18638,
                      "src": "7197:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7179:27:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7153:53:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 18661,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18657,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18655,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7313:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18656,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7332:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7313:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18660,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18658,
                        "name": "receiverWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18650,
                        "src": "7348:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18659,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7369:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7348:33:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "7313:68:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18665,
                  "nodeType": "IfStatement",
                  "src": "7296:133:51",
                  "trueBody": {
                    "id": 18664,
                    "nodeType": "Block",
                    "src": "7392:37:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7413:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "functionReturnParameters": 18642,
                        "id": 18663,
                        "nodeType": "Return",
                        "src": "7406:12:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18666,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "7540:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18668,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18667,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7566:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7540:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18670,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18669,
                      "name": "receiverWhiteList",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18650,
                      "src": "7583:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7540:61:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18642,
                  "id": 18671,
                  "nodeType": "Return",
                  "src": "7533:68:51"
                }
              ]
            },
            "documentation": {
              "id": 18634,
              "nodeType": "StructuredDocumentation",
              "src": "6731:183:51",
              "text": " @notice Determine if the a sender is allowed to send to the receiver.\n The source whitelist must be enabled to send to the whitelist where the receive exists."
            },
            "functionSelector": "9437e2fe",
            "id": 18673,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "checkWhitelistAllowed",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18639,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18636,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6950:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18635,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6950:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18638,
                  "mutability": "mutable",
                  "name": "receiver",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6966:16:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18637,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6966:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6949:34:51"
            },
            "returnParameters": {
              "id": 18642,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18641,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "7029:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18640,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "7029:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7028:6:51"
            },
            "scope": 18674,
            "src": "6919:689:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "2954:4656:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18676,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "7786:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18677,
            "nodeType": "InheritanceSpecifier",
            "src": "7786:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18675,
          "nodeType": "StructuredDocumentation",
          "src": "7612:148:51",
          "text": " @notice Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled.\n Only the owner may disable restrictions."
        },
        "fullyImplemented": true,
        "id": 18715,
        "linearizedBaseContracts": [
          18715,
          37427,
          37222,
          37297
        ],
        "name": "Restrictable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 18680,
            "mutability": "mutable",
            "name": "_restrictionsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18715,
            "src": "7895:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 18678,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "7895:4:51",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "74727565",
              "id": 18679,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "bool",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7931:4:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              },
              "value": "true"
            },
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18684,
            "name": "RestrictionsDisabled",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18683,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18682,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18684,
                  "src": "8012:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18681,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8012:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8011:23:51"
            },
            "src": "7985:50:51"
          },
          {
            "body": {
              "id": 18704,
              "nodeType": "Block",
              "src": "8281:224:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18691,
                        "name": "_restrictionsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18680,
                        "src": "8299:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5265737472696374696f6e732061726520616c72656164792064697361626c65642e",
                        "id": 18692,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8321:36:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        },
                        "value": "Restrictions are already disabled."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        }
                      ],
                      "id": 18690,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8291:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8291:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18694,
                  "nodeType": "ExpressionStatement",
                  "src": "8291:67:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18697,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18695,
                      "name": "_restrictionsEnabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18680,
                      "src": "8393:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18696,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8416:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "8393:28:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18698,
                  "nodeType": "ExpressionStatement",
                  "src": "8393:28:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18700,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "8487:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18701,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "8487:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18699,
                      "name": "RestrictionsDisabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18684,
                      "src": "8466:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18702,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8466:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18703,
                  "nodeType": "EmitStatement",
                  "src": "8461:37:51"
                }
              ]
            },
            "documentation": {
              "id": 18685,
              "nodeType": "StructuredDocumentation",
              "src": "8041:187:51",
              "text": " @notice Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call.\n This is a permanent change that cannot be undone"
            },
            "functionSelector": "dce306ad",
            "id": 18705,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18688,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18687,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "8271:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "8271:9:51"
              }
            ],
            "name": "disableRestrictions",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18686,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8261:2:51"
            },
            "returnParameters": {
              "id": 18689,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8281:0:51"
            },
            "scope": 18715,
            "src": "8233:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18713,
              "nodeType": "Block",
              "src": "8656:44:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18711,
                    "name": "_restrictionsEnabled",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18680,
                    "src": "8673:20:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18710,
                  "id": 18712,
                  "nodeType": "Return",
                  "src": "8666:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18706,
              "nodeType": "StructuredDocumentation",
              "src": "8511:81:51",
              "text": " @notice View function to determine if restrictions are enabled"
            },
            "functionSelector": "2a642407",
            "id": 18714,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isRestrictionEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18707,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8626:2:51"
            },
            "returnParameters": {
              "id": 18710,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18709,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18714,
                  "src": "8650:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18708,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8650:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8649:6:51"
            },
            "scope": 18715,
            "src": "8597:103:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "7761:941:51"
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18716,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "8733:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "id": 18717,
            "nodeType": "InheritanceSpecifier",
            "src": "8733:6:51"
          }
        ],
        "contractDependencies": [
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": false,
        "id": 18738,
        "linearizedBaseContracts": [
          18738,
          38235
        ],
        "name": "ERC1404",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": {
              "id": 18718,
              "nodeType": "StructuredDocumentation",
              "src": "8747:378:51",
              "text": " @notice Detects if a transfer will be reverted and if so returns an appropriate reference code\n @param from Sending address\n @param to Receiving address\n @param value Amount of tokens being transferred\n @return Code by which to reference message for rejection reasoning\n @dev Overwrite with your custom transfer restriction logic"
            },
            "functionSelector": "d4ce1415",
            "id": 18729,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18725,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18720,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9165:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9165:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18722,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9179:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18721,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9179:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18724,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9191:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18723,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9191:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9164:41:51"
            },
            "returnParameters": {
              "id": 18728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18727,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9267:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18726,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9267:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9266:7:51"
            },
            "scope": 18738,
            "src": "9130:144:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 18730,
              "nodeType": "StructuredDocumentation",
              "src": "9280:286:51",
              "text": " @notice Returns a human-readable message for a given restriction code\n @param restrictionCode Identifier for looking up a message\n @return Text showing the restriction's reasoning\n @dev Overwrite with your custom message and restrictionCode handling"
            },
            "functionSelector": "7f4ab1dd",
            "id": 18737,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18732,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9610:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18731,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9610:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9609:23:51"
            },
            "returnParameters": {
              "id": 18736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18735,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9694:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18734,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9694:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9693:15:51"
            },
            "scope": 18738,
            "src": "9571:138:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "8704:1007:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18739,
              "name": "IFundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18343,
              "src": "9758:23:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IFundsDistributionToken_$18343",
                "typeString": "contract IFundsDistributionToken"
              }
            },
            "id": 18740,
            "nodeType": "InheritanceSpecifier",
            "src": "9758:23:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18741,
              "name": "IInitializableFDT",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18361,
              "src": "9787:17:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IInitializableFDT_$18361",
                "typeString": "contract IInitializableFDT"
              }
            },
            "id": 18742,
            "nodeType": "InheritanceSpecifier",
            "src": "9787:17:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18743,
              "name": "FundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18314,
              "src": "9810:22:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_FundsDistributionToken_$18314",
                "typeString": "contract FundsDistributionToken"
              }
            },
            "id": 18744,
            "nodeType": "InheritanceSpecifier",
            "src": "9810:22:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18745,
              "name": "ERC1404",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18738,
              "src": "9838:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC1404_$18738",
                "typeString": "contract ERC1404"
              }
            },
            "id": 18746,
            "nodeType": "InheritanceSpecifier",
            "src": "9838:7:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18747,
              "name": "Whitelistable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18674,
              "src": "9851:13:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Whitelistable_$18674",
                "typeString": "contract Whitelistable"
              }
            },
            "id": 18748,
            "nodeType": "InheritanceSpecifier",
            "src": "9851:13:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18749,
              "name": "Restrictable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18715,
              "src": "9870:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Restrictable_$18715",
                "typeString": "contract Restrictable"
              }
            },
            "id": 18750,
            "nodeType": "InheritanceSpecifier",
            "src": "9870:12:51"
          }
        ],
        "contractDependencies": [
          18314,
          18343,
          18361,
          18474,
          18674,
          18715,
          18738,
          37222,
          37297,
          37427,
          38157,
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 19155,
        "linearizedBaseContracts": [
          19155,
          18715,
          18674,
          18474,
          37427,
          18738,
          18314,
          38157,
          38235,
          37222,
          37297,
          18361,
          18343
        ],
        "name": "ProxySafeSimpleRestrictedFDT",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 18753,
            "libraryName": {
              "contractScope": null,
              "id": 18751,
              "name": "SafeMathUint",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19732,
              "src": "9895:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathUint_$19732",
                "typeString": "library SafeMathUint"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9889:31:51",
            "typeName": {
              "id": 18752,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "9912:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 18756,
            "libraryName": {
              "contractScope": null,
              "id": 18754,
              "name": "SafeMathInt",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19705,
              "src": "9931:11:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathInt_$19705",
                "typeString": "library SafeMathInt"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9925:29:51",
            "typeName": {
              "id": 18755,
              "name": "int256",
              "nodeType": "ElementaryTypeName",
              "src": "9947:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_int256",
                "typeString": "int256"
              }
            }
          },
          {
            "constant": true,
            "functionSelector": "0e969a05",
            "id": 18759,
            "mutability": "constant",
            "name": "SUCCESS_CODE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10000:38:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18757,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10000:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18758,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10037:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "1fb45ec0",
            "id": 18762,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10044:47:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18760,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10044:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "31",
              "id": 18761,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10090:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "e7984d17",
            "id": 18765,
            "mutability": "constant",
            "name": "SUCCESS_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10097:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18763,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10097:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "53554343455353",
              "id": 18764,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10138:9:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_39bf027dd97f3bae0cf8cfb909695ec63313a9bd61ad52fc7f52cf565b141da8",
                "typeString": "literal_string \"SUCCESS\""
              },
              "value": "SUCCESS"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "c8934462",
            "id": 18768,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10153:117:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18766,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10153:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "546865207472616e736665722077617320726573747269637465642064756520746f207768697465206c69737420636f6e66696775726174696f6e2e",
              "id": 18767,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10208:62:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_e2c08a66f2b86feb88c976c9f1fd6dfebdf34e61c54a5cf461a34d6ed427b2fc",
                "typeString": "literal_string \"The transfer was restricted due to white list configuration.\""
              },
              "value": "The transfer was restricted due to white list configuration."
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "97af6744",
            "id": 18771,
            "mutability": "constant",
            "name": "UNKNOWN_ERROR",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10276:59:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18769,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10276:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "556e6b6e6f776e204572726f7220436f6465",
              "id": 18770,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10315:20:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_eff12b0856ae7501c8b50262ed26026205f1ee274bd4090cd444e8ef0358a146",
                "typeString": "literal_string \"Unknown Error Code\""
              },
              "value": "Unknown Error Code"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "63f04b15",
            "id": 18773,
            "mutability": "mutable",
            "name": "fundsToken",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10416:24:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$38235",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 18772,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "10416:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "a9691f3f",
            "id": 18775,
            "mutability": "mutable",
            "name": "fundsTokenBalance",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10524:32:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 18774,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "10524:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18789,
              "nodeType": "Block",
              "src": "10589:163:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18784,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 18778,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "10620:3:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 18779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10620:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18782,
                              "name": "fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18773,
                              "src": "10642:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18781,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "10634:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18780,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "10634:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18783,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10634:19:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "10620:33:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e6f6e6c7946756e6473546f6b656e3a20554e415554484f52495a45445f53454e444552",
                        "id": 18785,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10667:57:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        },
                        "value": "SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 18777,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10599:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18786,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10599:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18787,
                  "nodeType": "ExpressionStatement",
                  "src": "10599:135:51"
                },
                {
                  "id": 18788,
                  "nodeType": "PlaceholderStatement",
                  "src": "10744:1:51"
                }
              ]
            },
            "documentation": null,
            "id": 18790,
            "name": "onlyFundsToken",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18776,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10586:2:51"
            },
            "src": "10563:189:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18817,
              "nodeType": "Block",
              "src": "10906:226:51",
              "statements": [
                {
                  "assignments": [
                    18800
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18800,
                      "mutability": "mutable",
                      "name": "restrictionCode",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18817,
                      "src": "10916:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18799,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "10916:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18806,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18802,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18793,
                        "src": "10966:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18803,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18795,
                        "src": "10972:2:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18804,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18797,
                        "src": "10976:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18801,
                      "name": "detectTransferRestriction",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        19071
                      ],
                      "referencedDeclaration": 19071,
                      "src": "10940:25:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$returns$_t_uint8_$",
                        "typeString": "function (address,address,uint256) view returns (uint8)"
                      }
                    },
                    "id": 18805,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10940:42:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10916:66:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18810,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18808,
                          "name": "restrictionCode",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18800,
                          "src": "11013:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18809,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "11032:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "11013:31:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 18812,
                            "name": "restrictionCode",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18800,
                            "src": "11088:15:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          ],
                          "id": 18811,
                          "name": "messageForTransferRestriction",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [
                            19097
                          ],
                          "referencedDeclaration": 19097,
                          "src": "11058:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint8_$returns$_t_string_memory_ptr_$",
                            "typeString": "function (uint8) view returns (string memory)"
                          }
                        },
                        "id": 18813,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11058:46:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 18807,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10992:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18814,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10992:122:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18815,
                  "nodeType": "ExpressionStatement",
                  "src": "10992:122:51"
                },
                {
                  "id": 18816,
                  "nodeType": "PlaceholderStatement",
                  "src": "11124:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18791,
              "nodeType": "StructuredDocumentation",
              "src": "10758:79:51",
              "text": " @notice Evaluates whether a transfer should be allowed or not."
            },
            "id": 18818,
            "name": "notRestricted",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18798,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18793,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10865:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18792,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10865:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18795,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10879:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18794,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10879:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18797,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10891:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18796,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10864:41:51"
            },
            "src": "10842:290:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18328
            ],
            "body": {
              "id": 18828,
              "nodeType": "Block",
              "src": "11255:46:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18824,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "11283:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18825,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "11283:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18823,
                      "name": "_withdrawFundsFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19122,
                      "src": "11265:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18826,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11265:29:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18827,
                  "nodeType": "ExpressionStatement",
                  "src": "11265:29:51"
                }
              ]
            },
            "documentation": {
              "id": 18819,
              "nodeType": "StructuredDocumentation",
              "src": "11138:69:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "functionSelector": "24600fc3",
            "id": 18829,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawFunds",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18821,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "11246:8:51"
            },
            "parameters": {
              "id": 18820,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11234:2:51"
            },
            "returnParameters": {
              "id": 18822,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11255:0:51"
            },
            "scope": 19155,
            "src": "11212:89:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 18849,
              "nodeType": "Block",
              "src": "11684:156:51",
              "statements": [
                {
                  "assignments": [
                    18834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18834,
                      "mutability": "mutable",
                      "name": "newFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18849,
                      "src": "11694:15:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      },
                      "typeName": {
                        "id": 18833,
                        "name": "int256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11694:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18837,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 18835,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "11712:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 18836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11712:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11694:44:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    },
                    "id": 18840,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18838,
                      "name": "newFunds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18834,
                      "src": "11753:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18839,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "11764:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "11753:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18848,
                  "nodeType": "IfStatement",
                  "src": "11749:85:51",
                  "trueBody": {
                    "id": 18847,
                    "nodeType": "Block",
                    "src": "11767:67:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18842,
                                  "name": "newFunds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18834,
                                  "src": "11798:8:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "id": 18843,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint256Safe",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 19704,
                                "src": "11798:22:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$",
                                  "typeString": "function (int256) pure returns (uint256)"
                                }
                              },
                              "id": 18844,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11798:24:51",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 18841,
                            "name": "_distributeFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18102,
                            "src": "11781:16:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 18845,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11781:42:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18846,
                        "nodeType": "ExpressionStatement",
                        "src": "11781:42:51"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 18830,
              "nodeType": "StructuredDocumentation",
              "src": "11307:332:51",
              "text": " @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
            },
            "functionSelector": "46c162de",
            "id": 18850,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateFundsReceived",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18831,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11672:2:51"
            },
            "returnParameters": {
              "id": 18832,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11684:0:51"
            },
            "scope": 19155,
            "src": "11644:196:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18360
            ],
            "body": {
              "id": 18905,
              "nodeType": "Block",
              "src": "12158:327:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18876,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18870,
                              "name": "_fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18857,
                              "src": "12197:11:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12189:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18868,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12189:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18871,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12189:20:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 18874,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12221:1:51",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 18873,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12213:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18872,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12213:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18875,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12213:10:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "12189:34:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644543a20494e56414c49445f46554e44535f544f4b454e5f41444452455353",
                        "id": 18877,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "12237:50:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        },
                        "value": "SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        }
                      ],
                      "id": 18867,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "12168:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18878,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12168:129:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18879,
                  "nodeType": "ExpressionStatement",
                  "src": "12168:129:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18883,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18853,
                        "src": "12327:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18884,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18855,
                        "src": "12333:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18880,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12308:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18882,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__ERC20_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37680,
                      "src": "12308:18:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 18885,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12308:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18886,
                  "nodeType": "ExpressionStatement",
                  "src": "12308:32:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18887,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12350:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18889,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__Ownable_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37327,
                      "src": "12350:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 18890,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12350:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18891,
                  "nodeType": "ExpressionStatement",
                  "src": "12350:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18892,
                      "name": "fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18773,
                      "src": "12383:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18893,
                      "name": "_fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18857,
                      "src": "12396:11:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "12383:24:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 18895,
                  "nodeType": "ExpressionStatement",
                  "src": "12383:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18897,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12435:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 18896,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37422,
                      "src": "12417:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12417:24:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18899,
                  "nodeType": "ExpressionStatement",
                  "src": "12417:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18901,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12457:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18902,
                        "name": "initialAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18861,
                        "src": "12464:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18900,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "12451:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 18903,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12451:27:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18904,
                  "nodeType": "ExpressionStatement",
                  "src": "12451:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18851,
              "nodeType": "StructuredDocumentation",
              "src": "11846:113:51",
              "text": " @notice Initialize a new instance storage\n @dev \"constructor\" to be called on deployment"
            },
            "functionSelector": "c9aba0aa",
            "id": 18906,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18865,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18864,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37270,
                  "src": "12146:11:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12146:11:51"
              }
            ],
            "name": "initialize",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18863,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "12137:8:51"
            },
            "parameters": {
              "id": 18862,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18853,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "11993:18:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18852,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "11993:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18855,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12021:20:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18854,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "12021:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18857,
                  "mutability": "mutable",
                  "name": "_fundsToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12051:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 18856,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 38235,
                    "src": "12051:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18859,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12079:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18858,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12079:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18861,
                  "mutability": "mutable",
                  "name": "initialAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12102:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18860,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12102:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11983:146:51"
            },
            "returnParameters": {
              "id": 18866,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12158:0:51"
            },
            "scope": 19155,
            "src": "11964:521:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18932,
              "nodeType": "Block",
              "src": "12616:113:51",
              "statements": [
                {
                  "body": {
                    "id": 18930,
                    "nodeType": "Block",
                    "src": "12670:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 18925,
                                "name": "owners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18910,
                                "src": "12702:6:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 18927,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 18926,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18914,
                                "src": "12709:1:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "12702:9:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 18924,
                            "name": "_withdrawFundsFor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19122,
                            "src": "12684:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 18928,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12684:28:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18929,
                        "nodeType": "ExpressionStatement",
                        "src": "12684:28:51"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 18920,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18917,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18914,
                      "src": "12646:1:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 18918,
                        "name": "owners",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18910,
                        "src": "12650:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 18919,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "12650:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "12646:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18931,
                  "initializationExpression": {
                    "assignments": [
                      18914
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 18914,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18931,
                        "src": "12631:9:51",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18913,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12631:7:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 18916,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18915,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "12643:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "12631:13:51"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 18922,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "12665:3:51",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 18921,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18914,
                        "src": "12665:1:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 18923,
                    "nodeType": "ExpressionStatement",
                    "src": "12665:3:51"
                  },
                  "nodeType": "ForStatement",
                  "src": "12626:97:51"
                }
              ]
            },
            "documentation": {
              "id": 18907,
              "nodeType": "StructuredDocumentation",
              "src": "12491:69:51",
              "text": " @notice Withdraws funds for a set of token holders"
            },
            "functionSelector": "45f634f2",
            "id": 18933,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pushFunds",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18910,
                  "mutability": "mutable",
                  "name": "owners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18933,
                  "src": "12584:23:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 18908,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "12584:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 18909,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "12584:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12583:25:51"
            },
            "returnParameters": {
              "id": 18912,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12616:0:51"
            },
            "scope": 19155,
            "src": "12565:164:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37774,
              38184
            ],
            "body": {
              "id": 18960,
              "nodeType": "Block",
              "src": "13023:52:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18952,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18950,
                      "src": "13033:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18955,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18936,
                          "src": "13058:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18956,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18938,
                          "src": "13062:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18953,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13043:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18954,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transfer",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37774,
                        "src": "13043:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,uint256) returns (bool)"
                        }
                      },
                      "id": 18957,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13043:25:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13033:35:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18959,
                  "nodeType": "ExpressionStatement",
                  "src": "13033:35:51"
                }
              ]
            },
            "documentation": {
              "id": 18934,
              "nodeType": "StructuredDocumentation",
              "src": "12735:100:51",
              "text": " @notice Overrides the parent class token transfer function to enforce restrictions."
            },
            "functionSelector": "a9059cbb",
            "id": 18961,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 18941,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -15,
                      "src": "12922:3:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 18942,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "12922:10:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18943,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18936,
                    "src": "12934:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18944,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18938,
                    "src": "12938:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18945,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18940,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "12908:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12908:36:51"
              }
            ],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18948,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18946,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "12962:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18947,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "12970:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "12953:34:51"
            },
            "parameters": {
              "id": 18939,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18936,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12858:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18935,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12858:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18938,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12870:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18937,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12870:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12857:27:51"
            },
            "returnParameters": {
              "id": 18951,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18950,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "13005:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18949,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13005:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13004:14:51"
            },
            "scope": 19155,
            "src": "12840:235:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37851,
              38216
            ],
            "body": {
              "id": 18990,
              "nodeType": "Block",
              "src": "13385:62:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18981,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18979,
                      "src": "13395:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18984,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18964,
                          "src": "13424:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18985,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18966,
                          "src": "13430:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18986,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18968,
                          "src": "13434:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18982,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13405:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18983,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferFrom",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37851,
                        "src": "13405:18:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,address,uint256) returns (bool)"
                        }
                      },
                      "id": 18987,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13405:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13395:45:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18989,
                  "nodeType": "ExpressionStatement",
                  "src": "13395:45:51"
                }
              ]
            },
            "documentation": {
              "id": 18962,
              "nodeType": "StructuredDocumentation",
              "src": "13081:104:51",
              "text": " @notice Overrides the parent class token transferFrom function to enforce restrictions."
            },
            "functionSelector": "23b872dd",
            "id": 18991,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 18971,
                    "name": "from",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18964,
                    "src": "13290:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18972,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18966,
                    "src": "13296:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18973,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18968,
                    "src": "13300:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18974,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18970,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "13276:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13276:30:51"
              }
            ],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18977,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18975,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "13324:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18976,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "13332:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "13315:34:51"
            },
            "parameters": {
              "id": 18969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18964,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13212:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18963,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13212:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18966,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13226:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18965,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13226:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18968,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13238:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18967,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13238:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13211:41:51"
            },
            "returnParameters": {
              "id": 18980,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18979,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13367:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18978,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13367:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13366:14:51"
            },
            "scope": 19155,
            "src": "13190:257:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19010,
              "nodeType": "Block",
              "src": "13660:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19004,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18994,
                        "src": "13676:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19005,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18996,
                        "src": "13685:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19003,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "13670:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13670:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19007,
                  "nodeType": "ExpressionStatement",
                  "src": "13670:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19008,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13709:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19002,
                  "id": 19009,
                  "nodeType": "Return",
                  "src": "13702:11:51"
                }
              ]
            },
            "documentation": {
              "id": 18992,
              "nodeType": "StructuredDocumentation",
              "src": "13453:123:51",
              "text": " @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "40c10f19",
            "id": 19011,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18999,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18998,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13635:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13635:9:51"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18994,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13595:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18993,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13595:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18996,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13612:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13612:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13594:33:51"
            },
            "returnParameters": {
              "id": 19002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19001,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13654:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19000,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13654:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13653:6:51"
            },
            "scope": 19155,
            "src": "13581:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19030,
              "nodeType": "Block",
              "src": "13939:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19024,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19014,
                        "src": "13955:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19025,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19016,
                        "src": "13964:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19023,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18313
                      ],
                      "referencedDeclaration": 18313,
                      "src": "13949:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19026,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13949:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19027,
                  "nodeType": "ExpressionStatement",
                  "src": "13949:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13988:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19022,
                  "id": 19029,
                  "nodeType": "Return",
                  "src": "13981:11:51"
                }
              ]
            },
            "documentation": {
              "id": 19012,
              "nodeType": "StructuredDocumentation",
              "src": "13726:129:51",
              "text": " @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "9dc29fac",
            "id": 19031,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19019,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19018,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13914:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13914:9:51"
              }
            ],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19017,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19014,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13874:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19013,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13874:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19016,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13891:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19015,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13873:33:51"
            },
            "returnParameters": {
              "id": 19022,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19021,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13933:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19020,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13933:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13932:6:51"
            },
            "scope": 19155,
            "src": "13860:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18729
            ],
            "body": {
              "id": 19070,
              "nodeType": "Block",
              "src": "14330:718:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19046,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14487:23:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19044,
                        "name": "isRestrictionEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18714,
                        "src": "14488:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                          "typeString": "function () view returns (bool)"
                        }
                      },
                      "id": 19045,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14488:22:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19050,
                  "nodeType": "IfStatement",
                  "src": "14483:73:51",
                  "trueBody": {
                    "id": 19049,
                    "nodeType": "Block",
                    "src": "14512:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19047,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14533:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19048,
                        "nodeType": "Return",
                        "src": "14526:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 19054,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19051,
                      "name": "from",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19034,
                      "src": "14646:4:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19052,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 37359,
                        "src": "14654:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 19053,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14654:7:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "14646:15:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19058,
                  "nodeType": "IfStatement",
                  "src": "14642:65:51",
                  "trueBody": {
                    "id": 19057,
                    "nodeType": "Block",
                    "src": "14663:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19055,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14684:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19056,
                        "nodeType": "Return",
                        "src": "14677:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19063,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14865:32:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 19060,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19034,
                          "src": "14888:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 19061,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19036,
                          "src": "14894:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 19059,
                        "name": "checkWhitelistAllowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18673,
                        "src": "14866:21:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                          "typeString": "function (address,address) view returns (bool)"
                        }
                      },
                      "id": 19062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14866:31:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19067,
                  "nodeType": "IfStatement",
                  "src": "14861:91:51",
                  "trueBody": {
                    "id": 19066,
                    "nodeType": "Block",
                    "src": "14899:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19064,
                          "name": "FAILURE_NON_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18762,
                          "src": "14920:21:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19065,
                        "nodeType": "Return",
                        "src": "14913:28:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19068,
                    "name": "SUCCESS_CODE",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18759,
                    "src": "15029:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "functionReturnParameters": 19043,
                  "id": 19069,
                  "nodeType": "Return",
                  "src": "15022:19:51"
                }
              ]
            },
            "documentation": {
              "id": 19032,
              "nodeType": "StructuredDocumentation",
              "src": "14005:177:51",
              "text": " @notice This function detects whether a transfer should be restricted and not allowed.\n If the function returns SUCCESS_CODE (0) then it should be allowed."
            },
            "functionSelector": "d4ce1415",
            "id": 19071,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19040,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "14293:8:51"
            },
            "parameters": {
              "id": 19039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19034,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14222:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19033,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14222:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19036,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14236:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14236:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19038,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14248:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19037,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14248:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14221:35:51"
            },
            "returnParameters": {
              "id": 19043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19042,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14319:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19041,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "14319:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14318:7:51"
            },
            "scope": 19155,
            "src": "14187:861:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18737
            ],
            "body": {
              "id": 19096,
              "nodeType": "Block",
              "src": "15433:296:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19080,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15447:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19081,
                      "name": "SUCCESS_CODE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18759,
                      "src": "15466:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15447:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19086,
                  "nodeType": "IfStatement",
                  "src": "15443:84:51",
                  "trueBody": {
                    "id": 19085,
                    "nodeType": "Block",
                    "src": "15480:47:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19083,
                          "name": "SUCCESS_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18765,
                          "src": "15501:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19084,
                        "nodeType": "Return",
                        "src": "15494:22:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19089,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19087,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15541:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19088,
                      "name": "FAILURE_NON_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18762,
                      "src": "15560:21:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15541:40:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19093,
                  "nodeType": "IfStatement",
                  "src": "15537:107:51",
                  "trueBody": {
                    "id": 19092,
                    "nodeType": "Block",
                    "src": "15583:61:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19090,
                          "name": "FAILURE_NON_WHITELIST_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18768,
                          "src": "15604:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19091,
                        "nodeType": "Return",
                        "src": "15597:36:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19094,
                    "name": "UNKNOWN_ERROR",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18771,
                    "src": "15709:13:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "functionReturnParameters": 19079,
                  "id": 19095,
                  "nodeType": "Return",
                  "src": "15702:20:51"
                }
              ]
            },
            "documentation": {
              "id": 19072,
              "nodeType": "StructuredDocumentation",
              "src": "15054:231:51",
              "text": " @notice This function allows a wallet or other client to get a human readable string to show\n a user if a transfer was restricted.  It should return enough information for the user\n to know why it failed."
            },
            "functionSelector": "7f4ab1dd",
            "id": 19097,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19076,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "15388:8:51"
            },
            "parameters": {
              "id": 19075,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19074,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15329:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19073,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "15329:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15328:23:51"
            },
            "returnParameters": {
              "id": 19079,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19078,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15414:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19077,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "15414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15413:15:51"
            },
            "scope": 19155,
            "src": "15290:439:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19121,
              "nodeType": "Block",
              "src": "15866:261:51",
              "statements": [
                {
                  "assignments": [
                    19104
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19104,
                      "mutability": "mutable",
                      "name": "withdrawableFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19121,
                      "src": "15876:25:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19103,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "15876:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19108,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19106,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19100,
                        "src": "15924:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19105,
                      "name": "_prepareWithdrawFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18135,
                      "src": "15904:19:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 19107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15904:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "15876:54:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19112,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19100,
                            "src": "15982:5:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 19113,
                            "name": "withdrawableFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19104,
                            "src": "15989:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 19110,
                            "name": "fundsToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18773,
                            "src": "15962:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$38235",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 19111,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transfer",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 38184,
                          "src": "15962:19:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 19114,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15962:45:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e776974686472617746756e64733a205452414e534645525f4641494c4544",
                        "id": 19115,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16021:52:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        },
                        "value": "SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        }
                      ],
                      "id": 19109,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "15941:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19116,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15941:142:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19117,
                  "nodeType": "ExpressionStatement",
                  "src": "15941:142:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19118,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "16094:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19119,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16094:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "id": 19120,
                  "nodeType": "ExpressionStatement",
                  "src": "16094:26:51"
                }
              ]
            },
            "documentation": {
              "id": 19098,
              "nodeType": "StructuredDocumentation",
              "src": "15735:75:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "id": 19122,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawFundsFor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19101,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19100,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19122,
                  "src": "15842:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19099,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15842:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15841:15:51"
            },
            "returnParameters": {
              "id": 19102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "15866:0:51"
            },
            "scope": 19155,
            "src": "15815:312:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19153,
              "nodeType": "Block",
              "src": "16422:210:51",
              "statements": [
                {
                  "assignments": [
                    19129
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19129,
                      "mutability": "mutable",
                      "name": "prevFundsTokenBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19153,
                      "src": "16432:29:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19128,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "16432:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19131,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 19130,
                    "name": "fundsTokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18775,
                    "src": "16464:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16432:49:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19140,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19132,
                      "name": "fundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18775,
                      "src": "16492:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19137,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "16541:4:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            ],
                            "id": 19136,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "16533:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19135,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "16533:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19138,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16533:13:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 19133,
                          "name": "fundsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18773,
                          "src": "16512:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$38235",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 19134,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 38174,
                        "src": "16512:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 19139,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "16512:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "16492:55:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 19141,
                  "nodeType": "ExpressionStatement",
                  "src": "16492:55:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19149,
                            "name": "prevFundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19129,
                            "src": "16602:21:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16595:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19147,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16595:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16595:29:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19144,
                            "name": "fundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18775,
                            "src": "16572:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16565:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19142,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16565:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19145,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16565:25:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "id": 19146,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19647,
                      "src": "16565:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$",
                        "typeString": "function (int256,int256) pure returns (int256)"
                      }
                    },
                    "id": 19151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16565:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "functionReturnParameters": 19127,
                  "id": 19152,
                  "nodeType": "Return",
                  "src": "16558:67:51"
                }
              ]
            },
            "documentation": {
              "id": 19123,
              "nodeType": "StructuredDocumentation",
              "src": "16133:222:51",
              "text": " @dev Updates the current funds token balance\n and returns the difference of new and previous funds token balances\n @return A int256 representing the difference of the new and previous funds token balance"
            },
            "id": 19154,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateFundsTokenBalance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19124,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16393:2:51"
            },
            "returnParameters": {
              "id": 19127,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19126,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19154,
                  "src": "16414:6:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 19125,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16413:8:51"
            },
            "scope": 19155,
            "src": "16360:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 19156,
        "src": "9713:6921:51"
      }
    ],
    "src": "41:16594:51"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.11+commit.5ef660b1.Emscripten.clang"
  },
  "networks": {
    "1994": {
      "events": {
        "0xca6d1e885708b837a7647aeb7f4163ee4ca96058e08ac767be8d23c972c50270": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "addedAddress",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "uint8",
              "name": "whitelist",
              "type": "uint8"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "addedBy",
              "type": "address"
            }
          ],
          "name": "AddressAddedToWhitelist",
          "type": "event"
        },
        "0xb50a30a0fa972f89fbb2b514d12b31f5a5d64f53603402de7939742cd8507f6e": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "removedAddress",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "uint8",
              "name": "whitelist",
              "type": "uint8"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "removedBy",
              "type": "address"
            }
          ],
          "name": "AddressRemovedFromWhitelist",
          "type": "event"
        },
        "0xbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "addedAdmin",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "addedBy",
              "type": "address"
            }
          ],
          "name": "AdminAdded",
          "type": "event"
        },
        "0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "removedAdmin",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "removedBy",
              "type": "address"
            }
          ],
          "name": "AdminRemoved",
          "type": "event"
        },
        "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "owner",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "spender",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "Approval",
          "type": "event"
        },
        "0x26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "by",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "fundsDistributed",
              "type": "uint256"
            }
          ],
          "name": "FundsDistributed",
          "type": "event"
        },
        "0xeaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "by",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "fundsWithdrawn",
              "type": "uint256"
            }
          ],
          "name": "FundsWithdrawn",
          "type": "event"
        },
        "0xb0353d563a9aa5231878c83727dc723a3cb8a38c2917f8ac2b777aa564c8a0d5": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "updatedBy",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "uint8",
              "name": "sourceWhitelist",
              "type": "uint8"
            },
            {
              "indexed": true,
              "internalType": "uint8",
              "name": "destinationWhitelist",
              "type": "uint8"
            },
            {
              "indexed": false,
              "internalType": "bool",
              "name": "from",
              "type": "bool"
            },
            {
              "indexed": false,
              "internalType": "bool",
              "name": "to",
              "type": "bool"
            }
          ],
          "name": "OutboundWhitelistUpdated",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        },
        "0x3c13a557aa89734e312c348465096b4ddc97709822675c45090f4e2a8d6c4f2b": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "owner",
              "type": "address"
            }
          ],
          "name": "RestrictionsDisabled",
          "type": "event"
        },
        "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "Transfer",
          "type": "event"
        }
      },
      "links": {},
      "address": "0xfC2451FF6D8CCda0dFD089Ab7F036898F0D33070",
      "transactionHash": "0xd761cfb8ae8c89d1468269d4a9e4b888a6754effc4251561042a3c4bce7877e5"
    }
  },
  "schemaVersion": "3.2.0",
  "updatedAt": "2020-08-12T09:47:18.123Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "accumulativeFundsOf(address)": {
        "details": "accumulativeFundsOf(_owner) = withdrawableFundsOf(_owner) + withdrawnFundsOf(_owner) = (pointsPerShare * balanceOf(_owner) + pointsCorrection[_owner]) / pointsMultiplier",
        "params": {
          "_owner": "The address of a token holder."
        },
        "returns": {
          "_0": "The amount of funds that `_owner` has earned in total."
        }
      },
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
      },
      "balanceOf(address)": {
        "details": "See {IERC20-balanceOf}."
      },
      "decimals()": {
        "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
      },
      "decreaseAllowance(address,uint256)": {
        "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
      },
      "increaseAllowance(address,uint256)": {
        "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
      },
      "initialize(string,string,address,address,uint256)": {
        "details": "\"constructor\" to be called on deployment"
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "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."
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "See {IERC20-totalSupply}."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "updateFundsReceived()": {
        "details": "Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
      },
      "withdrawableFundsOf(address)": {
        "params": {
          "_owner": "The address of a token holder."
        },
        "returns": {
          "_0": "The amount funds that `_owner` can withdraw."
        }
      },
      "withdrawnFundsOf(address)": {
        "params": {
          "_owner": "The address of a token holder."
        },
        "returns": {
          "_0": "The amount of funds that `_owner` has withdrawn."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "accumulativeFundsOf(address)": {
        "notice": "prev. accumulativeDividendOfView the amount of funds that an address has earned in total."
      },
      "addAdmin(address)": {
        "notice": "Add an admin to the list.  This should only be callable by the owner of the contract."
      },
      "addToWhitelist(address,uint8)": {
        "notice": "Sets an address's white list ID.  Only administrators should be allowed to update this. If an address is on an existing whitelist, it will just get updated to the new value (removed from previous)."
      },
      "burn(address,uint256)": {
        "notice": "Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
      },
      "checkWhitelistAllowed(address,address)": {
        "notice": "Determine if the a sender is allowed to send to the receiver. The source whitelist must be enabled to send to the whitelist where the receive exists."
      },
      "detectTransferRestriction(address,address,uint256)": {
        "notice": "This function detects whether a transfer should be restricted and not allowed. If the function returns SUCCESS_CODE (0) then it should be allowed."
      },
      "disableRestrictions()": {
        "notice": "Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call. This is a permanent change that cannot be undone"
      },
      "initialize(string,string,address,address,uint256)": {
        "notice": "Initialize a new instance storage"
      },
      "isAdministrator(address)": {
        "notice": "Determine if the message sender is in the administrators list."
      },
      "isRestrictionEnabled()": {
        "notice": "View function to determine if restrictions are enabled"
      },
      "messageForTransferRestriction(uint8)": {
        "notice": "This function allows a wallet or other client to get a human readable string to show a user if a transfer was restricted.  It should return enough information for the user to know why it failed."
      },
      "mint(address,uint256)": {
        "notice": "Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
      },
      "pushFunds(address[])": {
        "notice": "Withdraws funds for a set of token holders"
      },
      "removeAdmin(address)": {
        "notice": "Remove an admin from the list.  This should only be callable by the owner of the contract."
      },
      "removeFromWhitelist(address)": {
        "notice": "Clears out an address's white list ID.  Only administrators should be allowed to update this."
      },
      "transfer(address,uint256)": {
        "notice": "Overrides the parent class token transfer function to enforce restrictions."
      },
      "transferFrom(address,address,uint256)": {
        "notice": "Overrides the parent class token transferFrom function to enforce restrictions."
      },
      "updateFundsReceived()": {
        "notice": "Register a payment of funds in tokens. May be called directly after a deposit is made."
      },
      "updateOutboundWhitelistEnabled(uint8,uint8,bool)": {
        "notice": "Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist. Only administrators should be allowed to update this."
      },
      "withdrawFunds()": {
        "notice": "Withdraws all available funds for a token holder"
      },
      "withdrawableFundsOf(address)": {
        "notice": "prev. withdrawableDividendOfView the amount of funds that an address can withdraw."
      },
      "withdrawnFundsOf(address)": {
        "notice": "prev. withdrawnDividendOfView the amount of funds that an address has withdrawn."
      }
    },
    "version": 1
  }
}