Hi Mark,
On Wed, Jul 29, 2026 at 4:07 AM Mark Wielaard <[email protected]> wrote:
>
> The .debug_sup section is the standardized version of
> .gnu_debugaltlink from DWARF5 to connect the debug file to the
> supplementary file. The .debug_dwp section is like the .debug_sup
> section, but to connect the debug file to the DWARF package file
> described in https://dwarfstd.org/issues/260116.1.html
>
> * libdw/dwarf_begin_elf.c (dwarf_scnnames): Add debug_sup and
> debug_dwp.
> (scn_to_string_section_idx): Likewise.
> * libdw/libdw.map (ELFUTILS_0.196): New version map depending
> on ELFUTILS_0.193.
> * libdw/libdwP.h (enum): Add IDX_debug_sup and IDX_debug_dwp.
> * libdwelf/Makefile.am (libdwelf_a_SOURCES): Add
> dwelf_dwarf_id_section.c
> * libdwelf/dwelf_dwarf_id_section.c: New file.
> * libdwelf/libdwelf.h (dwelf_dwarf_debug_sup): New function.
> (dwelf_dwarf_debug_dwp): New function.
> * libdwelf/libdwelfP.h: INTDECL dwelf_dwarf_debug_sup and
> dwelf_dwarf_debug_dwp.
> * tests/.gitignore: Add dwelf-dwarf-debug-sup.
> * tests/Makefile.am (check_PROGRAMS): Add dwelf-dwarf-debug-sup.
> (TESTS): Add run-dwelf-dwarf-debug-sup.sh.
> (EXTRA_DIST): Add run-dwelf-dwarf-debug-sup.sh,
> testfile-dwarf5-ref-sup.bz2 and testfile-dwarf5.sup.bz2.
> (dwelf_dwarf_debug_sup_LDADD): New variable.
> * tests/dwelf-dwarf-debug-sup.c: New file.
> * tests/run-dwelf-dwarf-debug-sup.sh: Likewise.
> * tests/testfile-dwarf5-ref-sup.bz2: New testfile.
> * tests/testfile-dwarf5.sup.bz2: New testfile.
>
> Signed-off-by: Mark Wielaard <[email protected]>
> ---
> libdw/dwarf_begin_elf.c | 4 +
> libdw/libdw.map | 6 ++
> libdw/libdwP.h | 2 +
> libdwelf/Makefile.am | 3 +-
> libdwelf/dwelf_dwarf_id_section.c | 126 +++++++++++++++++++++++++++++
> libdwelf/libdwelf.h | 34 ++++++++
> libdwelf/libdwelfP.h | 2 +
> tests/.gitignore | 1 +
> tests/Makefile.am | 7 +-
> tests/dwelf-dwarf-debug-sup.c | 96 ++++++++++++++++++++++
> tests/run-dwelf-dwarf-debug-sup.sh | 36 +++++++++
> tests/testfile-dwarf5-ref-sup.bz2 | Bin 0 -> 2791 bytes
> tests/testfile-dwarf5.sup.bz2 | Bin 0 -> 517 bytes
> 13 files changed, 315 insertions(+), 2 deletions(-)
> create mode 100644 libdwelf/dwelf_dwarf_id_section.c
> create mode 100644 tests/dwelf-dwarf-debug-sup.c
> create mode 100755 tests/run-dwelf-dwarf-debug-sup.sh
> create mode 100755 tests/testfile-dwarf5-ref-sup.bz2
> create mode 100644 tests/testfile-dwarf5.sup.bz2
>
> diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
> index 7b58ad2e2218..ec8fff4fcb52 100644
> --- a/libdw/dwarf_begin_elf.c
> +++ b/libdw/dwarf_begin_elf.c
> @@ -69,6 +69,8 @@ static const char dwarf_scnnames[IDX_last][19] =
> [IDX_debug_rnglists] = ".debug_rnglists",
> [IDX_debug_cu_index] = ".debug_cu_index",
> [IDX_debug_tu_index] = ".debug_tu_index",
> + [IDX_debug_sup] = ".debug_sup",
> + [IDX_debug_dwp] = ".debug_dwp",
> [IDX_gnu_debugaltlink] = ".gnu_debugaltlink"
> };
> #define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof
> (dwarf_scnnames[0]))
> @@ -96,6 +98,8 @@ static const enum string_section_index
> scn_to_string_section_idx[IDX_last] =
> [IDX_debug_rnglists] = STR_SCN_IDX_last,
> [IDX_debug_cu_index] = STR_SCN_IDX_last,
> [IDX_debug_tu_index] = STR_SCN_IDX_last,
> + [IDX_debug_sup] = STR_SCN_IDX_last,
> + [IDX_debug_dwp] = STR_SCN_IDX_last,
> [IDX_gnu_debugaltlink] = STR_SCN_IDX_last
> };
>
> diff --git a/libdw/libdw.map b/libdw/libdw.map
> index b45647e6fa4c..f201fd30f2e1 100644
> --- a/libdw/libdw.map
> +++ b/libdw/libdw.map
> @@ -411,3 +411,9 @@ ELFUTILS_0.194_EXPERIMENTAL {
> global:
> dwflst_sample_getframes;
> } ELFUTILS_0.193_EXPERIMENTAL;
> +
> +ELFUTILS_0.196 {
> + global:
> + dwelf_dwarf_debug_sup;
> + dwelf_dwarf_debug_dwp;
> +} ELFUTILS_0.193;
> \ No newline at end of file
> diff --git a/libdw/libdwP.h b/libdw/libdwP.h
> index 1a3aea2d99ec..92dfe3ea7b28 100644
> --- a/libdw/libdwP.h
> +++ b/libdw/libdwP.h
> @@ -85,6 +85,8 @@ enum
> IDX_debug_rnglists,
> IDX_debug_cu_index,
> IDX_debug_tu_index,
> + IDX_debug_sup,
> + IDX_debug_dwp,
> IDX_gnu_debugaltlink,
> IDX_last
> };
> diff --git a/libdwelf/Makefile.am b/libdwelf/Makefile.am
> index 0d0628402206..5d3577201bed 100644
> --- a/libdwelf/Makefile.am
> +++ b/libdwelf/Makefile.am
> @@ -42,7 +42,8 @@ noinst_HEADERS = libdwelfP.h
> libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c
> dwelf_dwarf_gnu_debugaltlink.c \
> dwelf_elf_gnu_build_id.c dwelf_scn_gnu_compressed_size.c
> \
> dwelf_strtab.c dwelf_elf_begin.c \
> - dwelf_elf_e_machine_string.c
> + dwelf_elf_e_machine_string.c \
> + dwelf_dwarf_id_section.c
>
> libdwelf = $(libdw)
>
> diff --git a/libdwelf/dwelf_dwarf_id_section.c
> b/libdwelf/dwelf_dwarf_id_section.c
> new file mode 100644
> index 000000000000..34b09163a9f9
> --- /dev/null
> +++ b/libdwelf/dwelf_dwarf_id_section.c
> @@ -0,0 +1,126 @@
> +/* Parses .debug_sup and .debug_dwp sections.
> + Copyright (C) 2026 Mark J. Wielaard
> + This file is part of elfutils.
> +
> + This file is free software; you can redistribute it and/or modify
> + it under the terms of either
> +
> + * the GNU Lesser General Public License as published by the Free
> + Software Foundation; either version 3 of the License, or (at
> + your option) any later version
> +
> + or
> +
> + * the GNU General Public License as published by the Free
> + Software Foundation; either version 2 of the License, or (at
> + your option) any later version
> +
> + or both in parallel, as here.
> +
> + elfutils is distributed in the hope that it will be useful, but
> + WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License and
> + the GNU Lesser General Public License along with this program. If
> + not, see <http://www.gnu.org/licenses/>. */
> +
> +#ifdef HAVE_CONFIG_H
> +# include <config.h>
> +#endif
> +
> +#include "libdwelfP.h"
> +
> +/* .debug_sup and .debug_dwp are identical, just the name of the flag
> + is different. */
> +static ssize_t
> +dwelf_dwarf_debug_sec (Dwarf *dwarf,
> + int idx, /* Either IDX_debug_sup or IDX_debug_dwp. */
> + uint16_t *versionp,
> + uint8_t *is_flagp,
> + const char **filepathp,
> + const uint8_t **idp)
> +{
> + if (dwarf == NULL)
> + return -1;
> +
> + Elf_Data *data = dwarf->sectiondata[idx];
> + if (data == NULL)
> + {
> + if (filepathp != NULL)
> + *filepathp = NULL;
> + if (idp != NULL)
> + *idp = NULL;
> + return 0;
> + }
> +
> + /* Minimal is version 2 bytes, flag 1 byte, empty path 1 byte, zero
> + id_len 1 byte for a total of 5. */
> + if (data->d_buf == NULL || data->d_size < 5)
> + {
> + bad_data:
> + __libdw_seterrno (DWARF_E_INVALID_DWARF);
> + return -1;
> + }
> +
> + const unsigned char *readp = data->d_buf;
> + const unsigned char *endp = data->d_buf + data->d_size;
> + uint16_t version = read_2ubyte_unaligned_inc (dwarf, readp);
> + if ((idx == IDX_debug_sup && version != 5)
> + || (idx == IDX_debug_dwp && version != 6))
> + goto bad_data;
> + uint8_t flag = *readp++;
> +
> + const char *filepath = (const char *) readp;
> + /* Must be '\0' terminated. */
> + readp = memchr (filepath, '\0', (size_t) (endp - readp));
> + if (readp == NULL)
> + goto bad_data;
> +
> + readp++;
> + if (readp == endp)
> + goto bad_data;
> +
> + size_t id_len;
> + get_uleb128 (id_len, readp, endp);
get_uleb128 reads a uint64_t into id_len but with type size_t it's not
guaranteed to be at least as wide. If size_t is 32-bit then a
malformed id_len could get truncated and potentially accepted as a
legitimate value.
Otherwise all the patches in this series LGTM.
Aaron
> + if (id_len > 0 && (size_t) (endp - readp) < id_len)
> + goto bad_data;
> +
> + if (versionp != NULL)
> + *versionp = version;
> + if (is_flagp != NULL)
> + *is_flagp = flag;
> + if (filepathp != NULL)
> + *filepathp = filepath;
> + if (idp != NULL)
> + *idp = readp;
> +
> + return id_len;
> +}
> +
> +ssize_t
> +dwelf_dwarf_debug_sup (Dwarf *dwarf,
> + uint16_t *versionp,
> + uint8_t *is_supp,
> + const char **filepathp,
> + const uint8_t **idp)
> +{
> + int idx = IDX_debug_sup;
> + return dwelf_dwarf_debug_sec (dwarf, idx,
> + versionp, is_supp, filepathp, idp);
> +}
> +INTDEF(dwelf_dwarf_debug_sup)
> +
> +ssize_t
> +dwelf_dwarf_debug_dwp (Dwarf *dwarf,
> + uint16_t *versionp,
> + uint8_t *is_dwpp,
> + const char **filepathp,
> + const uint8_t **idp)
> +{
> + int idx = IDX_debug_dwp;
> + return dwelf_dwarf_debug_sec (dwarf, idx,
> + versionp, is_dwpp, filepathp, idp);
> +}
> +INTDEF(dwelf_dwarf_debug_dwp)
> diff --git a/libdwelf/libdwelf.h b/libdwelf/libdwelf.h
> index 263ca60e35a0..743787219b3b 100644
> --- a/libdwelf/libdwelf.h
> +++ b/libdwelf/libdwelf.h
> @@ -57,6 +57,40 @@ extern ssize_t dwelf_dwarf_gnu_debugaltlink (Dwarf *dwarf,
> const char **namep,
> const void **build_idp);
>
> +/* Returns the version, is_supp flag, filepath, and ID from the
> + .debug_sup section if found in the DWARF file. On success, the
> + version and is_supp flag value, filepath pointer, and ID pointer
> + are written to the output parameters (if not NULL), and the
> + positive (possible zero) length of the ID is returned. The is_supp
> + flag value is one if the Dwarf object represents a supplementary
> + (alt) file, zero otherwise. The filepath and ID pointers are valid
> + as long as the Dwarf object is valid. Returns 0 if the DWARF file
> + lacks a .debug_sup section and sets the filepath and id references
> + to NULL (if given). Returns -1 in case of malformed data or other
> + errors. Currently only version 5 is supported. */
> +extern ssize_t dwelf_dwarf_debug_sup (Dwarf *dwarf,
> + uint16_t *versionp,
> + uint8_t *is_suppp,
> + const char **filepathp,
> + const uint8_t **idp);
> +
> +/* Returns the version, is_dwp flag, filepath, and ID from the
> + .debug_dwp section if found in the DWARF file. On success, the
> + version and is_dwp flag value, filepath pointer, and ID pointer are
> + written to the output parameters (if not NULL), and the positive
> + (possible zero) length of the ID is returned. The is_dwp flag
> + value is one if the Dwarf object represents a package file, zero
> + otherwise. The filepath and ID pointers are valid as long as the
> + Dwarf object is valid. Returns 0 if the DWARF file lacks a
> + .debug_dwp section and sets the filepath and id references to NULL
> + (if given). Returns -1 in case of malformed data or other errors.
> + Currently only version 6 is supported. */
> +extern ssize_t dwelf_dwarf_debug_dwp (Dwarf *dwarf,
> + uint16_t *versionp,
> + uint8_t *is_dwpp,
> + const char **filepathp,
> + const uint8_t **idp);
> +
> /* Returns the build ID as found in a NT_GNU_BUILD_ID note from either
> a SHT_NOTE section or from a PT_NOTE segment if the ELF file
> doesn't contain any section headers. On success a pointer to the
> diff --git a/libdwelf/libdwelfP.h b/libdwelf/libdwelfP.h
> index faaf1a20244d..0b1de3b21715 100644
> --- a/libdwelf/libdwelfP.h
> +++ b/libdwelf/libdwelfP.h
> @@ -38,5 +38,7 @@
> INTDECL (dwelf_elf_gnu_debuglink)
> INTDECL (dwelf_dwarf_gnu_debugaltlink)
> INTDECL (dwelf_elf_gnu_build_id)
> +INTDECL (dwelf_dwarf_debug_sup)
> +INTDECL (dwelf_dwarf_debug_dwp)
>
> #endif /* libdwelfP.h */
> diff --git a/tests/.gitignore b/tests/.gitignore
> index 37ffe9ce5378..25b51e55906f 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -43,6 +43,7 @@
> /dwarf-ranges
> /dwarf_default_lower_bound
> /dwarfcfi
> +/dwelf-dwarf-debug-sup
> /dwelf_elf_e_machine_string
> /dwarf_language_lower_bound
> /dwelfgnucompressed
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 8e6109f5ea5a..f4de14362b32 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -70,6 +70,7 @@ check_PROGRAMS = arextract arsymtest newfile saridx
> scnnames sectiondump \
> eu_search_lines eu_search_die \
> ar-extract-ar elf-from-memory ar-getarsym-mem \
> core-ioperm-huge \
> + dwelf-dwarf-debug-sup \
> $(asm_TESTS)
>
> asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
> @@ -241,6 +242,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh
> newfile test-nlist \
> run-test-manyfuncs.sh \
> run-eu-search-cfi.sh run-eu-search-macros.sh \
> run-eu-search-lines.sh run-eu-search-die.sh \
> + run-dwelf-dwarf-debug-sup.sh \
> elf-from-memory ar-getarsym-mem
>
> if !BIARCH
> @@ -726,7 +728,9 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
> run-test-manyfuncs.sh manyfuncs.c \
> run-debuginfod-seekable.sh thread-safety-subr.sh \
> run-eu-search-cfi.sh run-eu-search-macros.sh \
> - run-eu-search-lines.sh run-eu-search-die.sh
> + run-eu-search-lines.sh run-eu-search-die.sh \
> + run-dwelf-dwarf-debug-sup.sh \
> + testfile-dwarf5-ref-sup.bz2 testfile-dwarf5.sup.bz2
>
>
> if USE_HELGRIND
> @@ -910,6 +914,7 @@ debuginfod_build_id_find_LDADD = $(libelf) $(libdw)
> xlate_notes_LDADD = $(libelf)
> elfrdwrnop_LDADD = $(libelf)
> dwelf_elf_e_machine_string_LDADD = $(libelf) $(libdw)
> +dwelf_dwarf_debug_sup_LDADD = $(libelf) $(libdw)
> getphdrnum_LDADD = $(libelf) $(libdw)
> leb128_LDADD = $(libelf) $(libdw)
> read_unaligned_LDADD = $(libelf) $(libdw)
> diff --git a/tests/dwelf-dwarf-debug-sup.c b/tests/dwelf-dwarf-debug-sup.c
> new file mode 100644
> index 000000000000..deed16f4cdff
> --- /dev/null
> +++ b/tests/dwelf-dwarf-debug-sup.c
> @@ -0,0 +1,96 @@
> +/* Test program for dwelf_dwarf_debug_sup
> + Copyright (C) 2026 Mark J. Wielaard <[email protected]>
> + This file is part of elfutils.
> +
> + This file is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + elfutils is distributed in the hope that it will be useful, but
> + WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#ifdef HAVE_CONFIG_H
> +# include <config.h>
> +#endif
> +
> +#include <system.h>
> +
> +#include <assert.h>
> +#include <errno.h>
> +#include <inttypes.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <limits.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +#include ELFUTILS_HEADER(dwelf)
> +
> +int
> +main (int argc, char **argv)
> +{
> + if (argc != 2)
> + {
> + fprintf(stderr, "Usage: %s <dwarf-file>\n", argv[0]);
> + return 1;
> + }
> +
> + const char *file = argv[1];
> + int fd = open(file, O_RDONLY);
> + if (fd < 0)
> + {
> + perror("open");
> + return 1;
> + }
> +
> + Dwarf *dwarf = dwarf_begin(fd, DWARF_C_READ);
> + if (dwarf == NULL)
> + {
> + fprintf(stderr, "dwarf_begin: %s\n", dwarf_errmsg(-1));
> + close(fd);
> + return 1;
> + }
> +
> + uint16_t version;
> + uint8_t is_sup;
> + const char *filepath;
> + const unsigned char *id;
> + ssize_t id_len = dwelf_dwarf_debug_sup (dwarf, &version, &is_sup,
> + &filepath, &id);
> +
> + if (id_len == 0 && filepath == NULL)
> + {
> + printf("%s: No .debug_sup section found\n", file);
> + }
> + else if (id_len < 0)
> + {
> + fprintf(stderr, "%s: Error reading .debug_sup: %s\n",
> + file, dwarf_errmsg(-1));
> + dwarf_end(dwarf);
> + close(fd);
> + return 1;
> + }
> + else
> + {
> + printf("version: %u\n", version);
> + printf("is_sup: %s\n", is_sup ? "yes" : "no");
> + printf("filepath: %s\n", filepath);
> + printf("id_len: %zd\n", id_len);
> + printf("id: ");
> + for (ssize_t i = 0; i < id_len; i++)
> + printf("%02x", id[i]);
> + printf("\n");
> + }
> +
> + /* Cleanup */
> + dwarf_end(dwarf);
> + close(fd);
> +
> + return 0;
> +}
> diff --git a/tests/run-dwelf-dwarf-debug-sup.sh
> b/tests/run-dwelf-dwarf-debug-sup.sh
> new file mode 100755
> index 000000000000..023f28c8e2cf
> --- /dev/null
> +++ b/tests/run-dwelf-dwarf-debug-sup.sh
> @@ -0,0 +1,36 @@
> +#! /bin/sh
> +# Test for dwelf_dwarf_debug_sup
> +# Copyright (C) 2026 Mark J. Wielaard <[email protected]>
> +# This file is part of elfutils.
> +#
> +# This file is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# elfutils is distributed in the hope that it will be useful, but
> +# WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +
> +. $srcdir/test-subr.sh
> +
> +testfiles testfile-dwarf5-ref-sup testfile-dwarf5.sup
> +testrun_compare ${abs_top_builddir}/tests/dwelf-dwarf-debug-sup
> testfile-dwarf5-ref-sup<<\EOF
> +version: 5
> +is_sup: no
> +filepath: testfile-dwarf5.sup
> +id_len: 20
> +id: 90e34252e5688d4ff284d787d161b6fe44115436
> +EOF
> +
> +testrun_compare ${abs_top_builddir}/tests/dwelf-dwarf-debug-sup
> testfile-dwarf5.sup<<\EOF
> +version: 5
> +is_sup: yes
> +filepath:
> +id_len: 20
> +id: 90e34252e5688d4ff284d787d161b6fe44115436
> +EOF
> diff --git a/tests/testfile-dwarf5-ref-sup.bz2
> b/tests/testfile-dwarf5-ref-sup.bz2
> new file mode 100755
> index
> 0000000000000000000000000000000000000000..c9a2c2e392eea14c4907844b4fc6d02d2b57b06a
> GIT binary patch
> literal 2791
> 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
>
> literal 0
> HcmV?d00001
>
> diff --git a/tests/testfile-dwarf5.sup.bz2 b/tests/testfile-dwarf5.sup.bz2
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..56d91fe488da37f8bbd61d8e8876e589d6f4c1b2
> GIT binary patch
> literal 517
> zcmV+g0{Z<zT4*^jL0KkKS<%kxga83YfB*l_@1S&J|9@ZQwgCU<-_pc_Kmb4h0RR92
> zAb<)05CJd&nWof)O-bb#DD^!w(`uRzQ%pgS(8L)uXnv$%YBcpRr1csZpwTrlqh?Wr
> zO#@9D8Z^)V&}3v9XaS%DKm!p$37`W*AZR^6(?-+)0MGyc00hQm0u??y974M9D(mNM
> z#Udhl0;KEudr`}m(HWYEtt${i-Ad#M5f|tQ5oE}cEzk)I<uPK{>2P7Ah#t9+w<6Gn
> zTuKzBIS90BD2PvZ{5$URy)t$ComC()yMc8lpPgD#P4{vlAtwrjR}PhFS_m<t(S&cI
> zaH%tAu5@FX#0qp6G9l235jxalyeY#hfaJkOdy%+j<p*IBWu&SC*+@mzK}&GL7S5Zk
> zI*$Z$BMZ(r=HHgGe%3LV0dklO6);G%OhEei0G$A4H5xuQ8A7{SxL&bM0~YGyvZ}~R
> zJ8-CQ2+s*!TTjM;QB7#h|D<@KeS)YKv3zG^6X{&W<OmW2d^;~fA4l)$_kGt`+ej9t
> zG#xBhg@BoymjVaDUcCDkA~6*DxT)-dbG(NQkJh$4IL*kYPFqmK*@g}!ppO@~ep%3z
> zAaih(>8pxaS?CoQJynjoEwlJwNj5-@Nib|2gD`i3YU31A|4Pv4(WZ8owF|i-oG3_W
> H=XJsW#Ma@E
>
> literal 0
> HcmV?d00001
>
> --
> 2.55.0
>