internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: imAsparky/django-cookiecutter

Issue:
[BUG]: Initial commit message is bounded by "". Remove the quotation marks
**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:

1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**

-   imAsparky cookiecutter-pypackage version:
-   Python version:
-   OS: [e.g. iOS]
-   Browser [e.g. chrome, safari]
-   Version [e.g. 22]

**Smartphone (please complete the following information):**

-   Device: [e.g. iPhone6]
-   OS: [e.g. iOS8.1]
-   Browser [e.g. stock browser, safari]
-   Version [e.g. 22]

**Additional context**
Add any other context about the problem here.



Discussion:

Resolving patch:
diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py
--- a/hooks/post_gen_project.py
+++ b/hooks/post_gen_project.py
@@ -154,7 +154,7 @@ def git_add_and_commit_initial():
         "git",
         "commit",
         "-m",
-        '"chore(git): Initial Commit"',
+        "chore(git): Initial Commit",
         cwd=PROJECT_DIRECTORY,
     )
 


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[CHORE]: Improve custom admin create user form.
**What is the chore?**



Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/users/admin.py b/{{cookiecutter.git_project_name}}/users/admin.py
--- a/{{cookiecutter.git_project_name}}/users/admin.py
+++ b/{{cookiecutter.git_project_name}}/users/admin.py
@@ -26,10 +26,10 @@ class CustomUserAdmin(UserAdmin):
     model = CustomUser
 
     fieldsets = UserAdmin.fieldsets + (
-        (
-            "User Type",
-            {"fields": ("user_type",)},
-        ),
+        ("User Type", {'fields': ('user_type',)}),
+    )
+    add_fieldsets = UserAdmin.add_fieldsets + (
+        (None, {'fields': ("email",'user_type', )}),
     )
 
     list_display = [


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[FEAT]: Improve logging and CLI readout for local dev server
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.



Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/config/settings/base.py b/{{cookiecutter.git_project_name}}/config/settings/base.py
--- a/{{cookiecutter.git_project_name}}/config/settings/base.py
+++ b/{{cookiecutter.git_project_name}}/config/settings/base.py
@@ -168,3 +168,65 @@
 ACCOUNT_USERNAME_REQUIRED = True  # Default dj-allauth
 ACCOUNT_USERNAME_MIN_LENGTH = 3  # Default dj-allauth == 1
 ACCOUNT_USERNAME_BLACKLIST = username_blacklist
+
+
+LOGGING = {
+    "version": 1,
+    "disable_existing_loggers": False,
+    "filters": {
+        "require_debug_false": {
+            "()": "django.utils.log.RequireDebugFalse",
+        },
+        "require_debug_true": {
+            "()": "django.utils.log.RequireDebugTrue",
+        },
+    },
+    "formatters": {
+        "django.server": {
+            "()": "django.utils.log.ServerFormatter",
+            "format": "[{server_time}]:{module}:{lineno:d}:{process:d}:{thread:d}:[{message}]",
+            "style": "{",
+        },
+        "rich": {"datefmt": "[%X]"},
+    },
+    "handlers": {
+        "console": {
+            "filters": ["require_debug_true"],
+            "class": "rich.logging.RichHandler",
+            "formatter": "rich",
+            "level": "DEBUG",
+            "rich_tracebacks": True,
+            "tracebacks_show_locals": True,
+        },
+        "django.server": {
+            "level": "DEBUG",
+            "class": "logging.StreamHandler",
+            "formatter": "django.server",
+        },
+        "mail_admins": {
+            "level": "ERROR",
+            "filters": ["require_debug_false"],
+            "class": "django.utils.log.AdminEmailHandler",
+        },
+        "file": {
+            "level": "DEBUG",
+            "class": "logging.FileHandler",
+            "filename": "logging/debug.log",
+        },
+    },
+    "loggers": {
+        "django": {
+            "handlers": ["console",],
+            "level": "INFO",
+        },
+        "django.server": {
+            "handlers": ["django.server",],
+            "level": "DEBUG",
+            "propagate": False,
+        },
+    },
+    "root": {
+        "handlers": ["console",],
+        "level": "DEBUG",
+    },
+}


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[CHORE]: Housekeeping base.py
Remove unnecessary comments.



Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/config/settings/base.py b/{{cookiecutter.git_project_name}}/config/settings/base.py
--- a/{{cookiecutter.git_project_name}}/config/settings/base.py
+++ b/{{cookiecutter.git_project_name}}/config/settings/base.py
@@ -279,8 +279,6 @@
 }
 
 
