This is an automated email from the ASF dual-hosted git repository.

eladkal pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 86c165ba54f Improve tagging of providers when preparing a release 
(#57628)
86c165ba54f is described below

commit 86c165ba54f949ab5a8a92bfbc3aa0ccc852da57
Author: Jarek Potiuk <[email protected]>
AuthorDate: Fri Oct 31 17:54:10 2025 +0100

    Improve tagging of providers when preparing a release (#57628)
    
    Tagging providers after release after #57337 happened after preparing
    the tarball - which was wrong :) as tarball uses the tag to build
    the -sources package. Also it cannot be done too early becasue
    tags are created based on the provider packages prepared in dist.
    
    So - tagging providers *SHOULD* happen between creating provider
    distributions and creating tarball.
    
    This PR moves creation of the tarball to the right place, it also
    improves a bit the "tag-providers" step:
    
    * it uses PACKAGE_DATE environment variable if it is defined
    * it does not react on existing tags - it simply overwrites the
      tags if such tags exist.
---
 dev/README_RELEASE_PROVIDERS.md                    | 33 ++++++------
 .../output_release-management_tag-providers.svg    | 28 ++++++-----
 .../output_release-management_tag-providers.txt    |  2 +-
 .../commands/release_management_commands.py        | 58 ++++++++--------------
 .../commands/release_management_commands_config.py |  2 +-
 5 files changed, 56 insertions(+), 67 deletions(-)

diff --git a/dev/README_RELEASE_PROVIDERS.md b/dev/README_RELEASE_PROVIDERS.md
index edec1b3e5cc..47b35e771ec 100644
--- a/dev/README_RELEASE_PROVIDERS.md
+++ b/dev/README_RELEASE_PROVIDERS.md
@@ -37,7 +37,6 @@
   - [Build and sign the source and convenience 
packages](#build-and-sign-the-source-and-convenience-packages)
   - [Commit the source packages to Apache SVN 
repo](#commit-the-source-packages-to-apache-svn-repo)
   - [Publish the Regular distributions to PyPI (release 
candidates)](#publish-the-regular-distributions-to-pypi-release-candidates)
-  - [Add tags in git](#add-tags-in-git)
   - [Prepare documentation in Staging](#prepare-documentation-in-staging)
   - [Prepare issue in GitHub to keep status of 
testing](#prepare-issue-in-github-to-keep-status-of-testing)
   - [Prepare voting email for Providers release 
candidate](#prepare-voting-email-for-providers-release-candidate)
@@ -47,7 +46,7 @@
   - [Summarize the voting for the Apache Airflow 
release](#summarize-the-voting-for-the-apache-airflow-release)
   - [Publish release to SVN](#publish-release-to-svn)
   - [Publish the packages to PyPI](#publish-the-packages-to-pypi)
-  - [Add tags in git](#add-tags-in-git-1)
+  - [Add tags in git](#add-tags-in-git)
   - [Publish documentation](#publish-documentation)
   - [Update providers metadata](#update-providers-metadata)
   - [Notify developers of release](#notify-developers-of-release)
@@ -368,6 +367,7 @@ rm -rf ${AIRFLOW_REPO_ROOT}/dist/*
 
 ```shell script
 breeze release-management prepare-provider-distributions  
--include-removed-providers --distribution-format both
+breeze release-management tag-providers
 breeze release-management prepare-airflow-tarball --version ${PACKAGE_DATE} 
--distribution-name apache_airflow_providers
 ```
 
@@ -376,6 +376,7 @@ if you only build few packages, run:
 ```shell script
 breeze release-management prepare-provider-distributions  
--include-removed-providers \
 --distribution-format both PACKAGE PACKAGE ....
+breeze release-management tag-providers
 breeze release-management prepare-airflow-tarball --version ${PACKAGE_DATE} 
--distribution-name apache_airflow_providers
 ```
 
@@ -383,6 +384,19 @@ In case you want to also release a pre-installed provider 
that is in ``not-ready
 you want to release it before you switch their state to ``ready``), you need 
to pass
 ``--include-not-ready-providers`` flag to the command above.
 
+.. note:
+
+  The "tag-providers" step assumes that your remote for apache repository is 
called `apache`.
+
+  Sometimes in cases when there is a connectivity issue to GitHub, it might be 
possible that local
+  tags get created  and lead to annoying errors. The default behaviour would 
be to clean such local tags up,
+  so you can re-run tag-providers command without issues, and it will force 
tag creation properly, overriding
+  existing tags.
+
+  If you want to disable this behaviour, use --no-clean-tags.
+
+
+
 
 * Sign all your packages
 
@@ -489,21 +503,6 @@ twine upload -r pypi ${AIRFLOW_REPO_ROOT}/dist/*
 
 * Confirm that the packages are available under the links printed and look 
good.
 
-
-## Add tags in git
-
-Assume that your remote for apache repository is called `apache` you should now
-set tags for the providers in the repo.
-
-Sometimes in cases when there is a connectivity issue to GitHub, it might be 
possible that local tags get created
-and lead to annoying errors. The default behaviour would be to clean such 
local tags up.
-
-If you want to disable this behaviour, set the env **CLEAN_LOCAL_TAGS** to 
false.
-
-```shell script
-breeze release-management tag-providers
-```
-
 ## Prepare documentation in Staging
 
 Documentation is an essential part of the product and should be made available 
to users.
diff --git a/dev/breeze/doc/images/output_release-management_tag-providers.svg 
b/dev/breeze/doc/images/output_release-management_tag-providers.svg
index 00ac6b5bee3..7a9e511f910 100644
--- a/dev/breeze/doc/images/output_release-management_tag-providers.svg
+++ b/dev/breeze/doc/images/output_release-management_tag-providers.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 416.0" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 440.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -42,7 +42,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-tag-providers-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="365.0" />
+      <rect x="0" y="0" width="1463.0" height="389.4" />
     </clipPath>
     <clipPath id="breeze-release-management-tag-providers-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -86,9 +86,12 @@
 <clipPath id="breeze-release-management-tag-providers-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-tag-providers-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="414" rx="8"/><text 
class="breeze-release-management-tag-providers-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;tag-providers</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="438.4" rx="8"/><text 
class="breeze-release-management-tag-providers-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;tag-providers</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -104,15 +107,16 @@
 </text><text class="breeze-release-management-tag-providers-r1" x="12.2" 
y="93.2" textLength="549" 
clip-path="url(#breeze-release-management-tag-providers-line-3)">Generates&#160;tags&#160;for&#160;airflow&#160;provider&#160;releases.</text><text
 class="breeze-release-management-tag-providers-r1" x="1464" y="93.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-3)">
 </text><text class="breeze-release-management-tag-providers-r1" x="1464" 
y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-4)">
 </text><text class="breeze-release-management-tag-providers-r5" x="0" y="142" 
textLength="24.4" 
clip-path="url(#breeze-release-management-tag-providers-line-5)">╭─</text><text 
class="breeze-release-management-tag-providers-r5" x="24.4" y="142" 
textLength="280.6" 
clip-path="url(#breeze-release-management-tag-providers-line-5)">&#160;Add&#160;tags&#160;to&#160;providers&#160;</text><text
 class="breeze-release-management-tag-providers-r5" x="305" y="142" 
textLength="1134.6" clip-path="url(# [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-6)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="166.4" 
textLength="219.6" 
clip-path="url(#breeze-release-management-tag-providers-line-6)">--clean-local-tags</text><text
 class="breeze-release-management-tag-providers-r1" x="244" y="166.4" 
textLength="12.2" clip-path="url(#breeze-release-management-t [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-7)">│</text><text 
class="breeze-release-management-tag-providers-r1" x="561.2" y="190.8" 
textLength="878.4" 
clip-path="url(#breeze-release-management-tag-providers-line-7)">avoid&#160;errors.&#160;The&#160;default&#160;behaviour&#160;would&#160;be&#160;to&#160;clean&#160;such&#160;local&#160;tags.&#160;&#160;</text><text
 class="bre [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-8)">│</text><text 
class="breeze-release-management-tag-providers-r5" x="561.2" y="215.2" 
textLength="878.4" 
clip-path="url(#breeze-release-management-tag-providers-line-8)">[default:&#160;clean-local-tags]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="239.6" textLength="1464" 
clip-path="url(#breeze-release-management-tag-providers-line-9)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-tag-providers-r1" x="1464" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-9)">
-</text><text class="breeze-release-management-tag-providers-r5" x="0" y="264" 
textLength="24.4" 
clip-path="url(#breeze-release-management-tag-providers-line-10)">╭─</text><text
 class="breeze-release-management-tag-providers-r5" x="24.4" y="264" 
textLength="195.2" 
clip-path="url(#breeze-release-management-tag-providers-line-10)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-tag-providers-r5" x="219.6" y="264" 
textLength="1220" clip-path="url(#breeze-release- [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-11)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="288.4" 
textLength="109.8" 
clip-path="url(#breeze-release-management-tag-providers-line-11)">--dry-run</text><text
 class="breeze-release-management-tag-providers-r6" x="158.6" y="288.4" 
textLength="24.4" clip-path="url(#breeze-release-management-tag-pr [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-12)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="312.8" 
textLength="109.8" 
clip-path="url(#breeze-release-management-tag-providers-line-12)">--verbose</text><text
 class="breeze-release-management-tag-providers-r6" x="158.6" y="312.8" 
textLength="24.4" clip-path="url(#breeze-release-management-tag-pr [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-13)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="337.2" 
textLength="73.2" 
clip-path="url(#breeze-release-management-tag-providers-line-13)">--help</text><text
 class="breeze-release-management-tag-providers-r6" x="158.6" y="337.2" 
textLength="24.4" clip-path="url(#breeze-release-management-tag-provid [...]
-</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="361.6" textLength="1464" 
clip-path="url(#breeze-release-management-tag-providers-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-tag-providers-r1" x="1464" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-14)">
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-6)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="166.4" 
textLength="146.4" 
clip-path="url(#breeze-release-management-tag-providers-line-6)">--clean-tags</text><text
 class="breeze-release-management-tag-providers-r1" x="170.8" y="166.4" 
textLength="12.2" clip-path="url(#breeze-release-management-tag-p [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-7)">│</text><text 
class="breeze-release-management-tag-providers-r1" x="414.8" y="190.8" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-tag-providers-line-7)">issues&#160;to&#160;avoid&#160;errors.&#160;The&#160;default&#160;behaviour&#160;would&#160;be&#160;to&#160;clean&#160;both&#160;local&#160;and&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-8)">│</text><text 
class="breeze-release-management-tag-providers-r1" x="414.8" y="215.2" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-tag-providers-line-8)">remote&#160;tags.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-9)">│</text><text 
class="breeze-release-management-tag-providers-r5" x="414.8" y="239.6" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-tag-providers-line-9)">[default:&#160;clean-tags]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" y="264" 
textLength="1464" 
clip-path="url(#breeze-release-management-tag-providers-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-tag-providers-r1" x="1464" y="264" 
textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-10)">
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="288.4" textLength="24.4" 
clip-path="url(#breeze-release-management-tag-providers-line-11)">╭─</text><text
 class="breeze-release-management-tag-providers-r5" x="24.4" y="288.4" 
textLength="195.2" 
clip-path="url(#breeze-release-management-tag-providers-line-11)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-tag-providers-r5" x="219.6" y="288.4" 
textLength="1220" clip-path="url(#breeze-re [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-12)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="312.8" 
textLength="109.8" 
clip-path="url(#breeze-release-management-tag-providers-line-12)">--dry-run</text><text
 class="breeze-release-management-tag-providers-r6" x="158.6" y="312.8" 
textLength="24.4" clip-path="url(#breeze-release-management-tag-pr [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-13)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="337.2" 
textLength="109.8" 
clip-path="url(#breeze-release-management-tag-providers-line-13)">--verbose</text><text
 class="breeze-release-management-tag-providers-r6" x="158.6" y="337.2" 
textLength="24.4" clip-path="url(#breeze-release-management-tag-pr [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-14)">│</text><text 
class="breeze-release-management-tag-providers-r4" x="24.4" y="361.6" 
textLength="73.2" 
clip-path="url(#breeze-release-management-tag-providers-line-14)">--help</text><text
 class="breeze-release-management-tag-providers-r6" x="158.6" y="361.6" 
textLength="24.4" clip-path="url(#breeze-release-management-tag-provid [...]
+</text><text class="breeze-release-management-tag-providers-r5" x="0" y="386" 
textLength="1464" 
clip-path="url(#breeze-release-management-tag-providers-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-tag-providers-r1" x="1464" y="386" 
textLength="12.2" 
clip-path="url(#breeze-release-management-tag-providers-line-15)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_release-management_tag-providers.txt 
b/dev/breeze/doc/images/output_release-management_tag-providers.txt
index eb987987e51..6e77b6d91d0 100644
--- a/dev/breeze/doc/images/output_release-management_tag-providers.txt
+++ b/dev/breeze/doc/images/output_release-management_tag-providers.txt
@@ -1 +1 @@
-403dae670f839e37c83baa15ac65af9a
+cd7abd0560cc4829b9567a4f03880fd5
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 843efb83bb4..9a225af754e 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -17,7 +17,6 @@
 from __future__ import annotations
 
 import ast
-import contextlib
 import glob
 import operator
 import os
@@ -1288,18 +1287,18 @@ def run_generate_constraints_in_parallel(
     help="Generates tags for airflow provider releases.",
 )
 @click.option(
-    "--clean-local-tags/--no-clean-local-tags",
+    "--clean-tags/--no-clean-tags",
     default=True,
     is_flag=True,
-    envvar="CLEAN_LOCAL_TAGS",
-    help="Delete local tags that are created due to github connectivity issues 
to avoid errors. "
-    "The default behaviour would be to clean such local tags.",
+    envvar="CLEAN_TAGS",
+    help="Delete tags (both local and remote) that are created due to github 
connectivity "
+    "issues to avoid errors. The default behaviour would be to clean both 
local and remote tags.",
     show_default=True,
 )
 @option_dry_run
 @option_verbose
 def tag_providers(
-    clean_local_tags: bool,
+    clean_tags: bool,
 ):
     found_remote = None
     remotes = ["origin", "apache"]
@@ -1317,32 +1316,31 @@ def tag_providers(
         except subprocess.CalledProcessError:
             pass
 
-    release_date = datetime.now().strftime("%Y-%m-%d")
+    release_date = os.environ.get("PACKAGE_DATE", 
datetime.now().strftime("%Y-%m-%d"))
 
     if found_remote is None:
         raise ValueError("Could not find remote configured to push to 
apache/airflow")
 
+    extra_flags = []
     tags = []
+    if clean_tags:
+        extra_flags.append("--force")
     for file in os.listdir(os.path.join(SOURCE_DIR_PATH, "dist")):
         if file.endswith(".whl"):
             match = re.match(r".*airflow_providers_(.*)-(.*)-py3.*", file)
             if match:
                 provider = f"providers-{match.group(1).replace('_', '-')}"
                 tag = f"{provider}/{match.group(2)}"
-                try:
-                    get_console().print(f"[info]Creating tag: {tag}")
-                    run_command(
-                        ["git", "tag", tag, "-m", f"Release {release_date} of 
providers"],
-                        check=True,
-                    )
-                    tags.append(tag)
-                except subprocess.CalledProcessError as e:
-                    get_console().print(f"[warning]Failed to create {tag}: 
{e}")
-                    pass
+                get_console().print(f"[info]Creating tag: {tag}")
+                run_command(
+                    ["git", "tag", tag, *extra_flags, "-m", f"Release 
{release_date} of providers"],
+                    check=True,
+                )
+                tags.append(tag)
     providers_date_tag = f"providers/{release_date}"
     if tags:
         run_command(
-            ["git", "tag", providers_date_tag, "-m", f"Release {release_date} 
of providers"],
+            ["git", "tag", providers_date_tag, *extra_flags, "-m", f"Release 
{release_date} of providers"],
             check=True,
         )
         get_console().print()
@@ -1350,24 +1348,12 @@ def tag_providers(
         get_console().print(providers_date_tag)
         get_console().print()
         tags.append(providers_date_tag)
-        try:
-            push_result = run_command(
-                ["git", "push", found_remote, *tags],
-                check=False,
-            )
-            if push_result.returncode == 0:
-                get_console().print("\n[success]Tags pushed successfully.[/]")
-        except subprocess.CalledProcessError:
-            get_console().print("\n[error]Failed to push tags, probably a 
connectivity issue to GitHub.[/]")
-            if clean_local_tags:
-                for tag in tags:
-                    with contextlib.suppress(subprocess.CalledProcessError):
-                        run_command(["git", "tag", "-d", tag], check=True)
-                get_console().print("\n[success]Cleaning up local tags...[/]")
-            else:
-                get_console().print(
-                    "\n[success]Local tags are not cleaned up, unset 
CLEAN_LOCAL_TAGS or set to true.[/]"
-                )
+        push_result = run_command(
+            ["git", "push", found_remote, *extra_flags, *tags],
+            check=True,
+        )
+        if push_result.returncode == 0:
+            get_console().print("\n[success]Tags pushed successfully.[/]")
 
 
 @release_management.command(
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index 2e843a04af6..2ea715946d5 100644
--- 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -243,7 +243,7 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str 
| list[str]]]] = {
         {
             "name": "Add tags to providers",
             "options": [
-                "--clean-local-tags",
+                "--clean-tags",
             ],
         },
     ],

Reply via email to