commit 60e1cc703c2432455a294587cdc91ee9032b609c
Author: Plat <plat@stellar-nexus.ru>
Date: Mon, 22 Jul 2024 22:28:45 +0300
Initial commit
Diffstat:
41 files changed, 13529 insertions(+), 0 deletions(-)
diff --git a/bash_profile b/bash_profile
@@ -0,0 +1,17 @@
+# /etc/skel/.bash_profile
+
+# This file is sourced by bash for login shells. The following line
+# runs your .bashrc and is recommended by the bash info pages.
+if [[ -f ~/.bashrc ]] ; then
+ . ~/.bashrc
+fi
+[ -f $HOME/.bashrc ] && . $HOME/.bashrc
+if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then
+ exec startx
+fi
+#if shopt -q login_shell; then
+# [[ -f ~/.bashrc ]] && source ~/.bashrc
+# [[ -t 0 && $(tty) == /dev/tty1 && ! $DISPLAY ]] && exec startx
+#else
+# exit 1 # Somehow this is a non-bash or non-login shell.
+#fi
diff --git a/config/discord/README b/config/discord/README
@@ -0,0 +1,2 @@
+This folder goes into /local/share/discord/
+You need qutebrowser for it to work. Need a second profile too
diff --git a/config/discord/autoconfig.yml b/config/discord/autoconfig.yml
@@ -0,0 +1,10 @@
+# If a config.py file exists, this file is ignored unless it's explicitly loaded
+# via config.load_autoconfig(). For more information, see:
+# https://github.com/qutebrowser/qutebrowser/blob/main/doc/help/configuring.asciidoc#loading-autoconfigyml
+# DO NOT edit this file by hand, qutebrowser will overwrite it.
+# Instead, create a config.py - see :help for details.
+
+config_version: 2
+settings:
+ content.media.audio_capture:
+ https://discord.com: false
diff --git a/config/discord/bookmarks/urls b/config/discord/bookmarks/urls
diff --git a/config/discord/config.py b/config/discord/config.py
@@ -0,0 +1,213 @@
+from qutebrowser.api import interceptor
+# Autogenerated config.py
+#
+# NOTE: config.py is intended for advanced users who are comfortable
+# with manually migrating the config file on qutebrowser upgrades. If
+# you prefer, you can also configure qutebrowser using the
+# :set/:bind/:config-* commands without having to write a config.py
+# file.
+#
+# Documentation:
+# qute://help/configuring.html
+# qute://help/settings.html
+
+# Change the argument to True to still load settings configured via autoconfig.yml
+config.load_autoconfig(False)
+
+# Which cookies to accept. With QtWebEngine, this setting also controls
+# other features with tracking capabilities similar to those of cookies;
+# including IndexedDB, DOM storage, filesystem API, service workers, and
+# AppCache. Note that with QtWebKit, only `all` and `never` are
+# supported as per-domain values. Setting `no-3rdparty` or `no-
+# unknown-3rdparty` per-domain on QtWebKit will have the same effect as
+# `all`. If this setting is used with URL patterns, the pattern gets
+# applied to the origin/first party URL of the page making the request,
+# not the request URL. With QtWebEngine 5.15.0+, paths will be stripped
+# from URLs, so URL patterns using paths will not match. With
+# QtWebEngine 5.15.2+, subdomains are additionally stripped as well, so
+# you will typically need to set this setting for `example.com` when the
+# cookie is set on `somesubdomain.example.com` for it to work properly.
+# To debug issues with this setting, start qutebrowser with `--debug
+# --logfilter network --debug-flag log-cookies` which will show all
+# cookies being set.
+# Type: String
+# Valid values:
+# - all: Accept all cookies.
+# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail.
+# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty.
+# - never: Don't accept cookies at all.
+config.set('content.cookies.accept', 'all', 'chrome-devtools://*')
+
+# Setting dark mode
+config.set("colors.webpage.darkmode.enabled", False)
+
+# Which cookies to accept. With QtWebEngine, this setting also controls
+# other features with tracking capabilities similar to those of cookies;
+# including IndexedDB, DOM storage, filesystem API, service workers, and
+# AppCache. Note that with QtWebKit, only `all` and `never` are
+# supported as per-domain values. Setting `no-3rdparty` or `no-
+# unknown-3rdparty` per-domain on QtWebKit will have the same effect as
+# `all`. If this setting is used with URL patterns, the pattern gets
+# applied to the origin/first party URL of the page making the request,
+# not the request URL. With QtWebEngine 5.15.0+, paths will be stripped
+# from URLs, so URL patterns using paths will not match. With
+# QtWebEngine 5.15.2+, subdomains are additionally stripped as well, so
+# you will typically need to set this setting for `example.com` when the
+# cookie is set on `somesubdomain.example.com` for it to work properly.
+# To debug issues with this setting, start qutebrowser with `--debug
+# --logfilter network --debug-flag log-cookies` which will show all
+# cookies being set.
+# Type: String
+# Valid values:
+# - all: Accept all cookies.
+# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail.
+# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty.
+# - never: Don't accept cookies at all.
+config.set('content.cookies.accept', 'all', 'devtools://*')
+
+# Value to send in the `Accept-Language` header. Note that the value
+# read from JavaScript is always the global value.
+# Type: String
+config.set('content.headers.accept_language', '', 'https://matchmaker.krunker.io/*')
+
+# User agent to send. The following placeholders are defined: *
+# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
+# The underlying WebKit version (set to a fixed value with
+# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
+# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
+# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
+# QtWebEngine. * `{upstream_browser_version}`: The corresponding
+# Safari/Chrome version. * `{qutebrowser_version}`: The currently
+# running qutebrowser version. The default value is equal to the
+# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
+# read from JavaScript is always the global value. With QtWebEngine
+# between 5.12 and 5.14 (inclusive), changing the value exposed to
+# JavaScript requires a restart.
+# Type: FormatString
+config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/{webkit_version} (KHTML, like Gecko) {upstream_browser_key}/{upstream_browser_version} Safari/{webkit_version}', 'https://web.whatsapp.com/')
+
+# User agent to send. The following placeholders are defined: *
+# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
+# The underlying WebKit version (set to a fixed value with
+# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
+# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
+# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
+# QtWebEngine. * `{upstream_browser_version}`: The corresponding
+# Safari/Chrome version. * `{qutebrowser_version}`: The currently
+# running qutebrowser version. The default value is equal to the
+# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
+# read from JavaScript is always the global value. With QtWebEngine
+# between 5.12 and 5.14 (inclusive), changing the value exposed to
+# JavaScript requires a restart.
+# Type: FormatString
+config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:90.0) Gecko/20100101 Firefox/90.0', 'https://accounts.google.com/*')
+#Ad/Tracker blocking
+def filter_discord(info: interceptor.Request):
+ url=info.request_url
+ if (
+ url.host()=="discord.com"
+ and url.path()=="/api/v9/science"
+ ):
+ info.block()
+
+interceptor.register(filter_discord)
+
+#Start pages
+config.set('url.default_page', 'https://discord.com/channels/@me')
+c.url.start_pages = ['https://discord.com/channels/@me']
+
+#File manager
+config.set("fileselect.handler", "external")
+config.set("fileselect.single_file.command", ['st', '-e', 'ranger', '--choosefile', '{}'])
+config.set("fileselect.multiple_files.command", ['st', '-e', 'ranger', '--choosefiles', '{}'])
+
+#Color scheme
+config.set('colors.completion.category.bg', '#667bc4')
+config.set('colors.completion.odd.bg', '#313338')
+config.set('colors.completion.even.bg', '#1e1f22')
+config.set('colors.completion.item.selected.bg', '#5b209a')
+config.set('colors.completion.item.selected.fg', 'white')
+config.set('colors.completion.item.selected.border.bottom', '#7e61ab')
+config.set('colors.completion.item.selected.border.top', '#7e61ab')
+config.set('colors.statusbar.normal.bg', '#313338')
+config.set('colors.hints.bg', '#5b209a')
+config.set('colors.hints.fg', 'white')
+config.set('hints.border', '1px solid #cab2fb')
+config.set('colors.tabs.bar.bg', '#313338')
+config.set('colors.tabs.odd.bg', '#313338')
+config.set('colors.tabs.even.bg', '#313338')
+config.set('colors.tabs.selected.odd.bg', '#313338')
+config.set('colors.tabs.selected.even.bg', '#313338')
+
+#Bindings for normal mode
+config.bind('h', 'back')
+config.bind('j', 'tab-prev')
+config.bind('k', 'tab-next')
+config.bind('l', 'forward')
+config.bind('J', 'tab-prev')
+config.bind('K', 'tab-next')
+config.bind('m', 'hint links spawn -d /home/plat/scripts/append_music.sh')
+config.bind('M', 'hint links spawn ./scripts/play_video.sh {hint-url}')
+config.bind('I', 'hint links spawn mpv --loop=inf --pause {hint-url}')
+config.bind('<', 'spawn ./scripts/discord_min.sh')
+config.bind('>', 'spawn ./scripts/discord_big.sh')
+config.bind('G', 'spawn ./scripts/discord_bottom.sh')
+config.bind('D', 'spawn ./scripts/discord_recent.sh')
+config.bind('s', 'click-element position 350,1030;; cmd-later 1 click-element id channel-attach-upload-file')
+config.bind('/', 'spawn ./scripts/discord_search.sh')
+
+#Preferences
+config.set('window.title_format', 'Discord')
+config.set('statusbar.widgets', ["keypress", "search_match", "history", "tabs", "progress"])
+config.set('tabs.show', 'never')
+config.set('completion.scrollbar.width', 0)
+config.set('tabs.indicator.width', 0)
+config.set('tabs.title.format', '{index}{audio}')
+config.set('tabs.favicons.show', 'pinned')
+config.set('tabs.title.alignment', 'center')
+config.set('tabs.title.format_pinned', '{audio}{index}')
+
+config.set('content.unknown_url_scheme_policy', 'allow-all')
+
+#Search engines
+c.url.searchengines = {'DEFAULT': 'https://searx.stellar-nexus.ru/searxng/search?q={}',
+}
+# User agent to send. The following placeholders are defined: *
+# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
+# The underlying WebKit version (set to a fixed value with
+# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
+# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
+# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
+# QtWebEngine. * `{upstream_browser_version}`: The corresponding
+# Safari/Chrome version. * `{qutebrowser_version}`: The currently
+# running qutebrowser version. The default value is equal to the
+# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
+# read from JavaScript is always the global value. With QtWebEngine
+# between 5.12 and 5.14 (inclusive), changing the value exposed to
+# JavaScript requires a restart.
+# Type: FormatString
+config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99 Safari/537.36', 'https://*.slack.com/*')
+
+# Load images automatically in web pages.
+# Type: Bool
+config.set('content.images', True, 'chrome-devtools://*')
+
+# Load images automatically in web pages.
+# Type: Bool
+config.set('content.images', True, 'devtools://*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'chrome-devtools://*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'devtools://*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'chrome://*/*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'qute://*/*')
diff --git a/config/discord/quickmarks b/config/discord/quickmarks
@@ -0,0 +1 @@
+v https://discord.com/channels/@me/1139169391997632612
diff --git a/config/htop/htoprc b/config/htop/htoprc
@@ -0,0 +1,61 @@
+# Beware! This file is rewritten by htop when settings are changed in the interface.
+# The parser is also very primitive, and not human-friendly.
+htop_version=3.3.0
+config_reader_min_version=3
+fields=0 48 17 18 38 39 40 2 46 47 49 1
+hide_kernel_threads=1
+hide_userland_threads=0
+hide_running_in_container=0
+shadow_other_users=0
+show_thread_names=0
+show_program_path=1
+highlight_base_name=0
+highlight_deleted_exe=1
+shadow_distribution_path_prefix=0
+highlight_megabytes=1
+highlight_threads=1
+highlight_changes=0
+highlight_changes_delay_secs=5
+find_comm_in_cmdline=1
+strip_exe_from_cmdline=1
+show_merged_command=0
+header_margin=1
+screen_tabs=1
+detailed_cpu_time=0
+cpu_count_from_one=0
+show_cpu_usage=1
+show_cpu_frequency=0
+update_process_names=0
+account_guest_in_cpu_meter=0
+color_scheme=5
+enable_mouse=1
+delay=2
+hide_function_bar=0
+header_layout=two_50_50
+column_meters_0=LeftCPUs2 Memory Memory
+column_meter_modes_0=1 1 1
+column_meters_1=RightCPUs2 NetworkIO Tasks
+column_meter_modes_1=1 2 2
+tree_view=0
+sort_key=46
+tree_sort_key=0
+sort_direction=-1
+tree_sort_direction=1
+tree_view_always_by_pid=0
+all_branches_collapsed=0
+screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command
+.sort_key=PERCENT_CPU
+.tree_sort_key=PID
+.tree_view_always_by_pid=0
+.tree_view=0
+.sort_direction=-1
+.tree_sort_direction=1
+.all_branches_collapsed=0
+screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE Command
+.sort_key=IO_RATE
+.tree_sort_key=PID
+.tree_view_always_by_pid=0
+.tree_view=0
+.sort_direction=-1
+.tree_sort_direction=1
+.all_branches_collapsed=0
diff --git a/config/mpv/mpv.conf b/config/mpv/mpv.conf
@@ -0,0 +1,3 @@
+script-opts=ytdl_hook-ytdl_path=/bin/yt-dlp
+demuxer-max-bytes=1024000KiB
+title=mpv
diff --git a/config/mpv/scripts/webm.lua b/config/mpv/scripts/webm.lua
@@ -0,0 +1,3052 @@
+local mp = require("mp")
+local assdraw = require("mp.assdraw")
+local msg = require("mp.msg")
+local utils = require("mp.utils")
+local mpopts = require("mp.options")
+local options = {
+ -- Defaults to shift+w
+ keybind = "W",
+ -- If empty, saves on the same directory of the playing video.
+ -- A starting "~" will be replaced by the home dir.
+ -- This field is delimited by double-square-brackets - [[ and ]] - instead of
+ -- quotes, because Windows users might run into a issue when using
+ -- backslashes as a path separator. Examples of valid inputs for this field
+ -- would be: [[]] (the default, empty value), [[C:\Users\John]] (on Windows),
+ -- and [[/home/john]] (on Unix-like systems eg. Linux).
+ -- The [[]] delimiter is not needed when using from a configuration file
+ -- in the script-opts folder.
+ output_directory = [[]],
+ run_detached = false,
+ -- Template string for the output file
+ -- %f - Filename, with extension
+ -- %F - Filename, without extension
+ -- %T - Media title, if it exists, or filename, with extension (useful for some streams, such as YouTube).
+ -- %s, %e - Start and end time, with milliseconds
+ -- %S, %E - Start and end time, without milliseconds
+ -- %M - "-audio", if audio is enabled, empty otherwise
+ -- %R - "-(height)p", where height is the video's height, or scale_height, if it's enabled.
+ -- More specifiers are supported, see https://mpv.io/manual/master/#options-screenshot-template
+ -- Property expansion is supported (with %{} at top level, ${} when nested), see https://mpv.io/manual/master/#property-expansion
+ output_template = "%F-[%s-%e]%M",
+ -- Scale video to a certain height, keeping the aspect ratio. -1 disables it.
+ scale_height = -1,
+ -- Change the FPS of the output video, dropping or duplicating frames as needed.
+ -- -1 means the FPS will be unchanged from the source.
+ fps = -1,
+ -- Target filesize, in kB. This will be used to calculate the bitrate
+ -- used on the encode. If this is set to <= 0, the video bitrate will be set
+ -- to 0, which might enable constant quality modes, depending on the
+ -- video codec that's used (VP8 and VP9, for example).
+ target_filesize = 2500,
+ -- If true, will use stricter flags to ensure the resulting file doesn't
+ -- overshoot the target filesize. Not recommended, as constrained quality
+ -- mode should work well, unless you're really having trouble hitting
+ -- the target size.
+ strict_filesize_constraint = false,
+ strict_bitrate_multiplier = 0.95,
+ -- In kilobits.
+ strict_audio_bitrate = 64,
+ -- Sets the output format, from a few predefined ones.
+ -- Currently we have:
+ -- av1
+ -- hevc
+ -- webm-vp9 (libvpx-vp9/libopus)
+ -- avc (h264/AAC)
+ -- avc-nvenc (h264-NVENC/AAC)
+ -- webm-vp8 (libvpx/libvorbis)
+ -- gif
+ -- mp3 (libmp3lame)
+ -- and raw (rawvideo/pcm_s16le).
+ output_format = "webm-vp8",
+ twopass = true,
+ -- If set, applies the video filters currently used on the playback to the encode.
+ apply_current_filters = true,
+ -- If set, writes the video's filename to the "Title" field on the metadata.
+ write_filename_on_metadata = false,
+ -- Set the number of encoding threads, for codecs libvpx and libvpx-vp9
+ threads = 4,
+ additional_flags = "",
+ -- Constant Rate Factor (CRF). The value meaning and limits may change,
+ -- from codec to codec. Set to -1 to disable.
+ crf = 10,
+ -- Useful for flags that may impact output filesize, such as qmin, qmax etc
+ -- Won't be applied when strict_filesize_constraint is on.
+ non_strict_additional_flags = "",
+ -- Display the encode progress, in %. Requires run_detached to be disabled.
+ -- On Windows, it shows a cmd popup. "auto" will display progress on non-Windows platforms.
+ display_progress = "auto",
+ -- The font size used in the menu. Isn't used for the notifications (started encode, finished encode etc)
+ font_size = 28,
+ margin = 10,
+ message_duration = 5,
+ -- gif dither mode, 0-5 for bayer w/ bayer_scale 0-5, 6 for paletteuse default (sierra2_4a)
+ gif_dither = 2,
+ -- Force square pixels on output video
+ -- Some players like recent Firefox versions display videos with non-square pixels with wrong aspect ratio
+ force_square_pixels = false,
+}
+
+mpopts.read_options(options)
+local base64_chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+
+-- encoding
+function base64_encode(data)
+ return ((data:gsub('.', function(x)
+ local r,b='',x:byte()
+ for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
+ return r;
+ end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
+ if (#x < 6) then return '' end
+ local c=0
+ for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
+ return base64_chars:sub(c+1,c+1)
+ end)..({ '', '==', '=' })[#data%3+1])
+end
+
+-- decoding
+function base64_decode(data)
+ data = string.gsub(data, '[^'..base64_chars..'=]', '')
+ return (data:gsub('.', function(x)
+ if (x == '=') then return '' end
+ local r,f='',(base64_chars:find(x)-1)
+ for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
+ return r;
+ end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
+ if (#x ~= 8) then return '' end
+ local c=0
+ for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
+ return string.char(c)
+ end))
+end
+local emit_event
+emit_event = function(event_name, ...)
+ return mp.commandv("script-message", "webm-" .. tostring(event_name), ...)
+end
+local test_set_options
+test_set_options = function(new_options_json)
+ local new_options = utils.parse_json(new_options_json)
+ for k, v in pairs(new_options) do
+ options[k] = v
+ end
+end
+mp.register_script_message("mpv-webm-set-options", test_set_options)
+local bold
+bold = function(text)
+ return "{\\b1}" .. tostring(text) .. "{\\b0}"
+end
+local message
+message = function(text, duration)
+ local ass = mp.get_property_osd("osd-ass-cc/0")
+ ass = ass .. text
+ return mp.osd_message(ass, duration or options.message_duration)
+end
+local append
+append = function(a, b)
+ for _, val in ipairs(b) do
+ a[#a + 1] = val
+ end
+ return a
+end
+local seconds_to_time_string
+seconds_to_time_string = function(seconds, no_ms, full)
+ if seconds < 0 then
+ return "unknown"
+ end
+ local ret = ""
+ if not (no_ms) then
+ ret = string.format(".%03d", seconds * 1000 % 1000)
+ end
+ ret = string.format("%02d:%02d%s", math.floor(seconds / 60) % 60, math.floor(seconds) % 60, ret)
+ if full or seconds > 3600 then
+ ret = string.format("%d:%s", math.floor(seconds / 3600), ret)
+ end
+ return ret
+end
+local seconds_to_path_element
+seconds_to_path_element = function(seconds, no_ms, full)
+ local time_string = seconds_to_time_string(seconds, no_ms, full)
+ local _
+ time_string, _ = time_string:gsub(":", ".")
+ return time_string
+end
+local file_exists
+file_exists = function(name)
+ local info, err = utils.file_info(name)
+ if info ~= nil then
+ return true
+ end
+ return false
+end
+local expand_properties
+expand_properties = function(text, magic)
+ if magic == nil then
+ magic = "$"
+ end
+ for prefix, raw, prop, colon, fallback, closing in text:gmatch("%" .. magic .. "{([?!]?)(=?)([^}:]*)(:?)([^}]*)(}*)}") do
+ local err
+ local prop_value
+ local compare_value
+ local original_prop = prop
+ local get_property = mp.get_property_osd
+ if raw == "=" then
+ get_property = mp.get_property
+ end
+ if prefix ~= "" then
+ for actual_prop, compare in prop:gmatch("(.-)==(.*)") do
+ prop = actual_prop
+ compare_value = compare
+ end
+ end
+ if colon == ":" then
+ prop_value, err = get_property(prop, fallback)
+ else
+ prop_value, err = get_property(prop, "(error)")
+ end
+ prop_value = tostring(prop_value)
+ if prefix == "?" then
+ if compare_value == nil then
+ prop_value = err == nil and fallback .. closing or ""
+ else
+ prop_value = prop_value == compare_value and fallback .. closing or ""
+ end
+ prefix = "%" .. prefix
+ elseif prefix == "!" then
+ if compare_value == nil then
+ prop_value = err ~= nil and fallback .. closing or ""
+ else
+ prop_value = prop_value ~= compare_value and fallback .. closing or ""
+ end
+ else
+ prop_value = prop_value .. closing
+ end
+ if colon == ":" then
+ local _
+ text, _ = text:gsub("%" .. magic .. "{" .. prefix .. raw .. original_prop:gsub("%W", "%%%1") .. ":" .. fallback:gsub("%W", "%%%1") .. closing .. "}", expand_properties(prop_value))
+ else
+ local _
+ text, _ = text:gsub("%" .. magic .. "{" .. prefix .. raw .. original_prop:gsub("%W", "%%%1") .. closing .. "}", prop_value)
+ end
+ end
+ return text
+end
+local format_filename
+format_filename = function(startTime, endTime, videoFormat)
+ local hasAudioCodec = videoFormat.audioCodec ~= ""
+ local replaceFirst = {
+ ["%%mp"] = "%%mH.%%mM.%%mS",
+ ["%%mP"] = "%%mH.%%mM.%%mS.%%mT",
+ ["%%p"] = "%%wH.%%wM.%%wS",
+ ["%%P"] = "%%wH.%%wM.%%wS.%%wT"
+ }
+ local replaceTable = {
+ ["%%wH"] = string.format("%02d", math.floor(startTime / (60 * 60))),
+ ["%%wh"] = string.format("%d", math.floor(startTime / (60 * 60))),
+ ["%%wM"] = string.format("%02d", math.floor(startTime / 60 % 60)),
+ ["%%wm"] = string.format("%d", math.floor(startTime / 60)),
+ ["%%wS"] = string.format("%02d", math.floor(startTime % 60)),
+ ["%%ws"] = string.format("%d", math.floor(startTime)),
+ ["%%wf"] = string.format("%s", startTime),
+ ["%%wT"] = string.sub(string.format("%.3f", startTime % 1), 3),
+ ["%%mH"] = string.format("%02d", math.floor(endTime / (60 * 60))),
+ ["%%mh"] = string.format("%d", math.floor(endTime / (60 * 60))),
+ ["%%mM"] = string.format("%02d", math.floor(endTime / 60 % 60)),
+ ["%%mm"] = string.format("%d", math.floor(endTime / 60)),
+ ["%%mS"] = string.format("%02d", math.floor(endTime % 60)),
+ ["%%ms"] = string.format("%d", math.floor(endTime)),
+ ["%%mf"] = string.format("%s", endTime),
+ ["%%mT"] = string.sub(string.format("%.3f", endTime % 1), 3),
+ ["%%f"] = mp.get_property("filename"),
+ ["%%F"] = mp.get_property("filename/no-ext"),
+ ["%%s"] = seconds_to_path_element(startTime),
+ ["%%S"] = seconds_to_path_element(startTime, true),
+ ["%%e"] = seconds_to_path_element(endTime),
+ ["%%E"] = seconds_to_path_element(endTime, true),
+ ["%%T"] = mp.get_property("media-title"),
+ ["%%M"] = (mp.get_property_native('aid') and not mp.get_property_native('mute') and hasAudioCodec) and '-audio' or '',
+ ["%%R"] = (options.scale_height ~= -1) and "-" .. tostring(options.scale_height) .. "p" or "-" .. tostring(mp.get_property_native('height')) .. "p",
+ ["%%mb"] = options.target_filesize / 1000,
+ ["%%t%%"] = "%%"
+ }
+ local filename = options.output_template
+ for format, value in pairs(replaceFirst) do
+ local _
+ filename, _ = filename:gsub(format, value)
+ end
+ for format, value in pairs(replaceTable) do
+ local _
+ filename, _ = filename:gsub(format, value)
+ end
+ if mp.get_property_bool("demuxer-via-network", false) then
+ local _
+ filename, _ = filename:gsub("%%X{([^}]*)}", "%1")
+ filename, _ = filename:gsub("%%x", "")
+ else
+ local x = string.gsub(mp.get_property("stream-open-filename", ""), string.gsub(mp.get_property("filename", ""), "%W", "%%%1") .. "$", "")
+ local _
+ filename, _ = filename:gsub("%%X{[^}]*}", x)
+ filename, _ = filename:gsub("%%x", x)
+ end
+ filename = expand_properties(filename, "%")
+ for format in filename:gmatch("%%t([aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ])") do
+ local _
+ filename, _ = filename:gsub("%%t" .. format, os.date("%" .. format))
+ end
+ local _
+ filename, _ = filename:gsub("[<>:\"/\\|?*]", "")
+ return tostring(filename) .. "." .. tostring(videoFormat.outputExtension)
+end
+local parse_directory
+parse_directory = function(dir)
+ local home_dir = os.getenv("HOME")
+ if not home_dir then
+ home_dir = os.getenv("USERPROFILE")
+ end
+ if not home_dir then
+ local drive = os.getenv("HOMEDRIVE")
+ local path = os.getenv("HOMEPATH")
+ if drive and path then
+ home_dir = utils.join_path(drive, path)
+ else
+ msg.warn("Couldn't find home dir.")
+ home_dir = ""
+ end
+ end
+ local _
+ dir, _ = dir:gsub("^~", home_dir)
+ return dir
+end
+local is_windows = type(package) == "table" and type(package.config) == "string" and package.config:sub(1, 1) == "\\"
+local trim
+trim = function(s)
+ return s:match("^%s*(.-)%s*$")
+end
+local get_null_path
+get_null_path = function()
+ if file_exists("/dev/null") then
+ return "/dev/null"
+ end
+ return "NUL"
+end
+local run_subprocess
+run_subprocess = function(params)
+ local res = utils.subprocess(params)
+ msg.verbose("Command stdout: ")
+ msg.verbose(res.stdout)
+ if res.status ~= 0 then
+ msg.verbose("Command failed! Reason: ", res.error, " Killed by us? ", res.killed_by_us and "yes" or "no")
+ return false
+ end
+ return true
+end
+local shell_escape
+shell_escape = function(args)
+ local ret = { }
+ for i, a in ipairs(args) do
+ local s = tostring(a)
+ if string.match(s, "[^A-Za-z0-9_/:=-]") then
+ if is_windows then
+ s = '"' .. string.gsub(s, '"', '"\\""') .. '"'
+ else
+ s = "'" .. string.gsub(s, "'", "'\\''") .. "'"
+ end
+ end
+ table.insert(ret, s)
+ end
+ local concat = table.concat(ret, " ")
+ if is_windows then
+ concat = '"' .. concat .. '"'
+ end
+ return concat
+end
+local run_subprocess_popen
+run_subprocess_popen = function(command_line)
+ local command_line_string = shell_escape(command_line)
+ command_line_string = command_line_string .. " 2>&1"
+ msg.verbose("run_subprocess_popen: running " .. tostring(command_line_string))
+ return io.popen(command_line_string)
+end
+local calculate_scale_factor
+calculate_scale_factor = function()
+ local baseResY = 720
+ local osd_w, osd_h = mp.get_osd_size()
+ return osd_h / baseResY
+end
+local should_display_progress
+should_display_progress = function()
+ if options.display_progress == "auto" then
+ return not is_windows
+ end
+ return options.display_progress
+end
+local reverse
+reverse = function(list)
+ local _accum_0 = { }
+ local _len_0 = 1
+ local _max_0 = 1
+ for _index_0 = #list, _max_0 < 0 and #list + _max_0 or _max_0, -1 do
+ local element = list[_index_0]
+ _accum_0[_len_0] = element
+ _len_0 = _len_0 + 1
+ end
+ return _accum_0
+end
+local get_pass_logfile_path
+get_pass_logfile_path = function(encode_out_path)
+ return tostring(encode_out_path) .. "-video-pass1.log"
+end
+local dimensions_changed = true
+local _video_dimensions = { }
+local get_video_dimensions
+get_video_dimensions = function()
+ if not (dimensions_changed) then
+ return _video_dimensions
+ end
+ local video_params = mp.get_property_native("video-out-params")
+ if not video_params then
+ return nil
+ end
+ dimensions_changed = false
+ local keep_aspect = mp.get_property_bool("keepaspect")
+ local w = video_params["w"]
+ local h = video_params["h"]
+ local dw = video_params["dw"]
+ local dh = video_params["dh"]
+ if mp.get_property_number("video-rotate") % 180 == 90 then
+ w, h = h, w
+ dw, dh = dh, dw
+ end
+ _video_dimensions = {
+ top_left = { },
+ bottom_right = { },
+ ratios = { }
+ }
+ local window_w, window_h = mp.get_osd_size()
+ if keep_aspect then
+ local unscaled = mp.get_property_native("video-unscaled")
+ local panscan = mp.get_property_number("panscan")
+ local fwidth = window_w
+ local fheight = math.floor(window_w / dw * dh)
+ if fheight > window_h or fheight < h then
+ local tmpw = math.floor(window_h / dh * dw)
+ if tmpw <= window_w then
+ fheight = window_h
+ fwidth = tmpw
+ end
+ end
+ local vo_panscan_area = window_h - fheight
+ local f_w = fwidth / fheight
+ local f_h = 1
+ if vo_panscan_area == 0 then
+ vo_panscan_area = window_h - fwidth
+ f_w = 1
+ f_h = fheight / fwidth
+ end
+ if unscaled or unscaled == "downscale-big" then
+ vo_panscan_area = 0
+ if unscaled or (dw <= window_w and dh <= window_h) then
+ fwidth = dw
+ fheight = dh
+ end
+ end
+ local scaled_width = fwidth + math.floor(vo_panscan_area * panscan * f_w)
+ local scaled_height = fheight + math.floor(vo_panscan_area * panscan * f_h)
+ local split_scaling
+ split_scaling = function(dst_size, scaled_src_size, zoom, align, pan)
+ scaled_src_size = math.floor(scaled_src_size * 2 ^ zoom)
+ align = (align + 1) / 2
+ local dst_start = math.floor((dst_size - scaled_src_size) * align + pan * scaled_src_size)
+ if dst_start < 0 then
+ dst_start = dst_start + 1
+ end
+ local dst_end = dst_start + scaled_src_size
+ if dst_start >= dst_end then
+ dst_start = 0
+ dst_end = 1
+ end
+ return dst_start, dst_end
+ end
+ local zoom = mp.get_property_number("video-zoom")
+ local align_x = mp.get_property_number("video-align-x")
+ local pan_x = mp.get_property_number("video-pan-x")
+ _video_dimensions.top_left.x, _video_dimensions.bottom_right.x = split_scaling(window_w, scaled_width, zoom, align_x, pan_x)
+ local align_y = mp.get_property_number("video-align-y")
+ local pan_y = mp.get_property_number("video-pan-y")
+ _video_dimensions.top_left.y, _video_dimensions.bottom_right.y = split_scaling(window_h, scaled_height, zoom, align_y, pan_y)
+ else
+ _video_dimensions.top_left.x = 0
+ _video_dimensions.bottom_right.x = window_w
+ _video_dimensions.top_left.y = 0
+ _video_dimensions.bottom_right.y = window_h
+ end
+ _video_dimensions.ratios.w = w / (_video_dimensions.bottom_right.x - _video_dimensions.top_left.x)
+ _video_dimensions.ratios.h = h / (_video_dimensions.bottom_right.y - _video_dimensions.top_left.y)
+ return _video_dimensions
+end
+local set_dimensions_changed
+set_dimensions_changed = function()
+ dimensions_changed = true
+end
+local monitor_dimensions
+monitor_dimensions = function()
+ local properties = {
+ "keepaspect",
+ "video-out-params",
+ "video-unscaled",
+ "panscan",
+ "video-zoom",
+ "video-align-x",
+ "video-pan-x",
+ "video-align-y",
+ "video-pan-y",
+ "osd-width",
+ "osd-height"
+ }
+ for _, p in ipairs(properties) do
+ mp.observe_property(p, "native", set_dimensions_changed)
+ end
+end
+local clamp
+clamp = function(min, val, max)
+ if val <= min then
+ return min
+ end
+ if val >= max then
+ return max
+ end
+ return val
+end
+local clamp_point
+clamp_point = function(top_left, point, bottom_right)
+ return {
+ x = clamp(top_left.x, point.x, bottom_right.x),
+ y = clamp(top_left.y, point.y, bottom_right.y)
+ }
+end
+local VideoPoint
+do
+ local _class_0
+ local _base_0 = {
+ set_from_screen = function(self, sx, sy)
+ local d = get_video_dimensions()
+ local point = clamp_point(d.top_left, {
+ x = sx,
+ y = sy
+ }, d.bottom_right)
+ self.x = math.floor(d.ratios.w * (point.x - d.top_left.x) + 0.5)
+ self.y = math.floor(d.ratios.h * (point.y - d.top_left.y) + 0.5)
+ end,
+ to_screen = function(self)
+ local d = get_video_dimensions()
+ return {
+ x = math.floor(self.x / d.ratios.w + d.top_left.x + 0.5),
+ y = math.floor(self.y / d.ratios.h + d.top_left.y + 0.5)
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.x = -1
+ self.y = -1
+ end,
+ __base = _base_0,
+ __name = "VideoPoint"
+ }, {
+ __index = _base_0,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ VideoPoint = _class_0
+end
+local Region
+do
+ local _class_0
+ local _base_0 = {
+ is_valid = function(self)
+ return self.x > -1 and self.y > -1 and self.w > -1 and self.h > -1
+ end,
+ set_from_points = function(self, p1, p2)
+ self.x = math.min(p1.x, p2.x)
+ self.y = math.min(p1.y, p2.y)
+ self.w = math.abs(p1.x - p2.x)
+ self.h = math.abs(p1.y - p2.y)
+ end
+ }
+ _base_0.__index = _base_0
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.x = -1
+ self.y = -1
+ self.w = -1
+ self.h = -1
+ end,
+ __base = _base_0,
+ __name = "Region"
+ }, {
+ __index = _base_0,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ Region = _class_0
+end
+local make_fullscreen_region
+make_fullscreen_region = function()
+ local r = Region()
+ local d = get_video_dimensions()
+ local a = VideoPoint()
+ local b = VideoPoint()
+ local xa, ya
+ do
+ local _obj_0 = d.top_left
+ xa, ya = _obj_0.x, _obj_0.y
+ end
+ a:set_from_screen(xa, ya)
+ local xb, yb
+ do
+ local _obj_0 = d.bottom_right
+ xb, yb = _obj_0.x, _obj_0.y
+ end
+ b:set_from_screen(xb, yb)
+ r:set_from_points(a, b)
+ return r
+end
+local read_double
+read_double = function(bytes)
+ local sign = 1
+ local mantissa = bytes[2] % 2 ^ 4
+ for i = 3, 8 do
+ mantissa = mantissa * 256 + bytes[i]
+ end
+ if bytes[1] > 127 then
+ sign = -1
+ end
+ local exponent = (bytes[1] % 128) * 2 ^ 4 + math.floor(bytes[2] / 2 ^ 4)
+ if exponent == 0 then
+ return 0
+ end
+ mantissa = (math.ldexp(mantissa, -52) + 1) * sign
+ return math.ldexp(mantissa, exponent - 1023)
+end
+local write_double
+write_double = function(num)
+ local bytes = {
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ }
+ if num == 0 then
+ return bytes
+ end
+ local anum = math.abs(num)
+ local mantissa, exponent = math.frexp(anum)
+ exponent = exponent - 1
+ mantissa = mantissa * 2 - 1
+ local sign = num ~= anum and 128 or 0
+ exponent = exponent + 1023
+ bytes[1] = sign + math.floor(exponent / 2 ^ 4)
+ mantissa = mantissa * 2 ^ 4
+ local currentmantissa = math.floor(mantissa)
+ mantissa = mantissa - currentmantissa
+ bytes[2] = (exponent % 2 ^ 4) * 2 ^ 4 + currentmantissa
+ for i = 3, 8 do
+ mantissa = mantissa * 2 ^ 8
+ currentmantissa = math.floor(mantissa)
+ mantissa = mantissa - currentmantissa
+ bytes[i] = currentmantissa
+ end
+ return bytes
+end
+local FirstpassStats
+do
+ local _class_0
+ local duration_multiplier, fields_before_duration, fields_after_duration
+ local _base_0 = {
+ get_duration = function(self)
+ local big_endian_binary_duration = reverse(self.binary_duration)
+ return read_double(reversed_binary_duration) / duration_multiplier
+ end,
+ set_duration = function(self, duration)
+ local big_endian_binary_duration = write_double(duration * duration_multiplier)
+ self.binary_duration = reverse(big_endian_binary_duration)
+ end,
+ _bytes_to_string = function(self, bytes)
+ return string.char(unpack(bytes))
+ end,
+ as_binary_string = function(self)
+ local before_duration_string = self:_bytes_to_string(self.binary_data_before_duration)
+ local duration_string = self:_bytes_to_string(self.binary_duration)
+ local after_duration_string = self:_bytes_to_string(self.binary_data_after_duration)
+ return before_duration_string .. duration_string .. after_duration_string
+ end
+ }
+ _base_0.__index = _base_0
+ _class_0 = setmetatable({
+ __init = function(self, before_duration, duration, after_duration)
+ self.binary_data_before_duration = before_duration
+ self.binary_duration = duration
+ self.binary_data_after_duration = after_duration
+ end,
+ __base = _base_0,
+ __name = "FirstpassStats"
+ }, {
+ __index = _base_0,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ local self = _class_0
+ duration_multiplier = 10000000.0
+ fields_before_duration = 16
+ fields_after_duration = 1
+ self.data_before_duration_size = function(self)
+ return fields_before_duration * 8
+ end
+ self.data_after_duration_size = function(self)
+ return fields_after_duration * 8
+ end
+ self.size = function(self)
+ return (fields_before_duration + 1 + fields_after_duration) * 8
+ end
+ self.from_bytes = function(self, bytes)
+ local before_duration
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ local _max_0 = self:data_before_duration_size()
+ for _index_0 = 1, _max_0 < 0 and #bytes + _max_0 or _max_0 do
+ local b = bytes[_index_0]
+ _accum_0[_len_0] = b
+ _len_0 = _len_0 + 1
+ end
+ before_duration = _accum_0
+ end
+ local duration
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ local _max_0 = self:data_before_duration_size() + 8
+ for _index_0 = self:data_before_duration_size() + 1, _max_0 < 0 and #bytes + _max_0 or _max_0 do
+ local b = bytes[_index_0]
+ _accum_0[_len_0] = b
+ _len_0 = _len_0 + 1
+ end
+ duration = _accum_0
+ end
+ local after_duration
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = self:data_before_duration_size() + 8 + 1, #bytes do
+ local b = bytes[_index_0]
+ _accum_0[_len_0] = b
+ _len_0 = _len_0 + 1
+ end
+ after_duration = _accum_0
+ end
+ return self(before_duration, duration, after_duration)
+ end
+ FirstpassStats = _class_0
+end
+local read_logfile_into_stats_array
+read_logfile_into_stats_array = function(logfile_path)
+ local file = assert(io.open(logfile_path, "rb"))
+ local logfile_string = base64_decode(file:read())
+ file:close()
+ local stats_size = FirstpassStats:size()
+ assert(logfile_string:len() % stats_size == 0)
+ local stats = { }
+ for offset = 1, #logfile_string, stats_size do
+ local bytes = {
+ logfile_string:byte(offset, offset + stats_size - 1)
+ }
+ assert(#bytes == stats_size)
+ stats[#stats + 1] = FirstpassStats:from_bytes(bytes)
+ end
+ return stats
+end
+local write_stats_array_to_logfile
+write_stats_array_to_logfile = function(stats_array, logfile_path)
+ local file = assert(io.open(logfile_path, "wb"))
+ local logfile_string = ""
+ for _index_0 = 1, #stats_array do
+ local stat = stats_array[_index_0]
+ logfile_string = logfile_string .. stat:as_binary_string()
+ end
+ file:write(base64_encode(logfile_string))
+ return file:close()
+end
+local vp8_patch_logfile
+vp8_patch_logfile = function(logfile_path, encode_total_duration)
+ local stats_array = read_logfile_into_stats_array(logfile_path)
+ local average_duration = encode_total_duration / (#stats_array - 1)
+ for i = 1, #stats_array - 1 do
+ stats_array[i]:set_duration(average_duration)
+ end
+ stats_array[#stats_array]:set_duration(encode_total_duration)
+ return write_stats_array_to_logfile(stats_array, logfile_path)
+end
+local formats = { }
+local Format
+do
+ local _class_0
+ local _base_0 = {
+ getPreFilters = function(self)
+ return { }
+ end,
+ getPostFilters = function(self)
+ return { }
+ end,
+ getFlags = function(self)
+ return { }
+ end,
+ getCodecFlags = function(self)
+ local codecs = { }
+ if self.videoCodec ~= "" then
+ codecs[#codecs + 1] = "--ovc=" .. tostring(self.videoCodec)
+ end
+ if self.audioCodec ~= "" then
+ codecs[#codecs + 1] = "--oac=" .. tostring(self.audioCodec)
+ end
+ return codecs
+ end,
+ postCommandModifier = function(self, command, region, startTime, endTime)
+ return command
+ end
+ }
+ _base_0.__index = _base_0
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "Basic"
+ self.supportsTwopass = true
+ self.videoCodec = ""
+ self.audioCodec = ""
+ self.outputExtension = ""
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "Format"
+ }, {
+ __index = _base_0,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ Format = _class_0
+end
+local RawVideo
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getColorspace = function(self)
+ local csp = mp.get_property("colormatrix")
+ local _exp_0 = csp
+ if "bt.601" == _exp_0 then
+ return "bt601"
+ elseif "bt.709" == _exp_0 then
+ return "bt709"
+ elseif "bt.2020" == _exp_0 then
+ return "bt2020"
+ elseif "smpte-240m" == _exp_0 then
+ return "smpte240m"
+ else
+ msg.info("Warning, unknown colorspace " .. tostring(csp) .. " detected, using bt.601.")
+ return "bt601"
+ end
+ end,
+ getPostFilters = function(self)
+ return {
+ "format=yuv444p16",
+ "lavfi-scale=in_color_matrix=" .. self:getColorspace(),
+ "format=bgr24"
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "Raw"
+ self.supportsTwopass = false
+ self.videoCodec = "rawvideo"
+ self.audioCodec = "pcm_s16le"
+ self.outputExtension = "avi"
+ self.acceptsBitrate = false
+ end,
+ __base = _base_0,
+ __name = "RawVideo",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ RawVideo = _class_0
+end
+formats["raw"] = RawVideo()
+local WebmVP8
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getPreFilters = function(self)
+ local colormatrixFilter = {
+ ["bt.709"] = "bt709",
+ ["bt.2020"] = "bt2020",
+ ["smpte-240m"] = "smpte240m"
+ }
+ local ret = { }
+ local colormatrix = mp.get_property_native("video-params/colormatrix")
+ if colormatrixFilter[colormatrix] then
+ append(ret, {
+ "lavfi-colormatrix=" .. tostring(colormatrixFilter[colormatrix]) .. ":bt601"
+ })
+ end
+ return ret
+ end,
+ getFlags = function(self)
+ return {
+ "--ovcopts-add=threads=" .. tostring(options.threads),
+ "--ovcopts-add=auto-alt-ref=1",
+ "--ovcopts-add=lag-in-frames=25",
+ "--ovcopts-add=quality=good",
+ "--ovcopts-add=cpu-used=0"
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "WebM"
+ self.supportsTwopass = true
+ self.videoCodec = "libvpx"
+ self.audioCodec = "libvorbis"
+ self.outputExtension = "webm"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "WebmVP8",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ WebmVP8 = _class_0
+end
+formats["webm-vp8"] = WebmVP8()
+local WebmVP9
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getFlags = function(self)
+ return {
+ "--ovcopts-add=threads=" .. tostring(options.threads)
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "WebM (VP9)"
+ self.supportsTwopass = false
+ self.videoCodec = "libvpx-vp9"
+ self.audioCodec = "libopus"
+ self.outputExtension = "webm"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "WebmVP9",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ WebmVP9 = _class_0
+end
+formats["webm-vp9"] = WebmVP9()
+local AVC
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getFlags = function(self)
+ return {
+ "--ovcopts-add=threads=" .. tostring(options.threads)
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "AVC (h264/AAC)"
+ self.supportsTwopass = true
+ self.videoCodec = "libx264"
+ self.audioCodec = "aac"
+ self.outputExtension = "mp4"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "AVC",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ AVC = _class_0
+end
+formats["avc"] = AVC()
+local AVCNVENC
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getFlags = function(self)
+ return {
+ "--ovcopts-add=bf=0"
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "AVC (h264-NVENC/AAC)"
+ self.supportsTwopass = true
+ self.videoCodec = "h264_nvenc"
+ self.audioCodec = "aac"
+ self.outputExtension = "mp4"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "AVCNVENC",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ AVCNVENC = _class_0
+end
+formats["avc-nvenc"] = AVCNVENC()
+local AV1
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getFlags = function(self)
+ return {
+ "--ovcopts-add=threads=" .. tostring(options.threads)
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "AV1"
+ self.supportsTwopass = true
+ self.videoCodec = "libaom-av1"
+ self.audioCodec = "aac"
+ self.outputExtension = "mp4"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "AV1",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ AV1 = _class_0
+end
+formats["av1"] = AV1()
+local HEVC
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ getFlags = function(self)
+ return {
+ "--ovcopts-add=threads=" .. tostring(options.threads)
+ }
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "HEVC"
+ self.supportsTwopass = true
+ self.videoCodec = "libx265"
+ self.audioCodec = "aac"
+ self.outputExtension = "mp4"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "HEVC",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ HEVC = _class_0
+end
+formats["hevc"] = HEVC()
+local MP3
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = { }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "MP3 (libmp3lame)"
+ self.supportsTwopass = false
+ self.videoCodec = ""
+ self.audioCodec = "libmp3lame"
+ self.outputExtension = "mp3"
+ self.acceptsBitrate = true
+ end,
+ __base = _base_0,
+ __name = "MP3",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ MP3 = _class_0
+end
+formats["mp3"] = MP3()
+local GIF
+do
+ local _class_0
+ local _parent_0 = Format
+ local _base_0 = {
+ postCommandModifier = function(self, command, region, startTime, endTime)
+ local new_command = { }
+ local start_ts = seconds_to_time_string(startTime, false, true)
+ local end_ts = seconds_to_time_string(endTime, false, true)
+ start_ts = start_ts:gsub(":", "\\\\:")
+ end_ts = end_ts:gsub(":", "\\\\:")
+ local cfilter = "[vid1]trim=start=" .. tostring(start_ts) .. ":end=" .. tostring(end_ts) .. "[vidtmp];"
+ if mp.get_property("deinterlace") == "yes" then
+ cfilter = cfilter .. "[vidtmp]yadif=mode=1[vidtmp];"
+ end
+ for _, v in ipairs(command) do
+ local _continue_0 = false
+ repeat
+ if v:match("^%-%-vf%-add=lavfi%-scale") or v:match("^%-%-vf%-add=lavfi%-crop") or v:match("^%-%-vf%-add=fps") or v:match("^%-%-vf%-add=lavfi%-eq") then
+ local n = v:gsub("^%-%-vf%-add=", ""):gsub("^lavfi%-", "")
+ cfilter = cfilter .. "[vidtmp]" .. tostring(n) .. "[vidtmp];"
+ else
+ if v:match("^%-%-video%-rotate=90") then
+ cfilter = cfilter .. "[vidtmp]transpose=1[vidtmp];"
+ else
+ if v:match("^%-%-video%-rotate=270") then
+ cfilter = cfilter .. "[vidtmp]transpose=2[vidtmp];"
+ else
+ if v:match("^%-%-video%-rotate=180") then
+ cfilter = cfilter .. "[vidtmp]transpose=1[vidtmp];[vidtmp]transpose=1[vidtmp];"
+ else
+ if v:match("^%-%-deinterlace=") then
+ _continue_0 = true
+ break
+ else
+ append(new_command, {
+ v
+ })
+ _continue_0 = true
+ break
+ end
+ end
+ end
+ end
+ end
+ _continue_0 = true
+ until true
+ if not _continue_0 then
+ break
+ end
+ end
+ cfilter = cfilter .. "[vidtmp]split[topal][vidf];"
+ cfilter = cfilter .. "[topal]palettegen[pal];"
+ cfilter = cfilter .. "[vidf][pal]paletteuse=diff_mode=rectangle"
+ if options.gif_dither ~= 6 then
+ cfilter = cfilter .. ":dither=bayer:bayer_scale=" .. tostring(options.gif_dither)
+ end
+ cfilter = cfilter .. "[vo]"
+ append(new_command, {
+ "--lavfi-complex=" .. tostring(cfilter)
+ })
+ return new_command
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.displayName = "GIF"
+ self.supportsTwopass = false
+ self.videoCodec = "gif"
+ self.audioCodec = ""
+ self.outputExtension = "gif"
+ self.acceptsBitrate = false
+ end,
+ __base = _base_0,
+ __name = "GIF",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ GIF = _class_0
+end
+formats["gif"] = GIF()
+local Page
+do
+ local _class_0
+ local _base_0 = {
+ add_keybinds = function(self)
+ if not self.keybinds then
+ return
+ end
+ for key, func in pairs(self.keybinds) do
+ mp.add_forced_key_binding(key, key, func, {
+ repeatable = true
+ })
+ end
+ end,
+ remove_keybinds = function(self)
+ if not self.keybinds then
+ return
+ end
+ for key, _ in pairs(self.keybinds) do
+ mp.remove_key_binding(key)
+ end
+ end,
+ observe_properties = function(self)
+ self.sizeCallback = function()
+ return self:draw()
+ end
+ local properties = {
+ "keepaspect",
+ "video-out-params",
+ "video-unscaled",
+ "panscan",
+ "video-zoom",
+ "video-align-x",
+ "video-pan-x",
+ "video-align-y",
+ "video-pan-y",
+ "osd-width",
+ "osd-height"
+ }
+ for _index_0 = 1, #properties do
+ local p = properties[_index_0]
+ mp.observe_property(p, "native", self.sizeCallback)
+ end
+ end,
+ unobserve_properties = function(self)
+ if self.sizeCallback then
+ mp.unobserve_property(self.sizeCallback)
+ self.sizeCallback = nil
+ end
+ end,
+ clear = function(self)
+ local window_w, window_h = mp.get_osd_size()
+ mp.set_osd_ass(window_w, window_h, "")
+ return mp.osd_message("", 0)
+ end,
+ prepare = function(self)
+ return nil
+ end,
+ dispose = function(self)
+ return nil
+ end,
+ show = function(self)
+ if self.visible then
+ return
+ end
+ self.visible = true
+ self:observe_properties()
+ self:add_keybinds()
+ self:prepare()
+ self:clear()
+ return self:draw()
+ end,
+ hide = function(self)
+ if not self.visible then
+ return
+ end
+ self.visible = false
+ self:unobserve_properties()
+ self:remove_keybinds()
+ self:clear()
+ return self:dispose()
+ end,
+ setup_text = function(self, ass)
+ local scale = calculate_scale_factor()
+ local margin = options.margin * scale
+ ass:append("{\\an7}")
+ ass:pos(margin, margin)
+ return ass:append("{\\fs" .. tostring(options.font_size * scale) .. "}")
+ end
+ }
+ _base_0.__index = _base_0
+ _class_0 = setmetatable({
+ __init = function() end,
+ __base = _base_0,
+ __name = "Page"
+ }, {
+ __index = _base_0,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ Page = _class_0
+end
+local EncodeWithProgress
+do
+ local _class_0
+ local _parent_0 = Page
+ local _base_0 = {
+ draw = function(self)
+ local progress = 100 * ((self.currentTime - self.startTime) / self.duration)
+ local progressText = string.format("%d%%", progress)
+ local window_w, window_h = mp.get_osd_size()
+ local ass = assdraw.ass_new()
+ ass:new_event()
+ self:setup_text(ass)
+ ass:append("Encoding (" .. tostring(bold(progressText)) .. ")\\N")
+ return mp.set_osd_ass(window_w, window_h, ass.text)
+ end,
+ parseLine = function(self, line)
+ local matchTime = string.match(line, "Encode time[-]pos: ([0-9.]+)")
+ local matchExit = string.match(line, "Exiting... [(]([%a ]+)[)]")
+ if matchTime == nil and matchExit == nil then
+ return
+ end
+ if matchTime ~= nil and tonumber(matchTime) > self.currentTime then
+ self.currentTime = tonumber(matchTime)
+ end
+ if matchExit ~= nil then
+ self.finished = true
+ self.finishedReason = matchExit
+ end
+ end,
+ startEncode = function(self, command_line)
+ local copy_command_line
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = 1, #command_line do
+ local arg = command_line[_index_0]
+ _accum_0[_len_0] = arg
+ _len_0 = _len_0 + 1
+ end
+ copy_command_line = _accum_0
+ end
+ append(copy_command_line, {
+ '--term-status-msg=Encode time-pos: ${=time-pos}\\n'
+ })
+ self:show()
+ local processFd = run_subprocess_popen(copy_command_line)
+ for line in processFd:lines() do
+ msg.verbose(string.format('%q', line))
+ self:parseLine(line)
+ self:draw()
+ end
+ processFd:close()
+ self:hide()
+ if self.finishedReason == "End of file" then
+ return true
+ end
+ return false
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self, startTime, endTime)
+ self.startTime = startTime
+ self.endTime = endTime
+ self.duration = endTime - startTime
+ self.currentTime = startTime
+ end,
+ __base = _base_0,
+ __name = "EncodeWithProgress",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ EncodeWithProgress = _class_0
+end
+local get_active_tracks
+get_active_tracks = function()
+ local accepted = {
+ video = true,
+ audio = not mp.get_property_bool("mute"),
+ sub = mp.get_property_bool("sub-visibility")
+ }
+ local active = {
+ video = { },
+ audio = { },
+ sub = { }
+ }
+ for _, track in ipairs(mp.get_property_native("track-list")) do
+ if track["selected"] and accepted[track["type"]] then
+ local count = #active[track["type"]]
+ active[track["type"]][count + 1] = track
+ end
+ end
+ return active
+end
+local filter_tracks_supported_by_format
+filter_tracks_supported_by_format = function(active_tracks, format)
+ local has_video_codec = format.videoCodec ~= ""
+ local has_audio_codec = format.audioCodec ~= ""
+ local supported = {
+ video = has_video_codec and active_tracks["video"] or { },
+ audio = has_audio_codec and active_tracks["audio"] or { },
+ sub = has_video_codec and active_tracks["sub"] or { }
+ }
+ return supported
+end
+local append_track
+append_track = function(out, track)
+ local external_flag = {
+ ["audio"] = "audio-file",
+ ["sub"] = "sub-file"
+ }
+ local internal_flag = {
+ ["video"] = "vid",
+ ["audio"] = "aid",
+ ["sub"] = "sid"
+ }
+ if track['external'] and string.len(track['external-filename']) <= 2048 then
+ return append(out, {
+ "--" .. tostring(external_flag[track['type']]) .. "=" .. tostring(track['external-filename'])
+ })
+ else
+ return append(out, {
+ "--" .. tostring(internal_flag[track['type']]) .. "=" .. tostring(track['id'])
+ })
+ end
+end
+local append_audio_tracks
+append_audio_tracks = function(out, tracks)
+ local internal_tracks = { }
+ for _index_0 = 1, #tracks do
+ local track = tracks[_index_0]
+ if track['external'] then
+ append_track(out, track)
+ else
+ append(internal_tracks, {
+ track
+ })
+ end
+ end
+ if #internal_tracks > 1 then
+ local filter_string = ""
+ for _index_0 = 1, #internal_tracks do
+ local track = internal_tracks[_index_0]
+ filter_string = filter_string .. "[aid" .. tostring(track['id']) .. "]"
+ end
+ filter_string = filter_string .. "amix[ao]"
+ return append(out, {
+ "--lavfi-complex=" .. tostring(filter_string)
+ })
+ else
+ if #internal_tracks == 1 then
+ return append_track(out, internal_tracks[1])
+ end
+ end
+end
+local get_scale_filters
+get_scale_filters = function()
+ local filters = { }
+ if options.force_square_pixels then
+ append(filters, {
+ "lavfi-scale=iw*sar:ih"
+ })
+ end
+ if options.scale_height > 0 then
+ append(filters, {
+ "lavfi-scale=-2:" .. tostring(options.scale_height)
+ })
+ end
+ return filters
+end
+local get_fps_filters
+get_fps_filters = function()
+ if options.fps > 0 then
+ return {
+ "fps=" .. tostring(options.fps)
+ }
+ end
+ return { }
+end
+local get_contrast_brightness_and_saturation_filters
+get_contrast_brightness_and_saturation_filters = function()
+ local mpv_brightness = mp.get_property("brightness")
+ local mpv_contrast = mp.get_property("contrast")
+ local mpv_saturation = mp.get_property("saturation")
+ if mpv_brightness == 0 and mpv_contrast == 0 and mpv_saturation == 0 then
+ return { }
+ end
+ local eq_saturation = (mpv_saturation + 100) / 100.0
+ local eq_contrast = (mpv_contrast + 100) / 100.0
+ local eq_brightness = (mpv_brightness / 50.0 + eq_contrast - 1) / 2.0
+ return {
+ "lavfi-eq=contrast=" .. tostring(eq_contrast) .. ":saturation=" .. tostring(eq_saturation) .. ":brightness=" .. tostring(eq_brightness)
+ }
+end
+local append_property
+append_property = function(out, property_name, option_name)
+ option_name = option_name or property_name
+ local prop = mp.get_property(property_name)
+ if prop and prop ~= "" then
+ return append(out, {
+ "--" .. tostring(option_name) .. "=" .. tostring(prop)
+ })
+ end
+end
+local append_list_options
+append_list_options = function(out, property_name, option_prefix)
+ option_prefix = option_prefix or property_name
+ local prop = mp.get_property_native(property_name)
+ if prop then
+ for _index_0 = 1, #prop do
+ local value = prop[_index_0]
+ append(out, {
+ "--" .. tostring(option_prefix) .. "-append=" .. tostring(value)
+ })
+ end
+ end
+end
+local get_playback_options
+get_playback_options = function()
+ local ret = { }
+ append_property(ret, "sub-ass-override")
+ append_property(ret, "sub-ass-force-style")
+ append_property(ret, "sub-ass-vsfilter-aspect-compat")
+ append_property(ret, "sub-auto")
+ append_property(ret, "sub-pos")
+ append_property(ret, "sub-delay")
+ append_property(ret, "video-rotate")
+ append_property(ret, "ytdl-format")
+ append_property(ret, "deinterlace")
+ return ret
+end
+local get_speed_flags
+get_speed_flags = function()
+ local ret = { }
+ local speed = mp.get_property_native("speed")
+ if speed ~= 1 then
+ append(ret, {
+ "--vf-add=setpts=PTS/" .. tostring(speed),
+ "--af-add=atempo=" .. tostring(speed),
+ "--sub-speed=1/" .. tostring(speed)
+ })
+ end
+ return ret
+end
+local get_metadata_flags
+get_metadata_flags = function()
+ local title = mp.get_property("filename/no-ext")
+ return {
+ "--oset-metadata=title=%" .. tostring(string.len(title)) .. "%" .. tostring(title)
+ }
+end
+local apply_current_filters
+apply_current_filters = function(filters)
+ local vf = mp.get_property_native("vf")
+ msg.verbose("apply_current_filters: got " .. tostring(#vf) .. " currently applied.")
+ for _index_0 = 1, #vf do
+ local _continue_0 = false
+ repeat
+ local filter = vf[_index_0]
+ msg.verbose("apply_current_filters: filter name: " .. tostring(filter['name']))
+ if filter["enabled"] == false then
+ _continue_0 = true
+ break
+ end
+ local str = filter["name"]
+ local params = filter["params"] or { }
+ for k, v in pairs(params) do
+ str = str .. ":" .. tostring(k) .. "=%" .. tostring(string.len(v)) .. "%" .. tostring(v)
+ end
+ append(filters, {
+ str
+ })
+ _continue_0 = true
+ until true
+ if not _continue_0 then
+ break
+ end
+ end
+end
+local get_video_filters
+get_video_filters = function(format, region)
+ local filters = { }
+ append(filters, format:getPreFilters())
+ if options.apply_current_filters then
+ apply_current_filters(filters)
+ end
+ if region and region:is_valid() then
+ append(filters, {
+ "lavfi-crop=" .. tostring(region.w) .. ":" .. tostring(region.h) .. ":" .. tostring(region.x) .. ":" .. tostring(region.y)
+ })
+ end
+ append(filters, get_scale_filters())
+ append(filters, get_fps_filters())
+ append(filters, get_contrast_brightness_and_saturation_filters())
+ append(filters, format:getPostFilters())
+ return filters
+end
+local get_video_encode_flags
+get_video_encode_flags = function(format, region)
+ local flags = { }
+ append(flags, get_playback_options())
+ local filters = get_video_filters(format, region)
+ for _index_0 = 1, #filters do
+ local f = filters[_index_0]
+ append(flags, {
+ "--vf-add=" .. tostring(f)
+ })
+ end
+ append(flags, get_speed_flags())
+ return flags
+end
+local calculate_bitrate
+calculate_bitrate = function(active_tracks, format, length)
+ if format.videoCodec == "" then
+ return nil, options.target_filesize * 8 / length
+ end
+ local video_kilobits = options.target_filesize * 8
+ local audio_kilobits = nil
+ local has_audio_track = #active_tracks["audio"] > 0
+ if options.strict_filesize_constraint and has_audio_track then
+ audio_kilobits = length * options.strict_audio_bitrate
+ video_kilobits = video_kilobits - audio_kilobits
+ end
+ local video_bitrate = math.floor(video_kilobits / length)
+ local audio_bitrate = audio_kilobits and math.floor(audio_kilobits / length) or nil
+ return video_bitrate, audio_bitrate
+end
+local find_path
+find_path = function(startTime, endTime)
+ local path = mp.get_property('path')
+ if not path then
+ return nil, nil, nil, nil, nil
+ end
+ local is_stream = not file_exists(path)
+ local is_temporary = false
+ if is_stream then
+ if mp.get_property('file-format') == 'hls' then
+ path = utils.join_path(parse_directory('~'), 'cache_dump.ts')
+ mp.command_native({
+ 'dump_cache',
+ seconds_to_time_string(startTime, false, true),
+ seconds_to_time_string(endTime + 5, false, true),
+ path
+ })
+ endTime = endTime - startTime
+ startTime = 0
+ is_temporary = true
+ end
+ end
+ return path, is_stream, is_temporary, startTime, endTime
+end
+local encode
+encode = function(region, startTime, endTime)
+ local format = formats[options.output_format]
+ local originalStartTime = startTime
+ local originalEndTime = endTime
+ local path, is_stream, is_temporary
+ path, is_stream, is_temporary, startTime, endTime = find_path(startTime, endTime)
+ if not path then
+ message("No file is being played")
+ return
+ end
+ local command = {
+ "mpv",
+ path,
+ "--start=" .. seconds_to_time_string(startTime, false, true),
+ "--end=" .. seconds_to_time_string(endTime, false, true),
+ "--loop-file=no",
+ "--no-pause"
+ }
+ append(command, format:getCodecFlags())
+ local active_tracks = get_active_tracks()
+ local supported_active_tracks = filter_tracks_supported_by_format(active_tracks, format)
+ for track_type, tracks in pairs(supported_active_tracks) do
+ if track_type == "audio" then
+ append_audio_tracks(command, tracks)
+ else
+ for _index_0 = 1, #tracks do
+ local track = tracks[_index_0]
+ append_track(command, track)
+ end
+ end
+ end
+ for track_type, tracks in pairs(supported_active_tracks) do
+ local _continue_0 = false
+ repeat
+ if #tracks > 0 then
+ _continue_0 = true
+ break
+ end
+ local _exp_0 = track_type
+ if "video" == _exp_0 then
+ append(command, {
+ "--vid=no"
+ })
+ elseif "audio" == _exp_0 then
+ append(command, {
+ "--aid=no"
+ })
+ elseif "sub" == _exp_0 then
+ append(command, {
+ "--sid=no"
+ })
+ end
+ _continue_0 = true
+ until true
+ if not _continue_0 then
+ break
+ end
+ end
+ if format.videoCodec ~= "" then
+ append(command, get_video_encode_flags(format, region))
+ end
+ append(command, format:getFlags())
+ if options.write_filename_on_metadata then
+ append(command, get_metadata_flags())
+ end
+ if format.acceptsBitrate then
+ if options.target_filesize > 0 then
+ local length = endTime - startTime
+ local video_bitrate, audio_bitrate = calculate_bitrate(supported_active_tracks, format, length)
+ if video_bitrate then
+ append(command, {
+ "--ovcopts-add=b=" .. tostring(video_bitrate) .. "k"
+ })
+ end
+ if audio_bitrate then
+ append(command, {
+ "--oacopts-add=b=" .. tostring(audio_bitrate) .. "k"
+ })
+ end
+ if options.strict_filesize_constraint then
+ local type = format.videoCodec ~= "" and "ovc" or "oac"
+ append(command, {
+ "--" .. tostring(type) .. "opts-add=minrate=" .. tostring(bitrate) .. "k",
+ "--" .. tostring(type) .. "opts-add=maxrate=" .. tostring(bitrate) .. "k"
+ })
+ end
+ else
+ local type = format.videoCodec ~= "" and "ovc" or "oac"
+ append(command, {
+ "--" .. tostring(type) .. "opts-add=b=0"
+ })
+ end
+ end
+ for token in string.gmatch(options.additional_flags, "[^%s]+") do
+ command[#command + 1] = token
+ end
+ if not options.strict_filesize_constraint then
+ for token in string.gmatch(options.non_strict_additional_flags, "[^%s]+") do
+ command[#command + 1] = token
+ end
+ if options.crf >= 0 then
+ append(command, {
+ "--ovcopts-add=crf=" .. tostring(options.crf)
+ })
+ end
+ end
+ local dir = ""
+ if is_stream then
+ dir = parse_directory("~")
+ else
+ local _
+ dir, _ = utils.split_path(path)
+ end
+ if options.output_directory ~= "" then
+ dir = parse_directory(options.output_directory)
+ end
+ local formatted_filename = format_filename(originalStartTime, originalEndTime, format)
+ local out_path = utils.join_path(dir, formatted_filename)
+ append(command, {
+ "--o=" .. tostring(out_path)
+ })
+ emit_event("encode-started")
+ if options.twopass and format.supportsTwopass and not is_stream then
+ local first_pass_cmdline
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = 1, #command do
+ local arg = command[_index_0]
+ _accum_0[_len_0] = arg
+ _len_0 = _len_0 + 1
+ end
+ first_pass_cmdline = _accum_0
+ end
+ append(first_pass_cmdline, {
+ "--ovcopts-add=flags=+pass1"
+ })
+ message("Starting first pass...")
+ msg.verbose("First-pass command line: ", table.concat(first_pass_cmdline, " "))
+ local res = run_subprocess({
+ args = first_pass_cmdline,
+ cancellable = false
+ })
+ if not res then
+ message("First pass failed! Check the logs for details.")
+ emit_event("encode-finished", "fail")
+ return
+ end
+ append(command, {
+ "--ovcopts-add=flags=+pass2"
+ })
+ if format.videoCodec == "libvpx" then
+ msg.verbose("Patching libvpx pass log file...")
+ vp8_patch_logfile(get_pass_logfile_path(out_path), endTime - startTime)
+ end
+ end
+ command = format:postCommandModifier(command, region, startTime, endTime)
+ msg.info("Encoding to", out_path)
+ msg.verbose("Command line:", table.concat(command, " "))
+ if options.run_detached then
+ message("Started encode, process was detached.")
+ return utils.subprocess_detached({
+ args = command
+ })
+ else
+ local res = false
+ if not should_display_progress() then
+ message("Started encode...")
+ res = run_subprocess({
+ args = command,
+ cancellable = false
+ })
+ else
+ local ewp = EncodeWithProgress(startTime, endTime)
+ res = ewp:startEncode(command)
+ end
+ if res then
+ message("Encoded successfully! Saved to\\N" .. tostring(bold(out_path)))
+ emit_event("encode-finished", "success")
+ else
+ message("Encode failed! Check the logs for details.")
+ emit_event("encode-finished", "fail")
+ end
+ os.remove(get_pass_logfile_path(out_path))
+ if is_temporary then
+ return os.remove(path)
+ end
+ end
+end
+local CropPage
+do
+ local _class_0
+ local _parent_0 = Page
+ local _base_0 = {
+ reset = function(self)
+ local dimensions = get_video_dimensions()
+ local xa, ya
+ do
+ local _obj_0 = dimensions.top_left
+ xa, ya = _obj_0.x, _obj_0.y
+ end
+ self.pointA:set_from_screen(xa, ya)
+ local xb, yb
+ do
+ local _obj_0 = dimensions.bottom_right
+ xb, yb = _obj_0.x, _obj_0.y
+ end
+ self.pointB:set_from_screen(xb, yb)
+ if self.visible then
+ return self:draw()
+ end
+ end,
+ setPointA = function(self)
+ local posX, posY = mp.get_mouse_pos()
+ self.pointA:set_from_screen(posX, posY)
+ if self.visible then
+ return self:draw()
+ end
+ end,
+ setPointB = function(self)
+ local posX, posY = mp.get_mouse_pos()
+ self.pointB:set_from_screen(posX, posY)
+ if self.visible then
+ return self:draw()
+ end
+ end,
+ cancel = function(self)
+ self:hide()
+ return self.callback(false, nil)
+ end,
+ finish = function(self)
+ local region = Region()
+ region:set_from_points(self.pointA, self.pointB)
+ self:hide()
+ return self.callback(true, region)
+ end,
+ draw_box = function(self, ass)
+ local region = Region()
+ region:set_from_points(self.pointA:to_screen(), self.pointB:to_screen())
+ local d = get_video_dimensions()
+ ass:new_event()
+ ass:append("{\\an7}")
+ ass:pos(0, 0)
+ ass:append('{\\bord0}')
+ ass:append('{\\shad0}')
+ ass:append('{\\c&H000000&}')
+ ass:append('{\\alpha&H77}')
+ ass:draw_start()
+ ass:rect_cw(d.top_left.x, d.top_left.y, region.x, region.y + region.h)
+ ass:rect_cw(region.x, d.top_left.y, d.bottom_right.x, region.y)
+ ass:rect_cw(d.top_left.x, region.y + region.h, region.x + region.w, d.bottom_right.y)
+ ass:rect_cw(region.x + region.w, region.y, d.bottom_right.x, d.bottom_right.y)
+ return ass:draw_stop()
+ end,
+ draw = function(self)
+ local window = { }
+ window.w, window.h = mp.get_osd_size()
+ local ass = assdraw.ass_new()
+ self:draw_box(ass)
+ ass:new_event()
+ self:setup_text(ass)
+ ass:append(tostring(bold('Crop:')) .. "\\N")
+ ass:append(tostring(bold('1:')) .. " change point A (" .. tostring(self.pointA.x) .. ", " .. tostring(self.pointA.y) .. ")\\N")
+ ass:append(tostring(bold('2:')) .. " change point B (" .. tostring(self.pointB.x) .. ", " .. tostring(self.pointB.y) .. ")\\N")
+ ass:append(tostring(bold('r:')) .. " reset to whole screen\\N")
+ ass:append(tostring(bold('ESC:')) .. " cancel crop\\N")
+ local width, height = math.abs(self.pointA.x - self.pointB.x), math.abs(self.pointA.y - self.pointB.y)
+ ass:append(tostring(bold('ENTER:')) .. " confirm crop (" .. tostring(width) .. "x" .. tostring(height) .. ")\\N")
+ return mp.set_osd_ass(window.w, window.h, ass.text)
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self, callback, region)
+ self.pointA = VideoPoint()
+ self.pointB = VideoPoint()
+ self.keybinds = {
+ ["1"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.setPointA
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["2"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.setPointB
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["r"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.reset
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["ESC"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.cancel
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["ENTER"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.finish
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)()
+ }
+ self:reset()
+ self.callback = callback
+ if region and region:is_valid() then
+ self.pointA.x = region.x
+ self.pointA.y = region.y
+ self.pointB.x = region.x + region.w
+ self.pointB.y = region.y + region.h
+ end
+ end,
+ __base = _base_0,
+ __name = "CropPage",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ CropPage = _class_0
+end
+local Option
+do
+ local _class_0
+ local _base_0 = {
+ hasPrevious = function(self)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ return true
+ elseif "int" == _exp_0 then
+ if self.opts.min then
+ return self.value > self.opts.min
+ else
+ return true
+ end
+ elseif "list" == _exp_0 then
+ return self.value > 1
+ end
+ end,
+ hasNext = function(self)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ return true
+ elseif "int" == _exp_0 then
+ if self.opts.max then
+ return self.value < self.opts.max
+ else
+ return true
+ end
+ elseif "list" == _exp_0 then
+ return self.value < #self.opts.possibleValues
+ end
+ end,
+ leftKey = function(self)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ self.value = not self.value
+ elseif "int" == _exp_0 then
+ self.value = self.value - self.opts.step
+ if self.opts.min and self.opts.min > self.value then
+ self.value = self.opts.min
+ end
+ elseif "list" == _exp_0 then
+ if self.value > 1 then
+ self.value = self.value - 1
+ end
+ end
+ end,
+ rightKey = function(self)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ self.value = not self.value
+ elseif "int" == _exp_0 then
+ self.value = self.value + self.opts.step
+ if self.opts.max and self.opts.max < self.value then
+ self.value = self.opts.max
+ end
+ elseif "list" == _exp_0 then
+ if self.value < #self.opts.possibleValues then
+ self.value = self.value + 1
+ end
+ end
+ end,
+ getValue = function(self)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ return self.value
+ elseif "int" == _exp_0 then
+ return self.value
+ elseif "list" == _exp_0 then
+ local value, _
+ do
+ local _obj_0 = self.opts.possibleValues[self.value]
+ value, _ = _obj_0[1], _obj_0[2]
+ end
+ return value
+ end
+ end,
+ setValue = function(self, value)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ self.value = value
+ elseif "int" == _exp_0 then
+ self.value = value
+ elseif "list" == _exp_0 then
+ local set = false
+ for i, possiblePair in ipairs(self.opts.possibleValues) do
+ local possibleValue, _
+ possibleValue, _ = possiblePair[1], possiblePair[2]
+ if possibleValue == value then
+ set = true
+ self.value = i
+ break
+ end
+ end
+ if not set then
+ return msg.warn("Tried to set invalid value " .. tostring(value) .. " to " .. tostring(self.displayText) .. " option.")
+ end
+ end
+ end,
+ getDisplayValue = function(self)
+ local _exp_0 = self.optType
+ if "bool" == _exp_0 then
+ return self.value and "yes" or "no"
+ elseif "int" == _exp_0 then
+ if self.opts.altDisplayNames and self.opts.altDisplayNames[self.value] then
+ return self.opts.altDisplayNames[self.value]
+ else
+ return tostring(self.value)
+ end
+ elseif "list" == _exp_0 then
+ local value, displayValue
+ do
+ local _obj_0 = self.opts.possibleValues[self.value]
+ value, displayValue = _obj_0[1], _obj_0[2]
+ end
+ return displayValue or value
+ end
+ end,
+ draw = function(self, ass, selected)
+ if selected then
+ ass:append(tostring(bold(self.displayText)) .. ": ")
+ else
+ ass:append(tostring(self.displayText) .. ": ")
+ end
+ if self:hasPrevious() then
+ ass:append("◀ ")
+ end
+ ass:append(self:getDisplayValue())
+ if self:hasNext() then
+ ass:append(" ▶")
+ end
+ return ass:append("\\N")
+ end,
+ optVisible = function(self)
+ if self.visibleCheckFn == nil then
+ return true
+ else
+ return self.visibleCheckFn()
+ end
+ end
+ }
+ _base_0.__index = _base_0
+ _class_0 = setmetatable({
+ __init = function(self, optType, displayText, value, opts, visibleCheckFn)
+ self.optType = optType
+ self.displayText = displayText
+ self.opts = opts
+ self.value = 1
+ self.visibleCheckFn = visibleCheckFn
+ return self:setValue(value)
+ end,
+ __base = _base_0,
+ __name = "Option"
+ }, {
+ __index = _base_0,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ Option = _class_0
+end
+local EncodeOptionsPage
+do
+ local _class_0
+ local _parent_0 = Page
+ local _base_0 = {
+ getCurrentOption = function(self)
+ return self.options[self.currentOption][2]
+ end,
+ leftKey = function(self)
+ (self:getCurrentOption()):leftKey()
+ return self:draw()
+ end,
+ rightKey = function(self)
+ (self:getCurrentOption()):rightKey()
+ return self:draw()
+ end,
+ prevOpt = function(self)
+ for i = self.currentOption - 1, 1, -1 do
+ if self.options[i][2]:optVisible() then
+ self.currentOption = i
+ break
+ end
+ end
+ return self:draw()
+ end,
+ nextOpt = function(self)
+ for i = self.currentOption + 1, #self.options do
+ if self.options[i][2]:optVisible() then
+ self.currentOption = i
+ break
+ end
+ end
+ return self:draw()
+ end,
+ confirmOpts = function(self)
+ for _, optPair in ipairs(self.options) do
+ local optName, opt
+ optName, opt = optPair[1], optPair[2]
+ options[optName] = opt:getValue()
+ end
+ self:hide()
+ return self.callback(true)
+ end,
+ cancelOpts = function(self)
+ self:hide()
+ return self.callback(false)
+ end,
+ draw = function(self)
+ local window_w, window_h = mp.get_osd_size()
+ local ass = assdraw.ass_new()
+ ass:new_event()
+ self:setup_text(ass)
+ ass:append(tostring(bold('Options:')) .. "\\N\\N")
+ for i, optPair in ipairs(self.options) do
+ local opt = optPair[2]
+ if opt:optVisible() then
+ opt:draw(ass, self.currentOption == i)
+ end
+ end
+ ass:append("\\N▲ / ▼: navigate\\N")
+ ass:append(tostring(bold('ENTER:')) .. " confirm options\\N")
+ ass:append(tostring(bold('ESC:')) .. " cancel\\N")
+ return mp.set_osd_ass(window_w, window_h, ass.text)
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self, callback)
+ self.callback = callback
+ self.currentOption = 1
+ local scaleHeightOpts = {
+ possibleValues = {
+ {
+ -1,
+ "no"
+ },
+ {
+ 144
+ },
+ {
+ 240
+ },
+ {
+ 360
+ },
+ {
+ 480
+ },
+ {
+ 540
+ },
+ {
+ 720
+ },
+ {
+ 1080
+ },
+ {
+ 1440
+ },
+ {
+ 2160
+ }
+ }
+ }
+ local filesizeOpts = {
+ step = 250,
+ min = 0,
+ altDisplayNames = {
+ [0] = "0 (constant quality)"
+ }
+ }
+ local crfOpts = {
+ step = 1,
+ min = -1,
+ altDisplayNames = {
+ [-1] = "disabled"
+ }
+ }
+ local fpsOpts = {
+ possibleValues = {
+ {
+ -1,
+ "source"
+ },
+ {
+ 15
+ },
+ {
+ 24
+ },
+ {
+ 30
+ },
+ {
+ 48
+ },
+ {
+ 50
+ },
+ {
+ 60
+ },
+ {
+ 120
+ },
+ {
+ 240
+ }
+ }
+ }
+ local formatIds = {
+ "av1",
+ "hevc",
+ "webm-vp9",
+ "avc",
+ "avc-nvenc",
+ "webm-vp8",
+ "gif",
+ "mp3",
+ "raw"
+ }
+ local formatOpts = {
+ possibleValues = (function()
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = 1, #formatIds do
+ local fId = formatIds[_index_0]
+ _accum_0[_len_0] = {
+ fId,
+ formats[fId].displayName
+ }
+ _len_0 = _len_0 + 1
+ end
+ return _accum_0
+ end)()
+ }
+ local gifDitherOpts = {
+ possibleValues = {
+ {
+ 0,
+ "bayer_scale 0"
+ },
+ {
+ 1,
+ "bayer_scale 1"
+ },
+ {
+ 2,
+ "bayer_scale 2"
+ },
+ {
+ 3,
+ "bayer_scale 3"
+ },
+ {
+ 4,
+ "bayer_scale 4"
+ },
+ {
+ 5,
+ "bayer_scale 5"
+ },
+ {
+ 6,
+ "sierra2_4a"
+ }
+ }
+ }
+ self.options = {
+ {
+ "output_format",
+ Option("list", "Output Format", options.output_format, formatOpts)
+ },
+ {
+ "twopass",
+ Option("bool", "Two Pass", options.twopass)
+ },
+ {
+ "apply_current_filters",
+ Option("bool", "Apply Current Video Filters", options.apply_current_filters)
+ },
+ {
+ "scale_height",
+ Option("list", "Scale Height", options.scale_height, scaleHeightOpts)
+ },
+ {
+ "strict_filesize_constraint",
+ Option("bool", "Strict Filesize Constraint", options.strict_filesize_constraint)
+ },
+ {
+ "write_filename_on_metadata",
+ Option("bool", "Write Filename on Metadata", options.write_filename_on_metadata)
+ },
+ {
+ "target_filesize",
+ Option("int", "Target Filesize", options.target_filesize, filesizeOpts)
+ },
+ {
+ "crf",
+ Option("int", "CRF", options.crf, crfOpts)
+ },
+ {
+ "fps",
+ Option("list", "FPS", options.fps, fpsOpts)
+ },
+ {
+ "gif_dither",
+ Option("list", "GIF Dither Type", options.gif_dither, gifDitherOpts, function()
+ return self.options[1][2]:getValue() == "gif"
+ end)
+ },
+ {
+ "force_square_pixels",
+ Option("bool", "Force Square Pixels", options.force_square_pixels)
+ }
+ }
+ self.keybinds = {
+ ["LEFT"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.leftKey
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["RIGHT"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.rightKey
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["UP"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.prevOpt
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["DOWN"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.nextOpt
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["ENTER"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.confirmOpts
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["ESC"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.cancelOpts
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)()
+ }
+ end,
+ __base = _base_0,
+ __name = "EncodeOptionsPage",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ EncodeOptionsPage = _class_0
+end
+local PreviewPage
+do
+ local _class_0
+ local _parent_0 = Page
+ local _base_0 = {
+ prepare = function(self)
+ local vf = mp.get_property_native("vf")
+ vf[#vf + 1] = {
+ name = "sub"
+ }
+ if self.region:is_valid() then
+ vf[#vf + 1] = {
+ name = "crop",
+ params = {
+ w = tostring(self.region.w),
+ h = tostring(self.region.h),
+ x = tostring(self.region.x),
+ y = tostring(self.region.y)
+ }
+ }
+ end
+ mp.set_property_native("vf", vf)
+ if self.startTime > -1 and self.endTime > -1 then
+ mp.set_property_native("ab-loop-a", self.startTime)
+ mp.set_property_native("ab-loop-b", self.endTime)
+ mp.set_property_native("time-pos", self.startTime)
+ end
+ return mp.set_property_native("pause", false)
+ end,
+ dispose = function(self)
+ mp.set_property("ab-loop-a", "no")
+ mp.set_property("ab-loop-b", "no")
+ for prop, value in pairs(self.originalProperties) do
+ mp.set_property_native(prop, value)
+ end
+ end,
+ draw = function(self)
+ local window_w, window_h = mp.get_osd_size()
+ local ass = assdraw.ass_new()
+ ass:new_event()
+ self:setup_text(ass)
+ ass:append("Press " .. tostring(bold('ESC')) .. " to exit preview.\\N")
+ return mp.set_osd_ass(window_w, window_h, ass.text)
+ end,
+ cancel = function(self)
+ self:hide()
+ return self.callback()
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self, callback, region, startTime, endTime)
+ self.callback = callback
+ self.originalProperties = {
+ ["vf"] = mp.get_property_native("vf"),
+ ["time-pos"] = mp.get_property_native("time-pos"),
+ ["pause"] = mp.get_property_native("pause")
+ }
+ self.keybinds = {
+ ["ESC"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.cancel
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)()
+ }
+ self.region = region
+ self.startTime = startTime
+ self.endTime = endTime
+ self.isLoop = false
+ end,
+ __base = _base_0,
+ __name = "PreviewPage",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ PreviewPage = _class_0
+end
+local MainPage
+do
+ local _class_0
+ local _parent_0 = Page
+ local _base_0 = {
+ setStartTime = function(self)
+ self.startTime = mp.get_property_number("time-pos")
+ if self.visible then
+ self:clear()
+ return self:draw()
+ end
+ end,
+ setEndTime = function(self)
+ self.endTime = mp.get_property_number("time-pos")
+ if self.visible then
+ self:clear()
+ return self:draw()
+ end
+ end,
+ jumpToStartTime = function(self)
+ return mp.set_property("time-pos", self.startTime)
+ end,
+ jumpToEndTime = function(self)
+ return mp.set_property("time-pos", self.endTime)
+ end,
+ setupStartAndEndTimes = function(self)
+ if mp.get_property_native("duration") then
+ self.startTime = 0
+ self.endTime = mp.get_property_native("duration")
+ else
+ self.startTime = -1
+ self.endTime = -1
+ end
+ if self.visible then
+ self:clear()
+ return self:draw()
+ end
+ end,
+ draw = function(self)
+ local window_w, window_h = mp.get_osd_size()
+ local ass = assdraw.ass_new()
+ ass:new_event()
+ self:setup_text(ass)
+ ass:append(tostring(bold('WebM maker')) .. "\\N\\N")
+ ass:append(tostring(bold('c:')) .. " crop\\N")
+ ass:append(tostring(bold('1:')) .. " set start time (current is " .. tostring(seconds_to_time_string(self.startTime)) .. ")\\N")
+ ass:append(tostring(bold('2:')) .. " set end time (current is " .. tostring(seconds_to_time_string(self.endTime)) .. ")\\N")
+ ass:append(tostring(bold('!:')) .. " jump to start time\\N")
+ ass:append(tostring(bold('@:')) .. " jump to end time\\N")
+ ass:append(tostring(bold('o:')) .. " change encode options\\N")
+ ass:append(tostring(bold('p:')) .. " preview\\N")
+ ass:append(tostring(bold('e:')) .. " encode\\N\\N")
+ ass:append(tostring(bold('ESC:')) .. " close\\N")
+ return mp.set_osd_ass(window_w, window_h, ass.text)
+ end,
+ show = function(self)
+ _class_0.__parent.show(self)
+ return emit_event("show-main-page")
+ end,
+ onUpdateCropRegion = function(self, updated, newRegion)
+ if updated then
+ self.region = newRegion
+ end
+ return self:show()
+ end,
+ crop = function(self)
+ self:hide()
+ local cropPage = CropPage((function()
+ local _base_1 = self
+ local _fn_0 = _base_1.onUpdateCropRegion
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(), self.region)
+ return cropPage:show()
+ end,
+ onOptionsChanged = function(self, updated)
+ return self:show()
+ end,
+ changeOptions = function(self)
+ self:hide()
+ local encodeOptsPage = EncodeOptionsPage((function()
+ local _base_1 = self
+ local _fn_0 = _base_1.onOptionsChanged
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)())
+ return encodeOptsPage:show()
+ end,
+ onPreviewEnded = function(self)
+ return self:show()
+ end,
+ preview = function(self)
+ self:hide()
+ local previewPage = PreviewPage((function()
+ local _base_1 = self
+ local _fn_0 = _base_1.onPreviewEnded
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(), self.region, self.startTime, self.endTime)
+ return previewPage:show()
+ end,
+ encode = function(self)
+ self:hide()
+ if self.startTime < 0 then
+ message("No start time, aborting")
+ return
+ end
+ if self.endTime < 0 then
+ message("No end time, aborting")
+ return
+ end
+ if self.startTime >= self.endTime then
+ message("Start time is ahead of end time, aborting")
+ return
+ end
+ return encode(self.region, self.startTime, self.endTime)
+ end
+ }
+ _base_0.__index = _base_0
+ setmetatable(_base_0, _parent_0.__base)
+ _class_0 = setmetatable({
+ __init = function(self)
+ self.keybinds = {
+ ["c"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.crop
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["1"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.setStartTime
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["2"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.setEndTime
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["!"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.jumpToStartTime
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["@"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.jumpToEndTime
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["o"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.changeOptions
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["p"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.preview
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["e"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.encode
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)(),
+ ["ESC"] = (function()
+ local _base_1 = self
+ local _fn_0 = _base_1.hide
+ return function(...)
+ return _fn_0(_base_1, ...)
+ end
+ end)()
+ }
+ self.startTime = -1
+ self.endTime = -1
+ self.region = Region()
+ end,
+ __base = _base_0,
+ __name = "MainPage",
+ __parent = _parent_0
+ }, {
+ __index = function(cls, name)
+ local val = rawget(_base_0, name)
+ if val == nil then
+ local parent = rawget(cls, "__parent")
+ if parent then
+ return parent[name]
+ end
+ else
+ return val
+ end
+ end,
+ __call = function(cls, ...)
+ local _self_0 = setmetatable({}, _base_0)
+ cls.__init(_self_0, ...)
+ return _self_0
+ end
+ })
+ _base_0.__class = _class_0
+ if _parent_0.__inherited then
+ _parent_0.__inherited(_parent_0, _class_0)
+ end
+ MainPage = _class_0
+end
+monitor_dimensions()
+local mainPage = MainPage()
+mp.add_key_binding(options.keybind, "display-webm-encoder", (function()
+ local _base_0 = mainPage
+ local _fn_0 = _base_0.show
+ return function(...)
+ return _fn_0(_base_0, ...)
+ end
+end)(), {
+ repeatable = false
+})
+mp.register_event("file-loaded", (function()
+ local _base_0 = mainPage
+ local _fn_0 = _base_0.setupStartAndEndTimes
+ return function(...)
+ return _fn_0(_base_0, ...)
+ end
+end)())
+msg.verbose("Loaded mpv-webm script!")
+return emit_event("script-loaded")
diff --git a/config/qutebrowser/autoconfig.yml b/config/qutebrowser/autoconfig.yml
@@ -0,0 +1,10 @@
+# If a config.py file exists, this file is ignored unless it's explicitly loaded
+# via config.load_autoconfig(). For more information, see:
+# https://github.com/qutebrowser/qutebrowser/blob/main/doc/help/configuring.asciidoc#loading-autoconfigyml
+# DO NOT edit this file by hand, qutebrowser will overwrite it.
+# Instead, create a config.py - see :help for details.
+
+config_version: 2
+settings:
+ content.desktop_capture:
+ https://screensy.marijn.it: true
diff --git a/config/qutebrowser/bookmarks/urls b/config/qutebrowser/bookmarks/urls
@@ -0,0 +1,20 @@
+https://github.com/Jacksaur/Gorgeous-GRUB GitHub - Jacksaur/Gorgeous-GRUB: Collection of decent Community-made GRUB themes. Contributions welcome!
+https://wallhaven.cc/ Awesome Wallpapers - wallhaven.cc
+https://wiki.gentoo.org/wiki/LTO#cite_note-1 LTO - Gentoo wiki
+https://wiki.gentoo.org/wiki/Installation_on_libreboot Installation on libreboot - Gentoo wiki
+https://libreboot.org/ Libreboot – Libreboot project
+http://192.168.1.62:8000/ Directory listing for /
+https://screensy.marijn.it/#TheH screensy
+https://suckless.org/ software that sucks less | suckless.org software that sucks less
+https://github.com/runlikeforrestgump/dwm GitHub - runlikeforrestgump/dwm: Patches for dwm (dynamic window manager from suckless)
+https://github.com/mpv-player/mpv/blob/master/TOOLS/umpv mpv/TOOLS/umpv at master · mpv-player/mpv · GitHub
+https://github.com/qutebrowser/qutebrowser/blob/main/scripts/open_url_in_instance.sh qutebrowser/scripts/open_url_in_instance.sh at main · qutebrowser/qutebrowser · GitHub
+https://dwm.suckless.org/patches/statuscolors/ dwm - dynamic window manager | suckless.org software that sucks less
+https://www.antixforum.com/forums/topic/no-logind-no-dbus-no-esysusers-no-udev-nldev-smdev-mdevd-libudev-zero/ no logind, no dbus, no esysusers, no …. udev?? nldev smdev mdevd libudev-zero – antiX-forum
+https://github.com/illiliti/libudev-zero GitHub - illiliti/libudev-zero: Daemonless replacement for libudev
+https://www.rhymezone.com/ RhymeZone rhyming dictionary and thesaurus
+https://thonkpeasant.xyz/guides/other/theming.html Libreboot Theming
+https://github.com/corna/me_cleaner GitHub - corna/me_cleaner: Tool for partial deblobbing of Intel ME/TXE firmware images
+https://read.easypeasymethod.org/ EasyPeasy
+https://dzen.ru/a/XkYi_7rsjzZfH6ib Распаковка и правка BIOS на примере HP dv6-6b56er. | Bill Vates | Дзен
+https://git.codemadness.org/stagit/file/README.html README - stagit - static git page generator
diff --git a/config/qutebrowser/config.py b/config/qutebrowser/config.py
@@ -0,0 +1,242 @@
+from qutebrowser.api import interceptor
+# Autogenerated config.py
+#
+# NOTE: config.py is intended for advanced users who are comfortable
+# with manually migrating the config file on qutebrowser upgrades. If
+# you prefer, you can also configure qutebrowser using the
+# :set/:bind/:config-* commands without having to write a config.py
+# file.
+#
+# Documentation:
+# qute://help/configuring.html
+# qute://help/settings.html
+
+# Change the argument to True to still load settings configured via autoconfig.yml
+config.load_autoconfig(False)
+
+# Which cookies to accept. With QtWebEngine, this setting also controls
+# other features with tracking capabilities similar to those of cookies;
+# including IndexedDB, DOM storage, filesystem API, service workers, and
+# AppCache. Note that with QtWebKit, only `all` and `never` are
+# supported as per-domain values. Setting `no-3rdparty` or `no-
+# unknown-3rdparty` per-domain on QtWebKit will have the same effect as
+# `all`. If this setting is used with URL patterns, the pattern gets
+# applied to the origin/first party URL of the page making the request,
+# not the request URL. With QtWebEngine 5.15.0+, paths will be stripped
+# from URLs, so URL patterns using paths will not match. With
+# QtWebEngine 5.15.2+, subdomains are additionally stripped as well, so
+# you will typically need to set this setting for `example.com` when the
+# cookie is set on `somesubdomain.example.com` for it to work properly.
+# To debug issues with this setting, start qutebrowser with `--debug
+# --logfilter network --debug-flag log-cookies` which will show all
+# cookies being set.
+# Type: String
+# Valid values:
+# - all: Accept all cookies.
+# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail.
+# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty.
+# - never: Don't accept cookies at all.
+config.set('content.cookies.accept', 'all', 'chrome-devtools://*')
+
+# Setting dark mode
+config.set("colors.webpage.darkmode.enabled", False)
+
+# Which cookies to accept. With QtWebEngine, this setting also controls
+# other features with tracking capabilities similar to those of cookies;
+# including IndexedDB, DOM storage, filesystem API, service workers, and
+# AppCache. Note that with QtWebKit, only `all` and `never` are
+# supported as per-domain values. Setting `no-3rdparty` or `no-
+# unknown-3rdparty` per-domain on QtWebKit will have the same effect as
+# `all`. If this setting is used with URL patterns, the pattern gets
+# applied to the origin/first party URL of the page making the request,
+# not the request URL. With QtWebEngine 5.15.0+, paths will be stripped
+# from URLs, so URL patterns using paths will not match. With
+# QtWebEngine 5.15.2+, subdomains are additionally stripped as well, so
+# you will typically need to set this setting for `example.com` when the
+# cookie is set on `somesubdomain.example.com` for it to work properly.
+# To debug issues with this setting, start qutebrowser with `--debug
+# --logfilter network --debug-flag log-cookies` which will show all
+# cookies being set.
+# Type: String
+# Valid values:
+# - all: Accept all cookies.
+# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail.
+# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty.
+# - never: Don't accept cookies at all.
+config.set('content.cookies.accept', 'all', 'devtools://*')
+
+# Value to send in the `Accept-Language` header. Note that the value
+# read from JavaScript is always the global value.
+# Type: String
+config.set('content.headers.accept_language', '', 'https://matchmaker.krunker.io/*')
+
+# User agent to send. The following placeholders are defined: *
+# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
+# The underlying WebKit version (set to a fixed value with
+# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
+# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
+# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
+# QtWebEngine. * `{upstream_browser_version}`: The corresponding
+# Safari/Chrome version. * `{qutebrowser_version}`: The currently
+# running qutebrowser version. The default value is equal to the
+# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
+# read from JavaScript is always the global value. With QtWebEngine
+# between 5.12 and 5.14 (inclusive), changing the value exposed to
+# JavaScript requires a restart.
+# Type: FormatString
+config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/{webkit_version} (KHTML, like Gecko) {upstream_browser_key}/{upstream_browser_version} Safari/{webkit_version}', 'https://web.whatsapp.com/')
+
+# User agent to send. The following placeholders are defined: *
+# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
+# The underlying WebKit version (set to a fixed value with
+# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
+# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
+# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
+# QtWebEngine. * `{upstream_browser_version}`: The corresponding
+# Safari/Chrome version. * `{qutebrowser_version}`: The currently
+# running qutebrowser version. The default value is equal to the
+# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
+# read from JavaScript is always the global value. With QtWebEngine
+# between 5.12 and 5.14 (inclusive), changing the value exposed to
+# JavaScript requires a restart.
+# Type: FormatString
+config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:90.0) Gecko/20100101 Firefox/90.0', 'https://accounts.google.com/*')
+
+#Ad/Tracker blocking
+def perish_evil(info: interceptor.Request):
+ url=info.request_url
+ if ((
+ url.host()=="mos.ru"
+ and url.path()=="/logs"
+ ) or (
+ url.host()=="www.mos.ru"
+ and (url.path()=="/api/analytics-forwarder/v1/events" or url.path()=="/stproxy/services/")
+ ) or (
+ url.host()=="school.mos.ru"
+ and (url.path()=="/v1/roles/allGlobal/" or url.path()=="/v1/allSubsystems/" or url.path()=="/v1/oauth/userinfo" or url.path()=="/api/ej/chat/family/v1/messages/count_unread_and_important" or url.path()=="/api/news/v2/banners/instance" or url.path()=="/api/ej/core/family/v1/banners" or url.path()=="/api/additional_education/v1/ae_groups" or url.path()=="/api/ej/core/family/v1/emias_medical_recommendations" or url.path()=="/v2/external-partners/check-for-vk-user")
+ ) or (
+ url.host()=="dnevnik.mos.ru"
+ and url.path()=="/diary/schedules/undefined"
+ ) or (
+ url.host()=="yastatic.net"
+ and url.path()=="/s3/distribution/yanalytics/v7/yanalytics.js"
+ ) or (
+ url.host()=="apis.google.com"
+ and url.path()=="/js/googleapis.proxy.js"
+ ) or (
+ url.host()=="drive.google.com"
+ and (url.path()=="/drivesharing" or url.path()=="/viewer2/prod-01/presspage")
+ ) or (
+ url.host()=="ssl.gstatic.com"
+ and url.path()=="/docs/common/cleardot.gif"
+ )
+ ):
+ info.block()
+
+interceptor.register(perish_evil)
+
+#Start pages
+config.set('url.default_page', 'https://stellar-nexus.ru/en')
+c.url.start_pages = ['https://stellar-nexus.ru/en']
+
+#File manager
+config.set("fileselect.handler", "external")
+config.set("fileselect.single_file.command", ['st', '-e', 'ranger', '--choosefile', '{}'])
+config.set("fileselect.multiple_files.command", ['st', '-e', 'ranger', '--choosefiles', '{}'])
+
+#Color scheme
+config.set('colors.webpage.preferred_color_scheme', 'dark')
+config.set('colors.completion.odd.bg', '#333333')
+config.set('colors.completion.even.bg', '#222222')
+config.set('colors.hints.bg', 'black')
+config.set('colors.hints.fg', 'white')
+config.set('hints.border', '1px solid #ce4404')
+config.set('colors.completion.category.bg', '#ce4404')
+config.set('colors.tabs.bar.bg', '#222222')
+config.set('colors.tabs.odd.bg', '#222222')
+config.set('colors.tabs.even.bg', '#222222')
+config.set('colors.tabs.selected.odd.bg', '#ce4404')
+config.set('colors.tabs.selected.even.bg', '#ce4404')
+config.set('colors.tabs.pinned.odd.bg', '#444444')
+config.set('colors.tabs.pinned.even.bg', '#444444')
+config.set('colors.tabs.pinned.selected.odd.bg', '#ce4404')
+config.set('colors.tabs.pinned.selected.even.bg', '#ce4404')
+
+#Bindings for normal mode
+config.bind('h', 'back')
+config.bind('j', 'tab-prev')
+config.bind('k', 'tab-next')
+config.bind('l', 'forward')
+config.bind('H', 'tab-clone;; back;; tab-move -')
+config.bind('J', 'tab-move -')
+config.bind('K', 'tab-move +')
+config.bind('L', 'tab-clone;; forward')
+config.bind('d', 'tab-move -;; tab-close')
+config.bind('D', 'tab-close')
+config.bind('cc', 'tab-clone')
+config.bind('to', 'tab-only')
+config.bind('R', 'spawn /home/plat/scripts/qutebrowser-redraw.sh')
+config.bind('m', 'hint links spawn -d /home/plat/scripts/append_music.sh {hint-url}')
+config.bind('M', 'hint links spawn -d /home/plat/scripts/play_video.sh {hint-url}')
+config.bind('I', 'hint images download')
+config.bind('sm', 'hint links spawn -d /home/plat/scripts/send_music.sh {hint-url}')
+config.bind('W', 'spawn /home/plat/scripts/qutebrowser-pseudo-tran-switch.sh')
+
+#Preferences
+config.set('window.title_format', 'qutebrowser')
+config.set('statusbar.show', 'never')
+config.set('tabs.show', 'multiple')
+config.set('tabs.position', 'bottom')
+config.set('tabs.indicator.width', 0)
+config.set('scrolling.bar', 'when-searching')
+config.set('completion.scrollbar.width', 0)
+config.set('tabs.title.format_pinned', '{audio}{index}')
+config.set('fonts.tabs.unselected', '12pt default_family')
+config.set('fonts.tabs.selected', '12pt default_family')
+
+config.set('content.unknown_url_scheme_policy', 'allow-all')
+
+#Search engines
+c.url.searchengines = {'DEFAULT': 'https://searx.stellar-nexus.ru/searxng/search?q={}',
+}
+
+
+# User agent to send. The following placeholders are defined: *
+# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
+# The underlying WebKit version (set to a fixed value with
+# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
+# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
+# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
+# QtWebEngine. * `{upstream_browser_version}`: The corresponding
+# Safari/Chrome version. * `{qutebrowser_version}`: The currently
+# running qutebrowser version. The default value is equal to the
+# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
+# read from JavaScript is always the global value. With QtWebEngine
+# between 5.12 and 5.14 (inclusive), changing the value exposed to
+# JavaScript requires a restart.
+# Type: FormatString
+config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99 Safari/537.36', 'https://*.slack.com/*')
+
+# Load images automatically in web pages.
+# Type: Bool
+config.set('content.images', True, 'chrome-devtools://*')
+
+# Load images automatically in web pages.
+# Type: Bool
+config.set('content.images', True, 'devtools://*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'chrome-devtools://*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'devtools://*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'chrome://*/*')
+
+# Enable JavaScript.
+# Type: Bool
+config.set('content.javascript.enabled', True, 'qute://*/*')
diff --git a/config/qutebrowser/greasemonkey/pseudo-tran.js b/config/qutebrowser/greasemonkey/pseudo-tran.js
@@ -0,0 +1,27 @@
+// ==UserScript==
+// @name Pseudo transparency
+// @description Allows you to set a background image to all pages
+// @include *
+// @run-at document-start
+// @version 2
+// @author Plat
+// ==/UserScript==
+
+(function IIFE() {
+ 'use strict';
+
+ document.addEventListener('readystatechange', function onReadyStateChange() {
+ if (document.readyState == 'interactive') {
+ const style = document.createElement('style');
+ document.head.appendChild(style);
+ style.innerHTML = `
+
+body {
+ background-image: url("https://stellar-nexus.ru/wall.png") !important;
+ background-repeat: no-repeat !important;
+ background-attachment: fixed !important;
+}
+ `;
+ }
+ });
+})();
diff --git a/config/qutebrowser/greasemonkey/white-text.js.disabled b/config/qutebrowser/greasemonkey/white-text.js.disabled
@@ -0,0 +1,25 @@
+// ==UserScript==
+// @name White text
+// @description Allows you to set white text to all pages
+// @include *
+// @run-at document-start
+// @version 2
+// @author Plat
+// ==/UserScript==
+
+(function IIFE() {
+ 'use strict';
+
+ document.addEventListener('readystatechange', function onReadyStateChange() {
+ if (document.readyState == 'interactive') {
+ const style = document.createElement('style');
+ document.head.appendChild(style);
+ style.innerHTML = `
+
+body {
+ color: white !important;
+}
+ `;
+ }
+ });
+})();
diff --git a/config/qutebrowser/qsettings/QtProject.conf b/config/qutebrowser/qsettings/QtProject.conf
@@ -0,0 +1,17 @@
+[Qt]
+customColors\0=4291707908
+customColors\1=4294967295
+customColors\10=4294967295
+customColors\11=4294967295
+customColors\12=4294967295
+customColors\13=4294967295
+customColors\14=4294967295
+customColors\15=4294967295
+customColors\2=4294967295
+customColors\3=4294967295
+customColors\4=4294967295
+customColors\5=4294967295
+customColors\6=4294967295
+customColors\7=4294967295
+customColors\8=4294967295
+customColors\9=4294967295
diff --git a/config/qutebrowser/quickmarks b/config/qutebrowser/quickmarks
@@ -0,0 +1,16 @@
+use https://www.gentoo.org/support/use-flags/
+ea https://stellar-nexus.ru/en/articles/
+ep https://stellar-nexus.ru/en/poems/
+ed https://stellar-nexus.ru/en/diaries/
+ef https://stellar-nexus.ru/en/files/
+ev https://stellar-nexus.ru/en/videos/
+ru https://stellar-nexus.ru/ru/
+rp https://stellar-nexus.ru/ru/poems
+rd https://stellar-nexus.ru/ru/diaries/
+d https://stellar-nexus.ru/ru/diaries/ITeng/
+rs https://stellar-nexus.ru/ru/school
+rv https://stellar-nexus.ru/ru/videos/
+ra https://stellar-nexus.ru/ru/articles/
+ei https://stellar-nexus.ru/en/images/
+ri https://stellar-nexus.ru/ru/images/
+en https://stellar-nexus.ru/en/
diff --git a/config/ranger/commands.py b/config/ranger/commands.py
@@ -0,0 +1,62 @@
+# This is a sample commands.py. You can add your own commands here.
+#
+# Please refer to commands_full.py for all the default commands and a complete
+# documentation. Do NOT add them all here, or you may end up with defunct
+# commands when upgrading ranger.
+
+# A simple command for demonstration purposes follows.
+# -----------------------------------------------------------------------------
+
+from __future__ import (absolute_import, division, print_function)
+
+# You can import any python module as needed.
+import os
+
+# You always need to import ranger.api.commands here to get the Command class:
+from ranger.api.commands import Command
+
+
+# Any class that is a subclass of "Command" will be integrated into ranger as a
+# command. Try typing ":my_edit<ENTER>" in ranger!
+class my_edit(Command):
+ # The so-called doc-string of the class will be visible in the built-in
+ # help that is accessible by typing "?c" inside ranger.
+ """:my_edit <filename>
+
+ A sample command for demonstration purposes that opens a file in an editor.
+ """
+
+ # The execute method is called when you run this command in ranger.
+ def execute(self):
+ # self.arg(1) is the first (space-separated) argument to the function.
+ # This way you can write ":my_edit somefilename<ENTER>".
+ if self.arg(1):
+ # self.rest(1) contains self.arg(1) and everything that follows
+ target_filename = self.rest(1)
+ else:
+ # self.fm is a ranger.core.filemanager.FileManager object and gives
+ # you access to internals of ranger.
+ # self.fm.thisfile is a ranger.container.file.File object and is a
+ # reference to the currently selected file.
+ target_filename = self.fm.thisfile.path
+
+ # This is a generic function to print text in ranger.
+ self.fm.notify("Let's edit the file " + target_filename + "!")
+
+ # Using bad=True in fm.notify allows you to print error messages:
+ if not os.path.exists(target_filename):
+ self.fm.notify("The given file does not exist!", bad=True)
+ return
+
+ # This executes a function from ranger.core.acitons, a module with a
+ # variety of subroutines that can help you construct commands.
+ # Check out the source, or run "pydoc ranger.core.actions" for a list.
+ self.fm.edit_file(target_filename)
+
+ # The tab method is called when you press tab, and should return a list of
+ # suggestions that the user will tab through.
+ # tabnum is 1 for <TAB> and -1 for <S-TAB> by default
+ def tab(self, tabnum):
+ # This is a generic tab-completion function that iterates through the
+ # content of the current directory.
+ return self._tab_directory_content()
diff --git a/config/ranger/commands_full.py b/config/ranger/commands_full.py
@@ -0,0 +1,1993 @@
+# -*- coding: utf-8 -*-
+# This file is part of ranger, the console file manager.
+# This configuration file is licensed under the same terms as ranger.
+# ===================================================================
+#
+# NOTE: If you copied this file to /etc/ranger/commands_full.py or
+# ~/.config/ranger/commands_full.py, then it will NOT be loaded by ranger,
+# and only serve as a reference.
+#
+# ===================================================================
+# This file contains ranger's commands.
+# It's all in python; lines beginning with # are comments.
+#
+# Note that additional commands are automatically generated from the methods
+# of the class ranger.core.actions.Actions.
+#
+# You can customize commands in the files /etc/ranger/commands.py (system-wide)
+# and ~/.config/ranger/commands.py (per user).
+# They have the same syntax as this file. In fact, you can just copy this
+# file to ~/.config/ranger/commands_full.py with
+# `ranger --copy-config=commands_full' and make your modifications, don't
+# forget to rename it to commands.py. You can also use
+# `ranger --copy-config=commands' to copy a short sample commands.py that
+# has everything you need to get started.
+# But make sure you update your configs when you update ranger.
+#
+# ===================================================================
+# Every class defined here which is a subclass of `Command' will be used as a
+# command in ranger. Several methods are defined to interface with ranger:
+# execute(): called when the command is executed.
+# cancel(): called when closing the console.
+# tab(tabnum): called when <TAB> is pressed.
+# quick(): called after each keypress.
+#
+# tab() argument tabnum is 1 for <TAB> and -1 for <S-TAB> by default
+#
+# The return values for tab() can be either:
+# None: There is no tab completion
+# A string: Change the console to this string
+# A list/tuple/generator: cycle through every item in it
+#
+# The return value for quick() can be:
+# False: Nothing happens
+# True: Execute the command afterwards
+#
+# The return value for execute() and cancel() doesn't matter.
+#
+# ===================================================================
+# Commands have certain attributes and methods that facilitate parsing of
+# the arguments:
+#
+# self.line: The whole line that was written in the console.
+# self.args: A list of all (space-separated) arguments to the command.
+# self.quantifier: If this command was mapped to the key "X" and
+# the user pressed 6X, self.quantifier will be 6.
+# self.arg(n): The n-th argument, or an empty string if it doesn't exist.
+# self.rest(n): The n-th argument plus everything that followed. For example,
+# if the command was "search foo bar a b c", rest(2) will be "bar a b c"
+# self.start(n): Anything before the n-th argument. For example, if the
+# command was "search foo bar a b c", start(2) will be "search foo"
+#
+# ===================================================================
+# And this is a little reference for common ranger functions and objects:
+#
+# self.fm: A reference to the "fm" object which contains most information
+# about ranger.
+# self.fm.notify(string): Print the given string on the screen.
+# self.fm.notify(string, bad=True): Print the given string in RED.
+# self.fm.reload_cwd(): Reload the current working directory.
+# self.fm.thisdir: The current working directory. (A File object.)
+# self.fm.thisfile: The current file. (A File object too.)
+# self.fm.thistab.get_selection(): A list of all selected files.
+# self.fm.execute_console(string): Execute the string as a ranger command.
+# self.fm.open_console(string): Open the console with the given string
+# already typed in for you.
+# self.fm.move(direction): Moves the cursor in the given direction, which
+# can be something like down=3, up=5, right=1, left=1, to=6, ...
+#
+# File objects (for example self.fm.thisfile) have these useful attributes and
+# methods:
+#
+# tfile.path: The path to the file.
+# tfile.basename: The base name only.
+# tfile.load_content(): Force a loading of the directories content (which
+# obviously works with directories only)
+# tfile.is_directory: True/False depending on whether it's a directory.
+#
+# For advanced commands it is unavoidable to dive a bit into the source code
+# of ranger.
+# ===================================================================
+
+from __future__ import (absolute_import, division, print_function)
+
+from collections import deque
+import os
+import re
+
+from ranger.api.commands import Command
+
+
+class alias(Command):
+ """:alias <newcommand> <oldcommand>
+
+ Copies the oldcommand as newcommand.
+ """
+
+ context = 'browser'
+ resolve_macros = False
+
+ def execute(self):
+ if not self.arg(1) or not self.arg(2):
+ self.fm.notify('Syntax: alias <newcommand> <oldcommand>', bad=True)
+ return
+
+ self.fm.commands.alias(self.arg(1), self.rest(2))
+
+
+class echo(Command):
+ """:echo <text>
+
+ Display the text in the statusbar.
+ """
+
+ def execute(self):
+ self.fm.notify(self.rest(1))
+
+
+class cd(Command):
+ """:cd [-r] <path>
+
+ The cd command changes the directory.
+ If the path is a file, selects that file.
+ The command 'cd -' is equivalent to typing ``.
+ Using the option "-r" will get you to the real path.
+ """
+
+ def execute(self):
+ if self.arg(1) == '-r':
+ self.shift()
+ destination = os.path.realpath(self.rest(1))
+ if os.path.isfile(destination):
+ self.fm.select_file(destination)
+ return
+ else:
+ destination = self.rest(1)
+
+ if not destination:
+ destination = '~'
+
+ if destination == '-':
+ self.fm.enter_bookmark('`')
+ else:
+ self.fm.cd(destination)
+
+ def _tab_args(self):
+ # dest must be rest because path could contain spaces
+ if self.arg(1) == '-r':
+ start = self.start(2)
+ dest = self.rest(2)
+ else:
+ start = self.start(1)
+ dest = self.rest(1)
+
+ if dest:
+ head, tail = os.path.split(os.path.expanduser(dest))
+ if head:
+ dest_exp = os.path.join(os.path.normpath(head), tail)
+ else:
+ dest_exp = tail
+ else:
+ dest_exp = ''
+ return (start, dest_exp, os.path.join(self.fm.thisdir.path, dest_exp),
+ dest.endswith(os.path.sep))
+
+ @staticmethod
+ def _tab_paths(dest, dest_abs, ends_with_sep):
+ if not dest:
+ try:
+ return next(os.walk(dest_abs))[1], dest_abs
+ except (OSError, StopIteration):
+ return [], ''
+
+ if ends_with_sep:
+ try:
+ return [os.path.join(dest, path) for path in next(os.walk(dest_abs))[1]], ''
+ except (OSError, StopIteration):
+ return [], ''
+
+ return None, None
+
+ def _tab_match(self, path_user, path_file):
+ if self.fm.settings.cd_tab_case == 'insensitive':
+ path_user = path_user.lower()
+ path_file = path_file.lower()
+ elif self.fm.settings.cd_tab_case == 'smart' and path_user.islower():
+ path_file = path_file.lower()
+ return path_file.startswith(path_user)
+
+ def _tab_normal(self, dest, dest_abs):
+ dest_dir = os.path.dirname(dest)
+ dest_base = os.path.basename(dest)
+
+ try:
+ dirnames = next(os.walk(os.path.dirname(dest_abs)))[1]
+ except (OSError, StopIteration):
+ return [], ''
+
+ return [os.path.join(dest_dir, d) for d in dirnames if self._tab_match(dest_base, d)], ''
+
+ def _tab_fuzzy_match(self, basepath, tokens):
+ """ Find directories matching tokens recursively """
+ if not tokens:
+ tokens = ['']
+ paths = [basepath]
+ while True:
+ token = tokens.pop()
+ matches = []
+ for path in paths:
+ try:
+ directories = next(os.walk(path))[1]
+ except (OSError, StopIteration):
+ continue
+ matches += [os.path.join(path, d) for d in directories
+ if self._tab_match(token, d)]
+ if not tokens or not matches:
+ return matches
+ paths = matches
+
+ return None
+
+ def _tab_fuzzy(self, dest, dest_abs):
+ tokens = []
+ basepath = dest_abs
+ while True:
+ basepath_old = basepath
+ basepath, token = os.path.split(basepath)
+ if basepath == basepath_old:
+ break
+ if os.path.isdir(basepath_old) and not token.startswith('.'):
+ basepath = basepath_old
+ break
+ tokens.append(token)
+
+ paths = self._tab_fuzzy_match(basepath, tokens)
+ if not os.path.isabs(dest):
+ paths_rel = self.fm.thisdir.path
+ paths = [os.path.relpath(os.path.join(basepath, path), paths_rel)
+ for path in paths]
+ else:
+ paths_rel = ''
+ return paths, paths_rel
+
+ def tab(self, tabnum):
+ from os.path import sep
+
+ start, dest, dest_abs, ends_with_sep = self._tab_args()
+
+ paths, paths_rel = self._tab_paths(dest, dest_abs, ends_with_sep)
+ if paths is None:
+ if self.fm.settings.cd_tab_fuzzy:
+ paths, paths_rel = self._tab_fuzzy(dest, dest_abs)
+ else:
+ paths, paths_rel = self._tab_normal(dest, dest_abs)
+
+ paths.sort()
+
+ if self.fm.settings.cd_bookmarks:
+ paths[0:0] = [
+ os.path.relpath(v.path, paths_rel) if paths_rel else v.path
+ for v in self.fm.bookmarks.dct.values() for path in paths
+ if v.path.startswith(os.path.join(paths_rel, path) + sep)
+ ]
+
+ if not paths:
+ return None
+ if len(paths) == 1:
+ return start + paths[0] + sep
+ return [start + dirname + sep for dirname in paths]
+
+
+class chain(Command):
+ """:chain <command1>; <command2>; ...
+
+ Calls multiple commands at once, separated by semicolons.
+ """
+ resolve_macros = False
+
+ def execute(self):
+ if not self.rest(1).strip():
+ self.fm.notify('Syntax: chain <command1>; <command2>; ...', bad=True)
+ return
+ for command in [s.strip() for s in self.rest(1).split(";")]:
+ self.fm.execute_console(command)
+
+
+class shell(Command):
+ escape_macros_for_shell = True
+
+ def execute(self):
+ if self.arg(1) and self.arg(1)[0] == '-':
+ flags = self.arg(1)[1:]
+ command = self.rest(2)
+ else:
+ flags = ''
+ command = self.rest(1)
+
+ if command:
+ self.fm.execute_command(command, flags=flags)
+
+ def tab(self, tabnum):
+ from ranger.ext.get_executables import get_executables
+ if self.arg(1) and self.arg(1)[0] == '-':
+ command = self.rest(2)
+ else:
+ command = self.rest(1)
+ start = self.line[0:len(self.line) - len(command)]
+
+ try:
+ position_of_last_space = command.rindex(" ")
+ except ValueError:
+ return (start + program + ' ' for program
+ in get_executables() if program.startswith(command))
+ if position_of_last_space == len(command) - 1:
+ selection = self.fm.thistab.get_selection()
+ if len(selection) == 1:
+ return self.line + selection[0].shell_escaped_basename + ' '
+ return self.line + '%s '
+
+ before_word, start_of_word = self.line.rsplit(' ', 1)
+ return (before_word + ' ' + file.shell_escaped_basename
+ for file in self.fm.thisdir.files or []
+ if file.shell_escaped_basename.startswith(start_of_word))
+
+
+class open_with(Command):
+
+ def execute(self):
+ app, flags, mode = self._get_app_flags_mode(self.rest(1))
+ self.fm.execute_file(
+ files=[f for f in self.fm.thistab.get_selection()],
+ app=app,
+ flags=flags,
+ mode=mode)
+
+ def tab(self, tabnum):
+ return self._tab_through_executables()
+
+ def _get_app_flags_mode(self, string): # pylint: disable=too-many-branches,too-many-statements
+ """Extracts the application, flags and mode from a string.
+
+ examples:
+ "mplayer f 1" => ("mplayer", "f", 1)
+ "atool 4" => ("atool", "", 4)
+ "p" => ("", "p", 0)
+ "" => None
+ """
+
+ app = ''
+ flags = ''
+ mode = 0
+ split = string.split()
+
+ if len(split) == 1:
+ part = split[0]
+ if self._is_app(part):
+ app = part
+ elif self._is_flags(part):
+ flags = part
+ elif self._is_mode(part):
+ mode = part
+
+ elif len(split) == 2:
+ part0 = split[0]
+ part1 = split[1]
+
+ if self._is_app(part0):
+ app = part0
+ if self._is_flags(part1):
+ flags = part1
+ elif self._is_mode(part1):
+ mode = part1
+ elif self._is_flags(part0):
+ flags = part0
+ if self._is_mode(part1):
+ mode = part1
+ elif self._is_mode(part0):
+ mode = part0
+ if self._is_flags(part1):
+ flags = part1
+
+ elif len(split) >= 3:
+ part0 = split[0]
+ part1 = split[1]
+ part2 = split[2]
+
+ if self._is_app(part0):
+ app = part0
+ if self._is_flags(part1):
+ flags = part1
+ if self._is_mode(part2):
+ mode = part2
+ elif self._is_mode(part1):
+ mode = part1
+ if self._is_flags(part2):
+ flags = part2
+ elif self._is_flags(part0):
+ flags = part0
+ if self._is_mode(part1):
+ mode = part1
+ elif self._is_mode(part0):
+ mode = part0
+ if self._is_flags(part1):
+ flags = part1
+
+ return app, flags, int(mode)
+
+ def _is_app(self, arg):
+ return not self._is_flags(arg) and not arg.isdigit()
+
+ @staticmethod
+ def _is_flags(arg):
+ from ranger.core.runner import ALLOWED_FLAGS
+ return all(x in ALLOWED_FLAGS for x in arg)
+
+ @staticmethod
+ def _is_mode(arg):
+ return all(x in '0123456789' for x in arg)
+
+
+class set_(Command):
+ """:set <option name>=<python expression>
+
+ Gives an option a new value.
+
+ Use `:set <option>!` to toggle or cycle it, e.g. `:set flush_input!`
+ """
+ name = 'set' # don't override the builtin set class
+
+ def execute(self):
+ name = self.arg(1)
+ name, value, _, toggle = self.parse_setting_line_v2()
+ if toggle:
+ self.fm.toggle_option(name)
+ else:
+ self.fm.set_option_from_string(name, value)
+
+ def tab(self, tabnum): # pylint: disable=too-many-return-statements
+ from ranger.gui.colorscheme import get_all_colorschemes
+ name, value, name_done = self.parse_setting_line()
+ settings = self.fm.settings
+ if not name:
+ return sorted(self.firstpart + setting for setting in settings)
+ if not value and not name_done:
+ return sorted(self.firstpart + setting for setting in settings
+ if setting.startswith(name))
+ if not value:
+ value_completers = {
+ "colorscheme":
+ # Cycle through colorschemes when name, but no value is specified
+ lambda: sorted(self.firstpart + colorscheme for colorscheme
+ in get_all_colorschemes(self.fm)),
+
+ "column_ratios":
+ lambda: self.firstpart + ",".join(map(str, settings[name])),
+ }
+
+ def default_value_completer():
+ return self.firstpart + str(settings[name])
+
+ return value_completers.get(name, default_value_completer)()
+ if bool in settings.types_of(name):
+ if 'true'.startswith(value.lower()):
+ return self.firstpart + 'True'
+ if 'false'.startswith(value.lower()):
+ return self.firstpart + 'False'
+ # Tab complete colorscheme values if incomplete value is present
+ if name == "colorscheme":
+ return sorted(self.firstpart + colorscheme for colorscheme
+ in get_all_colorschemes(self.fm) if colorscheme.startswith(value))
+ return None
+
+
+class setlocal(set_):
+ """:setlocal path=<regular expression> <option name>=<python expression>
+
+ Gives an option a new value.
+ """
+ PATH_RE_DQUOTED = re.compile(r'^setlocal\s+path="(.*?)"')
+ PATH_RE_SQUOTED = re.compile(r"^setlocal\s+path='(.*?)'")
+ PATH_RE_UNQUOTED = re.compile(r'^path=(.*?)$')
+
+ def _re_shift(self, match):
+ if not match:
+ return None
+ path = os.path.expanduser(match.group(1))
+ for _ in range(len(path.split())):
+ self.shift()
+ return path
+
+ def execute(self):
+ path = self._re_shift(self.PATH_RE_DQUOTED.match(self.line))
+ if path is None:
+ path = self._re_shift(self.PATH_RE_SQUOTED.match(self.line))
+ if path is None:
+ path = self._re_shift(self.PATH_RE_UNQUOTED.match(self.arg(1)))
+ if path is None and self.fm.thisdir:
+ path = self.fm.thisdir.path
+ if not path:
+ return
+
+ name, value, _ = self.parse_setting_line()
+ self.fm.set_option_from_string(name, value, localpath=path)
+
+
+class setintag(set_):
+ """:setintag <tag or tags> <option name>=<option value>
+
+ Sets an option for directories that are tagged with a specific tag.
+ """
+
+ def execute(self):
+ tags = self.arg(1)
+ self.shift()
+ name, value, _ = self.parse_setting_line()
+ self.fm.set_option_from_string(name, value, tags=tags)
+
+
+class default_linemode(Command):
+
+ def execute(self):
+ from ranger.container.fsobject import FileSystemObject
+
+ if len(self.args) < 2:
+ self.fm.notify(
+ "Usage: default_linemode [path=<regexp> | tag=<tag(s)>] <linemode>", bad=True)
+
+ # Extract options like "path=..." or "tag=..." from the command line
+ arg1 = self.arg(1)
+ method = "always"
+ argument = None
+ if arg1.startswith("path="):
+ method = "path"
+ argument = re.compile(arg1[5:])
+ self.shift()
+ elif arg1.startswith("tag="):
+ method = "tag"
+ argument = arg1[4:]
+ self.shift()
+
+ # Extract and validate the line mode from the command line
+ lmode = self.rest(1)
+ if lmode not in FileSystemObject.linemode_dict:
+ self.fm.notify(
+ "Invalid linemode: %s; should be %s" % (
+ lmode, "/".join(FileSystemObject.linemode_dict)),
+ bad=True,
+ )
+
+ # Add the prepared entry to the fm.default_linemodes
+ entry = [method, argument, lmode]
+ self.fm.default_linemodes.appendleft(entry)
+
+ # Redraw the columns
+ if self.fm.ui.browser:
+ for col in self.fm.ui.browser.columns:
+ col.need_redraw = True
+
+ def tab(self, tabnum):
+ return (self.arg(0) + " " + lmode
+ for lmode in self.fm.thisfile.linemode_dict.keys()
+ if lmode.startswith(self.arg(1)))
+
+
+class quit(Command): # pylint: disable=redefined-builtin
+ """:quit
+
+ Closes the current tab, if there's more than one tab.
+ Otherwise quits if there are no tasks in progress.
+ """
+ def _exit_no_work(self):
+ if self.fm.loader.has_work():
+ self.fm.notify('Not quitting: Tasks in progress: Use `quit!` to force quit')
+ else:
+ self.fm.exit()
+
+ def execute(self):
+ if len(self.fm.tabs) >= 2:
+ self.fm.tab_close()
+ else:
+ self._exit_no_work()
+
+
+class quit_bang(Command):
+ """:quit!
+
+ Closes the current tab, if there's more than one tab.
+ Otherwise force quits immediately.
+ """
+ name = 'quit!'
+ allow_abbrev = False
+
+ def execute(self):
+ if len(self.fm.tabs) >= 2:
+ self.fm.tab_close()
+ else:
+ self.fm.exit()
+
+
+class quitall(Command):
+ """:quitall
+
+ Quits if there are no tasks in progress.
+ """
+ def _exit_no_work(self):
+ if self.fm.loader.has_work():
+ self.fm.notify('Not quitting: Tasks in progress: Use `quitall!` to force quit')
+ else:
+ self.fm.exit()
+
+ def execute(self):
+ self._exit_no_work()
+
+
+class quitall_bang(Command):
+ """:quitall!
+
+ Force quits immediately.
+ """
+ name = 'quitall!'
+ allow_abbrev = False
+
+ def execute(self):
+ self.fm.exit()
+
+
+class terminal(Command):
+ """:terminal
+
+ Spawns an "x-terminal-emulator" starting in the current directory.
+ """
+
+ def execute(self):
+ from ranger.ext.get_executables import get_term
+ self.fm.run(get_term(), flags='f')
+
+
+class delete(Command):
+ """:delete
+
+ Tries to delete the selection or the files passed in arguments (if any).
+ The arguments use a shell-like escaping.
+
+ "Selection" is defined as all the "marked files" (by default, you
+ can mark files with space or v). If there are no marked files,
+ use the "current file" (where the cursor is)
+
+ When attempting to delete non-empty directories or multiple
+ marked files, it will require a confirmation.
+ """
+
+ allow_abbrev = False
+ escape_macros_for_shell = True
+
+ def execute(self):
+ import shlex
+ from functools import partial
+
+ def is_directory_with_files(path):
+ return os.path.isdir(path) and not os.path.islink(path) and len(os.listdir(path)) > 0
+
+ if self.rest(1):
+ files = shlex.split(self.rest(1))
+ many_files = (len(files) > 1 or is_directory_with_files(files[0]))
+ else:
+ cwd = self.fm.thisdir
+ tfile = self.fm.thisfile
+ if not cwd or not tfile:
+ self.fm.notify("Error: no file selected for deletion!", bad=True)
+ return
+
+ # relative_path used for a user-friendly output in the confirmation.
+ files = [f.relative_path for f in self.fm.thistab.get_selection()]
+ many_files = (cwd.marked_items or is_directory_with_files(tfile.path))
+
+ confirm = self.fm.settings.confirm_on_delete
+ if confirm != 'never' and (confirm != 'multiple' or many_files):
+ self.fm.ui.console.ask(
+ "Confirm deletion of: %s (y/N)" % ', '.join(files),
+ partial(self._question_callback, files),
+ ('n', 'N', 'y', 'Y'),
+ )
+ else:
+ # no need for a confirmation, just delete
+ self.fm.delete(files)
+
+ def tab(self, tabnum):
+ return self._tab_directory_content()
+
+ def _question_callback(self, files, answer):
+ if answer == 'y' or answer == 'Y':
+ self.fm.delete(files)
+
+
+class trash(Command):
+ """:trash
+
+ Tries to move the selection or the files passed in arguments (if any) to
+ the trash, using rifle rules with label "trash".
+ The arguments use a shell-like escaping.
+
+ "Selection" is defined as all the "marked files" (by default, you
+ can mark files with space or v). If there are no marked files,
+ use the "current file" (where the cursor is)
+
+ When attempting to trash non-empty directories or multiple
+ marked files, it will require a confirmation.
+ """
+
+ allow_abbrev = False
+ escape_macros_for_shell = True
+
+ def execute(self):
+ import shlex
+ from functools import partial
+
+ def is_directory_with_files(path):
+ return os.path.isdir(path) and not os.path.islink(path) and len(os.listdir(path)) > 0
+
+ if self.rest(1):
+ files = shlex.split(self.rest(1))
+ many_files = (len(files) > 1 or is_directory_with_files(files[0]))
+ else:
+ cwd = self.fm.thisdir
+ tfile = self.fm.thisfile
+ if not cwd or not tfile:
+ self.fm.notify("Error: no file selected for deletion!", bad=True)
+ return
+
+ # relative_path used for a user-friendly output in the confirmation.
+ files = [f.relative_path for f in self.fm.thistab.get_selection()]
+ many_files = (cwd.marked_items or is_directory_with_files(tfile.path))
+
+ confirm = self.fm.settings.confirm_on_delete
+ if confirm != 'never' and (confirm != 'multiple' or many_files):
+ self.fm.ui.console.ask(
+ "Confirm deletion of: %s (y/N)" % ', '.join(files),
+ partial(self._question_callback, files),
+ ('n', 'N', 'y', 'Y'),
+ )
+ else:
+ # no need for a confirmation, just delete
+ self.fm.execute_file(files, label='trash')
+
+ def tab(self, tabnum):
+ return self._tab_directory_content()
+
+ def _question_callback(self, files, answer):
+ if answer == 'y' or answer == 'Y':
+ self.fm.execute_file(files, label='trash')
+
+
+class jump_non(Command):
+ """:jump_non [-FLAGS...]
+
+ Jumps to first non-directory if highlighted file is a directory and vice versa.
+
+ Flags:
+ -r Jump in reverse order
+ -w Wrap around if reaching end of filelist
+ """
+ def __init__(self, *args, **kwargs):
+ super(jump_non, self).__init__(*args, **kwargs)
+
+ flags, _ = self.parse_flags()
+ self._flag_reverse = 'r' in flags
+ self._flag_wrap = 'w' in flags
+
+ @staticmethod
+ def _non(fobj, is_directory):
+ return fobj.is_directory if not is_directory else not fobj.is_directory
+
+ def execute(self):
+ tfile = self.fm.thisfile
+ passed = False
+ found_before = None
+ found_after = None
+ for fobj in self.fm.thisdir.files[::-1] if self._flag_reverse else self.fm.thisdir.files:
+ if fobj.path == tfile.path:
+ passed = True
+ continue
+
+ if passed:
+ if self._non(fobj, tfile.is_directory):
+ found_after = fobj.path
+ break
+ elif not found_before and self._non(fobj, tfile.is_directory):
+ found_before = fobj.path
+
+ if found_after:
+ self.fm.select_file(found_after)
+ elif self._flag_wrap and found_before:
+ self.fm.select_file(found_before)
+
+
+class mark_tag(Command):
+ """:mark_tag [<tags>]
+
+ Mark all tags that are tagged with either of the given tags.
+ When leaving out the tag argument, all tagged files are marked.
+ """
+ do_mark = True
+
+ def execute(self):
+ cwd = self.fm.thisdir
+ tags = self.rest(1).replace(" ", "")
+ if not self.fm.tags or not cwd.files:
+ return
+ for fileobj in cwd.files:
+ try:
+ tag = self.fm.tags.tags[fileobj.realpath]
+ except KeyError:
+ continue
+ if not tags or tag in tags:
+ cwd.mark_item(fileobj, val=self.do_mark)
+ self.fm.ui.status.need_redraw = True
+ self.fm.ui.need_redraw = True
+
+
+class console(Command):
+ """:console <command>
+
+ Open the console with the given command.
+ """
+
+ def execute(self):
+ position = None
+ if self.arg(1)[0:2] == '-p':
+ try:
+ position = int(self.arg(1)[2:])
+ except ValueError:
+ pass
+ else:
+ self.shift()
+ self.fm.open_console(self.rest(1), position=position)
+
+
+class load_copy_buffer(Command):
+ """:load_copy_buffer
+
+ Load the copy buffer from datadir/copy_buffer
+ """
+ copy_buffer_filename = 'copy_buffer'
+
+ def execute(self):
+ import sys
+ from ranger.container.file import File
+ from os.path import exists
+ fname = self.fm.datapath(self.copy_buffer_filename)
+ unreadable = IOError if sys.version_info[0] < 3 else OSError
+ try:
+ fobj = open(fname, 'r')
+ except unreadable:
+ return self.fm.notify(
+ "Cannot open %s" % (fname or self.copy_buffer_filename), bad=True)
+
+ self.fm.copy_buffer = set(File(g)
+ for g in fobj.read().split("\n") if exists(g))
+ fobj.close()
+ self.fm.ui.redraw_main_column()
+ return None
+
+
+class save_copy_buffer(Command):
+ """:save_copy_buffer
+
+ Save the copy buffer to datadir/copy_buffer
+ """
+ copy_buffer_filename = 'copy_buffer'
+
+ def execute(self):
+ import sys
+ fname = None
+ fname = self.fm.datapath(self.copy_buffer_filename)
+ unwritable = IOError if sys.version_info[0] < 3 else OSError
+ try:
+ fobj = open(fname, 'w')
+ except unwritable:
+ return self.fm.notify("Cannot open %s" %
+ (fname or self.copy_buffer_filename), bad=True)
+ fobj.write("\n".join(fobj.path for fobj in self.fm.copy_buffer))
+ fobj.close()
+ return None
+
+
+class unmark_tag(mark_tag):
+ """:unmark_tag [<tags>]
+
+ Unmark all tags that are tagged with either of the given tags.
+ When leaving out the tag argument, all tagged files are unmarked.
+ """
+ do_mark = False
+
+
+class mkdir(Command):
+ """:mkdir <dirname>
+
+ Creates a directory with the name <dirname>.
+ """
+
+ def execute(self):
+ from os.path import join, expanduser, lexists
+ from os import makedirs
+
+ dirname = join(self.fm.thisdir.path, expanduser(self.rest(1)))
+ if not lexists(dirname):
+ makedirs(dirname)
+ else:
+ self.fm.notify("file/directory exists!", bad=True)
+
+ def tab(self, tabnum):
+ return self._tab_directory_content()
+
+
+class touch(Command):
+ """:touch <fname>
+
+ Creates a file with the name <fname>.
+ """
+
+ def execute(self):
+ from os.path import join, expanduser, lexists
+
+ fname = join(self.fm.thisdir.path, expanduser(self.rest(1)))
+ if not lexists(fname):
+ open(fname, 'a').close()
+ else:
+ self.fm.notify("file/directory exists!", bad=True)
+
+ def tab(self, tabnum):
+ return self._tab_directory_content()
+
+
+class edit(Command):
+ """:edit <filename>
+
+ Opens the specified file in vim
+ """
+
+ def execute(self):
+ if not self.arg(1):
+ self.fm.edit_file(self.fm.thisfile.path)
+ else:
+ self.fm.edit_file(self.rest(1))
+
+ def tab(self, tabnum):
+ return self._tab_directory_content()
+
+
+class eval_(Command):
+ """:eval [-q] <python code>
+
+ Evaluates the python code.
+ `fm' is a reference to the FM instance.
+ To display text, use the function `p'.
+
+ Examples:
+ :eval fm
+ :eval len(fm.directories)
+ :eval p("Hello World!")
+ """
+ name = 'eval'
+ resolve_macros = False
+
+ def execute(self):
+ # The import is needed so eval() can access the ranger module
+ import ranger # NOQA pylint: disable=unused-import,unused-variable
+ if self.arg(1) == '-q':
+ code = self.rest(2)
+ quiet = True
+ else:
+ code = self.rest(1)
+ quiet = False
+ global cmd, fm, p, quantifier # pylint: disable=invalid-name,global-variable-undefined
+ fm = self.fm
+ cmd = self.fm.execute_console
+ p = fm.notify
+ quantifier = self.quantifier
+ try:
+ try:
+ result = eval(code) # pylint: disable=eval-used
+ except SyntaxError:
+ exec(code) # pylint: disable=exec-used
+ else:
+ if result and not quiet:
+ p(result)
+ except Exception as err: # pylint: disable=broad-except
+ fm.notify("The error `%s` was caused by evaluating the "
+ "following code: `%s`" % (err, code), bad=True)
+
+
+class rename(Command):
+ """:rename <newname>
+
+ Changes the name of the currently highlighted file to <newname>
+ """
+
+ def execute(self):
+ from ranger.container.file import File
+ from os import access
+
+ new_name = self.rest(1)
+
+ if not new_name:
+ return self.fm.notify('Syntax: rename <newname>', bad=True)
+
+ if new_name == self.fm.thisfile.relative_path:
+ return None
+
+ if access(new_name, os.F_OK):
+ return self.fm.notify("Can't rename: file already exists!", bad=True)
+
+ if self.fm.rename(self.fm.thisfile, new_name):
+ file_new = File(new_name)
+ self.fm.bookmarks.update_path(self.fm.thisfile.path, file_new)
+ self.fm.tags.update_path(self.fm.thisfile.path, file_new.path)
+ self.fm.thisdir.pointed_obj = file_new
+ self.fm.thisfile = file_new
+
+ return None
+
+ def tab(self, tabnum):
+ return self._tab_directory_content()
+
+
+class rename_append(Command):
+ """:rename_append [-FLAGS...]
+
+ Opens the console with ":rename <current file>" with the cursor positioned
+ before the file extension.
+
+ Flags:
+ -a Position before all extensions
+ -r Remove everything before extensions
+ """
+ def __init__(self, *args, **kwargs):
+ super(rename_append, self).__init__(*args, **kwargs)
+
+ flags, _ = self.parse_flags()
+ self._flag_ext_all = 'a' in flags
+ self._flag_remove = 'r' in flags
+
+ def execute(self):
+ from ranger import MACRO_DELIMITER, MACRO_DELIMITER_ESC
+
+ tfile = self.fm.thisfile
+ relpath = tfile.relative_path.replace(MACRO_DELIMITER, MACRO_DELIMITER_ESC)
+ basename = tfile.basename.replace(MACRO_DELIMITER, MACRO_DELIMITER_ESC)
+
+ if basename.find('.') <= 0 or os.path.isdir(relpath):
+ self.fm.open_console('rename ' + relpath)
+ return
+
+ if self._flag_ext_all:
+ pos_ext = re.search(r'[^.]+', basename).end(0)
+ else:
+ pos_ext = basename.rindex('.')
+ pos = len(relpath) - len(basename) + pos_ext
+
+ if self._flag_remove:
+ relpath = relpath[:-len(basename)] + basename[pos_ext:]
+ pos -= pos_ext
+
+ self.fm.open_console('rename ' + relpath, position=(7 + pos))
+
+
+class chmod(Command):
+ """:chmod <octal number>
+
+ Sets the permissions of the selection to the octal number.
+
+ The octal number is between 0 and 777. The digits specify the
+ permissions for the user, the group and others.
+
+ A 1 permits execution, a 2 permits writing, a 4 permits reading.
+ Add those numbers to combine them. So a 7 permits everything.
+ """
+
+ def execute(self):
+ mode_str = self.rest(1)
+ if not mode_str:
+ if self.quantifier is None:
+ self.fm.notify("Syntax: chmod <octal number> "
+ "or specify a quantifier", bad=True)
+ return
+ mode_str = str(self.quantifier)
+
+ try:
+ mode = int(mode_str, 8)
+ if mode < 0 or mode > 0o777:
+ raise ValueError
+ except ValueError:
+ self.fm.notify("Need an octal number between 0 and 777!", bad=True)
+ return
+
+ for fobj in self.fm.thistab.get_selection():
+ try:
+ os.chmod(fobj.path, mode)
+ except OSError as ex:
+ self.fm.notify(ex)
+
+ # reloading directory. maybe its better to reload the selected
+ # files only.
+ self.fm.thisdir.content_outdated = True
+
+
+class bulkrename(Command):
+ """:bulkrename
+
+ This command opens a list of selected files in an external editor.
+ After you edit and save the file, it will generate a shell script
+ which does bulk renaming according to the changes you did in the file.
+
+ This shell script is opened in an editor for you to review.
+ After you close it, it will be executed.
+ """
+
+ def execute(self):
+ # pylint: disable=too-many-locals,too-many-statements,too-many-branches
+ import sys
+ import tempfile
+ from ranger.container.file import File
+ from ranger.ext.shell_escape import shell_escape as esc
+ py3 = sys.version_info[0] >= 3
+
+ # Create and edit the file list
+ filenames = [f.relative_path for f in self.fm.thistab.get_selection()]
+ with tempfile.NamedTemporaryFile(delete=False) as listfile:
+ listpath = listfile.name
+ if py3:
+ listfile.write("\n".join(filenames).encode(
+ encoding="utf-8", errors="surrogateescape"))
+ else:
+ listfile.write("\n".join(filenames))
+ self.fm.execute_file([File(listpath)], app='editor')
+ with (open(listpath, 'r', encoding="utf-8", errors="surrogateescape") if
+ py3 else open(listpath, 'r')) as listfile:
+ new_filenames = listfile.read().split("\n")
+ os.unlink(listpath)
+ if all(a == b for a, b in zip(filenames, new_filenames)):
+ self.fm.notify("No renaming to be done!")
+ return
+
+ # Generate script
+ with tempfile.NamedTemporaryFile() as cmdfile:
+ script_lines = []
+ script_lines.append("# This file will be executed when you close"
+ " the editor.")
+ script_lines.append("# Please double-check everything, clear the"
+ " file to abort.")
+ new_dirs = []
+ for old, new in zip(filenames, new_filenames):
+ if old != new:
+ basepath, _ = os.path.split(new)
+ if (basepath and basepath not in new_dirs
+ and not os.path.isdir(basepath)):
+ script_lines.append("mkdir -vp -- {dir}".format(
+ dir=esc(basepath)))
+ new_dirs.append(basepath)
+ script_lines.append("mv -vi -- {old} {new}".format(
+ old=esc(old), new=esc(new)))
+ # Make sure not to forget the ending newline
+ script_content = "\n".join(script_lines) + "\n"
+ if py3:
+ cmdfile.write(script_content.encode(encoding="utf-8",
+ errors="surrogateescape"))
+ else:
+ cmdfile.write(script_content)
+ cmdfile.flush()
+
+ # Open the script and let the user review it, then check if the
+ # script was modified by the user
+ self.fm.execute_file([File(cmdfile.name)], app='editor')
+ cmdfile.seek(0)
+ script_was_edited = (script_content != cmdfile.read())
+
+ # Do the renaming
+ self.fm.run(['/bin/sh', cmdfile.name], flags='w')
+
+ # Retag the files, but only if the script wasn't changed during review,
+ # because only then we know which are the source and destination files.
+ if not script_was_edited:
+ tags_changed = False
+ for old, new in zip(filenames, new_filenames):
+ if old != new:
+ oldpath = self.fm.thisdir.path + '/' + old
+ newpath = self.fm.thisdir.path + '/' + new
+ if oldpath in self.fm.tags:
+ old_tag = self.fm.tags.tags[oldpath]
+ self.fm.tags.remove(oldpath)
+ self.fm.tags.tags[newpath] = old_tag
+ tags_changed = True
+ if tags_changed:
+ self.fm.tags.dump()
+ else:
+ fm.notify("files have not been retagged")
+
+
+class relink(Command):
+ """:relink <newpath>
+
+ Changes the linked path of the currently highlighted symlink to <newpath>
+ """
+
+ def execute(self):
+ new_path = self.rest(1)
+ tfile = self.fm.thisfile
+
+ if not new_path:
+ return self.fm.notify('Syntax: relink <newpath>', bad=True)
+
+ if not tfile.is_link:
+ return self.fm.notify('%s is not a symlink!' % tfile.relative_path, bad=True)
+
+ if new_path == os.readlink(tfile.path):
+ return None
+
+ try:
+ os.remove(tfile.path)
+ os.symlink(new_path, tfile.path)
+ except OSError as err:
+ self.fm.notify(err)
+
+ self.fm.reset()
+ self.fm.thisdir.pointed_obj = tfile
+ self.fm.thisfile = tfile
+
+ return None
+
+ def tab(self, tabnum):
+ if not self.rest(1):
+ return self.line + os.readlink(self.fm.thisfile.path)
+ return self._tab_directory_content()
+
+
+class help_(Command):
+ """:help
+
+ Display ranger's manual page.
+ """
+ name = 'help'
+
+ def execute(self):
+ def callback(answer):
+ if answer == "q":
+ return
+ elif answer == "m":
+ self.fm.display_help()
+ elif answer == "c":
+ self.fm.dump_commands()
+ elif answer == "k":
+ self.fm.dump_keybindings()
+ elif answer == "s":
+ self.fm.dump_settings()
+
+ self.fm.ui.console.ask(
+ "View [m]an page, [k]ey bindings, [c]ommands or [s]ettings? (press q to abort)",
+ callback,
+ list("mqkcs")
+ )
+
+
+class copymap(Command):
+ """:copymap <keys> <newkeys1> [<newkeys2>...]
+
+ Copies a "browser" keybinding from <keys> to <newkeys>
+ """
+ context = 'browser'
+
+ def execute(self):
+ if not self.arg(1) or not self.arg(2):
+ return self.fm.notify("Not enough arguments", bad=True)
+
+ for arg in self.args[2:]:
+ self.fm.ui.keymaps.copy(self.context, self.arg(1), arg)
+
+ return None
+
+
+class copypmap(copymap):
+ """:copypmap <keys> <newkeys1> [<newkeys2>...]
+
+ Copies a "pager" keybinding from <keys> to <newkeys>
+ """
+ context = 'pager'
+
+
+class copycmap(copymap):
+ """:copycmap <keys> <newkeys1> [<newkeys2>...]
+
+ Copies a "console" keybinding from <keys> to <newkeys>
+ """
+ context = 'console'
+
+
+class copytmap(copymap):
+ """:copytmap <keys> <newkeys1> [<newkeys2>...]
+
+ Copies a "taskview" keybinding from <keys> to <newkeys>
+ """
+ context = 'taskview'
+
+
+class unmap(Command):
+ """:unmap <keys> [<keys2>, ...]
+
+ Remove the given "browser" mappings
+ """
+ context = 'browser'
+
+ def execute(self):
+ for arg in self.args[1:]:
+ self.fm.ui.keymaps.unbind(self.context, arg)
+
+
+class uncmap(unmap):
+ """:uncmap <keys> [<keys2>, ...]
+
+ Remove the given "console" mappings
+ """
+ context = 'console'
+
+
+class cunmap(uncmap):
+ """:cunmap <keys> [<keys2>, ...]
+
+ Remove the given "console" mappings
+
+ DEPRECATED in favor of uncmap.
+ """
+
+ def execute(self):
+ self.fm.notify("cunmap is deprecated in favor of uncmap!")
+ super(cunmap, self).execute()
+
+
+class unpmap(unmap):
+ """:unpmap <keys> [<keys2>, ...]
+
+ Remove the given "pager" mappings
+ """
+ context = 'pager'
+
+
+class punmap(unpmap):
+ """:punmap <keys> [<keys2>, ...]
+
+ Remove the given "pager" mappings
+
+ DEPRECATED in favor of unpmap.
+ """
+
+ def execute(self):
+ self.fm.notify("punmap is deprecated in favor of unpmap!")
+ super(punmap, self).execute()
+
+
+class untmap(unmap):
+ """:untmap <keys> [<keys2>, ...]
+
+ Remove the given "taskview" mappings
+ """
+ context = 'taskview'
+
+
+class tunmap(untmap):
+ """:tunmap <keys> [<keys2>, ...]
+
+ Remove the given "taskview" mappings
+
+ DEPRECATED in favor of untmap.
+ """
+
+ def execute(self):
+ self.fm.notify("tunmap is deprecated in favor of untmap!")
+ super(tunmap, self).execute()
+
+
+class map_(Command):
+ """:map <keysequence> <command>
+
+ Maps a command to a keysequence in the "browser" context.
+
+ Example:
+ map j move down
+ map J move down 10
+ """
+ name = 'map'
+ context = 'browser'
+ resolve_macros = False
+
+ def execute(self):
+ if not self.arg(1) or not self.arg(2):
+ self.fm.notify("Syntax: {0} <keysequence> <command>".format(self.get_name()), bad=True)
+ return
+
+ self.fm.ui.keymaps.bind(self.context, self.arg(1), self.rest(2))
+
+
+class cmap(map_):
+ """:cmap <keysequence> <command>
+
+ Maps a command to a keysequence in the "console" context.
+
+ Example:
+ cmap <ESC> console_close
+ cmap <C-x> console_type test
+ """
+ context = 'console'
+
+
+class tmap(map_):
+ """:tmap <keysequence> <command>
+
+ Maps a command to a keysequence in the "taskview" context.
+ """
+ context = 'taskview'
+
+
+class pmap(map_):
+ """:pmap <keysequence> <command>
+
+ Maps a command to a keysequence in the "pager" context.
+ """
+ context = 'pager'
+
+
+class scout(Command):
+ """:scout [-FLAGS...] <pattern>
+
+ Swiss army knife command for searching, traveling and filtering files.
+
+ Flags:
+ -a Automatically open a file on unambiguous match
+ -e Open the selected file when pressing enter
+ -f Filter files that match the current search pattern
+ -g Interpret pattern as a glob pattern
+ -i Ignore the letter case of the files
+ -k Keep the console open when changing a directory with the command
+ -l Letter skipping; e.g. allow "rdme" to match the file "readme"
+ -m Mark the matching files after pressing enter
+ -M Unmark the matching files after pressing enter
+ -p Permanent filter: hide non-matching files after pressing enter
+ -r Interpret pattern as a regular expression pattern
+ -s Smart case; like -i unless pattern contains upper case letters
+ -t Apply filter and search pattern as you type
+ -v Inverts the match
+
+ Multiple flags can be combined. For example, ":scout -gpt" would create
+ a :filter-like command using globbing.
+ """
+ # pylint: disable=bad-whitespace
+ AUTO_OPEN = 'a'
+ OPEN_ON_ENTER = 'e'
+ FILTER = 'f'
+ SM_GLOB = 'g'
+ IGNORE_CASE = 'i'
+ KEEP_OPEN = 'k'
+ SM_LETTERSKIP = 'l'
+ MARK = 'm'
+ UNMARK = 'M'
+ PERM_FILTER = 'p'
+ SM_REGEX = 'r'
+ SMART_CASE = 's'
+ AS_YOU_TYPE = 't'
+ INVERT = 'v'
+ # pylint: enable=bad-whitespace
+
+ def __init__(self, *args, **kwargs):
+ super(scout, self).__init__(*args, **kwargs)
+ self._regex = None
+ self.flags, self.pattern = self.parse_flags()
+
+ def execute(self): # pylint: disable=too-many-branches
+ thisdir = self.fm.thisdir
+ flags = self.flags
+ pattern = self.pattern
+ regex = self._build_regex()
+ count = self._count(move=True)
+
+ self.fm.thistab.last_search = regex
+ self.fm.set_search_method(order="search")
+
+ if (self.MARK in flags or self.UNMARK in flags) and thisdir.files:
+ value = flags.find(self.MARK) > flags.find(self.UNMARK)
+ if self.FILTER in flags:
+ for fobj in thisdir.files:
+ thisdir.mark_item(fobj, value)
+ else:
+ for fobj in thisdir.files:
+ if regex.search(fobj.relative_path):
+ thisdir.mark_item(fobj, value)
+
+ if self.PERM_FILTER in flags:
+ thisdir.filter = regex if pattern else None
+
+ # clean up:
+ self.cancel()
+
+ if self.OPEN_ON_ENTER in flags or \
+ (self.AUTO_OPEN in flags and count == 1):
+ if pattern == '..':
+ self.fm.cd(pattern)
+ else:
+ self.fm.move(right=1)
+ if self.quickly_executed:
+ self.fm.block_input(0.5)
+
+ if self.KEEP_OPEN in flags and thisdir != self.fm.thisdir:
+ # reopen the console:
+ if not pattern:
+ self.fm.open_console(self.line)
+ else:
+ self.fm.open_console(self.line[0:-len(pattern)])
+
+ if self.quickly_executed and thisdir != self.fm.thisdir and pattern != "..":
+ self.fm.block_input(0.5)
+
+ def cancel(self):
+ self.fm.thisdir.temporary_filter = None
+ self.fm.thisdir.refilter()
+
+ def quick(self):
+ asyoutype = self.AS_YOU_TYPE in self.flags
+ if self.FILTER in self.flags:
+ self.fm.thisdir.temporary_filter = self._build_regex()
+ if self.PERM_FILTER in self.flags and asyoutype:
+ self.fm.thisdir.filter = self._build_regex()
+ if self.FILTER in self.flags or self.PERM_FILTER in self.flags:
+ self.fm.thisdir.refilter()
+ if self._count(move=asyoutype) == 1 and self.AUTO_OPEN in self.flags:
+ return True
+ return False
+
+ def tab(self, tabnum):
+ self._count(move=True, offset=tabnum)
+
+ def _build_regex(self):
+ if self._regex is not None:
+ return self._regex
+
+ frmat = "%s"
+ flags = self.flags
+ pattern = self.pattern
+
+ if pattern == ".":
+ return re.compile("")
+
+ # Handle carets at start and dollar signs at end separately
+ if pattern.startswith('^'):
+ pattern = pattern[1:]
+ frmat = "^" + frmat
+ if pattern.endswith('$'):
+ pattern = pattern[:-1]
+ frmat += "$"
+
+ # Apply one of the search methods
+ if self.SM_REGEX in flags:
+ regex = pattern
+ elif self.SM_GLOB in flags:
+ regex = re.escape(pattern).replace("\\*", ".*").replace("\\?", ".")
+ elif self.SM_LETTERSKIP in flags:
+ regex = ".*".join(re.escape(c) for c in pattern)
+ else:
+ regex = re.escape(pattern)
+
+ regex = frmat % regex
+
+ # Invert regular expression if necessary
+ if self.INVERT in flags:
+ regex = "^(?:(?!%s).)*$" % regex
+
+ # Compile Regular Expression
+ # pylint: disable=no-member
+ options = re.UNICODE
+ if self.IGNORE_CASE in flags or self.SMART_CASE in flags and \
+ pattern.islower():
+ options |= re.IGNORECASE
+ # pylint: enable=no-member
+ try:
+ self._regex = re.compile(regex, options)
+ except re.error:
+ self._regex = re.compile("")
+ return self._regex
+
+ def _count(self, move=False, offset=0):
+ count = 0
+ cwd = self.fm.thisdir
+ pattern = self.pattern
+
+ if not pattern or not cwd.files:
+ return 0
+ if pattern == '.':
+ return 0
+ if pattern == '..':
+ return 1
+
+ deq = deque(cwd.files)
+ deq.rotate(-cwd.pointer - offset)
+ i = offset
+ regex = self._build_regex()
+ for fsobj in deq:
+ if regex.search(fsobj.relative_path):
+ count += 1
+ if move and count == 1:
+ cwd.move(to=(cwd.pointer + i) % len(cwd.files))
+ self.fm.thisfile = cwd.pointed_obj
+ if count > 1:
+ return count
+ i += 1
+
+ return count == 1
+
+
+class narrow(Command):
+ """
+ :narrow
+
+ Show only the files selected right now. If no files are selected,
+ disable narrowing.
+ """
+ def execute(self):
+ if self.fm.thisdir.marked_items:
+ selection = [f.basename for f in self.fm.thistab.get_selection()]
+ self.fm.thisdir.narrow_filter = selection
+ else:
+ self.fm.thisdir.narrow_filter = None
+ self.fm.thisdir.refilter()
+
+
+class filter_inode_type(Command):
+ """
+ :filter_inode_type [dfl]
+
+ Displays only the files of specified inode type. Parameters
+ can be combined.
+
+ d display directories
+ f display files
+ l display links
+ """
+
+ def execute(self):
+ if not self.arg(1):
+ self.fm.thisdir.inode_type_filter = ""
+ else:
+ self.fm.thisdir.inode_type_filter = self.arg(1)
+ self.fm.thisdir.refilter()
+
+
+class filter_stack(Command):
+ """
+ :filter_stack ...
+
+ Manages the filter stack.
+
+ filter_stack add FILTER_TYPE ARGS...
+ filter_stack pop
+ filter_stack decompose
+ filter_stack rotate [N=1]
+ filter_stack clear
+ filter_stack show
+ """
+ def execute(self):
+ from ranger.core.filter_stack import SIMPLE_FILTERS, FILTER_COMBINATORS
+
+ subcommand = self.arg(1)
+
+ if subcommand == "add":
+ try:
+ self.fm.thisdir.filter_stack.append(
+ SIMPLE_FILTERS[self.arg(2)](self.rest(3))
+ )
+ except KeyError:
+ FILTER_COMBINATORS[self.arg(2)](self.fm.thisdir.filter_stack)
+ elif subcommand == "pop":
+ self.fm.thisdir.filter_stack.pop()
+ elif subcommand == "decompose":
+ inner_filters = self.fm.thisdir.filter_stack.pop().decompose()
+ if inner_filters:
+ self.fm.thisdir.filter_stack.extend(inner_filters)
+ elif subcommand == "clear":
+ self.fm.thisdir.filter_stack = []
+ elif subcommand == "rotate":
+ rotate_by = int(self.arg(2) or self.quantifier or 1)
+ self.fm.thisdir.filter_stack = (
+ self.fm.thisdir.filter_stack[-rotate_by:]
+ + self.fm.thisdir.filter_stack[:-rotate_by]
+ )
+ elif subcommand == "show":
+ stack = list(map(str, self.fm.thisdir.filter_stack))
+ pager = self.fm.ui.open_pager()
+ pager.set_source(["Filter stack: "] + stack)
+ pager.move(to=100, percentage=True)
+ return
+ else:
+ self.fm.notify(
+ "Unknown subcommand: {}".format(subcommand),
+ bad=True
+ )
+ return
+
+ self.fm.thisdir.refilter()
+
+
+class grep(Command):
+ """:grep <string>
+
+ Looks for a string in all marked files or directories
+ """
+
+ def execute(self):
+ if self.rest(1):
+ action = ['grep', '--line-number']
+ action.extend(['-e', self.rest(1), '-r'])
+ action.extend(f.path for f in self.fm.thistab.get_selection())
+ self.fm.execute_command(action, flags='p')
+
+
+class flat(Command):
+ """
+ :flat <level>
+
+ Flattens the directory view up to the specified level.
+
+ -1 fully flattened
+ 0 remove flattened view
+ """
+
+ def execute(self):
+ try:
+ level_str = self.rest(1)
+ level = int(level_str)
+ except ValueError:
+ level = self.quantifier
+ if level is None:
+ self.fm.notify("Syntax: flat <level>", bad=True)
+ return
+ if level < -1:
+ self.fm.notify("Need an integer number (-1, 0, 1, ...)", bad=True)
+ self.fm.thisdir.unload()
+ self.fm.thisdir.flat = level
+ self.fm.thisdir.load_content()
+
+
+class reset_previews(Command):
+ """:reset_previews
+
+ Reset the file previews.
+ """
+ def execute(self):
+ self.fm.previews = {}
+ self.fm.ui.need_redraw = True
+
+
+# Version control commands
+# --------------------------------
+
+
+class stage(Command):
+ """
+ :stage
+
+ Stage selected files for the corresponding version control system
+ """
+
+ def execute(self):
+ from ranger.ext.vcs import VcsError
+
+ if self.fm.thisdir.vcs and self.fm.thisdir.vcs.track:
+ filelist = [f.path for f in self.fm.thistab.get_selection()]
+ try:
+ self.fm.thisdir.vcs.action_add(filelist)
+ except VcsError as ex:
+ self.fm.notify('Unable to stage files: {0}'.format(ex))
+ self.fm.ui.vcsthread.process(self.fm.thisdir)
+ else:
+ self.fm.notify('Unable to stage files: Not in repository')
+
+
+class unstage(Command):
+ """
+ :unstage
+
+ Unstage selected files for the corresponding version control system
+ """
+
+ def execute(self):
+ from ranger.ext.vcs import VcsError
+
+ if self.fm.thisdir.vcs and self.fm.thisdir.vcs.track:
+ filelist = [f.path for f in self.fm.thistab.get_selection()]
+ try:
+ self.fm.thisdir.vcs.action_reset(filelist)
+ except VcsError as ex:
+ self.fm.notify('Unable to unstage files: {0}'.format(ex))
+ self.fm.ui.vcsthread.process(self.fm.thisdir)
+ else:
+ self.fm.notify('Unable to unstage files: Not in repository')
+
+# Metadata commands
+# --------------------------------
+
+
+class prompt_metadata(Command):
+ """
+ :prompt_metadata <key1> [<key2> [<key3> ...]]
+
+ Prompt the user to input metadata for multiple keys in a row.
+ """
+
+ _command_name = "meta"
+ _console_chain = None
+
+ def execute(self):
+ prompt_metadata._console_chain = self.args[1:]
+ self._process_command_stack()
+
+ def _process_command_stack(self):
+ if prompt_metadata._console_chain:
+ key = prompt_metadata._console_chain.pop()
+ self._fill_console(key)
+ else:
+ for col in self.fm.ui.browser.columns:
+ col.need_redraw = True
+
+ def _fill_console(self, key):
+ metadata = self.fm.metadata.get_metadata(self.fm.thisfile.path)
+ if key in metadata and metadata[key]:
+ existing_value = metadata[key]
+ else:
+ existing_value = ""
+ text = "%s %s %s" % (self._command_name, key, existing_value)
+ self.fm.open_console(text, position=len(text))
+
+
+class meta(prompt_metadata):
+ """
+ :meta <key> [<value>]
+
+ Change metadata of a file. Deletes the key if value is empty.
+ """
+
+ def execute(self):
+ key = self.arg(1)
+ update_dict = dict()
+ update_dict[key] = self.rest(2)
+ selection = self.fm.thistab.get_selection()
+ for fobj in selection:
+ self.fm.metadata.set_metadata(fobj.path, update_dict)
+ self._process_command_stack()
+
+ def tab(self, tabnum):
+ key = self.arg(1)
+ metadata = self.fm.metadata.get_metadata(self.fm.thisfile.path)
+ if key in metadata and metadata[key]:
+ return [" ".join([self.arg(0), self.arg(1), metadata[key]])]
+ return [self.arg(0) + " " + k for k in sorted(metadata)
+ if k.startswith(self.arg(1))]
+
+
+class linemode(default_linemode):
+ """
+ :linemode <mode>
+
+ Change what is displayed as a filename.
+
+ - "mode" may be any of the defined linemodes (see: ranger.core.linemode).
+ "normal" is mapped to "filename".
+ """
+
+ def execute(self):
+ mode = self.arg(1)
+
+ if mode == "normal":
+ from ranger.core.linemode import DEFAULT_LINEMODE
+ mode = DEFAULT_LINEMODE
+
+ if mode not in self.fm.thisfile.linemode_dict:
+ self.fm.notify("Unhandled linemode: `%s'" % mode, bad=True)
+ return
+
+ self.fm.thisdir.set_linemode_of_children(mode)
+
+ # Ask the browsercolumns to redraw
+ for col in self.fm.ui.browser.columns:
+ col.need_redraw = True
+
+
+class yank(Command):
+ """:yank [name|dir|path]
+
+ Copies the file's name (default), directory or path into both the primary X
+ selection and the clipboard.
+ """
+
+ modes = {
+ '': 'basename',
+ 'name_without_extension': 'basename_without_extension',
+ 'name': 'basename',
+ 'dir': 'dirname',
+ 'path': 'path',
+ }
+
+ def execute(self):
+ import subprocess
+
+ def clipboards():
+ from ranger.ext.get_executables import get_executables
+ clipboard_managers = {
+ 'xclip': [
+ ['xclip'],
+ ['xclip', '-selection', 'clipboard'],
+ ],
+ 'xsel': [
+ ['xsel'],
+ ['xsel', '-b'],
+ ],
+ 'wl-copy': [
+ ['wl-copy'],
+ ],
+ 'pbcopy': [
+ ['pbcopy'],
+ ],
+ }
+ ordered_managers = ['pbcopy', 'wl-copy', 'xclip', 'xsel']
+ executables = get_executables()
+ for manager in ordered_managers:
+ if manager in executables:
+ return clipboard_managers[manager]
+ return []
+
+ clipboard_commands = clipboards()
+
+ mode = self.modes[self.arg(1)]
+ selection = self.get_selection_attr(mode)
+
+ new_clipboard_contents = "\n".join(selection)
+ for command in clipboard_commands:
+ process = subprocess.Popen(command, universal_newlines=True,
+ stdin=subprocess.PIPE)
+ process.communicate(input=new_clipboard_contents)
+
+ def get_selection_attr(self, attr):
+ return [getattr(item, attr) for item in
+ self.fm.thistab.get_selection()]
+
+ def tab(self, tabnum):
+ return (
+ self.start(1) + mode for mode
+ in sorted(self.modes.keys())
+ if mode
+ )
+
+
+class paste_ext(Command):
+ """
+ :paste_ext
+
+ Like paste but tries to rename conflicting files so that the
+ file extension stays intact (e.g. file_.ext).
+ """
+
+ @staticmethod
+ def make_safe_path(dst):
+ if not os.path.exists(dst):
+ return dst
+
+ dst_name, dst_ext = os.path.splitext(dst)
+
+ if not dst_name.endswith("_"):
+ dst_name += "_"
+ if not os.path.exists(dst_name + dst_ext):
+ return dst_name + dst_ext
+ n = 0
+ test_dst = dst_name + str(n)
+ while os.path.exists(test_dst + dst_ext):
+ n += 1
+ test_dst = dst_name + str(n)
+
+ return test_dst + dst_ext
+
+ def execute(self):
+ return self.fm.paste(make_safe_path=paste_ext.make_safe_path)
diff --git a/config/ranger/rc.conf b/config/ranger/rc.conf
@@ -0,0 +1,759 @@
+# ===================================================================
+# This file contains the default startup commands for ranger.
+# To change them, it is recommended to create either /etc/ranger/rc.conf
+# (system-wide) or ~/.config/ranger/rc.conf (per user) and add your custom
+# commands there.
+#
+# If you copy this whole file there, you may want to set the environment
+# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice.
+#
+# The purpose of this file is mainly to define keybindings and settings.
+# For running more complex python code, please create a plugin in "plugins/" or
+# a command in "commands.py".
+#
+# Each line is a command that will be run before the user interface
+# is initialized. As a result, you can not use commands which rely
+# on the UI such as :delete or :mark.
+# ===================================================================
+
+# ===================================================================
+# == Options
+# ===================================================================
+
+# Which viewmode should be used? Possible values are:
+# miller: Use miller columns which show multiple levels of the hierarchy
+# multipane: Midnight-commander like multipane view showing all tabs next
+# to each other
+set viewmode miller
+#set viewmode multipane
+
+# How many columns are there, and what are their relative widths?
+set column_ratios 1,3,4
+
+# Which files should be hidden? (regular expression)
+set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$
+
+# Show hidden files? You can toggle this by typing 'zh'
+set show_hidden false
+
+# Ask for a confirmation when running the "delete" command?
+# Valid values are "always", "never", "multiple" (default)
+# With "multiple", ranger will ask only if you delete multiple files at once.
+set confirm_on_delete multiple
+
+# Use non-default path for file preview script?
+# ranger ships with scope.sh, a script that calls external programs (see
+# README.md for dependencies) to preview images, archives, etc.
+#set preview_script ~/.config/ranger/scope.sh
+
+# Use the external preview script or display simple plain text or image previews?
+set use_preview_script true
+
+# Automatically count files in the directory, even before entering them?
+set automatically_count_files true
+
+# Open all images in this directory when running certain image viewers
+# like feh or sxiv? You can still open selected files by marking them.
+set open_all_images true
+
+# Be aware of version control systems and display information.
+set vcs_aware false
+
+# State of the four backends git, hg, bzr, svn. The possible states are
+# disabled, local (only show local info), enabled (show local and remote
+# information).
+set vcs_backend_git enabled
+set vcs_backend_hg disabled
+set vcs_backend_bzr disabled
+set vcs_backend_svn disabled
+
+# Truncate the long commit messages to this length when shown in the statusbar.
+set vcs_msg_length 50
+
+# Use one of the supported image preview protocols
+set preview_images false
+
+# Set the preview image method. Supported methods:
+#
+# * w3m (default):
+# Preview images in full color with the external command "w3mimgpreview"?
+# This requires the console web browser "w3m" and a supported terminal.
+# It has been successfully tested with "xterm" and "urxvt" without tmux.
+#
+# * iterm2:
+# Preview images in full color using iTerm2 image previews
+# (http://iterm2.com/images.html). This requires using iTerm2 compiled
+# with image preview support.
+#
+# This feature relies on the dimensions of the terminal's font. By default, a
+# width of 8 and height of 11 are used. To use other values, set the options
+# iterm2_font_width and iterm2_font_height to the desired values.
+#
+# * terminology:
+# Previews images in full color in the terminology terminal emulator.
+# Supports a wide variety of formats, even vector graphics like svg.
+#
+# * urxvt:
+# Preview images in full color using urxvt image backgrounds. This
+# requires using urxvt compiled with pixbuf support.
+#
+# * urxvt-full:
+# The same as urxvt but utilizing not only the preview pane but the
+# whole terminal window.
+#
+# * kitty:
+# Preview images in full color using kitty image protocol.
+# Requires python PIL or pillow library.
+# If ranger does not share the local filesystem with kitty
+# the transfer method is changed to encode the whole image;
+# while slower, this allows remote previews,
+# for example during an ssh session.
+# Tmux is unsupported.
+#
+# * ueberzug:
+# Preview images in full color with the external command "ueberzug".
+# Images are shown by using a child window.
+# Only for users who run X11 in GNU/Linux.
+set preview_images_method w3m
+
+# Delay in seconds before displaying an image with the w3m method.
+# Increase it in case of experiencing display corruption.
+set w3m_delay 0.02
+
+# Manually adjust the w3mimg offset when using a terminal which needs this
+set w3m_offset 0
+
+# Default iTerm2 font size (see: preview_images_method: iterm2)
+set iterm2_font_width 8
+set iterm2_font_height 11
+
+# Use a unicode "..." character to mark cut-off filenames?
+set unicode_ellipsis false
+
+# BIDI support - try to properly display file names in RTL languages (Hebrew, Arabic).
+# Requires the python-bidi pip package
+set bidi_support false
+
+# Show dotfiles in the bookmark preview box?
+set show_hidden_bookmarks true
+
+# Which colorscheme to use? These colorschemes are available by default:
+# default, jungle, snow, solarized
+set colorscheme default
+
+# Preview files on the rightmost column?
+# And collapse (shrink) the last column if there is nothing to preview?
+set preview_files true
+set preview_directories true
+set collapse_preview true
+
+# Wrap long lines in plain text previews?
+set wrap_plaintext_previews false
+
+# Save the console history on exit?
+set save_console_history true
+
+# Draw the status bar on top of the browser window (default: bottom)
+set status_bar_on_top false
+
+# Draw a progress bar in the status bar which displays the average state of all
+# currently running tasks which support progress bars?
+set draw_progress_bar_in_status_bar true
+
+# Draw borders around columns? (separators, outline, both, or none)
+# Separators are vertical lines between columns.
+# Outline draws a box around all the columns.
+# Both combines the two.
+set draw_borders none
+
+# Display the directory name in tabs?
+set dirname_in_tabs false
+
+# Enable the mouse support?
+set mouse_enabled true
+
+# Display the file size in the main column or status bar?
+set display_size_in_main_column true
+set display_size_in_status_bar true
+
+# Display the free disk space in the status bar?
+set display_free_space_in_status_bar true
+
+# Display files tags in all columns or only in main column?
+set display_tags_in_all_columns true
+
+# Set a title for the window? Updates both `WM_NAME` and `WM_ICON_NAME`
+set update_title false
+
+# Set the tmux/screen window-name to "ranger"?
+set update_tmux_title true
+
+# Shorten the title if it gets long? The number defines how many
+# directories are displayed at once, 0 turns off this feature.
+set shorten_title 3
+
+# Show hostname in titlebar?
+set hostname_in_titlebar true
+
+# Abbreviate $HOME with ~ in the titlebar (first line) of ranger?
+set tilde_in_titlebar false
+
+# How many directory-changes or console-commands should be kept in history?
+set max_history_size 20
+set max_console_history_size 50
+
+# Try to keep so much space between the top/bottom border when scrolling:
+set scroll_offset 8
+
+# Flush the input after each key hit? (Noticeable when ranger lags)
+set flushinput true
+
+# Padding on the right when there's no preview?
+# This allows you to click into the space to run the file.
+set padding_right true
+
+# Save bookmarks (used with mX and `X) instantly?
+# This helps to synchronize bookmarks between multiple ranger
+# instances but leads to *slight* performance loss.
+# When false, bookmarks are saved when ranger is exited.
+set autosave_bookmarks true
+
+# Save the "`" bookmark to disk. This can be used to switch to the last
+# directory by typing "``".
+set save_backtick_bookmark true
+
+# You can display the "real" cumulative size of directories by using the
+# command :get_cumulative_size or typing "dc". The size is expensive to
+# calculate and will not be updated automatically. You can choose
+# to update it automatically though by turning on this option:
+set autoupdate_cumulative_size false
+
+# Turning this on makes sense for screen readers:
+set show_cursor false
+
+# One of: size, natural, basename, atime, ctime, mtime, type, random
+set sort natural
+
+# Additional sorting options
+set sort_reverse false
+set sort_case_insensitive true
+set sort_directories_first true
+set sort_unicode false
+
+# Enable this if key combinations with the Alt Key don't work for you.
+# (Especially on xterm)
+set xterm_alt_key false
+
+# Whether to include bookmarks in cd command
+set cd_bookmarks true
+
+# Changes case sensitivity for the cd command tab completion
+set cd_tab_case sensitive
+
+# Use fuzzy tab completion with the "cd" command. For example,
+# ":cd /u/lo/b<tab>" expands to ":cd /usr/local/bin".
+set cd_tab_fuzzy false
+
+# Avoid previewing files larger than this size, in bytes. Use a value of 0 to
+# disable this feature.
+set preview_max_size 0
+
+# The key hint lists up to this size have their sublists expanded.
+# Otherwise the submaps are replaced with "...".
+set hint_collapse_threshold 10
+
+# Add the highlighted file to the path in the titlebar
+set show_selection_in_titlebar true
+
+# The delay that ranger idly waits for user input, in milliseconds, with a
+# resolution of 100ms. Lower delay reduces lag between directory updates but
+# increases CPU load.
+set idle_delay 2000
+
+# When the metadata manager module looks for metadata, should it only look for
+# a ".metadata.json" file in the current directory, or do a deep search and
+# check all directories above the current one as well?
+set metadata_deep_search false
+
+# Clear all existing filters when leaving a directory
+set clear_filters_on_dir_change false
+
+# Disable displaying line numbers in main column.
+# Possible values: false, absolute, relative.
+set line_numbers false
+
+# When line_numbers=relative show the absolute line number in the
+# current line.
+set relative_current_zero false
+
+# Start line numbers from 1 instead of 0
+set one_indexed false
+
+# Save tabs on exit
+set save_tabs_on_exit false
+
+# Enable scroll wrapping - moving down while on the last item will wrap around to
+# the top and vice versa.
+set wrap_scroll false
+
+# Set the global_inode_type_filter to nothing. Possible options: d, f and l for
+# directories, files and symlinks respectively.
+set global_inode_type_filter
+
+# This setting allows to freeze the list of files to save I/O bandwidth. It
+# should be 'false' during start-up, but you can toggle it by pressing F.
+set freeze_files false
+
+# Print file sizes in bytes instead of the default human-readable format.
+set size_in_bytes false
+
+# Warn at startup if RANGER_LEVEL env var is greater than 0, in other words
+# give a warning when you nest ranger in a subshell started by ranger.
+# Special value "error" makes the warning more visible.
+set nested_ranger_warning true
+
+# ===================================================================
+# == Local Options
+# ===================================================================
+# You can set local options that only affect a single directory.
+
+# Examples:
+# setlocal path=~/downloads sort mtime
+
+# ===================================================================
+# == Command Aliases in the Console
+# ===================================================================
+
+alias e edit
+alias q quit
+alias q! quit!
+alias qa quitall
+alias qa! quitall!
+alias qall quitall
+alias qall! quitall!
+alias setl setlocal
+
+alias filter scout -prts
+alias find scout -aets
+alias mark scout -mr
+alias unmark scout -Mr
+alias search scout -rs
+alias search_inc scout -rts
+alias travel scout -aefklst
+
+# ===================================================================
+# == Define keys for the browser
+# ===================================================================
+
+# Basic
+map Q quitall
+map q quit
+copymap q ZZ ZQ
+
+map R reload_cwd
+map F set freeze_files!
+map <C-r> reset
+map <C-l> redraw_window
+map <C-c> abort
+map <esc> change_mode normal
+map ~ set viewmode!
+
+map i display_file
+map <A-j> scroll_preview 1
+map <A-k> scroll_preview -1
+map ? help
+map W display_log
+map w taskview_open
+map S shell $SHELL
+
+map : console
+map ; console
+map ! console shell%space
+map @ console -p6 shell %%s
+map # console shell -p%space
+map s console shell%space
+map r chain draw_possible_programs; console open_with%space
+map f console find%space
+map cd console cd%space
+
+map <C-p> chain console; eval fm.ui.console.history_move(-1)
+
+# Change the line mode
+map Mf linemode filename
+map Mi linemode fileinfo
+map Mm linemode mtime
+map Mh linemode humanreadablemtime
+map Mp linemode permissions
+map Ms linemode sizemtime
+map MH linemode sizehumanreadablemtime
+map Mt linemode metatitle
+
+# Tagging / Marking
+map t tag_toggle
+map ut tag_remove
+map "<any> tag_toggle tag=%any
+map <Space> mark_files toggle=True
+map v mark_files all=True toggle=True
+map uv mark_files all=True val=False
+map V toggle_visual_mode
+map uV toggle_visual_mode reverse=True
+
+# For the nostalgics: Midnight Commander bindings
+map <F1> help
+map <F2> rename_append
+map <F3> display_file
+map <F4> edit
+map <F5> copy
+map <F6> cut
+map <F7> console mkdir%space
+map <F8> console delete
+#map <F8> console trash
+map <F10> exit
+
+# In case you work on a keyboard with dvorak layout
+map <UP> move up=1
+map <DOWN> move down=1
+map <LEFT> move left=1
+map <RIGHT> move right=1
+map <HOME> move to=0
+map <END> move to=-1
+map <PAGEDOWN> move down=1 pages=True
+map <PAGEUP> move up=1 pages=True
+map <CR> move right=1
+#map <DELETE> console delete
+map <INSERT> console touch%space
+
+# VIM-like
+copymap <UP> k
+copymap <DOWN> j
+copymap <LEFT> h
+copymap <RIGHT> l
+copymap <HOME> gg
+copymap <END> G
+copymap <PAGEDOWN> <C-F>
+copymap <PAGEUP> <C-B>
+
+map J move down=0.5 pages=True
+map K move up=0.5 pages=True
+copymap J <C-D>
+copymap K <C-U>
+
+# Jumping around
+map H history_go -1
+map L history_go 1
+map ] move_parent 1
+map [ move_parent -1
+map } traverse
+map { traverse_backwards
+map ) jump_non
+
+map gh cd ~
+map ge cd /etc
+map gu cd /usr
+map gd cd /dev
+map gl cd -r .
+map gL cd -r %f
+map go cd /opt
+map gv cd /var
+map gm cd /media
+map gi eval fm.cd('/run/media/' + os.getenv('USER'))
+map gM cd /mnt
+map gs cd /srv
+map gp cd /tmp
+map gr cd /
+map gR eval fm.cd(ranger.RANGERDIR)
+map g/ cd /
+map g? cd /usr/share/doc/ranger
+
+# External Programs
+map E edit
+map du shell -p du --max-depth=1 -h --apparent-size
+map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh
+map yp yank path
+map yd yank dir
+map yn yank name
+map y. yank name_without_extension
+
+# Filesystem Operations
+map = chmod
+
+map cw console rename%space
+map a rename_append
+map A eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"))
+map I eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"), position=7)
+
+map pp paste
+map po paste overwrite=True
+map pP paste append=True
+map pO paste overwrite=True append=True
+map pl paste_symlink relative=False
+map pL paste_symlink relative=True
+map phl paste_hardlink
+map pht paste_hardlinked_subtree
+map pd console paste dest=
+map p`<any> paste dest=%any_path
+map p'<any> paste dest=%any_path
+
+map dD console delete
+map dT console trash
+
+map dd cut
+map ud uncut
+map da cut mode=add
+map dr cut mode=remove
+map dt cut mode=toggle
+
+map yy copy
+map uy uncut
+map ya copy mode=add
+map yr copy mode=remove
+map yt copy mode=toggle
+
+# Temporary workarounds
+map dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier)
+map dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier)
+map dj eval fm.cut(dirarg=dict(down=1), narg=quantifier)
+map dk eval fm.cut(dirarg=dict(up=1), narg=quantifier)
+map ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier)
+map yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier)
+map yj eval fm.copy(dirarg=dict(down=1), narg=quantifier)
+map yk eval fm.copy(dirarg=dict(up=1), narg=quantifier)
+
+# Searching
+map / console search%space
+map n search_next
+map N search_next forward=False
+map ct search_next order=tag
+map cs search_next order=size
+map ci search_next order=mimetype
+map cc search_next order=ctime
+map cm search_next order=mtime
+map ca search_next order=atime
+
+# Tabs
+map <C-n> tab_new
+map <C-w> tab_close
+map <TAB> tab_move 1
+map <S-TAB> tab_move -1
+map <A-Right> tab_move 1
+map <A-Left> tab_move -1
+map gt tab_move 1
+map gT tab_move -1
+map gn tab_new
+map gc tab_close
+map uq tab_restore
+map <a-1> tab_open 1
+map <a-2> tab_open 2
+map <a-3> tab_open 3
+map <a-4> tab_open 4
+map <a-5> tab_open 5
+map <a-6> tab_open 6
+map <a-7> tab_open 7
+map <a-8> tab_open 8
+map <a-9> tab_open 9
+map <a-r> tab_shift 1
+map <a-l> tab_shift -1
+
+# Sorting
+map or set sort_reverse!
+map oz set sort=random
+map os chain set sort=size; set sort_reverse=False
+map ob chain set sort=basename; set sort_reverse=False
+map on chain set sort=natural; set sort_reverse=False
+map om chain set sort=mtime; set sort_reverse=False
+map oc chain set sort=ctime; set sort_reverse=False
+map oa chain set sort=atime; set sort_reverse=False
+map ot chain set sort=type; set sort_reverse=False
+map oe chain set sort=extension; set sort_reverse=False
+
+map oS chain set sort=size; set sort_reverse=True
+map oB chain set sort=basename; set sort_reverse=True
+map oN chain set sort=natural; set sort_reverse=True
+map oM chain set sort=mtime; set sort_reverse=True
+map oC chain set sort=ctime; set sort_reverse=True
+map oA chain set sort=atime; set sort_reverse=True
+map oT chain set sort=type; set sort_reverse=True
+map oE chain set sort=extension; set sort_reverse=True
+
+map dc get_cumulative_size
+
+# Settings
+map zc set collapse_preview!
+map zd set sort_directories_first!
+map zh set show_hidden!
+map <C-h> set show_hidden!
+copymap <C-h> <backspace>
+copymap <backspace> <backspace2>
+map zI set flushinput!
+map zi set preview_images!
+map zm set mouse_enabled!
+map zp set preview_files!
+map zP set preview_directories!
+map zs set sort_case_insensitive!
+map zu set autoupdate_cumulative_size!
+map zv set use_preview_script!
+map zf console filter%space
+copymap zf zz
+
+# Filter stack
+map .d filter_stack add type d
+map .f filter_stack add type f
+map .l filter_stack add type l
+map .m console filter_stack add mime%space
+map .n console filter_stack add name%space
+map .# console filter_stack add hash%space
+map ." filter_stack add duplicate
+map .' filter_stack add unique
+map .| filter_stack add or
+map .& filter_stack add and
+map .! filter_stack add not
+map .r filter_stack rotate
+map .c filter_stack clear
+map .* filter_stack decompose
+map .p filter_stack pop
+map .. filter_stack show
+
+# Bookmarks
+map `<any> enter_bookmark %any
+map '<any> enter_bookmark %any
+map m<any> set_bookmark %any
+map um<any> unset_bookmark %any
+
+map m<bg> draw_bookmarks
+copymap m<bg> um<bg> `<bg> '<bg>
+
+# Generate all the chmod bindings with some python help:
+eval for arg in "rwxXst": cmd("map +u{0} shell -f chmod u+{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map +g{0} shell -f chmod g+{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map +o{0} shell -f chmod o+{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map +a{0} shell -f chmod a+{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map +{0} shell -f chmod u+{0} %s".format(arg))
+
+eval for arg in "rwxXst": cmd("map -u{0} shell -f chmod u-{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map -g{0} shell -f chmod g-{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map -o{0} shell -f chmod o-{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map -a{0} shell -f chmod a-{0} %s".format(arg))
+eval for arg in "rwxXst": cmd("map -{0} shell -f chmod u-{0} %s".format(arg))
+
+# ===================================================================
+# == Define keys for the console
+# ===================================================================
+# Note: Unmapped keys are passed directly to the console.
+
+# Basic
+cmap <tab> eval fm.ui.console.tab()
+cmap <s-tab> eval fm.ui.console.tab(-1)
+cmap <ESC> eval fm.ui.console.close()
+cmap <CR> eval fm.ui.console.execute()
+cmap <C-l> redraw_window
+
+copycmap <ESC> <C-c>
+copycmap <CR> <C-j>
+
+# Move around
+cmap <up> eval fm.ui.console.history_move(-1)
+cmap <down> eval fm.ui.console.history_move(1)
+cmap <left> eval fm.ui.console.move(left=1)
+cmap <right> eval fm.ui.console.move(right=1)
+cmap <home> eval fm.ui.console.move(right=0, absolute=True)
+cmap <end> eval fm.ui.console.move(right=-1, absolute=True)
+cmap <a-b> eval fm.ui.console.move_word(left=1)
+cmap <a-f> eval fm.ui.console.move_word(right=1)
+
+copycmap <a-b> <a-left>
+copycmap <a-f> <a-right>
+
+# Line Editing
+cmap <backspace> eval fm.ui.console.delete(-1)
+cmap <delete> eval fm.ui.console.delete(0)
+cmap <C-w> eval fm.ui.console.delete_word()
+cmap <A-d> eval fm.ui.console.delete_word(backward=False)
+cmap <C-k> eval fm.ui.console.delete_rest(1)
+cmap <C-u> eval fm.ui.console.delete_rest(-1)
+cmap <C-y> eval fm.ui.console.paste()
+
+# And of course the emacs way
+copycmap <ESC> <C-g>
+copycmap <up> <C-p>
+copycmap <down> <C-n>
+copycmap <left> <C-b>
+copycmap <right> <C-f>
+copycmap <home> <C-a>
+copycmap <end> <C-e>
+copycmap <delete> <C-d>
+copycmap <backspace> <C-h>
+
+# Note: There are multiple ways to express backspaces. <backspace> (code 263)
+# and <backspace2> (code 127). To be sure, use both.
+copycmap <backspace> <backspace2>
+
+# This special expression allows typing in numerals:
+cmap <allow_quantifiers> false
+
+# ===================================================================
+# == Pager Keybindings
+# ===================================================================
+
+# Movement
+pmap <down> pager_move down=1
+pmap <up> pager_move up=1
+pmap <left> pager_move left=4
+pmap <right> pager_move right=4
+pmap <home> pager_move to=0
+pmap <end> pager_move to=-1
+pmap <pagedown> pager_move down=1.0 pages=True
+pmap <pageup> pager_move up=1.0 pages=True
+pmap <C-d> pager_move down=0.5 pages=True
+pmap <C-u> pager_move up=0.5 pages=True
+
+copypmap <UP> k <C-p>
+copypmap <DOWN> j <C-n> <CR>
+copypmap <LEFT> h
+copypmap <RIGHT> l
+copypmap <HOME> g
+copypmap <END> G
+copypmap <C-d> d
+copypmap <C-u> u
+copypmap <PAGEDOWN> n f <C-F> <Space>
+copypmap <PAGEUP> p b <C-B>
+
+# Basic
+pmap <C-l> redraw_window
+pmap <ESC> pager_close
+copypmap <ESC> q Q i <F3>
+pmap E edit_file
+
+# ===================================================================
+# == Taskview Keybindings
+# ===================================================================
+
+# Movement
+tmap <up> taskview_move up=1
+tmap <down> taskview_move down=1
+tmap <home> taskview_move to=0
+tmap <end> taskview_move to=-1
+tmap <pagedown> taskview_move down=1.0 pages=True
+tmap <pageup> taskview_move up=1.0 pages=True
+tmap <C-d> taskview_move down=0.5 pages=True
+tmap <C-u> taskview_move up=0.5 pages=True
+
+copytmap <UP> k <C-p>
+copytmap <DOWN> j <C-n> <CR>
+copytmap <HOME> g
+copytmap <END> G
+copytmap <C-u> u
+copytmap <PAGEDOWN> n f <C-F> <Space>
+copytmap <PAGEUP> p b <C-B>
+
+# Changing priority and deleting tasks
+tmap J eval -q fm.ui.taskview.task_move(-1)
+tmap K eval -q fm.ui.taskview.task_move(0)
+tmap dd eval -q fm.ui.taskview.task_remove()
+tmap <pagedown> eval -q fm.ui.taskview.task_move(-1)
+tmap <pageup> eval -q fm.ui.taskview.task_move(0)
+tmap <delete> eval -q fm.ui.taskview.task_remove()
+
+# Basic
+tmap <C-l> redraw_window
+tmap <ESC> taskview_close
+copytmap <ESC> q Q w <C-c>
diff --git a/config/ranger/rifle.conf b/config/ranger/rifle.conf
@@ -0,0 +1,285 @@
+# vim: ft=cfg
+#
+# This is the configuration file of "rifle", ranger's file executor/opener.
+# Each line consists of conditions and a command. For each line the conditions
+# are checked and if they are met, the respective command is run.
+#
+# Syntax:
+# <condition1> , <condition2> , ... = command
+#
+# The command can contain these environment variables:
+# $1-$9 | The n-th selected file
+# $@ | All selected files
+#
+# If you use the special command "ask", rifle will ask you what program to run.
+#
+# Prefixing a condition with "!" will negate its result.
+# These conditions are currently supported:
+# match <regexp> | The regexp matches $1
+# ext <regexp> | The regexp matches the extension of $1
+# mime <regexp> | The regexp matches the mime type of $1
+# name <regexp> | The regexp matches the basename of $1
+# path <regexp> | The regexp matches the absolute path of $1
+# has <program> | The program is installed (i.e. located in $PATH)
+# env <variable> | The environment variable "variable" is non-empty
+# file | $1 is a file
+# directory | $1 is a directory
+# number <n> | change the number of this command to n
+# terminal | stdin, stderr and stdout are connected to a terminal
+# X | A graphical environment is available (darwin, Xorg, or Wayland)
+#
+# There are also pseudo-conditions which have a "side effect":
+# flag <flags> | Change how the program is run. See below.
+# label <label> | Assign a label or name to the command so it can
+# | be started with :open_with <label> in ranger
+# | or `rifle -p <label>` in the standalone executable.
+# else | Always true.
+#
+# Flags are single characters which slightly transform the command:
+# f | Fork the program, make it run in the background.
+# | New command = setsid $command >& /dev/null &
+# r | Execute the command with root permissions
+# | New command = sudo $command
+# t | Run the program in a new terminal. If $TERMCMD is not defined,
+# | rifle will attempt to extract it from $TERM.
+# | New command = $TERMCMD -e $command
+# Note: The "New command" serves only as an illustration, the exact
+# implementation may differ.
+# Note: When using rifle in ranger, there is an additional flag "c" for
+# only running the current file even if you have marked multiple files.
+
+#-------------------------------------------
+# Websites
+#-------------------------------------------
+# Rarely installed browsers get higher priority; It is assumed that if you
+# install a rare browser, you probably use it. Firefox/konqueror/w3m on the
+# other hand are often only installed as fallback browsers.
+ext x?html?, has surf, X, flag f = surf -- file://"$1"
+ext x?html?, has vimprobable, X, flag f = vimprobable -- "$@"
+ext x?html?, has vimprobable2, X, flag f = vimprobable2 -- "$@"
+ext x?html?, has qutebrowser, X, flag f = qutebrowser -- "$@"
+ext x?html?, has dwb, X, flag f = dwb -- "$@"
+ext x?html?, has jumanji, X, flag f = jumanji -- "$@"
+ext x?html?, has luakit, X, flag f = luakit -- "$@"
+ext x?html?, has uzbl, X, flag f = uzbl -- "$@"
+ext x?html?, has uzbl-tabbed, X, flag f = uzbl-tabbed -- "$@"
+ext x?html?, has uzbl-browser, X, flag f = uzbl-browser -- "$@"
+ext x?html?, has uzbl-core, X, flag f = uzbl-core -- "$@"
+ext x?html?, has midori, X, flag f = midori -- "$@"
+ext x?html?, has opera, X, flag f = opera -- "$@"
+ext x?html?, has firefox, X, flag f = firefox -- "$@"
+ext x?html?, has seamonkey, X, flag f = seamonkey -- "$@"
+ext x?html?, has iceweasel, X, flag f = iceweasel -- "$@"
+ext x?html?, has chromium-browser, X, flag f = chromium-browser -- "$@"
+ext x?html?, has chromium, X, flag f = chromium -- "$@"
+ext x?html?, has google-chrome, X, flag f = google-chrome -- "$@"
+ext x?html?, has epiphany, X, flag f = epiphany -- "$@"
+ext x?html?, has konqueror, X, flag f = konqueror -- "$@"
+ext x?html?, has elinks, terminal = elinks "$@"
+ext x?html?, has links2, terminal = links2 "$@"
+ext x?html?, has links, terminal = links "$@"
+ext x?html?, has lynx, terminal = lynx -- "$@"
+ext x?html?, has w3m, terminal = w3m "$@"
+
+#-------------------------------------------
+# Misc
+#-------------------------------------------
+# Define the "editor" for text files as first action
+mime ^text, label editor = ${VISUAL:-$EDITOR} -- "$@"
+mime ^text, label pager = "$PAGER" -- "$@"
+!mime ^text, label editor, ext xml|json|csv|tex|py|pl|rb|js|sh|php = ${VISUAL:-$EDITOR} -- "$@"
+!mime ^text, label pager, ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@"
+
+ext 1 = man "$1"
+ext s[wmf]c, has zsnes, X = zsnes "$1"
+ext s[wmf]c, has snes9x-gtk,X = snes9x-gtk "$1"
+ext nes, has fceux, X = fceux "$1"
+ext exe = wine "$1"
+name ^[mM]akefile$ = make
+
+#--------------------------------------------
+# Scripts
+#-------------------------------------------
+ext py = python -- "$1"
+ext pl = perl -- "$1"
+ext rb = ruby -- "$1"
+ext js = node -- "$1"
+ext sh = sh -- "$1"
+ext php = php -- "$1"
+
+#--------------------------------------------
+# Audio without X
+#-------------------------------------------
+mime ^audio|ogg$, terminal, has mpv = mpv -- "$@"
+mime ^audio|ogg$, terminal, has mplayer2 = mplayer2 -- "$@"
+mime ^audio|ogg$, terminal, has mplayer = mplayer -- "$@"
+ext midi?, terminal, has wildmidi = wildmidi -- "$@"
+
+#--------------------------------------------
+# Video/Audio with a GUI
+#-------------------------------------------
+mime ^video|audio, has gmplayer, X, flag f = gmplayer -- "$@"
+mime ^video|audio, has smplayer, X, flag f = smplayer "$@"
+mime ^video, has mpv, X, flag f = mpv -- "$@"
+mime ^video, has mpv, X, flag f = mpv --fs -- "$@"
+mime ^video, has mplayer2, X, flag f = mplayer2 -- "$@"
+mime ^video, has mplayer2, X, flag f = mplayer2 -fs -- "$@"
+mime ^video, has mplayer, X, flag f = mplayer -- "$@"
+mime ^video, has mplayer, X, flag f = mplayer -fs -- "$@"
+mime ^video|audio, has vlc, X, flag f = vlc -- "$@"
+mime ^video|audio, has totem, X, flag f = totem -- "$@"
+mime ^video|audio, has totem, X, flag f = totem --fullscreen -- "$@"
+
+#--------------------------------------------
+# Video without X
+#-------------------------------------------
+mime ^video, terminal, !X, has mpv = mpv -- "$@"
+mime ^video, terminal, !X, has mplayer2 = mplayer2 -- "$@"
+mime ^video, terminal, !X, has mplayer = mplayer -- "$@"
+
+#-------------------------------------------
+# Documents
+#-------------------------------------------
+ext pdf, has llpp, X, flag f = llpp "$@"
+ext pdf, has zathura, X, flag f = zathura -- "$@"
+ext pdf, has mupdf, X, flag f = mupdf "$@"
+ext pdf, has mupdf-x11,X, flag f = mupdf-x11 "$@"
+ext pdf, has apvlv, X, flag f = apvlv -- "$@"
+ext pdf, has xpdf, X, flag f = xpdf -- "$@"
+ext pdf, has evince, X, flag f = evince -- "$@"
+ext pdf, has atril, X, flag f = atril -- "$@"
+ext pdf, has okular, X, flag f = okular -- "$@"
+ext pdf, has epdfview, X, flag f = epdfview -- "$@"
+ext pdf, has qpdfview, X, flag f = qpdfview "$@"
+ext pdf, has open, X, flag f = open "$@"
+
+ext docx?, has catdoc, terminal = catdoc -- "$@" | "$PAGER"
+
+ext sxc|xlsx?|xlt|xlw|gnm|gnumeric, has gnumeric, X, flag f = gnumeric -- "$@"
+ext sxc|xlsx?|xlt|xlw|gnm|gnumeric, has kspread, X, flag f = kspread -- "$@"
+ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f = libreoffice "$@"
+ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has soffice, X, flag f = soffice "$@"
+ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has ooffice, X, flag f = ooffice "$@"
+
+ext djvu, has zathura,X, flag f = zathura -- "$@"
+ext djvu, has evince, X, flag f = evince -- "$@"
+ext djvu, has atril, X, flag f = atril -- "$@"
+ext djvu, has djview, X, flag f = djview -- "$@"
+
+ext epub, has ebook-viewer, X, flag f = ebook-viewer -- "$@"
+ext epub, has zathura, X, flag f = zathura -- "$@"
+ext epub, has mupdf, X, flag f = mupdf -- "$@"
+ext mobi, has ebook-viewer, X, flag f = ebook-viewer -- "$@"
+
+ext cbr, has zathura, X, flag f = zathura -- "$@"
+ext cbz, has zathura, X, flag f = zathura -- "$@"
+
+#-------------------------------------------
+# Images
+#-------------------------------------------
+mime ^image/svg, has inkscape, X, flag f = inkscape -- "$@"
+mime ^image/svg, has display, X, flag f = display -- "$@"
+
+mime ^image, has mpv, X, flag f = mpv --pause -- "$@"
+mime ^image, has imv, X, flag f = imv -- "$@"
+mime ^image, has pqiv, X, flag f = pqiv -- "$@"
+mime ^image, has sxiv, X, flag f = sxiv -- "$@"
+mime ^image, has feh, X, flag f = feh -- "$@"
+mime ^image, has mirage, X, flag f = mirage -- "$@"
+mime ^image, has ristretto, X, flag f = ristretto "$@"
+mime ^image, has eog, X, flag f = eog -- "$@"
+mime ^image, has eom, X, flag f = eom -- "$@"
+mime ^image, has nomacs, X, flag f = nomacs -- "$@"
+mime ^image, has geeqie, X, flag f = geeqie -- "$@"
+mime ^image, has gpicview, X, flag f = gpicview -- "$@"
+mime ^image, has gwenview, X, flag f = gwenview -- "$@"
+mime ^image, has gimp, X, flag f = gimp -- "$@"
+ext xcf, X, flag f = gimp -- "$@"
+
+#-------------------------------------------
+# Archives
+#-------------------------------------------
+
+# avoid password prompt by providing empty password
+ext 7z, has 7z = 7z -p l "$@" | "$PAGER"
+# This requires atool
+ext ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has atool = atool --list --each -- "$@" | "$PAGER"
+ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has atool = atool --list --each -- "$@" | "$PAGER"
+ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has atool = atool --extract --each -- "$@"
+ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has atool = atool --extract --each -- "$@"
+
+# Listing and extracting archives without atool:
+ext tar|gz|bz2|xz, has tar = tar vvtf "$1" | "$PAGER"
+ext tar|gz|bz2|xz, has tar = for file in "$@"; do tar vvxf "$file"; done
+ext bz2, has bzip2 = for file in "$@"; do bzip2 -dk "$file"; done
+ext zip, has unzip = unzip -l "$1" | less
+ext zip, has unzip = for file in "$@"; do unzip -d "${file%.*}" "$file"; done
+ext ace, has unace = unace l "$1" | less
+ext ace, has unace = for file in "$@"; do unace e "$file"; done
+ext rar, has unrar = unrar l "$1" | less
+ext rar, has unrar = for file in "$@"; do unrar x "$file"; done
+
+#-------------------------------------------
+# Fonts
+#-------------------------------------------
+mime ^font, has fontforge, X, flag f = fontforge "$@"
+
+#-------------------------------------------
+# Flag t fallback terminals
+#-------------------------------------------
+# Rarely installed terminal emulators get higher priority; It is assumed that
+# if you install a rare terminal emulator, you probably use it.
+# gnome-terminal/konsole/xterm on the other hand are often installed as part of
+# a desktop environment or as fallback terminal emulators.
+mime ^ranger/x-terminal-emulator, has terminology = terminology -e "$@"
+mime ^ranger/x-terminal-emulator, has kitty = kitty -- "$@"
+mime ^ranger/x-terminal-emulator, has alacritty = alacritty -e "$@"
+mime ^ranger/x-terminal-emulator, has sakura = sakura -e "$@"
+mime ^ranger/x-terminal-emulator, has lilyterm = lilyterm -e "$@"
+#mime ^ranger/x-terminal-emulator, has cool-retro-term = cool-retro-term -e "$@"
+mime ^ranger/x-terminal-emulator, has termite = termite -x '"$@"'
+#mime ^ranger/x-terminal-emulator, has yakuake = yakuake -e "$@"
+mime ^ranger/x-terminal-emulator, has guake = guake -ne "$@"
+mime ^ranger/x-terminal-emulator, has tilda = tilda -c "$@"
+mime ^ranger/x-terminal-emulator, has st = st -e "$@"
+mime ^ranger/x-terminal-emulator, has terminator = terminator -x "$@"
+mime ^ranger/x-terminal-emulator, has urxvt = urxvt -e "$@"
+mime ^ranger/x-terminal-emulator, has pantheon-terminal = pantheon-terminal -e "$@"
+mime ^ranger/x-terminal-emulator, has lxterminal = lxterminal -e "$@"
+mime ^ranger/x-terminal-emulator, has mate-terminal = mate-terminal -x "$@"
+mime ^ranger/x-terminal-emulator, has xfce4-terminal = xfce4-terminal -x "$@"
+mime ^ranger/x-terminal-emulator, has konsole = konsole -e "$@"
+mime ^ranger/x-terminal-emulator, has gnome-terminal = gnome-terminal -- "$@"
+mime ^ranger/x-terminal-emulator, has xterm = xterm -e "$@"
+
+#-------------------------------------------
+# Misc
+#-------------------------------------------
+label wallpaper, number 11, mime ^image, has feh, X = feh --bg-scale "$1"
+label wallpaper, number 12, mime ^image, has feh, X = feh --bg-tile "$1"
+label wallpaper, number 13, mime ^image, has feh, X = feh --bg-center "$1"
+label wallpaper, number 14, mime ^image, has feh, X = feh --bg-fill "$1"
+
+#-------------------------------------------
+# Generic file openers
+#-------------------------------------------
+label open, has xdg-open = xdg-open -- "$@"
+label open, has open = open -- "$@"
+
+# Define the editor for non-text files + pager as last action
+ !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = vim
+label editor, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = vim -- "$@"
+label pager, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@"
+
+
+######################################################################
+# The actions below are left so low down in this file on purpose, so #
+# they are never triggered accidentally. #
+######################################################################
+
+# Execute a file as program/script.
+mime application/x-executable = "$1"
+
+# Move the file to trash using trash-cli.
+label trash, has trash-put = trash-put -- "$@"
+label trash = mkdir -p -- ${XDG_DATA_DIR:-$HOME/.ranger}/ranger-trash; mv -- "$@" ${XDG_DATA_DIR:-$HOME/.ranger}/ranger-trash
diff --git a/config/ranger/scope.sh b/config/ranger/scope.sh
@@ -0,0 +1,350 @@
+#!/usr/bin/env bash
+
+set -o noclobber -o noglob -o nounset -o pipefail
+IFS=$'\n'
+
+## If the option `use_preview_script` is set to `true`,
+## then this script will be called and its output will be displayed in ranger.
+## ANSI color codes are supported.
+## STDIN is disabled, so interactive scripts won't work properly
+
+## This script is considered a configuration file and must be updated manually.
+## It will be left untouched if you upgrade ranger.
+
+## Because of some automated testing we do on the script #'s for comments need
+## to be doubled up. Code that is commented out, because it's an alternative for
+## example, gets only one #.
+
+## Meanings of exit codes:
+## code | meaning | action of ranger
+## -----+------------+-------------------------------------------
+## 0 | success | Display stdout as preview
+## 1 | no preview | Display no preview at all
+## 2 | plain text | Display the plain content of the file
+## 3 | fix width | Don't reload when width changes
+## 4 | fix height | Don't reload when height changes
+## 5 | fix both | Don't ever reload
+## 6 | image | Display the image `$IMAGE_CACHE_PATH` points to as an image preview
+## 7 | image | Display the file directly as an image
+
+## Script arguments
+FILE_PATH="${1}" # Full path of the highlighted file
+PV_WIDTH="${2}" # Width of the preview pane (number of fitting characters)
+## shellcheck disable=SC2034 # PV_HEIGHT is provided for convenience and unused
+PV_HEIGHT="${3}" # Height of the preview pane (number of fitting characters)
+IMAGE_CACHE_PATH="${4}" # Full path that should be used to cache image preview
+PV_IMAGE_ENABLED="${5}" # 'True' if image previews are enabled, 'False' otherwise.
+
+FILE_EXTENSION="${FILE_PATH##*.}"
+FILE_EXTENSION_LOWER="$(printf "%s" "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')"
+
+## Settings
+HIGHLIGHT_SIZE_MAX=262143 # 256KiB
+HIGHLIGHT_TABWIDTH=${HIGHLIGHT_TABWIDTH:-8}
+HIGHLIGHT_STYLE=${HIGHLIGHT_STYLE:-pablo}
+HIGHLIGHT_OPTIONS="--replace-tabs=${HIGHLIGHT_TABWIDTH} --style=${HIGHLIGHT_STYLE} ${HIGHLIGHT_OPTIONS:-}"
+PYGMENTIZE_STYLE=${PYGMENTIZE_STYLE:-autumn}
+OPENSCAD_IMGSIZE=${RNGR_OPENSCAD_IMGSIZE:-1000,1000}
+OPENSCAD_COLORSCHEME=${RNGR_OPENSCAD_COLORSCHEME:-Tomorrow Night}
+
+handle_extension() {
+ case "${FILE_EXTENSION_LOWER}" in
+ ## Archive
+ a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\
+ rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)
+ atool --list -- "${FILE_PATH}" && exit 5
+ bsdtar --list --file "${FILE_PATH}" && exit 5
+ exit 1;;
+ rar)
+ ## Avoid password prompt by providing empty password
+ unrar lt -p- -- "${FILE_PATH}" && exit 5
+ exit 1;;
+ 7z)
+ ## Avoid password prompt by providing empty password
+ 7z l -p -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## PDF
+ pdf)
+ ## Preview as text conversion
+ pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | \
+ fmt -w "${PV_WIDTH}" && exit 5
+ mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | \
+ fmt -w "${PV_WIDTH}" && exit 5
+ exiftool "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## BitTorrent
+ torrent)
+ transmission-show -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## OpenDocument
+ odt|ods|odp|sxw)
+ ## Preview as text conversion
+ odt2txt "${FILE_PATH}" && exit 5
+ ## Preview as markdown conversion
+ pandoc -s -t markdown -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## XLSX
+ xlsx)
+ ## Preview as csv conversion
+ ## Uses: https://github.com/dilshod/xlsx2csv
+ xlsx2csv -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## HTML
+ htm|html|xhtml)
+ ## Preview as text conversion
+ w3m -dump "${FILE_PATH}" && exit 5
+ lynx -dump -- "${FILE_PATH}" && exit 5
+ elinks -dump "${FILE_PATH}" && exit 5
+ pandoc -s -t markdown -- "${FILE_PATH}" && exit 5
+ ;;
+
+ ## JSON
+ json)
+ jq --color-output . "${FILE_PATH}" && exit 5
+ python -m json.tool -- "${FILE_PATH}" && exit 5
+ ;;
+
+ ## Direct Stream Digital/Transfer (DSDIFF) and wavpack aren't detected
+ ## by file(1).
+ dff|dsf|wv|wvc)
+ mediainfo "${FILE_PATH}" && exit 5
+ exiftool "${FILE_PATH}" && exit 5
+ ;; # Continue with next handler on failure
+ esac
+}
+
+handle_image() {
+ ## Size of the preview if there are multiple options or it has to be
+ ## rendered from vector graphics. If the conversion program allows
+ ## specifying only one dimension while keeping the aspect ratio, the width
+ ## will be used.
+ local DEFAULT_SIZE="1920x1080"
+
+ local mimetype="${1}"
+ case "${mimetype}" in
+ ## SVG
+ # image/svg+xml|image/svg)
+ # convert -- "${FILE_PATH}" "${IMAGE_CACHE_PATH}" && exit 6
+ # exit 1;;
+
+ ## DjVu
+ # image/vnd.djvu)
+ # ddjvu -format=tiff -quality=90 -page=1 -size="${DEFAULT_SIZE}" \
+ # - "${IMAGE_CACHE_PATH}" < "${FILE_PATH}" \
+ # && exit 6 || exit 1;;
+
+ ## Image
+ image/*)
+ local orientation
+ orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FILE_PATH}" )"
+ ## If orientation data is present and the image actually
+ ## needs rotating ("1" means no rotation)...
+ if [[ -n "$orientation" && "$orientation" != 1 ]]; then
+ ## ...auto-rotate the image according to the EXIF data.
+ convert -- "${FILE_PATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6
+ fi
+
+ ## `w3mimgdisplay` will be called for all images (unless overriden
+ ## as above), but might fail for unsupported types.
+ exit 7;;
+
+ ## Video
+ # video/*)
+ # # Thumbnail
+ # ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 && exit 6
+ # exit 1;;
+
+ ## PDF
+ # application/pdf)
+ # pdftoppm -f 1 -l 1 \
+ # -scale-to-x "${DEFAULT_SIZE%x*}" \
+ # -scale-to-y -1 \
+ # -singlefile \
+ # -jpeg -tiffcompression jpeg \
+ # -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \
+ # && exit 6 || exit 1;;
+
+
+ ## ePub, MOBI, FB2 (using Calibre)
+ # application/epub+zip|application/x-mobipocket-ebook|\
+ # application/x-fictionbook+xml)
+ # # ePub (using https://github.com/marianosimone/epub-thumbnailer)
+ # epub-thumbnailer "${FILE_PATH}" "${IMAGE_CACHE_PATH}" \
+ # "${DEFAULT_SIZE%x*}" && exit 6
+ # ebook-meta --get-cover="${IMAGE_CACHE_PATH}" -- "${FILE_PATH}" \
+ # >/dev/null && exit 6
+ # exit 1;;
+
+ ## Font
+ application/font*|application/*opentype)
+ preview_png="/tmp/$(basename "${IMAGE_CACHE_PATH%.*}").png"
+ if fontimage -o "${preview_png}" \
+ --pixelsize "120" \
+ --fontname \
+ --pixelsize "80" \
+ --text " ABCDEFGHIJKLMNOPQRSTUVWXYZ " \
+ --text " abcdefghijklmnopqrstuvwxyz " \
+ --text " 0123456789.:,;(*!?') ff fl fi ffi ffl " \
+ --text " The quick brown fox jumps over the lazy dog. " \
+ "${FILE_PATH}";
+ then
+ convert -- "${preview_png}" "${IMAGE_CACHE_PATH}" \
+ && rm "${preview_png}" \
+ && exit 6
+ else
+ exit 1
+ fi
+ ;;
+
+ ## Preview archives using the first image inside.
+ ## (Very useful for comic book collections for example.)
+ # application/zip|application/x-rar|application/x-7z-compressed|\
+ # application/x-xz|application/x-bzip2|application/x-gzip|application/x-tar)
+ # local fn=""; local fe=""
+ # local zip=""; local rar=""; local tar=""; local bsd=""
+ # case "${mimetype}" in
+ # application/zip) zip=1 ;;
+ # application/x-rar) rar=1 ;;
+ # application/x-7z-compressed) ;;
+ # *) tar=1 ;;
+ # esac
+ # { [ "$tar" ] && fn=$(tar --list --file "${FILE_PATH}"); } || \
+ # { fn=$(bsdtar --list --file "${FILE_PATH}") && bsd=1 && tar=""; } || \
+ # { [ "$rar" ] && fn=$(unrar lb -p- -- "${FILE_PATH}"); } || \
+ # { [ "$zip" ] && fn=$(zipinfo -1 -- "${FILE_PATH}"); } || return
+ #
+ # fn=$(echo "$fn" | python -c "import sys; import mimetypes as m; \
+ # [ print(l, end='') for l in sys.stdin if \
+ # (m.guess_type(l[:-1])[0] or '').startswith('image/') ]" |\
+ # sort -V | head -n 1)
+ # [ "$fn" = "" ] && return
+ # [ "$bsd" ] && fn=$(printf '%b' "$fn")
+ #
+ # [ "$tar" ] && tar --extract --to-stdout \
+ # --file "${FILE_PATH}" -- "$fn" > "${IMAGE_CACHE_PATH}" && exit 6
+ # fe=$(echo -n "$fn" | sed 's/[][*?\]/\\\0/g')
+ # [ "$bsd" ] && bsdtar --extract --to-stdout \
+ # --file "${FILE_PATH}" -- "$fe" > "${IMAGE_CACHE_PATH}" && exit 6
+ # [ "$bsd" ] || [ "$tar" ] && rm -- "${IMAGE_CACHE_PATH}"
+ # [ "$rar" ] && unrar p -p- -inul -- "${FILE_PATH}" "$fn" > \
+ # "${IMAGE_CACHE_PATH}" && exit 6
+ # [ "$zip" ] && unzip -pP "" -- "${FILE_PATH}" "$fe" > \
+ # "${IMAGE_CACHE_PATH}" && exit 6
+ # [ "$rar" ] || [ "$zip" ] && rm -- "${IMAGE_CACHE_PATH}"
+ # ;;
+ esac
+
+ # openscad_image() {
+ # TMPPNG="$(mktemp -t XXXXXX.png)"
+ # openscad --colorscheme="${OPENSCAD_COLORSCHEME}" \
+ # --imgsize="${OPENSCAD_IMGSIZE/x/,}" \
+ # -o "${TMPPNG}" "${1}"
+ # mv "${TMPPNG}" "${IMAGE_CACHE_PATH}"
+ # }
+
+ # case "${FILE_EXTENSION_LOWER}" in
+ # ## 3D models
+ # ## OpenSCAD only supports png image output, and ${IMAGE_CACHE_PATH}
+ # ## is hardcoded as jpeg. So we make a tempfile.png and just
+ # ## move/rename it to jpg. This works because image libraries are
+ # ## smart enough to handle it.
+ # csg|scad)
+ # openscad_image "${FILE_PATH}" && exit 6
+ # ;;
+ # 3mf|amf|dxf|off|stl)
+ # openscad_image <(echo "import(\"${FILE_PATH}\");") && exit 6
+ # ;;
+ # esac
+}
+
+handle_mime() {
+ local mimetype="${1}"
+ case "${mimetype}" in
+ ## RTF and DOC
+ text/rtf|*msword)
+ ## Preview as text conversion
+ ## note: catdoc does not always work for .doc files
+ ## catdoc: http://www.wagner.pp.ru/~vitus/software/catdoc/
+ catdoc -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## DOCX, ePub, FB2 (using markdown)
+ ## You might want to remove "|epub" and/or "|fb2" below if you have
+ ## uncommented other methods to preview those formats
+ *wordprocessingml.document|*/epub+zip|*/x-fictionbook+xml)
+ ## Preview as markdown conversion
+ pandoc -s -t markdown -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## XLS
+ *ms-excel)
+ ## Preview as csv conversion
+ ## xls2csv comes with catdoc:
+ ## http://www.wagner.pp.ru/~vitus/software/catdoc/
+ xls2csv -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## Text
+ text/* | */xml)
+ ## Syntax highlight
+ if [[ "$( stat --printf='%s' -- "${FILE_PATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then
+ exit 2
+ fi
+ if [[ "$( tput colors )" -ge 256 ]]; then
+ local pygmentize_format='terminal256'
+ local highlight_format='xterm256'
+ else
+ local pygmentize_format='terminal'
+ local highlight_format='ansi'
+ fi
+ env HIGHLIGHT_OPTIONS="${HIGHLIGHT_OPTIONS}" highlight \
+ --out-format="${highlight_format}" \
+ --force -- "${FILE_PATH}" && exit 5
+ env COLORTERM=8bit bat --color=always --style="plain" \
+ -- "${FILE_PATH}" && exit 5
+ pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}"\
+ -- "${FILE_PATH}" && exit 5
+ exit 2;;
+
+ ## DjVu
+ image/vnd.djvu)
+ ## Preview as text conversion (requires djvulibre)
+ djvutxt "${FILE_PATH}" | fmt -w "${PV_WIDTH}" && exit 5
+ exiftool "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## Image
+ image/*)
+ ## Preview as text conversion
+ # img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" && exit 4
+ exiftool "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## Video and audio
+ video/* | audio/*)
+ mediainfo "${FILE_PATH}" && exit 5
+ exiftool "${FILE_PATH}" && exit 5
+ exit 1;;
+ esac
+}
+
+handle_fallback() {
+ echo '----- File Type Classification -----' && file --dereference --brief -- "${FILE_PATH}" && exit 5
+ exit 1
+}
+
+
+MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )"
+if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then
+ handle_image "${MIMETYPE}"
+fi
+handle_extension
+handle_mime "${MIMETYPE}"
+handle_fallback
+
+exit 1
diff --git a/config/sc-im/scimrc b/config/sc-im/scimrc
@@ -0,0 +1,5 @@
+set autowrap
+set xlsx_readformulas
+set autobackup=30
+
+REDEFINE_COLOR "YELLOW" 206 68 4
diff --git a/hosts b/hosts
@@ -0,0 +1,41 @@
+# Use with StevenBlack
+
+#Google
+0.0.0.0 blobcomments-pa.clients6.google.com
+
+#Yandex
+0.0.0.0 dzen.ru
+0.0.0.0 log.dzen.ru
+0.0.0.0 clck.dzen.ru
+0.0.0.0 suggest.sso.dzen.ru
+0.0.0.0 531111.ms.dzen.ru
+0.0.0.0 541111.ms.dzen.ru
+0.0.0.0 dzeninfra.ru
+0.0.0.0 avatars.dzeninfra.ru
+0.0.0.0 s3.dzeninfra.ru
+0.0.0.0 static.dzeninfra.ru
+0.0.0.0 suggest.sso.dzeninfra.ru
+0.0.0.0 yandex.ru
+0.0.0.0 an.yandex.ru
+0.0.0.0 mc.yandex.ru
+0.0.0.0 market.yandex.ru
+0.0.0.0 adfstat.yandex.ru
+0.0.0.0 market-click2.yandex.ru
+0.0.0.0 media-adv.market.yandex.ru
+0.0.0.0 bank.yandex.ru
+0.0.0.0 yabs.yandex.ru
+0.0.0.0 api.passport.yandex.ru
+0.0.0.0 yandex.com
+0.0.0.0 yastatic.net
+0.0.0.0 yandex.net
+0.0.0.0 captcha-backgrounds.s3.yandex.net
+0.0.0.0 ext.captcha.yandex.net
+0.0.0.0 favicon.yandex.net
+0.0.0.0 csp.yandex.net
+0.0.0.0 csp.yandex.net
+0.0.0.0 avatars.mds.yandex.net
+0.0.0.0 uxfeedback-cdn.s3.yandex.net
+0.0.0.0 ya.ru
+0.0.0.0 yandex-bank.net
+0.0.0.0 cdn-ext.prod.yandex-bank.net
+0.0.0.0 education.yandex.ru
diff --git a/make.conf b/make.conf
@@ -0,0 +1,44 @@
+# These settings were set by the catalyst build script that automatically
+# built this stage.
+# Please consult /usr/share/portage/config/make.conf.example for a more
+# detailed example.
+
+# These warnings indicate likely runtime problems with LTO, so promote them
+# to errors. If a package fails to build with these, LTO should not be used there.
+WARNING_FLAGS="-Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
+
+COMMON_FLAGS="-march=native -O3 -pipe -flto ${WARNING_FLAGS}"
+#COMMON_FLAGS="-march=native -O2 -pipe"
+CFLAGS="${COMMON_FLAGS}"
+CXXFLAGS="${COMMON_FLAGS}"
+FCFLAGS="${COMMON_FLAGS}"
+FFLAGS="${COMMON_FLAGS}"
+MAKEOPTS="-j12 -l12"
+EMERGE_DEFAULT_OPTS="--jobs 8 --load-average 8"
+FEATURES="parallel-fetch parallel-install"
+VIDEO_CARDS="radeon radeonsi amdgpu"
+PORTAGE_COMPRESS_EXCLUDE_SUFFIXES="[1-9] n [013]p [1357]ssl"
+
+#You gotta have abi_x86_32 to play video games. Don't build it in on your laptop
+USE="X pgo lto xorg system-man -dbus -udev -abi_x86_32 -vulkan -gles1 -gles2 -gles2-only -sqlite system-icu alsa grub savedconfig -usb -pulseaudio -emacs -xemacs -gnome -ios -ipod -nvidia -smartcard -wayland -systemd -aqua -bidi -bluetooth -clamav -colord -coreaudio -elogind -gimp -geolocation -gnome-keyring -gps -gstreamer -ibm -scanner -screencast -syslog -telemetry -gtk -kde -nls -linguisti -sql mpv vaapi -egrep-fgrep -arping -cramfs -qmanifest -qtegrity -desktop-portal -dialogs -joystick -haptic -ui-m64py"
+
+# NOTE: This stage was built with the bindist Use flag enabled
+PORTDIR="/var/db/repos/gentoo"
+DISTDIR="/var/cache/distfiles"
+PKGDIR="/var/cache/binpkgs"
+# This sets the language of build output to English.
+# Please keep this setting intact when reporting bugs.
+LC_MESSAGES=C.utf8
+#Use free license for laptop
+ACCEPT_LICENSE="*"
+
+GENTOO_MIRRORS="https://gentoo-mirror.alexxy.name/ \
+ http://gentoo-mirror.alexxy.name/ \
+ http://mirror.mephi.ru/gentoo-distfiles/ \
+ ftp://mirror.mephi.ru/gentoo-distfiles/ \
+ rsync://mirror.mephi.ru/gentoo-distfiles/ \
+ https://mirror.yandex.ru/gentoo-distfiles/ \
+ http://mirror.yandex.ru/gentoo-distfiles/ \
+ ftp://mirror.yandex.ru/gentoo-distfiles/"
+
+GRUB_PLATFORMS="efi-64"
diff --git a/patches/x11-misc/dmenu/01-dmenu-highpriority-5.2.diff b/patches/x11-misc/dmenu/01-dmenu-highpriority-5.2.diff
@@ -0,0 +1,174 @@
+diff --git a/config.def.h b/config.def.h
+index 1edb647..47b616d 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -12,6 +12,7 @@ static const char *colors[SchemeLast][2] = {
+ [SchemeNorm] = { "#bbbbbb", "#222222" },
+ [SchemeSel] = { "#eeeeee", "#005577" },
+ [SchemeOut] = { "#000000", "#00ffff" },
++ [SchemeHp] = { "#bbbbbb", "#333333" }
+ };
+ /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
+ static unsigned int lines = 0;
+diff --git a/dmenu.c b/dmenu.c
+index 7cf253b..283a009 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -26,14 +26,16 @@
+ #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
+
+ /* enums */
+-enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
++enum { SchemeNorm, SchemeSel, SchemeHp, SchemeOut, SchemeLast }; /* color schemes */
+
+ struct item {
+ char *text;
+ struct item *left, *right;
+- int out;
++ int out, hp;
+ };
+
++static const char **hpitems = NULL;
++static int hplength = 0;
+ static char text[BUFSIZ] = "";
+ static char *embed;
+ static int bh, mw, mh;
+@@ -65,6 +67,29 @@ textw_clamp(const char *str, unsigned int n)
+ return MIN(w, n);
+ }
+
++static int
++str_compar(const void *s0_in, const void *s1_in)
++{
++ const char *s0 = *(const char **)s0_in;
++ const char *s1 = *(const char **)s1_in;
++ return fstrncmp == strncasecmp ? strcasecmp(s0, s1) : strcmp(s0, s1);
++}
++
++static void
++parse_hpitems(char *src)
++{
++ int n = 0;
++ char *t;
++
++ for (t = strtok(src, ","); t; t = strtok(NULL, ",")) {
++ if (hplength + 1 >= n) {
++ if (!(hpitems = realloc(hpitems, (n += 8) * sizeof *hpitems)))
++ die("Unable to realloc %zu bytes\n", n * sizeof *hpitems);
++ }
++ hpitems[hplength++] = t;
++ }
++}
++
+ static void
+ appenditem(struct item *item, struct item **list, struct item **last)
+ {
+@@ -107,6 +132,7 @@ cleanup(void)
+ for (i = 0; items && items[i].text; ++i)
+ free(items[i].text);
+ free(items);
++ free(hpitems);
+ drw_free(drw);
+ XSync(dpy, False);
+ XCloseDisplay(dpy);
+@@ -135,6 +161,8 @@ drawitem(struct item *item, int x, int y, int w)
+ {
+ if (item == sel)
+ drw_setscheme(drw, scheme[SchemeSel]);
++ else if (item->hp)
++ drw_setscheme(drw, scheme[SchemeHp]);
+ else if (item->out)
+ drw_setscheme(drw, scheme[SchemeOut]);
+ else
+@@ -236,7 +264,7 @@ match(void)
+ char buf[sizeof text], *s;
+ int i, tokc = 0;
+ size_t len, textsize;
+- struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
++ struct item *item, *lhpprefix, *lprefix, *lsubstr, *hpprefixend, *prefixend, *substrend;
+
+ strcpy(buf, text);
+ /* separate input text into tokens to be matched individually */
+@@ -245,7 +273,7 @@ match(void)
+ die("cannot realloc %zu bytes:", tokn * sizeof *tokv);
+ len = tokc ? strlen(tokv[0]) : 0;
+
+- matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
++ matches = lhpprefix = lprefix = lsubstr = matchend = hpprefixend = prefixend = substrend = NULL;
+ textsize = strlen(text) + 1;
+ for (item = items; item && item->text; item++) {
+ for (i = 0; i < tokc; i++)
+@@ -253,14 +281,24 @@ match(void)
+ break;
+ if (i != tokc) /* not all tokens match */
+ continue;
+- /* exact matches go first, then prefixes, then substrings */
++ /* exact matches go first, then prefixes with high priority, then prefixes, then substrings */
+ if (!tokc || !fstrncmp(text, item->text, textsize))
+ appenditem(item, &matches, &matchend);
++ else if (item->hp && !fstrncmp(tokv[0], item->text, len))
++ appenditem(item, &lhpprefix, &hpprefixend);
+ else if (!fstrncmp(tokv[0], item->text, len))
+ appenditem(item, &lprefix, &prefixend);
+ else
+ appenditem(item, &lsubstr, &substrend);
+ }
++ if (lhpprefix) {
++ if (matches) {
++ matchend->right = lhpprefix;
++ lhpprefix->left = matchend;
++ } else
++ matches = lhpprefix;
++ matchend = hpprefixend;
++ }
+ if (lprefix) {
+ if (matches) {
+ matchend->right = lprefix;
+@@ -552,6 +590,10 @@ readstdin(void)
+ char *line = NULL;
+ size_t i, junk, size = 0;
+ ssize_t len;
++ char **p;
++
++ if (hpitems && hplength > 0)
++ qsort(hpitems, hplength, sizeof *hpitems, str_compar);
+
+ /* read each line from stdin and add it to the item list */
+ for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
+@@ -562,6 +604,11 @@ readstdin(void)
+ line[len - 1] = '\0';
+ items[i].text = line;
+ items[i].out = 0;
++ p = hpitems == NULL ? NULL : bsearch(
++ &items[i].text, hpitems, hplength, sizeof *hpitems,
++ str_compar
++ );
++ items[i].hp = p != NULL;
+ }
+ if (items)
+ items[i].text = NULL;
+@@ -711,7 +758,8 @@ static void
+ usage(void)
+ {
+ die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+- " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
++ " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n"
++ " [-hb color] [-hf color] [-hp items]");
+ }
+
+ int
+@@ -751,8 +799,14 @@ main(int argc, char *argv[])
+ colors[SchemeSel][ColBg] = argv[++i];
+ else if (!strcmp(argv[i], "-sf")) /* selected foreground color */
+ colors[SchemeSel][ColFg] = argv[++i];
++ else if (!strcmp(argv[i], "-hb")) /* high priority background color */
++ colors[SchemeHp][ColBg] = argv[++i];
++ else if (!strcmp(argv[i], "-hf")) /* low priority background color */
++ colors[SchemeHp][ColFg] = argv[++i];
+ else if (!strcmp(argv[i], "-w")) /* embedding window id */
+ embed = argv[++i];
++ else if (!strcmp(argv[i], "-hp"))
++ parse_hpitems(argv[++i]);
+ else
+ usage();
+
diff --git a/patches/x11-terms/st/st-background-image-0.8.5.diff b/patches/x11-terms/st/st-background-image-0.8.5.diff
@@ -0,0 +1,262 @@
+From 4ce17bbc340ca1f93f9be686f4a796797f9ca6d5 Mon Sep 17 00:00:00 2001
+From: Matthias Schoth <mschoth@gmail.com>
+Date: Sat, 16 Apr 2022 14:21:22 +0200
+Subject: [PATCH] Implements background image and pseudo transparancy support.
+
+---
+ config.def.h | 8 +++
+ x.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 139 insertions(+), 10 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 91ab8ca..ad19e3d 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -8,6 +8,14 @@
+ static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
+ static int borderpx = 2;
+
++/*
++ * background image
++ * expects farbfeld format
++ * pseudo transparency fixes coordinates to the screen origin
++ */
++static const char *bgfile = "/path/to/image.ff";
++static const int pseudotransparency = 0;
++
+ /*
+ * What program is execed by st depends of these precedence rules:
+ * 1: program passed with -e
+diff --git a/x.c b/x.c
+index 8a16faa..fedef53 100644
+--- a/x.c
++++ b/x.c
+@@ -14,6 +14,7 @@
+ #include <X11/keysym.h>
+ #include <X11/Xft/Xft.h>
+ #include <X11/XKBlib.h>
++#include <arpa/inet.h>
+
+ char *argv0;
+ #include "arg.h"
+@@ -81,6 +82,7 @@ typedef XftGlyphFontSpec GlyphFontSpec;
+ typedef struct {
+ int tw, th; /* tty width and height */
+ int w, h; /* window width and height */
++ int x, y; /* window location */
+ int ch; /* char height */
+ int cw; /* char width */
+ int mode; /* window state/mode flags */
+@@ -101,6 +103,7 @@ typedef struct {
+ XVaNestedList spotlist;
+ } ime;
+ Draw draw;
++ GC bggc; /* Graphics Context for background */
+ Visual *vis;
+ XSetWindowAttributes attrs;
+ int scr;
+@@ -151,6 +154,9 @@ static void ximinstantiate(Display *, XPointer, XPointer);
+ static void ximdestroy(XIM, XPointer, XPointer);
+ static int xicdestroy(XIC, XPointer, XPointer);
+ static void xinit(int, int);
++static void updatexy(void);
++static XImage *loadff(const char *);
++static void bginit();
+ static void cresize(int, int);
+ static void xresize(int, int);
+ static void xhints(void);
+@@ -504,6 +510,12 @@ propnotify(XEvent *e)
+ xpev->atom == clipboard)) {
+ selnotify(e);
+ }
++
++ if (pseudotransparency &&
++ !strncmp(XGetAtomName(xw.dpy, e->xproperty.atom), "_NET_WM_STATE", 13)) {
++ updatexy();
++ redraw();
++ }
+ }
+
+ void
+@@ -534,7 +546,8 @@ selnotify(XEvent *e)
+ return;
+ }
+
+- if (e->type == PropertyNotify && nitems == 0 && rem == 0) {
++ if (e->type == PropertyNotify && nitems == 0 && rem == 0 &&
++ !pseudotransparency) {
+ /*
+ * If there is some PropertyNotify with no data, then
+ * this is the signal of the selection owner that all
+@@ -552,9 +565,11 @@ selnotify(XEvent *e)
+ * when the selection owner does send us the next
+ * chunk of data.
+ */
+- MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask);
+- XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask,
++ if (!pseudotransparency) {
++ MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask);
++ XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask,
+ &xw.attrs);
++ }
+
+ /*
+ * Deleting the property is the transfer start signal.
+@@ -835,9 +850,9 @@ xsetcolorname(int x, const char *name)
+ void
+ xclear(int x1, int y1, int x2, int y2)
+ {
+- XftDrawRect(xw.draw,
+- &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg],
+- x1, y1, x2-x1, y2-y1);
++ if (pseudotransparency)
++ XSetTSOrigin(xw.dpy, xw.bggc, -win.x, -win.y);
++ XFillRectangle(xw.dpy, xw.buf, xw.bggc, x1, y1, x2-x1, y2-y1);
+ }
+
+ void
+@@ -1223,6 +1238,100 @@ xinit(int cols, int rows)
+ xsel.xtarget = XA_STRING;
+ }
+
++void
++updatexy()
++{
++ Window child;
++ XTranslateCoordinates(xw.dpy, xw.win, DefaultRootWindow(xw.dpy), 0, 0,
++ &win.x, &win.y, &child);
++}
++
++/*
++ * load farbfeld file to XImage
++ */
++XImage*
++loadff(const char *filename)
++{
++ uint32_t i, hdr[4], w, h, size;
++ uint64_t *data;
++ FILE *f = fopen(filename, "rb");
++
++ if (f == NULL) {
++ fprintf(stderr, "Can not open background image file\n");
++ return NULL;
++ }
++
++ if (fread(hdr, sizeof(*hdr), LEN(hdr), f) != LEN(hdr))
++ if (ferror(f)) {
++ fprintf(stderr, "fread:");
++ return NULL;
++ }
++ else {
++ fprintf(stderr, "fread: Unexpected end of file\n");
++ return NULL;
++ }
++
++ if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) {
++ fprintf(stderr, "Invalid magic value\n");
++ return NULL;
++ }
++
++ w = ntohl(hdr[2]);
++ h = ntohl(hdr[3]);
++ size = w * h;
++ data = malloc(size * sizeof(uint64_t));
++
++ if (fread(data, sizeof(uint64_t), size, f) != size)
++ if (ferror(f)) {
++ fprintf(stderr, "fread:");
++ return NULL;
++ }
++ else {
++ fprintf(stderr, "fread: Unexpected end of file\n");
++ return NULL;
++ }
++
++ fclose(f);
++
++ for (i = 0; i < size; i++)
++ data[i] = (data[i] & 0x00000000000000FF) << 16 |
++ (data[i] & 0x0000000000FF0000) >> 8 |
++ (data[i] & 0x000000FF00000000) >> 32;
++
++ XImage *xi = XCreateImage(xw.dpy, DefaultVisual(xw.dpy, xw.scr),
++ DefaultDepth(xw.dpy, xw.scr), ZPixmap, 0,
++ (char *)data, w, h, 32, w * 8);
++ xi->bits_per_pixel = 64;
++ return xi;
++}
++
++/*
++ * initialize background image
++ */
++void
++bginit()
++{
++ XGCValues gcvalues;
++ Drawable bgimg;
++ XImage *bgxi = loadff(bgfile);
++
++ memset(&gcvalues, 0, sizeof(gcvalues));
++ xw.bggc = XCreateGC(xw.dpy, xw.win, 0, &gcvalues);
++ if (!bgxi) return;
++ bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height,
++ DefaultDepth(xw.dpy, xw.scr));
++ XPutImage(xw.dpy, bgimg, dc.gc, bgxi, 0, 0, 0, 0, bgxi->width,
++ bgxi->height);
++ XDestroyImage(bgxi);
++ XSetTile(xw.dpy, xw.bggc, bgimg);
++ XSetFillStyle(xw.dpy, xw.bggc, FillTiled);
++ if (pseudotransparency) {
++ updatexy();
++ MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask);
++ XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
++ }
++}
++
+ int
+ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
+ {
+@@ -1463,7 +1572,10 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
+ xclear(winx, winy + win.ch, winx + width, win.h);
+
+ /* Clean up the region we want to draw to. */
+- XftDrawRect(xw.draw, bg, winx, winy, width, win.ch);
++ if (bg == &dc.col[defaultbg])
++ xclear(winx, winy, winx + width, winy + win.ch);
++ else
++ XftDrawRect(xw.draw, bg, winx, winy, width, win.ch);
+
+ /* Set the clip region because Xft is sometimes dirty. */
+ r.x = 0;
+@@ -1886,9 +1998,17 @@ cmessage(XEvent *e)
+ void
+ resize(XEvent *e)
+ {
+- if (e->xconfigure.width == win.w && e->xconfigure.height == win.h)
+- return;
+-
++ if (pseudotransparency) {
++ if (e->xconfigure.width == win.w &&
++ e->xconfigure.height == win.h &&
++ e->xconfigure.x == win.x && e->xconfigure.y == win.y)
++ return;
++ updatexy();
++ } else {
++ if (e->xconfigure.width == win.w &&
++ e->xconfigure.height == win.h)
++ return;
++ }
+ cresize(e->xconfigure.width, e->xconfigure.height);
+ }
+
+@@ -2072,6 +2192,7 @@ run:
+ rows = MAX(rows, 1);
+ tnew(cols, rows);
+ xinit(cols, rows);
++ bginit();
+ xsetenv();
+ selinit();
+ run();
+--
+2.35.1
+
diff --git a/patches/x11-wm/dwm/01-dwm-adjacenttag-6.2.diff b/patches/x11-wm/dwm/01-dwm-adjacenttag-6.2.diff
@@ -0,0 +1,112 @@
+diff -up a/dwm.c b/dwm.c
+--- a/dwm.c 2021-10-02 13:57:18.011307099 +0100
++++ b/dwm.c 2021-10-02 14:21:17.063622953 +0100
+@@ -183,8 +183,10 @@ static void maprequest(XEvent *e);
+ static void monocle(Monitor *m);
+ static void motionnotify(XEvent *e);
+ static void movemouse(const Arg *arg);
++static unsigned int nexttag(void);
+ static Client *nexttiled(Client *c);
+ static void pop(Client *c);
++static unsigned int prevtag(void);
+ static void propertynotify(XEvent *e);
+ static void quit(const Arg *arg);
+ static Monitor *recttomon(int x, int y, int w, int h);
+@@ -208,6 +210,8 @@ static void sigchld(int unused);
+ static void spawn(const Arg *arg);
+ static void tag(const Arg *arg);
+ static void tagmon(const Arg *arg);
++static void tagtonext(const Arg *arg);
++static void tagtoprev(const Arg *arg);
+ static void tile(Monitor *m);
+ static void togglebar(const Arg *arg);
+ static void togglefloating(const Arg *arg);
+@@ -227,6 +231,8 @@ static void updatetitle(Client *c);
+ static void updatewindowtype(Client *c);
+ static void updatewmhints(Client *c);
+ static void view(const Arg *arg);
++static void viewnext(const Arg *arg);
++static void viewprev(const Arg *arg);
+ static Client *wintoclient(Window w);
+ static Monitor *wintomon(Window w);
+ static int xerror(Display *dpy, XErrorEvent *ee);
+@@ -1192,6 +1198,13 @@ movemouse(const Arg *arg)
+ }
+ }
+
++unsigned int
++nexttag(void)
++{
++ unsigned int seltag = selmon->tagset[selmon->seltags];
++ return seltag == (1 << (LENGTH(tags) - 1)) ? 1 : seltag << 1;
++}
++
+ Client *
+ nexttiled(Client *c)
+ {
+@@ -1208,6 +1221,13 @@ pop(Client *c)
+ arrange(c->mon);
+ }
+
++unsigned int
++prevtag(void)
++{
++ unsigned int seltag = selmon->tagset[selmon->seltags];
++ return seltag == 1 ? (1 << (LENGTH(tags) - 1)) : seltag >> 1;
++}
++
+ void
+ propertynotify(XEvent *e)
+ {
+@@ -1671,6 +1691,32 @@ tagmon(const Arg *arg)
+ }
+
+ void
++tagtonext(const Arg *arg)
++{
++ unsigned int tmp;
++
++ if (selmon->sel == NULL)
++ return;
++
++ tmp = nexttag();
++ tag(&(const Arg){.ui = tmp });
++ view(&(const Arg){.ui = tmp });
++}
++
++void
++tagtoprev(const Arg *arg)
++{
++ unsigned int tmp;
++
++ if (selmon->sel == NULL)
++ return;
++
++ tmp = prevtag();
++ tag(&(const Arg){.ui = tmp });
++ view(&(const Arg){.ui = tmp });
++}
++
++void
+ tile(Monitor *m)
+ {
+ unsigned int i, n, h, mw, my, ty;
+@@ -2044,6 +2090,18 @@ view(const Arg *arg)
+ arrange(selmon);
+ }
+
++void
++viewnext(const Arg *arg)
++{
++ view(&(const Arg){.ui = nexttag()});
++}
++
++void
++viewprev(const Arg *arg)
++{
++ view(&(const Arg){.ui = prevtag()});
++}
++
+ Client *
+ wintoclient(Window w)
+ {
diff --git a/patches/x11-wm/dwm/02-dwm-pertag-6.2.diff b/patches/x11-wm/dwm/02-dwm-pertag-6.2.diff
@@ -0,0 +1,177 @@
+diff --git a/dwm.c b/dwm.c
+index 4465af1..6474055 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -111,6 +111,7 @@ typedef struct {
+ void (*arrange)(Monitor *);
+ } Layout;
+
++typedef struct Pertag Pertag;
+ struct Monitor {
+ char ltsymbol[16];
+ float mfact;
+@@ -130,6 +131,7 @@ struct Monitor {
+ Monitor *next;
+ Window barwin;
+ const Layout *lt[2];
++ Pertag *pertag;
+ };
+
+ typedef struct {
+@@ -271,6 +273,15 @@ static Window root, wmcheckwin;
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+
++struct Pertag {
++ unsigned int curtag, prevtag; /* current and previous tag */
++ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
++ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
++ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
++ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
++ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
++};
++
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+
+@@ -631,6 +642,7 @@ Monitor *
+ createmon(void)
+ {
+ Monitor *m;
++ unsigned int i;
+
+ m = ecalloc(1, sizeof(Monitor));
+ m->tagset[0] = m->tagset[1] = 1;
+@@ -641,6 +653,20 @@ createmon(void)
+ m->lt[0] = &layouts[0];
+ m->lt[1] = &layouts[1 % LENGTH(layouts)];
+ strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
++ m->pertag = ecalloc(1, sizeof(Pertag));
++ m->pertag->curtag = m->pertag->prevtag = 1;
++
++ for (i = 0; i <= LENGTH(tags); i++) {
++ m->pertag->nmasters[i] = m->nmaster;
++ m->pertag->mfacts[i] = m->mfact;
++
++ m->pertag->ltidxs[i][0] = m->lt[0];
++ m->pertag->ltidxs[i][1] = m->lt[1];
++ m->pertag->sellts[i] = m->sellt;
++
++ m->pertag->showbars[i] = m->showbar;
++ }
++
+ return m;
+ }
+
+@@ -966,7 +992,7 @@ grabkeys(void)
+ void
+ incnmaster(const Arg *arg)
+ {
+- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
+ arrange(selmon);
+ }
+
+@@ -1501,9 +1527,9 @@ void
+ setlayout(const Arg *arg)
+ {
+ if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
+- selmon->sellt ^= 1;
++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
+ if (arg && arg->v)
+- selmon->lt[selmon->sellt] = (Layout *)arg->v;
++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
+ strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
+ if (selmon->sel)
+ arrange(selmon);
+@@ -1522,7 +1548,7 @@ setmfact(const Arg *arg)
+ f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
+ if (f < 0.1 || f > 0.9)
+ return;
+- selmon->mfact = f;
++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
+ arrange(selmon);
+ }
+
+@@ -1699,7 +1725,7 @@ tile(Monitor *m)
+ void
+ togglebar(const Arg *arg)
+ {
+- selmon->showbar = !selmon->showbar;
++ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
+ updatebarpos(selmon);
+ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
+ arrange(selmon);
+@@ -1738,9 +1764,33 @@ void
+ toggleview(const Arg *arg)
+ {
+ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
++ int i;
+
+ if (newtagset) {
+ selmon->tagset[selmon->seltags] = newtagset;
++
++ if (newtagset == ~0) {
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++ selmon->pertag->curtag = 0;
++ }
++
++ /* test if the user did not select the same tag */
++ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++ for (i = 0; !(newtagset & 1 << i); i++) ;
++ selmon->pertag->curtag = i + 1;
++ }
++
++ /* apply settings for this view */
++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
++
++ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
++ togglebar(NULL);
++
+ focus(NULL);
+ arrange(selmon);
+ }
+@@ -2035,11 +2085,37 @@ updatewmhints(Client *c)
+ void
+ view(const Arg *arg)
+ {
++ int i;
++ unsigned int tmptag;
++
+ if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
+ return;
+ selmon->seltags ^= 1; /* toggle sel tagset */
+- if (arg->ui & TAGMASK)
++ if (arg->ui & TAGMASK) {
+ selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++
++ if (arg->ui == ~0)
++ selmon->pertag->curtag = 0;
++ else {
++ for (i = 0; !(arg->ui & 1 << i); i++) ;
++ selmon->pertag->curtag = i + 1;
++ }
++ } else {
++ tmptag = selmon->pertag->prevtag;
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++ selmon->pertag->curtag = tmptag;
++ }
++
++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
++
++ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
++ togglebar(NULL);
++
+ focus(NULL);
+ arrange(selmon);
+ }
diff --git a/patches/x11-wm/dwm/03-dwm-resetlayout-6.2_and_no-border.diff b/patches/x11-wm/dwm/03-dwm-resetlayout-6.2_and_no-border.diff
@@ -0,0 +1,73 @@
+From 4df827a2ec7820f41bdb8576cc39b55fbf35be44 Mon Sep 17 00:00:00 2001
+From: Jack Bird <jack.bird@durham.ac.uk>
+Date: Mon, 16 Aug 2021 23:25:16 +0100
+Subject: [PATCH] Patch applies cleanly
+
+---
+ config.def.h | 1 +
+ dwm.c | 15 +++++++++++++++
+ 2 files changed, 16 insertions(+)
+
+diff --git a/config.def.h b/config.def.h
+index 1c0b587..5d118cf 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -70,6 +70,7 @@ static Key keys[] = {
+ { MODKEY, XK_d, incnmaster, {.i = -1 } },
+ { MODKEY, XK_h, setmfact, {.f = -0.05} },
+ { MODKEY, XK_l, setmfact, {.f = +0.05} },
++ { MODKEY, XK_r, resetlayout, {0} },
+ { MODKEY, XK_Return, zoom, {0} },
+ { MODKEY, XK_Tab, view, {0} },
+ { MODKEY|ShiftMask, XK_c, killclient, {0} },
+diff --git a/dwm.c b/dwm.c
+index 4465af1..77727ea 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -188,6 +188,7 @@ static void pop(Client *);
+ static void propertynotify(XEvent *e);
+ static void quit(const Arg *arg);
+ static Monitor *recttomon(int x, int y, int w, int h);
++static void resetlayout(const Arg *arg);
+ static void resize(Client *c, int x, int y, int w, int h, int interact);
+ static void resizeclient(Client *c, int x, int y, int w, int h);
+ static void resizemouse(const Arg *arg);
+@@ -1265,6 +1266,16 @@ recttomon(int x, int y, int w, int h)
+ return r;
+ }
+
++void
++resetlayout(const Arg *arg)
++{
++ Arg default_layout = {.v = &layouts[0]};
++ Arg default_mfact = {.f = mfact + 1};
++
++ setlayout(&default_layout);
++ setmfact(&default_mfact);
++}
++
+ void
+ resize(Client *c, int x, int y, int w, int h, int interact)
+ {
+@@ -1282,6 +1293,18 @@ resizeclient(Client *c, int x, int y, int w, int h)
+ c->oldw = c->w; c->w = wc.width = w;
+ c->oldh = c->h; c->h = wc.height = h;
+ wc.border_width = c->bw;
++
++ if ((nexttiled(c->mon->clients) == c) && !(nexttiled(c->next)))
++ resetlayout(NULL);
++
++ if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next))
++ || &monocle == c->mon->lt[c->mon->sellt]->arrange)
++ && !c->isfullscreen && !c->isfloating
++ && NULL != c->mon->lt[c->mon->sellt]->arrange) {
++ c->w = wc.width += c->bw * 2;
++ c->h = wc.height += c->bw *2;
++ wc.border_width = 0;
++ }
+ XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ configure(c);
+ XSync(dpy, False);
+--
+2.32.0
+
diff --git a/patches/x11-wm/dwm/04-dwm-fancybar-20220527-d3f93c7.diff b/patches/x11-wm/dwm/04-dwm-fancybar-20220527-d3f93c7.diff
@@ -0,0 +1,73 @@
+diff --git a/dwm.c b/dwm.c
+--- a/dwm.c
++++ b/dwm.c
+@@ -699,10 +699,10 @@ dirtomon(int dir)
+ void
+ drawbar(Monitor *m)
+ {
+- int x, w, tw = 0;
++ int x, w, tw = 0, mw, ew = 0;
+ int boxs = drw->fonts->h / 9;
+ int boxw = drw->fonts->h / 6 + 2;
+- unsigned int i, occ = 0, urg = 0;
++ unsigned int i, occ = 0, urg = 0, n = 0;
+ Client *c;
+
+ if (!m->showbar)
+@@ -716,6 +716,8 @@ drawbar(Monitor *m)
+ }
+
+ for (c = m->clients; c; c = c->next) {
++ if (ISVISIBLE(c))
++ n++;
+ occ |= c->tags;
+ if (c->isurgent)
+ urg |= c->tags;
+@@ -736,15 +738,39 @@ drawbar(Monitor *m)
+ x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
+
+ if ((w = m->ww - tw - x) > bh) {
+- if (m->sel) {
+- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
+- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
+- if (m->sel->isfloating)
+- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
+- } else {
+- drw_setscheme(drw, scheme[SchemeNorm]);
+- drw_rect(drw, x, 0, w, bh, 1, 1);
++ if (n > 0) {
++ tw = TEXTW(m->sel->name) + lrpad;
++ mw = (tw >= w || n == 1) ? 0 : (w - tw) / (n - 1);
++
++ i = 0;
++ for (c = m->clients; c; c = c->next) {
++ if (!ISVISIBLE(c) || c == m->sel)
++ continue;
++ tw = TEXTW(c->name);
++ if(tw < mw)
++ ew += (mw - tw);
++ else
++ i++;
++ }
++ if (i > 0)
++ mw += ew / i;
++
++ for (c = m->clients; c; c = c->next) {
++ if (!ISVISIBLE(c))
++ continue;
++ tw = MIN(m->sel == c ? w : mw, TEXTW(c->name));
++
++ drw_setscheme(drw, scheme[m == selmon && m->sel == c ? SchemeSel : SchemeNorm]);
++ if (tw > lrpad / 2)
++ drw_text(drw, x, 0, tw, bh, lrpad / 2, c->name, 0);
++ if (c->isfloating)
++ drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0);
++ x += tw;
++ w -= tw;
++ }
+ }
++ drw_setscheme(drw, scheme[SchemeNorm]);
++ drw_rect(drw, x, 0, w, bh, 1, 1);
+ }
+ drw_map(drw, m->barwin, 0, 0, m->ww, bh);
+ }
diff --git a/patches/x11-wm/dwm/05-dwm-fullgaps-6.4.diff b/patches/x11-wm/dwm/05-dwm-fullgaps-6.4.diff
@@ -0,0 +1,68 @@
+diff -up a/config.def.h b/config.def.h
+--- a/config.def.h
++++ b/config.def.h
+@@ -2,6 +2,7 @@
+
+ /* appearance */
+ static const unsigned int borderpx = 1; /* border pixel of windows */
++static const unsigned int gappx = 5; /* gaps between windows */
+ static const unsigned int snap = 32; /* snap pixel */
+ static const int showbar = 1; /* 0 means no bar */
+ static const int topbar = 1; /* 0 means bottom bar */
+diff -up a/dwm.c b/dwm.c
+--- a/dwm.c 2023-04-30
++++ b/dwm.c 2023-04-30
+@@ -200,6 +201,7 @@ static void sendmon(Client *c, Monitor *
+ static void setclientstate(Client *c, long state);
+ static void setfocus(Client *c);
+ static void setfullscreen(Client *c, int fullscreen);
++static void setgaps(const Arg *arg);
+ static void setlayout(const Arg *arg);
+ static void setmfact(const Arg *arg);
+ static void setup(void);
+@@ -1508,6 +1511,16 @@ setfullscreen(Client *c, int fullscreen)
+ }
+
+ void
++setgaps(const Arg *arg)
++{
++ if ((arg->i == 0) || (selmon->gappx + arg->i < 0))
++ selmon->gappx = 0;
++ else
++ selmon->gappx += arg->i;
++ arrange(selmon);
++}
++
++void
+ setlayout(const Arg *arg)
+ {
+ if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
+@@ -1697,18 +1710,18 @@ tile(Monitor *m)
+ if (n > m->nmaster)
+ mw = m->nmaster ? m->ww * m->mfact : 0;
+ else
+- mw = m->ww;
+- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+- if (i < m->nmaster) {
+- h = (m->wh - my) / (MIN(n, m->nmaster) - i);
+- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
+- if (my + HEIGHT(c) < m->wh)
+- my += HEIGHT(c);
++ mw = m->ww - m->gappx;
++ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
++ if (i < m->nmaster) {
++ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx;
++ resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0);
++ if (my + HEIGHT(c) + m->gappx < m->wh)
++ my += HEIGHT(c) + m->gappx;
+ } else {
+- h = (m->wh - ty) / (n - i);
+- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
+- if (ty + HEIGHT(c) < m->wh)
+- ty += HEIGHT(c);
++ h = (m->wh - ty) / (n - i) - m->gappx;
++ resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0);
++ if (ty + HEIGHT(c) + m->gappx < m->wh)
++ ty += HEIGHT(c) + m->gappx;
+ }
+ }
diff --git a/patches/x11-wm/dwm/06-dwm-alttab-6.4.diff b/patches/x11-wm/dwm/06-dwm-alttab-6.4.diff
@@ -0,0 +1,324 @@
+From 8b1d33db9cbc03bf12df398bb14e62389efc70a3 Mon Sep 17 00:00:00 2001
+From: ViliamKovac1223 <viliamkovac1223@gmail.com>
+Date: Sun, 9 Oct 2022 16:29:28 -0400
+Subject: [PATCH] add alt-tab functionality
+
+Co-authored-by: Daniel Gerblick <daniel.gerblick@gmail.com>
+---
+ config.def.h | 11 ++-
+ dwm.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 228 insertions(+), 1 deletion(-)
+
+diff --git a/config.def.h b/config.def.h
+index 061ad66..7a9e3b1 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -1,5 +1,13 @@
+ /* See LICENSE file for copyright and license details. */
+
++/* alt-tab configuration */
++static const unsigned int tabModKey = 0x40; /* if this key is hold the alt-tab functionality stays acitve. This key must be the same as key that is used to active functin altTabStart `*/
++static const unsigned int tabCycleKey = 0x17; /* if this key is hit the alt-tab program moves one position forward in clients stack. This key must be the same as key that is used to active functin altTabStart */
++static const unsigned int tabPosY = 1; /* tab position on Y axis, 0 = bottom, 1 = center, 2 = top */
++static const unsigned int tabPosX = 1; /* tab position on X axis, 0 = left, 1 = center, 2 = right */
++static const unsigned int maxWTab = 600; /* tab menu width */
++static const unsigned int maxHTab = 200; /* tab menu height */
++
+ /* appearance */
+ static const unsigned int borderpx = 1; /* border pixel of windows */
+ static const unsigned int snap = 32; /* snap pixel */
+@@ -71,7 +79,7 @@ static const Key keys[] = {
+ { MODKEY, XK_h, setmfact, {.f = -0.05} },
+ { MODKEY, XK_l, setmfact, {.f = +0.05} },
+ { MODKEY, XK_Return, zoom, {0} },
+- { MODKEY, XK_Tab, view, {0} },
++ { MODKEY, XK_q, view, {0} },
+ { MODKEY|ShiftMask, XK_c, killclient, {0} },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
+ { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
+@@ -84,6 +92,7 @@ static const Key keys[] = {
+ { MODKEY, XK_period, focusmon, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
++ { Mod1Mask, XK_Tab, altTabStart, {0} },
+ TAGKEYS( XK_1, 0)
+ TAGKEYS( XK_2, 1)
+ TAGKEYS( XK_3, 2)
+diff --git a/dwm.c b/dwm.c
+index e5efb6a..f606311 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -40,6 +40,7 @@
+ #include <X11/extensions/Xinerama.h>
+ #endif /* XINERAMA */
+ #include <X11/Xft/Xft.h>
++#include <time.h>
+
+ #include "drw.h"
+ #include "util.h"
+@@ -119,6 +120,12 @@ struct Monitor {
+ int by; /* bar geometry */
+ int mx, my, mw, mh; /* screen size */
+ int wx, wy, ww, wh; /* window area */
++ int altTabN; /* move that many clients forward */
++ int nTabs; /* number of active clients in tag */
++ int isAlt; /* 1,0 */
++ int maxWTab;
++ int maxHTab;
++ int gappx; /* gaps between windows */
+ unsigned int seltags;
+ unsigned int sellt;
+ unsigned int tagset[2];
+@@ -127,8 +133,10 @@ struct Monitor {
+ Client *clients;
+ Client *sel;
+ Client *stack;
++ Client ** altsnext; /* array of all clients in the tag */
+ Monitor *next;
+ Window barwin;
++ Window tabwin;
+ const Layout *lt[2];
+ };
+
+@@ -234,6 +242,9 @@ static int xerror(Display *dpy, XErrorEvent *ee);
+ static int xerrordummy(Display *dpy, XErrorEvent *ee);
+ static int xerrorstart(Display *dpy, XErrorEvent *ee);
+ static void zoom(const Arg *arg);
++void drawTab(int nwins, int first, Monitor *m);
++void altTabStart(const Arg *arg);
++static void altTabEnd();
+
+ /* variables */
+ static const char broken[] = "broken";
+@@ -477,6 +488,7 @@ cleanup(void)
+ Monitor *m;
+ size_t i;
+
++ altTabEnd();
+ view(&a);
+ selmon->lt[selmon->sellt] = &foo;
+ for (m = mons; m; m = m->next)
+@@ -644,6 +656,8 @@ createmon(void)
+ m->topbar = topbar;
++ m->gappx = gappx;
+ m->lt[0] = &layouts[0];
+ m->lt[1] = &layouts[1 % LENGTH(layouts)];
++ m->nTabs = 0;
+ strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
+ return m;
+ }
+@@ -1649,6 +1662,211 @@ spawn(const Arg *arg)
+ }
+ }
+
++void
++altTab()
++{
++ /* move to next window */
++ if (selmon->sel != NULL && selmon->sel->snext != NULL) {
++ selmon->altTabN++;
++ if (selmon->altTabN >= selmon->nTabs)
++ selmon->altTabN = 0; /* reset altTabN */
++
++ focus(selmon->altsnext[selmon->altTabN]);
++ restack(selmon);
++ }
++
++ /* redraw tab */
++ XRaiseWindow(dpy, selmon->tabwin);
++ drawTab(selmon->nTabs, 0, selmon);
++}
++
++void
++altTabEnd()
++{
++ if (selmon->isAlt == 0)
++ return;
++
++ /*
++ * move all clients between 1st and choosen position,
++ * one down in stack and put choosen client to the first position
++ * so they remain in right order for the next time that alt-tab is used
++ */
++ if (selmon->nTabs > 1) {
++ if (selmon->altTabN != 0) { /* if user picked original client do nothing */
++ Client *buff = selmon->altsnext[selmon->altTabN];
++ if (selmon->altTabN > 1)
++ for (int i = selmon->altTabN;i > 0;i--)
++ selmon->altsnext[i] = selmon->altsnext[i - 1];
++ else /* swap them if there are just 2 clients */
++ selmon->altsnext[selmon->altTabN] = selmon->altsnext[0];
++ selmon->altsnext[0] = buff;
++ }
++
++ /* restack clients */
++ for (int i = selmon->nTabs - 1;i >= 0;i--) {
++ focus(selmon->altsnext[i]);
++ restack(selmon);
++ }
++
++ free(selmon->altsnext); /* free list of clients */
++ }
++
++ /* turn off/destroy the window */
++ selmon->isAlt = 0;
++ selmon->nTabs = 0;
++ XUnmapWindow(dpy, selmon->tabwin);
++ XDestroyWindow(dpy, selmon->tabwin);
++}
++
++void
++drawTab(int nwins, int first, Monitor *m)
++{
++ /* little documentation of functions */
++ /* void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); */
++ /* int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); */
++ /* void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); */
++
++ Client *c;
++ int h;
++
++ if (first) {
++ Monitor *m = selmon;
++ XSetWindowAttributes wa = {
++ .override_redirect = True,
++ .background_pixmap = ParentRelative,
++ .event_mask = ButtonPressMask|ExposureMask
++ };
++
++ selmon->maxWTab = maxWTab;
++ selmon->maxHTab = maxHTab;
++
++ /* decide position of tabwin */
++ int posX = selmon->mx;
++ int posY = selmon->my;
++ if (tabPosX == 0)
++ posX += 0;
++ if (tabPosX == 1)
++ posX += (selmon->mw / 2) - (maxWTab / 2);
++ if (tabPosX == 2)
++ posX += selmon->mw - maxWTab;
++
++ if (tabPosY == 0)
++ posY += selmon->mh - maxHTab;
++ if (tabPosY == 1)
++ posY += (selmon->mh / 2) - (maxHTab / 2);
++ if (tabPosY == 2)
++ posY += 0;
++
++ h = selmon->maxHTab;
++ /* XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual, valuemask, attributes); just reference */
++ m->tabwin = XCreateWindow(dpy, root, posX, posY, selmon->maxWTab, selmon->maxHTab, 2, DefaultDepth(dpy, screen),
++ CopyFromParent, DefaultVisual(dpy, screen),
++ CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); /* create tabwin */
++
++ XDefineCursor(dpy, m->tabwin, cursor[CurNormal]->cursor);
++ XMapRaised(dpy, m->tabwin);
++
++ }
++
++ h = selmon->maxHTab / m->nTabs;
++
++ int y = 0;
++ int n = 0;
++ for (int i = 0;i < m->nTabs;i++) { /* draw all clients into tabwin */
++ c = m->altsnext[i];
++ if(!ISVISIBLE(c)) continue;
++ /* if (HIDDEN(c)) continue; uncomment if you're using awesomebar patch */
++
++ n++;
++ drw_setscheme(drw, scheme[(c == m->sel) ? SchemeSel : SchemeNorm]);
++ drw_text(drw, 0, y, selmon->maxWTab, h, 0, c->name, 0);
++ y += h;
++ }
++
++ drw_setscheme(drw, scheme[SchemeNorm]);
++ drw_map(drw, m->tabwin, 0, 0, selmon->maxWTab, selmon->maxHTab);
++}
++
++void
++altTabStart(const Arg *arg)
++{
++ selmon->altsnext = NULL;
++ if (selmon->tabwin)
++ altTabEnd();
++
++ if (selmon->isAlt == 1) {
++ altTabEnd();
++ } else {
++ selmon->isAlt = 1;
++ selmon->altTabN = 0;
++
++ Client *c;
++ Monitor *m = selmon;
++
++ m->nTabs = 0;
++ for(c = m->clients; c; c = c->next) { /* count clients */
++ if(!ISVISIBLE(c)) continue;
++ /* if (HIDDEN(c)) continue; uncomment if you're using awesomebar patch */
++
++ ++m->nTabs;
++ }
++
++ if (m->nTabs > 0) {
++ m->altsnext = (Client **) malloc(m->nTabs * sizeof(Client *));
++
++ int listIndex = 0;
++ for(c = m->stack; c; c = c->snext) { /* add clients to the list */
++ if(!ISVISIBLE(c)) continue;
++ /* if (HIDDEN(c)) continue; uncomment if you're using awesomebar patch */
++
++ m->altsnext[listIndex++] = c;
++ }
++
++ drawTab(m->nTabs, 1, m);
++
++ struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 };
++
++ /* grab keyboard (take all input from keyboard) */
++ int grabbed = 1;
++ for (int i = 0;i < 1000;i++) {
++ if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess)
++ break;
++ nanosleep(&ts, NULL);
++ if (i == 1000 - 1)
++ grabbed = 0;
++ }
++
++ XEvent event;
++ altTab();
++ if (grabbed == 0) {
++ altTabEnd();
++ } else {
++ while (grabbed) {
++ XNextEvent(dpy, &event);
++ if (event.type == KeyPress || event.type == KeyRelease) {
++ if (event.type == KeyRelease && event.xkey.keycode == tabModKey) { /* if super key is released break cycle */
++ break;
++ } else if (event.type == KeyPress) {
++ if (event.xkey.keycode == tabCycleKey) {/* if XK_s is pressed move to the next window */
++ altTab();
++ }
++ }
++ }
++ }
++
++ c = selmon->sel;
++ altTabEnd(); /* end the alt-tab functionality */
++ /* XUngrabKeyboard(display, time); just a reference */
++ XUngrabKeyboard(dpy, CurrentTime); /* stop taking all input from keyboard */
++ focus(c);
++ restack(selmon);
++ }
++ } else {
++ altTabEnd(); /* end the alt-tab functionality */
++ }
++ }
++}
++
+ void
+ tag(const Arg *arg)
+ {
+--
+2.37.3
+
diff --git a/savedconfig/sys-kernel/linux-firmware-20240709-r1 b/savedconfig/sys-kernel/linux-firmware-20240709-r1
@@ -0,0 +1,3942 @@
+# Remove files that shall not be installed from this list.
+3com/typhoon.bin
+INT8866RCA2.bin
+TAS2XXX2234.bin
+TAS2XXX3870.bin
+TAS2XXX387D.bin
+TAS2XXX387E.bin
+TAS2XXX387F.bin
+TAS2XXX3880.bin
+TAS2XXX3881.bin
+TAS2XXX3882.bin
+TAS2XXX3884.bin
+TAS2XXX3886.bin
+TAS2XXX38A5.bin
+TAS2XXX38A7.bin
+TAS2XXX38A8.bin
+TAS2XXX38B8.bin
+TAS2XXX38B9.bin
+TAS2XXX38BA.bin
+TAS2XXX38BB.bin
+TAS2XXX38BE.bin
+TAS2XXX38BF.bin
+TAS2XXX38C3.bin
+TAS2XXX38CB.bin
+TAS2XXX38CD.bin
+TAS2XXX38D3.bin
+TAS2XXX38D4.bin
+TAS2XXX38D5.bin
+TAS2XXX38D6.bin
+TAS2XXX38DF.bin
+TAS2XXX38E0.bin
+TIAS2781RCA2.bin
+TIAS2781RCA4.bin
+a300_pfp.fw
+a300_pm4.fw
+advansys/38C0800.bin
+advansys/mcode.bin
+advansys/38C1600.bin
+advansys/3550.bin
+agere_ap_fw.bin
+agere_sta_fw.bin
+airoha/EthMD32.dm.bin
+airoha/EthMD32.DSP.bin
+amd/amd_sev_fam19h_model1xh.sbin
+amd/amd_sev_fam19h_model0xh.sbin
+amd/amd_sev_fam17h_model3xh.sbin
+amd/amd_sev_fam17h_model0xh.sbin
+amd-ucode/microcode_amd_fam15h.bin
+amd-ucode/microcode_amd.bin
+amd-ucode/microcode_amd_fam17h.bin
+amd-ucode/microcode_amd_fam19h.bin
+amd-ucode/microcode_amd_fam16h.bin
+amd-ucode/README
+amdgpu/polaris10_ce_2.bin
+amdgpu/fiji_pfp.bin
+amdgpu/fiji_mc.bin
+amdgpu/vegam_vce.bin
+amdgpu/yellow_carp_pfp.bin
+amdgpu/beige_goby_rlc.bin
+amdgpu/vega12_sdma1.bin
+amdgpu/vega12_mec2.bin
+amdgpu/sdma_6_0_2.bin
+amdgpu/oland_smc.bin
+amdgpu/gc_10_3_6_mec2.bin
+amdgpu/bonaire_sdma1.bin
+amdgpu/sienna_cichlid_mec2.bin
+amdgpu/pitcairn_mc.bin
+amdgpu/vcn_4_0_4.bin
+amdgpu/mullins_pfp.bin
+amdgpu/gc_11_0_0_rlc.bin
+amdgpu/pitcairn_me.bin
+amdgpu/sienna_cichlid_me.bin
+amdgpu/vega20_rlc.bin
+amdgpu/gc_10_3_6_rlc.bin
+amdgpu/navi12_vcn.bin
+amdgpu/sienna_cichlid_rlc.bin
+amdgpu/renoir_me.bin
+amdgpu/vangogh_ce.bin
+amdgpu/polaris11_vce.bin
+amdgpu/bonaire_uvd.bin
+amdgpu/polaris10_sdma1.bin
+amdgpu/vangogh_me.bin
+amdgpu/raven2_ce.bin
+amdgpu/aldebaran_sos.bin
+amdgpu/smu_13_0_0.bin
+amdgpu/hawaii_ce.bin
+amdgpu/gc_9_4_3_rlc.bin
+amdgpu/kabini_sdma1.bin
+amdgpu/beige_goby_sdma.bin
+amdgpu/gc_10_3_7_me.bin
+amdgpu/aldebaran_sjt_mec.bin
+amdgpu/dcn_3_2_0_dmcub.bin
+amdgpu/verde_ce.bin
+amdgpu/vegam_mec.bin
+amdgpu/gc_11_0_3_mec.bin
+amdgpu/smu_13_0_6.bin
+amdgpu/polaris10_k_mc.bin
+amdgpu/navi12_mec.bin
+amdgpu/navi10_sdma1.bin
+amdgpu/bonaire_pfp.bin
+amdgpu/navy_flounder_me.bin
+amdgpu/polaris11_sdma.bin
+amdgpu/renoir_vcn.bin
+amdgpu/picasso_gpu_info.bin
+amdgpu/polaris12_mec2.bin
+amdgpu/gc_10_3_7_ce.bin
+amdgpu/psp_13_0_0_ta.bin
+amdgpu/hainan_ce.bin
+amdgpu/kabini_mec.bin
+amdgpu/raven2_pfp.bin
+amdgpu/navi14_pfp.bin
+amdgpu/stoney_uvd.bin
+amdgpu/vegam_mec2.bin
+amdgpu/tahiti_mc.bin
+amdgpu/polaris11_me_2.bin
+amdgpu/aldebaran_rlc.bin
+amdgpu/vega10_sos.bin
+amdgpu/gc_11_0_2_mes.bin
+amdgpu/polaris12_32_mc.bin
+amdgpu/vega10_ce.bin
+amdgpu/green_sardine_pfp.bin
+amdgpu/kaveri_ce.bin
+amdgpu/polaris10_mc.bin
+amdgpu/carrizo_vce.bin
+amdgpu/fiji_smc.bin
+amdgpu/navi12_smc.bin
+amdgpu/gc_11_0_2_mec.bin
+amdgpu/gc_11_0_0_pfp.bin
+amdgpu/polaris12_mc.bin
+amdgpu/gc_11_0_2_mes_2.bin
+amdgpu/gc_10_3_6_me.bin
+amdgpu/vega20_uvd.bin
+amdgpu/dcn_3_1_6_dmcub.bin
+amdgpu/fiji_sdma1.bin
+amdgpu/tonga_rlc.bin
+amdgpu/stoney_ce.bin
+amdgpu/tahiti_me.bin
+amdgpu/green_sardine_asd.bin
+amdgpu/gc_11_5_1_me.bin
+amdgpu/polaris10_vce.bin
+amdgpu/vcn_4_0_2.bin
+amdgpu/sdma_6_1_0.bin
+amdgpu/cyan_skillfish2_ce.bin
+amdgpu/mullins_vce.bin
+amdgpu/hawaii_me.bin
+amdgpu/gc_11_0_0_imu.bin
+amdgpu/kabini_ce.bin
+amdgpu/kabini_rlc.bin
+amdgpu/polaris10_mec.bin
+amdgpu/vega10_mec.bin
+amdgpu/navi14_vcn.bin
+amdgpu/topaz_me.bin
+amdgpu/renoir_mec.bin
+amdgpu/navy_flounder_sos.bin
+amdgpu/yellow_carp_dmcub.bin
+amdgpu/gc_11_0_0_mes.bin
+amdgpu/raven_mec.bin
+amdgpu/navi14_mec.bin
+amdgpu/vangogh_rlc.bin
+amdgpu/psp_13_0_6_ta.bin
+amdgpu/dimgrey_cavefish_rlc.bin
+amdgpu/carrizo_ce.bin
+amdgpu/navi14_sdma1.bin
+amdgpu/cyan_skillfish2_sdma.bin
+amdgpu/polaris10_smc_sk.bin
+amdgpu/vangogh_toc.bin
+amdgpu/verde_rlc.bin
+amdgpu/dimgrey_cavefish_ta.bin
+amdgpu/polaris11_smc_sk.bin
+amdgpu/pitcairn_smc.bin
+amdgpu/hawaii_pfp.bin
+amdgpu/sienna_cichlid_ta.bin
+amdgpu/kaveri_pfp.bin
+amdgpu/topaz_ce.bin
+amdgpu/gc_11_5_0_mes1.bin
+amdgpu/topaz_mec.bin
+amdgpu/oland_rlc.bin
+amdgpu/yellow_carp_rlc.bin
+amdgpu/polaris10_me.bin
+amdgpu/yellow_carp_ta.bin
+amdgpu/vega10_uvd.bin
+amdgpu/vega20_pfp.bin
+amdgpu/navi14_smc.bin
+amdgpu/polaris11_k_smc.bin
+amdgpu/bonaire_rlc.bin
+amdgpu/vega12_pfp.bin
+amdgpu/verde_k_smc.bin
+amdgpu/gc_11_0_2_mes1.bin
+amdgpu/sienna_cichlid_smc.bin
+amdgpu/navi10_sdma.bin
+amdgpu/polaris11_sdma1.bin
+amdgpu/oland_me.bin
+amdgpu/navi10_asd.bin
+amdgpu/navy_flounder_dmcub.bin
+amdgpu/raven_me.bin
+amdgpu/yellow_carp_me.bin
+amdgpu/carrizo_sdma.bin
+amdgpu/pitcairn_ce.bin
+amdgpu/tonga_me.bin
+amdgpu/gc_11_0_0_mec.bin
+amdgpu/navi10_gpu_info.bin
+amdgpu/stoney_sdma.bin
+amdgpu/raven_pfp.bin
+amdgpu/raven_ta.bin
+amdgpu/yellow_carp_mec.bin
+amdgpu/sienna_cichlid_vcn.bin
+amdgpu/polaris10_pfp_2.bin
+amdgpu/vega20_mec.bin
+amdgpu/gc_11_5_1_mec.bin
+amdgpu/vega20_ce.bin
+amdgpu/vega10_gpu_info.bin
+amdgpu/tahiti_rlc.bin
+amdgpu/gc_11_0_4_me.bin
+amdgpu/beige_goby_dmcub.bin
+amdgpu/sienna_cichlid_dmcub.bin
+amdgpu/arcturus_mec.bin
+amdgpu/tonga_k_smc.bin
+amdgpu/kaveri_rlc.bin
+amdgpu/gc_11_0_1_me.bin
+amdgpu/navi14_ce_wks.bin
+amdgpu/polaris11_me.bin
+amdgpu/navi12_me.bin
+amdgpu/bonaire_smc.bin
+amdgpu/vega12_asd.bin
+amdgpu/gc_10_3_7_pfp.bin
+amdgpu/sdma_4_4_2.bin
+amdgpu/renoir_rlc.bin
+amdgpu/gc_11_0_1_mec.bin
+amdgpu/tonga_sdma1.bin
+amdgpu/navi10_me.bin
+amdgpu/polaris11_rlc.bin
+amdgpu/vcn_3_1_2.bin
+amdgpu/vega12_smc.bin
+amdgpu/vega12_me.bin
+amdgpu/pitcairn_k_smc.bin
+amdgpu/fiji_me.bin
+amdgpu/tahiti_pfp.bin
+amdgpu/sienna_cichlid_ce.bin
+amdgpu/pitcairn_pfp.bin
+amdgpu/arcturus_sos.bin
+amdgpu/renoir_sdma.bin
+amdgpu/hawaii_uvd.bin
+amdgpu/psp_14_0_0_ta.bin
+amdgpu/psp_13_0_5_asd.bin
+amdgpu/navi10_mec2.bin
+amdgpu/carrizo_rlc.bin
+amdgpu/topaz_mc.bin
+amdgpu/polaris12_uvd.bin
+amdgpu/hainan_smc.bin
+amdgpu/tonga_uvd.bin
+amdgpu/carrizo_pfp.bin
+amdgpu/vegam_sdma1.bin
+amdgpu/dimgrey_cavefish_mec2.bin
+amdgpu/navi10_ta.bin
+amdgpu/vcn_4_0_6.bin
+amdgpu/renoir_dmcub.bin
+amdgpu/yellow_carp_vcn.bin
+amdgpu/fiji_sdma.bin
+amdgpu/green_sardine_vcn.bin
+amdgpu/vega10_pfp.bin
+amdgpu/raven2_asd.bin
+amdgpu/mullins_mec.bin
+amdgpu/arcturus_asd.bin
+amdgpu/vega10_mec2.bin
+amdgpu/kabini_vce.bin
+amdgpu/polaris11_mec_2.bin
+amdgpu/vega12_uvd.bin
+amdgpu/polaris12_me_2.bin
+amdgpu/carrizo_mec2.bin
+amdgpu/gc_11_5_1_pfp.bin
+amdgpu/gc_11_0_4_mes1.bin
+amdgpu/hawaii_k_smc.bin
+amdgpu/kaveri_mec.bin
+amdgpu/vega10_asd.bin
+amdgpu/sienna_cichlid_sos.bin
+amdgpu/topaz_sdma.bin
+amdgpu/sienna_cichlid_sdma.bin
+amdgpu/polaris11_mc.bin
+amdgpu/psp_13_0_7_ta.bin
+amdgpu/sdma_6_0_1.bin
+amdgpu/topaz_pfp.bin
+amdgpu/vegam_rlc.bin
+amdgpu/bonaire_me.bin
+amdgpu/vega20_asd.bin
+amdgpu/vega10_smc.bin
+amdgpu/tonga_smc.bin
+amdgpu/polaris12_mec_2.bin
+amdgpu/raven_asd.bin
+amdgpu/gc_11_0_4_mes.bin
+amdgpu/navi14_sdma.bin
+amdgpu/hawaii_sdma1.bin
+amdgpu/tonga_vce.bin
+amdgpu/navi12_sdma.bin
+amdgpu/gc_11_0_1_mes1.bin
+amdgpu/psp_13_0_6_sos.bin
+amdgpu/dcn_3_1_5_dmcub.bin
+amdgpu/vega12_rlc.bin
+amdgpu/aldebaran_smc.bin
+amdgpu/pitcairn_rlc.bin
+amdgpu/gc_11_0_4_mec.bin
+amdgpu/green_sardine_ta.bin
+amdgpu/polaris12_rlc.bin
+amdgpu/sdma_6_1_1.bin
+amdgpu/raven_gpu_info.bin
+amdgpu/vangogh_mec.bin
+amdgpu/vangogh_vcn.bin
+amdgpu/bonaire_vce.bin
+amdgpu/carrizo_uvd.bin
+amdgpu/topaz_k_smc.bin
+amdgpu/umsch_mm_4_0_0.bin
+amdgpu/vcn_4_0_3.bin
+amdgpu/topaz_rlc.bin
+amdgpu/sienna_cichlid_mec.bin
+amdgpu/smu_13_0_7.bin
+amdgpu/vegam_ce.bin
+amdgpu/bonaire_mec.bin
+amdgpu/navi12_mec2.bin
+amdgpu/dimgrey_cavefish_sos.bin
+amdgpu/tonga_mc.bin
+amdgpu/polaris10_rlc.bin
+amdgpu/picasso_mec.bin
+amdgpu/beige_goby_pfp.bin
+amdgpu/sdma_5_2_6.bin
+amdgpu/navi12_gpu_info.bin
+amdgpu/polaris11_mec2.bin
+amdgpu/polaris12_ce.bin
+amdgpu/gc_11_0_1_rlc.bin
+amdgpu/yellow_carp_ce.bin
+amdgpu/aldebaran_sdma.bin
+amdgpu/stoney_rlc.bin
+amdgpu/gc_11_5_0_pfp.bin
+amdgpu/polaris12_mec2_2.bin
+amdgpu/green_sardine_dmcub.bin
+amdgpu/bonaire_sdma.bin
+amdgpu/vega10_rlc.bin
+amdgpu/yellow_carp_toc.bin
+amdgpu/beige_goby_mec.bin
+amdgpu/raven_sdma.bin
+amdgpu/dimgrey_cavefish_me.bin
+amdgpu/navi14_rlc.bin
+amdgpu/navi12_sdma1.bin
+amdgpu/picasso_ce.bin
+amdgpu/polaris12_sdma.bin
+amdgpu/raven_rlc.bin
+amdgpu/picasso_vcn.bin
+amdgpu/sdma_5_2_7.bin
+amdgpu/navy_flounder_sdma.bin
+amdgpu/gc_11_0_4_pfp.bin
+amdgpu/vega20_smc.bin
+amdgpu/navy_flounder_mec.bin
+amdgpu/dimgrey_cavefish_dmcub.bin
+amdgpu/stoney_me.bin
+amdgpu/raven2_rlc.bin
+amdgpu/kabini_sdma.bin
+amdgpu/dcn_3_5_1_dmcub.bin
+amdgpu/green_sardine_rlc.bin
+amdgpu/psp_13_0_11_ta.bin
+amdgpu/picasso_rlc_am4.bin
+amdgpu/kaveri_uvd.bin
+amdgpu/dimgrey_cavefish_vcn.bin
+amdgpu/navi12_dmcu.bin
+amdgpu/arcturus_vcn.bin
+amdgpu/gc_11_0_0_mes1.bin
+amdgpu/beige_goby_smc.bin
+amdgpu/verde_uvd.bin
+amdgpu/stoney_vce.bin
+amdgpu/psp_13_0_7_sos.bin
+amdgpu/gc_11_0_4_imu.bin
+amdgpu/gc_11_5_0_me.bin
+amdgpu/navi12_asd.bin
+amdgpu/verde_pfp.bin
+amdgpu/vangogh_pfp.bin
+amdgpu/navi12_pfp.bin
+amdgpu/vega10_sdma1.bin
+amdgpu/psp_13_0_4_toc.bin
+amdgpu/dimgrey_cavefish_ce.bin
+amdgpu/hawaii_smc.bin
+amdgpu/mullins_me.bin
+amdgpu/mullins_sdma1.bin
+amdgpu/dcn_3_1_4_dmcub.bin
+amdgpu/polaris10_smc.bin
+amdgpu/kaveri_mec2.bin
+amdgpu/gc_10_3_6_mec.bin
+amdgpu/oland_pfp.bin
+amdgpu/polaris11_uvd.bin
+amdgpu/vega12_gpu_info.bin
+amdgpu/cyan_skillfish2_sdma1.bin
+amdgpu/polaris11_k2_smc.bin
+amdgpu/vega10_vce.bin
+amdgpu/navy_flounder_ta.bin
+amdgpu/vpe_6_1_0.bin
+amdgpu/gc_11_0_2_imu.bin
+amdgpu/polaris10_uvd.bin
+amdgpu/vcn_4_0_5.bin
+amdgpu/hainan_me.bin
+amdgpu/polaris11_pfp_2.bin
+amdgpu/polaris12_pfp_2.bin
+amdgpu/picasso_asd.bin
+amdgpu/vega12_vce.bin
+amdgpu/polaris10_mec_2.bin
+amdgpu/navi12_rlc.bin
+amdgpu/raven2_mec.bin
+amdgpu/psp_13_0_10_sos.bin
+amdgpu/vega20_sdma.bin
+amdgpu/fiji_uvd.bin
+amdgpu/gc_10_3_7_mec2.bin
+amdgpu/polaris12_mec.bin
+amdgpu/verde_mc.bin
+amdgpu/polaris12_vce.bin
+amdgpu/psp_13_0_8_toc.bin
+amdgpu/beige_goby_mec2.bin
+amdgpu/kaveri_sdma.bin
+amdgpu/gc_10_3_6_pfp.bin
+amdgpu/kaveri_vce.bin
+amdgpu/vega20_ta.bin
+amdgpu/psp_14_0_1_toc.bin
+amdgpu/psp_13_0_10_ta.bin
+amdgpu/gc_10_3_6_ce.bin
+amdgpu/navi10_ce.bin
+amdgpu/arcturus_mec2.bin
+amdgpu/dimgrey_cavefish_pfp.bin
+amdgpu/navi14_me.bin
+amdgpu/gc_9_4_3_mec.bin
+amdgpu/yellow_carp_asd.bin
+amdgpu/dcn_3_5_dmcub.bin
+amdgpu/beige_goby_sos.bin
+amdgpu/polaris11_ce_2.bin
+amdgpu/polaris10_k_smc.bin
+amdgpu/navi10_vcn.bin
+amdgpu/bonaire_mc.bin
+amdgpu/gc_11_5_0_mes_2.bin
+amdgpu/pitcairn_uvd.bin
+amdgpu/dcn_3_2_1_dmcub.bin
+amdgpu/psp_13_0_5_toc.bin
+amdgpu/polaris10_k2_smc.bin
+amdgpu/gc_11_0_3_mes1.bin
+amdgpu/kaveri_sdma1.bin
+amdgpu/kabini_uvd.bin
+amdgpu/raven2_mec2.bin
+amdgpu/arcturus_rlc.bin
+amdgpu/gc_11_0_2_me.bin
+amdgpu/polaris11_ce.bin
+amdgpu/polaris10_mec2_2.bin
+amdgpu/raven2_sdma.bin
+amdgpu/vpe_6_1_1.bin
+amdgpu/raven_vcn.bin
+amdgpu/arcturus_gpu_info.bin
+amdgpu/raven_ce.bin
+amdgpu/polaris12_k_mc.bin
+amdgpu/kaveri_me.bin
+amdgpu/navy_flounder_smc.bin
+amdgpu/tahiti_ce.bin
+amdgpu/cyan_skillfish2_pfp.bin
+amdgpu/tonga_mec.bin
+amdgpu/gc_11_5_1_mes_2.bin
+amdgpu/cyan_skillfish2_rlc.bin
+amdgpu/gc_11_0_0_rlc_1.bin
+amdgpu/renoir_asd.bin
+amdgpu/navi14_pfp_wks.bin
+amdgpu/vega12_mec.bin
+amdgpu/stoney_mec.bin
+amdgpu/polaris12_k_smc.bin
+amdgpu/arcturus_smc.bin
+amdgpu/psp_14_0_1_ta.bin
+amdgpu/vega20_me.bin
+amdgpu/gc_11_5_0_imu.bin
+amdgpu/picasso_me.bin
+amdgpu/fiji_mec.bin
+amdgpu/polaris10_sdma.bin
+amdgpu/navi14_ce.bin
+amdgpu/gc_11_0_3_imu.bin
+amdgpu/hainan_k_smc.bin
+amdgpu/topaz_sdma1.bin
+amdgpu/beige_goby_vcn.bin
+amdgpu/navi10_smc.bin
+amdgpu/gc_11_5_0_mec.bin
+amdgpu/raven_mec2.bin
+amdgpu/renoir_pfp.bin
+amdgpu/polaris12_smc.bin
+amdgpu/polaris12_pfp.bin
+amdgpu/aldebaran_vcn.bin
+amdgpu/navi10_pfp.bin
+amdgpu/vega10_sdma.bin
+amdgpu/topaz_mec2.bin
+amdgpu/picasso_pfp.bin
+amdgpu/tonga_sdma.bin
+amdgpu/polaris11_pfp.bin
+amdgpu/vcn_4_0_0.bin
+amdgpu/navy_flounder_rlc.bin
+amdgpu/aldebaran_ta.bin
+amdgpu/cyan_skillfish2_mec.bin
+amdgpu/gc_11_0_2_rlc.bin
+amdgpu/cyan_skillfish2_me.bin
+amdgpu/navi14_asd.bin
+amdgpu/navi14_mec_wks.bin
+amdgpu/beige_goby_ta.bin
+amdgpu/vega20_sos.bin
+amdgpu/hawaii_mec.bin
+amdgpu/navy_flounder_pfp.bin
+amdgpu/gc_11_0_3_pfp.bin
+amdgpu/aldebaran_sjt_mec2.bin
+amdgpu/topaz_smc.bin
+amdgpu/gc_11_0_1_pfp.bin
+amdgpu/stoney_pfp.bin
+amdgpu/vega10_me.bin
+amdgpu/carrizo_sdma1.bin
+amdgpu/vega12_ce.bin
+amdgpu/green_sardine_me.bin
+amdgpu/psp_14_0_0_toc.bin
+amdgpu/vega20_vce.bin
+amdgpu/beige_goby_me.bin
+amdgpu/raven2_gpu_info.bin
+amdgpu/fiji_vce.bin
+amdgpu/gc_11_5_1_rlc.bin
+amdgpu/vegam_uvd.bin
+amdgpu/si58_mc.bin
+amdgpu/gc_10_3_7_mec.bin
+amdgpu/gc_11_0_0_me.bin
+amdgpu/psp_13_0_8_ta.bin
+amdgpu/arcturus_ta.bin
+amdgpu/hainan_mc.bin
+amdgpu/green_sardine_sdma.bin
+amdgpu/renoir_ce.bin
+amdgpu/bonaire_ce.bin
+amdgpu/gc_11_0_4_mes_2.bin
+amdgpu/gc_11_0_1_mes_2.bin
+amdgpu/oland_ce.bin
+amdgpu/polaris12_sdma1.bin
+amdgpu/gc_11_5_1_mes1.bin
+amdgpu/polaris11_mec2_2.bin
+amdgpu/renoir_mec2.bin
+amdgpu/arcturus_sdma.bin
+amdgpu/vega20_mec2.bin
+amdgpu/verde_smc.bin
+amdgpu/gc_11_0_4_rlc.bin
+amdgpu/polaris11_k_mc.bin
+amdgpu/sienna_cichlid_pfp.bin
+amdgpu/navi14_mec2.bin
+amdgpu/vega12_sos.bin
+amdgpu/navi10_mec.bin
+amdgpu/hawaii_mc.bin
+amdgpu/green_sardine_ce.bin
+amdgpu/navi14_gpu_info.bin
+amdgpu/tonga_ce.bin
+amdgpu/renoir_gpu_info.bin
+amdgpu/vegam_sdma.bin
+amdgpu/aldebaran_mec2.bin
+amdgpu/beige_goby_ce.bin
+amdgpu/psp_13_0_5_ta.bin
+amdgpu/oland_k_smc.bin
+amdgpu/tonga_pfp.bin
+amdgpu/yellow_carp_mec2.bin
+amdgpu/raven_kicker_rlc.bin
+amdgpu/raven_dmcu.bin
+amdgpu/renoir_ta.bin
+amdgpu/gc_11_0_3_rlc.bin
+amdgpu/gc_11_0_2_pfp.bin
+amdgpu/hawaii_sdma.bin
+amdgpu/tahiti_k_smc.bin
+amdgpu/mullins_rlc.bin
+amdgpu/navi14_me_wks.bin
+amdgpu/dimgrey_cavefish_smc.bin
+amdgpu/polaris10_mec2.bin
+amdgpu/navi14_sos.bin
+amdgpu/sdma_6_0_0.bin
+amdgpu/polaris10_pfp.bin
+amdgpu/vangogh_sdma.bin
+amdgpu/gc_10_3_7_rlc.bin
+amdgpu/mullins_uvd.bin
+amdgpu/cyan_skillfish2_mec2.bin
+amdgpu/navi14_mec2_wks.bin
+amdgpu/polaris11_mec.bin
+amdgpu/isp_4_1_1.bin
+amdgpu/vegam_pfp.bin
+amdgpu/fiji_ce.bin
+amdgpu/vangogh_dmcub.bin
+amdgpu/vega12_sdma.bin
+amdgpu/psp_13_0_11_toc.bin
+amdgpu/oland_mc.bin
+amdgpu/vegam_smc.bin
+amdgpu/polaris12_ce_2.bin
+amdgpu/picasso_ta.bin
+amdgpu/navi12_ce.bin
+amdgpu/vcn_4_0_6_1.bin
+amdgpu/tahiti_smc.bin
+amdgpu/picasso_mec2.bin
+amdgpu/gc_11_0_1_mes.bin
+amdgpu/hainan_pfp.bin
+amdgpu/smu_13_0_10.bin
+amdgpu/picasso_sdma.bin
+amdgpu/hainan_rlc.bin
+amdgpu/mullins_sdma.bin
+amdgpu/navi12_ta.bin
+amdgpu/psp_13_0_8_asd.bin
+amdgpu/green_sardine_mec.bin
+amdgpu/psp_13_0_4_ta.bin
+amdgpu/raven2_vcn.bin
+amdgpu/vangogh_asd.bin
+amdgpu/polaris10_me_2.bin
+amdgpu/carrizo_mec.bin
+amdgpu/picasso_rlc.bin
+amdgpu/navy_flounder_vcn.bin
+amdgpu/navi14_ta.bin
+amdgpu/dimgrey_cavefish_mec.bin
+amdgpu/psp_13_0_0_sos.bin
+amdgpu/navy_flounder_ce.bin
+amdgpu/raven2_ta.bin
+amdgpu/fiji_rlc.bin
+amdgpu/vangogh_mec2.bin
+amdgpu/bonaire_k_smc.bin
+amdgpu/vegam_me.bin
+amdgpu/fiji_mec2.bin
+amdgpu/hawaii_rlc.bin
+amdgpu/gc_11_0_3_mes_2.bin
+amdgpu/verde_me.bin
+amdgpu/hawaii_vce.bin
+amdgpu/navy_flounder_mec2.bin
+amdgpu/tonga_mec2.bin
+amdgpu/navi10_rlc.bin
+amdgpu/sdma_6_0_3.bin
+amdgpu/carrizo_me.bin
+amdgpu/gc_11_0_3_me.bin
+amdgpu/kabini_me.bin
+amdgpu/gc_11_0_1_imu.bin
+amdgpu/aldebaran_mec.bin
+amdgpu/polaris10_ce.bin
+amdgpu/oland_uvd.bin
+amdgpu/tahiti_uvd.bin
+amdgpu/polaris11_smc.bin
+amdgpu/navi10_sos.bin
+amdgpu/raven2_me.bin
+amdgpu/vega20_sdma1.bin
+amdgpu/banks_k_2_smc.bin
+amdgpu/gc_11_5_1_imu.bin
+amdgpu/polaris12_me.bin
+amdgpu/mullins_ce.bin
+amdgpu/gc_11_5_0_rlc.bin
+amdgpu/yellow_carp_sdma.bin
+amdgpu/navi12_sos.bin
+amdgpu/green_sardine_mec2.bin
+amdgpu/dimgrey_cavefish_sdma.bin
+amdgpu/vega10_acg_smc.bin
+amdgpu/kabini_pfp.bin
+amdgpu/gc_11_0_0_mes_2.bin
+amdtee/773bd96f-b83f-4d52-b12dc529b13d8543.bin
+amdtee/amd_pmf_v3.bin
+amlogic/aml_w155s2_bt_uart.bin
+amlogic/aml_w265s1_bt_uart.bin
+amlogic/aml_w265s2_bt_uart.bin
+amphion/vpu/vpu_fw_imx8_enc.bin
+amphion/vpu/vpu_fw_imx8_dec.bin
+ar3k/ramps_0x41020000_40.dfu
+ar3k/ramps_0x01020001_26.dfu
+ar3k/1020201/RamPatch.txt
+ar3k/1020201/PS_ASIC.pst
+ar3k/AthrBT_0x41020000.dfu
+ar3k/ramps_0x11020100_40.dfu
+ar3k/AthrBT_0x11020100.dfu
+ar3k/ramps_0x01020201_26.dfu
+ar3k/AthrBT_0x01020001.dfu
+ar3k/ramps_0x01020200_26.dfu
+ar3k/AthrBT_0x31010100.dfu
+ar3k/1020201coex/ramps_0x01020201_26_HighPriority.dfu
+ar3k/30000/RamPatch.txt
+ar3k/30000/ar3kbdaddr.pst
+ar3k/30000/PS_ASIC.pst
+ar3k/1020200/RamPatch.txt
+ar3k/1020200/ar3kbdaddr.pst
+ar3k/1020200/PS_ASIC.pst
+ar3k/AthrBT_0x01020201.dfu
+ar3k/ramps_0x31010000_40.dfu
+ar3k/ramps_0x01020201_40.dfu
+ar3k/30101coex/RamPatch.txt
+ar3k/30101coex/PS_ASIC_aclLowPri.pst
+ar3k/30101coex/ar3kbdaddr.pst
+ar3k/30101coex/PS_ASIC.pst
+ar3k/30101coex/PS_ASIC_aclHighPri.pst
+ar3k/AthrBT_0x11020000.dfu
+ar3k/30101/RamPatch.txt
+ar3k/30101/ar3kbdaddr.pst
+ar3k/30101/PS_ASIC.pst
+ar3k/ramps_0x01020200_40.dfu
+ar3k/AthrBT_0x01020200.dfu
+ar3k/ramps_0x11020000_40.dfu
+ar3k/AthrBT_0x31010000.dfu
+ar3k/ramps_0x31010100_40.dfu
+ar5523.bin
+ar7010.fw
+ar7010_1_1.fw
+ar9170-1.fw
+ar9170-2.fw
+ar9271.fw
+arm/mali/arch10.8/mali_csffw.bin
+as102_data1_st.hex
+as102_data2_st.hex
+ath10k/QCA6174/hw3.0/notice_ath10k_firmware-sdio-6.txt
+ath10k/QCA6174/hw3.0/board-2.bin
+ath10k/QCA6174/hw3.0/notice_ath10k_firmware-4.txt
+ath10k/QCA6174/hw3.0/firmware-4.bin
+ath10k/QCA6174/hw3.0/firmware-6.bin
+ath10k/QCA6174/hw3.0/notice_ath10k_firmware-6.txt
+ath10k/QCA6174/hw3.0/board.bin
+ath10k/QCA6174/hw3.0/firmware-sdio-6.bin
+ath10k/QCA6174/hw2.1/board-2.bin
+ath10k/QCA6174/hw2.1/board.bin
+ath10k/QCA6174/hw2.1/firmware-5.bin
+ath10k/QCA6174/hw2.1/notice_ath10k_firmware-5.txt
+ath10k/WCN3990/hw1.0/board-2.bin
+ath10k/WCN3990/hw1.0/qrb4210/wlanmdsp.mbn
+ath10k/WCN3990/hw1.0/qrb4210/firmware-5.bin
+ath10k/WCN3990/hw1.0/notice.txt_wlanmdsp
+ath10k/WCN3990/hw1.0/qcm2290/wlanmdsp.mbn
+ath10k/WCN3990/hw1.0/qcm2290/firmware-5.bin
+ath10k/WCN3990/hw1.0/wlanmdsp.mbn
+ath10k/WCN3990/hw1.0/firmware-5.bin
+ath10k/QCA988X/hw2.0/notice_ath10k_firmware-4.txt
+ath10k/QCA988X/hw2.0/firmware-4.bin
+ath10k/QCA988X/hw2.0/board.bin
+ath10k/QCA988X/hw2.0/firmware-5.bin
+ath10k/QCA988X/hw2.0/notice_ath10k_firmware-5.txt
+ath10k/QCA4019/hw1.0/board-2.bin
+ath10k/QCA4019/hw1.0/firmware-5.bin
+ath10k/QCA4019/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9887/hw1.0/board.bin
+ath10k/QCA9887/hw1.0/firmware-5.bin
+ath10k/QCA9887/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9888/hw2.0/board-2.bin
+ath10k/QCA9888/hw2.0/firmware-5.bin
+ath10k/QCA9888/hw2.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9377/hw1.0/board-2.bin
+ath10k/QCA9377/hw1.0/firmware-sdio-5.bin
+ath10k/QCA9377/hw1.0/firmware-6.bin
+ath10k/QCA9377/hw1.0/notice_ath10k_firmware-6.txt
+ath10k/QCA9377/hw1.0/notice_ath10k_firmware-sdio-5.txt
+ath10k/QCA9377/hw1.0/board.bin
+ath10k/QCA9377/hw1.0/firmware-5.bin
+ath10k/QCA9377/hw1.0/notice_ath10k_firmware-5.txt
+ath10k/QCA99X0/hw2.0/board-2.bin
+ath10k/QCA99X0/hw2.0/firmware-5.bin
+ath10k/QCA99X0/hw2.0/notice_ath10k_firmware-5.txt
+ath10k/QCA9984/hw1.0/board-2.bin
+ath10k/QCA9984/hw1.0/firmware-5.bin
+ath10k/QCA9984/hw1.0/notice_ath10k_firmware-5.txt
+ath11k/QCN9074/hw1.0/amss.bin
+ath11k/QCN9074/hw1.0/board-2.bin
+ath11k/QCN9074/hw1.0/Notice.txt
+ath11k/QCN9074/hw1.0/m3.bin
+ath11k/IPQ8074/hw2.0/q6_fw.b01
+ath11k/IPQ8074/hw2.0/q6_fw.b03
+ath11k/IPQ8074/hw2.0/q6_fw.b04
+ath11k/IPQ8074/hw2.0/board-2.bin
+ath11k/IPQ8074/hw2.0/q6_fw.b08
+ath11k/IPQ8074/hw2.0/m3_fw.b02
+ath11k/IPQ8074/hw2.0/m3_fw.b01
+ath11k/IPQ8074/hw2.0/q6_fw.b02
+ath11k/IPQ8074/hw2.0/m3_fw.mdt
+ath11k/IPQ8074/hw2.0/m3_fw.flist
+ath11k/IPQ8074/hw2.0/q6_fw.b00
+ath11k/IPQ8074/hw2.0/Notice.txt
+ath11k/IPQ8074/hw2.0/q6_fw.b07
+ath11k/IPQ8074/hw2.0/m3_fw.b00
+ath11k/IPQ8074/hw2.0/q6_fw.mdt
+ath11k/IPQ8074/hw2.0/q6_fw.b05
+ath11k/IPQ8074/hw2.0/q6_fw.flist
+ath11k/WCN6750/hw1.0/board-2.bin
+ath11k/WCN6750/hw1.0/wpss.b06
+ath11k/WCN6750/hw1.0/wpss.b02
+ath11k/WCN6750/hw1.0/wpss.b07
+ath11k/WCN6750/hw1.0/wpss.b01
+ath11k/WCN6750/hw1.0/Notice.txt
+ath11k/WCN6750/hw1.0/wpss.b04
+ath11k/WCN6750/hw1.0/wpss.b08
+ath11k/WCN6750/hw1.0/wpss.b05
+ath11k/WCN6750/hw1.0/wpss.b03
+ath11k/WCN6750/hw1.0/wpss.mdt
+ath11k/WCN6750/hw1.0/wpss.b00
+ath11k/IPQ6018/hw1.0/q6_fw.b01
+ath11k/IPQ6018/hw1.0/q6_fw.b03
+ath11k/IPQ6018/hw1.0/q6_fw.b04
+ath11k/IPQ6018/hw1.0/board-2.bin
+ath11k/IPQ6018/hw1.0/q6_fw.b08
+ath11k/IPQ6018/hw1.0/m3_fw.b02
+ath11k/IPQ6018/hw1.0/m3_fw.b01
+ath11k/IPQ6018/hw1.0/q6_fw.b02
+ath11k/IPQ6018/hw1.0/m3_fw.mdt
+ath11k/IPQ6018/hw1.0/m3_fw.flist
+ath11k/IPQ6018/hw1.0/q6_fw.b00
+ath11k/IPQ6018/hw1.0/Notice.txt
+ath11k/IPQ6018/hw1.0/q6_fw.b07
+ath11k/IPQ6018/hw1.0/m3_fw.b00
+ath11k/IPQ6018/hw1.0/q6_fw.mdt
+ath11k/IPQ6018/hw1.0/q6_fw.b05
+ath11k/IPQ6018/hw1.0/q6_fw.flist
+ath11k/IPQ5018/hw1.0/q6_fw.b01
+ath11k/IPQ5018/hw1.0/q6_fw.b03
+ath11k/IPQ5018/hw1.0/q6_fw.b04
+ath11k/IPQ5018/hw1.0/board-2.bin
+ath11k/IPQ5018/hw1.0/q6_fw.b08
+ath11k/IPQ5018/hw1.0/m3_fw.b02
+ath11k/IPQ5018/hw1.0/m3_fw.b01
+ath11k/IPQ5018/hw1.0/q6_fw.b09
+ath11k/IPQ5018/hw1.0/q6_fw.b02
+ath11k/IPQ5018/hw1.0/m3_fw.mdt
+ath11k/IPQ5018/hw1.0/q6_fw.b10
+ath11k/IPQ5018/hw1.0/m3_fw.flist
+ath11k/IPQ5018/hw1.0/q6_fw.b14
+ath11k/IPQ5018/hw1.0/q6_fw.b00
+ath11k/IPQ5018/hw1.0/Notice.txt
+ath11k/IPQ5018/hw1.0/q6_fw.b07
+ath11k/IPQ5018/hw1.0/m3_fw.b00
+ath11k/IPQ5018/hw1.0/q6_fw.b11
+ath11k/IPQ5018/hw1.0/q6_fw.mdt
+ath11k/IPQ5018/hw1.0/q6_fw.b05
+ath11k/IPQ5018/hw1.0/q6_fw.flist
+ath11k/IPQ5018/hw1.0/q6_fw.b13
+ath11k/WCN6855/hw2.0/amss.bin
+ath11k/WCN6855/hw2.0/board-2.bin
+ath11k/WCN6855/hw2.0/regdb.bin
+ath11k/WCN6855/hw2.0/Notice.txt
+ath11k/WCN6855/hw2.0/m3.bin
+ath11k/WCN6855/hw2.1/amss.bin
+ath11k/WCN6855/hw2.1/board-2.bin
+ath11k/WCN6855/hw2.1/regdb.bin
+ath11k/WCN6855/hw2.1/m3.bin
+ath11k/QCA6390/hw2.0/amss.bin
+ath11k/QCA6390/hw2.0/board-2.bin
+ath11k/QCA6390/hw2.0/Notice.txt
+ath11k/QCA6390/hw2.0/m3.bin
+ath12k/WCN7850/hw2.0/amss.bin
+ath12k/WCN7850/hw2.0/board-2.bin
+ath12k/WCN7850/hw2.0/Notice.txt
+ath12k/WCN7850/hw2.0/m3.bin
+ath3k-1.fw
+ath6k/AR6004/hw1.2/fw-2.bin
+ath6k/AR6004/hw1.2/bdata.bin
+ath6k/AR6004/hw1.3/bdata.bin
+ath6k/AR6004/hw1.3/fw-3.bin
+ath6k/AR6003/hw2.1.1/bdata.WB31.bin
+ath6k/AR6003/hw2.1.1/fw-2.bin
+ath6k/AR6003/hw2.1.1/endpointping.bin
+ath6k/AR6003/hw2.1.1/otp.bin
+ath6k/AR6003/hw2.1.1/athwlan.bin
+ath6k/AR6003/hw2.1.1/bdata.SD31.bin
+ath6k/AR6003/hw2.1.1/data.patch.bin
+ath6k/AR6003/hw2.1.1/fw-3.bin
+ath6k/AR6003/hw2.1.1/bdata.SD32.bin
+ath6k/AR6003/hw2.0/bdata.WB31.bin
+ath6k/AR6003/hw2.0/otp.bin.z77
+ath6k/AR6003/hw2.0/bdata.SD31.bin
+ath6k/AR6003/hw2.0/athwlan.bin.z77
+ath6k/AR6003/hw2.0/data.patch.bin
+ath6k/AR6003/hw2.0/bdata.SD32.bin
+ath6k/AR6003/hw1.0/bdata.WB31.bin
+ath6k/AR6003/hw1.0/otp.bin.z77
+ath6k/AR6003/hw1.0/bdata.SD31.bin
+ath6k/AR6003/hw1.0/athwlan.bin.z77
+ath6k/AR6003/hw1.0/data.patch.bin
+ath6k/AR6003/hw1.0/bdata.SD32.bin
+ath6k/AR6003.1/hw2.1.1/bdata.WB31.bin
+ath6k/AR6003.1/hw2.1.1/endpointping.bin
+ath6k/AR6003.1/hw2.1.1/otp.bin
+ath6k/AR6003.1/hw2.1.1/athwlan.bin
+ath6k/AR6003.1/hw2.1.1/bdata.SD31.bin
+ath6k/AR6003.1/hw2.1.1/data.patch.bin
+ath6k/AR6003.1/hw2.1.1/bdata.SD32.bin
+ath6k/AR6002/eeprom.bin
+ath6k/AR6002/data.patch.hw2_0.bin
+ath6k/AR6002/eeprom.data
+ath6k/AR6002/athwlan.bin.z77
+ath9k_htc/htc_7010-1.4.0.fw
+ath9k_htc/htc_9271-1.4.0.fw
+atmel/wilc1000_ap_fw.bin
+atmel/wilc1000_wifi_firmware-1.bin
+atmel/wilc1000_fw.bin
+atmel/wilc1000_wifi_firmware.bin
+atmel/wilc1000_p2p_fw.bin
+atusb/atusb-0.2.dfu
+atusb/rzusb-0.3.bin
+atusb/atusb-0.3.dfu
+av7110/bootcode.bin
+bnx2/bnx2-mips-06-6.2.3.fw
+bnx2/bnx2-rv2p-09-6.0.17.fw
+bnx2/bnx2-mips-09-6.2.1b.fw
+bnx2/bnx2-rv2p-09ax-6.0.17.fw
+bnx2/bnx2-rv2p-06-6.0.15.fw
+bnx2x/bnx2x-e1h-7.13.1.0.fw
+bnx2x/bnx2x-e1h-7.13.11.0.fw
+bnx2x/bnx2x-e1h-7.13.21.0.fw
+bnx2x/bnx2x-e1-7.13.15.0.fw
+bnx2x/bnx2x-e2-7.13.21.0.fw
+bnx2x/bnx2x-e2-7.13.11.0.fw
+bnx2x/bnx2x-e1-7.13.1.0.fw
+bnx2x/bnx2x-e1h-7.13.15.0.fw
+bnx2x/bnx2x-e2-7.13.1.0.fw
+bnx2x/bnx2x-e2-7.13.15.0.fw
+bnx2x/bnx2x-e1-7.13.11.0.fw
+bnx2x/bnx2x-e1-7.13.21.0.fw
+brcm/brcmfmac43455-sdio.pine64,pinenote-v1.1.txt
+brcm/BCM-0a5c-6410.hcd
+brcm/brcmfmac43362-sdio.cubietech,cubietruck.txt
+brcm/brcmfmac43430a0-sdio.bin
+brcm/brcmfmac43430-sdio.starfive,visionfive-v1.txt
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-plus.txt
+brcm/bcm43xx-0.fw
+brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi 4 Model B.txt
+brcm/brcmfmac4354-sdio.clm_blob
+brcm/brcmfmac43455-sdio.clm_blob
+brcm/brcmfmac43340-sdio.Insyde-VESPA2.txt
+brcm/brcmfmac43012-sdio.bin
+brcm/brcmfmac43012-sdio.clm_blob
+brcm/brcmfmac43430-sdio.sinovoip,bananapi-m64.txt
+brcm/brcmfmac4350c2-pcie.bin
+brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi Compute Module 4.txt
+brcm/brcmfmac4356-pcie.Intel Corporation-CHERRYVIEW D1 PLATFORM.txt
+brcm/brcmfmac43241b5-sdio.bin
+brcm/brcmfmac43362-sdio.WC121.txt
+brcm/brcmfmac43455-sdio.pine64,pinebook-pro.txt
+brcm/brcmfmac43430-sdio.beagle,beaglev-starlight-jh7100-a1.txt
+brcm/brcmfmac43455-sdio.pine64,rockpro64-v2.0.txt
+brcm/brcmfmac43430-sdio.AP6212.txt
+brcm/brcmfmac43455-sdio.acepc-t8.txt
+brcm/bcm43xx_hdr-0.fw
+brcm/brcmfmac4329-sdio.bin
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m3.txt
+brcm/brcmfmac43362-sdio.lemaker,bananapro.txt
+brcm/brcmfmac4366c-pcie.bin
+brcm/brcmfmac4356-sdio.bin
+brcm/brcmfmac43430-sdio.bin
+brcm/brcmfmac43602-pcie.ap.bin
+brcm/brcmfmac43455-sdio.raspberrypi,3-model-a-plus.txt
+brcm/brcmfmac43455-sdio.MINIX-NEO Z83-4.txt
+brcm/brcmfmac54591-pcie.bin
+brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt
+brcm/brcmfmac43455-sdio.raspberrypi,5-model-b.txt
+brcm/brcmfmac4339-sdio.bin
+brcm/brcmfmac43430a0-sdio.jumper-ezpad-mini3.txt
+brcm/brcmfmac43570-pcie.clm_blob
+brcm/brcmfmac4371-pcie.bin
+brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt
+brcm/brcmfmac4356-pcie.Xiaomi Inc-Mipad2.txt
+brcm/brcmfmac43340-sdio.ASUSTeK COMPUTER INC.-TF103CE.txt
+brcm/brcmfmac43430-sdio.raspberrypi,model-zero-2-w.txt
+brcm/brcmfmac43455-sdio.pine64,rockpro64-v2.1.txt
+brcm/brcmfmac4334-sdio.bin
+brcm/brcmfmac4356-pcie.bin
+brcm/brcmfmac43430-sdio.ilife-S806.txt
+brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt
+brcm/brcmfmac43241b0-sdio.bin
+brcm/brcmfmac43340-sdio.bin
+brcm/brcmfmac43340-sdio.meegopad-t08.txt
+brcm/brcmfmac43430-sdio.clm_blob
+brcm/brcmfmac43602-pcie.bin
+brcm/brcmfmac43241b4-sdio.bin
+brcm/brcmfmac43430-sdio.MUR1DX.txt
+brcm/brcmfmac43455-sdio.pine64,pinephone-pro.txt
+brcm/brcmfmac43340-sdio.pov-tab-p1006w-data.txt
+brcm/brcmfmac4356-sdio.vamrs,rock960.txt
+brcm/brcmfmac43241b4-sdio.Advantech-MICA-071.txt
+brcm/brcmfmac43455-sdio.pine64,soquartz-blade.txt
+brcm/brcmfmac4373.bin
+brcm/brcmfmac4356-sdio.clm_blob
+brcm/brcmfmac4330-sdio.Prowise-PT301.txt
+brcm/brcmfmac4356-sdio.AP6356S.txt
+brcm/brcmfmac4356-sdio.khadas,vim2.txt
+brcm/brcmfmac43455-sdio.pine64,pinenote-v1.2.txt
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-ultra.txt
+brcm/brcmfmac4330-sdio.bin
+brcm/brcmfmac4356-pcie.gpd-win-pocket.txt
+brcm/brcmfmac43430-sdio.Hampoo-D2D3_Vi8A1.txt
+brcm/brcmfmac43455-sdio.pine64,soquartz-model-a.txt
+brcm/brcmfmac43570-pcie.bin
+brcm/brcmfmac43362-sdio.kobo,aura.txt
+brcm/brcmfmac43362-sdio.ASUSTeK COMPUTER INC.-ME176C.txt
+brcm/brcmfmac43242a.bin
+brcm/brcmfmac4350-pcie.bin
+brcm/brcmfmac4354-sdio.bin
+brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-zero.txt
+brcm/brcmfmac43236b.bin
+brcm/brcmfmac43362-sdio.kobo,tolino-shine2hd.txt
+brcm/bcm4329-fullmac-4.bin
+brcm/brcmfmac43362-sdio.bin
+brcm/brcmfmac43455-sdio.pine64,soquartz-cm4io.txt
+brcm/brcmfmac4373-sdio.clm_blob
+brcm/brcmfmac43143-sdio.bin
+brcm/brcmfmac4366b-pcie.bin
+brcm/brcmfmac43569.bin
+brcm/brcmfmac43143.bin
+brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt
+brcm/brcmfmac4356-sdio.firefly,firefly-rk3399.txt
+brcm/brcmfmac4335-sdio.bin
+brcm/brcmfmac43455-sdio.beagle,am5729-beagleboneai.txt
+brcm/brcmfmac4358-pcie.bin
+brcm/brcmfmac43430-sdio.beagle,beaglev-starlight-jh7100-r0.txt
+brcm/brcmfmac43455-sdio.pine64,quartz64-b.txt
+brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.txt
+brcm/brcmfmac43455-sdio.bin
+brcm/brcmfmac43241b4-sdio.Intel Corp.-VALLEYVIEW C0 PLATFORM.txt
+brcm/brcmfmac4356-pcie.clm_blob
+brcm/brcmfmac43430a0-sdio.ONDA-V80 PLUS.txt
+brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.txt
+brcm/brcmfmac43430a0-sdio.ilife-S806.txt
+brcm/brcmfmac43455-sdio.AW-CM256SM.txt
+brcm/BCM-0bb4-0306.hcd
+brcm/brcmfmac43340-sdio.predia-basic.txt
+brcm/brcmfmac43430-sdio.friendlyarm,nanopi-r1.txt
+brcm/brcmfmac54591-pcie.clm_blob
+brcm/brcmfmac4373-sdio.bin
+cadence/mhdp8546.bin
+carl9170-1.fw
+cavium/cnn55xx_ae.fw
+cavium/cnn55xx_se.fw
+cbfw-3.2.5.1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b47.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ad8.wmfw
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c898f.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431b93.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ed3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8975.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b44.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b74.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8ca7.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c49.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8994.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f12.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104318d3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b70.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b45.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431473.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2319.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a83.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c33.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38fa.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8995.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431473-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431da2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8972.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc2-spkid0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c896e-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3866-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b63.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b43.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c70.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c896e-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89e7.wmfw
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c898e.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431473-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a50.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8973.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280beb.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc1-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c17.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc4-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a63.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c47.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c6-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b72.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c26.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ee2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cdd-spkid1.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a40.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-l0.bin
+cirrus/cs35l56/CS35L56_Rev3.11.11.wmfw
+cirrus/cs35l56/CS35L56_Rev3.11.16.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431663-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ee2-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cdd-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-104316a3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c72.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3878-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c46.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc1-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c43.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8994.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc4.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3877.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b77.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280beb-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f1f-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38f9-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10280cbe-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431683.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be9.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8ad8.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c49.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431663.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3865.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cc2-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3847.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3865-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3878-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b72.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3866-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431663-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c72.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8971.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b44.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b74.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ee2-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8991.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8991.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10280cbd-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc3-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cde-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2b.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431663-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3866.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8cde.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c47.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3865-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c48.bin
+cirrus/cs35l41-dsp1-spk-prot-10431483.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c9f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ccf.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2317.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89e7-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8ca4.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b92.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10280cbd-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280beb-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b8f-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431573.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b63-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-104312af.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c898f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2316.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f3-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431d1f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431663-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431503.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbd.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b42.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid1-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431df3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431533.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be2.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cc3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8975-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c6-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a30.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3878.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280b27.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-l1.bin
+cirrus/cs35l41-dsp1-spk-prot.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a30.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431f1f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c89c6.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8ca4.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c26.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c70.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8995.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c48.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b43.bin
+cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid0-r0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbe.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cbe-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431473-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b42.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431863-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386f-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386f-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c15.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a20.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c89e7-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b77.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3855.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8a28.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c46.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431473-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38fa-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-10431463-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8975-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10280cc3-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431683-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cde-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid1-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b92.wmfw
+cirrus/cs35l41/v6.39.0/halo_cspl_RAM_revB2_29.41.0.wmfw
+cirrus/cs35l41/v6.63.0/halo_cspl_RAM_revB2_29.65.0.wmfw
+cirrus/cs35l41/v6.68.0/halo_cspl_RAM_revB2_29.70.0.wmfw
+cirrus/cs35l41/v6.80.0/halo_cspl_RAM_revB2_29.82.0.wmfw
+cirrus/cs35l41/v6.83.0/halo_cspl_RAM_revB2_29.85.0.wmfw
+cirrus/cs35l41/v6.78.0/halo_cspl_RAM_revB2_29.80.0.wmfw
+cirrus/cs35l41/v6.61.1/halo_cspl_RAM_revB2_29.63.1.wmfw
+cirrus/cs35l41/bincfgs/cs35l41-dsp1-19_5dB.bincfg
+cirrus/cs35l41/bincfgs/cs35l41-dsp1-14_5dB.bincfg
+cirrus/cs35l41/bincfgs/cs35l41-dsp1-16_5dB.bincfg
+cirrus/cs35l41/v6.47.0/halo_cspl_RAM_revB2_29.49.0.wmfw
+cirrus/cs35l41/v6.56.0/halo_cspl_RAM_revB2_29.58.0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8be5.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431493-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316f3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b27-spkid1.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa386e.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp4.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10280cbf-spkid1.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b46.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38fa-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8974.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104312af-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa3877-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa231a-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c71.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38f9-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b45.bin
+cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid0-l0.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b47.wmfw
+cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp2.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp3.bin
+cirrus/cs35l41-dsp1-spk-prot-10431533-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-l0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cbf-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a6e-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8be8.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280b27-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c71.bin
+cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8c16.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-17aa2318-r0.bin
+cirrus/cs35l41-dsp1-spk-prot.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10280cc4-spkid0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8cf5.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa2319-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c89c3.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431a60.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c898e.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp4.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f2-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-r1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981-l1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431573-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38f9.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa3877-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cef.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c4f.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8971.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8974.wmfw
+cirrus/cs35l41-dsp1-spk-prot-17aa231a.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-r0.bincfg
+cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b70.bin
+cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0-amp2.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-r0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-103c8cdd.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c896e.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b46.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8973.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8972.wmfw
+cirrus/cs35l41-dsp1-spk-prot-104314e3.wmfw
+cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1-amp1.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid0-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa22f1-l0.bincfg
+cirrus/cs35l41-dsp1-spk-prot-10431863.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8992.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8c67.wmfw
+cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-10431f1f-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid1-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid1-r0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8981.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8ca7.wmfw
+cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid0-l0.bin
+cirrus/cs35l41-dsp1-spk-prot-103c8992.bin
+cis/SW_555_SER.cis
+cis/3CCFEM556.cis
+cis/NE2K.cis
+cis/SW_8xx_SER.cis
+cis/MT5634ZLX.cis
+cis/PE-200.cis
+cis/RS-COM-2P.cis
+cis/COMpad2.cis
+cis/tamarack.cis
+cis/LA-PCM.cis
+cis/SW_7xx_SER.cis
+cis/PCMLM28.cis
+cis/COMpad4.cis
+cis/3CXEM556.cis
+cis/DP83903.cis
+cis/PE520.cis
+cmmb_vega_12mhz.inp
+cmmb_venice_12mhz.inp
+cnm/wave521c_k3_codec_fw.bin
+cs42l43.bin
+ct2fw-3.2.5.1.bin
+ctefx.bin
+ctfw-3.2.5.1.bin
+ctspeq.bin
+cxgb3/ael2005_twx_edc.bin
+cxgb3/t3fw-7.12.0.bin
+cxgb3/t3b_psram-1.1.0.bin
+cxgb3/t3fw-7.10.0.bin
+cxgb3/t3c_psram-1.1.0.bin
+cxgb3/t3fw-7.0.0.bin
+cxgb3/t3fw-7.1.0.bin
+cxgb3/t3fw-7.4.0.bin
+cxgb3/ael2020_twx_edc.bin
+cxgb3/ael2005_opt_edc.bin
+cxgb4/t6fw-1.27.5.0.bin
+cxgb4/t5fw-1.15.37.0.bin
+cxgb4/bcm8483.bin
+cxgb4/aq1202_fw.cld
+cxgb4/t5fw.bin
+cxgb4/t4fw-1.15.37.0.bin
+cxgb4/t4fw.bin
+cxgb4/t6fw.bin
+cxgb4/t6-config.txt
+cxgb4/t5-config.txt
+cxgb4/configs/t5-config-default.txt
+cxgb4/configs/t4-config-default.txt
+cxgb4/configs/t5-config-hashfilter.txt
+cxgb4/configs/t6-config-hashfilter.txt
+cxgb4/configs/t6-config-default.txt
+cxgb4/t4fw-1.27.5.0.bin
+cxgb4/t4fw-1.14.4.0.bin
+cxgb4/t5fw-1.27.5.0.bin
+cxgb4/t5fw-1.14.4.0.bin
+cxgb4/t4-config.txt
+cypress/cyfmac43455-sdio.bin
+cypress/cyfmac4356-sdio.clm_blob
+cypress/cyfmac4373-sdio.bin
+cypress/cyfmac4354-sdio.bin
+cypress/cyfmac4354-sdio.clm_blob
+cypress/cyfmac43012-sdio.bin
+cypress/cyfmac43570-pcie.bin
+cypress/cyfmac43012-sdio.clm_blob
+cypress/cyfmac43455-sdio.clm_blob
+cypress/cyfmac4356-sdio.bin
+cypress/cyfmac54591-pcie.clm_blob
+cypress/cyfmac4356-pcie.bin
+cypress/cyfmac43340-sdio.bin
+cypress/cyfmac4356-pcie.clm_blob
+cypress/cyfmac43362-sdio.bin
+cypress/cyfmac43430-sdio.bin
+cypress/cyfmac54591-pcie.bin
+cypress/cyfmac4373-sdio.clm_blob
+cypress/cyfmac4339-sdio.bin
+cypress/cyfmac43570-pcie.clm_blob
+cypress/cyfmac43430-sdio.clm_blob
+dabusb/firmware.fw
+dabusb/bitstream.bin
+dpaa2/mc/mc_10.10.0_lx2160a.itb
+dpaa2/mc/mc_10.14.3_lx2160a.itb
+dpaa2/mc/mc_10.10.0_ls2088a.itb
+dpaa2/mc/mc_10.16.2_lx2160a.itb
+dpaa2/mc/mc_10.16.2_ls1088a.itb
+dpaa2/mc/mc_10.14.3_ls1088a.itb
+dpaa2/mc/mc_10.28.1_lx2160a.itb
+dpaa2/mc/mc_10.14.3_ls2088a.itb
+dpaa2/mc/mc_10.28.1_ls2088a.itb
+dpaa2/mc/mc_10.18.0_lx2160a.itb
+dpaa2/mc/mc_10.28.1_ls1088a.itb
+dpaa2/mc/mc_10.18.0_ls2088a.itb
+dpaa2/mc/mc_10.16.2_ls2088a.itb
+dpaa2/mc/mc_10.18.0_ls1088a.itb
+dpaa2/mc/mc_10.10.0_ls1088a.itb
+dsp56k/bootstrap.bin
+dvb-fe-xc4000-1.4.1.fw
+dvb-fe-xc5000-1.6.114.fw
+dvb-fe-xc5000c-4.1.30.7.fw
+dvb-usb-dib0700-1.20.fw
+dvb-usb-it9135-01.fw
+dvb-usb-it9135-02.fw
+dvb-usb-terratec-h5-drxk.fw
+dvb_nova_12mhz.inp
+dvb_nova_12mhz_b0.inp
+e100/d101s_ucode.bin
+e100/d101m_ucode.bin
+e100/d102e_ucode.bin
+emi26/firmware.fw
+emi26/bitstream.fw
+emi26/loader.fw
+ene-ub6250/ms_init.bin
+ene-ub6250/sd_init1.bin
+ene-ub6250/msp_rdwr.bin
+ene-ub6250/ms_rdwr.bin
+ene-ub6250/sd_rdwr.bin
+ene-ub6250/sd_init2.bin
+f2255usb.bin
+go7007/wis-startrek.fw
+go7007/go7007fw.bin
+go7007/go7007tv.bin
+go7007/px-tv402u.fw
+go7007/lr192.fw
+go7007/s2250-2.fw
+go7007/s2250-1.fw
+go7007/px-m402u.fw
+hfi1_dc8051.fw
+hfi1_fabric.fw
+hfi1_pcie.fw
+hfi1_sbus.fw
+htc_7010.fw
+htc_9271.fw
+i915/dg2_guc_70.1.2.bin
+i915/cml_guc_62.0.0.bin
+i915/glk_huc_ver03_01_2893.bin
+i915/icl_guc_49.0.1.bin
+i915/tgl_huc_7.9.3.bin
+i915/cml_guc_33.0.0.bin
+i915/adlp_guc_69.0.3.bin
+i915/skl_guc_32.0.3.bin
+i915/icl_huc_9.0.0.bin
+i915/cml_guc_49.0.1.bin
+i915/tgl_huc_7.5.0.bin
+i915/ehl_huc_9.0.0.bin
+i915/kbl_huc_ver02_00_1810.bin
+i915/bxt_guc_ver8_7.bin
+i915/glk_guc_49.0.1.bin
+i915/kbl_guc_ver9_39.bin
+i915/glk_guc_32.0.3.bin
+i915/cml_guc_69.0.3.bin
+i915/kbl_guc_70.1.1.bin
+i915/dg2_dmc_ver2_06.bin
+i915/bmg_dmc.bin
+i915/glk_guc_62.0.0.bin
+i915/glk_huc_4.0.0.bin
+i915/adlp_guc_70.bin
+i915/icl_guc_69.0.3.bin
+i915/kbl_dmc_ver1.bin
+i915/mtl_dmc_ver2_10.bin
+i915/skl_guc_ver6_1.bin
+i915/skl_guc_ver1.bin
+i915/dg1_guc_70.bin
+i915/dg1_guc_69.0.3.bin
+i915/tgl_dmc_ver2_06.bin
+i915/skl_guc_49.0.1.bin
+i915/skl_guc_69.0.3.bin
+i915/dg2_dmc_ver2_08.bin
+i915/dg2_dmc_ver2_07.bin
+i915/bxt_guc_32.0.3.bin
+i915/skl_guc_ver9_33.bin
+i915/adlp_dmc_ver2_09.bin
+i915/glk_guc_69.0.3.bin
+i915/adlp_dmc_ver2_14.bin
+i915/skl_dmc_ver1_26.bin
+i915/glk_guc_33.0.0.bin
+i915/dg1_huc_7.9.3.bin
+i915/ehl_guc_70.1.1.bin
+i915/bxt_dmc_ver1_07.bin
+i915/tgl_dmc_ver2_04.bin
+i915/bxt_guc_ver9_29.bin
+i915/skl_dmc_ver1_23.bin
+i915/adlp_dmc_ver2_10.bin
+i915/bxt_guc_70.1.1.bin
+i915/skl_guc_ver6.bin
+i915/adls_dmc_ver2_01.bin
+i915/tgl_huc_7.0.12.bin
+i915/ehl_guc_62.0.0.bin
+i915/glk_guc_70.1.1.bin
+i915/dg2_guc_70.4.1.bin
+i915/bxt_dmc_ver1.bin
+i915/kbl_dmc_ver1_04.bin
+i915/glk_dmc_ver1_04.bin
+i915/xe2lpd_dmc.bin
+i915/kbl_guc_ver9_14.bin
+i915/icl_huc_ver8_4_3238.bin
+i915/cnl_dmc_ver1_07.bin
+i915/bxt_huc_ver01_07_1398.bin
+i915/kbl_guc_62.0.0.bin
+i915/icl_guc_70.1.1.bin
+i915/icl_dmc_ver1_07.bin
+i915/icl_guc_32.0.3.bin
+i915/dg1_huc_7.7.1.bin
+i915/icl_guc_33.0.0.bin
+i915/dg1_guc_70.1.1.bin
+i915/dg2_huc_gsc.bin
+i915/mtl_gsc_1.bin
+i915/bxt_guc_49.0.1.bin
+i915/dg1_guc_49.0.1.bin
+i915/skl_huc_2.0.0.bin
+i915/ehl_guc_33.0.4.bin
+i915/bxt_huc_2.0.0.bin
+i915/bxt_huc_ver01_8_2893.bin
+i915/adlp_dmc.bin
+i915/kbl_guc_32.0.3.bin
+i915/dg1_dmc_ver2_02.bin
+i915/ehl_guc_49.0.1.bin
+i915/skl_dmc_ver1.bin
+i915/adlp_guc_62.0.3.bin
+i915/tgl_guc_69.0.3.bin
+i915/cml_huc_4.0.0.bin
+i915/bxt_guc_62.0.0.bin
+i915/adlp_dmc_ver2_16.bin
+i915/dg2_guc_70.bin
+i915/skl_dmc_ver1_27.bin
+i915/tgl_dmc_ver2_12.bin
+i915/rkl_dmc_ver2_03.bin
+i915/skl_guc_62.0.0.bin
+i915/icl_dmc_ver1_09.bin
+i915/bxt_guc_33.0.0.bin
+i915/skl_guc_70.1.1.bin
+i915/kbl_huc_4.0.0.bin
+i915/tgl_guc_70.bin
+i915/skl_guc_33.0.0.bin
+i915/mtl_guc_70.bin
+i915/skl_huc_ver01_07_1398.bin
+i915/kbl_guc_33.0.0.bin
+i915/cnl_dmc_ver1_06.bin
+i915/rkl_dmc_ver2_02.bin
+i915/tgl_guc_49.0.1.bin
+i915/tgl_guc_35.2.0.bin
+i915/dg1_guc_62.0.0.bin
+i915/cml_guc_70.1.1.bin
+i915/kbl_dmc_ver1_01.bin
+i915/kbl_guc_69.0.3.bin
+i915/tgl_dmc_ver2_08.bin
+i915/tgl_huc_7.0.3.bin
+i915/dg1_huc.bin
+i915/icl_guc_62.0.0.bin
+i915/tgl_guc_62.0.0.bin
+i915/skl_guc_ver4.bin
+i915/tgl_guc_70.1.1.bin
+i915/bxt_guc_69.0.3.bin
+i915/mtl_huc_gsc.bin
+i915/tgl_huc.bin
+i915/mtl_dmc.bin
+i915/ehl_guc_69.0.3.bin
+i915/adlp_dmc_ver2_12.bin
+i915/kbl_guc_49.0.1.bin
+i915/adlp_guc_70.1.1.bin
+imx/sdma/sdma-imx6q.bin
+imx/sdma/sdma-imx7d.bin
+inside-secure/eip197_minifw/ipue.bin
+inside-secure/eip197_minifw/ifpp.bin
+intel/ibt-0180-0041.sfi
+intel/ibt-0180-4150.ddc
+intel/dsp_fw_kbl.bin
+intel/ibt-12-16.ddc
+intel/ibt-19-0-4.sfi
+intel/fw_sst_22a8.bin
+intel/dsp_fw_kbl_v1037.bin
+intel/dsp_fw_kbl_v701.bin
+intel/ibt-0040-0041.ddc
+intel/ibt-19-0-4.ddc
+intel/dsp_fw_glk_v2880.bin
+intel/fw_sst_0f28_ssp0.bin
+intel/ibt-19-240-1.sfi
+intel/ibt-1040-1020.ddc
+intel/ibt-hw-37.8.10-fw-22.50.19.14.f.bseq
+intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq
+intel/ibt-19-16-4.sfi
+intel/dsp_fw_release_v969.bin
+intel/ibt-0291-0291.sfi
+intel/ibt-19-0-1.ddc
+intel/ibt-0291-0291.ddc
+intel/ibt-11-5.ddc
+intel/fw_sst_0f28.bin-48kHz_i2s_master
+intel/dsp_fw_glk_v2768.bin
+intel/ibt-0040-0041.sfi
+intel/ibt-1040-1020.sfi
+intel/ibt-0040-1020.sfi
+intel/ibt-0040-2120.ddc
+intel/ish/ish_lnlm.bin
+intel/ibt-18-2.ddc
+intel/ibt-18-2.sfi
+intel/ibt-20-0-3.ddc
+intel/dsp_fw_bxtn_v3366.bin
+intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
+intel/dsp_fw_release_v3402.bin
+intel/ibt-19-16-4.ddc
+intel/ibt-1040-2120.ddc
+intel/vsc/ivsc_skucfg_ovti9738_0_1.bin
+intel/vsc/ivsc_skucfg_ovti02c1_0_1.bin
+intel/vsc/ivsc_skucfg_ovti2740_0_1.bin
+intel/vsc/ivsc_skucfg_int3537_0_1.bin
+intel/vsc/ivsc_pkg_himx2170_0.bin
+intel/vsc/ivsc_skucfg_himx2170_0_1.bin
+intel/vsc/ivsc_skucfg_ovti01a0_0_1.bin
+intel/vsc/ivsc_skucfg_himx11b1_0_1.bin
+intel/vsc/ivsc_skucfg_ovti9734_0_1.bin
+intel/vsc/ivsc_skucfg_ovti01af_0_1.bin
+intel/vsc/ivsc_fw.bin
+intel/vsc/ivsc_skucfg_ovti01as_0_1.bin
+intel/vsc/ivsc_skucfg_ovti02e1_0_1.bin
+intel/vsc/ivsc_pkg_ovti01af_0.bin
+intel/vsc/ivsc_skucfg_himx2172_0_1.bin
+intel/vsc/ivsc_pkg_ovti9734_0.bin
+intel/vsc/ivsc_pkg_himx11b1_0.bin
+intel/vsc/ivsc_pkg_ovti02e1_0.bin
+intel/vsc/ivsc_pkg_ovti01a0_0.bin
+intel/vsc/ivsc_pkg_ovti01as_0.bin
+intel/vsc/ivsc_pkg_ovti9738_0.bin
+intel/vsc/ivsc_pkg_himx2172_0.bin
+intel/vsc/ivsc_pkg_ovti2740_0.bin
+intel/vsc/ivsc_skucfg_ovti5678_0_1.bin
+intel/vsc/ivsc_pkg_int3537_0.bin
+intel/vsc/ivsc_skucfg_hi556_0_1.bin
+intel/vsc/ivsc_pkg_ovti5678_0.bin
+intel/vsc/ivsc_pkg_hi556_0.bin
+intel/vsc/ivsc_pkg_ovti02c1_0.bin
+intel/ibt-18-16-1.sfi
+intel/ibt-20-0-3.sfi
+intel/ibt-0040-1050.ddc
+intel/ibt-hw-37.7.bseq
+intel/ipu/ipu6_fw.bin
+intel/ipu/ipu6ep_fw.bin
+intel/ipu/ipu6epadln_fw.bin
+intel/ipu/ipu6se_fw.bin
+intel/ipu/ipu6epmtl_fw.bin
+intel/ipu/shisp_2400b0_v21.bin
+intel/ipu/irci_irci_ecr-master_20161208_0213_20170112_1500.bin
+intel/ipu/shisp_2401a0_v21.bin
+intel/ibt-18-16-1.ddc
+intel/ibt-1040-2120.sfi
+intel/ibt-1040-0041.ddc
+intel/ibt-0041-0041.ddc
+intel/ibt-19-240-1.ddc
+intel/ibt-0040-2120.sfi
+intel/ibt-18-1.ddc
+intel/ibt-0180-1050.ddc
+intel/ibt-20-1-3.sfi
+intel/dsp_fw_cnl.bin
+intel/ibt-19-0-0.ddc
+intel/ibt-19-32-1.sfi
+intel/avs/skl/dsp_basefw.bin
+intel/avs/skl/dsp_mod_7CAD0808-AB10-CD23-EF45-12AB34CD56EF.bin
+intel/avs/cnl/dsp_basefw.bin
+intel/avs/apl/dsp_basefw.bin
+intel/ibt-0041-0041.sfi
+intel/ibt-19-240-4.ddc
+intel/ibt-0180-4150.sfi
+intel/ibt-20-1-4.sfi
+intel/ibt-17-16-1.ddc
+intel/ibt-1040-1050.sfi
+intel/ibt-17-1.sfi
+intel/ibt-17-2.ddc
+intel/dsp_fw_kbl_v2630.bin
+intel/ibt-17-0-1.ddc
+intel/ibt-18-1.sfi
+intel/ibt-19-0-3.sfi
+intel/dsp_fw_glk_v3366.bin
+intel/ibt-18-0-1.sfi
+intel/ibt-hw-37.7.10-fw-1.0.2.3.d.bseq
+intel/ibt-17-2.sfi
+intel/ibt-18-0-1.ddc
+intel/dsp_fw_release.bin
+intel/ibt-0180-0041.ddc
+intel/ibt-hw-37.7.10-fw-1.0.1.2d.d.bseq
+intel/ibt-19-32-4.sfi
+intel/fw_sst_0f28.bin
+intel/ibt-hw-37.7.10-fw-1.80.1.2d.d.bseq
+intel/ibt-20-1-3.ddc
+intel/ibt-19-240-4.sfi
+intel/ibt-0180-1050.sfi
+intel/dsp_fw_kbl_v3420.bin
+intel/ibt-20-1-4.ddc
+intel/ibt-19-32-4.ddc
+intel/ibt-19-32-0.sfi
+intel/dsp_fw_cnl_v1191.bin
+intel/ibt-19-32-0.ddc
+intel/dsp_fw_kbl_v2042.bin
+intel/ibt-0040-4150.ddc
+intel/ibt-0040-1020.ddc
+intel/catpt/bdw/dsp_basefw.bin
+intel/ibt-17-1.ddc
+intel/dsp_fw_cnl_v1858.bin
+intel/dsp_fw_kbl_v3402.bin
+intel/dsp_fw_kbl_v3266.bin
+intel/ibt-1040-0041.sfi
+intel/ibt-0040-4150.sfi
+intel/ibt-12-16.sfi
+intel/dsp_fw_bxtn.bin
+intel/ipu3-fw.bin
+intel/dsp_fw_glk.bin
+intel/ibt-1040-1050.ddc
+intel/ibt-19-0-0.sfi
+intel/ice/ddp-lag/ice_lag-1.3.1.0.pkg
+intel/ice/ddp-comms/ice_comms-1.3.45.0.pkg
+intel/ice/ddp-wireless_edge/ice_wireless_edge-1.3.13.0.pkg
+intel/ice/ddp/ice-1.3.36.0.pkg
+intel/ice/ddp/ice.pkg
+intel/ibt-1040-4150.sfi
+intel/ibt-0040-1050.sfi
+intel/ibt-17-16-1.sfi
+intel/ibt-hw-37.7.10-fw-1.80.2.3.d.bseq
+intel/dsp_fw_glk_v1814.bin
+intel/ibt-11-5.sfi
+intel/irci_irci_ecr-master_20161208_0213_20170112_1500.bin
+intel/IntcSST2.bin
+intel/ibt-19-32-1.ddc
+intel/dsp_fw_bxtn_v2219.bin
+intel/ibt-19-0-3.ddc
+intel/ibt-19-0-1.sfi
+intel/ibt-1040-4150.ddc
+intel/ibt-17-0-1.sfi
+intel/ibt-hw-37.8.bseq
+isci/isci_firmware.bin
+isdbt_nova_12mhz.inp
+isdbt_nova_12mhz_b0.inp
+isdbt_rio.inp
+iwlwifi-100-5.ucode
+iwlwifi-1000-5.ucode
+iwlwifi-105-6.ucode
+iwlwifi-135-6.ucode
+iwlwifi-2000-6.ucode
+iwlwifi-2030-6.ucode
+iwlwifi-3160-17.ucode
+iwlwifi-3168-29.ucode
+iwlwifi-3945-2.ucode
+iwlwifi-4965-2.ucode
+iwlwifi-5000-5.ucode
+iwlwifi-5150-2.ucode
+iwlwifi-6000-4.ucode
+iwlwifi-6000g2a-6.ucode
+iwlwifi-6000g2b-6.ucode
+iwlwifi-6050-5.ucode
+iwlwifi-7260-17.ucode
+iwlwifi-7265-17.ucode
+iwlwifi-7265D-29.ucode
+iwlwifi-8000C-34.ucode
+iwlwifi-8000C-36.ucode
+iwlwifi-8265-34.ucode
+iwlwifi-8265-36.ucode
+iwlwifi-9000-pu-b0-jf-b0-34.ucode
+iwlwifi-9000-pu-b0-jf-b0-38.ucode
+iwlwifi-9000-pu-b0-jf-b0-46.ucode
+iwlwifi-9260-th-b0-jf-b0-34.ucode
+iwlwifi-9260-th-b0-jf-b0-38.ucode
+iwlwifi-9260-th-b0-jf-b0-46.ucode
+iwlwifi-Qu-b0-hr-b0-50.ucode
+iwlwifi-Qu-b0-hr-b0-59.ucode
+iwlwifi-Qu-b0-hr-b0-66.ucode
+iwlwifi-Qu-b0-hr-b0-72.ucode
+iwlwifi-Qu-b0-hr-b0-73.ucode
+iwlwifi-Qu-b0-hr-b0-74.ucode
+iwlwifi-Qu-b0-hr-b0-77.ucode
+iwlwifi-Qu-b0-jf-b0-50.ucode
+iwlwifi-Qu-b0-jf-b0-59.ucode
+iwlwifi-Qu-b0-jf-b0-66.ucode
+iwlwifi-Qu-b0-jf-b0-72.ucode
+iwlwifi-Qu-b0-jf-b0-73.ucode
+iwlwifi-Qu-b0-jf-b0-74.ucode
+iwlwifi-Qu-b0-jf-b0-77.ucode
+iwlwifi-Qu-c0-hr-b0-50.ucode
+iwlwifi-Qu-c0-hr-b0-59.ucode
+iwlwifi-Qu-c0-hr-b0-66.ucode
+iwlwifi-Qu-c0-hr-b0-72.ucode
+iwlwifi-Qu-c0-hr-b0-73.ucode
+iwlwifi-Qu-c0-hr-b0-74.ucode
+iwlwifi-Qu-c0-hr-b0-77.ucode
+iwlwifi-Qu-c0-jf-b0-50.ucode
+iwlwifi-Qu-c0-jf-b0-59.ucode
+iwlwifi-Qu-c0-jf-b0-66.ucode
+iwlwifi-Qu-c0-jf-b0-72.ucode
+iwlwifi-Qu-c0-jf-b0-73.ucode
+iwlwifi-Qu-c0-jf-b0-74.ucode
+iwlwifi-Qu-c0-jf-b0-77.ucode
+iwlwifi-QuZ-a0-hr-b0-50.ucode
+iwlwifi-QuZ-a0-hr-b0-59.ucode
+iwlwifi-QuZ-a0-hr-b0-66.ucode
+iwlwifi-QuZ-a0-hr-b0-72.ucode
+iwlwifi-QuZ-a0-hr-b0-73.ucode
+iwlwifi-QuZ-a0-hr-b0-74.ucode
+iwlwifi-QuZ-a0-hr-b0-77.ucode
+iwlwifi-QuZ-a0-jf-b0-50.ucode
+iwlwifi-QuZ-a0-jf-b0-59.ucode
+iwlwifi-QuZ-a0-jf-b0-66.ucode
+iwlwifi-QuZ-a0-jf-b0-72.ucode
+iwlwifi-QuZ-a0-jf-b0-73.ucode
+iwlwifi-QuZ-a0-jf-b0-74.ucode
+iwlwifi-QuZ-a0-jf-b0-77.ucode
+iwlwifi-cc-a0-50.ucode
+iwlwifi-cc-a0-59.ucode
+iwlwifi-cc-a0-66.ucode
+iwlwifi-cc-a0-72.ucode
+iwlwifi-cc-a0-73.ucode
+iwlwifi-cc-a0-74.ucode
+iwlwifi-cc-a0-77.ucode
+iwlwifi-gl-c0-fm-c0-83.ucode
+iwlwifi-gl-c0-fm-c0-86.ucode
+iwlwifi-gl-c0-fm-c0-90.ucode
+iwlwifi-gl-c0-fm-c0.pnvm
+iwlwifi-ma-b0-gf-a0-83.ucode
+iwlwifi-ma-b0-gf-a0-86.ucode
+iwlwifi-ma-b0-gf-a0-89.ucode
+iwlwifi-ma-b0-gf-a0.pnvm
+iwlwifi-ma-b0-gf4-a0-83.ucode
+iwlwifi-ma-b0-gf4-a0-86.ucode
+iwlwifi-ma-b0-gf4-a0-89.ucode
+iwlwifi-ma-b0-gf4-a0.pnvm
+iwlwifi-ma-b0-hr-b0-83.ucode
+iwlwifi-ma-b0-hr-b0-86.ucode
+iwlwifi-ma-b0-hr-b0-89.ucode
+iwlwifi-so-a0-gf-a0-72.ucode
+iwlwifi-so-a0-gf-a0-73.ucode
+iwlwifi-so-a0-gf-a0-74.ucode
+iwlwifi-so-a0-gf-a0-77.ucode
+iwlwifi-so-a0-gf-a0-78.ucode
+iwlwifi-so-a0-gf-a0-79.ucode
+iwlwifi-so-a0-gf-a0-81.ucode
+iwlwifi-so-a0-gf-a0-83.ucode
+iwlwifi-so-a0-gf-a0-84.ucode
+iwlwifi-so-a0-gf-a0-86.ucode
+iwlwifi-so-a0-gf-a0-89.ucode
+iwlwifi-so-a0-gf-a0.pnvm
+iwlwifi-so-a0-gf4-a0-72.ucode
+iwlwifi-so-a0-gf4-a0-73.ucode
+iwlwifi-so-a0-gf4-a0-74.ucode
+iwlwifi-so-a0-gf4-a0-77.ucode
+iwlwifi-so-a0-gf4-a0-78.ucode
+iwlwifi-so-a0-gf4-a0-79.ucode
+iwlwifi-so-a0-gf4-a0-81.ucode
+iwlwifi-so-a0-gf4-a0-83.ucode
+iwlwifi-so-a0-gf4-a0-84.ucode
+iwlwifi-so-a0-gf4-a0-86.ucode
+iwlwifi-so-a0-gf4-a0-89.ucode
+iwlwifi-so-a0-gf4-a0.pnvm
+iwlwifi-so-a0-hr-b0-72.ucode
+iwlwifi-so-a0-hr-b0-73.ucode
+iwlwifi-so-a0-hr-b0-74.ucode
+iwlwifi-so-a0-hr-b0-77.ucode
+iwlwifi-so-a0-hr-b0-79.ucode
+iwlwifi-so-a0-hr-b0-81.ucode
+iwlwifi-so-a0-hr-b0-83.ucode
+iwlwifi-so-a0-hr-b0-84.ucode
+iwlwifi-so-a0-hr-b0-86.ucode
+iwlwifi-so-a0-hr-b0-89.ucode
+iwlwifi-so-a0-jf-b0-72.ucode
+iwlwifi-so-a0-jf-b0-73.ucode
+iwlwifi-so-a0-jf-b0-74.ucode
+iwlwifi-so-a0-jf-b0-77.ucode
+iwlwifi-ty-a0-gf-a0-59.ucode
+iwlwifi-ty-a0-gf-a0-66.ucode
+iwlwifi-ty-a0-gf-a0-72.ucode
+iwlwifi-ty-a0-gf-a0-73.ucode
+iwlwifi-ty-a0-gf-a0-74.ucode
+iwlwifi-ty-a0-gf-a0-77.ucode
+iwlwifi-ty-a0-gf-a0-78.ucode
+iwlwifi-ty-a0-gf-a0-79.ucode
+iwlwifi-ty-a0-gf-a0-81.ucode
+iwlwifi-ty-a0-gf-a0-83.ucode
+iwlwifi-ty-a0-gf-a0-84.ucode
+iwlwifi-ty-a0-gf-a0-86.ucode
+iwlwifi-ty-a0-gf-a0-89.ucode
+iwlwifi-ty-a0-gf-a0.pnvm
+ixp4xx/NPE-A
+ixp4xx/NPE-B
+ixp4xx/NPE-C
+ixp4xx/NPE-A-HSS
+kaweth/new_code_fix.bin
+kaweth/trigger_code.bin
+kaweth/new_code.bin
+kaweth/trigger_code_fix.bin
+keyspan/usa28x.fw
+keyspan/usa28.fw
+keyspan/usa49w.fw
+keyspan/usa19w.fw
+keyspan/mpr.fw
+keyspan/usa28xa.fw
+keyspan/usa19qi.fw
+keyspan/usa19.fw
+keyspan/usa19qw.fw
+keyspan/usa49wlc.fw
+keyspan/usa28xb.fw
+keyspan/usa18x.fw
+keyspan_pda/keyspan_pda.fw
+keyspan_pda/xircom_pgs.fw
+lbtf_usb.bin
+libertas/cf8385.bin
+libertas/sd8686_v9.bin
+libertas/usb8388_v9.bin
+libertas/sd8688.bin
+libertas/usb8388_v5.bin
+libertas/gspi8688_helper.bin
+libertas/usb8682.bin
+libertas/cf8381_helper.bin
+libertas/sd8686_v9_helper.bin
+libertas/cf8381.bin
+libertas/gspi8682.bin
+libertas/lbtf_sdio.bin
+libertas/gspi8686_v9.bin
+libertas/sd8682_helper.bin
+libertas/usb8388_olpc.bin
+libertas/cf8385_helper.bin
+libertas/sd8686_v8.bin
+libertas/sd8385.bin
+libertas/sd8682.bin
+libertas/sd8385_helper.bin
+libertas/sd8686_v8_helper.bin
+libertas/gspi8688.bin
+libertas/gspi8682_helper.bin
+libertas/gspi8686_v9_helper.bin
+libertas/sd8688_helper.bin
+liquidio/lio_23xx_nic.bin
+liquidio/lio_210nv_nic.bin
+liquidio/lio_410nv_nic.bin
+liquidio/lio_210sv_nic.bin
+lt9611uxc_fw.bin
+matrox/g200_warp.fw
+matrox/g400_warp.fw
+mediatek/mt7610u.bin
+mediatek/mt7915_wa.bin
+mediatek/mt7915_rom_patch.bin
+mediatek/mt7615_rom_patch.bin
+mediatek/mt8186/scp.img
+mediatek/mt8192/scp.img
+mediatek/mt7662u_rom_patch.bin
+mediatek/mt7915_eeprom_dbdc.bin
+mediatek/mt7986_rom_patch.bin
+mediatek/mt7915_wm.bin
+mediatek/mt7663_n9_v3.bin
+mediatek/sof/sof-mt8186.ldc
+mediatek/sof/sof-mt8186.ri
+mediatek/sof/sof-mt8195.ldc
+mediatek/sof/sof-mt8195.ri
+mediatek/mt7601u.bin
+mediatek/mt7996/mt7996_eeprom.bin
+mediatek/mt7996/mt7996_wm.bin
+mediatek/mt7996/mt7996_wa.bin
+mediatek/mt7996/mt7996_rom_patch.bin
+mediatek/mt7996/mt7996_dsp.bin
+mediatek/mt8195/scp.img
+mediatek/mt7925/WIFI_MT7925_PATCH_MCU_1_1_hdr.bin
+mediatek/mt7925/WIFI_RAM_CODE_MT7925_1_1.bin
+mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin
+mediatek/mt7981_wo.bin
+mediatek/mt7986_eeprom_mt7976_dbdc.bin
+mediatek/mt7981_wa.bin
+mediatek/WIFI_RAM_CODE_MT7961_1.bin
+mediatek/mt7986_wa.bin
+mediatek/mt7986_wo_1.bin
+mediatek/mt7622_rom_patch.bin
+mediatek/mt7610e.bin
+mediatek/sof-tplg/sof-mt8186.tplg
+mediatek/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682-dts.tplg
+mediatek/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682.tplg
+mediatek/mt7662.bin
+mediatek/mt7916_eeprom.bin
+mediatek/mt7986_wo_0.bin
+mediatek/mt7986_eeprom_mt7976.bin
+mediatek/mt7981_rom_patch.bin
+mediatek/mt7650.bin
+mediatek/mt7615_n9.bin
+mediatek/mt7916_wm.bin
+mediatek/mt7916_wa.bin
+mediatek/mt7986_eeprom_mt7976_dual.bin
+mediatek/mt7650e.bin
+mediatek/WIFI_RAM_CODE_MT7922_1.bin
+mediatek/mt7662_rom_patch.bin
+mediatek/mt7915_eeprom.bin
+mediatek/mt7668pr2h.bin
+mediatek/mt8173/vpu_d.bin
+mediatek/mt8173/vpu_p.bin
+mediatek/mt7916_rom_patch.bin
+mediatek/mt7663pr2h.bin
+mediatek/mt7662u.bin
+mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin
+mediatek/mt7622_n9.bin
+mediatek/mt7622pr2h.bin
+mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin
+mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
+mediatek/mt7663_n9_rebb.bin
+mediatek/mt8183/scp.img
+mediatek/mt7988/i2p5ge-phy-pmb.bin
+mediatek/mt7986_eeprom_mt7975_dual.bin
+mediatek/mt7663pr2h_rebb.bin
+mediatek/mt7986_wm.bin
+mediatek/mt7615_cr4.bin
+mediatek/mt7986_wm_mt7975.bin
+mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin
+mediatek/mt7986_rom_patch_mt7975.bin
+mediatek/mt7981_wm.bin
+mellanox/lc_ini_bundle_2010_1502.bin
+mellanox/mlxsw_spectrum2-29.2010.1406.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1502.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2304.mfa2
+mellanox/mlxsw_spectrum2-29.2008.1312.mfa2
+mellanox/mlxsw_spectrum-13.1703.4.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2946.mfa2
+mellanox/mlxsw_spectrum3-30.2010.3020.mfa2
+mellanox/mlxsw_spectrum-13.2010.1406.mfa2
+mellanox/mlxsw_spectrum2-29.2010.3020.mfa2
+mellanox/mlxsw_spectrum2-29.2008.3326.mfa2
+mellanox/mlxsw_spectrum3-30.2008.3326.mfa2
+mellanox/mlxsw_spectrum-13.2008.2018.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2406.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1006.mfa2
+mellanox/mlxsw_spectrum3-30.2007.1168.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2438.mfa2
+mellanox/mlxsw_spectrum-13.2008.2946.mfa2
+mellanox/mlxsw_spectrum-13.2008.1036.mfa2
+mellanox/mlxsw_spectrum2-29.2000.2714.mfa2
+mellanox/lc_ini_bundle_2010_3020.bin
+mellanox/mlxsw_spectrum-13.1420.122.mfa2
+mellanox/mlxsw_spectrum2-29.2010.3146.mfa2
+mellanox/mlxsw_spectrum-13.2008.1310.mfa2
+mellanox/mlxsw_spectrum-13.2007.1168.mfa2
+mellanox/mlxsw_spectrum-13.2008.2304.mfa2
+mellanox/mlxsw_spectrum-13.2000.1122.mfa2
+mellanox/mlxsw_spectrum3-30.2012.1012.mfa2
+mellanox/mlxsw_spectrum-13.2010.1006.mfa2
+mellanox/mlxsw_spectrum-13.2010.1232.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2018.mfa2
+mellanox/mlxsw_spectrum-13.2008.2406.mfa2
+mellanox/mlxsw_spectrum2-29.2000.2308.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1232.mfa2
+mellanox/mlxsw_spectrum-13.2008.1312.mfa2
+mellanox/mlxsw_spectrum-13.2010.3020.mfa2
+mellanox/mlxsw_spectrum-13.2000.1886.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2018.mfa2
+mellanox/mlxsw_spectrum2-29.2008.2406.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1232.mfa2
+mellanox/mlxsw_spectrum2-29.2010.1006.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1406.mfa2
+mellanox/mlxsw_spectrum3-30.2008.1312.mfa2
+mellanox/mlxsw_spectrum-13.1702.6.mfa2
+mellanox/mlxsw_spectrum3-30.2010.3146.mfa2
+mellanox/mlxsw_spectrum-13.2012.1012.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2946.mfa2
+mellanox/mlxsw_spectrum2-29.2008.1036.mfa2
+mellanox/mlxsw_spectrum3-30.2010.1502.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2438.mfa2
+mellanox/lc_ini_bundle_2010_1006.bin
+mellanox/mlxsw_spectrum2-29.2008.1310.mfa2
+mellanox/mlxsw_spectrum3-30.2008.2304.mfa2
+mellanox/mlxsw_spectrum4-34.2012.1012.mfa2
+mellanox/mlxsw_spectrum-13.2000.2308.mfa2
+mellanox/mlxsw_spectrum-13.1530.152.mfa2
+mellanox/mlxsw_spectrum-13.1620.192.mfa2
+mellanox/mlxsw_spectrum-13.2010.3146.mfa2
+mellanox/lc_ini_bundle_2010_3146.bin
+mellanox/mlxsw_spectrum-13.2008.2438.mfa2
+mellanox/mlxsw_spectrum-13.2000.2714.mfa2
+mellanox/mlxsw_spectrum-13.2010.1502.mfa2
+mellanox/mlxsw_spectrum-13.2008.3326.mfa2
+mellanox/mlxsw_spectrum3-30.2008.1036.mfa2
+mellanox/mlxsw_spectrum2-29.2012.1012.mfa2
+mellanox/mlxsw_spectrum3-30.2008.1310.mfa2
+mellanox/mlxsw_spectrum2-29.2007.1168.mfa2
+mellanox/mlxsw_spectrum-13.1910.622.mfa2
+meson/vdec/sm1_hevc_mmu.bin
+meson/vdec/gxl_mjpeg.bin
+meson/vdec/g12a_vp9.bin
+meson/vdec/sm1_vp9_mmu.bin
+meson/vdec/g12a_h264.bin
+meson/vdec/gxm_h264.bin
+meson/vdec/g12a_hevc_mmu.bin
+meson/vdec/gxl_mpeg12.bin
+meson/vdec/gxbb_h264.bin
+meson/vdec/gxl_hevc_mmu.bin
+meson/vdec/gxl_vp9.bin
+meson/vdec/gxl_h264.bin
+meson/vdec/gxl_h263.bin
+meson/vdec/gxl_mpeg4_5.bin
+meson/vdec/gxl_hevc.bin
+microchip/mscc_vsc8574_revb_int8051_29e8.bin
+microchip/mscc_vsc8584_revb_int8051_fb48.bin
+moxa/moxa-1450.fw
+moxa/moxa-1251.fw
+moxa/moxa-1150.fw
+moxa/moxa-1410.fw
+moxa/moxa-1658.fw
+moxa/moxa-1653.fw
+moxa/moxa-1618.fw
+moxa/moxa-1250.fw
+moxa/moxa-1130.fw
+moxa/moxa-1613.fw
+moxa/moxa-1110.fw
+moxa/moxa-1131.fw
+moxa/moxa-1451.fw
+moxa/moxa-1151.fw
+mrvl/usb8766_uapsta.bin
+mrvl/prestera/mvsw_prestera_fw-v2.0.img
+mrvl/prestera/mvsw_prestera_fw-v4.0.img
+mrvl/prestera/mvsw_prestera_fw-v3.0.img
+mrvl/prestera/mvsw_prestera_fw-v4.1.img
+mrvl/prestera/mvsw_prestera_fw_arm64-v4.1.img
+mrvl/usb8797_uapsta.bin
+mrvl/sd8897_uapsta.bin
+mrvl/usb8801_uapsta.bin
+mrvl/sd8688.bin
+mrvl/pcie8997_wlan_v4.bin
+mrvl/cpt01/ae.out
+mrvl/cpt01/se.out
+mrvl/cpt01/ie.out
+mrvl/cpt04/ae.out
+mrvl/cpt04/se.out
+mrvl/cpt04/ie.out
+mrvl/pcie8897_uapsta.bin
+mrvl/cpt02/ae.out
+mrvl/cpt02/se.out
+mrvl/cpt02/ie.out
+mrvl/cpt03/ae.out
+mrvl/cpt03/se.out
+mrvl/cpt03/ie.out
+mrvl/sd8887_uapsta.bin
+mrvl/sdsd8977_combo_v2.bin
+mrvl/sd8801_uapsta.bin
+mrvl/sd8797_uapsta.bin
+mrvl/sdsd8997_combo_v4.bin
+mrvl/usbusb8997_combo_v4.bin
+mrvl/pcieuart8997_combo_v4.bin
+mrvl/sd8688_helper.bin
+mrvl/sd8787_uapsta.bin
+mrvl/pcieusb8997_combo_v4.bin
+mrvl/usb8897_uapsta.bin
+mt7601u.bin
+mt7650.bin
+mt7662.bin
+mt7662_rom_patch.bin
+mts_cdma.fw
+mts_edge.fw
+mts_gsm.fw
+mwl8k/fmimage_8366.fw
+mwl8k/fmimage_8764_ap-1.fw
+mwl8k/fmimage_8366_ap-1.fw
+mwl8k/fmimage_8687.fw
+mwl8k/fmimage_8366_ap-2.fw
+mwl8k/fmimage_8366_ap-3.fw
+mwl8k/helper_8687.fw
+mwl8k/helper_8366.fw
+mwlwifi/88W8864.bin
+mwlwifi/88W8897.bin
+myri10ge_eth_big_z8e.dat
+myri10ge_eth_z8e.dat
+myri10ge_ethp_big_z8e.dat
+myri10ge_ethp_z8e.dat
+myri10ge_rss_eth_big_z8e.dat
+myri10ge_rss_eth_z8e.dat
+myri10ge_rss_ethp_big_z8e.dat
+myri10ge_rss_ethp_z8e.dat
+netronome/nic_AMDA0096-0001_2x10.nffw
+netronome/nic/nic_AMDA0096-0001_2x10.nffw
+netronome/nic/nic_AMDA0058-0012_2x40.nffw
+netronome/nic/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/nic/nic_AMDA0097-0001_8x10.nffw
+netronome/nic/nic_AMDA0081-0001_1x40.nffw
+netronome/nic/nic_AMDA0097-0001_2x40.nffw
+netronome/nic/nic_AMDA0078-0011_1x100.nffw
+netronome/nic/nic_AMDA0081-0001_4x10.nffw
+netronome/nic/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/nic/nic_AMDA0058-0011_2x40.nffw
+netronome/nic/nic_AMDA0099-0001_2x25.nffw
+netronome/nic/nic_AMDA0099-0001_2x10.nffw
+netronome/nic_AMDA0058-0012_2x40.nffw
+netronome/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/nic_AMDA0097-0001_8x10.nffw
+netronome/nic_AMDA0081-0001_1x40.nffw
+netronome/nic_AMDA0097-0001_2x40.nffw
+netronome/bpf/nic_AMDA0096-0001_2x10.nffw
+netronome/bpf/nic_AMDA0058-0012_2x40.nffw
+netronome/bpf/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/bpf/nic_AMDA0097-0001_8x10.nffw
+netronome/bpf/nic_AMDA0081-0001_1x40.nffw
+netronome/bpf/nic_AMDA0097-0001_2x40.nffw
+netronome/bpf/nic_AMDA0078-0011_1x100.nffw
+netronome/bpf/nic_AMDA0081-0001_4x10.nffw
+netronome/bpf/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/bpf/nic_AMDA0058-0011_2x40.nffw
+netronome/bpf/nic_AMDA0099-0001_2x25.nffw
+netronome/bpf/nic_AMDA0099-0001_2x10.nffw
+netronome/nic_AMDA0078-0011_1x100.nffw
+netronome/nic-sriov/nic_AMDA0096-0001_2x10.nffw
+netronome/nic-sriov/nic_AMDA0058-0012_2x40.nffw
+netronome/nic-sriov/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/nic-sriov/nic_AMDA0097-0001_8x10.nffw
+netronome/nic-sriov/nic_AMDA0081-0001_1x40.nffw
+netronome/nic-sriov/nic_AMDA0097-0001_2x40.nffw
+netronome/nic-sriov/nic_AMDA0078-0011_1x100.nffw
+netronome/nic-sriov/nic_AMDA0081-0001_4x10.nffw
+netronome/nic-sriov/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/nic-sriov/nic_AMDA0058-0011_2x40.nffw
+netronome/nic-sriov/nic_AMDA0099-0001_2x25.nffw
+netronome/nic-sriov/nic_AMDA0099-0001_2x10.nffw
+netronome/flower/nic_AMDA0096-0001_2x10.nffw
+netronome/flower/nic_AMDA0058-0011_4x10_1x40.nffw
+netronome/flower/nic_AMDA0096.nffw
+netronome/flower/nic_AMDA0058-0012_4x10_1x40.nffw
+netronome/flower/nic_AMDA0058-0012_2x40.nffw
+netronome/flower/nic_AMDA0099-0001_1x10_1x25.nffw
+netronome/flower/nic_AMDA0097-0001_8x10.nffw
+netronome/flower/nic_AMDA0078-0012_8x10.nffw
+netronome/flower/nic_AMDA0097.nffw
+netronome/flower/nic_AMDA0058-0012_8x10.nffw
+netronome/flower/nic_AMDA0081-0001_1x40.nffw
+netronome/flower/nic_AMDA0097-0001_2x40.nffw
+netronome/flower/nic_AMDA0078-0012_2x40.nffw
+netronome/flower/nic_AMDA0078-0011_1x100.nffw
+netronome/flower/nic_AMDA0058-0012_1x100.nffw
+netronome/flower/nic_AMDA0078-0012_1x100.nffw
+netronome/flower/nic_AMDA0081.nffw
+netronome/flower/nic_AMDA0078-0012_4x10_1x40.nffw
+netronome/flower/nic_AMDA0058-0011_1x100.nffw
+netronome/flower/nic_AMDA0099.nffw
+netronome/flower/nic_AMDA0058-0011_8x10.nffw
+netronome/flower/nic_AMDA0078-0011_4x10_1x40.nffw
+netronome/flower/nic_AMDA0081-0001_4x10.nffw
+netronome/flower/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/flower/nic_AMDA0058.nffw
+netronome/flower/nic_AMDA0058-0011_2x40.nffw
+netronome/flower/nic_AMDA0078-0011_8x10.nffw
+netronome/flower/nic_AMDA0099-0001_2x25.nffw
+netronome/flower/nic_AMDA0099-0001_2x10.nffw
+netronome/flower/nic_AMDA0078-0011_2x40.nffw
+netronome/nic_AMDA0081-0001_4x10.nffw
+netronome/nic_AMDA0097-0001_4x10_1x40.nffw
+netronome/nic_AMDA0058-0011_2x40.nffw
+netronome/nic_AMDA0099-0001_2x25.nffw
+netronome/nic_AMDA0099-0001_2x10.nffw
+nvidia/gp104/nvdec/scrubber.bin
+nvidia/gp104/gr/fecs_inst.bin
+nvidia/gp104/gr/fecs_sig.bin
+nvidia/gp104/gr/sw_bundle_init.bin
+nvidia/gp104/gr/gpccs_inst.bin
+nvidia/gp104/gr/fecs_data.bin
+nvidia/gp104/gr/gpccs_sig.bin
+nvidia/gp104/gr/gpccs_bl.bin
+nvidia/gp104/gr/fecs_bl.bin
+nvidia/gp104/gr/gpccs_data.bin
+nvidia/gp104/gr/sw_method_init.bin
+nvidia/gp104/gr/sw_ctx.bin
+nvidia/gp104/gr/sw_nonctx.bin
+nvidia/gp104/acr/ucode_load.bin
+nvidia/gp104/acr/ucode_unload.bin
+nvidia/gp104/acr/unload_bl.bin
+nvidia/gp104/acr/bl.bin
+nvidia/gp104/sec2/desc-1.bin
+nvidia/gp104/sec2/image.bin
+nvidia/gp104/sec2/desc.bin
+nvidia/gp104/sec2/image-1.bin
+nvidia/gp104/sec2/sig-1.bin
+nvidia/gp104/sec2/sig.bin
+nvidia/gv100/nvdec/scrubber.bin
+nvidia/gv100/gr/fecs_inst.bin
+nvidia/gv100/gr/fecs_sig.bin
+nvidia/gv100/gr/sw_bundle_init.bin
+nvidia/gv100/gr/gpccs_inst.bin
+nvidia/gv100/gr/fecs_data.bin
+nvidia/gv100/gr/gpccs_sig.bin
+nvidia/gv100/gr/gpccs_bl.bin
+nvidia/gv100/gr/fecs_bl.bin
+nvidia/gv100/gr/gpccs_data.bin
+nvidia/gv100/gr/sw_method_init.bin
+nvidia/gv100/gr/sw_ctx.bin
+nvidia/gv100/gr/sw_nonctx.bin
+nvidia/gv100/acr/ucode_load.bin
+nvidia/gv100/acr/ucode_unload.bin
+nvidia/gv100/acr/unload_bl.bin
+nvidia/gv100/acr/bl.bin
+nvidia/gv100/sec2/image.bin
+nvidia/gv100/sec2/desc.bin
+nvidia/gv100/sec2/sig.bin
+nvidia/ad104/gsp
+nvidia/ga102/nvdec/scrubber.bin
+nvidia/ga102/gr/fecs_sig.bin
+nvidia/ga102/gr/gpccs_sig.bin
+nvidia/ga102/gr/gpccs_bl.bin
+nvidia/ga102/gr/fecs_bl.bin
+nvidia/ga102/gr/NET_img.bin
+nvidia/ga102/acr/ucode_unload.bin
+nvidia/ga102/acr/ucode_ahesasc.bin
+nvidia/ga102/acr/ucode_asb.bin
+nvidia/ga102/gsp/gsp-535.113.01.bin
+nvidia/ga102/gsp/booter_unload-535.113.01.bin
+nvidia/ga102/gsp/bootloader-535.113.01.bin
+nvidia/ga102/gsp/booter_load-535.113.01.bin
+nvidia/ga102/sec2/hs_bl_sig.bin
+nvidia/ga102/sec2/image.bin
+nvidia/ga102/sec2/desc.bin
+nvidia/ga102/sec2/sig.bin
+nvidia/tu117/nvdec/scrubber.bin
+nvidia/tu117/gr/fecs_inst.bin
+nvidia/tu117/gr/fecs_sig.bin
+nvidia/tu117/gr/sw_bundle_init.bin
+nvidia/tu117/gr/gpccs_inst.bin
+nvidia/tu117/gr/fecs_data.bin
+nvidia/tu117/gr/gpccs_sig.bin
+nvidia/tu117/gr/gpccs_bl.bin
+nvidia/tu117/gr/fecs_bl.bin
+nvidia/tu117/gr/gpccs_data.bin
+nvidia/tu117/gr/sw_method_init.bin
+nvidia/tu117/gr/sw_ctx.bin
+nvidia/tu117/gr/sw_nonctx.bin
+nvidia/tu117/gr/sw_veid_bundle_init.bin
+nvidia/tu117/acr/ucode_unload.bin
+nvidia/tu117/acr/ucode_ahesasc.bin
+nvidia/tu117/acr/unload_bl.bin
+nvidia/tu117/acr/ucode_asb.bin
+nvidia/tu117/acr/bl.bin
+nvidia/tu117/gsp
+nvidia/tu117/sec2/image.bin
+nvidia/tu117/sec2/desc.bin
+nvidia/tu117/sec2/sig.bin
+nvidia/gp102/nvdec/scrubber.bin
+nvidia/gp102/gr/fecs_inst.bin
+nvidia/gp102/gr/fecs_sig.bin
+nvidia/gp102/gr/sw_bundle_init.bin
+nvidia/gp102/gr/gpccs_inst.bin
+nvidia/gp102/gr/fecs_data.bin
+nvidia/gp102/gr/gpccs_sig.bin
+nvidia/gp102/gr/gpccs_bl.bin
+nvidia/gp102/gr/fecs_bl.bin
+nvidia/gp102/gr/gpccs_data.bin
+nvidia/gp102/gr/sw_method_init.bin
+nvidia/gp102/gr/sw_ctx.bin
+nvidia/gp102/gr/sw_nonctx.bin
+nvidia/gp102/acr/ucode_load.bin
+nvidia/gp102/acr/ucode_unload.bin
+nvidia/gp102/acr/unload_bl.bin
+nvidia/gp102/acr/bl.bin
+nvidia/gp102/sec2/desc-1.bin
+nvidia/gp102/sec2/image.bin
+nvidia/gp102/sec2/desc.bin
+nvidia/gp102/sec2/image-1.bin
+nvidia/gp102/sec2/sig-1.bin
+nvidia/gp102/sec2/sig.bin
+nvidia/gp106/nvdec/scrubber.bin
+nvidia/gp106/gr/fecs_inst.bin
+nvidia/gp106/gr/fecs_sig.bin
+nvidia/gp106/gr/sw_bundle_init.bin
+nvidia/gp106/gr/gpccs_inst.bin
+nvidia/gp106/gr/fecs_data.bin
+nvidia/gp106/gr/gpccs_sig.bin
+nvidia/gp106/gr/gpccs_bl.bin
+nvidia/gp106/gr/fecs_bl.bin
+nvidia/gp106/gr/gpccs_data.bin
+nvidia/gp106/gr/sw_method_init.bin
+nvidia/gp106/gr/sw_ctx.bin
+nvidia/gp106/gr/sw_nonctx.bin
+nvidia/gp106/acr/ucode_load.bin
+nvidia/gp106/acr/ucode_unload.bin
+nvidia/gp106/acr/unload_bl.bin
+nvidia/gp106/acr/bl.bin
+nvidia/gp106/sec2/desc-1.bin
+nvidia/gp106/sec2/image.bin
+nvidia/gp106/sec2/desc.bin
+nvidia/gp106/sec2/image-1.bin
+nvidia/gp106/sec2/sig-1.bin
+nvidia/gp106/sec2/sig.bin
+nvidia/ad102/gsp/gsp-535.113.01.bin
+nvidia/ad102/gsp/booter_unload-535.113.01.bin
+nvidia/ad102/gsp/bootloader-535.113.01.bin
+nvidia/ad102/gsp/booter_load-535.113.01.bin
+nvidia/tegra210/vic.bin
+nvidia/tegra210/xusb.bin
+nvidia/tegra210/vic04_ucode.bin
+nvidia/gm204/gr/fecs_inst.bin
+nvidia/gm204/gr/fecs_sig.bin
+nvidia/gm204/gr/sw_bundle_init.bin
+nvidia/gm204/gr/gpccs_inst.bin
+nvidia/gm204/gr/fecs_data.bin
+nvidia/gm204/gr/gpccs_sig.bin
+nvidia/gm204/gr/gpccs_bl.bin
+nvidia/gm204/gr/fecs_bl.bin
+nvidia/gm204/gr/gpccs_data.bin
+nvidia/gm204/gr/sw_method_init.bin
+nvidia/gm204/gr/sw_ctx.bin
+nvidia/gm204/gr/sw_nonctx.bin
+nvidia/gm204/acr/ucode_load.bin
+nvidia/gm204/acr/ucode_unload.bin
+nvidia/gm204/acr/bl.bin
+nvidia/ad107/gsp
+nvidia/ad106/gsp
+nvidia/tu104/nvdec/scrubber.bin
+nvidia/tu104/gr/fecs_inst.bin
+nvidia/tu104/gr/fecs_sig.bin
+nvidia/tu104/gr/sw_bundle_init.bin
+nvidia/tu104/gr/gpccs_inst.bin
+nvidia/tu104/gr/fecs_data.bin
+nvidia/tu104/gr/gpccs_sig.bin
+nvidia/tu104/gr/gpccs_bl.bin
+nvidia/tu104/gr/fecs_bl.bin
+nvidia/tu104/gr/gpccs_data.bin
+nvidia/tu104/gr/sw_method_init.bin
+nvidia/tu104/gr/sw_ctx.bin
+nvidia/tu104/gr/sw_nonctx.bin
+nvidia/tu104/gr/sw_veid_bundle_init.bin
+nvidia/tu104/acr/ucode_unload.bin
+nvidia/tu104/acr/ucode_ahesasc.bin
+nvidia/tu104/acr/unload_bl.bin
+nvidia/tu104/acr/ucode_asb.bin
+nvidia/tu104/acr/bl.bin
+nvidia/tu104/gsp
+nvidia/tu104/sec2/image.bin
+nvidia/tu104/sec2/desc.bin
+nvidia/tu104/sec2/sig.bin
+nvidia/ga106/nvdec/scrubber.bin
+nvidia/ga106/gr/fecs_sig.bin
+nvidia/ga106/gr/gpccs_sig.bin
+nvidia/ga106/gr/gpccs_bl.bin
+nvidia/ga106/gr/fecs_bl.bin
+nvidia/ga106/gr/NET_img.bin
+nvidia/ga106/acr/ucode_unload.bin
+nvidia/ga106/acr/ucode_ahesasc.bin
+nvidia/ga106/acr/ucode_asb.bin
+nvidia/ga106/gsp
+nvidia/ga106/sec2/hs_bl_sig.bin
+nvidia/ga106/sec2/image.bin
+nvidia/ga106/sec2/desc.bin
+nvidia/ga106/sec2/sig.bin
+nvidia/ga103/nvdec/scrubber.bin
+nvidia/ga103/gr/fecs_sig.bin
+nvidia/ga103/gr/gpccs_sig.bin
+nvidia/ga103/gr/gpccs_bl.bin
+nvidia/ga103/gr/fecs_bl.bin
+nvidia/ga103/gr/NET_img.bin
+nvidia/ga103/acr/ucode_unload.bin
+nvidia/ga103/acr/ucode_ahesasc.bin
+nvidia/ga103/acr/ucode_asb.bin
+nvidia/ga103/gsp
+nvidia/ga103/sec2/hs_bl_sig.bin
+nvidia/ga103/sec2/image.bin
+nvidia/ga103/sec2/desc.bin
+nvidia/ga103/sec2/sig.bin
+nvidia/gm20b/gr/fecs_inst.bin
+nvidia/gm20b/gr/fecs_sig.bin
+nvidia/gm20b/gr/sw_bundle_init.bin
+nvidia/gm20b/gr/gpccs_inst.bin
+nvidia/gm20b/gr/fecs_data.bin
+nvidia/gm20b/gr/fecs_bl.bin
+nvidia/gm20b/gr/gpccs_data.bin
+nvidia/gm20b/gr/sw_method_init.bin
+nvidia/gm20b/gr/sw_ctx.bin
+nvidia/gm20b/gr/sw_nonctx.bin
+nvidia/gm20b/pmu/image.bin
+nvidia/gm20b/pmu/desc.bin
+nvidia/gm20b/pmu/sig.bin
+nvidia/gm20b/acr/ucode_load.bin
+nvidia/gm20b/acr/bl.bin
+nvidia/ga107/nvdec/scrubber.bin
+nvidia/ga107/gr/fecs_sig.bin
+nvidia/ga107/gr/gpccs_sig.bin
+nvidia/ga107/gr/gpccs_bl.bin
+nvidia/ga107/gr/fecs_bl.bin
+nvidia/ga107/gr/NET_img.bin
+nvidia/ga107/acr/ucode_unload.bin
+nvidia/ga107/acr/ucode_ahesasc.bin
+nvidia/ga107/acr/ucode_asb.bin
+nvidia/ga107/gsp
+nvidia/ga107/sec2/hs_bl_sig.bin
+nvidia/ga107/sec2/image.bin
+nvidia/ga107/sec2/desc.bin
+nvidia/ga107/sec2/sig.bin
+nvidia/ga104/nvdec/scrubber.bin
+nvidia/ga104/gr/fecs_sig.bin
+nvidia/ga104/gr/gpccs_sig.bin
+nvidia/ga104/gr/gpccs_bl.bin
+nvidia/ga104/gr/fecs_bl.bin
+nvidia/ga104/gr/NET_img.bin
+nvidia/ga104/acr/ucode_unload.bin
+nvidia/ga104/acr/ucode_ahesasc.bin
+nvidia/ga104/acr/ucode_asb.bin
+nvidia/ga104/gsp
+nvidia/ga104/sec2/hs_bl_sig.bin
+nvidia/ga104/sec2/image.bin
+nvidia/ga104/sec2/desc.bin
+nvidia/ga104/sec2/sig.bin
+nvidia/tu10x/typec/ccg_secondary.cyacd
+nvidia/tu10x/typec/ccg_primary.cyacd
+nvidia/tu10x/typec/ccg_boot.cyacd
+nvidia/ad103/gsp
+nvidia/gm206/gr/fecs_inst.bin
+nvidia/gm206/gr/fecs_sig.bin
+nvidia/gm206/gr/sw_bundle_init.bin
+nvidia/gm206/gr/gpccs_inst.bin
+nvidia/gm206/gr/fecs_data.bin
+nvidia/gm206/gr/gpccs_sig.bin
+nvidia/gm206/gr/gpccs_bl.bin
+nvidia/gm206/gr/fecs_bl.bin
+nvidia/gm206/gr/gpccs_data.bin
+nvidia/gm206/gr/sw_method_init.bin
+nvidia/gm206/gr/sw_ctx.bin
+nvidia/gm206/gr/sw_nonctx.bin
+nvidia/gm206/acr/ucode_load.bin
+nvidia/gm206/acr/ucode_unload.bin
+nvidia/gm206/acr/bl.bin
+nvidia/gk20a/fecs_inst.bin
+nvidia/gk20a/sw_bundle_init.bin
+nvidia/gk20a/gpccs_inst.bin
+nvidia/gk20a/fecs_data.bin
+nvidia/gk20a/gpccs_data.bin
+nvidia/gk20a/sw_method_init.bin
+nvidia/gk20a/sw_ctx.bin
+nvidia/gk20a/sw_nonctx.bin
+nvidia/tu106/nvdec/scrubber.bin
+nvidia/tu106/gr/fecs_inst.bin
+nvidia/tu106/gr/fecs_sig.bin
+nvidia/tu106/gr/sw_bundle_init.bin
+nvidia/tu106/gr/gpccs_inst.bin
+nvidia/tu106/gr/fecs_data.bin
+nvidia/tu106/gr/gpccs_sig.bin
+nvidia/tu106/gr/gpccs_bl.bin
+nvidia/tu106/gr/fecs_bl.bin
+nvidia/tu106/gr/gpccs_data.bin
+nvidia/tu106/gr/sw_method_init.bin
+nvidia/tu106/gr/sw_ctx.bin
+nvidia/tu106/gr/sw_nonctx.bin
+nvidia/tu106/gr/sw_veid_bundle_init.bin
+nvidia/tu106/acr/ucode_unload.bin
+nvidia/tu106/acr/ucode_ahesasc.bin
+nvidia/tu106/acr/unload_bl.bin
+nvidia/tu106/acr/ucode_asb.bin
+nvidia/tu106/acr/bl.bin
+nvidia/tu106/gsp
+nvidia/tu106/sec2/image.bin
+nvidia/tu106/sec2/desc.bin
+nvidia/tu106/sec2/sig.bin
+nvidia/gp108/nvdec/scrubber.bin
+nvidia/gp108/gr/fecs_inst.bin
+nvidia/gp108/gr/fecs_sig.bin
+nvidia/gp108/gr/sw_bundle_init.bin
+nvidia/gp108/gr/gpccs_inst.bin
+nvidia/gp108/gr/fecs_data.bin
+nvidia/gp108/gr/gpccs_sig.bin
+nvidia/gp108/gr/gpccs_bl.bin
+nvidia/gp108/gr/fecs_bl.bin
+nvidia/gp108/gr/gpccs_data.bin
+nvidia/gp108/gr/sw_method_init.bin
+nvidia/gp108/gr/sw_ctx.bin
+nvidia/gp108/gr/sw_nonctx.bin
+nvidia/gp108/acr/ucode_load.bin
+nvidia/gp108/acr/ucode_unload.bin
+nvidia/gp108/acr/unload_bl.bin
+nvidia/gp108/acr/bl.bin
+nvidia/gp108/sec2/image.bin
+nvidia/gp108/sec2/desc.bin
+nvidia/gp108/sec2/sig.bin
+nvidia/gm200/gr/fecs_inst.bin
+nvidia/gm200/gr/fecs_sig.bin
+nvidia/gm200/gr/sw_bundle_init.bin
+nvidia/gm200/gr/gpccs_inst.bin
+nvidia/gm200/gr/fecs_data.bin
+nvidia/gm200/gr/gpccs_sig.bin
+nvidia/gm200/gr/gpccs_bl.bin
+nvidia/gm200/gr/fecs_bl.bin
+nvidia/gm200/gr/gpccs_data.bin
+nvidia/gm200/gr/sw_method_init.bin
+nvidia/gm200/gr/sw_ctx.bin
+nvidia/gm200/gr/sw_nonctx.bin
+nvidia/gm200/acr/ucode_load.bin
+nvidia/gm200/acr/ucode_unload.bin
+nvidia/gm200/acr/bl.bin
+nvidia/tu102/nvdec/scrubber.bin
+nvidia/tu102/gr/fecs_inst.bin
+nvidia/tu102/gr/fecs_sig.bin
+nvidia/tu102/gr/sw_bundle_init.bin
+nvidia/tu102/gr/gpccs_inst.bin
+nvidia/tu102/gr/fecs_data.bin
+nvidia/tu102/gr/gpccs_sig.bin
+nvidia/tu102/gr/gpccs_bl.bin
+nvidia/tu102/gr/fecs_bl.bin
+nvidia/tu102/gr/gpccs_data.bin
+nvidia/tu102/gr/sw_method_init.bin
+nvidia/tu102/gr/sw_ctx.bin
+nvidia/tu102/gr/sw_nonctx.bin
+nvidia/tu102/gr/sw_veid_bundle_init.bin
+nvidia/tu102/acr/ucode_unload.bin
+nvidia/tu102/acr/ucode_ahesasc.bin
+nvidia/tu102/acr/unload_bl.bin
+nvidia/tu102/acr/ucode_asb.bin
+nvidia/tu102/acr/bl.bin
+nvidia/tu102/gsp/gsp-535.113.01.bin
+nvidia/tu102/gsp/booter_unload-535.113.01.bin
+nvidia/tu102/gsp/bootloader-535.113.01.bin
+nvidia/tu102/gsp/booter_load-535.113.01.bin
+nvidia/tu102/sec2/image.bin
+nvidia/tu102/sec2/desc.bin
+nvidia/tu102/sec2/sig.bin
+nvidia/tu116/nvdec/scrubber.bin
+nvidia/tu116/gr/fecs_inst.bin
+nvidia/tu116/gr/fecs_sig.bin
+nvidia/tu116/gr/sw_bundle_init.bin
+nvidia/tu116/gr/gpccs_inst.bin
+nvidia/tu116/gr/fecs_data.bin
+nvidia/tu116/gr/gpccs_sig.bin
+nvidia/tu116/gr/gpccs_bl.bin
+nvidia/tu116/gr/fecs_bl.bin
+nvidia/tu116/gr/gpccs_data.bin
+nvidia/tu116/gr/sw_method_init.bin
+nvidia/tu116/gr/sw_ctx.bin
+nvidia/tu116/gr/sw_nonctx.bin
+nvidia/tu116/gr/sw_veid_bundle_init.bin
+nvidia/tu116/acr/ucode_unload.bin
+nvidia/tu116/acr/ucode_ahesasc.bin
+nvidia/tu116/acr/unload_bl.bin
+nvidia/tu116/acr/ucode_asb.bin
+nvidia/tu116/acr/bl.bin
+nvidia/tu116/gsp/gsp-535.113.01.bin
+nvidia/tu116/gsp/booter_unload-535.113.01.bin
+nvidia/tu116/gsp/bootloader-535.113.01.bin
+nvidia/tu116/gsp/booter_load-535.113.01.bin
+nvidia/tu116/sec2/image.bin
+nvidia/tu116/sec2/desc.bin
+nvidia/tu116/sec2/sig.bin
+nvidia/tegra124/vic.bin
+nvidia/tegra124/xusb.bin
+nvidia/tegra124/vic03_ucode.bin
+nvidia/gp100/gr/fecs_inst.bin
+nvidia/gp100/gr/fecs_sig.bin
+nvidia/gp100/gr/sw_bundle_init.bin
+nvidia/gp100/gr/gpccs_inst.bin
+nvidia/gp100/gr/fecs_data.bin
+nvidia/gp100/gr/gpccs_sig.bin
+nvidia/gp100/gr/gpccs_bl.bin
+nvidia/gp100/gr/fecs_bl.bin
+nvidia/gp100/gr/gpccs_data.bin
+nvidia/gp100/gr/sw_method_init.bin
+nvidia/gp100/gr/sw_ctx.bin
+nvidia/gp100/gr/sw_nonctx.bin
+nvidia/gp100/acr/ucode_load.bin
+nvidia/gp100/acr/ucode_unload.bin
+nvidia/gp100/acr/bl.bin
+nvidia/tegra186/vic.bin
+nvidia/tegra186/xusb.bin
+nvidia/tegra186/vic04_ucode.bin
+nvidia/ga100/gsp/gsp-535.113.01.bin
+nvidia/ga100/gsp/booter_unload-535.113.01.bin
+nvidia/ga100/gsp/bootloader-535.113.01.bin
+nvidia/ga100/gsp/booter_load-535.113.01.bin
+nvidia/gp107/nvdec/scrubber.bin
+nvidia/gp107/gr/fecs_inst.bin
+nvidia/gp107/gr/fecs_sig.bin
+nvidia/gp107/gr/sw_bundle_init.bin
+nvidia/gp107/gr/gpccs_inst.bin
+nvidia/gp107/gr/fecs_data.bin
+nvidia/gp107/gr/gpccs_sig.bin
+nvidia/gp107/gr/gpccs_bl.bin
+nvidia/gp107/gr/fecs_bl.bin
+nvidia/gp107/gr/gpccs_data.bin
+nvidia/gp107/gr/sw_method_init.bin
+nvidia/gp107/gr/sw_ctx.bin
+nvidia/gp107/gr/sw_nonctx.bin
+nvidia/gp107/acr/ucode_load.bin
+nvidia/gp107/acr/ucode_unload.bin
+nvidia/gp107/acr/unload_bl.bin
+nvidia/gp107/acr/bl.bin
+nvidia/gp107/sec2/desc-1.bin
+nvidia/gp107/sec2/image.bin
+nvidia/gp107/sec2/desc.bin
+nvidia/gp107/sec2/image-1.bin
+nvidia/gp107/sec2/sig-1.bin
+nvidia/gp107/sec2/sig.bin
+nvidia/tegra194/vic.bin
+nvidia/tegra194/xusb.bin
+nvidia/gp10b/gr/fecs_inst.bin
+nvidia/gp10b/gr/fecs_sig.bin
+nvidia/gp10b/gr/sw_bundle_init.bin
+nvidia/gp10b/gr/gpccs_inst.bin
+nvidia/gp10b/gr/fecs_data.bin
+nvidia/gp10b/gr/gpccs_sig.bin
+nvidia/gp10b/gr/gpccs_bl.bin
+nvidia/gp10b/gr/fecs_bl.bin
+nvidia/gp10b/gr/gpccs_data.bin
+nvidia/gp10b/gr/sw_method_init.bin
+nvidia/gp10b/gr/sw_ctx.bin
+nvidia/gp10b/gr/sw_nonctx.bin
+nvidia/gp10b/pmu/image.bin
+nvidia/gp10b/pmu/desc.bin
+nvidia/gp10b/pmu/sig.bin
+nvidia/gp10b/acr/ucode_load.bin
+nvidia/gp10b/acr/bl.bin
+nxp/uartuart9098_bt_v1.bin
+nxp/uartuart8987_bt.bin
+nxp/uartuart8997_bt_v4.bin
+nxp/sr150_fw.bin
+nxp/helper_uart_3000000.bin
+nxp/uartiw416_bt_v0.bin
+nxp/uartspi_n61x_v1.bin.se
+phanfw.bin
+powervr/rogue_33.15.11.3_v1.fw
+qat_4xxx.bin
+qat_4xxx_mmp.bin
+qat_895xcc.bin
+qat_895xcc_mmp.bin
+qat_c3xxx.bin
+qat_c3xxx_mmp.bin
+qat_c62x.bin
+qat_c62x_mmp.bin
+qat_mmp.bin
+qca/crnv32u.bin
+qca/hpnv21.302
+qca/rampatch_usb_00000302.bin
+qca/hpnv21.301
+qca/msbtfw11.tlv
+qca/msnv11.bin
+qca/hpnv21g.301
+qca/apbtfw11.tlv
+qca/rampatch_00130300.bin
+qca/nvm_usb_00130201_010b.bin
+qca/rampatch_usb_00000200.bin
+qca/nvm_usb_00000200.bin
+qca/hpnv21.bin
+qca/nvm_usb_00000302_eu.bin
+qca/nvm_00130302.bin
+qca/hpbtfw21.tlv
+qca/apnv11.bin
+qca/nvm_00230302.bin
+qca/rampatch_usb_00190200.bin
+qca/rampatch_00230302.bin
+qca/crnv21.bin
+qca/nvm_usb_00130201_010a.bin
+qca/htnv20.bin
+qca/nvm_usb_00130200.bin
+qca/apbtfw10.tlv
+qca/nvm_00130300.bin
+qca/nvm_usb_00130200_0107.bin
+qca/nvm_usb_00000201.bin
+qca/msbtfw11.mbn
+qca/crbtfw21.tlv
+qca/crbtfw32.tlv
+qca/hpnv21g.302
+qca/hpnv21g.309
+qca/apnv10.bin
+qca/rampatch_00130302.bin
+qca/rampatch_usb_00130200.bin
+qca/nvm_00440302_eu.bin
+qca/nvm_usb_00130201_0303.bin
+qca/hpnv21.309
+qca/rampatch_00440302.bin
+qca/htbtfw20.tlv
+qca/nvm_usb_00130201_gf_010b.bin
+qca/nvm_usb_00130201.bin
+qca/nvm_usb_00130200_0109.bin
+qca/rampatch_usb_00000300.bin
+qca/nvm_00440302_i2s_eu.bin
+qca/rampatch_usb_00000201.bin
+qca/nvm_usb_00000302.bin
+qca/nvm_usb_00190200.bin
+qca/nvm_usb_00130200_0105.bin
+qca/msnv11.b09
+qca/hpnv21g.bin
+qca/rampatch_usb_00130201.bin
+qca/crnv32.bin
+qca/nvm_usb_00130200_0110.bin
+qca/nvm_usb_00130200_0104.bin
+qca/nvm_usb_00130201_gf_0303.bin
+qca/nvm_usb_00130200_0106.bin
+qca/nvm_usb_00000300.bin
+qca/nvm_00440302.bin
+qca/nvm_usb_00130201_gf_010a.bin
+qca/nvm_usb_00130201_gf.bin
+qca/msnv11.b0a
+qcom/a420_pm4.fw
+qcom/a530v3_gpmu.fw2
+qcom/venus-5.4/venus.mbn
+qcom/venus-5.4/venus.mdt
+qcom/a660_sqe.fw
+qcom/apq8016/mba.mbn
+qcom/apq8016/WCNSS_qcom_wlan_nv_sbc.bin
+qcom/apq8016/wcnss.mbn
+qcom/apq8016/modem.mbn
+qcom/apq8096/mba.mbn
+qcom/apq8096/a530_zap.mbn
+qcom/apq8096/modemr.jsn
+qcom/apq8096/adsp.mbn
+qcom/apq8096/adspr.jsn
+qcom/apq8096/modem.mbn
+qcom/apq8096/adspua.jsn
+qcom/a650_sqe.fw
+qcom/venus-5.2/venus.mbn
+qcom/venus-5.2/venus.mdt
+qcom/yamato_pfp.fw
+qcom/a650_gmu.bin
+qcom/yamato_pm4.fw
+qcom/a300_pfp.fw
+qcom/qrb4210/cdspr.jsn
+qcom/qrb4210/cdsp.mbn
+qcom/qrb4210/modemuw.jsn
+qcom/qrb4210/modemr.jsn
+qcom/qrb4210/adsp.mbn
+qcom/qrb4210/adspr.jsn
+qcom/qrb4210/adsps.jsn
+qcom/qrb4210/modem.mbn
+qcom/qrb4210/wlanmdsp.mbn
+qcom/qrb4210/adspua.jsn
+qcom/qrb4210/a610_zap.mbn
+qcom/venus-4.2/venus.mbn
+qcom/venus-4.2/venus.mdt
+qcom/leia_pm4_470.fw
+qcom/sc8280xp/LENOVO/21BX/audioreach-tplg.bin
+qcom/sc8280xp/LENOVO/21BX/cdspr.jsn
+qcom/sc8280xp/LENOVO/21BX/qcdxkmsuc8280.mbn
+qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn
+qcom/sc8280xp/LENOVO/21BX/adspr.jsn
+qcom/sc8280xp/LENOVO/21BX/qccdsp8280.mbn
+qcom/sc8280xp/LENOVO/21BX/qcslpi8280.mbn
+qcom/sc8280xp/LENOVO/21BX/battmgr.jsn
+qcom/sc8280xp/LENOVO/21BX/adspua.jsn
+qcom/sc8280xp/SC8280XP-LENOVO-X13S-tplg.bin
+qcom/a330_pfp.fw
+qcom/a530_pfp.fw
+qcom/sm8250/cdspr.jsn
+qcom/sm8250/cdsp.mbn
+qcom/sm8250/adsp.mbn
+qcom/sm8250/adspr.jsn
+qcom/sm8250/adspua.jsn
+qcom/sm8250/a650_zap.mbn
+qcom/sm8250/Thundercomm/RB5/slpi.mbn
+qcom/sm8250/Thundercomm/RB5/slpius.jsn
+qcom/sm8250/Thundercomm/RB5/slpir.jsn
+qcom/venus-6.0/venus.mbn
+qcom/a530_zap.mdt
+qcom/a660_gmu.bin
+qcom/a530_pm4.fw
+qcom/sm8550/SM8550-HDK-tplg.bin
+qcom/sm8550/SM8550-QRD-tplg.bin
+qcom/a630_sqe.fw
+qcom/leia_pfp_470.fw
+qcom/a630_gmu.bin
+qcom/a330_pm4.fw
+qcom/qcm2290/a702_zap.mbn
+qcom/qcm2290/modemuw.jsn
+qcom/qcm2290/modemr.jsn
+qcom/qcm2290/adsp.mbn
+qcom/qcm2290/adspr.jsn
+qcom/qcm2290/adsps.jsn
+qcom/qcm2290/modem.mbn
+qcom/qcm2290/wlanmdsp.mbn
+qcom/qcm2290/adspua.jsn
+qcom/sdm845/mba.mbn
+qcom/sdm845/cdspr.jsn
+qcom/sdm845/cdsp.mbn
+qcom/sdm845/modemuw.jsn
+qcom/sdm845/adsp.mbn
+qcom/sdm845/adspr.jsn
+qcom/sdm845/modem.mbn
+qcom/sdm845/modem_nm.mbn
+qcom/sdm845/wlanmdsp.mbn
+qcom/sdm845/adspua.jsn
+qcom/sdm845/a630_zap.mbn
+qcom/sdm845/Thundercomm/db845c/slpi.mbn
+qcom/sdm845/Thundercomm/db845c/slpius.jsn
+qcom/sdm845/Thundercomm/db845c/slpir.jsn
+qcom/venus-1.8/venus.mbn
+qcom/venus-1.8/venus.mdt
+qcom/vpu-2.0/venus.mbn
+qcom/sm8650/SM8650-MTP-tplg.bin
+qcom/sm8650/SM8650-QRD-tplg.bin
+qcom/a702_sqe.fw
+qcom/a420_pfp.fw
+qcom/a300_pm4.fw
+qcom/vpu-1.0/venus.mbn
+qcom/vpu-1.0/venus.mdt
+qcom/aic100/fw5.bin
+qcom/aic100/fw9.bin
+qcom/aic100/sbl.bin
+qcom/aic100/fw1.bin
+qcom/aic100/fw10.bin
+qcom/aic100/fw2.bin
+qed/qed_init_values-8.33.12.0.bin
+qed/qed_init_values_zipped-8.10.5.0.bin
+qed/qed_init_values_zipped-8.20.0.0.bin
+qed/qed_init_values-8.18.9.0.bin
+qed/qed_init_values-8.20.0.0.bin
+qed/qed_init_values_zipped-8.33.1.0.bin
+qed/qed_init_values-8.37.7.0.bin
+qed/qed_init_values-8.40.33.0.bin
+qed/qed_init_values-8.10.9.0.bin
+qed/qed_init_values_zipped-8.7.3.0.bin
+qed/qed_init_values_zipped-8.33.11.0.bin
+qed/qed_init_values_zipped-8.10.10.0.bin
+qed/qed_init_values-8.14.6.0.bin
+qed/qed_init_values_zipped-8.42.2.0.bin
+qed/qed_init_values_zipped-8.4.2.0.bin
+qed/qed_init_values_zipped-8.59.1.0.bin
+qed/qed_init_values_zipped-8.15.3.0.bin
+qed/qed_init_values-8.30.12.0.bin
+qed/qed_init_values_zipped-8.37.7.0.bin
+qed/qed_init_values_zipped-8.37.2.0.bin
+ql2100_fw.bin
+ql2200_fw.bin
+ql2300_fw.bin
+ql2322_fw.bin
+ql2400_fw.bin
+ql2500_fw.bin
+qlogic/sd7220.fw
+qlogic/1040.bin
+qlogic/1280.bin
+qlogic/12160.bin
+r128/r128_cce.bin
+r8a779x_usb3_v1.dlmem
+r8a779x_usb3_v2.dlmem
+r8a779x_usb3_v3.dlmem
+radeon/RV730_pfp.bin
+radeon/RV710_me.bin
+radeon/oland_smc.bin
+radeon/bonaire_sdma1.bin
+radeon/OLAND_me.bin
+radeon/pitcairn_mc.bin
+radeon/HAINAN_me.bin
+radeon/mullins_pfp.bin
+radeon/KAVERI_mec.bin
+radeon/RS690_cp.bin
+radeon/RV620_pfp.bin
+radeon/HAINAN_smc.bin
+radeon/pitcairn_me.bin
+radeon/CEDAR_pfp.bin
+radeon/SUMO_rlc.bin
+radeon/RV770_pfp.bin
+radeon/JUNIPER_me.bin
+radeon/ARUBA_rlc.bin
+radeon/HAWAII_mc2.bin
+radeon/bonaire_uvd.bin
+radeon/MULLINS_pfp.bin
+radeon/hawaii_ce.bin
+radeon/VERDE_mc.bin
+radeon/kabini_sdma1.bin
+radeon/VERDE_pfp.bin
+radeon/RS780_uvd.bin
+radeon/SUMO2_me.bin
+radeon/verde_ce.bin
+radeon/RV630_me.bin
+radeon/OLAND_pfp.bin
+radeon/bonaire_pfp.bin
+radeon/BONAIRE_mc2.bin
+radeon/hainan_ce.bin
+radeon/R600_pfp.bin
+radeon/kabini_mec.bin
+radeon/KABINI_rlc.bin
+radeon/tahiti_mc.bin
+radeon/PITCAIRN_mc2.bin
+radeon/HAWAII_rlc.bin
+radeon/kaveri_ce.bin
+radeon/SUMO_uvd.bin
+radeon/CYPRESS_smc.bin
+radeon/HAWAII_smc.bin
+radeon/RV635_me.bin
+radeon/HAWAII_mec.bin
+radeon/tahiti_me.bin
+radeon/OLAND_rlc.bin
+radeon/KABINI_mec.bin
+radeon/TURKS_mc.bin
+radeon/KAVERI_me.bin
+radeon/mullins_vce.bin
+radeon/MULLINS_rlc.bin
+radeon/VERDE_ce.bin
+radeon/hawaii_me.bin
+radeon/kabini_ce.bin
+radeon/kabini_rlc.bin
+radeon/CEDAR_rlc.bin
+radeon/CEDAR_me.bin
+radeon/HAINAN_rlc.bin
+radeon/REDWOOD_pfp.bin
+radeon/verde_rlc.bin
+radeon/RV770_me.bin
+radeon/pitcairn_smc.bin
+radeon/hawaii_pfp.bin
+radeon/kaveri_pfp.bin
+radeon/R600_uvd.bin
+radeon/VERDE_rlc.bin
+radeon/KABINI_ce.bin
+radeon/oland_rlc.bin
+radeon/CAYMAN_pfp.bin
+radeon/TAHITI_vce.bin
+radeon/BARTS_me.bin
+radeon/TAHITI_pfp.bin
+radeon/BONAIRE_pfp.bin
+radeon/JUNIPER_rlc.bin
+radeon/bonaire_rlc.bin
+radeon/verde_k_smc.bin
+radeon/REDWOOD_rlc.bin
+radeon/oland_me.bin
+radeon/R200_cp.bin
+radeon/pitcairn_ce.bin
+radeon/BARTS_pfp.bin
+radeon/MULLINS_mec.bin
+radeon/tahiti_rlc.bin
+radeon/PITCAIRN_smc.bin
+radeon/PITCAIRN_pfp.bin
+radeon/kaveri_rlc.bin
+radeon/BONAIRE_uvd.bin
+radeon/REDWOOD_smc.bin
+radeon/R300_cp.bin
+radeon/bonaire_smc.bin
+radeon/TAHITI_mc.bin
+radeon/RV730_smc.bin
+radeon/pitcairn_k_smc.bin
+radeon/RV610_me.bin
+radeon/tahiti_pfp.bin
+radeon/pitcairn_pfp.bin
+radeon/hawaii_uvd.bin
+radeon/CEDAR_smc.bin
+radeon/hainan_smc.bin
+radeon/PITCAIRN_mc.bin
+radeon/mullins_mec.bin
+radeon/REDWOOD_me.bin
+radeon/VERDE_me.bin
+radeon/kabini_vce.bin
+radeon/BTC_rlc.bin
+radeon/PALM_pfp.bin
+radeon/hawaii_k_smc.bin
+radeon/kaveri_mec.bin
+radeon/CAICOS_pfp.bin
+radeon/SUMO_me.bin
+radeon/bonaire_me.bin
+radeon/TAHITI_ce.bin
+radeon/BARTS_mc.bin
+radeon/hawaii_sdma1.bin
+radeon/VERDE_smc.bin
+radeon/pitcairn_rlc.bin
+radeon/KABINI_me.bin
+radeon/OLAND_mc2.bin
+radeon/JUNIPER_pfp.bin
+radeon/bonaire_vce.bin
+radeon/R700_rlc.bin
+radeon/CAICOS_mc.bin
+radeon/bonaire_mec.bin
+radeon/HAWAII_mc.bin
+radeon/RV630_pfp.bin
+radeon/ARUBA_me.bin
+radeon/bonaire_sdma.bin
+radeon/BONAIRE_ce.bin
+radeon/RV610_pfp.bin
+radeon/KABINI_pfp.bin
+radeon/kabini_sdma.bin
+radeon/RV770_smc.bin
+radeon/MULLINS_ce.bin
+radeon/kaveri_uvd.bin
+radeon/CYPRESS_uvd.bin
+radeon/verde_pfp.bin
+radeon/BONAIRE_mc.bin
+radeon/hawaii_smc.bin
+radeon/BONAIRE_vce.bin
+radeon/mullins_me.bin
+radeon/mullins_sdma1.bin
+radeon/kaveri_mec2.bin
+radeon/CAYMAN_rlc.bin
+radeon/oland_pfp.bin
+radeon/R100_cp.bin
+radeon/OLAND_mc.bin
+radeon/TURKS_smc.bin
+radeon/hainan_me.bin
+radeon/RV710_pfp.bin
+radeon/R420_cp.bin
+radeon/KAVERI_ce.bin
+radeon/R600_rlc.bin
+radeon/verde_mc.bin
+radeon/kaveri_sdma.bin
+radeon/kaveri_vce.bin
+radeon/OLAND_ce.bin
+radeon/RV710_uvd.bin
+radeon/HAWAII_sdma.bin
+radeon/SUMO_pfp.bin
+radeon/JUNIPER_smc.bin
+radeon/RV710_smc.bin
+radeon/bonaire_mc.bin
+radeon/R520_cp.bin
+radeon/kaveri_sdma1.bin
+radeon/kabini_uvd.bin
+radeon/CYPRESS_rlc.bin
+radeon/HAWAII_pfp.bin
+radeon/kaveri_me.bin
+radeon/tahiti_ce.bin
+radeon/BONAIRE_sdma.bin
+radeon/CAYMAN_me.bin
+radeon/BONAIRE_mec.bin
+radeon/R600_me.bin
+radeon/HAWAII_me.bin
+radeon/CAICOS_smc.bin
+radeon/hainan_k_smc.bin
+radeon/HAINAN_mc.bin
+radeon/TAHITI_smc.bin
+radeon/hawaii_mec.bin
+radeon/PITCAIRN_me.bin
+radeon/RV620_me.bin
+radeon/RV670_pfp.bin
+radeon/RV770_uvd.bin
+radeon/KABINI_sdma.bin
+radeon/CYPRESS_me.bin
+radeon/si58_mc.bin
+radeon/OLAND_smc.bin
+radeon/hainan_mc.bin
+radeon/bonaire_ce.bin
+radeon/PALM_me.bin
+radeon/oland_ce.bin
+radeon/RV670_me.bin
+radeon/SUMO2_pfp.bin
+radeon/verde_smc.bin
+radeon/BARTS_smc.bin
+radeon/hawaii_mc.bin
+radeon/CAYMAN_smc.bin
+radeon/CYPRESS_pfp.bin
+radeon/RV635_pfp.bin
+radeon/oland_k_smc.bin
+radeon/VERDE_mc2.bin
+radeon/BONAIRE_me.bin
+radeon/hawaii_sdma.bin
+radeon/RS780_pfp.bin
+radeon/TURKS_pfp.bin
+radeon/RS780_me.bin
+radeon/HAINAN_pfp.bin
+radeon/tahiti_k_smc.bin
+radeon/mullins_rlc.bin
+radeon/TAHITI_mc2.bin
+radeon/CAYMAN_mc.bin
+radeon/MULLINS_sdma.bin
+radeon/mullins_uvd.bin
+radeon/RV740_smc.bin
+radeon/TAHITI_rlc.bin
+radeon/HAWAII_ce.bin
+radeon/oland_mc.bin
+radeon/PITCAIRN_ce.bin
+radeon/tahiti_smc.bin
+radeon/hainan_pfp.bin
+radeon/hainan_rlc.bin
+radeon/TAHITI_uvd.bin
+radeon/KAVERI_sdma.bin
+radeon/mullins_sdma.bin
+radeon/HAINAN_mc2.bin
+radeon/KAVERI_rlc.bin
+radeon/CAICOS_me.bin
+radeon/KAVERI_pfp.bin
+radeon/bonaire_k_smc.bin
+radeon/BONAIRE_smc.bin
+radeon/RS600_cp.bin
+radeon/hawaii_rlc.bin
+radeon/TAHITI_me.bin
+radeon/verde_me.bin
+radeon/hawaii_vce.bin
+radeon/MULLINS_me.bin
+radeon/kabini_me.bin
+radeon/TURKS_me.bin
+radeon/RV730_me.bin
+radeon/BONAIRE_rlc.bin
+radeon/banks_k_2_smc.bin
+radeon/mullins_ce.bin
+radeon/HAINAN_ce.bin
+radeon/PITCAIRN_rlc.bin
+radeon/ARUBA_pfp.bin
+radeon/kabini_pfp.bin
+rockchip/dptx.bin
+rp2.fw
+rsi/rs9113_wlan_bt_dual_mode.rps
+rsi/rs9116_wlan_bt_classic.rps
+rsi/rs9113_ap_bt_dual_mode.rps
+rsi/rs9113_wlan_qspi.rps
+rsi/rs9116_wlan.rps
+rsi_91x.fw
+rt2561.bin
+rt2561s.bin
+rt2661.bin
+rt2860.bin
+rt2870.bin
+rt3070.bin
+rt3071.bin
+rt3090.bin
+rt3290.bin
+rt73.bin
+rtl_bt/rtl8723bs_config-OBDA8723.bin
+rtl_bt/rtl8852bu_config.bin
+rtl_bt/rtl8852au_config.bin
+rtl_bt/rtl8761b_config.bin
+rtl_bt/rtl8852btu_config.bin
+rtl_bt/rtl8821c_fw.bin
+rtl_bt/rtl8761b_fw.bin
+rtl_bt/rtl8822cs_fw.bin
+rtl_bt/rtl8812ae_fw.bin
+rtl_bt/rtl8852cu_fw.bin
+rtl_bt/rtl8852btu_fw.bin
+rtl_bt/rtl8822cu_config.bin
+rtl_bt/rtl8723bs_fw.bin
+rtl_bt/rtl8821a_fw.bin
+rtl_bt/rtl8192eu_fw.bin
+rtl_bt/rtl8723a_fw.bin
+rtl_bt/rtl8822cs_config.bin
+rtl_bt/rtl8723bs_config-OBDA0623.bin
+rtl_bt/rtl8821cs_config.bin
+rtl_bt/rtl8821a_config.bin
+rtl_bt/rtl8761bu_config.bin
+rtl_bt/rtl8851bu_config.bin
+rtl_bt/rtl8723d_config.bin
+rtl_bt/rtl8851bu_fw.bin
+rtl_bt/rtl8192ee_fw.bin
+rtl_bt/rtl8852cu_fw_v2.bin
+rtl_bt/rtl8761a_fw.bin
+rtl_bt/rtl8822b_config.bin
+rtl_bt/rtl8821c_config.bin
+rtl_bt/rtl8822cu_fw.bin
+rtl_bt/rtl8822b_fw.bin
+rtl_bt/rtl8761bu_fw.bin
+rtl_bt/rtl8723d_fw.bin
+rtl_bt/rtl8852au_fw.bin
+rtl_bt/rtl8821cs_fw.bin
+rtl_bt/rtl8852bu_fw.bin
+rtl_bt/rtl8852cu_config.bin
+rtl_bt/rtl8723b_fw.bin
+rtl_nic/rtl8168g-1.fw
+rtl_nic/rtl8106e-1.fw
+rtl_nic/rtl8402-1.fw
+rtl_nic/rtl8153a-2.fw
+rtl_nic/rtl8156a-2.fw
+rtl_nic/rtl8153b-2.fw
+rtl_nic/rtl8153a-3.fw
+rtl_nic/rtl8106e-2.fw
+rtl_nic/rtl8168f-1.fw
+rtl_nic/rtl8105e-1.fw
+rtl_nic/rtl8107e-2.fw
+rtl_nic/rtl8153c-1.fw
+rtl_nic/rtl8153a-4.fw
+rtl_nic/rtl8107e-1.fw
+rtl_nic/rtl8156b-2.fw
+rtl_nic/rtl8125b-1.fw
+rtl_nic/rtl8168g-3.fw
+rtl_nic/rtl8168h-2.fw
+rtl_nic/rtl8125a-3.fw
+rtl_nic/rtl8168d-1.fw
+rtl_nic/rtl8168e-2.fw
+rtl_nic/rtl8168e-3.fw
+rtl_nic/rtl8125b-2.fw
+rtl_nic/rtl8126a-2.fw
+rtl_nic/rtl8168fp-3.fw
+rtl_nic/rtl8168e-1.fw
+rtl_nic/rtl8168f-2.fw
+rtl_nic/rtl8168d-2.fw
+rtl_nic/rtl8168h-1.fw
+rtl_nic/rtl8411-1.fw
+rtl_nic/rtl8411-2.fw
+rtl_nic/rtl8168g-2.fw
+rtlwifi/rtl8192cfw.bin
+rtlwifi/rtl8822befw.bin
+rtlwifi/rtl8723bu_nic.bin
+rtlwifi/rtl8192defw.bin
+rtlwifi/rtl8723fw.bin
+rtlwifi/rtl8723aufw_A.bin
+rtlwifi/rtl8723aufw_B_NoBT.bin
+rtlwifi/rtl8192fufw.bin
+rtlwifi/rtl8723befw_36.bin
+rtlwifi/rtl8821aefw.bin
+rtlwifi/rtl8188fufw.bin
+rtlwifi/rtl8192eu_nic.bin
+rtlwifi/rtl8821aefw_wowlan.bin
+rtlwifi/rtl8723fw_B.bin
+rtlwifi/rtl8192cfwU.bin
+rtlwifi/rtl8192cufw.bin
+rtlwifi/rtl8192cfwU_B.bin
+rtlwifi/rtl8192eu_wowlan.bin
+rtlwifi/rtl8710bufw_SMIC.bin
+rtlwifi/rtl8723bu_ap_wowlan.bin
+rtlwifi/rtl8812aefw_wowlan.bin
+rtlwifi/rtl8821aefw_29.bin
+rtlwifi/rtl8712u.bin
+rtlwifi/rtl8723bs_nic.bin
+rtlwifi/rtl8710bufw_UMC.bin
+rtlwifi/rtl8192sefw.bin
+rtlwifi/rtl8188eufw.bin
+rtlwifi/rtl8188efw.bin
+rtlwifi/rtl8723defw.bin
+rtlwifi/rtl8723bs_ap_wowlan.bin
+rtlwifi/rtl8192eefw.bin
+rtlwifi/rtl8723bu_wowlan.bin
+rtlwifi/rtl8192cufw_A.bin
+rtlwifi/rtl8723bs_wowlan.bin
+rtlwifi/rtl8192eu_ap_wowlan.bin
+rtlwifi/rtl8723befw.bin
+rtlwifi/rtl8723bs_bt.bin
+rtlwifi/rtl8192cufw_TMSC.bin
+rtlwifi/rtl8812aefw.bin
+rtlwifi/rtl8192cufw_B.bin
+rtlwifi/rtl8723aufw_B.bin
+rtw88/rtw8822b_fw.bin
+rtw88/rtw8821c_fw.bin
+rtw88/rtw8821a_fw.bin
+rtw88/rtw8703b_fw.bin
+rtw88/rtw8703b_wow_fw.bin
+rtw88/rtw8723d_fw.bin
+rtw88/rtw8822c_fw.bin
+rtw88/rtw8822c_wow_fw.bin
+rtw88/README
+rtw89/rtw8851b_fw.bin
+rtw89/rtw8922a_fw.bin
+rtw89/rtw8852b_fw.bin
+rtw89/rtw8852c_fw.bin
+rtw89/rtw8852a_fw.bin
+rtw89/rtw8852b_fw-1.bin
+s2250.fw
+s2250_loader.fw
+s5p-mfc-v12.fw
+s5p-mfc-v6-v2.fw
+s5p-mfc-v6.fw
+s5p-mfc-v7.fw
+s5p-mfc-v8.fw
+s5p-mfc.fw
+sdd_sagrad_1091_1098.bin
+slicoss/oasisdownload.sys
+slicoss/gbdownload.sys
+slicoss/oasisdbgdownload.sys
+slicoss/gbrcvucode.sys
+slicoss/oasisrcvucode.sys
+sms1xxx-hcw-55xxx-dvbt-02.fw
+sms1xxx-hcw-55xxx-isdbt-02.fw
+sms1xxx-nova-a-dvbt-01.fw
+sms1xxx-nova-b-dvbt-01.fw
+sms1xxx-stellar-dvbt-01.fw
+sxg/saharadownloadB.sys
+sxg/saharadbgdownloadB.sys
+tdmb_nova_12mhz.inp
+tehuti/bdx.bin
+ti/vpdma-1b8.bin
+ti/tas2563/TAS2XXX3870.bin
+ti/tas2563/INT8866RCA2.bin
+ti/tas2781/TAS2XXX38B9.bin
+ti/tas2781/TAS2XXX38D3.bin
+ti/tas2781/TAS2XXX38A5.bin
+ti/tas2781/TIAS2781RCA2.bin
+ti/tas2781/TAS2XXX38DF.bin
+ti/tas2781/TAS2XXX38A8.bin
+ti/tas2781/TAS2XXX3886.bin
+ti/tas2781/TAS2XXX38BE.bin
+ti/tas2781/TAS2XXX3884.bin
+ti/tas2781/TAS2XXX38BB.bin
+ti/tas2781/TAS2XXX38D6.bin
+ti/tas2781/TAS2XXX3880.bin
+ti/tas2781/TAS2XXX387F.bin
+ti/tas2781/TAS2XXX38D5.bin
+ti/tas2781/TAS2XXX38D4.bin
+ti/tas2781/TAS2XXX3881.bin
+ti/tas2781/TAS2XXX38E0.bin
+ti/tas2781/TAS2XXX38C3.bin
+ti/tas2781/TAS2XXX38BF.bin
+ti/tas2781/TAS2XXX3882.bin
+ti/tas2781/TAS2XXX387D.bin
+ti/tas2781/TAS2XXX387E.bin
+ti/tas2781/TAS2XXX38CB.bin
+ti/tas2781/TAS2XXX38B8.bin
+ti/tas2781/TAS2XXX38BA.bin
+ti/tas2781/TIAS2781RCA4.bin
+ti/tas2781/TAS2XXX38A7.bin
+ti/tas2781/TAS2XXX38CD.bin
+ti/tas2781/TAS2XXX2234.bin
+ti-connectivity/TIInit_7.2.31.bts
+ti-connectivity/wl128x-fw-4-sr.bin
+ti-connectivity/TIInit_6.6.15.bts
+ti-connectivity/wl1271-fw-ap.bin
+ti-connectivity/wl128x-fw-ap.bin
+ti-connectivity/wl127x-fw-5-sr.bin
+ti-connectivity/cc33xx_2nd_loader.bin
+ti-connectivity/wl128x-fw-4-plt.bin
+ti-connectivity/cc33xx_fw.bin
+ti-connectivity/cc33xx-conf.bin
+ti-connectivity/wl127x-nvs.bin
+ti-connectivity/wl127x-fw-4-plt.bin
+ti-connectivity/wl1251-fw.bin
+ti-connectivity/wl128x-nvs.bin
+ti-connectivity/wl12xx-nvs.bin
+ti-connectivity/wl128x-fw.bin
+ti-connectivity/wl127x-fw-4-sr.bin
+ti-connectivity/wl18xx-fw.bin
+ti-connectivity/wl1271-nvs.bin
+ti-connectivity/wl128x-fw-3.bin
+ti-connectivity/wl128x-fw-plt-3.bin
+ti-connectivity/wl127x-fw-5-plt.bin
+ti-connectivity/wl128x-fw-5-plt.bin
+ti-connectivity/wl128x-fw-5-sr.bin
+ti-connectivity/wl1251-nvs.bin
+ti-connectivity/wl1271-fw-2.bin
+ti-connectivity/wl128x-fw-5-mr.bin
+ti-connectivity/wl18xx-fw-4.bin
+ti-connectivity/wl127x-fw-5-mr.bin
+ti-connectivity/wl18xx-fw-3.bin
+ti-connectivity/wl127x-fw-3.bin
+ti-connectivity/wl18xx-fw-2.bin
+ti-connectivity/wl127x-fw-4-mr.bin
+ti-connectivity/TIInit_6.2.31.bts
+ti-connectivity/wl127x-fw-plt-3.bin
+ti-connectivity/wl128x-fw-4-mr.bin
+ti-connectivity/wl1271-fw.bin
+ti-keystone/ks2_qmss_pdsp_acc48_k2_le_1_0_0_9.bin
+tigon/tg3.bin
+tigon/tg3_tso.bin
+tigon/tg3_tso5.bin
+tigon/tg357766.bin
+tlg2300_firmware.bin
+tsse_firmware.bin
+ueagle-atm/DSPei.bin
+ueagle-atm/DSPep.bin
+ueagle-atm/CMVepIT.bin
+ueagle-atm/DSP9p.bin
+ueagle-atm/CMVei.bin
+ueagle-atm/eagleIII.fw
+ueagle-atm/CMV4p.bin.v2
+ueagle-atm/eagleII.fw
+ueagle-atm/DSP9i.bin
+ueagle-atm/DSP4p.bin
+ueagle-atm/CMVepES.bin
+ueagle-atm/CMVepFR04.bin
+ueagle-atm/CMVeiWO.bin
+ueagle-atm/adi930.fw
+ueagle-atm/CMV9p.bin
+ueagle-atm/CMVep.bin
+ueagle-atm/930-fpga.bin
+ueagle-atm/CMV9i.bin
+ueagle-atm/CMVepES03.bin
+ueagle-atm/eagleI.fw
+ueagle-atm/eagleIV.fw
+ueagle-atm/CMVepWO.bin
+ueagle-atm/CMVepFR10.bin
+ueagle-atm/CMVepFR.bin
+usbdux_firmware.bin
+usbduxfast_firmware.bin
+usbduxsigma_firmware.bin
+v4l-cx231xx-avcore-01.fw
+v4l-cx23418-apu.fw
+v4l-cx23418-cpu.fw
+v4l-cx23418-dig.fw
+v4l-cx23885-avcore-01.fw
+v4l-cx25840.fw
+vntwusb.fw
+vpu_d.bin
+vpu_p.bin
+vxge/X3fw-pxe.ncf
+vxge/X3fw.ncf
+wfx/wfm_wf200_C0.sec
+wfx/brd8023a.pds
+wfx/brd8022a.pds
+wfx/brd4001a.pds
+wil6210.brd
+wil6210.fw
+wsm_22.bin
+xe/lnl_guc_70.bin
diff --git a/savedconfig/x11-misc/dmenu-5.2 b/savedconfig/x11-misc/dmenu-5.2
@@ -0,0 +1,24 @@
+/* See LICENSE file for copyright and license details. */
+/* Default settings; can be overriden by command line. */
+
+static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */
+/* -fn option overrides fonts[0]; default X11 font or font set */
+static const char *fonts[] = {
+ "monospace:size=10"
+};
+static const char *prompt = NULL; /* -p option; prompt to the left of input field */
+static const char *colors[SchemeLast][2] = {
+ /* fg bg */
+ [SchemeNorm] = { "#bbbbbb", "#222222" },
+ [SchemeSel] = { "#eeeeee", "#005577" },
+ [SchemeOut] = { "#000000", "#00ffff" },
+ [SchemeHp] = { "#bbbbbb", "#333333" },
+};
+/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
+static unsigned int lines = 0;
+
+/*
+ * Characters not considered part of a word while deleting words
+ * for example: " /?\"&[]"
+ */
+static const char worddelimiters[] = " ";
diff --git a/savedconfig/x11-misc/dmenu-5.3 b/savedconfig/x11-misc/dmenu-5.3
@@ -0,0 +1,24 @@
+/* See LICENSE file for copyright and license details. */
+/* Default settings; can be overriden by command line. */
+
+static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */
+/* -fn option overrides fonts[0]; default X11 font or font set */
+static const char *fonts[] = {
+ "monospace:size=10"
+};
+static const char *prompt = NULL; /* -p option; prompt to the left of input field */
+static const char *colors[SchemeLast][2] = {
+ /* fg bg */
+ [SchemeNorm] = { "#bbbbbb", "#222222" },
+ [SchemeSel] = { "#eeeeee", "#005577" },
+ [SchemeOut] = { "#000000", "#00ffff" },
+ [SchemeHp] = { "#bbbbbb", "#333333" }
+};
+/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
+static unsigned int lines = 0;
+
+/*
+ * Characters not considered part of a word while deleting words
+ * for example: " /?\"&[]"
+ */
+static const char worddelimiters[] = " ";
diff --git a/savedconfig/x11-terms/st-0.9 b/savedconfig/x11-terms/st-0.9
@@ -0,0 +1,482 @@
+/* See LICENSE file for copyright and license details. */
+
+/*
+ * appearance
+ *
+ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
+ */
+static char *font = "Liberation Mono:pixelsize=14:antialias=true:autohint=true";
+static int borderpx = 2;
+
+/*
+ * background image
+ * expects farbfeld format
+ * pseudo transparency fixes coordinates to the screen origin
+ */
+static const char *bgfile = "/home/plat/st_wall.ff";
+static const int pseudotransparency = 1;
+
+/*
+ * What program is execed by st depends of these precedence rules:
+ * 1: program passed with -e
+ * 2: scroll and/or utmp
+ * 3: SHELL environment variable
+ * 4: value of shell in /etc/passwd
+ * 5: value of shell in config.h
+ */
+static char *shell = "/bin/sh";
+char *utmp = NULL;
+/* scroll program: to enable use a string like "scroll" */
+char *scroll = NULL;
+char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
+
+/* identification sequence returned in DA and DECID */
+char *vtiden = "\033[?6c";
+
+/* Kerning / character bounding-box multipliers */
+static float cwscale = 1.0;
+static float chscale = 1.0;
+
+/*
+ * word delimiter string
+ *
+ * More advanced example: L" `'\"()[]{}"
+ */
+wchar_t *worddelimiters = L" ";
+
+/* selection timeouts (in milliseconds) */
+static unsigned int doubleclicktimeout = 300;
+static unsigned int tripleclicktimeout = 600;
+
+/* alt screens */
+int allowaltscreen = 1;
+
+/* allow certain non-interactive (insecure) window operations such as:
+ setting the clipboard text */
+int allowwindowops = 0;
+
+/*
+ * draw latency range in ms - from new content/keypress/etc until drawing.
+ * within this range, st draws when content stops arriving (idle). mostly it's
+ * near minlatency, but it waits longer for slow updates to avoid partial draw.
+ * low minlatency will tear/flicker more, as it can "detect" idle too early.
+ */
+static double minlatency = 8;
+static double maxlatency = 33;
+
+/*
+ * blinking timeout (set to 0 to disable blinking) for the terminal blinking
+ * attribute.
+ */
+static unsigned int blinktimeout = 800;
+
+/*
+ * thickness of underline and bar cursors
+ */
+static unsigned int cursorthickness = 2;
+
+/*
+ * bell volume. It must be a value between -100 and 100. Use 0 for disabling
+ * it
+ */
+static int bellvolume = 0;
+
+/* default TERM value */
+char *termname = "st-256color";
+
+/*
+ * spaces per tab
+ *
+ * When you are changing this value, don't forget to adapt the »it« value in
+ * the st.info and appropriately install the st.info in the environment where
+ * you use this st version.
+ *
+ * it#$tabspaces,
+ *
+ * Secondly make sure your kernel is not expanding tabs. When running `stty
+ * -a` »tab0« should appear. You can tell the terminal to not expand tabs by
+ * running following command:
+ *
+ * stty tabs
+ */
+unsigned int tabspaces = 8;
+
+/* Terminal colors (16 first used in escape sequence) */
+static const char *colorname[] = {
+ /* 8 normal colors */
+ "black",
+ "red3",
+ "green3",
+ "yellow3",
+ "blue2",
+ "magenta3",
+ "cyan3",
+ "gray90",
+
+ /* 8 bright colors */
+ "gray50",
+ "red",
+ "green",
+ "yellow",
+ "#5c5cff",
+ "magenta",
+ "cyan",
+ "white",
+
+ [255] = 0,
+
+ /* more colors can be added after 255 to use with DefaultXX */
+ "#cccccc",
+ "#555555",
+ "gray90", /* default foreground colour */
+ "black", /* default background colour */
+};
+
+
+/*
+ * Default colors (colorname index)
+ * foreground, background, cursor, reverse cursor
+ */
+unsigned int defaultfg = 258;
+unsigned int defaultbg = 259;
+unsigned int defaultcs = 256;
+static unsigned int defaultrcs = 257;
+
+/*
+ * Default shape of cursor
+ * 2: Block ("█")
+ * 4: Underline ("_")
+ * 6: Bar ("|")
+ * 7: Snowman ("☃")
+ */
+static unsigned int cursorshape = 2;
+
+/*
+ * Default columns and rows numbers
+ */
+
+static unsigned int cols = 80;
+static unsigned int rows = 24;
+
+/*
+ * Default colour and shape of the mouse cursor
+ */
+static unsigned int mouseshape = XC_xterm;
+static unsigned int mousefg = 7;
+static unsigned int mousebg = 0;
+
+/*
+ * Color used to display font attributes when fontconfig selected a font which
+ * doesn't match the ones requested.
+ */
+static unsigned int defaultattr = 11;
+
+/*
+ * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set).
+ * Note that if you want to use ShiftMask with selmasks, set this to an other
+ * modifier, set to 0 to not use it.
+ */
+static uint forcemousemod = ShiftMask;
+
+/*
+ * Internal mouse shortcuts.
+ * Beware that overloading Button1 will disable the selection.
+ */
+static MouseShortcut mshortcuts[] = {
+ /* mask button function argument release */
+ { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
+ { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
+ { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
+ { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} },
+ { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} },
+};
+
+/* Internal keyboard shortcuts. */
+#define MODKEY Mod1Mask
+#define TERMMOD (ControlMask|ShiftMask)
+
+static Shortcut shortcuts[] = {
+ /* mask keysym function argument */
+ { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} },
+ { ControlMask, XK_Print, toggleprinter, {.i = 0} },
+ { ShiftMask, XK_Print, printscreen, {.i = 0} },
+ { XK_ANY_MOD, XK_Print, printsel, {.i = 0} },
+ { TERMMOD, XK_Prior, zoom, {.f = +1} },
+ { TERMMOD, XK_Next, zoom, {.f = -1} },
+ { TERMMOD, XK_Home, zoomreset, {.f = 0} },
+ { TERMMOD, XK_C, clipcopy, {.i = 0} },
+ { TERMMOD, XK_V, clippaste, {.i = 0} },
+ { TERMMOD, XK_Y, selpaste, {.i = 0} },
+ { ShiftMask, XK_Insert, selpaste, {.i = 0} },
+ { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
+};
+
+/*
+ * Special keys (change & recompile st.info accordingly)
+ *
+ * Mask value:
+ * * Use XK_ANY_MOD to match the key no matter modifiers state
+ * * Use XK_NO_MOD to match the key alone (no modifiers)
+ * appkey value:
+ * * 0: no value
+ * * > 0: keypad application mode enabled
+ * * = 2: term.numlock = 1
+ * * < 0: keypad application mode disabled
+ * appcursor value:
+ * * 0: no value
+ * * > 0: cursor application mode enabled
+ * * < 0: cursor application mode disabled
+ *
+ * Be careful with the order of the definitions because st searches in
+ * this table sequentially, so any XK_ANY_MOD must be in the last
+ * position for a key.
+ */
+
+/*
+ * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
+ * to be mapped below, add them to this array.
+ */
+static KeySym mappedkeys[] = { -1 };
+
+/*
+ * State bits to ignore when matching key or button events. By default,
+ * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored.
+ */
+static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
+
+/*
+ * This is the huge key array which defines all compatibility to the Linux
+ * world. Please decide about changes wisely.
+ */
+static Key key[] = {
+ /* keysym mask string appkey appcursor */
+ { XK_KP_Home, ShiftMask, "\033[2J", 0, -1},
+ { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1},
+ { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1},
+ { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1},
+ { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0},
+ { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1},
+ { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1},
+ { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0},
+ { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1},
+ { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1},
+ { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0},
+ { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1},
+ { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1},
+ { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0},
+ { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1},
+ { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1},
+ { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0},
+ { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0},
+ { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0},
+ { XK_KP_End, ControlMask, "\033[J", -1, 0},
+ { XK_KP_End, ControlMask, "\033[1;5F", +1, 0},
+ { XK_KP_End, ShiftMask, "\033[K", -1, 0},
+ { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0},
+ { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0},
+ { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0},
+ { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0},
+ { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0},
+ { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0},
+ { XK_KP_Insert, ControlMask, "\033[L", -1, 0},
+ { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0},
+ { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0},
+ { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0},
+ { XK_KP_Delete, ControlMask, "\033[M", -1, 0},
+ { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0},
+ { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0},
+ { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0},
+ { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0},
+ { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0},
+ { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0},
+ { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0},
+ { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0},
+ { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0},
+ { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0},
+ { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0},
+ { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0},
+ { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0},
+ { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0},
+ { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0},
+ { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0},
+ { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0},
+ { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0},
+ { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0},
+ { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0},
+ { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0},
+ { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0},
+ { XK_Up, ShiftMask, "\033[1;2A", 0, 0},
+ { XK_Up, Mod1Mask, "\033[1;3A", 0, 0},
+ { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0},
+ { XK_Up, ControlMask, "\033[1;5A", 0, 0},
+ { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0},
+ { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0},
+ { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0},
+ { XK_Up, XK_ANY_MOD, "\033[A", 0, -1},
+ { XK_Up, XK_ANY_MOD, "\033OA", 0, +1},
+ { XK_Down, ShiftMask, "\033[1;2B", 0, 0},
+ { XK_Down, Mod1Mask, "\033[1;3B", 0, 0},
+ { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0},
+ { XK_Down, ControlMask, "\033[1;5B", 0, 0},
+ { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0},
+ { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0},
+ { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0},
+ { XK_Down, XK_ANY_MOD, "\033[B", 0, -1},
+ { XK_Down, XK_ANY_MOD, "\033OB", 0, +1},
+ { XK_Left, ShiftMask, "\033[1;2D", 0, 0},
+ { XK_Left, Mod1Mask, "\033[1;3D", 0, 0},
+ { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0},
+ { XK_Left, ControlMask, "\033[1;5D", 0, 0},
+ { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0},
+ { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0},
+ { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0},
+ { XK_Left, XK_ANY_MOD, "\033[D", 0, -1},
+ { XK_Left, XK_ANY_MOD, "\033OD", 0, +1},
+ { XK_Right, ShiftMask, "\033[1;2C", 0, 0},
+ { XK_Right, Mod1Mask, "\033[1;3C", 0, 0},
+ { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0},
+ { XK_Right, ControlMask, "\033[1;5C", 0, 0},
+ { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0},
+ { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0},
+ { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0},
+ { XK_Right, XK_ANY_MOD, "\033[C", 0, -1},
+ { XK_Right, XK_ANY_MOD, "\033OC", 0, +1},
+ { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0},
+ { XK_Return, Mod1Mask, "\033\r", 0, 0},
+ { XK_Return, XK_ANY_MOD, "\r", 0, 0},
+ { XK_Insert, ShiftMask, "\033[4l", -1, 0},
+ { XK_Insert, ShiftMask, "\033[2;2~", +1, 0},
+ { XK_Insert, ControlMask, "\033[L", -1, 0},
+ { XK_Insert, ControlMask, "\033[2;5~", +1, 0},
+ { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0},
+ { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0},
+ { XK_Delete, ControlMask, "\033[M", -1, 0},
+ { XK_Delete, ControlMask, "\033[3;5~", +1, 0},
+ { XK_Delete, ShiftMask, "\033[2K", -1, 0},
+ { XK_Delete, ShiftMask, "\033[3;2~", +1, 0},
+ { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0},
+ { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0},
+ { XK_BackSpace, XK_NO_MOD, "\177", 0, 0},
+ { XK_BackSpace, Mod1Mask, "\033\177", 0, 0},
+ { XK_Home, ShiftMask, "\033[2J", 0, -1},
+ { XK_Home, ShiftMask, "\033[1;2H", 0, +1},
+ { XK_Home, XK_ANY_MOD, "\033[H", 0, -1},
+ { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1},
+ { XK_End, ControlMask, "\033[J", -1, 0},
+ { XK_End, ControlMask, "\033[1;5F", +1, 0},
+ { XK_End, ShiftMask, "\033[K", -1, 0},
+ { XK_End, ShiftMask, "\033[1;2F", +1, 0},
+ { XK_End, XK_ANY_MOD, "\033[4~", 0, 0},
+ { XK_Prior, ControlMask, "\033[5;5~", 0, 0},
+ { XK_Prior, ShiftMask, "\033[5;2~", 0, 0},
+ { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0},
+ { XK_Next, ControlMask, "\033[6;5~", 0, 0},
+ { XK_Next, ShiftMask, "\033[6;2~", 0, 0},
+ { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0},
+ { XK_F1, XK_NO_MOD, "\033OP" , 0, 0},
+ { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0},
+ { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0},
+ { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0},
+ { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0},
+ { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0},
+ { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0},
+ { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0},
+ { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0},
+ { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0},
+ { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0},
+ { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0},
+ { XK_F3, XK_NO_MOD, "\033OR" , 0, 0},
+ { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0},
+ { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0},
+ { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0},
+ { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0},
+ { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0},
+ { XK_F4, XK_NO_MOD, "\033OS" , 0, 0},
+ { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0},
+ { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0},
+ { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0},
+ { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0},
+ { XK_F5, XK_NO_MOD, "\033[15~", 0, 0},
+ { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0},
+ { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0},
+ { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0},
+ { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0},
+ { XK_F6, XK_NO_MOD, "\033[17~", 0, 0},
+ { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0},
+ { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0},
+ { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0},
+ { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0},
+ { XK_F7, XK_NO_MOD, "\033[18~", 0, 0},
+ { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0},
+ { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0},
+ { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0},
+ { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0},
+ { XK_F8, XK_NO_MOD, "\033[19~", 0, 0},
+ { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0},
+ { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0},
+ { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0},
+ { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0},
+ { XK_F9, XK_NO_MOD, "\033[20~", 0, 0},
+ { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0},
+ { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0},
+ { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0},
+ { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0},
+ { XK_F10, XK_NO_MOD, "\033[21~", 0, 0},
+ { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0},
+ { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0},
+ { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0},
+ { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0},
+ { XK_F11, XK_NO_MOD, "\033[23~", 0, 0},
+ { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0},
+ { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0},
+ { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0},
+ { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0},
+ { XK_F12, XK_NO_MOD, "\033[24~", 0, 0},
+ { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0},
+ { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0},
+ { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0},
+ { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0},
+ { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0},
+ { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0},
+ { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0},
+ { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0},
+ { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0},
+ { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0},
+ { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0},
+ { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0},
+ { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0},
+ { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0},
+ { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0},
+ { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0},
+ { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0},
+ { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0},
+ { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0},
+ { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0},
+ { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0},
+ { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0},
+ { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0},
+ { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0},
+ { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0},
+ { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0},
+ { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0},
+};
+
+/*
+ * Selection types' masks.
+ * Use the same masks as usual.
+ * Button1Mask is always unset, to make masks match between ButtonPress.
+ * ButtonRelease and MotionNotify.
+ * If no match is found, regular selection is used.
+ */
+static uint selmasks[] = {
+ [SEL_RECTANGULAR] = Mod1Mask,
+};
+
+/*
+ * Printable characters in ASCII, used to estimate the advance width
+ * of single wide characters.
+ */
+static char ascii_printable[] =
+ " !\"#$%&'()*+,-./0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+ "`abcdefghijklmnopqrstuvwxyz{|}~";
diff --git a/savedconfig/x11-wm/dwm-6.4 b/savedconfig/x11-wm/dwm-6.4
@@ -0,0 +1,124 @@
+/* See LICENSE file for copyright and license details. */
+
+/* alt-tab configuration */
+static const unsigned int tabModKey = 0x40; /* if this key is hold the alt-tab functionality stays acitve. This key must be the same as key that is used to active functin altTabStart `*/
+static const unsigned int tabCycleKey = 0x17; /* if this key is hit the alt-tab program moves one position forward in clients stack. This key must be the same as key that is used to active functin altTabStart */
+static const unsigned int tabPosY = 1; /* tab position on Y axis, 0 = bottom, 1 = center, 2 = top */
+static const unsigned int tabPosX = 1; /* tab position on X axis, 0 = left, 1 = center, 2 = right */
+static const unsigned int maxWTab = 600; /* tab menu width */
+static const unsigned int maxHTab = 200; /* tab menu height */
+
+/* appearance */
+static const unsigned int borderpx = 0; /* border pixel of windows */
+static const unsigned int snap = 32; /* snap pixel */
+static const int showbar = 0; /* 0 means no bar */
+static const int topbar = 1; /* 0 means bottom bar */
+static const char *fonts[] = { "monospace:size=10" };
+static const char dmenufont[] = "monospace:size=10";
+static const char col_gray1[] = "#222222";
+static const char col_gray2[] = "#444444";
+static const char col_gray3[] = "#bbbbbb";
+static const char col_gray4[] = "#eeeeee";
+static const char col_cyan[] = "#ce4404";
+static const char *colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan },
+};
+
+/* tagging */
+static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+
+static const Rule rules[] = {
+ /* xprop(1):
+ * WM_CLASS(STRING) = instance, class
+ * WM_NAME(STRING) = title
+ */
+ /* class instance title tags mask isfloating monitor */
+ { "Gimp", NULL, NULL, 0, 1, -1 },
+ { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
+};
+
+/* layout(s) */
+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster = 1; /* number of clients in master area */
+static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
+static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
+
+static const Layout layouts[] = {
+ /* symbol arrange function */
+ { "[M]", monocle },
+ { "><>", NULL }, /* no layout function means floating behavior */
+ { "[]=", tile }, /* first entry is default */
+};
+
+/* key definitions */
+#define MODKEY Mod4Mask
+#define TAGKEYS(KEY,TAG) \
+ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
+ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
+
+/* helper for spawning shell commands in the pre dwm-5.0 fashion */
+#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+
+/* commands */
+static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
+static const char *termcmd[] = { "st", NULL };
+
+static const Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_p, spawn, {.v = dmenucmd } },
+ { MODKEY, XK_space, spawn, {.v = termcmd } },
+ { MODKEY, XK_b, togglebar, {0} },
+ { MODKEY, XK_j, focusstack, {.i = +1 } },
+ { MODKEY, XK_k, focusstack, {.i = -1 } },
+ { MODKEY, XK_i, incnmaster, {.i = +1 } },
+ { MODKEY, XK_d, incnmaster, {.i = -1 } },
+ { MODKEY, XK_h, setmfact, {.f = -0.05} },
+ { MODKEY, XK_l, setmfact, {.f = +0.05} },
+ { MODKEY, XK_Return, zoom, {0} },
+ { MODKEY, XK_q, view, {0} },
+ { MODKEY, XK_c, killclient, {0} },
+ { MODKEY, XK_m, setlayout, {.v = &layouts[0]} },
+ { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[2]} },
+ { MODKEY|ShiftMask, XK_Return, setlayout, {0} },
+ { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
+ { MODKEY, XK_0, view, {.ui = ~0 } },
+ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
+ { MODKEY, XK_comma, focusmon, {.i = -1 } },
+ { MODKEY, XK_period, focusmon, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
+ { Mod1Mask, XK_Tab, altTabStart, {0} },
+ TAGKEYS( XK_1, 0)
+ TAGKEYS( XK_2, 1)
+ TAGKEYS( XK_3, 2)
+ TAGKEYS( XK_4, 3)
+ TAGKEYS( XK_5, 4)
+ TAGKEYS( XK_6, 5)
+ TAGKEYS( XK_7, 6)
+ TAGKEYS( XK_8, 7)
+ TAGKEYS( XK_9, 8)
+ { MODKEY|ShiftMask, XK_q, quit, {0} },
+};
+
+/* button definitions */
+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
+static const Button buttons[] = {
+ /* click event mask button function argument */
+ { ClkLtSymbol, 0, Button1, setlayout, {0} },
+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
+ { ClkWinTitle, 0, Button2, zoom, {0} },
+ { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
+ { ClkClientWin, MODKEY, Button1, movemouse, {0} },
+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
+ { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
+ { ClkTagBar, 0, Button1, view, {0} },
+ { ClkTagBar, 0, Button3, toggleview, {0} },
+ { ClkTagBar, MODKEY, Button1, tag, {0} },
+ { ClkTagBar, MODKEY, Button3, toggletag, {0} },
+};
+
diff --git a/savedconfig/x11-wm/dwm-6.5 b/savedconfig/x11-wm/dwm-6.5
@@ -0,0 +1,158 @@
+/* See LICENSE file for copyright and license details. */
+
+#define ICONSIZE 20 /* icon size in pixels */
+#define ICONSPACING 5 /* space (pixels) between icon and title */
+
+/* alt-tab configuration */
+static const unsigned int tabModKey = 0x40; /* if this key is hold the alt-tab functionality stays acitve. This key must be the same as key that is used to active functin altTabStart `*/
+static const unsigned int tabCycleKey = 0x17; /* if this key is hit the alt-tab program moves one position forward in clients stack. This key must be the same as key that is used to active functin altTabStart */
+static const unsigned int tabPosY = 1; /* tab position on Y axis, 0 = bottom, 1 = center, 2 = top */
+static const unsigned int tabPosX = 1; /* tab position on X axis, 0 = left, 1 = center, 2 = right */
+static const unsigned int maxWTab = 600; /* tab menu width */
+static const unsigned int maxHTab = 200; /* tab menu height */
+
+/* appearance */
+static const unsigned int borderpx = 1; /* border pixel of windows */
+static const unsigned int gappx = 5; /* gaps between windows */
+static const unsigned int snap = 32; /* snap pixel */
+static const int showbar = 1; /* 0 means no bar */
+static const int topbar = 1; /* 0 means bottom bar */
+static const char *fonts[] = { "monospace:size=12", "fontawesome:size=12" };
+static const char dmenufont[] = "monospace:size=12";
+static const char col_gray1[] = "#222222";
+static const char col_gray2[] = "#444444";
+static const char col_gray3[] = "#bbbbbb";
+static const char col_gray4[] = "#eeeeee";
+static const char col_cyan[] = "#ce4404";
+static const char *colors[][3] = {
+ /* fg bg border */
+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan },
+};
+
+/* tagging */
+static const char *tags[] = { "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉" };
+
+static const Rule rules[] = {
+ /* xprop(1):
+ * WM_CLASS(STRING) = instance, class
+ * WM_NAME(STRING) = title
+ */
+ /* class instance title tags mask isfloating monitor */
+ { "st", NULL, "MP3", 1 << 5, 0, -1 },
+ { "mpv", NULL, "MPV", 1 << 6, 0, -1 },
+};
+
+/* layout(s) */
+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster = 1; /* number of clients in master area */
+static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
+static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
+
+static const Layout layouts[] = {
+ /* symbol arrange function */
+ { "[M]", monocle },
+ { "><>", NULL }, /* no layout function means floating behavior */
+ { "[]=", tile }, /* first entry is default */
+};
+
+/* key definitions */
+#define MODKEY Mod4Mask
+#define TAGKEYS(KEY,TAG) \
+ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
+ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
+ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
+
+/* helper for spawning shell commands in the pre dwm-5.0 fashion */
+#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+
+/* commands */
+static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, "-hp", "qutebrowser,discord,steam", NULL };
+static const char *termcmd[] = { "st", NULL };
+static const char *sc[] = { "sc", NULL };
+static const char *vimator[] = { "vimator", NULL };
+static const char *altl[] = { "altl", NULL };
+static const char *musplus[] = { "musplus", NULL };
+static const char *musminus[] = { "musminus", NULL };
+static const char *altspace[] = { "altspace", NULL };
+static const char *altnine[] = { "altnine", NULL };
+static const char *altzero[] = { "altzero", NULL };
+static const char *altq[] = { "altq", NULL };
+static const char *altb[] = { "altb", NULL };
+static const char *alts[] = { "alts", NULL };
+static const char *alto[] = { "alto", NULL };
+
+
+static const Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_p, spawn, {.v = dmenucmd } },
+ { MODKEY, XK_space, spawn, {.v = termcmd } },
+ { MODKEY, XK_b, togglebar, {0} },
+ { MODKEY, XK_j, focusstack, {.i = +1 } },
+ { MODKEY, XK_k, focusstack, {.i = -1 } },
+ { MODKEY, XK_i, incnmaster, {.i = +1 } },
+ { MODKEY, XK_d, incnmaster, {.i = -1 } },
+ { MODKEY, XK_h, setmfact, {.f = -0.05} },
+ { MODKEY, XK_l, setmfact, {.f = +0.05} },
+ { MODKEY, XK_Return, zoom, {0} },
+ { MODKEY, XK_q, view, {0} },
+ { MODKEY, XK_c, killclient, {0} },
+ { MODKEY, XK_m, setlayout, {.v = &layouts[0]} },
+ { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
+ { MODKEY, XK_t, setlayout, {.v = &layouts[2]} },
+ { MODKEY|ShiftMask, XK_Return, setlayout, {0} },
+ { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
+ { MODKEY, XK_0, view, {.ui = ~0 } },
+ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
+ { MODKEY, XK_comma, focusmon, {.i = -1 } },
+ { MODKEY, XK_period, focusmon, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
+ { MODKEY, XK_s, spawn, {.v = sc } },
+ { MODKEY, XK_a, spawn, {.v = vimator } },
+ { Mod1Mask, XK_l, spawn, {.v = altl } },
+ { Mod1Mask, XK_period, spawn, {.v = musplus } },
+ { Mod1Mask, XK_comma, spawn, {.v = musminus } },
+ { Mod1Mask, XK_space, spawn, {.v = altspace } },
+ { Mod1Mask, XK_9, spawn, {.v = altnine } },
+ { Mod1Mask, XK_0, spawn, {.v = altzero } },
+ { Mod1Mask, XK_q, spawn, {.v = altq } },
+ { Mod1Mask|ShiftMask, XK_period, spawn, {.v = altb } },
+ { Mod1Mask|ShiftMask, XK_comma, spawn, {.v = alts } },
+ { Mod1Mask, XK_o, spawn, {.v = alto } },
+ { Mod1Mask, XK_Tab, altTabStart, {0} },
+ { MODKEY, XK_Right, viewnext, {0} },
+ { MODKEY, XK_Left, viewprev, {0} },
+ { MODKEY|ShiftMask, XK_Right, tagtonext, {0} },
+ { MODKEY|ShiftMask, XK_Left, tagtoprev, {0} },
+ TAGKEYS( XK_1, 0)
+ TAGKEYS( XK_2, 1)
+ TAGKEYS( XK_3, 2)
+ TAGKEYS( XK_4, 3)
+ TAGKEYS( XK_5, 4)
+ TAGKEYS( XK_6, 5)
+ TAGKEYS( XK_7, 6)
+ TAGKEYS( XK_8, 7)
+ TAGKEYS( XK_9, 8)
+ { MODKEY|ShiftMask, XK_q, quit, {0} },
+};
+
+/* button definitions */
+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
+static const Button buttons[] = {
+ /* click event mask button function argument */
+ { ClkLtSymbol, 0, Button1, setlayout, {0} },
+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
+ { ClkWinTitle, 0, Button2, zoom, {0} },
+ { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
+ { ClkClientWin, MODKEY, Button1, movemouse, {0} },
+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
+ { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
+ { ClkTagBar, 0, Button1, view, {0} },
+ { ClkTagBar, 0, Button3, toggleview, {0} },
+ { ClkTagBar, MODKEY, Button1, tag, {0} },
+ { ClkTagBar, MODKEY, Button3, toggletag, {0} },
+};
+
diff --git a/sinit/dtinit b/sinit/dtinit
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /var/rc/dtinit/dtinit.sh
diff --git a/sinit/sound b/sinit/sound
@@ -0,0 +1,27 @@
+#!/bin/sh
+alsastatedir=/var/lib/alsa
+alsascrdir=/etc/alsa.d
+alsahomedir=/run/alsasound
+cards="$(sed -n -e 's/^ *\([[:digit:]]*\) .*/\1/p' /proc/asound/cards)"
+for cardnum in $cards; do
+ [ -e /dev/snd/controlC$cardnum ] || sleep 2
+ [ -e /dev/snd/controlC$cardnum ] || sleep 2
+ [ -e /dev/snd/controlC$cardnum ] || sleep 2
+ [ -e /dev/snd/controlC$cardnum ] || sleep 2
+ alsactl -E HOME="$alsahomedir" -I -f "$alsastatedir/asound.state" restore $cardnum
+done
+
+for ossfile in "$alsastatedir"/oss/card*_pcm* ; do
+ [ -e "$ossfile" ] || continue
+ # We use cat because I'm not sure if cp works properly on /proc
+ procfile=$ossfile$alsastatedir/oss
+ procfile="$(echo "$procfile" | sed -e 's,_,/,g')"
+ if [ -e /proc/asound/"$procfile"/oss ] ; then
+ cat "$ossfile" > /proc/asound/"$procfile"/oss
+ fi
+done
+sleep 3
+chown root:audio /dev/snd/*
+chown root:audio /dev/snd
+chmod -R a+rw /dev/snd
+lk_forever 3600
diff --git a/vimrc b/vimrc
@@ -0,0 +1,228 @@
+scriptencoding utf-8
+" ^^ Please leave the above line at the start of the file.
+
+" Default configuration file for Vim
+
+" Written by Aron Griffis <agriffis@gentoo.org>
+" Modified by Ryan Phillips <rphillips@gentoo.org>
+" Modified some more by Ciaran McCreesh <ciaranm@gentoo.org>
+" Added Redhat's vimrc info by Seemant Kulleen <seemant@gentoo.org>
+
+" You can override any of these settings on a global basis via the
+" "/etc/vim/vimrc.local" file, and on a per-user basis via "~/.vimrc". You may
+" need to create these.
+
+" {{{ General settings
+" The following are some sensible defaults for Vim for most users.
+" We attempt to change as little as possible from Vim's defaults,
+" deviating only where it makes sense
+set nocompatible " Use Vim defaults (much better!)
+set bs=2 " Allow backspacing over everything in insert mode
+set ai " Always set auto-indenting on
+set history=50 " keep 50 lines of command history
+set ruler " Show the cursor position all the time
+
+set viminfo='20,\"500 " Keep a .viminfo file.
+
+" Don't use Ex mode, use Q for formatting
+map Q gq
+
+" When doing tab completion, give the following files lower priority. You may
+" wish to set 'wildignore' to completely ignore files, and 'wildmenu' to enable
+" enhanced tab completion. These can be done in the user vimrc file.
+set suffixes+=.info,.aux,.log,.dvi,.bbl,.out,.o,.lo
+
+" When displaying line numbers, don't use an annoyingly wide number column. This
+" doesn't enable line numbers -- :set number will do that. The value given is a
+" minimum width to use for the number column, not a fixed size.
+if v:version >= 700
+ set numberwidth=3
+endif
+" }}}
+
+" {{{ Modeline settings
+" We don't allow modelines by default. See bug #14088 and bug #73715.
+" If you're not concerned about these, you can enable them on a per-user
+" basis by adding "set modeline" to your ~/.vimrc file.
+set nomodeline
+" }}}
+
+" {{{ Locale settings
+" Try to come up with some nice sane GUI fonts. Also try to set a sensible
+" value for fileencodings based upon locale. These can all be overridden in
+" the user vimrc file.
+if v:lang =~? "^ko"
+ set fileencodings=euc-kr
+ set guifontset=-*-*-medium-r-normal--16-*-*-*-*-*-*-*
+elseif v:lang =~? "^ja_JP"
+ set fileencodings=euc-jp
+ set guifontset=-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*
+elseif v:lang =~? "^zh_TW"
+ set fileencodings=big5
+ set guifontset=-sony-fixed-medium-r-normal--16-150-75-75-c-80-iso8859-1,-taipei-fixed-medium-r-normal--16-150-75-75-c-160-big5-0
+elseif v:lang =~? "^zh_CN"
+ set fileencodings=gb2312
+ set guifontset=*-r-*
+endif
+
+" If we have a BOM, always honour that rather than trying to guess.
+if &fileencodings !~? "ucs-bom"
+ set fileencodings^=ucs-bom
+endif
+
+" Always check for UTF-8 when trying to determine encodings.
+if &fileencodings !~? "utf-8"
+ " If we have to add this, the default encoding is not Unicode.
+ " We use this fact later to revert to the default encoding in plaintext/empty
+ " files.
+ let g:added_fenc_utf8 = 1
+ set fileencodings+=utf-8
+endif
+
+" Make sure we have a sane fallback for encoding detection
+if &fileencodings !~? "default"
+ set fileencodings+=default
+endif
+" }}}
+
+" {{{ Syntax highlighting settings
+" Switch syntax highlighting on, when the terminal has colors
+" Also switch on highlighting the last used search pattern.
+if &t_Co > 2 || has("gui_running")
+ syntax on
+ set hlsearch
+endif
+" }}}
+
+" {{{ Terminal fixes
+if &term ==? "xterm"
+ set t_Sb=^[4%dm
+ set t_Sf=^[3%dm
+ set ttymouse=xterm2
+endif
+
+if &term ==? "gnome" && has("eval")
+ " Set useful keys that vim doesn't discover via termcap but are in the
+ " builtin xterm termcap. See bug #122562. We use exec to avoid having to
+ " include raw escapes in the file.
+ exec "set <C-Left>=\eO5D"
+ exec "set <C-Right>=\eO5C"
+endif
+" }}}
+
+" {{{ Filetype plugin settings
+" Enable plugin-provided filetype settings, but only if the ftplugin
+" directory exists (which it won't on livecds, for example).
+if isdirectory(expand("$VIMRUNTIME/ftplugin"))
+ filetype plugin on
+
+ " Uncomment the next line (or copy to your ~/.vimrc) for plugin-provided
+ " indent settings. Some people don't like these, so we won't turn them on by
+ " default.
+ " filetype indent on
+endif
+" }}}
+
+" {{{ Fix &shell, see bug #101665.
+if "" == &shell
+ if executable("/bin/bash")
+ set shell=/bin/bash
+ elseif executable("/bin/sh")
+ set shell=/bin/sh
+ endif
+endif
+"}}}
+
+" {{{ Our default /bin/sh is bash, not ksh, so syntax highlighting for .sh
+" files should default to bash. See :help sh-syntax and bug #101819.
+if has("eval")
+ let is_bash=1
+endif
+" }}}
+
+" {{{ Autocommands
+if has("autocmd")
+
+" let @b='ggVG:norm$bd2bhhda]hx'
+
+let @a='S(v%:norm A i 26to33? )lv%:s/ //g$?( :wlvggd/ )vG$da ):w! /tmp/alp:open!ndi(h2xik!!/home/plat/scripts/vima.shinoNvjdi 26to3326to3 3:%s/26to33//g:%s/26to3 3//g'
+let @s='S(v%:norm A i 26to33? )lv%:s/ //g$?( :wlvggd/ )vG$da ):w! /tmp/smol:open!ndi(h2xik!!/home/plat/scripts/vims.shinoNvjdi 26to3326to3 3:%s/26to33//g:%s/26to3 3//g'
+let @b='S(v%:norm A i 26to33? )lv%:s/ //g$?( :wlvggd/ )vG$da ):w! /tmp/beeg:open!ndi(h2xik!!/home/plat/scripts/vimb.shinoNvjdi 26to3326to3 3:%s/26to33//g:%s/26to3 3//g'
+let @c='y:wGopk$dgg:w! /tmp/vimclip:!xclip -sel c /tmp/vimclip:open!'
+
+augroup gentoo
+ au!
+
+ " Gentoo-specific settings for ebuilds. These are the federally-mandated
+ " required tab settings. See the following for more information:
+ " http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml
+ " Note that the rules below are very minimal and don't cover everything.
+ " Better to emerge app-vim/gentoo-syntax, which provides full syntax,
+ " filetype and indent settings for all things Gentoo.
+ au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh
+ au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab
+
+ " In text files, limit the width of text to 78 characters, but be careful
+ " that we don't override the user's setting.
+ autocmd BufNewFile,BufRead *.txt
+ \ if &tw == 0 && ! exists("g:leave_my_textwidth_alone") |
+ \ setlocal textwidth=78 |
+ \ endif
+
+ " When editing a file, always jump to the last cursor position
+ autocmd BufReadPost *
+ \ if ! exists("g:leave_my_cursor_position_alone") |
+ \ if line("'\"") > 0 && line ("'\"") <= line("$") |
+ \ exe "normal! g'\"" |
+ \ endif |
+ \ endif
+
+ " When editing a crontab file, set backupcopy to yes rather than auto. See
+ " :help crontab and bug #53437.
+ autocmd FileType crontab set backupcopy=yes
+
+ " If we previously detected that the default encoding is not UTF-8
+ " (g:added_fenc_utf8), assume that a file with only ASCII characters (or no
+ " characters at all) isn't a Unicode file, but is in the default encoding.
+ " Except of course if a byte-order mark is in effect.
+ autocmd BufReadPost *
+ \ if exists("g:added_fenc_utf8") && &fileencoding == "utf-8" &&
+ \ ! &bomb && search('[\x80-\xFF]','nw') == 0 && &modifiable |
+ \ set fileencoding= |
+ \ endif
+
+augroup END
+
+endif " has("autocmd")
+" }}}
+
+" We don't want VIM to load their own built-in defaults, preferring ours here
+" instead. This option cannot apply to minimal builds, so it is guarded by a
+" test that's guaranteed to fail for those, owing to the lack of +eval.
+if 1
+ let g:skip_defaults_vim = 1
+endif
+
+" Enable Omni completion when opening a file only if a specific plugin does
+" not already exist for that filetype. This allows Omni completion
+" (Ctrl-x/Ctrl-o) to work with any programming language if and only if a syntax
+" file exists for the said language.
+if exists("+omnifunc")
+ autocmd Filetype *
+ \ if &omnifunc == "" |
+ \ setlocal omnifunc=syntaxcomplete#Complete |
+ \ endif
+endif
+
+" {{{ vimrc.local
+if filereadable("/etc/vim/vimrc.local")
+ source /etc/vim/vimrc.local
+endif
+" }}}
+
+" vim: set fenc=utf-8 tw=80 sw=2 sts=2 et foldmethod=marker :
+
+let &t_BE = "\[?2004h"
+let &t_BD = "\[?2004l"
+let &t_PS = "\[200~"
+let &t_PE = "\[201~"