-# This function catches any unhandled exceptions and redirects them to
-# the logger.  Exceptions caught here will have a label "Uncaught Exception!"
 def exception_hook(type, value, traceback):
     """
     Function to redirect uncaught exceptions to the logger.


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[BUG]: Missing MEDIA_ROOT in settings
**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:

1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**

-   imAsparky cookiecutter-pypackage version:
-   Python version:
-   OS: [e.g. iOS]
-   Browser [e.g. chrome, safari]
-   Version [e.g. 22]

**Smartphone (please complete the following information):**

-   Device: [e.g. iPhone6]
-   OS: [e.g. iOS8.1]
-   Browser [e.g. stock browser, safari]
-   Version [e.g. 22]

**Additional context**
Add any other context about the problem here.



Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/config/settings/base.py b/{{cookiecutter.git_project_name}}/config/settings/base.py
--- a/{{cookiecutter.git_project_name}}/config/settings/base.py
+++ b/{{cookiecutter.git_project_name}}/config/settings/base.py
@@ -52,8 +52,15 @@
 
 # Static files (CSS, JavaScript, Images)
 # https://docs.djangoproject.com/en/4.0/howto/static-files/
+# STATIC_URL is added to relevant STATIC_URL env setting in config/settings/*
+# If a STATIC_URL env var is set that will be what is used.
 STATIC_URL = "/static/"
 STATIC_ROOT = os.path.join(BASE_DIR, "static")
+# MEDIA_URL is added to relevant STATIC_URL env setting in config/settings/*
+# If a MEDIA_URL env var is set that will be what is used.
+MEDIA_URL = "/media/"
+MEDIA_ROOT = os.path.join(BASE_DIR, "media")
+
 WSGI_APPLICATION = "core.wsgi.application"
 
 # Tailwind Settings


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[CHORE]:  Update email admins logging and settings
**What is the chore?**

 "loggers": {
        "": {
            "handlers": ["console", `"mail_admins"`, "rotated_logs", "stdout"],
            # "level": Overridden in each config/settings file for environ
        },
Add ADMINS and MANAGERS to settings and cookiecutter



Discussion:

Resolving patch:
diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py
--- a/hooks/post_gen_project.py
+++ b/hooks/post_gen_project.py
@@ -172,6 +172,22 @@ def git_configure_custom_commit_message():
         )
 
 
+def final_checks_reminders_for_users():
+
+    print(
+            "\nSUCCESS: Your {{cookiecutter.project_name}} \
+            has been generated successfully!",
+            "\nSome things to remember:"
+            "\n1. If using the email admins with errors feature, in config.settings.base",
+            "\n\ta. Review DJANGO_LOGGING_LEVEL meets your needs. ",
+            "\n\tb. Add names and emails to ADMINS. ",
+            "\n\tc. Review MANAGERS meets your needs ",
+            "\n\td. Review SERVER_EMAIL meets your needs ",
+            "\n You can find all these settings grouped together under: # Logging Settings",
+            "\n\n Thank you for using Django-Cookiecutter, I hope you enjoyed this experience."
+        )
+
+
 if __name__ == "__main__":
 
     remove_files(REMOVE_FILES)
@@ -184,3 +200,5 @@ def git_configure_custom_commit_message():
 
         if "{{ cookiecutter.create_conventional_commits_edit_message}}" == "y":
             git_configure_custom_commit_message()
+
+    final_checks_reminders_for_users()
diff --git a/{{cookiecutter.git_project_name}}/config/settings/base.py b/{{cookiecutter.git_project_name}}/config/settings/base.py
--- a/{{cookiecutter.git_project_name}}/config/settings/base.py
+++ b/{{cookiecutter.git_project_name}}/config/settings/base.py
@@ -43,7 +43,16 @@
 # Logging Settings
 DJANGO_LOG_FILE = "logging/rotating.log"
 DJANGO_LOGGING_LEVEL = "WARNING"
+# Send an email to ADMINS if this logger level triggered
 DJANGO_LOGGING_MAIL_ADMINS = "CRITICAL"
+# Add list of people to receive emails on system errors.
+# Format is [("Name", "email_address@domain.com")]
+ADMINS = []
+# Can be an be any other people, typically the same as the ADMINS
+MANAGERS = ADMINS
+# Default: 'root@localhost'. Often the default will be blocked by the email
+# service provider.  Change to something like "SYSTEM@your_domain.com"
+SERVER_EMAIL = ""
 
 #Django Settings
 # LOGIN_REDIRECT_URL For new project convenience, change to your project requirements.
@@ -264,7 +273,7 @@
     },
     "loggers": {
         "": {
-            "handlers": ["console", "rotated_logs", "stdout"],
+            "handlers": ["console","mail_admins", "rotated_logs", "stdout"],
             # "level": Overridden in each config/settings file for environ
         },
         "django": {


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[FEAT]:Add trader-biz core views
Add in the HTMX views etc


Discussion:
As part of doing this, also update the HTMXTemplateView

https://github.com/trader-biz/britstralian/commit/ac2fdb67cb9989a913b5478e4eb4f5def8acc69b

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/core/views/generic/base.py b/{{cookiecutter.git_project_name}}/core/views/generic/base.py
--- a/{{cookiecutter.git_project_name}}/core/views/generic/base.py
+++ b/{{cookiecutter.git_project_name}}/core/views/generic/base.py
@@ -1,6 +1,7 @@
 """{{cookiecutter.git_project_name}} Core App Generic Views Base."""
 
 from django.core.exceptions import ImproperlyConfigured
+from django.shortcuts import redirect
 from django.views.generic.base import TemplateResponseMixin, TemplateView
 
 
@@ -59,3 +60,29 @@ class HtmxTemplateView(HtmxTemplateResponseMixin, TemplateView):
 
     Renders an htmx template or a generic template response.
     """
