We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Adding ABA Routing Number to Bank Provider
* Faker version:8.1.2


Is there any interest in adding ABA routing numbers to the Bank provider? https://en.wikipedia.org/wiki/ABA_routing_transit_number

This would be helpful for my use case and have code to generate but wanted to check before putting more effort in.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `faker/providers/bank/__init__.py`
Content:
```
1 import re
2 import string
3 
4 from string import ascii_uppercase
5 
6 from .. import BaseProvider
7 
8 localized = True
9 default_locale = 'en_GB'
10 
11 
12 class Provider(BaseProvider):
13     """Implement default bank provider for Faker.
14 
15     .. important::
16        Bank codes, account numbers, and other ID's generated by this provider
17        are only valid in form, i.e. they conform to some standard/format, are
18        of the expected lengths, and have valid checksums (where applicable).
19        Results generated that turn out to be valid in real life are purely
20        coincidental.
21 
22     Sources:
23 
24     - https://en.wikipedia.org/wiki/International_Bank_Account_Number
25     - https://www.theswiftcodes.com/swift-code-checker/
26     """
27 
28     ALPHA = {c: str(ord(c) % 55) for c in string.ascii_uppercase}
29     bban_format = '????#############'
30     country_code = 'GB'
31 
32     def bank_country(self):
33         """Generate the bank provider's ISO 3166-1 alpha-2 country code."""
34         return self.country_code
35 
36     def bban(self):
37         """Generate a Basic Bank Account Number (BBAN)."""
38         temp = re.sub(r'\?',
39                       lambda x: self.random_element(ascii_uppercase),
40                       self.bban_format)
41         return self.numerify(temp)
42 
43     def iban(self):
44         """Generate an International Bank Account Number (IBAN)."""
45         bban = self.bban()
46 
47         check = bban + self.country_code + '00'
48         check = int(''.join(self.ALPHA.get(c, c) for c in check))
49         check = 98 - (check % 97)
50         check = str(check).zfill(2)
51 
52         return self.country_code + check + bban
53 
54     def swift8(self, use_dataset=False):
55         """Generate an 8-digit SWIFT code.
56 
57         This method uses |swift| under the hood with the ``length`` argument set
58         to ``8`` and with the ``primary`` argument omitted. All 8-digit SWIFT
59         codes already refer to the primary branch/office.
60 
61         :sample:
62         :sample: use_dataset=True
63         """
64         return self.swift(length=8, use_dataset=use_dataset)
65 
66     def swift11(self, primary=None, use_dataset=False):
67         """Generate an 11-digit SWIFT code.
68 
69         This method uses |swift| under the hood with the ``length`` argument set
70         to ``11``. If ``primary`` is set to ``True``, the SWIFT code will always
71         end with ``'XXX'``. All 11-digit SWIFT codes use this convention to
72         refer to the primary branch/office.
73 
74         :sample:
75         :sample: use_dataset=True
76         """
77         return self.swift(length=11, primary=primary, use_dataset=use_dataset)
78 
79     def swift(self, length=None, primary=None, use_dataset=False):
80         """Generate a SWIFT code.
81 
82         SWIFT codes, reading from left to right, are composed of a 4 alphabet
83         character bank code, a 2 alphabet character country code, a 2
84         alphanumeric location code, and an optional 3 alphanumeric branch code.
85         This means SWIFT codes can only have 8 or 11 characters, so the value of
86         ``length`` can only be ``None`` or the integers ``8`` or ``11``. If the
87         value is ``None``, then a value of ``8`` or ``11`` will randomly be
88         assigned.
89 
90         Because all 8-digit SWIFT codes already refer to the primary branch or
91         office, the ``primary`` argument only has an effect if the value of
92         ``length`` is ``11``. If ``primary`` is ``True`` and ``length`` is
93         ``11``, the 11-digit SWIFT codes generated will always end in ``'XXX'``
94         to denote that they belong to primary branches/offices.
95 
96         For extra authenticity, localized providers may opt to include SWIFT
97         bank codes, location codes, and branch codes used in their respective
98         locales. If ``use_dataset`` is ``True``, this method will generate SWIFT
99         codes based on those locale-specific codes if included. If those codes
100         were not included, then it will behave as if ``use_dataset`` were
101         ``False``, and in that mode, all those codes will just be randomly
102         generated as per the specification.
103 
104         :sample:
105         :sample: length=8
106         :sample: length=8, use_dataset=True
107         :sample: length=11
108         :sample: length=11, primary=True
109         :sample: length=11, use_dataset=True
110         :sample: length=11, primary=True, use_dataset=True
111         """
112         if length is None:
113             length = self.random_element((8, 11))
114         if length not in (8, 11):
115             raise AssertionError('length can only be 8 or 11')
116 
117         if use_dataset and hasattr(self, 'swift_bank_codes'):
118             bank_code = self.random_element(self.swift_bank_codes)
119         else:
120             bank_code = self.lexify('????', letters=string.ascii_uppercase)
121 
122         if use_dataset and hasattr(self, 'swift_location_codes'):
123             location_code = self.random_element(self.swift_location_codes)
124         else:
125             location_code = self.lexify('??', letters=string.ascii_uppercase + string.digits)
126 
127         if length == 8:
128             return bank_code + self.country_code + location_code
129 
130         if primary:
131             branch_code = 'XXX'
132         elif use_dataset and hasattr(self, 'swift_branch_codes'):
133             branch_code = self.random_element(self.swift_branch_codes)
134         else:
135             branch_code = self.lexify('???', letters=string.ascii_uppercase + string.digits)
136 
137         return bank_code + self.country_code + location_code + branch_code
138
```
--- 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()

