prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Requests access to GitHub private repos?
  Hi. I'm a brand-new user. I have a question I didn't see in the FAQ or when I searched issues here.
  
  I was going to connect my GitHub account and saw this:
  
  > Liberapay by liberapay
  > wants to access your greghendershott account
  > 
  > Organizations and teams
  > Read-only access
  >
  > This application will be able to read your organization and team membership and private Projects.
  
  I almost clicked OK, but noticed "**private** Projects". I stopped. I don't want to do that.
  
  Is this as-intended?
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `liberapay/elsewhere/github.py`
  Content:
  ```
  1 from liberapay.elsewhere._base import PlatformOAuth2
  2 from liberapay.elsewhere._exceptions import CantReadMembership
  3 from liberapay.elsewhere._extractors import key, drop_keys
  4 from liberapay.elsewhere._paginators import header_links_paginator
  5 
  6 
  7 class GitHub(PlatformOAuth2):
  8 
  9     # Platform attributes
  10     name = 'github'
  11     display_name = 'GitHub'
  12     fontawesome_name = name
  13     account_url = 'https://github.com/{user_name}'
  14     repo_url = 'https://github.com/{slug}'
  15     has_teams = True
  16 
  17     # Auth attributes
  18     auth_url = 'https://github.com/login/oauth/authorize'
  19     access_token_url = 'https://github.com/login/oauth/access_token'
  20     oauth_email_scope = 'user:email'
  21     oauth_default_scope = ['read:org']
  22 
  23     # API attributes
  24     api_format = 'json'
  25     api_paginator = header_links_paginator()
  26     api_url = 'https://api.github.com'
  27     api_app_auth_params = 'client_id={api_key}&client_secret={api_secret}'
  28     api_user_info_path = '/user/{user_id}'
  29     api_user_name_info_path = '/users/{user_name}'
  30     api_user_self_info_path = '/user'
  31     api_team_members_path = '/orgs/{user_name}/public_members'
  32     api_friends_path = '/users/{user_name}/following'
  33     api_repos_path = '/users/{user_name}/repos?type=owner&sort=updated&per_page=100'
  34     api_starred_path = '/users/{user_name}/starred'
  35     ratelimit_headers_prefix = 'x-ratelimit-'
  36 
  37     # User info extractors
  38     x_user_id = key('id')
  39     x_user_name = key('login')
  40     x_display_name = key('name')
  41     x_email = key('email')
  42     x_gravatar_id = key('gravatar_id')
  43     x_avatar_url = key('avatar_url')
  44     x_is_team = key('type', clean=lambda t: t.lower() == 'organization')
  45     x_description = key('bio')
  46     x_extra_info_drop = drop_keys(lambda k: k.endswith('_url'))
  47 
  48     # Repo info extractors
  49     x_repo_id = key('id')
  50     x_repo_name = key('name')
  51     x_repo_slug = key('full_name')
  52     x_repo_description = key('description')
  53     x_repo_last_update = key('pushed_at')
  54     x_repo_is_fork = key('fork')
  55     x_repo_stars_count = key('stargazers_count')
  56     x_repo_owner_id = key('owner', clean=lambda d: d['id'])
  57     x_repo_extra_info_drop = drop_keys(lambda k: k.endswith('_url'))
  58 
  59     def get_CantReadMembership_url(self, **kw):
  60         return 'https://github.com/settings/connections/applications/'+self.api_key
  61 
  62     def is_team_member(self, org_name, sess, account):
  63         org_name = org_name.lower()
  64 
  65         # Check public membership first
  66         response = self.api_get(
  67             '', '/orgs/'+org_name+'/public_members/'+account.user_name,
  68             sess=sess, error_handler=None
  69         )
  70         if response.status_code == 204:
  71             return True
  72         elif response.status_code != 404:
  73             self.api_error_handler(response, True, self.domain)
  74 
  75         # Check private membership
  76         response = self.api_get(
  77             '', '/user/memberships/orgs/'+org_name, sess=sess, error_handler=None
  78         )
  79         if response.status_code == 403:
  80             raise CantReadMembership
  81         elif response.status_code >= 400:
  82             self.api_error_handler(response, True, self.domain)
  83         membership = self.api_parser(response)
  84         if membership['state'] == 'active':
  85             return True
  86 
  87         # Try the endpoint we were using before
  88         user_orgs = self.api_parser(self.api_get('', '/user/orgs', sess=sess))
  89         return any(org.get('login') == org_name for org in user_orgs)
  90
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/liberapay/elsewhere/github.py b/liberapay/elsewhere/github.py
  --- a/liberapay/elsewhere/github.py
  +++ b/liberapay/elsewhere/github.py
  @@ -18,7 +18,6 @@
       auth_url = 'https://github.com/login/oauth/authorize'
       access_token_url = 'https://github.com/login/oauth/access_token'
       oauth_email_scope = 'user:email'
  -    oauth_default_scope = ['read:org']
   
       # API attributes
       api_format = 'json'
  
verification_info: {"golden_diff": "diff --git a/liberapay/elsewhere/github.py b/liberapay/elsewhere/github.py\n--- a/liberapay/elsewhere/github.py\n+++ b/liberapay/elsewhere/github.py\n@@ -18,7 +18,6 @@\n     auth_url = 'https://github.com/login/oauth/authorize'\n     access_token_url = 'https://github.com/login/oauth/access_token'\n     oauth_email_scope = 'user:email'\n-    oauth_default_scope = ['read:org']\n \n     # API attributes\n     api_format = 'json'\n", "issue": "Requests access to GitHub private repos?\nHi. I'm a brand-new user. I have a question I didn't see in the FAQ or when I searched issues here.\r\n\r\nI was going to connect my GitHub account and saw this:\r\n\r\n> Liberapay by liberapay\r\n> wants to access your greghendershott account\r\n> \r\n> Organizations and teams\r\n> Read-only access\r\n>\r\n> This application will be able to read your organization and team membership and private Projects.\r\n\r\nI almost clicked OK, but noticed \"**private** Projects\". I stopped. I don't want to do that.\r\n\r\nIs this as-intended?\n", "before_files": [{"content": "from liberapay.elsewhere._base import PlatformOAuth2\nfrom liberapay.elsewhere._exceptions import CantReadMembership\nfrom liberapay.elsewhere._extractors import key, drop_keys\nfrom liberapay.elsewhere._paginators import header_links_paginator\n\n\nclass GitHub(PlatformOAuth2):\n\n    # Platform attributes\n    name = 'github'\n    display_name = 'GitHub'\n    fontawesome_name = name\n    account_url = 'https://github.com/{user_name}'\n    repo_url = 'https://github.com/{slug}'\n    has_teams = True\n\n    # Auth attributes\n    auth_url = 'https://github.com/login/oauth/authorize'\n    access_token_url = 'https://github.com/login/oauth/access_token'\n    oauth_email_scope = 'user:email'\n    oauth_default_scope = ['read:org']\n\n    # API attributes\n    api_format = 'json'\n    api_paginator = header_links_paginator()\n    api_url = 'https://api.github.com'\n    api_app_auth_params = 'client_id={api_key}&client_secret={api_secret}'\n    api_user_info_path = '/user/{user_id}'\n    api_user_name_info_path = '/users/{user_name}'\n    api_user_self_info_path = '/user'\n    api_team_members_path = '/orgs/{user_name}/public_members'\n    api_friends_path = '/users/{user_name}/following'\n    api_repos_path = '/users/{user_name}/repos?type=owner&sort=updated&per_page=100'\n    api_starred_path = '/users/{user_name}/starred'\n    ratelimit_headers_prefix = 'x-ratelimit-'\n\n    # User info extractors\n    x_user_id = key('id')\n    x_user_name = key('login')\n    x_display_name = key('name')\n    x_email = key('email')\n    x_gravatar_id = key('gravatar_id')\n    x_avatar_url = key('avatar_url')\n    x_is_team = key('type', clean=lambda t: t.lower() == 'organization')\n    x_description = key('bio')\n    x_extra_info_drop = drop_keys(lambda k: k.endswith('_url'))\n\n    # Repo info extractors\n    x_repo_id = key('id')\n    x_repo_name = key('name')\n    x_repo_slug = key('full_name')\n    x_repo_description = key('description')\n    x_repo_last_update = key('pushed_at')\n    x_repo_is_fork = key('fork')\n    x_repo_stars_count = key('stargazers_count')\n    x_repo_owner_id = key('owner', clean=lambda d: d['id'])\n    x_repo_extra_info_drop = drop_keys(lambda k: k.endswith('_url'))\n\n    def get_CantReadMembership_url(self, **kw):\n        return 'https://github.com/settings/connections/applications/'+self.api_key\n\n    def is_team_member(self, org_name, sess, account):\n        org_name = org_name.lower()\n\n        # Check public membership first\n        response = self.api_get(\n            '', '/orgs/'+org_name+'/public_members/'+account.user_name,\n            sess=sess, error_handler=None\n        )\n        if response.status_code == 204:\n            return True\n        elif response.status_code != 404:\n            self.api_error_handler(response, True, self.domain)\n\n        # Check private membership\n        response = self.api_get(\n            '', '/user/memberships/orgs/'+org_name, sess=sess, error_handler=None\n        )\n        if response.status_code == 403:\n            raise CantReadMembership\n        elif response.status_code >= 400:\n            self.api_error_handler(response, True, self.domain)\n        membership = self.api_parser(response)\n        if membership['state'] == 'active':\n            return True\n\n        # Try the endpoint we were using before\n        user_orgs = self.api_parser(self.api_get('', '/user/orgs', sess=sess))\n        return any(org.get('login') == org_name for org in user_orgs)\n", "path": "liberapay/elsewhere/github.py"}], "after_files": [{"content": "from liberapay.elsewhere._base import PlatformOAuth2\nfrom liberapay.elsewhere._exceptions import CantReadMembership\nfrom liberapay.elsewhere._extractors import key, drop_keys\nfrom liberapay.elsewhere._paginators import header_links_paginator\n\n\nclass GitHub(PlatformOAuth2):\n\n    # Platform attributes\n    name = 'github'\n    display_name = 'GitHub'\n    fontawesome_name = name\n    account_url = 'https://github.com/{user_name}'\n    repo_url = 'https://github.com/{slug}'\n    has_teams = True\n\n    # Auth attributes\n    auth_url = 'https://github.com/login/oauth/authorize'\n    access_token_url = 'https://github.com/login/oauth/access_token'\n    oauth_email_scope = 'user:email'\n\n    # API attributes\n    api_format = 'json'\n    api_paginator = header_links_paginator()\n    api_url = 'https://api.github.com'\n    api_app_auth_params = 'client_id={api_key}&client_secret={api_secret}'\n    api_user_info_path = '/user/{user_id}'\n    api_user_name_info_path = '/users/{user_name}'\n    api_user_self_info_path = '/user'\n    api_team_members_path = '/orgs/{user_name}/public_members'\n    api_friends_path = '/users/{user_name}/following'\n    api_repos_path = '/users/{user_name}/repos?type=owner&sort=updated&per_page=100'\n    api_starred_path = '/users/{user_name}/starred'\n    ratelimit_headers_prefix = 'x-ratelimit-'\n\n    # User info extractors\n    x_user_id = key('id')\n    x_user_name = key('login')\n    x_display_name = key('name')\n    x_email = key('email')\n    x_gravatar_id = key('gravatar_id')\n    x_avatar_url = key('avatar_url')\n    x_is_team = key('type', clean=lambda t: t.lower() == 'organization')\n    x_description = key('bio')\n    x_extra_info_drop = drop_keys(lambda k: k.endswith('_url'))\n\n    # Repo info extractors\n    x_repo_id = key('id')\n    x_repo_name = key('name')\n    x_repo_slug = key('full_name')\n    x_repo_description = key('description')\n    x_repo_last_update = key('pushed_at')\n    x_repo_is_fork = key('fork')\n    x_repo_stars_count = key('stargazers_count')\n    x_repo_owner_id = key('owner', clean=lambda d: d['id'])\n    x_repo_extra_info_drop = drop_keys(lambda k: k.endswith('_url'))\n\n    def get_CantReadMembership_url(self, **kw):\n        return 'https://github.com/settings/connections/applications/'+self.api_key\n\n    def is_team_member(self, org_name, sess, account):\n        org_name = org_name.lower()\n\n        # Check public membership first\n        response = self.api_get(\n            '', '/orgs/'+org_name+'/public_members/'+account.user_name,\n            sess=sess, error_handler=None\n        )\n        if response.status_code == 204:\n            return True\n        elif response.status_code != 404:\n            self.api_error_handler(response, True, self.domain)\n\n        # Check private membership\n        response = self.api_get(\n            '', '/user/memberships/orgs/'+org_name, sess=sess, error_handler=None\n        )\n        if response.status_code == 403:\n            raise CantReadMembership\n        elif response.status_code >= 400:\n            self.api_error_handler(response, True, self.domain)\n        membership = self.api_parser(response)\n        if membership['state'] == 'active':\n            return True\n\n        # Try the endpoint we were using before\n        user_orgs = self.api_parser(self.api_get('', '/user/orgs', sess=sess))\n        return any(org.get('login') == org_name for org in user_orgs)\n", "path": "liberapay/elsewhere/github.py"}]}