prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  [Feature Request] Python 3.10 support
  **Is your feature request related to a problem? Please describe.**
  Hi, I'm wondering if Dash supports Python 3.10 or if this is on the roadmap. Thanks for all your great work!
  
  **Describe the solution you'd like**
  As a user of Dash, I would like to be able to install Dash and/or Plotly in a Python 3.10 environment.
  
  **Describe alternatives you've considered**
  I tried [searching the forums](https://community.plotly.com/search?q=python%203.10), but didn't find any results. I haven't tried building it myself yet, but plan to.
  
  **Additional context**
  n/a
  
  
  </issue>
  <code>
  [start of setup.py]
  1 import io
  2 from setuptools import setup, find_packages
  3 
  4 main_ns = {}
  5 exec(open("dash/version.py", encoding="utf-8").read(), main_ns)  # pylint: disable=exec-used, consider-using-with
  6 
  7 
  8 def read_req_file(req_type):
  9     with open(f"requires-{req_type}.txt", encoding="utf-8") as fp:
  10         requires = (line.strip() for line in fp)
  11         return [req for req in requires if req and not req.startswith("#")]
  12 
  13 
  14 setup(
  15     name="dash",
  16     version=main_ns["__version__"],
  17     author="Chris Parmer",
  18     author_email="chris@plotly.com",
  19     packages=find_packages(exclude=["tests*"]),
  20     include_package_data=True,
  21     license="MIT",
  22     description=(
  23         "A Python framework for building reactive web-apps. "
  24         "Developed by Plotly."
  25     ),
  26     long_description=io.open("README.md", encoding="utf-8").read(),  # pylint: disable=consider-using-with
  27     long_description_content_type="text/markdown",
  28     install_requires=read_req_file("install"),
  29     python_requires=">=3.6",
  30     extras_require={
  31         "ci": read_req_file("ci"),
  32         "dev": read_req_file("dev"),
  33         "testing": read_req_file("testing"),
  34         "celery": read_req_file("celery"),
  35         "diskcache": read_req_file("diskcache"),
  36         "compress": read_req_file("compress")
  37     },
  38     entry_points={
  39         "console_scripts": [
  40             "dash-generate-components = "
  41             "dash.development.component_generator:cli",
  42             "renderer = dash.development.build_process:renderer",
  43             "dash-update-components = dash.development.update_components:cli"
  44         ],
  45         "pytest11": ["dash = dash.testing.plugin"],
  46     },
  47     url="https://plotly.com/dash",
  48     project_urls={
  49         "Documentation": "https://dash.plotly.com",
  50         "Source": "https://github.com/plotly/dash",
  51         "Issue Tracker": "https://github.com/plotly/dash/issues",
  52     },
  53     classifiers=[
  54         "Development Status :: 5 - Production/Stable",
  55         "Environment :: Web Environment",
  56         "Framework :: Dash",
  57         "Framework :: Flask",
  58         "Intended Audience :: Developers",
  59         "Intended Audience :: Education",
  60         "Intended Audience :: Financial and Insurance Industry",
  61         "Intended Audience :: Healthcare Industry",
  62         "Intended Audience :: Manufacturing",
  63         "Intended Audience :: Science/Research",
  64         "License :: OSI Approved :: MIT License",
  65         "Programming Language :: Python",
  66         "Programming Language :: Python :: 3",
  67         "Programming Language :: Python :: 3.6",
  68         "Programming Language :: Python :: 3.7",
  69         "Programming Language :: Python :: 3.8",
  70         "Programming Language :: Python :: 3.9",
  71         "Topic :: Database :: Front-Ends",
  72         "Topic :: Office/Business :: Financial :: Spreadsheet",
  73         "Topic :: Scientific/Engineering :: Visualization",
  74         "Topic :: Software Development :: Libraries :: Application Frameworks",
  75         "Topic :: Software Development :: Widget Sets",
  76     ],
  77     data_files=[
  78         # like `jupyter nbextension install --sys-prefix`
  79         ("share/jupyter/nbextensions/dash", [
  80             "dash/nbextension/main.js",
  81         ]),
  82         # like `jupyter nbextension enable --sys-prefix`
  83         ("etc/jupyter/nbconfig/notebook.d", [
  84             "dash/nbextension/dash.json"
  85         ]),
  86         # Place jupyterlab extension in extension directory
  87         ("share/jupyter/lab/extensions", [
  88             "dash/labextension/dist/dash-jupyterlab.tgz"
  89         ]),
  90     ],
  91 )
  92
  [end of setup.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/setup.py b/setup.py
  --- a/setup.py
  +++ b/setup.py
  @@ -68,6 +68,7 @@
           "Programming Language :: Python :: 3.7",
           "Programming Language :: Python :: 3.8",
           "Programming Language :: Python :: 3.9",
  +        "Programming Language :: Python :: 3.10",
           "Topic :: Database :: Front-Ends",
           "Topic :: Office/Business :: Financial :: Spreadsheet",
           "Topic :: Scientific/Engineering :: Visualization",
  
verification_info: {"golden_diff": "diff --git a/setup.py b/setup.py\n--- a/setup.py\n+++ b/setup.py\n@@ -68,6 +68,7 @@\n         \"Programming Language :: Python :: 3.7\",\n         \"Programming Language :: Python :: 3.8\",\n         \"Programming Language :: Python :: 3.9\",\n+        \"Programming Language :: Python :: 3.10\",\n         \"Topic :: Database :: Front-Ends\",\n         \"Topic :: Office/Business :: Financial :: Spreadsheet\",\n         \"Topic :: Scientific/Engineering :: Visualization\",\n", "issue": "[Feature Request] Python 3.10 support\n**Is your feature request related to a problem? Please describe.**\r\nHi, I'm wondering if Dash supports Python 3.10 or if this is on the roadmap. Thanks for all your great work!\r\n\r\n**Describe the solution you'd like**\r\nAs a user of Dash, I would like to be able to install Dash and/or Plotly in a Python 3.10 environment.\r\n\r\n**Describe alternatives you've considered**\r\nI tried [searching the forums](https://community.plotly.com/search?q=python%203.10), but didn't find any results. I haven't tried building it myself yet, but plan to.\r\n\r\n**Additional context**\r\nn/a\r\n\n", "before_files": [{"content": "import io\nfrom setuptools import setup, find_packages\n\nmain_ns = {}\nexec(open(\"dash/version.py\", encoding=\"utf-8\").read(), main_ns)  # pylint: disable=exec-used, consider-using-with\n\n\ndef read_req_file(req_type):\n    with open(f\"requires-{req_type}.txt\", encoding=\"utf-8\") as fp:\n        requires = (line.strip() for line in fp)\n        return [req for req in requires if req and not req.startswith(\"#\")]\n\n\nsetup(\n    name=\"dash\",\n    version=main_ns[\"__version__\"],\n    author=\"Chris Parmer\",\n    author_email=\"chris@plotly.com\",\n    packages=find_packages(exclude=[\"tests*\"]),\n    include_package_data=True,\n    license=\"MIT\",\n    description=(\n        \"A Python framework for building reactive web-apps. \"\n        \"Developed by Plotly.\"\n    ),\n    long_description=io.open(\"README.md\", encoding=\"utf-8\").read(),  # pylint: disable=consider-using-with\n    long_description_content_type=\"text/markdown\",\n    install_requires=read_req_file(\"install\"),\n    python_requires=\">=3.6\",\n    extras_require={\n        \"ci\": read_req_file(\"ci\"),\n        \"dev\": read_req_file(\"dev\"),\n        \"testing\": read_req_file(\"testing\"),\n        \"celery\": read_req_file(\"celery\"),\n        \"diskcache\": read_req_file(\"diskcache\"),\n        \"compress\": read_req_file(\"compress\")\n    },\n    entry_points={\n        \"console_scripts\": [\n            \"dash-generate-components = \"\n            \"dash.development.component_generator:cli\",\n            \"renderer = dash.development.build_process:renderer\",\n            \"dash-update-components = dash.development.update_components:cli\"\n        ],\n        \"pytest11\": [\"dash = dash.testing.plugin\"],\n    },\n    url=\"https://plotly.com/dash\",\n    project_urls={\n        \"Documentation\": \"https://dash.plotly.com\",\n        \"Source\": \"https://github.com/plotly/dash\",\n        \"Issue Tracker\": \"https://github.com/plotly/dash/issues\",\n    },\n    classifiers=[\n        \"Development Status :: 5 - Production/Stable\",\n        \"Environment :: Web Environment\",\n        \"Framework :: Dash\",\n        \"Framework :: Flask\",\n        \"Intended Audience :: Developers\",\n        \"Intended Audience :: Education\",\n        \"Intended Audience :: Financial and Insurance Industry\",\n        \"Intended Audience :: Healthcare Industry\",\n        \"Intended Audience :: Manufacturing\",\n        \"Intended Audience :: Science/Research\",\n        \"License :: OSI Approved :: MIT License\",\n        \"Programming Language :: Python\",\n        \"Programming Language :: Python :: 3\",\n        \"Programming Language :: Python :: 3.6\",\n        \"Programming Language :: Python :: 3.7\",\n        \"Programming Language :: Python :: 3.8\",\n        \"Programming Language :: Python :: 3.9\",\n        \"Topic :: Database :: Front-Ends\",\n        \"Topic :: Office/Business :: Financial :: Spreadsheet\",\n        \"Topic :: Scientific/Engineering :: Visualization\",\n        \"Topic :: Software Development :: Libraries :: Application Frameworks\",\n        \"Topic :: Software Development :: Widget Sets\",\n    ],\n    data_files=[\n        # like `jupyter nbextension install --sys-prefix`\n        (\"share/jupyter/nbextensions/dash\", [\n            \"dash/nbextension/main.js\",\n        ]),\n        # like `jupyter nbextension enable --sys-prefix`\n        (\"etc/jupyter/nbconfig/notebook.d\", [\n            \"dash/nbextension/dash.json\"\n        ]),\n        # Place jupyterlab extension in extension directory\n        (\"share/jupyter/lab/extensions\", [\n            \"dash/labextension/dist/dash-jupyterlab.tgz\"\n        ]),\n    ],\n)\n", "path": "setup.py"}]}