```

diff --git a/faker/providers/bank/__init__.py b/faker/providers/bank/__init__.py
--- a/faker/providers/bank/__init__.py
+++ b/faker/providers/bank/__init__.py
@@ -1,6 +1,7 @@
 import re
 import string
 
+from math import ceil
 from string import ascii_uppercase
 
 from .. import BaseProvider
@@ -29,6 +30,19 @@
     bban_format = '????#############'
     country_code = 'GB'
 
+    def aba(self):
+        """Generate an ABA routing transit number."""
+        fed_num = self.random_int(min=1, max=12)
+        rand = self.numerify('######')
+        aba = f"{fed_num:02}{rand}"
+
+        # calculate check digit
+        d = [int(n) for n in aba]
+        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]
+        chk_digit = ceil(chk_digit/10)*10 - chk_digit
+
+        return f"{aba}{chk_digit}"
+
     def bank_country(self):
         """Generate the bank provider's ISO 3166-1 alpha-2 country code."""
         return self.country_code

{"golden_diff": "diff --git a/faker/providers/bank/__init__.py b/faker/providers/bank/__init__.py\n--- a/faker/providers/bank/__init__.py\n+++ b/faker/providers/bank/__init__.py\n@@ -1,6 +1,7 @@\n import re\n import string\n \n+from math import ceil\n from string import ascii_uppercase\n \n from .. import BaseProvider\n@@ -29,6 +30,19 @@\n     bban_format = '????#############'\n     country_code = 'GB'\n \n+    def aba(self):\n+        \"\"\"Generate an ABA routing transit number.\"\"\"\n+        fed_num = self.random_int(min=1, max=12)\n+        rand = self.numerify('######')\n+        aba = f\"{fed_num:02}{rand}\"\n+\n+        # calculate check digit\n+        d = [int(n) for n in aba]\n+        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]\n+        chk_digit = ceil(chk_digit/10)*10 - chk_digit\n+\n+        return f\"{aba}{chk_digit}\"\n+\n     def bank_country(self):\n         \"\"\"Generate the bank provider's ISO 3166-1 alpha-2 country code.\"\"\"\n         return self.country_code\n", "issue": "Adding ABA Routing Number to Bank Provider\n* Faker version:8.1.2\r\n\r\n\r\nIs there any interest in adding ABA routing numbers to the Bank provider? https://en.wikipedia.org/wiki/ABA_routing_transit_number\r\n\r\nThis would be helpful for my use case and have code to generate but wanted to check before putting more effort in.\n", "before_files": [{"content": "import re\nimport string\n\nfrom string import ascii_uppercase\n\nfrom .. import BaseProvider\n\nlocalized = True\ndefault_locale = 'en_GB'\n\n\nclass Provider(BaseProvider):\n    \"\"\"Implement default bank provider for Faker.\n\n    .. important::\n       Bank codes, account numbers, and other ID's generated by this provider\n       are only valid in form, i.e. they conform to some standard/format, are\n       of the expected lengths, and have valid checksums (where applicable).\n       Results generated that turn out to be valid in real life are purely\n       coincidental.\n\n    Sources:\n\n    - https://en.wikipedia.org/wiki/International_Bank_Account_Number\n    - https://www.theswiftcodes.com/swift-code-checker/\n    \"\"\"\n\n    ALPHA = {c: str(ord(c) % 55) for c in string.ascii_uppercase}\n    bban_format = '????#############'\n    country_code = 'GB'\n\n    def bank_country(self):\n        \"\"\"Generate the bank provider's ISO 3166-1 alpha-2 country code.\"\"\"\n        return self.country_code\n\n    def bban(self):\n        \"\"\"Generate a Basic Bank Account Number (BBAN).\"\"\"\n        temp = re.sub(r'\\?',\n                      lambda x: self.random_element(ascii_uppercase),\n                      self.bban_format)\n        return self.numerify(temp)\n\n    def iban(self):\n        \"\"\"Generate an International Bank Account Number (IBAN).\"\"\"\n        bban = self.bban()\n\n        check = bban + self.country_code + '00'\n        check = int(''.join(self.ALPHA.get(c, c) for c in check))\n        check = 98 - (check % 97)\n        check = str(check).zfill(2)\n\n        return self.country_code + check + bban\n\n    def swift8(self, use_dataset=False):\n        \"\"\"Generate an 8-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``8`` and with the ``primary`` argument omitted. All 8-digit SWIFT\n        codes already refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=8, use_dataset=use_dataset)\n\n    def swift11(self, primary=None, use_dataset=False):\n        \"\"\"Generate an 11-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``11``. If ``primary`` is set to ``True``, the SWIFT code will always\n        end with ``'XXX'``. All 11-digit SWIFT codes use this convention to\n        refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=11, primary=primary, use_dataset=use_dataset)\n\n    def swift(self, length=None, primary=None, use_dataset=False):\n        \"\"\"Generate a SWIFT code.\n\n        SWIFT codes, reading from left to right, are composed of a 4 alphabet\n        character bank code, a 2 alphabet character country code, a 2\n        alphanumeric location code, and an optional 3 alphanumeric branch code.\n        This means SWIFT codes can only have 8 or 11 characters, so the value of\n        ``length`` can only be ``None`` or the integers ``8`` or ``11``. If the\n        value is ``None``, then a value of ``8`` or ``11`` will randomly be\n        assigned.\n\n        Because all 8-digit SWIFT codes already refer to the primary branch or\n        office, the ``primary`` argument only has an effect if the value of\n        ``length`` is ``11``. If ``primary`` is ``True`` and ``length`` is\n        ``11``, the 11-digit SWIFT codes generated will always end in ``'XXX'``\n        to denote that they belong to primary branches/offices.\n\n        For extra authenticity, localized providers may opt to include SWIFT\n        bank codes, location codes, and branch codes used in their respective\n        locales. If ``use_dataset`` is ``True``, this method will generate SWIFT\n        codes based on those locale-specific codes if included. If those codes\n        were not included, then it will behave as if ``use_dataset`` were\n        ``False``, and in that mode, all those codes will just be randomly\n        generated as per the specification.\n\n        :sample:\n        :sample: length=8\n        :sample: length=8, use_dataset=True\n        :sample: length=11\n        :sample: length=11, primary=True\n        :sample: length=11, use_dataset=True\n        :sample: length=11, primary=True, use_dataset=True\n        \"\"\"\n        if length is None:\n            length = self.random_element((8, 11))\n        if length not in (8, 11):\n            raise AssertionError('length can only be 8 or 11')\n\n        if use_dataset and hasattr(self, 'swift_bank_codes'):\n            bank_code = self.random_element(self.swift_bank_codes)\n        else:\n            bank_code = self.lexify('????', letters=string.ascii_uppercase)\n\n        if use_dataset and hasattr(self, 'swift_location_codes'):\n            location_code = self.random_element(self.swift_location_codes)\n        else:\n            location_code = self.lexify('??', letters=string.ascii_uppercase + string.digits)\n\n        if length == 8:\n            return bank_code + self.country_code + location_code\n\n        if primary:\n            branch_code = 'XXX'\n        elif use_dataset and hasattr(self, 'swift_branch_codes'):\n            branch_code = self.random_element(self.swift_branch_codes)\n        else:\n            branch_code = self.lexify('???', letters=string.ascii_uppercase + string.digits)\n\n        return bank_code + self.country_code + location_code + branch_code\n", "path": "faker/providers/bank/__init__.py"}], "after_files": [{"content": "import re\nimport string\n\nfrom math import ceil\nfrom string import ascii_uppercase\n\nfrom .. import BaseProvider\n\nlocalized = True\ndefault_locale = 'en_GB'\n\n\nclass Provider(BaseProvider):\n    \"\"\"Implement default bank provider for Faker.\n\n    .. important::\n       Bank codes, account numbers, and other ID's generated by this provider\n       are only valid in form, i.e. they conform to some standard/format, are\n       of the expected lengths, and have valid checksums (where applicable).\n       Results generated that turn out to be valid in real life are purely\n       coincidental.\n\n    Sources:\n\n    - https://en.wikipedia.org/wiki/International_Bank_Account_Number\n    - https://www.theswiftcodes.com/swift-code-checker/\n    \"\"\"\n\n    ALPHA = {c: str(ord(c) % 55) for c in string.ascii_uppercase}\n    bban_format = '????#############'\n    country_code = 'GB'\n\n    def aba(self):\n        \"\"\"Generate an ABA routing transit number.\"\"\"\n        fed_num = self.random_int(min=1, max=12)\n        rand = self.numerify('######')\n        aba = f\"{fed_num:02}{rand}\"\n\n        # calculate check digit\n        d = [int(n) for n in aba]\n        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]\n        chk_digit = ceil(chk_digit/10)*10 - chk_digit\n\n        return f\"{aba}{chk_digit}\"\n\n    def bank_country(self):\n        \"\"\"Generate the bank provider's ISO 3166-1 alpha-2 country code.\"\"\"\n        return self.country_code\n\n    def bban(self):\n        \"\"\"Generate a Basic Bank Account Number (BBAN).\"\"\"\n        temp = re.sub(r'\\?',\n                      lambda x: self.random_element(ascii_uppercase),\n                      self.bban_format)\n        return self.numerify(temp)\n\n    def iban(self):\n        \"\"\"Generate an International Bank Account Number (IBAN).\"\"\"\n        bban = self.bban()\n\n        check = bban + self.country_code + '00'\n        check = int(''.join(self.ALPHA.get(c, c) for c in check))\n        check = 98 - (check % 97)\n        check = str(check).zfill(2)\n\n        return self.country_code + check + bban\n\n    def swift8(self, use_dataset=False):\n        \"\"\"Generate an 8-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``8`` and with the ``primary`` argument omitted. All 8-digit SWIFT\n        codes already refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=8, use_dataset=use_dataset)\n\n    def swift11(self, primary=None, use_dataset=False):\n        \"\"\"Generate an 11-digit SWIFT code.\n\n        This method uses |swift| under the hood with the ``length`` argument set\n        to ``11``. If ``primary`` is set to ``True``, the SWIFT code will always\n        end with ``'XXX'``. All 11-digit SWIFT codes use this convention to\n        refer to the primary branch/office.\n\n        :sample:\n        :sample: use_dataset=True\n        \"\"\"\n        return self.swift(length=11, primary=primary, use_dataset=use_dataset)\n\n    def swift(self, length=None, primary=None, use_dataset=False):\n        \"\"\"Generate a SWIFT code.\n\n        SWIFT codes, reading from left to right, are composed of a 4 alphabet\n        character bank code, a 2 alphabet character country code, a 2\n        alphanumeric location code, and an optional 3 alphanumeric branch code.\n        This means SWIFT codes can only have 8 or 11 characters, so the value of\n        ``length`` can only be ``None`` or the integers ``8`` or ``11``. If the\n        value is ``None``, then a value of ``8`` or ``11`` will randomly be\n        assigned.\n\n        Because all 8-digit SWIFT codes already refer to the primary branch or\n        office, the ``primary`` argument only has an effect if the value of\n        ``length`` is ``11``. If ``primary`` is ``True`` and ``length`` is\n        ``11``, the 11-digit SWIFT codes generated will always end in ``'XXX'``\n        to denote that they belong to primary branches/offices.\n\n        For extra authenticity, localized providers may opt to include SWIFT\n        bank codes, location codes, and branch codes used in their respective\n        locales. If ``use_dataset`` is ``True``, this method will generate SWIFT\n        codes based on those locale-specific codes if included. If those codes\n        were not included, then it will behave as if ``use_dataset`` were\n        ``False``, and in that mode, all those codes will just be randomly\n        generated as per the specification.\n\n        :sample:\n        :sample: length=8\n        :sample: length=8, use_dataset=True\n        :sample: length=11\n        :sample: length=11, primary=True\n        :sample: length=11, use_dataset=True\n        :sample: length=11, primary=True, use_dataset=True\n        \"\"\"\n        if length is None:\n            length = self.random_element((8, 11))\n        if length not in (8, 11):\n            raise AssertionError('length can only be 8 or 11')\n\n        if use_dataset and hasattr(self, 'swift_bank_codes'):\n            bank_code = self.random_element(self.swift_bank_codes)\n        else:\n            bank_code = self.lexify('????', letters=string.ascii_uppercase)\n\n        if use_dataset and hasattr(self, 'swift_location_codes'):\n            location_code = self.random_element(self.swift_location_codes)\n        else:\n            location_code = self.lexify('??', letters=string.ascii_uppercase + string.digits)\n\n        if length == 8:\n            return bank_code + self.country_code + location_code\n\n        if primary:\n            branch_code = 'XXX'\n        elif use_dataset and hasattr(self, 'swift_branch_codes'):\n            branch_code = self.random_element(self.swift_branch_codes)\n        else:\n            branch_code = self.lexify('???', letters=string.ascii_uppercase + string.digits)\n\n        return bank_code + self.country_code + location_code + branch_code\n", "path": "faker/providers/bank/__init__.py"}]}