Releases: sxyazi/yazi
Nightly Build
From commit: 157156b
Generated on: 2025-10-22 04:38 UTC
v25.5.31
This is a maintenance release, focusing on bug fixes.
What's Changed
- fix: expose
ui.Wrapby @sxyazi in #2810 - fix:
forward --end-of-wordof the input should consider the mode's delta by @sxyazi in #2811 - fix: make every effort to carry hidden states for dummy files by @sxyazi in #2814
Full Changelog: v25.5.28...v25.5.31
v25.5.28
Breaking Changes
[manager]is deprecated in favor of the new[mgr]. #2803tab_widthhas been removed as it no longer needs to be set manually. #2745tab_activeandtab_inactiveare moved under the new[tabs]section. #2745sixel_fractionhas been removed as it's no longer needed. #2707
Deprecated
ya.mgr_emit(),ya.app_emit()andya.input_emit()are deprecated. #2653ya.preview_widgets()is deprecated. #2706Command:args()is deprecated. #2752- The
ya packsubcommand is deprecated. #2770 LEFT,CENTER,RIGHTonui.Line,ui.Textare deprecated. #2802NONE,TOP,RIGHT,BOTTOM,LEFT,ALLonui.Bar,ui.Borderare deprecated. #2802WRAP_NO,WRAP,WRAP_TRIMonui.Textare deprecated. #2802
Redesign Tabs
#2745 decouples tabs from the header into an independent tab bar component to enhance UX:
- A standalone single-line component increases the available space for displaying tabs.
- Tab titles are displayed by default to increase recognizability.
- Supports switching tabs via mouse for easier navigation.
The new tab bar is only shown when there is more than one tab, ensuring no space is wasted for users who don't use tabs.
442474569-5ac79095-9a4a-444e-894a-e6ee0e992815.mp4
Calculate Real-Time Directory Size in Spotter
#2695 adds directory sizes to the folder spotter. The size is computed dynamically in real time and asynchronously, which means:
- Every time a user clicks
<Tab>on a directory, the latest size is calculated. - For large directories, real-time changes in size are reported to the user, with "(?)" appended at the end to indicate that the calculation is in progress.
- If the user closes the spotter or switches directories using the left/right arrow keys, any ongoing calculations will be canceled to avoid wasting resources.
Also, the computed directory size will be updated in the file list:
- If the user sets
linemode = size, the latest size will be shown on the right of the file line. - If the user sets
sort_by = size, the file list will be sorted by the latest sizes (if necessary).
438794791-568ca1b2-5858-4f38-a053-a099dffa3b1c.mp4
9x Faster Sixel Image Preview
#2707 replaces the existing neural network quantization algorithm with Wu's Color Quantizer, which offers better performance while maintaining comparable quality.
Old implementation (neural network via color_quant, with default sixel_fraction = 20) β average 189.5763999ms:
time: 190.025ms
time: 191.054417ms
time: 187.696792ms
time: 188.060791ms
time: 189.381958ms
time: 191.618042ms
time: 192.383125ms
time: 190.511291ms
time: 187.8395ms
time: 187.193083msNew implementation (Wu - sRGB via quantette) β average 20.9199916ms:
time: 21.226458ms
time: 20.719542ms
time: 21.207583ms
time: 20.815875ms
time: 21.071291ms
time: 21.273459ms
time: 20.811792ms
time: 20.723166ms
time: 20.52675ms
time: 20.824mspiper.yazi Plugin
With piper.yazi, you can use the output of any shell command as preview content. This eliminates the need to write a separate plugin for each command, making the use of custom previewers much more convenient.
See https://github.com/yazi-rs/plugins/tree/main/piper.yazi#examples for more examples!
Double Directory Size Calculation Speed
#2683 greatly improves directory computation performance by dividing the task into chunks and reusing existing threads. Directory sorting and file trashing will be observably twice as fast.
Run the benchmark script against a 10.16GB folder 5 times in release mode:
Old: elapsed 759.877791ms
New: elapsed 364.802583ms
Old: elapsed 734.5155ms
New: elapsed 360.103375ms
Old: elapsed 734.124167ms
New: elapsed 365.662458ms
Old: elapsed 733.27325ms
New: elapsed 365.694042ms
Old: elapsed 743.394875ms
New: elapsed 364.455083msInput Component Now Supports Password Mode
With #2675, a new obscure = true option is available:
local value = ya.input {
title = "Password:",
obscure = true,
position = { "center", w = 50 },
}screenshot-002319.mp4
Truncate Long Items in the File List
#2754, #2759, and #2778 add truncation support for long filenames in the file list and archive preview, and display file extensions at the end, ensuring that even if a filename is truncated, you can still know what file type it is by its extension.
screenshot-002518.mp4
types.yazi Plugin
For a long time, Yazi lacked a type definition file, which made plugin development very painful. Now, it's here!
types.yazi provides type definitions for Yazi's Lua API, empowering an efficient plugin development experience.
Improved Built-In Previewers
- The
videopreviewer now supports displaying embedded video covers, #2640 - The
magickpreviewer will respect the user'simage_allocandimage_boundsettings, to limit its maximum resource usage, #2602, thanks to @ze0987 - The
videopreviewer will respect the user'smax_widthsetting, #2560, thanks to @ze0987
Improve Path Auto-Completion Results
The auto-completion results for interactive cd (key: g => <Space>) will now more closely match the user's input keywords.
Done in #2765
What's Changed
- fix: reverse the mixing order of theme and flavor configuration by @sxyazi in #2594
- feat: limit memory usage for previewing large images by @ze0987 in #2602
- fix: respect the user's
max_widthsetting for the built-in video previewer by @ze0987 in #2560 - feat: allow custom exit code with
quit --codeby @Nicholas42 in #2609 - fix: ensure state synchronization even when the package update fails midway by @sxyazi in #2613
- fix: do not change revision when package deployment fails by @sxyazi in #2627
- feat: copy-on-write support for field caching by @sxyazi in #2629
- feat: fall back to
CSI 16 twhen PowerShell OpenSSH returns a fake terminal size by @sxyazi in #2636 - feat: support embedded cover for video preview by @sxyazi in #2640
- fix: lazily update files to avoid triggering issues dependent on sort order by @sxyazi in #2643
- feat: new
ya.emit()API by @sxyazi in #2653 - feat: fine-grained
peekandwatchby @sxyazi in #2655 - feat: new
--no-dummyoption forrevealcommand by @sxyazi in #2664 - feat: obscure input component for inputting passwords by @sxyazi in #2675
- feat: increase the maximum allowed value of
sixel_fractionto30by @sxyazi in #2682 - perf: double directory size calculation speed by @sxyazi in #2683
- feat: new
fs.calc_size()API by @sxyazi in #2691 - feat: promote
Idto a first-class type by @sxyazi in #2692 - feat: calculate real-time directory size in spotter by @sxyazi in #2695
- feat: checks in
ya pubandya emitsubcommands to verify receiver exists and has necessary abilities by @sxyazi in #2696 - feat: add
sandSkeybinds in the input component by @hankertrix in #2678 - fix: no title is set when starts the first time by @sxyazi in #2700
- refactor: move
ttyto the newyazi-termcrate by @sxyazi in #2701 - feat: show error when image preview fails by @sxyazi in #2706
- feat!: 9x faster Sixel image preview by @sxyazi in #2707
- fix: reset the cursor position with
arrow()after deleting files by @sxyazi in #2708 - fix:
ya pub-to 0checks if any peer is able to receive the message ...
v25.4.8
Breaking Changes
- Supported wraparound navigation and enabled it by default. #2485
- Replaced
tasks_showandclose_inputwithtasks:showandinput:close. #2530 frag,name,stem,ext, andparentonUrl,nameontab::Tab, andis_hoveredonfs::Fileare now properties. #2572- Swapped the default key bindings for
z(zoxide) andZ(fzf). #2546 - Used the new
@sync peekannotation instead of the previewer'ssync = true. #2487
Deprecated
ui.Paddingandui.Rect:padding()are deprecated. #2574
Packaging
- SVG preview backend switched from ImageMagick to
resvgand implemented as a newsvgpreviewer. #2533, #2581
Custom Search Engine Lua API
With #2452, you can create custom search engines via the Lua API, meaning that plugins can serve as the source for search view file lists.
A new plugin vcs-files.yazi is available to display the list of files changed in Git within Yazi:
420258569-465b801b-3516-4f57-be09-8405da21e34d.mp4
Platform-Specific Key Binding
#2526 adds a new optional for field to key bindings to specify the platform the key binding applies to.
For example:
{ on = [ 'g', 'd' ], run = 'cd ~/dev', desc = 'Go dev', for = 'unix' },
{ on = [ 'g', 'd' ], run = 'cd C:\dev', desc = 'Go C:\dev', for = 'windows' },Performance Improvements
This version brings several performance enhancements:
- Configuration parser has been rewritten to double the startup speed. #2508
- AVIF, HEIF, and JPEG XL previews have seen significant performance improvements. #2533, thanks @ze0987
- Compiled and cached the Lua bytecode to enhance the overall performance of the plugin system. #2490
Enhance fzf Integration
Now, you can select multiple files in fzf, and the selected files will also be selected in Yazi.
Also, you can now view, navigate, and deselect the file selection list from Yazi within fzf.
428400784-c120282b-a029-4cde-9092-699115318491.mp4
See #2546 for more details.
Use Yazi File Manager Directly in Helix, Without Zellij or tmux
#2461 adapted Yazi to support Helix's :insert-output, which means you can now run Yazi directly within Helix β it even supports image and video previews!
420651139-17a370d5-ee50-4cfa-8292-ed3159058ac6.mp4
New prev and next Arguments to arrow for Wraparound Navigation
Circular navigation is one of the long-requested features, and is now supported via the new arrow prev and arrow next commands in #2485.
New follow Command to Follow Files Pointed to by Symlinks
#2543 adds support for following files pointed to by symlinks.
A new key binding, g => f (follow hovered symlink), has been added to use this feature.
Allow Initializing Input When Opening It with Commands Like rename, create, find, filter, etc.
With #2578, you can now customize the input box opened by commands such as create, rename, cd, filter, find, search, and shell. For example:
{ on = "r", run = [ "rename", "input:escape" ] }This will open the rename input box and exit insert mode, meaning that the default state will be normal mode.
What's Changed
- feat: new
<C-A>and<C-E>keybindings to select entire line for the input component by @sxyazi in #2439 - fix: reserve a hack for Zellij to force an image adapter by @sxyazi in #2441
- feat: new
rt.termexports terminal emulator information by @sxyazi in #2442 - fix: always show the size in the status bar even in empty directories by @sxyazi in #2449
- feat: allow
tab_swapto cycle tabs by @sxyazi in #2456 - feat: support using Yazi in Helix directly without Zellij or tmux by @sxyazi in #2461
- refactor: prefer
WriteConsoleWfor Windows console output by @sxyazi in #2464 - ci: add label only if not removed manually by @sxyazi in #2470
- fix: force ANSI for keyboard progressive enhancement on Windows by @sxyazi in #2474
- feat: new
fs.expand_urlAPI by @sxyazi in #2476 - feat!: file navigation wraparound with new
arrow prevandarrow nextcommands by @sxyazi in #2485 - feat!: new
@sync peekannotation for sync previewers by @sxyazi in #2487 - perf: lazy compile and cache lua plugins as binary bytecode by @sxyazi in #2490
- feat: new
basefield for theUrluserdata by @sxyazi in #2492 - feat: allow repositioning the cursor in the
renameDDS event by @sxyazi in #2521 - feat: new
symlink_targetto style the target of symbolic links by @sxyazi in #2522 - feat: platform-specific key binding by @sxyazi in #2526
- feat: show error message when directory fails to load by @sxyazi in #2527
- feat: allow bulk renaming to include trailing content in addition to the required new names by @MikuGeek in #2494
- refactor!: remove unnecessary
tasks_showandclose_inputcommands by @sxyazi in #2530 - perf!: faster image preview with optimized
magickarguments by @ze0987 in #2533 - feat!: support
arrow prevandarrow nextfor more components by @XOR-op in #2540 - feat: clear terminal before displaying EXIF data by @Integral-Tech in #2541
- feat: new
followcommand to follow files pointed to by symlinks by @sxyazi in #2543 - fix: always check whether the cursor exceeds the upper bound to guard against unexpected values by @sxyazi in #2551
- feat!: enhance
fzfintegration by @sxyazi in #2553 - feat: support Warp terminal image preview by @sxyazi in #2571
- feat: allow initializing input when opening it with commands like
rename,create,find,filter, etc. by @sxyazi in #2578 - fix: ignore XQuartz
$DISPLAYvariable by @sxyazi in #2586 - fix: don't fail on videos with embedded images by @ze0987 in #2590
New Contributors
Full Changelog: v25.3.2...v25.4.8
v25.3.2
This is a quick fix release that addresses the issue where, under SSH, terminal response sequences are not completely consumed and are leaked to the screen.
Thanks to @Crdr0122 and @SpookyYomo for reporting and helping reproduce the issue!
What's Changed
- feat: expose all theme fields in Lua by @hankertrix in #2405
- fix:
windows-sysfeatures forWin32_Storage_FileSystemandWin32_System_Threadingby @sxyazi in #2417 - fix: ignore stdin redirection to ensure always accessing the real tty by @sxyazi in #2425
- fix:
STDIN_FILENOpoll always returns 0 under SSH by @sxyazi in #2427 - feat: expose almost the entirety of the user's configuration in Lua by @hankertrix in #2413
- chore: bump version to 25.3.2 by @sxyazi in #2428
Full Changelog: v25.2.26...v25.3.2
v25.2.26
Breaking Changes
separator_openandseparator_closehave been replaced with the newsep_leftandsep_right. #2313- The
[completion]component has been renamed to[cmp]. #2399
Deprecated
MANAGER,PREVIEW,PLUGIN, andTHEMEhave been deprecated in favor of the newrtandth. #2389ya.manager_emit()has been deprecated in favor of the newya.mgr_emit(). #2397
Built-in Previewer Improvements
- The JSON previewer will now respect the user's
wrapsetting to support automatic JSON line wrapping. #2337, thanks @boydaihungst - The PDF previewer will now respect the user's
max_widthsetting to address the issue of previewing content that is too small. #2331 - The ImageMagick previewer will now respect the user's
image_allocsetting to limit memory usage. #2403
New Search Engine: rga
#2383 (thanks @paperbenni) has added a new ripgrep-all search engine.
It is a wrapper around ripgrep that supports additional file formats (such as PDF, docx, epub, etc.).
You can use it with the search --via=rga command.
Allow to Specify Layer for Keymap Commands
With #2399, you'll now be able to assign commands from different layers to a keybinding in keymap.toml.
This opens up the possibility of interacting with any other component, such as accessing commands from the manager ([manager]) within the input component ([input]):
[[input.prepend_keymap]]
on = "<Esc>"
run = [ "close", "mgr:escape --filter" ]
desc = "Close input and cancel the filter"When you press Esc in the input box to exit the filter view (triggered by the f key), the filter will be canceled as the input is closed.
More Flexible Status Bar Customization
#2313 (thanks @PFiS1737) introduces sep_left and sep_right to replace the previous separator_open and separator_close settings, allowing different separators to be set for the left and right sides:
Support for Setting Spotter Table Styles
#2391 introduces two new settings, tbl_col and tbl_cell, in theme.toml to configure the styles for spotter table columns and cells, respectively.
What's Changed
- feat!: allow different separators to be applied individually to the left and right sides of the status bar by @PFiS1737 in #2313
- fix: load mount points with the best effort even if the
/dev/disk/by-labeldirectory does not exist by @sxyazi in #2326 - feat: CSI-based Vim and Neovim built-in terminal detection for better accuracy by @sxyazi in #2327
- feat: respect the user's
max_widthsetting for the built-in PDF preloader by @sxyazi in #2331 - feat: respect the user's
wrapsetting for the built-in JSON previewer by @boydaihungst in #2337 - refactor: consistent naming for enum variants by @sxyazi in #2339
- feat: new
externalandremovablefields in thefs.partitions()API by @sxyazi in #2343 - feat: terminal response detection under async stdin by @sxyazi in #2347
- fix: incorrect kebab-case for the notify level enum by @hankertrix in #2349
- fix: add maximum preview limit under
/procvirtual file system by @sxyazi in #2355 - feat: add a link to the debugging instructions in
yazi --debugby @sxyazi in #2365 - fix: didn't reset previous
Chawhen loading directories in chunks by @sxyazi in #2366 - feat: make incompatible version message more clear by @sxyazi in #2377
- feat: bump
trashandlibcversions to support NetBSD by @sxyazi in #2388 - feat: new
rtandthallow to access user configuration and theme scheme in sync/async plugins consistently by @sxyazi in #2389 - feat: new
tbl_colandtbl_cellin theme system for spotter table styling by @sxyazi in #2391 - feat: add ripgrep-all support for search by @paperbenni in #2383
- feat: new
cf.argsto access startup arguments by @sxyazi in #2392 - refactor: rename
cftortby @sxyazi in #2393 - feat: expose
modefield inChaby @sxyazi in #2394 - refactor: rename
rt.managertort.mgr, andth.managertoth.mgrby @sxyazi in #2397 - feat!: allow to specify layer for keymap commands by @sxyazi in #2399
New Contributors
- @PFiS1737 made their first contribution in #2313
- @paperbenni made their first contribution in #2383
Full Changelog: v25.2.11...v25.2.26
v25.2.11
This is a quick fix release that addresses a few issues introduced in the previous version 25.2.7.
Besides that, a new overall option has been added under [status] in theme.toml, which allows you to set the overall style of the status bar, specifically the empty area in the center:
[status]
overall = { fg = "#cad3f5", bg = "#181926" }See #2321 for details.
What's Changed
- fix: reverse the order of CSI-based and environment-based terminal detection by @sxyazi in #2310
- feat: reduce terminal response wait timeout by @sxyazi in #2314
- fix: unable to delete sealed files on Windows due to platform differences by @sxyazi in #2319
- feat: new
overalloption under[status]to allow specifying the overall style of the status bar by @sxyazi in #2321 - chore: bump version to 25.2.11 by @sxyazi in #2323
Full Changelog: v25.2.7...v25.2.11
v25.2.7
Deprecated
ya.md5()has been deprecated in favor of the newya.hash(), in #2168- The plugin entry file
init.luahas been deprecated in favor of the newmain.lua, in #2168 arrow -99999999andarrow 99999999have been deprecated in favor of the newarrow topandarrow bot, in #2294- The
--argsoption in theplugincommand has been deprecated in favor of a new 2nd positional parameter, in #2299 - The numeric return value of the preloader has been deprecated in favor of a new boolean return value, in #2253
The mount.yazi Plugin
For a long time, I've been receiving requests from users for a mount manager, but never had the time to finish it. But now β it's here!
mount.yazi provides disk mount, unmount, and eject functionality:
404254109-c6f780ab-458b-420f-85cf-2fc45fcfe3a2.mp4
Done in #2199.
Simplification of shell and plugin commands
With #2298, you can now write shell scripts directly after -- (end of options marker). Everything after -- will be treated as raw text, so no more escaping is required, greatly simplifying the writing of complex commands.
For example, previously, a simple echo "hello 'world'" would look like this:
[[manager.prepend_keymap]]
on = "<C-e>"
run = '''
shell --block 'echo "hello '\''world'\''"'
'''This resulted in nested quotes, which was error-prone and unintuitive.
Now, you can directly include the entire shell script as plain text after -- without any escaping:
[[manager.prepend_keymap]]
on = "<C-e>"
run = '''
shell --block -- echo "hello 'world'"
'''Similarly, with #2299, the plugin command usage has been simplified as well. For instance:
[[manager.prepend_keymap]]
on = "<C-e>"
run = "plugin search --args='\'hello world\''"Can now be written as:
[[manager.prepend_keymap]]
on = "<C-e>"
run = "plugin search -- 'hello world'"Replace Mode and Vim Motions (W, E, B, ^, _) for Inputs
The Input component now supports replace mode and several new Vim motions, including:
W: Move forward to the start of the next WORDE: Move forward to the end of the current or next WORDB: Move back to the start of the current or previous WORD^: Move to the first non-whitespace character_: Move to the first non-whitespace character
Thanks to @dxrcy for the work in #2143!
Package Manager Enhancements
The package manager now supports the following new features:
ya pack -dto delete a package (thanks @MrAsler, #2181)- Support for adding and removing multiple packages with a single command (thanks @evpeople, #2257)
Support Local tmux Image Preview Over SSH
Now, when you start tmux locally, connect to a remote SSH session, and run Yazi on the remote host, you'll get image preview support out of the box.
Done in #2229.
New @since Plugin Annotation to Specify the Minimum Supported Yazi Version
You can now optionally specify the minimum supported Yazi version in your plugin:
--- @since 25.2.7
return {
entry = function() end
}If specified, and the user's Yazi version is lower than the given version, they will receive an error message preventing the plugin from running accidentally.
Done in #2290
New ya.confirm() API
The new ya.confirm() API allows you to show a confirmation prompt to the user:
local answer = ya.confirm {
pos = { "center", w = 40, h = 10 },
title = "Test",
content = "Hello, World!",
}You can also apply a UI element to the title and content to customize the appearance:
local answer = ya.confirm {
pos = { "center", w = 40, h = 10 },
title = ui.Line("Test"):fg("yellow"):bold(),
content = ui.Text("Hello, World!"):bg("red"):fg("#ffffff"),
}v0.4.2
This is a quick patch release with 3 fixes:
- Fixed an issue where switching directories in Yazi didn't update the CWD, causing issues with features that depend on the CWD (like terminal splitting and
cd --interactivepath completion). - Fixed a bug where the UI wouldn't refresh when returning to Yazi from an external blocking process (like a shell) while in an empty directory.
- Fixed an issue where the preview wouldn't update after sorting directories when using the Folder-specific rules tip.
Here are some new features:
- Added support for a large number of new archive formats for extraction, previewing, and filetype highlighting in #1926 (thanks to @Integral-Tech).
- Added a new temporary option
_v4_suppress_deprecation_warningsin #2027 to suppress all deprecation warnings as a workaround for the transition to version 0.4:# yazi.toml [manager] _v4_suppress_deprecation_warnings = true
- Added 2 new Lua APIs
fs.cwd()- get the current working directoryfs.create()- create a directory (Thanks to @hankertrix)
What's Changed
- fix: interactive
cdautocomplete doesn't follow the latestCWDchanges by @sxyazi in #2025 - feat: new option to suppress 0.4 deprecation warnings by @sxyazi in #2027
- fix: offset cursor shift when deleting multiple files in bulk by @sxyazi in #2030
- chore: bump version to 0.4.2 by @sxyazi in #2031
- fix: choose a more conservative
macro_workersvalue to ensure concurrency safety with certain USB flash drives by @sxyazi in #2040 - feat: support for Android platform in the
forqualifier of opener by @sxyazi in #2041 - fix: set the current working directory in a thread-safe way by @sxyazi in #2043
- fix:
allow-passthroughmust be set toonto preventtmuxfrom forwarding the real terminal's response to the inactive pane by @sxyazi in #2052 - fix: pass through
show_hiddenwhen building defaultFilesby @sxyazi in #2057 - fix: use a less intrusive
DSRinstead ofDA1workaround to forward terminal responses twice intmuxby @sxyazi in #2058 - feat: new
--cwdparameter for theshellcommand andfs.cwd()API by @sxyazi in #2060 - feat: allow
noopfor single-key chords by removing the mixing length limit by @sxyazi in #2064 - ci: add riscv64gc-unknown-linux-gnu target by @Integral-Tech in #2067
- fix: missing a render after resuming from an external blocking process by @sxyazi in #2071
- feat: add more supported archive formats to the preset config by @Integral-Tech in #1926
- feat: new
fs.create()Lua API by @hankertrix in #2068 - fix: missing a hover after reordering from an external plugin by @sxyazi in #2072
Full Changelog: v0.4.1...v0.4.2
v0.4.1
This is a quick patch version with 4 fixes:
- Fixed an issue where Yazi would freeze when waiting for terminal response, in old tmux versions (v3.2a or lower), or 2-layer nested terminal setup (tmux -> Neovim's
:terminal-> Yazi). - Fixed a bug in the Γberzug++ backend where certain image dimension parsing failed, preventing images from displaying.
- Fixed a build failure for Android 32-bit architectures.
- Fixed an issue with the preset
archiveandjsonplugins not handling CRLF properly on Windows.
What's Changed
- fix: disable passthrough when the user launches Yazi in Neovim inside tmux by @sxyazi in #2014
- refactor: replace
format!withconcat!for string literals by @Integral-Tech in #2012 - fix: correctly handle CRLF on Windows in preset
archiveandjsonplugins by @sxyazi in #2017 - fix: failed to parse certain image dimensions for Γberzug++ backend by @sxyazi in #2020
- chore: bump version to 0.4.1 by @sxyazi in #2022
Full Changelog: v0.4.0...v0.4.1