+
+    def get(self, request, *args, **kwargs):
+        """Extends GET to check if the user has defined the
+        'not_htmx_request_redirect' attribute. If they have
+        and the request is not using HTMX then redirect the
+        user to the value of the attribute.
+        """
+        if hasattr(self, "not_htmx_request_redirect"):
+            if request.htmx:
+                return super().get(self, request, *args, **kwargs)
+            else:
+                return redirect(self.not_htmx_request_redirect)
+        return super().get(self, request, *args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        """Extends POST to check if the user has defined the
+        'not_htmx_request_redirect' attribute. If they have
+        and the request is not using HTMX then redirect the
+        user to the value of the attribute.
+        """
+        if hasattr(self, "not_htmx_request_redirect"):
+            if request.htmx:
+                return super().post(self, request, *args, **kwargs)
+            else:
+                return redirect(self.not_htmx_request_redirect)
+        return super().post(self, request, *args, **kwargs)


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[CHORE]: Change references from CustomUser to User=get_user_model()
**What is the chore?**



Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/core/utils/context_processors.py b/{{cookiecutter.git_project_name}}/core/utils/context_processors.py
--- a/{{cookiecutter.git_project_name}}/core/utils/context_processors.py
+++ b/{{cookiecutter.git_project_name}}/core/utils/context_processors.py
@@ -3,7 +3,6 @@
 import environ
 from django.conf import settings
 
-from users.models import CustomUser
 
 env = environ.FileAwareEnv()
 


Test patch:
diff --git a/{{cookiecutter.git_project_name}}/tests/conftest.py b/{{cookiecutter.git_project_name}}/tests/conftest.py
--- a/{{cookiecutter.git_project_name}}/tests/conftest.py
+++ b/{{cookiecutter.git_project_name}}/tests/conftest.py
@@ -1,8 +1,11 @@
 """{{cookiecutter.git_project_name}} Test Fixtures."""
 
 import pytest
+from django.contrib.auth import get_user_model
 from django.test.utils import override_settings
-from users.models import CustomUser as User
+
+User = get_user_model()
+
 
 # This settings snippet is from Speed Up Your Django Tests
 # please support by purchasing from here https://adamchainz.gumroad.com/l/suydt
@@ -15,7 +18,6 @@ def test_settings():
 
 TEST_SETTINGS = {
     "PAGINATION_COUNT": 10,
-
 }
 
 
diff --git a/{{cookiecutter.git_project_name}}/tests/test_custom_user.py b/{{cookiecutter.git_project_name}}/tests/test_custom_user.py
--- a/{{cookiecutter.git_project_name}}/tests/test_custom_user.py
+++ b/{{cookiecutter.git_project_name}}/tests/test_custom_user.py
@@ -1,7 +1,9 @@
 """{{cookiecutter.git_project_name}} project CustomUser Tests."""
 
 import pytest
-from users.models import CustomUser as User
+from django.contrib.auth import get_user_model
+
+User = get_user_model()
 
 # Tests for the create_user function
 def test_create_user_ok(new_user):
Repository: imAsparky/django-cookiecutter

Issue:
[BUG]: Core base view has logic error.
**Describe the bug**
A clear and concise description of what the bug is.

![image](https://github.com/imAsparky/django-cookiecutter/assets/31756570/ecb08709-2f33-4523-864c-e786d71f6a56)


**To Reproduce**
Steps to reproduce the behavior:

1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**

-   imAsparky cookiecutter-pypackage version:
-   Python version:
-   OS: [e.g. iOS]
-   Browser [e.g. chrome, safari]
-   Version [e.g. 22]

**Smartphone (please complete the following information):**

-   Device: [e.g. iPhone6]
-   OS: [e.g. iOS8.1]
-   Browser [e.g. stock browser, safari]
-   Version [e.g. 22]

**Additional context**
Add any other context about the problem here.



Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/core/views/generic/base.py b/{{cookiecutter.git_project_name}}/core/views/generic/base.py
--- a/{{cookiecutter.git_project_name}}/core/views/generic/base.py
+++ b/{{cookiecutter.git_project_name}}/core/views/generic/base.py
@@ -42,7 +42,7 @@ def get_template_names(self):
         """
         super().get_template_names()
 
-        if self.template_name is None or self.htmx_template_name is None:
+        if self.template_name is None and self.htmx_template_name is None:
             raise ImproperlyConfigured(
                 "HtmxTemplateResponseMixin requires either a definition of "
                 "'htmx_template_name' and 'template_name' or an "


Test patch:
Repository: imAsparky/django-cookiecutter

Issue:
[CHORE]: Update deprecated django-allauth settings
**What is the chore?**

site-packages/allauth/account/app_settings.py:53: UserWarning: settings.ACCOUNT_LOGIN_ATTEMPTS_LIMIT/TIMEOUT is deprecated, use: settings.ACCOUNT_RATE_LIMITS['login_failed']

https://docs.allauth.org/en/latest/account/rate_limits.html


Discussion:

Resolving patch:
diff --git a/{{cookiecutter.git_project_name}}/config/settings/base.py b/{{cookiecutter.git_project_name}}/config/settings/base.py
--- a/{{cookiecutter.git_project_name}}/config/settings/base.py
+++ b/{{cookiecutter.git_project_name}}/config/settings/base.py
@@ -35,7 +35,8 @@
 ACCOUNT_UNIQUE_EMAIL = True  # Default dj-allauth
 ACCOUNT_EMAIL_VERIFICATION = "mandatory"  # Default dj-allauth (optional)
 ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 3  # Default dj-allauth
-ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5  # Default dj-allauth
+# deprecated ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5  # Default dj-allauth
+ACCOUNT_RATE_LIMITS = ['login_failed'] # Using  (default: "10/m/ip,5/5m/key")
 ACCOUNT_USERNAME_REQUIRED = True  # Default dj-allauth
 ACCOUNT_USERNAME_MIN_LENGTH = 3  # Default dj-allauth == 1
 ACCOUNT_USERNAME_BLACKLIST = username_blacklist


Test patch:
Repository: python-trio/trio

Issue:
wait_all_tasks_blocked example correct?
https://github.com/python-trio/trio/blob/ec4cdee7de14ede9fdd8b863af54510c714be99d/trio/_core/_run.py#L1089

When I try to run this example, I get an AssertionError, I believe on the linked line.

Reading the code, I can't tell why we expect the lock to be unlocked at that point when we acquired the lock before entering the "async with" block, but I'm unsure if I'm misunderstanding part of the trio API.


Discussion:
Uh.... No, it looks like a silly mistake on my part. I think that assertion should just be deleted. (And also the next one, the `assert lock.locked()` – that one should pass at least because it's vacuously true, but it's not making the example any clearer.) Good catch, thanks!

I wonder if there's a better example – that one's pretty subtle. I think it's there because it was literally the problem that pushed me to implement `wait_all_tasks_blocked`, but since then I've started using it all over the place...

Resolving patch:
diff --git a/trio/_core/_run.py b/trio/_core/_run.py
--- a/trio/_core/_run.py
+++ b/trio/_core/_run.py
@@ -1084,17 +1084,21 @@ async def test_lock_fairness():
                  lock = trio.Lock()
                  await lock.acquire()
                  async with trio.open_nursery() as nursery:
-                     nursery.spawn(lock_taker, lock)
-                     # child hasn't run yet
-                     assert not lock.locked()
+                     child = nursery.spawn(lock_taker, lock)
+                     # child hasn't run yet, we have the lock
+                     assert lock.locked()
+                     assert lock._owner is trio.current_task()
                      await trio.testing.wait_all_tasks_blocked()
-                     # now the child has run
+                     # now the child has run and is blocked on lock.acquire(), we
+                     # still have the lock
                      assert lock.locked()
+                     assert lock._owner is trio.current_task()
                      lock.release()
                      try:
                          # The child has a prior claim, so we can't have it
                          lock.acquire_nowait()
                      except trio.WouldBlock:
+                         assert lock._owner is child
                          print("PASS")
                      else:
                          print("FAIL")


Test patch:
Repository: python-trio/trio

Issue:
Make Cancelled propagation/catching less error prone
You can't really catch `Cancelled` errors yourself, because you never know where they came from -- it might be some outer cancel scope your code knows nothing about. This also means that you can't really raise `Cancelled` errors yourself, because if you do that then they won't be tagged with the magic metadata that lets Trio know when to catch them, and if neither you can catch them nor Trio can catch them, they'll just crash your program, which is probably not what you wanted. But this is not really obvious. So we should probably make it so attempting to `raise Cancelled` gives a useful error message (e.g. by making `Cancelled.__init__` require some private value be passed).



Discussion:

Resolving patch:
diff --git a/trio/_core/_exceptions.py b/trio/_core/_exceptions.py
--- a/trio/_core/_exceptions.py
+++ b/trio/_core/_exceptions.py
@@ -55,6 +55,12 @@ class Cancelled(BaseException):
 
     then this *won't* catch a :exc:`Cancelled` exception.
 
+    Attempting to raise :exc:`Cancelled` yourself will cause a
+    :exc:`RuntimeError`. It would not be associated with a cancel scope and thus
+    not be caught by Trio. Use
+    :meth:`cancel_scope.cancel() <trio.The cancel scope interface.cancel>`
+    instead.
+
     .. note::
 
        In the US it's also common to see this word spelled "canceled", with
@@ -69,6 +75,23 @@ class Cancelled(BaseException):
 
     """
     _scope = None
+    __marker = object()
+
+    def __init__(self, _marker=None):
+        if _marker is not self.__marker:
+            raise RuntimeError(
+                'Cancelled should not be raised directly. Use the cancel() '
+                'method on your cancel scope.'
+            )
+        super().__init__()
+
+    @classmethod
+    def _init(cls):
+        """A private constructor so that a user-created instance of Cancelled
+        can raise an appropriate error. see `issue #342
+        <https://github.com/python-trio/trio/issues/342>`__.
+        """
+        return cls(_marker=cls.__marker)
 
 
 class ResourceBusyError(Exception):
diff --git a/trio/_core/_run.py b/trio/_core/_run.py
--- a/trio/_core/_run.py
+++ b/trio/_core/_run.py
@@ -168,7 +168,7 @@ def _tasks_added_by_adoption(self, tasks):
         self._tasks.update(tasks)
 
     def _make_exc(self):
-        exc = Cancelled()
+        exc = Cancelled._init()
         exc._scope = self
         return exc
 


Test patch:
diff --git a/trio/_core/tests/test_run.py b/trio/_core/tests/test_run.py
--- a/trio/_core/tests/test_run.py
+++ b/trio/_core/tests/test_run.py
@@ -1848,3 +1848,18 @@ async def t2():
         var.set("hmmmm")
         n.start_soon(t2)
         await wait_all_tasks_blocked()
+
+
+def test_Cancelled_init():
+    check_Cancelled_error = pytest.raises(
+        RuntimeError, match='should not be raised directly'
+    )
+
+    with check_Cancelled_error:
+        raise _core.Cancelled
+
+    with check_Cancelled_error:
+        _core.Cancelled()
+
+    # private constructor should not raise
+    _core.Cancelled._init()
Repository: python-trio/trio

Issue:
Is trio.run(..., instruments) a mutable default argument?
https://github.com/python-trio/trio/blob/master/trio/_core/_run.py#L1133
https://docs.python-guide.org/en/latest/writing/gotchas

Would it be possible to have __instruments__ modified in one call to __trio.run()__ and still have those modifications present in a future call that did not set the __instruments__ arg?


Discussion:
With the current code the answer is no, because one of the first things that method does is make a copy of the input argument:

https://github.com/python-trio/trio/blob/7f15b7f751d5058ff53ee94ba7b761b35236280a/trio/_core/_run.py#L1217

But I agree it might be safer to change the default to an empty tuple instead.

Resolving patch:
diff --git a/trio/_core/_run.py b/trio/_core/_run.py
--- a/trio/_core/_run.py
+++ b/trio/_core/_run.py
@@ -1140,7 +1140,7 @@ def run(
     async_fn,
     *args,
     clock=None,
-    instruments=[],
+    instruments=(),
     restrict_keyboard_interrupt_to_checkpoints=False
 ):
     """Run a trio-flavored async function, and return the result.


Test patch: