{
  "fileName": "AccessControl.sol",
  "contractName": "AccessControlUpgradeSafe",
  "source": "pragma solidity ^0.6.0;\n\nimport \"../utils/EnumerableSet.sol\";\nimport \"../utils/Address.sol\";\nimport \"../GSN/Context.sol\";\nimport \"../Initializable.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n *     require(hasRole(MY_ROLE, _msgSender()));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n */\nabstract contract AccessControlUpgradeSafe is Initializable, ContextUpgradeSafe {\n    function __AccessControl_init() internal initializer {\n        __Context_init_unchained();\n        __AccessControl_init_unchained();\n    }\n\n    function __AccessControl_init_unchained() internal initializer {\n\n\n    }\n\n    using EnumerableSet for EnumerableSet.AddressSet;\n    using Address for address;\n\n    struct RoleData {\n        EnumerableSet.AddressSet members;\n        bytes32 adminRole;\n    }\n\n    mapping (bytes32 => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view returns (bool) {\n        return _roles[role].members.contains(account);\n    }\n\n    /**\n     * @dev Returns the number of accounts that have `role`. Can be used\n     * together with {getRoleMember} to enumerate all bearers of a role.\n     */\n    function getRoleMemberCount(bytes32 role) public view returns (uint256) {\n        return _roles[role].members.length();\n    }\n\n    /**\n     * @dev Returns one of the accounts that have `role`. `index` must be a\n     * value between 0 and {getRoleMemberCount}, non-inclusive.\n     *\n     * Role bearers are not sorted in any particular way, and their ordering may\n     * change at any point.\n     *\n     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n     * you perform all queries on the same block. See the following\n     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\n     * for more information.\n     */\n    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {\n        return _roles[role].members.at(index);\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) public virtual {\n        require(hasRole(_roles[role].adminRole, _msgSender()), \"AccessControl: sender must be an admin to grant\");\n\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) public virtual {\n        require(hasRole(_roles[role].adminRole, _msgSender()), \"AccessControl: sender must be an admin to revoke\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     */\n    function renounceRole(bytes32 role, address account) public virtual {\n        require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event. Note that unlike {grantRole}, this function doesn't perform any\n     * checks on the calling account.\n     *\n     * [WARNING]\n     * ====\n     * This function should only be called from the constructor when setting\n     * up the initial roles for the system.\n     *\n     * Using this function in any other way is effectively circumventing the admin\n     * system imposed by {AccessControl}.\n     * ====\n     */\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        _roles[role].adminRole = adminRole;\n    }\n\n    function _grantRole(bytes32 role, address account) private {\n        if (_roles[role].members.add(account)) {\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    function _revokeRole(bytes32 role, address account) private {\n        if (_roles[role].members.remove(account)) {\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n\n    uint256[49] private __gap;\n}\n",
  "sourcePath": "contracts/access/AccessControl.sol",
  "sourceMap": "",
  "deployedSourceMap": "",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "getRoleMember",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleMemberCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/access/AccessControl.sol",
    "exportedSymbols": {
      "AccessControlUpgradeSafe": [
        1697
      ]
    },
    "id": 1698,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1409,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:7"
      },
      {
        "absolutePath": "contracts/utils/EnumerableSet.sol",
        "file": "../utils/EnumerableSet.sol",
        "id": 1410,
        "nodeType": "ImportDirective",
        "scope": 1698,
        "sourceUnit": 15033,
        "src": "25:36:7",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/utils/Address.sol",
        "file": "../utils/Address.sol",
        "id": 1411,
        "nodeType": "ImportDirective",
        "scope": 1698,
        "sourceUnit": 13938,
        "src": "62:30:7",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/GSN/Context.sol",
        "file": "../GSN/Context.sol",
        "id": 1412,
        "nodeType": "ImportDirective",
        "scope": 1698,
        "sourceUnit": 45,
        "src": "93:28:7",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/Initializable.sol",
        "file": "../Initializable.sol",
        "id": 1413,
        "nodeType": "ImportDirective",
        "scope": 1698,
        "sourceUnit": 1408,
        "src": "122:30:7",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 1415,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "1281:13:7",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 1416,
            "nodeType": "InheritanceSpecifier",
            "src": "1281:13:7"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 1417,
              "name": "ContextUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 44,
              "src": "1296:18:7",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ContextUpgradeSafe_$44",
                "typeString": "contract ContextUpgradeSafe"
              }
            },
            "id": 1418,
            "nodeType": "InheritanceSpecifier",
            "src": "1296:18:7"
          }
        ],
        "contractDependencies": [
          44,
          1407
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 1414,
          "nodeType": "StructuredDocumentation",
          "src": "154:1080:7",
          "text": "@dev Contract module that allows children to implement role-based access\ncontrol mechanisms.\n * Roles are referred to by their `bytes32` identifier. These should be exposed\nin the external API and be unique. The best way to achieve this is by\nusing `public constant` hash digests:\n * ```\nbytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n```\n * Roles can be used to represent a set of permissions. To restrict access to a\nfunction call, use {hasRole}:\n * ```\nfunction foo() public {\n    require(hasRole(MY_ROLE, _msgSender()));\n    ...\n}\n```\n * Roles can be granted and revoked dynamically via the {grantRole} and\n{revokeRole} functions. Each role has an associated admin role, and only\naccounts that have a role's admin role can call {grantRole} and {revokeRole}.\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\nthat only accounts with this role will be able to grant or revoke other\nroles. More complex role relationships can be created by using\n{_setRoleAdmin}."
        },
        "fullyImplemented": true,
        "id": 1697,
        "linearizedBaseContracts": [
          1697,
          44,
          1407
        ],
        "name": "AccessControlUpgradeSafe",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 1429,
              "nodeType": "Block",
              "src": "1374:85:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 1423,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "1384:24:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 1424,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1384:26:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1425,
                  "nodeType": "ExpressionStatement",
                  "src": "1384:26:7"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 1426,
                      "name": "__AccessControl_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1436,
                      "src": "1420:30:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 1427,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1420:32:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1428,
                  "nodeType": "ExpressionStatement",
                  "src": "1420:32:7"
                }
              ]
            },
            "documentation": null,
            "id": 1430,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1421,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1420,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "1362:11:7",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1362:11:7"
              }
            ],
            "name": "__AccessControl_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1419,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1350:2:7"
            },
            "returnParameters": {
              "id": 1422,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1374:0:7"
            },
            "scope": 1697,
            "src": "1321:138:7",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 1435,
              "nodeType": "Block",
              "src": "1528:9:7",
              "statements": []
            },
            "documentation": null,
            "id": 1436,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 1433,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 1432,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "1516:11:7",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1516:11:7"
              }
            ],
            "name": "__AccessControl_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1431,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1504:2:7"
            },
            "returnParameters": {
              "id": 1434,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1528:0:7"
            },
            "scope": 1697,
            "src": "1465:72:7",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 1439,
            "libraryName": {
              "contractScope": null,
              "id": 1437,
              "name": "EnumerableSet",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 15032,
              "src": "1549:13:7",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_EnumerableSet_$15032",
                "typeString": "library EnumerableSet"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "1543:49:7",
            "typeName": {
              "contractScope": null,
              "id": 1438,
              "name": "EnumerableSet.AddressSet",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 14828,
              "src": "1567:24:7",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_AddressSet_$14828_storage_ptr",
                "typeString": "struct EnumerableSet.AddressSet"
              }
            }
          },
          {
            "id": 1442,
            "libraryName": {
              "contractScope": null,
              "id": 1440,
              "name": "Address",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 13937,
              "src": "1603:7:7",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Address_$13937",
                "typeString": "library Address"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "1597:26:7",
            "typeName": {
              "id": 1441,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1615:7:7",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "canonicalName": "AccessControlUpgradeSafe.RoleData",
            "id": 1447,
            "members": [
              {
                "constant": false,
                "id": 1444,
                "mutability": "mutable",
                "name": "members",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 1447,
                "src": "1655:32:7",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_AddressSet_$14828_storage_ptr",
                  "typeString": "struct EnumerableSet.AddressSet"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 1443,
                  "name": "EnumerableSet.AddressSet",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 14828,
                  "src": "1655:24:7",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_AddressSet_$14828_storage_ptr",
                    "typeString": "struct EnumerableSet.AddressSet"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 1446,
                "mutability": "mutable",
                "name": "adminRole",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 1447,
                "src": "1697:17:7",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                },
                "typeName": {
                  "id": 1445,
                  "name": "bytes32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1697:7:7",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "RoleData",
            "nodeType": "StructDefinition",
            "scope": 1697,
            "src": "1629:92:7",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 1451,
            "mutability": "mutable",
            "name": "_roles",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 1697,
            "src": "1727:44:7",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
              "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData)"
            },
            "typeName": {
              "id": 1450,
              "keyType": {
                "id": 1448,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "1736:7:7",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              },
              "nodeType": "Mapping",
              "src": "1727:29:7",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData)"
              },
              "valueType": {
                "contractScope": null,
                "id": 1449,
                "name": "RoleData",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 1447,
                "src": "1747:8:7",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_RoleData_$1447_storage_ptr",
                  "typeString": "struct AccessControlUpgradeSafe.RoleData"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": true,
            "functionSelector": "a217fddf",
            "id": 1454,
            "mutability": "constant",
            "name": "DEFAULT_ADMIN_ROLE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 1697,
            "src": "1778:49:7",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 1452,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "1778:7:7",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30783030",
              "id": 1453,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1823:4:7",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0x00"
            },
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 1455,
              "nodeType": "StructuredDocumentation",
              "src": "1834:198:7",
              "text": "@dev Emitted when `account` is granted `role`.\n     * `sender` is the account that originated the contract call, an admin role\nbearer except when using {_setupRole}."
            },
            "id": 1463,
            "name": "RoleGranted",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1462,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1457,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1463,
                  "src": "2055:20:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1456,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2055:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1459,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1463,
                  "src": "2077:23:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1458,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2077:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1461,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1463,
                  "src": "2102:22:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1460,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2102:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2054:71:7"
            },
            "src": "2037:89:7"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 1464,
              "nodeType": "StructuredDocumentation",
              "src": "2132:275:7",
              "text": "@dev Emitted when `account` is revoked `role`.\n     * `sender` is the account that originated the contract call:\n  - if using `revokeRole`, it is the admin role bearer\n  - if using `renounceRole`, it is the role bearer (i.e. `account`)"
            },
            "id": 1472,
            "name": "RoleRevoked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 1471,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1466,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1472,
                  "src": "2430:20:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1465,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2430:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1468,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1472,
                  "src": "2452:23:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1467,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2452:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1470,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1472,
                  "src": "2477:22:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1469,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2477:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2429:71:7"
            },
            "src": "2412:89:7"
          },
          {
            "body": {
              "id": 1490,
              "nodeType": "Block",
              "src": "2663:62:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1487,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1477,
                        "src": "2710:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1482,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1451,
                            "src": "2680:6:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                            }
                          },
                          "id": 1484,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1483,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1475,
                            "src": "2687:4:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2680:12:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                            "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                          }
                        },
                        "id": 1485,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1444,
                        "src": "2680:20:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$14828_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 1486,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "contains",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14897,
                      "src": "2680:29:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_AddressSet_$14828_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_AddressSet_$14828_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 1488,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2680:38:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 1481,
                  "id": 1489,
                  "nodeType": "Return",
                  "src": "2673:45:7"
                }
              ]
            },
            "documentation": {
              "id": 1473,
              "nodeType": "StructuredDocumentation",
              "src": "2507:76:7",
              "text": "@dev Returns `true` if `account` has been granted `role`."
            },
            "functionSelector": "91d14854",
            "id": 1491,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1478,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1475,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1491,
                  "src": "2605:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1474,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2605:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1477,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1491,
                  "src": "2619:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1476,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2619:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2604:31:7"
            },
            "returnParameters": {
              "id": 1481,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1480,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1491,
                  "src": "2657:4:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 1479,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2657:4:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2656:6:7"
            },
            "scope": 1697,
            "src": "2588:137:7",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1506,
              "nodeType": "Block",
              "src": "2965:53:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1499,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1451,
                            "src": "2982:6:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                            }
                          },
                          "id": 1501,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1500,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1494,
                            "src": "2989:4:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2982:12:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                            "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                          }
                        },
                        "id": 1502,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1444,
                        "src": "2982:20:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$14828_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 1503,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14911,
                      "src": "2982:27:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_AddressSet_$14828_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_AddressSet_$14828_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 1504,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2982:29:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 1498,
                  "id": 1505,
                  "nodeType": "Return",
                  "src": "2975:36:7"
                }
              ]
            },
            "documentation": {
              "id": 1492,
              "nodeType": "StructuredDocumentation",
              "src": "2731:157:7",
              "text": "@dev Returns the number of accounts that have `role`. Can be used\ntogether with {getRoleMember} to enumerate all bearers of a role."
            },
            "functionSelector": "ca15c873",
            "id": 1507,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleMemberCount",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1495,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1494,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1507,
                  "src": "2921:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1493,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2921:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2920:14:7"
            },
            "returnParameters": {
              "id": 1498,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1497,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1507,
                  "src": "2956:7:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1496,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2956:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2955:9:7"
            },
            "scope": 1697,
            "src": "2893:125:7",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1525,
              "nodeType": "Block",
              "src": "3685:54:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1522,
                        "name": "index",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1512,
                        "src": "3726:5:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1517,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1451,
                            "src": "3702:6:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                            }
                          },
                          "id": 1519,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1518,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1510,
                            "src": "3709:4:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3702:12:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                            "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                          }
                        },
                        "id": 1520,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1444,
                        "src": "3702:20:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$14828_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 1521,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "at",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14934,
                      "src": "3702:23:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_AddressSet_$14828_storage_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_struct$_AddressSet_$14828_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,uint256) view returns (address)"
                      }
                    },
                    "id": 1523,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3702:30:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 1516,
                  "id": 1524,
                  "nodeType": "Return",
                  "src": "3695:37:7"
                }
              ]
            },
            "documentation": {
              "id": 1508,
              "nodeType": "StructuredDocumentation",
              "src": "3024:574:7",
              "text": "@dev Returns one of the accounts that have `role`. `index` must be a\nvalue between 0 and {getRoleMemberCount}, non-inclusive.\n     * Role bearers are not sorted in any particular way, and their ordering may\nchange at any point.\n     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\nyou perform all queries on the same block. See the following\nhttps://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\nfor more information."
            },
            "functionSelector": "9010d07c",
            "id": 1526,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleMember",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1513,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1510,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1526,
                  "src": "3626:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1509,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3626:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1512,
                  "mutability": "mutable",
                  "name": "index",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1526,
                  "src": "3640:13:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1511,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3640:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3625:29:7"
            },
            "returnParameters": {
              "id": 1516,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1515,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1526,
                  "src": "3676:7:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1514,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3676:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3675:9:7"
            },
            "scope": 1697,
            "src": "3603:136:7",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1539,
              "nodeType": "Block",
              "src": "3986:46:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 1534,
                        "name": "_roles",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1451,
                        "src": "4003:6:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                          "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                        }
                      },
                      "id": 1536,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 1535,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1529,
                        "src": "4010:4:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "4003:12:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                        "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                      }
                    },
                    "id": 1537,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "adminRole",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 1446,
                    "src": "4003:22:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 1533,
                  "id": 1538,
                  "nodeType": "Return",
                  "src": "3996:29:7"
                }
              ]
            },
            "documentation": {
              "id": 1527,
              "nodeType": "StructuredDocumentation",
              "src": "3745:170:7",
              "text": "@dev Returns the admin role that controls `role`. See {grantRole} and\n{revokeRole}.\n     * To change a role's admin, use {_setRoleAdmin}."
            },
            "functionSelector": "248a9ca3",
            "id": 1540,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1530,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1529,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1540,
                  "src": "3942:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1528,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3942:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3941:14:7"
            },
            "returnParameters": {
              "id": 1533,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1532,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1540,
                  "src": "3977:7:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1531,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3977:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3976:9:7"
            },
            "scope": 1697,
            "src": "3920:112:7",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1565,
              "nodeType": "Block",
              "src": "4347:158:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1550,
                                "name": "_roles",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1451,
                                "src": "4373:6:7",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                                  "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                                }
                              },
                              "id": 1552,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1551,
                                "name": "role",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1543,
                                "src": "4380:4:7",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4373:12:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                                "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                              }
                            },
                            "id": 1553,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "adminRole",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1446,
                            "src": "4373:22:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 1554,
                              "name": "_msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 28,
                              "src": "4397:10:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                "typeString": "function () view returns (address payable)"
                              }
                            },
                            "id": 1555,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4397:12:7",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 1549,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1491,
                          "src": "4365:7:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 1556,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4365:45:7",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74",
                        "id": 1557,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4412:49:7",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to grant\""
                        },
                        "value": "AccessControl: sender must be an admin to grant"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to grant\""
                        }
                      ],
                      "id": 1548,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4357:7:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1558,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4357:105:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1559,
                  "nodeType": "ExpressionStatement",
                  "src": "4357:105:7"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1561,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1543,
                        "src": "4484:4:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1562,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1545,
                        "src": "4490:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1560,
                      "name": "_grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1668,
                      "src": "4473:10:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 1563,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4473:25:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1564,
                  "nodeType": "ExpressionStatement",
                  "src": "4473:25:7"
                }
              ]
            },
            "documentation": {
              "id": 1541,
              "nodeType": "StructuredDocumentation",
              "src": "4038:239:7",
              "text": "@dev Grants `role` to `account`.\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\nevent.\n     * Requirements:\n     * - the caller must have ``role``'s admin role."
            },
            "functionSelector": "2f2ff15d",
            "id": 1566,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "grantRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1546,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1543,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1566,
                  "src": "4301:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1542,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4301:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1545,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1566,
                  "src": "4315:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1544,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4315:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4300:31:7"
            },
            "returnParameters": {
              "id": 1547,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4347:0:7"
            },
            "scope": 1697,
            "src": "4282:223:7",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1591,
              "nodeType": "Block",
              "src": "4805:160:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1576,
                                "name": "_roles",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1451,
                                "src": "4831:6:7",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                                  "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                                }
                              },
                              "id": 1578,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1577,
                                "name": "role",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1569,
                                "src": "4838:4:7",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4831:12:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                                "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                              }
                            },
                            "id": 1579,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "adminRole",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1446,
                            "src": "4831:22:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 1580,
                              "name": "_msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 28,
                              "src": "4855:10:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                "typeString": "function () view returns (address payable)"
                              }
                            },
                            "id": 1581,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4855:12:7",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 1575,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1491,
                          "src": "4823:7:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 1582,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4823:45:7",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65",
                        "id": 1583,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4870:50:7",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to revoke\""
                        },
                        "value": "AccessControl: sender must be an admin to revoke"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to revoke\""
                        }
                      ],
                      "id": 1574,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4815:7:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1584,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4815:106:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1585,
                  "nodeType": "ExpressionStatement",
                  "src": "4815:106:7"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1587,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1569,
                        "src": "4944:4:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1588,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1571,
                        "src": "4950:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1586,
                      "name": "_revokeRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1692,
                      "src": "4932:11:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 1589,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4932:26:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1590,
                  "nodeType": "ExpressionStatement",
                  "src": "4932:26:7"
                }
              ]
            },
            "documentation": {
              "id": 1567,
              "nodeType": "StructuredDocumentation",
              "src": "4511:223:7",
              "text": "@dev Revokes `role` from `account`.\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     * Requirements:\n     * - the caller must have ``role``'s admin role."
            },
            "functionSelector": "d547741f",
            "id": 1592,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "revokeRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1572,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1569,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1592,
                  "src": "4759:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1568,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4759:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1571,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1592,
                  "src": "4773:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1570,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4773:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4758:31:7"
            },
            "returnParameters": {
              "id": 1573,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4805:0:7"
            },
            "scope": 1697,
            "src": "4739:226:7",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1613,
              "nodeType": "Block",
              "src": "5524:137:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 1604,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 1601,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1597,
                          "src": "5542:7:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 1602,
                            "name": "_msgSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28,
                            "src": "5553:10:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                              "typeString": "function () view returns (address payable)"
                            }
                          },
                          "id": 1603,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5553:12:7",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "5542:23:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66",
                        "id": 1605,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5567:49:7",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b",
                          "typeString": "literal_string \"AccessControl: can only renounce roles for self\""
                        },
                        "value": "AccessControl: can only renounce roles for self"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b",
                          "typeString": "literal_string \"AccessControl: can only renounce roles for self\""
                        }
                      ],
                      "id": 1600,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5534:7:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 1606,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5534:83:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1607,
                  "nodeType": "ExpressionStatement",
                  "src": "5534:83:7"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1609,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1595,
                        "src": "5640:4:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1610,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1597,
                        "src": "5646:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1608,
                      "name": "_revokeRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1692,
                      "src": "5628:11:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 1611,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5628:26:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1612,
                  "nodeType": "ExpressionStatement",
                  "src": "5628:26:7"
                }
              ]
            },
            "documentation": {
              "id": 1593,
              "nodeType": "StructuredDocumentation",
              "src": "4971:480:7",
              "text": "@dev Revokes `role` from the calling account.\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\npurpose is to provide a mechanism for accounts to lose their privileges\nif they are compromised (such as when a trusted device is misplaced).\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\nevent.\n     * Requirements:\n     * - the caller must be `account`."
            },
            "functionSelector": "36568abe",
            "id": 1614,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1598,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1595,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1614,
                  "src": "5478:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1594,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5478:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1597,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1614,
                  "src": "5492:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1596,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5492:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5477:31:7"
            },
            "returnParameters": {
              "id": 1599,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5524:0:7"
            },
            "scope": 1697,
            "src": "5456:205:7",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 1627,
              "nodeType": "Block",
              "src": "6294:42:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1623,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1617,
                        "src": "6315:4:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 1624,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1619,
                        "src": "6321:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 1622,
                      "name": "_grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1668,
                      "src": "6304:10:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 1625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6304:25:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 1626,
                  "nodeType": "ExpressionStatement",
                  "src": "6304:25:7"
                }
              ]
            },
            "documentation": {
              "id": 1615,
              "nodeType": "StructuredDocumentation",
              "src": "5667:554:7",
              "text": "@dev Grants `role` to `account`.\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\nevent. Note that unlike {grantRole}, this function doesn't perform any\nchecks on the calling account.\n     * [WARNING]\n====\nThis function should only be called from the constructor when setting\nup the initial roles for the system.\n     * Using this function in any other way is effectively circumventing the admin\nsystem imposed by {AccessControl}.\n===="
            },
            "id": 1628,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setupRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1620,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1617,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1628,
                  "src": "6246:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1616,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6246:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1619,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1628,
                  "src": "6260:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1618,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6260:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6245:31:7"
            },
            "returnParameters": {
              "id": 1621,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6294:0:7"
            },
            "scope": 1697,
            "src": "6226:110:7",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 1643,
              "nodeType": "Block",
              "src": "6486:51:7",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 1641,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 1636,
                          "name": "_roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1451,
                          "src": "6496:6:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                            "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                          }
                        },
                        "id": 1638,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 1637,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1631,
                          "src": "6503:4:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6496:12:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                          "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                        }
                      },
                      "id": 1639,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "adminRole",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1446,
                      "src": "6496:22:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 1640,
                      "name": "adminRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1633,
                      "src": "6521:9:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "6496:34:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 1642,
                  "nodeType": "ExpressionStatement",
                  "src": "6496:34:7"
                }
              ]
            },
            "documentation": {
              "id": 1629,
              "nodeType": "StructuredDocumentation",
              "src": "6342:66:7",
              "text": "@dev Sets `adminRole` as ``role``'s admin role."
            },
            "id": 1644,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setRoleAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1634,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1631,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1644,
                  "src": "6436:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1630,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6436:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1633,
                  "mutability": "mutable",
                  "name": "adminRole",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1644,
                  "src": "6450:17:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1632,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6450:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6435:33:7"
            },
            "returnParameters": {
              "id": 1635,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6486:0:7"
            },
            "scope": 1697,
            "src": "6413:124:7",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 1667,
              "nodeType": "Block",
              "src": "6602:125:7",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1656,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1648,
                        "src": "6641:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1651,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1451,
                            "src": "6616:6:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                            }
                          },
                          "id": 1653,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1652,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1646,
                            "src": "6623:4:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "6616:12:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                            "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                          }
                        },
                        "id": 1654,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1444,
                        "src": "6616:20:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$14828_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 1655,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14851,
                      "src": "6616:24:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_AddressSet_$14828_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_AddressSet_$14828_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,address) returns (bool)"
                      }
                    },
                    "id": 1657,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6616:33:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 1666,
                  "nodeType": "IfStatement",
                  "src": "6612:109:7",
                  "trueBody": {
                    "id": 1665,
                    "nodeType": "Block",
                    "src": "6651:70:7",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1659,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1646,
                              "src": "6682:4:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1660,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1648,
                              "src": "6688:7:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1661,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 28,
                                "src": "6697:10:7",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1662,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6697:12:7",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 1658,
                            "name": "RoleGranted",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1463,
                            "src": "6670:11:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (bytes32,address,address)"
                            }
                          },
                          "id": 1663,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6670:40:7",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1664,
                        "nodeType": "EmitStatement",
                        "src": "6665:45:7"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 1668,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_grantRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1649,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1646,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1668,
                  "src": "6563:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1645,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6563:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1648,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1668,
                  "src": "6577:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1647,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6577:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6562:31:7"
            },
            "returnParameters": {
              "id": 1650,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6602:0:7"
            },
            "scope": 1697,
            "src": "6543:184:7",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 1691,
              "nodeType": "Block",
              "src": "6793:128:7",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 1680,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1672,
                        "src": "6835:7:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1675,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1451,
                            "src": "6807:6:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$1447_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControlUpgradeSafe.RoleData storage ref)"
                            }
                          },
                          "id": 1677,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1676,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1670,
                            "src": "6814:4:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "6807:12:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$1447_storage",
                            "typeString": "struct AccessControlUpgradeSafe.RoleData storage ref"
                          }
                        },
                        "id": 1678,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1444,
                        "src": "6807:20:7",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$14828_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 1679,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 14874,
                      "src": "6807:27:7",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_AddressSet_$14828_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_AddressSet_$14828_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,address) returns (bool)"
                      }
                    },
                    "id": 1681,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6807:36:7",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 1690,
                  "nodeType": "IfStatement",
                  "src": "6803:112:7",
                  "trueBody": {
                    "id": 1689,
                    "nodeType": "Block",
                    "src": "6845:70:7",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1683,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1670,
                              "src": "6876:4:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1684,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1672,
                              "src": "6882:7:7",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1685,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 28,
                                "src": "6891:10:7",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1686,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6891:12:7",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 1682,
                            "name": "RoleRevoked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1472,
                            "src": "6864:11:7",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (bytes32,address,address)"
                            }
                          },
                          "id": 1687,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6864:40:7",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1688,
                        "nodeType": "EmitStatement",
                        "src": "6859:45:7"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 1692,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_revokeRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 1673,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1670,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1692,
                  "src": "6754:12:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1669,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6754:7:7",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1672,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1692,
                  "src": "6768:15:7",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1671,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6768:7:7",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6753:31:7"
            },
            "returnParameters": {
              "id": 1674,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6793:0:7"
            },
            "scope": 1697,
            "src": "6733:188:7",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 1696,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 1697,
            "src": "6927:25:7",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 1693,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "6927:7:7",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 1695,
              "length": {
                "argumentTypes": null,
                "hexValue": "3439",
                "id": 1694,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "6935:2:7",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "6927:11:7",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 1698,
        "src": "1235:5720:7"
      }
    ],
    "src": "0:6956:7"
  },
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "compiler": {
    "name": "solc",
    "version": "0.6.7+commit.b8d736ae.Emscripten.clang",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
