Commit graph

51114 commits

Author SHA1 Message Date
Paul Eggert
2dbfed0532 display_tty_menu_item eassert for absurdly long item texts
* src/xdisp.c (display_tty_menu_item): Add an eassert.
2026-05-19 11:54:26 -07:00
Paul Eggert
fe33900747 Simplify serial_open
* src/sysdep.c (serial_open): On failure, simply return -1
and set errno; do not call report_file_error, as the
caller is supposed to do that if needed.
2026-05-19 11:54:25 -07:00
Paul Eggert
b3b3e203cc Fix unlikely dump_off overflow in pdumper
* src/pdumper.c (dump_grow_buffer): Remove.
(dump_write): Use xpalloc instead.  Avoid undefined behavior
if (ctx->offset + nbyte) exceeds DUMP_OFF_MAX.
2026-05-19 11:54:25 -07:00
Paul Eggert
c80d22dcfc Remove stray inrange_pipe comment 2026-05-19 11:54:25 -07:00
Paul Eggert
efb83df331 Don’t trust RLIMIT_NOFILE in src/process.c
Problem discovered on Fedora 44 x86-64 when using GCC 16.1.1 with
-fsanitize=address, with test/src/process-tests.el tests that use
process-tests--with-raised-rlimit.  This function overrides the
default of 1024 for the maximum number of open files, which causes
undefined behavior (subscript errors) in src/process.c.
* src/process.c (inrange_fd, inrange_pipe): New functions.
(allocate_pty, create_process, create_pty, Fmake_pipe_process)
(Fmake_serial_process, connect_network_socket)
(network_interface_info, server_accept_connection)
(Fprocess_send_eof, child_signal_init):
Check that all newly allocated file descriptors are less than
FD_SETSIZE; close them and fail otherwise.
(create_pty, Fmake_pipe_process, Fmake_serial_process)
(connect_network_socket, server_accept_connection)
(child_signal_init): Remove no-longer-needed comparisons
to FD_SETSIZE, now that inrange_fd and inrange_pipe
do the checking for us.
2026-05-18 23:10:42 -07:00
Paul Eggert
71336e837a Pacify GCC 16.1.1 -Wanalyzer-null-dereference
* src/regex-emacs.c (forall_firstchar):
Avoid undefined behavior in the 2nd eassert when !bufp && !pend.
This pacifies GCC 16.1.1 20260501 (Red Hat 16.1.1-1) x86-64
when Emacs is configured with --enable-gcc-warnings.
2026-05-18 23:10:42 -07:00
Paul Eggert
07fe0b297b Fix undefined behavior in maybe_resize_hash_table
Problem discovered with GCC 16.1.1 -fsanitize=undefined.
* src/fns.c (maybe_resize_hash_table): Avoid undefined
behavior when h->key_and_value or h->hash are null pointers,
in which case we call memcpy (destination, NULL, 0)
which has undefined behavior in C89 through C23.
2026-05-18 23:10:42 -07:00
Paul Eggert
7587bb2654 Simplify module_extract_big_integer size calcs
* src/emacs-module.c (module_bignum_count_max):
Now of type ptrdiff_t, instead of likely being of type size_t.
(module_extract_big_integer): Omit now-unnecessary prefix +, a
now-unnecessary eassert against PTRDIFF_MAX, and and an
unnecessary cast to ptrdiff_t.
2026-05-18 23:10:42 -07:00
Paul Eggert
b9e20e3995 Avoid malloc/free pairs in emit_static_object
* src/comp.c (emit_static_object): Avoid an malloc/free of
a 1 KiB buffer; just put it on the stack.  Use strnlen+mempcpy
instead of strncpy as there is no need to zero-fill buff.
Use int for values that must fit in int since we are
passing them to gcc_jit_context_new_rvalue_from_int.
2026-05-18 23:10:42 -07:00
Paul Eggert
f5c3ddd9ad Prefer singed type to size_t in Fdefine_charset_internal
* src/charset.c (Fdefine_charset_internal):
Prefer int to size_t for a variable that has only int values.
2026-05-18 23:10:42 -07:00
Paul Eggert
56ae704e5b Fix (ash -1 1) undefined behavior
Problem discovered with GCC 16.1.1 -fsanitize=undefined.
* src/data.c (Fash): Don’t left-shift a negative number;
behavior is undefined (ISO C23 § 6.5.8 ¶ 4).
2026-05-18 23:10:42 -07:00
Sean Whitton
641754e870 Merge from origin/emacs-31
28a13b01c7 vc-refresh-state: Override default-directory for backend ...
389874c533 Eglot: unbreak for treesit-less builds
10e91e096d Get selected item in newsticker list view
6bd73af241 ; * test/lisp/jsonrpc-tests.el: Adjust timeouts for CI EM...
eb90c528f3 ; * lisp/progmodes/eglot.el (eglot-code-action-indication...
1d7d6ffedb ; * etc/PROBLEMS: Fix entries about display of Emoji on T...
6c1829bf4c Eglot: fix thinko in recent markdown-related commit (bug#...
36036e71c0 Jsonrpc: migrate more tests to Python subprocess fixtures
0977d5915d Eglot: add left-fringe code action indicator (bug#80326)
b7825c3a27 Fix auth-source-backends-parse
d89054627c Fix updates of embedded formulas by 'calc-embedded-update...
1832a93547 ; * src/fns.c (Fequal): Doc fix.
f68e7a0a41 ; Improve documentation of commands that move by compilat...
2026-05-18 22:16:46 +01:00
Jim Porter
e381cf1fc9 Allow child processes to continue after EPIPE
This ensures that if the child process closed its stdin and Emacs tries
to write to it, the process can still do any remaining work and exit
normally.  In practice, this can occur with commands like "head(1)"
(bug#79079).

* src/fileio.c (file_for_stream): New function, extracted from...
(Fset_binary_mode): ... here.
(Ffile__close_stream): New function.

* src/process.c (send_process): When encountering EPIPE, only close the
fd for the pipe to the child process's stdin.

* lisp/eshell/esh-io.el (eshell-output-object-to-target): Don't check
for process liveness anymore.

* test/src/process-tests.el (process-tests/broken-pipe): New function.
(process-tests/broken-pipe/pipe, process-tests/broken-pipe/pty)
(process-tests/broken-pipe/pipe-stdin)
(process-tests/broken-pipe/pty-stdin): New tests.

* etc/NEWS: Announce this change.
2026-05-17 17:24:10 -07:00
Paul Eggert
7626993c6f Remove SAFE_ALLOCA_LISP_EXTRA
* src/lisp.h (SAFE_ALLOCA_LISP_EXTRA): Remove.  It is no longer
used, it makes life more difficult in the feature/igc3 branch,
and having it around tempted me to start using it again.
2026-05-17 12:57:18 -07:00
Paul Eggert
24f9e6a693 Make styled_format more compatible with igc
* src/editfns.c (styled_format): Don’t call SAFE_ALLOCA_LISP_EXTRA,
as this makes life more difficult in the feature/igc3 branch.
Also, allocate another byte for the format string trailing '\0',
so that we don’t rely in the str2num trick with trailing '\1'.
Problems reported by Pip Cet (Bug#81057#32).
Also, check alloca size more exactly.  Ameliorate the extra
conditional branches by doing all the internal size calculations
before a conditional branch on overflow.
2026-05-17 12:57:18 -07:00
Paul Eggert
f599a92277 Shrink styled_format's frame quite a bit
Problem reported by Helmut Eller (Bug#81057).
On x86-64 this patch shrinks USEFUL_PRECISION_MAX
from 16382 to 1074, SPRINTF_BUFSIZE from 21318 to 1386,
and sizeof initial_buffer from 22318 to 2386.
This also fixes a problem reported privately by Pip Cet:
exactly formatting the smallest positive IEEE double 2**-1074
with %f	needs %.1074f and 1074 is DBL_MANT_DIG - DBL_MIN_EXP,
not merely 1 - DBL_MIN_EXP.
* src/editfns.c (USEFUL_PRECISION_MAX, SPRINTF_BUFSIZE):
Base these on double, not long double, since long double
is not the worst case (it is used only for converted u?intmax_t).
(USEFUL_PRECISION_MAX): Add DBL_MANT_DIG - 1 as per Pip Cet.
2026-05-17 01:26:20 -07:00
Paul Eggert
cf693ce059 Grow styled_format's frame somewhat
* src/editfns.c (styled_format): Don’t subtract
sizeof initial_buffer from sa_avail (bug#81057).
2026-05-17 01:26:20 -07:00
Paul Eggert
1fae14a022 Streamline styled_format aux allocation
* src/editfns.c (styled_format): Streamline allocation of
auxiliary tables, by allocating them all in one go
rather than via separate alloca / mallocs.
2026-05-17 01:26:20 -07:00
Eli Zaretskii
1832a93547 ; * src/fns.c (Fequal): Doc fix. 2026-05-17 10:37:01 +03:00
Eli Zaretskii
407b5ce7ab Merge from origin/emacs-31
cf96e9cb5a ; Fix byte-compilation warnings in non-Tree-Sitter builds
23575adc7b ; * doc/lispref/variables.texi (Local Variables): Fix typ...
8b6fb2f646 ; * doc/lispref/variables.texi (Local Variables): Fix 'na...
d3c72b8389 ; * src/xdisp.c (display_line): Fix commentary (bug#80693).
a981517b72 Fill margins with 'margin' face on truncated screen lines
8e37499035 ; * doc/lispref/os.texi (Init File): Fix markup (bug#81049).
f4c326c378 ; * src/sfnt.c (sfnt_read_cmap_format_12): Assert there's...
bf89ee6d07 ; * etc/PROBLEMS: Cursor not shown on Windows with system...
20500d6200 ; htmlfontify: Handle 'reset' face attribute value (bug#8...
d0d657fa90 ; Minor Tramp cleanup
93ea0d7d28 ; Improve documentation of VC commands in Dired
318084829c Eglot: adjust reference to completion frontends in manual
2a166c2dbd Eldoc: display documentation in visual-line-mode
aba60ad0c5 Eglot: prefer markdown-ts-view-mode for markup rendering ...
689c3bd508 Use 'read-multiple-choice' in 'markdown-ts-mode' (bug#81027)
71809ee5df Fix 'markdown-ts-code-span' face (bug#81026)
286833e401 Add read-only 'markdown-ts-view-mode' (bug#81023)
b39c123490 Fix strikethrough in 'markdown-ts-mode' (bug#80991)
0be998d4bc Fix code-span in headings in 'markdown-ts-mode' (bug#80979)
a00beb3a31 Make 'markdown-ts-inline-images' buffer local and test fo...
a0c05029fd * etc/NEWS: Mention new user option tramp-propagate-emacs...
2e71d2c709 Propagate EMACSCLIENT_TRAMP to remote hosts with Tramp
ff96db93f2 keyboard-tests.el: Try and fix the failure on EMBA
ce3098752c doc: Remove long obsolete references to `package-initialize`
9bc04b001a vc-next-action: Call vc-delete-file on FILESET-ONLY-FILES
13039e3442 ; touch-up last commit: copyright and comments
c2a24dcec8 ; update msys2 build helper for Emacs 31 & UCRT
3630baae72 hideshow: Support new 'margin' face for margin indicators...
20d17df3f4 Use the new 'margin' face in Flymake (bug#80693)
07f2bbc905 vc-dir-resynch-file: Pass down non-truename'd FILE
2026-05-16 07:24:17 -04:00
Eli Zaretskii
87e4687749 Merge from origin/emacs-31
7eab6ef3ce Fix 'sgml-parse-tag-backward' to handle tags in comments
09dc864b0b Fix eww-submit for forms with no action (bug#80918)
0e7a24d931 * lisp/progmodes/hideshow.el (hs--set-variable): Use 'set...
f12b01582d Fix Completions buffer disappearing with tmm-menubar (bug...
519fd83211 Fix secrets.el when Emacs is a flatpak
9e4ea934f2 Fix 'prepare-user-lisp' to follow symlinks
e613e38021 Update "timeout" to 2.1.6
196fd80689 [GTK3, HiDPI] Fix width/height round-trip through Configu...
acc07f1a03 [GTK3] On Expose, repaint the border before the content
5323eebcff Test read-passwd behavior (bug#80838)
01c5990dd0 Fix nested read-passwd calls (bug#80838)
027043df25 ; * lisp/gnus/message.el (message-server-alist): Doc fix ...
3b608b233e Fix terminal emulation of "ESC [ K" sequence
6a605c65a8 Fix vertical-motion across overlay strings with embedded ...
e4d529c67b ; Fix last change
d54faa0f1b Mark gnus-dbus.el as obsolete
9bf2a19bb2 Move gnus-dbus.el to obsolete/gnus-dbus.el
984024daf3 Gnus: Use new sleep library
d7c130972e ; * lisp/term/pgtk-win.el (icon-map-list): Fix :type.
5579893ed7 ; Don't block/unblock input in text_extents methods
547b1ee7b6 Fix Rmail behavior wrt globalized minor modes
6ba05106f4 Fix display images in the display margins
56f27dd9f0 Eglot: fix eglot--sig-info with non-UTF-32 positionEncoding
543d8a7a9d [NS] Fix deprecated variable (bug#80985)

# Conflicts:
#	etc/NEWS
2026-05-16 07:17:51 -04:00
Eli Zaretskii
d3c72b8389 ; * src/xdisp.c (display_line): Fix commentary (bug#80693). 2026-05-16 11:54:43 +03:00
Andrea Alberti
a981517b72 Fill margins with 'margin' face on truncated screen lines
* src/xdisp.c (display_line): Remove the unnecessary condition that
row->used of the margin areas is zero, for when we call
'extend_face_to_end_of_line'.  (Bug#80693)
2026-05-16 11:48:34 +03:00
Eli Zaretskii
f4c326c378 ; * src/sfnt.c (sfnt_read_cmap_format_12): Assert there's no overflow. 2026-05-15 15:00:35 +03:00
Dmitry Gutov
196fd80689 [GTK3, HiDPI] Fix width/height round-trip through ConfigureNotify
* src/gtkutil.c (xg_frame_set_char_size)
(xg_frame_set_size_and_position): Truncate WIDTH and HEIGHT to
be multiples of the scale factor (bug#80662).
2026-05-11 03:32:29 +03:00
Dmitry Gutov
acc07f1a03 [GTK3] On Expose, repaint the border before the content
* src/xterm.c (handle_one_xevent): Move the
x_clear_under_internal_border call before expose_frame, for less
chance of implicit flush to screen in between (bug#80662).
2026-05-11 02:03:30 +03:00
Eli Zaretskii
6a605c65a8 Fix vertical-motion across overlay strings with embedded newlines
* src/indent.c (Fvertical_motion): Handle the case of an overlay
string on invisible text at point.  (Bug#80989)
2026-05-09 14:59:54 +03:00
Eli Zaretskii
5579893ed7 ; Don't block/unblock input in text_extents methods
* src/xftfont.c (xftfont_text_extents):
* src/ftcrfont.c (ftcrfont_text_extents): Don't block/unblock
input.  (Bug#80863)
2026-05-09 12:22:02 +03:00
Eli Zaretskii
6ba05106f4 Fix display images in the display margins
* src/xdisp.c (handle_single_display_spec): Set the iterator face
to use 'margin' when displaying in the margins.  (Bug#80693)
2026-05-09 08:58:59 +03:00
Alan Third
543d8a7a9d [NS] Fix deprecated variable (bug#80985)
* src/nsterm.h (NSLevelIndicatorStyleContinuousCapacity): Define in
macOS < 10.15.
2026-05-08 14:07:56 +01:00
Sean Whitton
0d287aa276 Bump master Emacs version to 32.0.50
* README:
* configure.ac:
* etc/refcards/ru-refcard.tex:
* exec/configure.ac:
* java/AndroidManifest.xml.in (Version-code):
* msdos/sed2v2.inp:
* nt/README.W32: Bump Emacs version to 32.0.50.
* etc/NEWS: Empty for Emacs 32.
* lisp/cus-edit.el (customize-changed-options-previous-release):
Set last version to 31.1.
* src/emacs-module.in.h (struct emacs_env_32): Add.
* src/module-env-31.h: Remove header comment.
* src/module-env-32.h: New file.
2026-05-07 17:46:43 +01:00
Zeke Dou
2f73996647 Move ns_init_colors() after init_callproc() (bug#80752)
'data-directory' needs to be established in advance of 'ns_init_colors'
to ensure the file "etc/rgb.txt" is read.  This was encountered on an
out-of-tree Nix build.

* src/emacs.c (main): Move the 'ns_init_colors' after 'init_callproc'.

Copyright-paperwork-exempt: yes
2026-05-07 17:32:02 +01:00
Eli Zaretskii
4beb8e8963 Fix infloop in redisplay due to continuation glyphs
* src/xdisp.c (display_line): When inserting continuation glyphs,
account for the border glyph in non-rightmost windows on TTY
frames.  (Bug#80975)
2026-05-07 17:45:19 +03:00
Dmitry Gutov
f20e3e473d [GTK3] Move the frame to position before showing
* src/xterm.c (x_make_frame_visible): Move XMoveWindow call before
gtk_widget_show_all, so that the move happens before the frame
become visible (bug#80662).
2026-05-07 06:27:27 +03:00
Dmitry Gutov
6c3dc7aafd [GTK3] Improve the resize -> hide -> show scenario
* src/gtkutil.c (xg_frame_set_char_size)
(xg_frame_set_size_and_position): Call gtk_window_resize for
child frames too, to record _GtkWindowGeometryInfo#resize_width
and resize_height.  They are later looked up by
gtk_widget_show_all in x_make_frame_visible (bug#80662).
Without this the widgets go back and forth between the
remembered and actual sizes after make-visible.
2026-05-07 06:27:27 +03:00
Stéphane Marks
581db34a77 ; Fix crash in macOS Accessibility Zoom timer (bug#80624)
* src/nsterm.m (cancel_ns_deferred_UAZoomChangeFocus_timer): New function.
([EmacsView windowWillClose:]): New method. Cancel the timer if the window
closes before it runs.
([EmacsView deferredhandler:]): Guard against emacsframe being deleted before
the timer runs.
2026-05-06 23:17:09 +01:00
Dmitry Gutov
14f17722aa Fix flicker of child frame right after make-frame-visible
* src/xterm.c (x_make_frame_visible): Call SET_FRAME_GARBAGED
before making a child frame visible (bug#80943).
2026-05-06 04:31:50 +03:00
Eli Zaretskii
d48b774524 ; Fix last change
* src/xdisp.c (extend_face_to_end_of_line): Fix last argument to
'append_stretch_glyph', to avoid assertion violations.  (Bug#80693)
2026-05-05 11:22:56 +03:00
Andrea Alberti
d24b10ca75 Introduce 'margin' face for window margin background
A new basic face 'margin' is used for text displayed in the left and
right margin areas, i.e., the areas typically used by VCS and LSP
packages for per-line annotations.  Its background defaults to the
frame default, preserving existing behavior for users who do not
customize it.
* etc/NEWS: Document the new 'margin' face.
* lisp/faces.el (margin): Add 'margin' face, inheriting from 'default'.
* src/dispextern.h (face_id): Add MARGIN_FACE_ID.
* src/xdisp.c (face_at_pos): Use 'margin' as the base face for
strings displayed in margin areas so that they inherit the gutter
background by default.
(extend_face_to_end_of_line): Compute 'margin_fill_face_id' from the
'margin' face.  Use while loops to explicitly fill all empty character
slots in both left and right margins for both GUI and TTY branches.
(display_line): Call 'extend_face_to_end_of_line' for beyond-EOB rows
when the window has margins.  Also extend the existing condition for
text rows with empty margins to trigger when the 'margin' face
background differs from the frame default, not only when the default
face is remapped.
* src/xfaces.c (realize_basic_faces): Realize 'margin' as a basic
face to support face-remapping and efficient lookup.
(Bug#80693)
2026-05-05 11:21:57 +03:00
Stefan Monnier
a952324e9b keyboard.c: Allow SIGINT to quit in batch mode, instead of exit
In terminal sessions, SIGINT is turned into a `quit` ELisp signal,
but in batch it has traditionally killed Emacs.  It can be very
useful to cause a `quit` from outside the process when running
in batch (e.g. for "batch" sessions that provide a REPL via stdin/out),
so add a new var 'kill-emacs-on-sigint' to control that behavior.
(bug#80942)

* src/keyboard.c (handle_interrupt_signal): Obey `kill_emacs_on_sigint`.
(init_keyboard): Use `deliver_interrupt_signal` for SIGINT also for
batch sessions.
(syms_of_keyboard): New variable `kill_emacs_on_sigint`.

* test/src/keyboard-tests.el (keyboard-sigint-to-quit): New test.

* doc/emacs/cmdargs.texi (Initial Options): Mention the effect of
`kill-emacs-on-sigint` in batch mode.
2026-05-04 12:49:35 -04:00
Dmitry Gutov
9ff0768804 Re-add a call to clear_under_internal_border in clear_garbaged_frames
* src/xdisp.c (clear_garbaged_frames): Re-add the call to
clear_under_internal_border, reverting that part of commit
a6a3b32208 as not essential to the fix (bug#80662).
2026-05-04 05:22:03 +03:00
Eli Zaretskii
d51a472231 ; * src/sfnt.c (sfnt_read_name_table): Avoid 32-bit overflow. 2026-05-02 14:17:14 +03:00
Eli Zaretskii
0d0891c1bb ; Fix an issue with counting glyphs on TTY frames
* src/dispnew.c (fake_current_matrices): Fix the 'used' count of
glyphs for the right margin and the text-area.  (Bug#80900)
2026-05-02 13:26:46 +03:00
Eli Zaretskii
1b14d6f92b * src/.gdbinit: Ignore SIGPIPE. (Bug#80911) 2026-05-02 10:03:53 +03:00
Dmitry Gutov
6cd5b16dd0 Resize child frames with GTK3 immediately too
* src/gtkutil.c (xg_frame_set_char_size): Resize child frame and
its GTK widget hierarchy immediately.  Update the "desired" Cairo
surface dimensions.  Skip waiting for events. (bug#80662)
Remove the unnecessary call to clear_under_internal_border.
2026-05-01 04:57:49 +03:00
Dmitry Gutov
73fe7a7097 Simplify the fullscreen adjustment in xg_frame_set_char_size
* src/gtkutil.c (xg_frame_set_char_size): Simplify.  Use the
fullscreen value check to alter the values of outer_width and
outer_height rather than have several larger branches (bug#80662).
2026-05-01 04:57:49 +03:00
Dmitry Gutov
049a94b4e5 Remove the effect of x_gtk_resize_child_frames=hide
* src/gtkutil.c (xg_frame_set_char_size): Remove the effect of
x_gtk_resize_child_frames, effectively reverting that part of
c49d379f17 (bug#80662).

* src/pgtkfns.c (syms_of_pgtkfns): Remove defsyms Qhide and
Qresize_mode, never used with PGTK.

* src/xfns.c (x-gtk-resize-child-frames): Update docstring.
2026-05-01 04:57:49 +03:00
Dmitry Gutov
83b19f4d0f Don't wait out the whole event timeout unnecessarily
* src/xterm.c (x_wait_for_event): If f->wait_event_type has been
cleared (in handle_one_xevent), don't go into pselect wait.

* src/androidterm.c (android_wait_for_event): Likewise.
2026-05-01 04:57:49 +03:00
Dmitry Gutov
a6a3b32208 Try to resize or resize-and-move child frames in one update
This pertains to X11 toolkit builds.  Other ports (including
PGTK) seem to have mostly atomic window updates already.

* src/xterm.c (x_set_window_size_1): Resize the Xt widget eagerly,
so the next redraw is not clipped.  Update the "desired" Cairo
surface dimensions.  Skip waiting for next XEvent.  Do all that
for child frames only.  Update old comments (bug#80662).
(x_set_window_size_and_position_1): Same.  Also clear the widget's
cached position coordinates (we don't keep them up to date).
(x_set_window_size, x_set_window_size_and_position): Skip
redrawing the border on child frames, it will happen during
redisplay anyway.

* src/gtkutil.c (xg_frame_set_size_and_position): On child
frames, resize the GTK widget hierarchy immediately.  Update the
"desired" Cairo surface dimensions.  Skip waiting for events.

* src/widget.c (EmacsFrameResize):
When resize should be a no-op, exit early (minor optimization).
(EmacsFrameExpose): Redraw the border on the last Expose event.

* src/xdisp.c (clear_garbaged_frames): Don't redraw borders here.

* src/xfns.c (x_window): Undo the previous change in bit_gravity
in the no-toolkit build.  StaticGravity works the best for it
thanks to no nesting in window configuration.
2026-05-01 04:57:49 +03:00
Paul Eggert
da4ab3d738 Pacify GCC 16.0.1 -Wanalyzer-null-dereference in xdisp.c
* src/xdisp.c (glyph_string_containing_background_width):
Although it’s not immediately obvious whether the GCC 16 warning
is valid, adding an eassume here shouldn’t hurt.
2026-04-30 17:56:26 -07:00