install: all
mkdir -p $(DESTDIR)$(PREFIX)/bin
- cp -f dmenu dmenu_path dmenu_run stest dmenu-scripts/* $(DESTDIR)$(PREFIX)/bin
+ cp -f dmenu stest extras/dmenu-scripts/* $(DESTDIR)$(PREFIX)/bin
+ cp -fr extras/chars $(DESTDIR)$(LIBPREFIX)/TuCLS/
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run
chmod 755 $(DESTDIR)$(PREFIX)/bin/stest
chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-displayselect
chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-handler
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-kampv
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-maimpick
chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-mountcifs
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-mounter
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-umounter
chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-pass
- chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-unicode
- chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-kampv
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-record
chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-streamselect
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-sysact
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dm-unicode
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1
sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1
# paths
PREFIX = /usr/local
MANPREFIX = $(PREFIX)/share/man
+LIBPREFIX = /usr/lib
X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
+++ /dev/null
-#!/bin/sh
-
-# A UI for detecting and selecting all displays. Probes xrandr for connected
-# displays and lets user select one to use. User may also select "manual
-# selection" which opens arandr.
-
-twoscreen() { # If multi-monitor is selected and there are two screens.
-
- mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?")
- # Mirror displays using native resolution of external display and a scaled
- # version for the internal display
- if [ "$mirror" = "yes" ]; then
- external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:")
- internal=$(echo "$screens" | grep -v "$external")
-
- res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \
- tail -n 1 | awk '{print $1}')
- res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \
- tail -n 1 | awk '{print $1}')
-
- res_ext_x=$(echo "$res_external" | sed 's/x.*//')
- res_ext_y=$(echo "$res_external" | sed 's/.*x//')
- res_int_x=$(echo "$res_internal" | sed 's/x.*//')
- res_int_y=$(echo "$res_internal" | sed 's/.*x//')
-
- scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l)
- scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l)
-
- xrandr --output "$external" --auto --scale 1.0x1.0 \
- --output "$internal" --auto --same-as "$external" \
- --scale "$scale_x"x"$scale_y"
- else
-
- primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
- secondary=$(echo "$screens" | grep -v "$primary")
- direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
- xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0
- fi
- }
-
-morescreen() { # If multi-monitor is selected and there are more than two screens.
- primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
- secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:")
- direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
- tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:")
- xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto
- }
-
-multimon() { # Multi-monitor handler.
- case "$(echo "$screens" | wc -l)" in
- 2) twoscreen ;;
- *) morescreen ;;
- esac ;}
-
-onescreen() { # If only one output available or chosen.
- xrandr --output "$1" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "\b$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -)
- }
-
-postrun() { # Stuff to run to clean up.
- setbg # Fix background if screen size/arangement has changed.
- { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen
- }
-
-# Get all possible displays
-allposs=$(xrandr -q | grep "connected")
-
-# Get all connected screens.
-screens=$(echo "$allposs" | awk '/ connected/ {print $1}')
-
-# If there's only one screen
-[ "$(echo "$screens" | wc -l)" -lt 2 ] &&
- { onescreen "$screens"; postrun; notify-send "💻 Only one screen detected." "Using it in its optimal settings..."; exit ;}
-
-# Get user choice including multi-monitor and manual selection:
-chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") &&
-case "$chosen" in
- "manual selection") arandr ; exit ;;
- "multi-monitor") multimon ;;
- *) onescreen "$chosen" ;;
-esac
-
-postrun
+++ /dev/null
-#!/bin/sh
-
-# Feed this script a link and it will give dmenu
-# some choice programs to use to open it.
-feed="${1:-$(true | dmenu -p 'Paste URL or file path')}"
-
-case "$(printf "copy url\\nnsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in
- "copy url") echo "$feed" | xclip -selection clipboard ;;
- mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;;
- "mpv loop") setsid -f mpv -quiet --loop "$feed" >/dev/null 2>&1 ;;
- "mpv float") setsid -f "$TERMINAL" -e mpv --geometry=+0-0 --autofit=30% --title="mpvfloat" "$feed" >/dev/null 2>&1 ;;
- "queue yt-dlp") qndl "$feed" >/dev/null 2>&1 ;;
- "queue yt-dlp audio") qndl "$feed" 'yt-dlp -o "%(title)s.%(ext)s" -f bestaudio --embed-metadata --restrict-filenames' ;;
- "queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;;
- PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
- nsxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && nsxiv -a "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
- vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
- setbg) curl -L "$feed" > $XDG_CACHE_HOME/pic ; xwallpaper --zoom $XDG_CACHE_HOME/pic >/dev/null 2>&1 ;;
- browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;;
- lynx) lynx "$feed" >/dev/null 2>&1 ;;
-esac
+++ /dev/null
-#!/bin/sh
-
-killall mpv
+++ /dev/null
-#!/bin/sh
-
-# This is bound to Shift+PrintScreen by default, requires maim. It lets you
-# choose the kind of screenshot to take, including copying the image or even
-# highlighting an area to copy. scrotcucks on suicidewatch right now.
-
-# variables
-output="$(date '+%y%m%d-%H%M-%S').png"
-xclip_cmd="xclip -sel clip -t image/png"
-
-case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in
- "a selected area") maim -u -s pic-selected-"${output}" ;;
- "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;;
- "full screen") maim -q -d 0.2 pic-full-"${output}" ;;
- "a selected area (copy)") maim -u -s | ${xclip_cmd} ;;
- "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;;
- "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;;
-esac
+++ /dev/null
-#!/bin/sh
-# Gives a dmenu prompt to mount unmounted local NAS shares for read/write.
-# Requirements - "%wheel ALL=(ALL) NOPASSWD: ALL"
-#
-# Browse for mDNS/DNS-SD services using the Avahi daemon...
-srvname=$(avahi-browse _smb._tcp -t | awk '{print $4}' | dmenu -i -p "Which NAS?") || exit 1
-notify-send "Searching for network shares..." "Please wait..."
-# Choose share disk...
-share=$(smbclient -L "$srvname" -N | grep Disk | awk '{print $1}' | dmenu -i -p "Mount which share?") || exit 1
-# Format URL...
-share2mnt=//"$srvname".local/"$share"
-
-sharemount() {
- mounted=$(mount -v | grep "$share2mnt") || ([ ! -d /mnt/"$share" ] && sudo mkdir /mnt/"$share")
- [ -z "$mounted" ] && sudo mount -t cifs "$share2mnt" -o user=nobody,password="",noperm /mnt/"$share" && notify-send "Netshare $share mounted" && exit 0
- notify-send "Netshare $share already mounted"; exit 1
-}
-
-sharemount
+++ /dev/null
-#!/bin/bash
-
-# Mounts Android Phones and USB drives (encrypted or not).
-
-IFS='
-'
-# Function for escaping cell-phone names.
-escape(){ echo "$@" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g" ;}
-
-# Check for phones.
-phones="$(simple-mtpfs -l 2>/dev/null | sed "s/^/📱/")"
-mountedphones="$(grep "simple-mtpfs" /etc/mtab)"
-# If there are already mounted phones, remove them from the list of mountables.
-[ -n "$mountedphones" ] && phones="$(for phone in $phones; do
- for mounted in $mountedphones; do
- escphone="$(escape "$phone")"
- [[ "$mounted" =~ "$escphone" ]] && break 1
- done && continue 1
- echo "$phone"
-done)"
-
-# Check for drives.
-lsblkoutput="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")"
-# Get all LUKS drives
-allluks="$(echo "$lsblkoutput" | grep crypto_LUKS)"
-# Get a list of the LUKS drive UUIDs already decrypted.
-decrypted="$(find /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-* | sed "s|.*LUKS2-||;s|-.*||")"
-# Functioning for formatting drives correctly for dmenu:
-filter() { sed "s/ /:/g" | awk -F':' '$7==""{printf "%s%s (%s) %s\n",$1,$3,$5,$6}' ; }
-
-# Get only LUKS drives that are not decrypted.
-unopenedluks="$(for drive in $allluks; do
- uuid="${drive%% *}"
- uuid="${uuid//-}" # This is a bashism.
- [ -n "$decrypted" ] && for open in $decrypted; do
- [ "$uuid" = "$open" ] && break 1
- done && continue 1
- echo "🔒 $drive"
-done | filter)"
-
-# Get all normal, non-encrypted or decrypted partitions that are not mounted.
-normalparts="$(echo "$lsblkoutput"| grep -v crypto_LUKS | grep 'part\|rom\|crypt' | sed "s/^/💾 /" | filter )"
-
-# Add all to one variable. If no mountable drives found, exit.
-alldrives="$(echo "$phones
-$unopenedluks
-$normalparts" | sed "/^$/d;s/ *$//")"
-
-# Quit the script if a sequential command fails.
-set -e
-
-test -n "$alldrives"
-
-# Feed all found drives to dmenu and get user choice.
-chosen="$(echo "$alldrives" | dmenu -p "Mount which drive?" -i)"
-
-# Function for prompting user for a mountpoint.
-getmount(){
- mp="$(find /mnt /media /mount /home -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")"
- test -n "$mp"
- if [ ! -d "$mp" ]; then
- mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?")
- [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
- fi
-}
-
-attemptmount(){
- # Attempt to mount without a mountpoint, to see if drive is in fstab.
- sudo -A mount "$chosen" || return 1
- notify-send "💾Drive Mounted." "$chosen mounted."
- exit
-}
-
-case "$chosen" in
- 💾*)
- chosen="${chosen%% *}"
- chosen="${chosen:1}" # This is a bashism.
- parttype="$(echo "$lsblkoutput" | grep "$chosen")"
- attemptmount || getmount
- case "${parttype##* }" in
- vfat) sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000 ;;
- btrfs) sudo -A mount "$chosen" "$mp" ;;
- *) sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)" ;;
- esac
- notify-send "💾Drive Mounted." "$chosen mounted to $mp."
- ;;
-
- 🔒*)
- chosen="${chosen%% *}"
- chosen="${chosen:1}" # This is a bashism.
- # Number the drive.
- while true; do
- [ -f "/dev/mapper/usb$num" ] || break
- num="$(printf "%02d" "$((num +1))")"
- done
-
- # Decrypt in a terminal window
- ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$chosen" "usb$num"
- # Check if now decrypted.
- test -b "/dev/mapper/usb$num"
-
- attemptmount || getmount
- sudo -A mount "/dev/mapper/usb$num" "$mp" -o uid="$(id -u)",gid="$(id -g)"
- notify-send "🔓Decrypted drive Mounted." "$chosen decrypted and mounted to $mp."
- ;;
-
- 📱*)
- notify-send "❗Note" "Remember to allow file access on your phone now."
- getmount
- number="${chosen%%:*}"
- number="${chosen:1}" # This is a bashism.
- sudo -A simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp"
- notify-send "🤖 Android Mounted." "Android device mounted to $mp."
- ;;
-esac
+++ /dev/null
-#!/bin/sh
-
-# This script is the SUDO_ASKPASS variable, meaning that it will be used as a
-# password prompt if needed.
-
-dmenu -fn Monospace-18 -P -p "$1" <&- && echo
+++ /dev/null
-#!/bin/sh
-
-# Usage:
-# `$0`: Ask for recording type via dmenu
-# `$0 screencast`: Record both audio and screen
-# `$0 video`: Record only screen
-# `$0 audio`: Record only audio
-# `$0 kill`: Kill existing recording
-#
-# If there is already a running instance, user will be prompted to end it.
-
-getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;}
-
-updateicon() { \
- echo "$1" > /tmp/recordingicon
- pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
- }
-
-killrecording() {
- recpid="$(cat /tmp/recordingpid)"
- kill -15 "$recpid"
- rm -f /tmp/recordingpid
- updateicon ""
- pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
- }
-
-screencast() { \
- ffmpeg -y \
- -f x11grab \
- -framerate 30 \
- -s "$(getdim)" \
- -i "$DISPLAY" \
- -r 24 \
- -use_wallclock_as_timestamps 1 \
- -f alsa -thread_queue_size 1024 -i default \
- -c:v h264 \
- -crf 0 -preset ultrafast -c:a aac \
- "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
- echo $! > /tmp/recordingpid
- updateicon "⏺️🎙️"
- }
-
-video() { ffmpeg \
- -f x11grab \
- -framerate 30 \
- -s "$(getdim)" \
- -i "$DISPLAY" \
- -c:v libx264 -qp 0 -r 30 \
- "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
- echo $! > /tmp/recordingpid
- updateicon "⏺️"
- }
-
-webcamhidef() { ffmpeg \
- -f v4l2 \
- -i /dev/video0 \
- -video_size 1920x1080 \
- "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
- echo $! > /tmp/recordingpid
- updateicon "🎥"
- }
-
-webcam() { ffmpeg \
- -f v4l2 \
- -i /dev/video0 \
- -video_size 640x480 \
- "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
- echo $! > /tmp/recordingpid
- updateicon "🎥"
- }
-
-
-audio() { \
- ffmpeg \
- -f alsa -i default \
- -c:a flac \
- "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" &
- echo $! > /tmp/recordingpid
- updateicon "🎙️"
- }
-
-askrecording() { \
- choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
- case "$choice" in
- screencast) screencast;;
- audio) audio;;
- video) video;;
- *selected) videoselected;;
- webcam) webcam;;
- "webcam (hi-def)") webcamhidef;;
- esac
- }
-
-asktoend() { \
- response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
- [ "$response" = "Yes" ] && killrecording
- }
-
-videoselected()
-{
- slop -f "%x %y %w %h" > /tmp/slop
- read -r X Y W H < /tmp/slop
- rm /tmp/slop
-
- ffmpeg \
- -f x11grab \
- -framerate 30 \
- -video_size "$W"x"$H" \
- -i :0.0+"$X,$Y" \
- -c:v libx264 -qp 0 -r 30 \
- "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" &
- echo $! > /tmp/recordingpid
- updateicon "⏺️"
-}
-
-case "$1" in
- screencast) screencast;;
- audio) audio;;
- video) video;;
- *selected) videoselected;;
- kill) killrecording;;
- *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
-esac
+++ /dev/null
-#!/bin/sh
-
-streamList="
-WXXI Classical (Rochester Classical Radio) link:https://22213.live.streamtheworld.com/WXXIFM.mp3
-Classical WSMR (Tampa Classical Radio) https://worldradiomap.com/us-fl/play/wsmr_live
-"
-
-selected=$(echo "$streamList" | grep -P "^$(echo "$streamList" | grep "https:" | sed 's/link:.*//g' | dmenu -i -p "Select a Stream" -l 20 | awk '{print $1}')\s")
-
-echo "$selected" | sed 's/.*link://' | xargs -r mpv --no-video --terminal=no
+++ /dev/null
-#!/bin/sh
-
-# A dmenu wrapper script for system functions.
-export WM="dwm"
-case "$(readlink -f /sbin/init)" in
- *systemd*) ctl='systemctl' ;;
- *) ctl='loginctl' ;;
-esac
-
-wmpid(){ # This function is needed if there are multiple instances of the window manager.
- tree="$(pstree -ps $$)"
- tree="${tree#*$WM(}"
- echo "${tree%%)*}"
-}
-
-case "$(printf " lock\n leave $WM\n renew $WM\n hibernate\n reboot\n shutdown\n sleep\n display off" | dmenu -i -p 'Action: ')" in
- ' lock') slock ;;
- " leave $WM") kill -TERM "$(wmpid)" ;;
- " renew $WM") kill -HUP "$(wmpid)" ;;
- ' hibernate') slock $ctl hibernate -i ;;
- ' sleep') slock $ctl suspend -i ;;
- ' reboot') $ctl reboot -i ;;
- ' shutdown') $ctl poweroff -i ;;
- ' display off') xset dpms force off ;;
- *) exit 1 ;;
-esac
+++ /dev/null
-#!/bin/sh
-
-# Unmount USB drives or Android phones. Replaces the older `dmenuumount`. Fewer
-# prompt and also de-decrypts LUKS drives that are unmounted.
-
-set -e
-
-mounteddroids="$(grep simple-mtpfs /etc/mtab | awk '{print "📱" $2}')"
-lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")"
-mounteddrives="$(echo "$lsblkoutput" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "💾%s (%s)\n",$4,$3}')"
-
-allunmountable="$(echo "$mounteddroids
-$mounteddrives" | sed "/^$/d;s/ *$//")"
-test -n "$allunmountable"
-
-chosen="$(echo "$allunmountable" | dmenu -i -p "Unmount which drive?")"
-chosen="${chosen%% *}"
-test -n "$chosen"
-
-sudo -A umount -l "/${chosen#*/}"
-notify-send "Device unmounted." "$chosen has been unmounted."
-
-# Close the chosen drive if decrypted.
-cryptid="$(echo "$lsblkoutput" | grep "/${chosen#*/}$")"
-cryptid="${cryptid%% *}"
-test -b /dev/mapper/"${cryptid##*/}"
-sudo -A cryptsetup close "$cryptid"
-notify-send "🔒Device dencryption closed." "Drive is now securely locked again."
+++ /dev/null
-#!/bin/sh
-
-# Get user selection via dmenu from emoji file.
-chosen=$(cut -d ';' -f1 ~/.local/share/larbs/chars/* | dmenu -i -l 30 | sed "s/ .*//")
-
-# Exit if none chosen.
-[ -z "$chosen" ] && exit
-
-# If you run this command with an argument, it will automatically insert the
-# character. Otherwise, show a message that the emoji has been copied.
-if [ -n "$1" ]; then
- xdotool type "$chosen"
-else
- printf "%s" "$chosen" | xclip -selection clipboard
- notify-send "'$chosen' copied to clipboard." &
-fi
+++ /dev/null
-#!/bin/sh
-
-cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}"
-cache="$cachedir/dmenu_run"
-
-[ ! -e "$cachedir" ] && mkdir -p "$cachedir"
-
-IFS=:
-if stest -dqr -n "$cache" $PATH; then
- stest -flx $PATH | sort -u | tee "$cache"
-else
- cat "$cache"
-fi
+++ /dev/null
-#!/bin/sh
-dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} &
--- /dev/null
+😀 grinning face
+😃 grinning face with big eyes
+😄 grinning face with smiling eyes
+😁 beaming face with smiling eyes
+😆 grinning squinting face
+😅 grinning face with sweat
+🤣 rolling on the floor laughing
+😂 face with tears of joy
+🙂 slightly smiling face
+🙃 upside-down face
+🫠 melting face
+😉 winking face
+😊 smiling face with smiling eyes
+😇 smiling face with halo
+🥰 smiling face with hearts
+😍 smiling face with heart-eyes
+🤩 star-struck
+😘 face blowing a kiss
+😗 kissing face
+☺️ smiling face
+😚 kissing face with closed eyes
+😙 kissing face with smiling eyes
+🥲 smiling face with tear
+😋 face savoring food
+😛 face with tongue
+😜 winking face with tongue
+🤪 zany face
+😝 squinting face with tongue
+🤑 money-mouth face
+🤗 smiling face with open hands
+🤭 face with hand over mouth
+🫢 face with open eyes and hand over mouth
+🫣 face with peeking eye
+🤫 shushing face
+🤔 thinking face
+🫡 saluting face
+🤐 zipper-mouth face
+🤨 face with raised eyebrow
+😐 neutral face
+😑 expressionless face
+😶 face without mouth
+🫥 dotted line face
+😏 smirking face
+😒 unamused face
+🙄 face with rolling eyes
+😬 grimacing face
+🤥 lying face
+😌 relieved face
+😔 pensive face
+😪 sleepy face
+🤤 drooling face
+😴 sleeping face
+😷 face with medical mask
+🤒 face with thermometer
+🤕 face with head-bandage
+🤢 nauseated face
+🤮 face vomiting
+🤧 sneezing face
+🥵 hot face
+🥶 cold face
+🥴 woozy face
+😵 face with crossed-out eyes
+🤯 exploding head
+🤠 cowboy hat face
+🥳 partying face
+🥸 disguised face
+😎 smiling face with sunglasses
+🤓 nerd face
+🧐 face with monocle
+😕 confused face
+🫤 face with diagonal mouth
+😟 worried face
+🙁 slightly frowning face
+☹️ frowning face
+😮 face with open mouth
+😯 hushed face
+😲 astonished face
+😳 flushed face
+🥺 pleading face
+🥹 face holding back tears
+😦 frowning face with open mouth
+😧 anguished face
+😨 fearful face
+😰 anxious face with sweat
+😥 sad but relieved face
+😢 crying face
+😭 loudly crying face
+😱 face screaming in fear
+😖 confounded face
+😣 persevering face
+😞 disappointed face
+😓 downcast face with sweat
+😩 weary face
+😫 tired face
+🥱 yawning face
+😤 face with steam from nose
+😡 pouting face
+😠 angry face
+🤬 face with symbols on mouth
+😈 smiling face with horns
+👿 angry face with horns
+💀 skull
+☠️ skull and crossbones
+💩 pile of poo
+🤡 clown face
+👹 ogre
+👺 goblin
+👻 ghost
+👽 alien
+👾 alien monster
+🤖 robot
+😺 grinning cat
+😸 grinning cat with smiling eyes
+😹 cat with tears of joy
+😻 smiling cat with heart-eyes
+😼 cat with wry smile
+😽 kissing cat
+🙀 weary cat
+😿 crying cat
+😾 pouting cat
+🙈 see-no-evil monkey
+🙉 hear-no-evil monkey
+🙊 speak-no-evil monkey
+💋 kiss mark
+💌 love letter
+💘 heart with arrow
+💝 heart with ribbon
+💖 sparkling heart
+💗 growing heart
+💓 beating heart
+💞 revolving hearts
+💕 two hearts
+💟 heart decoration
+❣️ heart exclamation
+💔 broken heart
+❤️ red heart
+🧡 orange heart
+💛 yellow heart
+💚 green heart
+💙 blue heart
+💜 purple heart
+🤎 brown heart
+🖤 black heart
+🤍 white heart
+💯 hundred points
+💢 anger symbol
+💥 collision
+💫 dizzy
+💦 sweat droplets
+💨 dashing away
+🕳️ hole
+💣 bomb
+💬 speech balloon
+🗨️ left speech bubble
+🗯️ right anger bubble
+💭 thought balloon
+💤 zzz
+👋 waving hand
+🤚 raised back of hand
+🖐️ hand with fingers splayed
+✋ raised hand
+🖖 vulcan salute
+🫱 rightwards hand
+🫲 leftwards hand
+🫳 palm down hand
+🫴 palm up hand
+👌 OK hand
+🤌 pinched fingers
+🤏 pinching hand
+✌️ victory hand
+🤞 crossed fingers
+🫰 hand with index finger and thumb crossed
+🤟 love-you gesture
+🤘 sign of the horns
+🤙 call me hand
+👈 backhand index pointing left
+👉 backhand index pointing right
+👆 backhand index pointing up
+🖕 middle finger
+👇 backhand index pointing down
+☝️ index pointing up
+🫵 index pointing at the viewer
+👍 thumbs up
+👎 thumbs down
+✊ raised fist
+👊 oncoming fist
+🤛 left-facing fist
+🤜 right-facing fist
+👏 clapping hands
+🙌 raising hands
+🫶 heart hands
+👐 open hands
+🤲 palms up together
+🤝 handshake
+🙏 folded hands
+✍️ writing hand
+💅 nail polish
+🤳 selfie
+💪 flexed biceps
+🦾 mechanical arm
+🦿 mechanical leg
+🦵 leg
+🦶 foot
+👂 ear
+🦻 ear with hearing aid
+👃 nose
+🧠 brain
+🫀 anatomical heart
+🫁 lungs
+🦷 tooth
+🦴 bone
+👀 eyes
+👁️ eye
+👅 tongue
+👄 mouth
+🫦 biting lip
+👶 baby
+🧒 child
+👦 boy
+👧 girl
+🧑 person
+👱 person: blond hair
+👨 man
+🧔 person: beard
+👩 woman
+🧓 older person
+👴 old man
+👵 old woman
+🙍 person frowning
+🙎 person pouting
+🙅 person gesturing NO
+🙆 person gesturing OK
+💁 person tipping hand
+🙋 person raising hand
+🧏 deaf person
+🙇 person bowing
+🤦 person facepalming
+🤷 person shrugging
+👮 police officer
+🕵️ detective
+💂 guard
+🥷 ninja
+👷 construction worker
+🫅 person with crown
+🤴 prince
+👸 princess
+👳 person wearing turban
+👲 person with skullcap
+🧕 woman with headscarf
+🤵 person in tuxedo
+👰 person with veil
+🤰 pregnant woman
+🫃 pregnant man
+🫄 pregnant person
+🤱 breast-feeding
+👼 baby angel
+🎅 Santa Claus
+🤶 Mrs. Claus
+🦸 superhero
+🦹 supervillain
+🧙 mage
+🧚 fairy
+🧛 vampire
+🧜 merperson
+🧝 elf
+🧞 genie
+🧟 zombie
+🧌 troll
+💆 person getting massage
+💇 person getting haircut
+🚶 person walking
+🧍 person standing
+🧎 person kneeling
+🏃 person running
+💃 woman dancing
+🕺 man dancing
+🕴️ person in suit levitating
+👯 people with bunny ears
+🧖 person in steamy room
+🧗 person climbing
+🤺 person fencing
+🏇 horse racing
+⛷️ skier
+🏂 snowboarder
+🏌️ person golfing
+🏄 person surfing
+🚣 person rowing boat
+🏊 person swimming
+⛹️ person bouncing ball
+🏋️ person lifting weights
+🚴 person biking
+🚵 person mountain biking
+🤸 person cartwheeling
+🤼 people wrestling
+🤽 person playing water polo
+🤾 person playing handball
+🤹 person juggling
+🧘 person in lotus position
+🛀 person taking bath
+🛌 person in bed
+👭 women holding hands
+👫 woman and man holding hands
+👬 men holding hands
+💏 kiss
+💑 couple with heart
+👪 family
+🗣️ speaking head
+👤 bust in silhouette
+👥 busts in silhouette
+🫂 people hugging
+👣 footprints
+🐵 monkey face
+🐒 monkey
+🦍 gorilla
+🦧 orangutan
+🐶 dog face
+🐕 dog
+🦮 guide dog
+🐩 poodle
+🐺 wolf
+🦊 fox
+🦝 raccoon
+🐱 cat face
+🐈 cat
+🦁 lion
+🐯 tiger face
+🐅 tiger
+🐆 leopard
+🐴 horse face
+🐎 horse
+🦄 unicorn
+🦓 zebra
+🦌 deer
+🦬 bison
+🐮 cow face
+🐂 ox
+🐃 water buffalo
+🐄 cow
+🐷 pig face
+🐖 pig
+🐗 boar
+🐽 pig nose
+🐏 ram
+🐑 ewe
+🐐 goat
+🐪 camel
+🐫 two-hump camel
+🦙 llama
+🦒 giraffe
+🐘 elephant
+🦣 mammoth
+🦏 rhinoceros
+🦛 hippopotamus
+🐭 mouse face
+🐁 mouse
+🐀 rat
+🐹 hamster
+🐰 rabbit face
+🐇 rabbit
+🐿️ chipmunk
+🦫 beaver
+🦔 hedgehog
+🦇 bat
+🐻 bear
+🐨 koala
+🐼 panda
+🦥 sloth
+🦦 otter
+🦨 skunk
+🦘 kangaroo
+🦡 badger
+🐾 paw prints
+🦃 turkey
+🐔 chicken
+🐓 rooster
+🐣 hatching chick
+🐤 baby chick
+🐥 front-facing baby chick
+🐦 bird
+🐧 penguin
+🕊️ dove
+🦅 eagle
+🦆 duck
+🦢 swan
+🦉 owl
+🦤 dodo
+🪶 feather
+🦩 flamingo
+🦚 peacock
+🦜 parrot
+🐸 frog
+🐊 crocodile
+🐢 turtle
+🦎 lizard
+🐍 snake
+🐲 dragon face
+🐉 dragon
+🦕 sauropod
+🦖 T-Rex
+🐳 spouting whale
+🐋 whale
+🐬 dolphin
+🦭 seal
+🐟 fish
+🐠 tropical fish
+🐡 blowfish
+🦈 shark
+🐙 octopus
+🐚 spiral shell
+🪸 coral
+🐌 snail
+🦋 butterfly
+🐛 bug
+🐜 ant
+🐝 honeybee
+🪲 beetle
+🐞 lady beetle
+🦗 cricket
+🪳 cockroach
+🕷️ spider
+🕸️ spider web
+🦂 scorpion
+🦟 mosquito
+🪰 fly
+🪱 worm
+🦠 microbe
+💐 bouquet
+🌸 cherry blossom
+💮 white flower
+🪷 lotus
+🏵️ rosette
+🌹 rose
+🥀 wilted flower
+🌺 hibiscus
+🌻 sunflower
+🌼 blossom
+🌷 tulip
+🌱 seedling
+🪴 potted plant
+🌲 evergreen tree
+🌳 deciduous tree
+🌴 palm tree
+🌵 cactus
+🌾 sheaf of rice
+🌿 herb
+☘️ shamrock
+🍀 four leaf clover
+🍁 maple leaf
+🍂 fallen leaf
+🍃 leaf fluttering in wind
+🪹 empty nest
+🪺 nest with eggs
+🍇 grapes
+🍈 melon
+🍉 watermelon
+🍊 tangerine
+🍋 lemon
+🍌 banana
+🍍 pineapple
+🥭 mango
+🍎 red apple
+🍏 green apple
+🍐 pear
+🍑 peach
+🍒 cherries
+🍓 strawberry
+🫐 blueberries
+🥝 kiwi fruit
+🍅 tomato
+🫒 olive
+🥥 coconut
+🥑 avocado
+🍆 eggplant
+🥔 potato
+🥕 carrot
+🌽 ear of corn
+🌶️ hot pepper
+🫑 bell pepper
+🥒 cucumber
+🥬 leafy green
+🥦 broccoli
+🧄 garlic
+🧅 onion
+🍄 mushroom
+🥜 peanuts
+🫘 beans
+🌰 chestnut
+🍞 bread
+🥐 croissant
+🥖 baguette bread
+🫓 flatbread
+🥨 pretzel
+🥯 bagel
+🥞 pancakes
+🧇 waffle
+🧀 cheese wedge
+🍖 meat on bone
+🍗 poultry leg
+🥩 cut of meat
+🥓 bacon
+🍔 hamburger
+🍟 french fries
+🍕 pizza
+🌭 hot dog
+🥪 sandwich
+🌮 taco
+🌯 burrito
+🫔 tamale
+🥙 stuffed flatbread
+🧆 falafel
+🥚 egg
+🍳 cooking
+🥘 shallow pan of food
+🍲 pot of food
+🫕 fondue
+🥣 bowl with spoon
+🥗 green salad
+🍿 popcorn
+🧈 butter
+🧂 salt
+🥫 canned food
+🍱 bento box
+🍘 rice cracker
+🍙 rice ball
+🍚 cooked rice
+🍛 curry rice
+🍜 steaming bowl
+🍝 spaghetti
+🍠 roasted sweet potato
+🍢 oden
+🍣 sushi
+🍤 fried shrimp
+🍥 fish cake with swirl
+🥮 moon cake
+🍡 dango
+🥟 dumpling
+🥠 fortune cookie
+🥡 takeout box
+🦀 crab
+🦞 lobster
+🦐 shrimp
+🦑 squid
+🦪 oyster
+🍦 soft ice cream
+🍧 shaved ice
+🍨 ice cream
+🍩 doughnut
+🍪 cookie
+🎂 birthday cake
+🍰 shortcake
+🧁 cupcake
+🥧 pie
+🍫 chocolate bar
+🍬 candy
+🍭 lollipop
+🍮 custard
+🍯 honey pot
+🍼 baby bottle
+🥛 glass of milk
+☕ hot beverage
+🫖 teapot
+🍵 teacup without handle
+🍶 sake
+🍾 bottle with popping cork
+🍷 wine glass
+🍸 cocktail glass
+🍹 tropical drink
+🍺 beer mug
+🍻 clinking beer mugs
+🥂 clinking glasses
+🥃 tumbler glass
+🫗 pouring liquid
+🥤 cup with straw
+🧋 bubble tea
+🧃 beverage box
+🧉 mate
+🧊 ice
+🥢 chopsticks
+🍽️ fork and knife with plate
+🍴 fork and knife
+🥄 spoon
+🔪 kitchen knife
+🫙 jar
+🏺 amphora
+🌍 globe showing Europe-Africa
+🌎 globe showing Americas
+🌏 globe showing Asia-Australia
+🌐 globe with meridians
+🗺️ world map
+🗾 map of Japan
+🧭 compass
+🏔️ snow-capped mountain
+⛰️ mountain
+🌋 volcano
+🗻 mount fuji
+🏕️ camping
+🏖️ beach with umbrella
+🏜️ desert
+🏝️ desert island
+🏞️ national park
+🏟️ stadium
+🏛️ classical building
+🏗️ building construction
+🧱 brick
+🪨 rock
+🪵 wood
+🛖 hut
+🏘️ houses
+🏚️ derelict house
+🏠 house
+🏡 house with garden
+🏢 office building
+🏣 Japanese post office
+🏤 post office
+🏥 hospital
+🏦 bank
+🏨 hotel
+🏩 love hotel
+🏪 convenience store
+🏫 school
+🏬 department store
+🏭 factory
+🏯 Japanese castle
+🏰 castle
+💒 wedding
+🗼 Tokyo tower
+🗽 Statue of Liberty
+⛪ church
+🕌 mosque
+🛕 hindu temple
+🕍 synagogue
+⛩️ shinto shrine
+🕋 kaaba
+⛲ fountain
+⛺ tent
+🌁 foggy
+🌃 night with stars
+🏙️ cityscape
+🌄 sunrise over mountains
+🌅 sunrise
+🌆 cityscape at dusk
+🌇 sunset
+🌉 bridge at night
+♨️ hot springs
+🎠 carousel horse
+🛝 playground slide
+🎡 ferris wheel
+🎢 roller coaster
+💈 barber pole
+🎪 circus tent
+🚂 locomotive
+🚃 railway car
+🚄 high-speed train
+🚅 bullet train
+🚆 train
+🚇 metro
+🚈 light rail
+🚉 station
+🚊 tram
+🚝 monorail
+🚞 mountain railway
+🚋 tram car
+🚌 bus
+🚍 oncoming bus
+🚎 trolleybus
+🚐 minibus
+🚑 ambulance
+🚒 fire engine
+🚓 police car
+🚔 oncoming police car
+🚕 taxi
+🚖 oncoming taxi
+🚗 automobile
+🚘 oncoming automobile
+🚙 sport utility vehicle
+🛻 pickup truck
+🚚 delivery truck
+🚛 articulated lorry
+🚜 tractor
+🏎️ racing car
+🏍️ motorcycle
+🛵 motor scooter
+🦽 manual wheelchair
+🦼 motorized wheelchair
+🛺 auto rickshaw
+🚲 bicycle
+🛴 kick scooter
+🛹 skateboard
+🛼 roller skate
+🚏 bus stop
+🛣️ motorway
+🛤️ railway track
+🛢️ oil drum
+⛽ fuel pump
+🛞 wheel
+🚨 police car light
+🚥 horizontal traffic light
+🚦 vertical traffic light
+🛑 stop sign
+🚧 construction
+⚓ anchor
+🛟 ring buoy
+⛵ sailboat
+🛶 canoe
+🚤 speedboat
+🛳️ passenger ship
+⛴️ ferry
+🛥️ motor boat
+🚢 ship
+✈️ airplane
+🛩️ small airplane
+🛫 airplane departure
+🛬 airplane arrival
+🪂 parachute
+💺 seat
+🚁 helicopter
+🚟 suspension railway
+🚠 mountain cableway
+🚡 aerial tramway
+🛰️ satellite
+🚀 rocket
+🛸 flying saucer
+🛎️ bellhop bell
+🧳 luggage
+⌛ hourglass done
+⏳ hourglass not done
+⌚ watch
+⏰ alarm clock
+⏱️ stopwatch
+⏲️ timer clock
+🕰️ mantelpiece clock
+🕛 twelve o’clock
+🕧 twelve-thirty
+🕐 one o’clock
+🕜 one-thirty
+🕑 two o’clock
+🕝 two-thirty
+🕒 three o’clock
+🕞 three-thirty
+🕓 four o’clock
+🕟 four-thirty
+🕔 five o’clock
+🕠 five-thirty
+🕕 six o’clock
+🕡 six-thirty
+🕖 seven o’clock
+🕢 seven-thirty
+🕗 eight o’clock
+🕣 eight-thirty
+🕘 nine o’clock
+🕤 nine-thirty
+🕙 ten o’clock
+🕥 ten-thirty
+🕚 eleven o’clock
+🕦 eleven-thirty
+🌑 new moon
+🌒 waxing crescent moon
+🌓 first quarter moon
+🌔 waxing gibbous moon
+🌕 full moon
+🌖 waning gibbous moon
+🌗 last quarter moon
+🌘 waning crescent moon
+🌙 crescent moon
+🌚 new moon face
+🌛 first quarter moon face
+🌜 last quarter moon face
+🌡️ thermometer
+☀️ sun
+🌝 full moon face
+🌞 sun with face
+🪐 ringed planet
+⭐ star
+🌟 glowing star
+🌠 shooting star
+🌌 milky way
+☁️ cloud
+⛅ sun behind cloud
+⛈️ cloud with lightning and rain
+🌤️ sun behind small cloud
+🌥️ sun behind large cloud
+🌦️ sun behind rain cloud
+🌧️ cloud with rain
+🌨️ cloud with snow
+🌩️ cloud with lightning
+🌪️ tornado
+🌫️ fog
+🌬️ wind face
+🌀 cyclone
+🌈 rainbow
+🌂 closed umbrella
+☂️ umbrella
+☔ umbrella with rain drops
+⛱️ umbrella on ground
+⚡ high voltage
+❄️ snowflake
+☃️ snowman
+⛄ snowman without snow
+☄️ comet
+🔥 fire
+💧 droplet
+🌊 water wave
+🎃 jack-o-lantern
+🎄 Christmas tree
+🎆 fireworks
+🎇 sparkler
+🧨 firecracker
+✨ sparkles
+🎈 balloon
+🎉 party popper
+🎊 confetti ball
+🎋 tanabata tree
+🎍 pine decoration
+🎎 Japanese dolls
+🎏 carp streamer
+🎐 wind chime
+🎑 moon viewing ceremony
+🧧 red envelope
+🎀 ribbon
+🎁 wrapped gift
+🎗️ reminder ribbon
+🎟️ admission tickets
+🎫 ticket
+🎖️ military medal
+🏆 trophy
+🏅 sports medal
+🥇 1st place medal
+🥈 2nd place medal
+🥉 3rd place medal
+⚽ soccer ball
+⚾ baseball
+🥎 softball
+🏀 basketball
+🏐 volleyball
+🏈 american football
+🏉 rugby football
+🎾 tennis
+🥏 flying disc
+🎳 bowling
+🏏 cricket game
+🏑 field hockey
+🏒 ice hockey
+🥍 lacrosse
+🏓 ping pong
+🏸 badminton
+🥊 boxing glove
+🥋 martial arts uniform
+🥅 goal net
+⛳ flag in hole
+⛸️ ice skate
+🎣 fishing pole
+🤿 diving mask
+🎽 running shirt
+🎿 skis
+🛷 sled
+🥌 curling stone
+🎯 bullseye
+🪀 yo-yo
+🪁 kite
+🎱 pool 8 ball
+🔮 crystal ball
+🪄 magic wand
+🧿 nazar amulet
+🪬 hamsa
+🎮 video game
+🕹️ joystick
+🎰 slot machine
+🎲 game die
+🧩 puzzle piece
+🧸 teddy bear
+🪅 piñata
+🪩 mirror ball
+🪆 nesting dolls
+♠️ spade suit
+♥️ heart suit
+♦️ diamond suit
+♣️ club suit
+♟️ chess pawn
+🃏 joker
+🀄 mahjong red dragon
+🎴 flower playing cards
+🎭 performing arts
+🖼️ framed picture
+🎨 artist palette
+🧵 thread
+🪡 sewing needle
+🧶 yarn
+🪢 knot
+👓 glasses
+🕶️ sunglasses
+🥽 goggles
+🥼 lab coat
+🦺 safety vest
+👔 necktie
+👕 t-shirt
+👖 jeans
+🧣 scarf
+🧤 gloves
+🧥 coat
+🧦 socks
+👗 dress
+👘 kimono
+🥻 sari
+🩱 one-piece swimsuit
+🩲 briefs
+🩳 shorts
+👙 bikini
+👚 woman’s clothes
+👛 purse
+👜 handbag
+👝 clutch bag
+🛍️ shopping bags
+🎒 backpack
+🩴 thong sandal
+👞 man’s shoe
+👟 running shoe
+🥾 hiking boot
+🥿 flat shoe
+👠 high-heeled shoe
+👡 woman’s sandal
+🩰 ballet shoes
+👢 woman’s boot
+👑 crown
+👒 woman’s hat
+🎩 top hat
+🎓 graduation cap
+🧢 billed cap
+🪖 military helmet
+⛑️ rescue worker’s helmet
+📿 prayer beads
+💄 lipstick
+💍 ring
+💎 gem stone
+🔇 muted speaker
+🔈 speaker low volume
+🔉 speaker medium volume
+🔊 speaker high volume
+📢 loudspeaker
+📣 megaphone
+📯 postal horn
+🔔 bell
+🔕 bell with slash
+🎼 musical score
+🎵 musical note
+🎶 musical notes
+🎙️ studio microphone
+🎚️ level slider
+🎛️ control knobs
+🎤 microphone
+🎧 headphone
+📻 radio
+🎷 saxophone
+🪗 accordion
+🎸 guitar
+🎹 musical keyboard
+🎺 trumpet
+🎻 violin
+🪕 banjo
+🥁 drum
+🪘 long drum
+📱 mobile phone
+📲 mobile phone with arrow
+☎️ telephone
+📞 telephone receiver
+📟 pager
+📠 fax machine
+🔋 battery
+🪫 low battery
+🔌 electric plug
+💻 laptop
+🖥️ desktop computer
+🖨️ printer
+⌨️ keyboard
+🖱️ computer mouse
+🖲️ trackball
+💽 computer disk
+💾 floppy disk
+💿 optical disk
+📀 dvd
+🧮 abacus
+🎥 movie camera
+🎞️ film frames
+📽️ film projector
+🎬 clapper board
+📺 television
+📷 camera
+📸 camera with flash
+📹 video camera
+📼 videocassette
+🔍 magnifying glass tilted left
+🔎 magnifying glass tilted right
+🕯️ candle
+💡 light bulb
+🔦 flashlight
+🏮 red paper lantern
+🪔 diya lamp
+📔 notebook with decorative cover
+📕 closed book
+📖 open book
+📗 green book
+📘 blue book
+📙 orange book
+📚 books
+📓 notebook
+📒 ledger
+📃 page with curl
+📜 scroll
+📄 page facing up
+📰 newspaper
+🗞️ rolled-up newspaper
+📑 bookmark tabs
+🔖 bookmark
+🏷️ label
+💰 money bag
+🪙 coin
+💴 yen banknote
+💵 dollar banknote
+💶 euro banknote
+💷 pound banknote
+💸 money with wings
+💳 credit card
+🧾 receipt
+💹 chart increasing with yen
+✉️ envelope
+📧 e-mail
+📨 incoming envelope
+📩 envelope with arrow
+📤 outbox tray
+📥 inbox tray
+📦 package
+📫 closed mailbox with raised flag
+📪 closed mailbox with lowered flag
+📬 open mailbox with raised flag
+📭 open mailbox with lowered flag
+📮 postbox
+🗳️ ballot box with ballot
+✏️ pencil
+✒️ black nib
+🖋️ fountain pen
+🖊️ pen
+🖌️ paintbrush
+🖍️ crayon
+📝 memo
+💼 briefcase
+📁 file folder
+📂 open file folder
+🗂️ card index dividers
+📅 calendar
+📆 tear-off calendar
+🗒️ spiral notepad
+🗓️ spiral calendar
+📇 card index
+📈 chart increasing
+📉 chart decreasing
+📊 bar chart
+📋 clipboard
+📌 pushpin
+📍 round pushpin
+📎 paperclip
+🖇️ linked paperclips
+📏 straight ruler
+📐 triangular ruler
+✂️ scissors
+🗃️ card file box
+🗄️ file cabinet
+🗑️ wastebasket
+🔒 locked
+🔓 unlocked
+🔏 locked with pen
+🔐 locked with key
+🔑 key
+🗝️ old key
+🔨 hammer
+🪓 axe
+⛏️ pick
+⚒️ hammer and pick
+🛠️ hammer and wrench
+🗡️ dagger
+⚔️ crossed swords
+🔫 water pistol
+🪃 boomerang
+🏹 bow and arrow
+🛡️ shield
+🪚 carpentry saw
+🔧 wrench
+🪛 screwdriver
+🔩 nut and bolt
+⚙️ gear
+🗜️ clamp
+⚖️ balance scale
+🦯 white cane
+🔗 link
+⛓️ chains
+🪝 hook
+🧰 toolbox
+🧲 magnet
+🪜 ladder
+⚗️ alembic
+🧪 test tube
+🧫 petri dish
+🧬 dna
+🔬 microscope
+🔭 telescope
+📡 satellite antenna
+💉 syringe
+🩸 drop of blood
+💊 pill
+🩹 adhesive bandage
+🩼 crutch
+🩺 stethoscope
+🩻 x-ray
+🚪 door
+🛗 elevator
+🪞 mirror
+🪟 window
+🛏️ bed
+🛋️ couch and lamp
+🪑 chair
+🚽 toilet
+🪠 plunger
+🚿 shower
+🛁 bathtub
+🪤 mouse trap
+🪒 razor
+🧴 lotion bottle
+🧷 safety pin
+🧹 broom
+🧺 basket
+🧻 roll of paper
+🪣 bucket
+🧼 soap
+🫧 bubbles
+🪥 toothbrush
+🧽 sponge
+🧯 fire extinguisher
+🛒 shopping cart
+🚬 cigarette
+⚰️ coffin
+🪦 headstone
+⚱️ funeral urn
+🗿 moai
+🪧 placard
+🪪 identification card
+🏧 ATM sign
+🚮 litter in bin sign
+🚰 potable water
+♿ wheelchair symbol
+🚹 men’s room
+🚺 women’s room
+🚻 restroom
+🚼 baby symbol
+🚾 water closet
+🛂 passport control
+🛃 customs
+🛄 baggage claim
+🛅 left luggage
+⚠️ warning
+🚸 children crossing
+⛔ no entry
+🚫 prohibited
+🚳 no bicycles
+🚭 no smoking
+🚯 no littering
+🚱 non-potable water
+🚷 no pedestrians
+📵 no mobile phones
+🔞 no one under eighteen
+☢️ radioactive
+☣️ biohazard
+⬆️ up arrow
+↗️ up-right arrow
+➡️ right arrow
+↘️ down-right arrow
+⬇️ down arrow
+↙️ down-left arrow
+⬅️ left arrow
+↖️ up-left arrow
+↕️ up-down arrow
+↔️ left-right arrow
+↩️ right arrow curving left
+↪️ left arrow curving right
+⤴️ right arrow curving up
+⤵️ right arrow curving down
+🔃 clockwise vertical arrows
+🔄 counterclockwise arrows button
+🔙 BACK arrow
+🔚 END arrow
+🔛 ON! arrow
+🔜 SOON arrow
+🔝 TOP arrow
+🛐 place of worship
+⚛️ atom symbol
+🕉️ om
+✡️ star of David
+☸️ wheel of dharma
+☯️ yin yang
+✝️ latin cross
+☦️ orthodox cross
+☪️ star and crescent
+☮️ peace symbol
+🕎 menorah
+🔯 dotted six-pointed star
+♈ Aries
+♉ Taurus
+♊ Gemini
+♋ Cancer
+♌ Leo
+♍ Virgo
+♎ Libra
+♏ Scorpio
+♐ Sagittarius
+♑ Capricorn
+♒ Aquarius
+♓ Pisces
+⛎ Ophiuchus
+🔀 shuffle tracks button
+🔁 repeat button
+🔂 repeat single button
+▶️ play button
+⏩ fast-forward button
+⏭️ next track button
+⏯️ play or pause button
+◀️ reverse button
+⏪ fast reverse button
+⏮️ last track button
+🔼 upwards button
+⏫ fast up button
+🔽 downwards button
+⏬ fast down button
+⏸️ pause button
+⏹️ stop button
+⏺️ record button
+⏏️ eject button
+🎦 cinema
+🔅 dim button
+🔆 bright button
+📶 antenna bars
+📳 vibration mode
+📴 mobile phone off
+♀️ female sign
+♂️ male sign
+⚧️ transgender symbol
+✖️ multiply
+➕ plus
+➖ minus
+➗ divide
+🟰 heavy equals sign
+♾️ infinity
+‼️ double exclamation mark
+⁉️ exclamation question mark
+❓ red question mark
+❔ white question mark
+❕ white exclamation mark
+❗ red exclamation mark
+〰️ wavy dash
+💱 currency exchange
+💲 heavy dollar sign
+⚕️ medical symbol
+♻️ recycling symbol
+⚜️ fleur-de-lis
+🔱 trident emblem
+📛 name badge
+🔰 Japanese symbol for beginner
+⭕ hollow red circle
+✅ check mark button
+☑️ check box with check
+✔️ check mark
+❌ cross mark
+❎ cross mark button
+➰ curly loop
+➿ double curly loop
+〽️ part alternation mark
+✳️ eight-spoked asterisk
+✴️ eight-pointed star
+❇️ sparkle
+©️ copyright
+®️ registered
+™️ trade mark
+#️⃣ keycap: #
+*️⃣ keycap: *
+0️⃣ keycap: 0
+1️⃣ keycap: 1
+2️⃣ keycap: 2
+3️⃣ keycap: 3
+4️⃣ keycap: 4
+5️⃣ keycap: 5
+6️⃣ keycap: 6
+7️⃣ keycap: 7
+8️⃣ keycap: 8
+9️⃣ keycap: 9
+🔟 keycap: 10
+🔠 input latin uppercase
+🔡 input latin lowercase
+🔢 input numbers
+🔣 input symbols
+🔤 input latin letters
+🅰️ A button (blood type)
+🆎 AB button (blood type)
+🅱️ B button (blood type)
+🆑 CL button
+🆒 COOL button
+🆓 FREE button
+ℹ️ information
+🆔 ID button
+Ⓜ️ circled M
+🆕 NEW button
+🆖 NG button
+🅾️ O button (blood type)
+🆗 OK button
+🅿️ P button
+🆘 SOS button
+🆙 UP! button
+🆚 VS button
+🈁 Japanese “here” button
+🈂️ Japanese “service charge” button
+🈷️ Japanese “monthly amount” button
+🈶 Japanese “not free of charge” button
+🈯 Japanese “reserved” button
+🉐 Japanese “bargain” button
+🈹 Japanese “discount” button
+🈚 Japanese “free of charge” button
+🈲 Japanese “prohibited” button
+🉑 Japanese “acceptable” button
+🈸 Japanese “application” button
+🈴 Japanese “passing grade” button
+🈳 Japanese “vacancy” button
+㊗️ Japanese “congratulations” button
+㊙️ Japanese “secret” button
+🈺 Japanese “open for business” button
+🈵 Japanese “no vacancy” button
+🔴 red circle
+🟠 orange circle
+🟡 yellow circle
+🟢 green circle
+🔵 blue circle
+🟣 purple circle
+🟤 brown circle
+⚫ black circle
+⚪ white circle
+🟥 red square
+🟧 orange square
+🟨 yellow square
+🟩 green square
+🟦 blue square
+🟪 purple square
+🟫 brown square
+⬛ black large square
+⬜ white large square
+◼️ black medium square
+◻️ white medium square
+◾ black medium-small square
+◽ white medium-small square
+▪️ black small square
+▫️ white small square
+🔶 large orange diamond
+🔷 large blue diamond
+🔸 small orange diamond
+🔹 small blue diamond
+🔺 red triangle pointed up
+🔻 red triangle pointed down
+💠 diamond with a dot
+🔘 radio button
+🔳 white square button
+🔲 black square button
+🏁 chequered flag
+🚩 triangular flag
+🎌 crossed flags
+🏴 black flag
+🏳️ white flag
+🇦🇨 flag: Ascension Island
+🇦🇩 flag: Andorra
+🇦🇪 flag: United Arab Emirates
+🇦🇫 flag: Afghanistan
+🇦🇬 flag: Antigua & Barbuda
+🇦🇮 flag: Anguilla
+🇦🇱 flag: Albania
+🇦🇲 flag: Armenia
+🇦🇴 flag: Angola
+🇦🇶 flag: Antarctica
+🇦🇷 flag: Argentina
+🇦🇸 flag: American Samoa
+🇦🇹 flag: Austria
+🇦🇺 flag: Australia
+🇦🇼 flag: Aruba
+🇦🇽 flag: Åland Islands
+🇦🇿 flag: Azerbaijan
+🇧🇦 flag: Bosnia & Herzegovina
+🇧🇧 flag: Barbados
+🇧🇩 flag: Bangladesh
+🇧🇪 flag: Belgium
+🇧🇫 flag: Burkina Faso
+🇧🇬 flag: Bulgaria
+🇧🇭 flag: Bahrain
+🇧🇮 flag: Burundi
+🇧🇯 flag: Benin
+🇧🇱 flag: St. Barthélemy
+🇧🇲 flag: Bermuda
+🇧🇳 flag: Brunei
+🇧🇴 flag: Bolivia
+🇧🇶 flag: Caribbean Netherlands
+🇧🇷 flag: Brazil
+🇧🇸 flag: Bahamas
+🇧🇹 flag: Bhutan
+🇧🇻 flag: Bouvet Island
+🇧🇼 flag: Botswana
+🇧🇾 flag: Belarus
+🇧🇿 flag: Belize
+🇨🇦 flag: Canada
+🇨🇨 flag: Cocos (Keeling) Islands
+🇨🇩 flag: Congo - Kinshasa
+🇨🇫 flag: Central African Republic
+🇨🇬 flag: Congo - Brazzaville
+🇨🇭 flag: Switzerland
+🇨🇮 flag: Côte d’Ivoire
+🇨🇰 flag: Cook Islands
+🇨🇱 flag: Chile
+🇨🇲 flag: Cameroon
+🇨🇳 flag: China
+🇨🇴 flag: Colombia
+🇨🇵 flag: Clipperton Island
+🇨🇷 flag: Costa Rica
+🇨🇺 flag: Cuba
+🇨🇻 flag: Cape Verde
+🇨🇼 flag: Curaçao
+🇨🇽 flag: Christmas Island
+🇨🇾 flag: Cyprus
+🇨🇿 flag: Czechia
+🇩🇪 flag: Germany
+🇩🇬 flag: Diego Garcia
+🇩🇯 flag: Djibouti
+🇩🇰 flag: Denmark
+🇩🇲 flag: Dominica
+🇩🇴 flag: Dominican Republic
+🇩🇿 flag: Algeria
+🇪🇦 flag: Ceuta & Melilla
+🇪🇨 flag: Ecuador
+🇪🇪 flag: Estonia
+🇪🇬 flag: Egypt
+🇪🇭 flag: Western Sahara
+🇪🇷 flag: Eritrea
+🇪🇸 flag: Spain
+🇪🇹 flag: Ethiopia
+🇪🇺 flag: European Union
+🇫🇮 flag: Finland
+🇫🇯 flag: Fiji
+🇫🇰 flag: Falkland Islands
+🇫🇲 flag: Micronesia
+🇫🇴 flag: Faroe Islands
+🇫🇷 flag: France
+🇬🇦 flag: Gabon
+🇬🇧 flag: United Kingdom
+🇬🇩 flag: Grenada
+🇬🇪 flag: Georgia
+🇬🇫 flag: French Guiana
+🇬🇬 flag: Guernsey
+🇬🇭 flag: Ghana
+🇬🇮 flag: Gibraltar
+🇬🇱 flag: Greenland
+🇬🇲 flag: Gambia
+🇬🇳 flag: Guinea
+🇬🇵 flag: Guadeloupe
+🇬🇶 flag: Equatorial Guinea
+🇬🇷 flag: Greece
+🇬🇸 flag: South Georgia & South Sandwich Islands
+🇬🇹 flag: Guatemala
+🇬🇺 flag: Guam
+🇬🇼 flag: Guinea-Bissau
+🇬🇾 flag: Guyana
+🇭🇰 flag: Hong Kong SAR China
+🇭🇲 flag: Heard & McDonald Islands
+🇭🇳 flag: Honduras
+🇭🇷 flag: Croatia
+🇭🇹 flag: Haiti
+🇭🇺 flag: Hungary
+🇮🇨 flag: Canary Islands
+🇮🇩 flag: Indonesia
+🇮🇪 flag: Ireland
+🇮🇱 flag: Israel
+🇮🇲 flag: Isle of Man
+🇮🇳 flag: India
+🇮🇴 flag: British Indian Ocean Territory
+🇮🇶 flag: Iraq
+🇮🇷 flag: Iran
+🇮🇸 flag: Iceland
+🇮🇹 flag: Italy
+🇯🇪 flag: Jersey
+🇯🇲 flag: Jamaica
+🇯🇴 flag: Jordan
+🇯🇵 flag: Japan
+🇰🇪 flag: Kenya
+🇰🇬 flag: Kyrgyzstan
+🇰🇭 flag: Cambodia
+🇰🇮 flag: Kiribati
+🇰🇲 flag: Comoros
+🇰🇳 flag: St. Kitts & Nevis
+🇰🇵 flag: North Korea
+🇰🇷 flag: South Korea
+🇰🇼 flag: Kuwait
+🇰🇾 flag: Cayman Islands
+🇰🇿 flag: Kazakhstan
+🇱🇦 flag: Laos
+🇱🇧 flag: Lebanon
+🇱🇨 flag: St. Lucia
+🇱🇮 flag: Liechtenstein
+🇱🇰 flag: Sri Lanka
+🇱🇷 flag: Liberia
+🇱🇸 flag: Lesotho
+🇱🇹 flag: Lithuania
+🇱🇺 flag: Luxembourg
+🇱🇻 flag: Latvia
+🇱🇾 flag: Libya
+🇲🇦 flag: Morocco
+🇲🇨 flag: Monaco
+🇲🇩 flag: Moldova
+🇲🇪 flag: Montenegro
+🇲🇫 flag: St. Martin
+🇲🇬 flag: Madagascar
+🇲🇭 flag: Marshall Islands
+🇲🇰 flag: North Macedonia
+🇲🇱 flag: Mali
+🇲🇲 flag: Myanmar (Burma)
+🇲🇳 flag: Mongolia
+🇲🇴 flag: Macao SAR China
+🇲🇵 flag: Northern Mariana Islands
+🇲🇶 flag: Martinique
+🇲🇷 flag: Mauritania
+🇲🇸 flag: Montserrat
+🇲🇹 flag: Malta
+🇲🇺 flag: Mauritius
+🇲🇻 flag: Maldives
+🇲🇼 flag: Malawi
+🇲🇽 flag: Mexico
+🇲🇾 flag: Malaysia
+🇲🇿 flag: Mozambique
+🇳🇦 flag: Namibia
+🇳🇨 flag: New Caledonia
+🇳🇪 flag: Niger
+🇳🇫 flag: Norfolk Island
+🇳🇬 flag: Nigeria
+🇳🇮 flag: Nicaragua
+🇳🇱 flag: Netherlands
+🇳🇴 flag: Norway
+🇳🇵 flag: Nepal
+🇳🇷 flag: Nauru
+🇳🇺 flag: Niue
+🇳🇿 flag: New Zealand
+🇴🇲 flag: Oman
+🇵🇦 flag: Panama
+🇵🇪 flag: Peru
+🇵🇫 flag: French Polynesia
+🇵🇬 flag: Papua New Guinea
+🇵🇭 flag: Philippines
+🇵🇰 flag: Pakistan
+🇵🇱 flag: Poland
+🇵🇲 flag: St. Pierre & Miquelon
+🇵🇳 flag: Pitcairn Islands
+🇵🇷 flag: Puerto Rico
+🇵🇸 flag: Palestinian Territories
+🇵🇹 flag: Portugal
+🇵🇼 flag: Palau
+🇵🇾 flag: Paraguay
+🇶🇦 flag: Qatar
+🇷🇪 flag: Réunion
+🇷🇴 flag: Romania
+🇷🇸 flag: Serbia
+🇷🇺 flag: Russia
+🇷🇼 flag: Rwanda
+🇸🇦 flag: Saudi Arabia
+🇸🇧 flag: Solomon Islands
+🇸🇨 flag: Seychelles
+🇸🇩 flag: Sudan
+🇸🇪 flag: Sweden
+🇸🇬 flag: Singapore
+🇸🇭 flag: St. Helena
+🇸🇮 flag: Slovenia
+🇸🇯 flag: Svalbard & Jan Mayen
+🇸🇰 flag: Slovakia
+🇸🇱 flag: Sierra Leone
+🇸🇲 flag: San Marino
+🇸🇳 flag: Senegal
+🇸🇴 flag: Somalia
+🇸🇷 flag: Suriname
+🇸🇸 flag: South Sudan
+🇸🇹 flag: São Tomé & Príncipe
+🇸🇻 flag: El Salvador
+🇸🇽 flag: Sint Maarten
+🇸🇾 flag: Syria
+🇸🇿 flag: Eswatini
+🇹🇦 flag: Tristan da Cunha
+🇹🇨 flag: Turks & Caicos Islands
+🇹🇩 flag: Chad
+🇹🇫 flag: French Southern Territories
+🇹🇬 flag: Togo
+🇹🇭 flag: Thailand
+🇹🇯 flag: Tajikistan
+🇹🇰 flag: Tokelau
+🇹🇱 flag: Timor-Leste
+🇹🇲 flag: Turkmenistan
+🇹🇳 flag: Tunisia
+🇹🇴 flag: Tonga
+🇹🇷 flag: Turkey
+🇹🇹 flag: Trinidad & Tobago
+🇹🇻 flag: Tuvalu
+🇹🇼 flag: Taiwan
+🇹🇿 flag: Tanzania
+🇺🇦 flag: Ukraine
+🇺🇬 flag: Uganda
+🇺🇲 flag: U.S. Outlying Islands
+🇺🇳 flag: United Nations
+🇺🇸 flag: United States
+🇺🇾 flag: Uruguay
+🇺🇿 flag: Uzbekistan
+🇻🇦 flag: Vatican City
+🇻🇨 flag: St. Vincent & Grenadines
+🇻🇪 flag: Venezuela
+🇻🇬 flag: British Virgin Islands
+🇻🇮 flag: U.S. Virgin Islands
+🇻🇳 flag: Vietnam
+🇻🇺 flag: Vanuatu
+🇼🇫 flag: Wallis & Futuna
+🇼🇸 flag: Samoa
+🇽🇰 flag: Kosovo
+🇾🇪 flag: Yemen
+🇾🇹 flag: Mayotte
+🇿🇦 flag: South Africa
+🇿🇲 flag: Zambia
+🇿🇼 flag: Zimbabwe
+🏴 flag: England
+🏴 flag: Scotland
+🏴 flag: Wales
--- /dev/null
+ 500px; f26e
+ accessible-icon; f368
+ accusoft; f369
+ acquisitions-incorporated; f6af
+ ad; f641
+ address-book; f2b9
+ address-card; f2bb
+ adjust; f042
+ adn; f170
+ adversal; f36a
+ affiliatetheme; f36b
+ air-freshener; f5d0
+ airbnb; f834
+ algolia; f36c
+ align-center; f037
+ align-justify; f039
+ align-left; f036
+ align-right; f038
+ alipay; f642
+ allergies; f461
+ amazon; f270
+ amazon-pay; f42c
+ ambulance; f0f9
+ american-sign-language-interpreting; f2a3
+ amilia; f36d
+ anchor; f13d
+ android; f17b
+ angellist; f209
+ angle-double-down; f103
+ angle-double-left; f100
+ angle-double-right; f101
+ angle-double-up; f102
+ angle-down; f107
+ angle-left; f104
+ angle-right; f105
+ angle-up; f106
+ angry; f556
+ angrycreative; f36e
+ angular; f420
+ ankh; f644
+ app-store; f36f
+ app-store-ios; f370
+ apper; f371
+ apple; f179
+ apple-alt; f5d1
+ apple-pay; f415
+ archive; f187
+ archway; f557
+ arrow-alt-circle-down; f358
+ arrow-alt-circle-left; f359
+ arrow-alt-circle-right; f35a
+ arrow-alt-circle-up; f35b
+ arrow-circle-down; f0ab
+ arrow-circle-left; f0a8
+ arrow-circle-right; f0a9
+ arrow-circle-up; f0aa
+ arrow-down; f063
+ arrow-left; f060
+ arrow-right; f061
+ arrow-up; f062
+ arrows-alt; f0b2
+ arrows-alt-h; f337
+ arrows-alt-v; f338
+ artstation; f77a
+ assistive-listening-systems; f2a2
+ asterisk; f069
+ asymmetrik; f372
+ at; f1fa
+ atlas; f558
+ atlassian; f77b
+ atom; f5d2
+ audible; f373
+ audio-description; f29e
+ autoprefixer; f41c
+ avianex; f374
+ aviato; f421
+ award; f559
+ aws; f375
+ baby; f77c
+ baby-carriage; f77d
+ backspace; f55a
+ backward; f04a
+ bacon; f7e5
+ bacteria e059
+ bacterium e05a
+ bahai; f666
+ balance-scale; f24e
+ balance-scale-left; f515
+ balance-scale-right; f516
+ ban; f05e
+ band-aid; f462
+ bandcamp; f2d5
+ barcode; f02a
+ bars; f0c9
+ baseball-ball; f433
+ basketball-ball; f434
+ bath; f2cd
+ battery-empty; f244
+ battery-full; f240
+ battery-half; f242
+ battery-quarter; f243
+ battery-three-quarters; f241
+ battle-net; f835
+ bed; f236
+ beer; f0fc
+ behance; f1b4
+ behance-square; f1b5
+ bell; f0f3
+ bell-slash; f1f6
+ bezier-curve; f55b
+ bible; f647
+ bicycle; f206
+ biking; f84a
+ bimobject; f378
+ binoculars; f1e5
+ biohazard; f780
+ birthday-cake; f1fd
+ bitbucket; f171
+ bitcoin; f379
+ bity; f37a
+ black-tie; f27e
+ blackberry; f37b
+ blender; f517
+ blender-phone; f6b6
+ blind; f29d
+ blog; f781
+ blogger; f37c
+ blogger-b; f37d
+ bluetooth; f293
+ bluetooth-b; f294
+ bold; f032
+ bolt; f0e7
+ bomb; f1e2
+ bone; f5d7
+ bong; f55c
+ book; f02d
+ book-dead; f6b7
+ book-medical; f7e6
+ book-open; f518
+ book-reader; f5da
+ bookmark; f02e
+ bootstrap; f836
+ border-all; f84c
+ border-none; f850
+ border-style; f853
+ bowling-ball; f436
+ box; f466
+ box-open; f49e
+ box-tissue e05b
+ boxes; f468
+ braille; f2a1
+ brain; f5dc
+ bread-slice; f7ec
+ briefcase; f0b1
+ briefcase-medical; f469
+ broadcast-tower; f519
+ broom; f51a
+ brush; f55d
+ btc; f15a
+ buffer; f837
+ bug; f188
+ building; f1ad
+ bullhorn; f0a1
+ bullseye; f140
+ burn; f46a
+ buromobelexperte; f37f
+ bus; f207
+ bus-alt; f55e
+ business-time; f64a
+ buy-n-large; f8a6
+ calculator; f1ec
+ calendar; f133
+ calendar-alt; f073
+ calendar-check; f274
+ calendar-day; f783
+ calendar-minus; f272
+ calendar-plus; f271
+ calendar-times; f273
+ calendar-week; f784
+ camera; f030
+ camera-retro; f083
+ campground; f6bb
+ canadian-maple-leaf; f785
+ candy-cane; f786
+ cannabis; f55f
+ capsules; f46b
+ car; f1b9
+ car-alt; f5de
+ car-battery; f5df
+ car-crash; f5e1
+ car-side; f5e4
+ caravan; f8ff
+ caret-down; f0d7
+ caret-left; f0d9
+ caret-right; f0da
+ caret-square-down; f150
+ caret-square-left; f191
+ caret-square-right; f152
+ caret-square-up; f151
+ caret-up; f0d8
+ carrot; f787
+ cart-arrow-down; f218
+ cart-plus; f217
+ cash-register; f788
+ cat; f6be
+ cc-amazon-pay; f42d
+ cc-amex; f1f3
+ cc-apple-pay; f416
+ cc-diners-club; f24c
+ cc-discover; f1f2
+ cc-jcb; f24b
+ cc-mastercard; f1f1
+ cc-paypal; f1f4
+ cc-stripe; f1f5
+ cc-visa; f1f0
+ centercode; f380
+ centos; f789
+ certificate; f0a3
+ chair; f6c0
+ chalkboard; f51b
+ chalkboard-teacher; f51c
+ charging-station; f5e7
+ chart-area; f1fe
+ chart-bar; f080
+ chart-line; f201
+ chart-pie; f200
+ check; f00c
+ check-circle; f058
+ check-double; f560
+ check-square; f14a
+ cheese; f7ef
+ chess; f439
+ chess-bishop; f43a
+ chess-board; f43c
+ chess-king; f43f
+ chess-knight; f441
+ chess-pawn; f443
+ chess-queen; f445
+ chess-rook; f447
+ chevron-circle-down; f13a
+ chevron-circle-left; f137
+ chevron-circle-right; f138
+ chevron-circle-up; f139
+ chevron-down; f078
+ chevron-left; f053
+ chevron-right; f054
+ chevron-up; f077
+ child; f1ae
+ chrome; f268
+ chromecast; f838
+ church; f51d
+ circle; f111
+ circle-notch; f1ce
+ city; f64f
+ clinic-medical; f7f2
+ clipboard; f328
+ clipboard-check; f46c
+ clipboard-list; f46d
+ clock; f017
+ clone; f24d
+ closed-captioning; f20a
+ cloud; f0c2
+ cloud-download-alt; f381
+ cloud-meatball; f73b
+ cloud-moon; f6c3
+ cloud-moon-rain; f73c
+ cloud-rain; f73d
+ cloud-showers-heavy; f740
+ cloud-sun; f6c4
+ cloud-sun-rain; f743
+ cloud-upload-alt; f382
+ cloudflare e07d
+ cloudscale; f383
+ cloudsmith; f384
+ cloudversify; f385
+ cocktail; f561
+ code; f121
+ code-branch; f126
+ codepen; f1cb
+ codiepie; f284
+ coffee; f0f4
+ cog; f013
+ cogs; f085
+ coins; f51e
+ columns; f0db
+ comment; f075
+ comment-alt; f27a
+ comment-dollar; f651
+ comment-dots; f4ad
+ comment-medical; f7f5
+ comment-slash; f4b3
+ comments; f086
+ comments-dollar; f653
+ compact-disc; f51f
+ compass; f14e
+ compress; f066
+ compress-alt; f422
+ compress-arrows-alt; f78c
+ concierge-bell; f562
+ confluence; f78d
+ connectdevelop; f20e
+ contao; f26d
+ cookie; f563
+ cookie-bite; f564
+ copy; f0c5
+ copyright; f1f9
+ cotton-bureau; f89e
+ couch; f4b8
+ cpanel; f388
+ creative-commons; f25e
+ creative-commons-by; f4e7
+ creative-commons-nc; f4e8
+ creative-commons-nc-eu; f4e9
+ creative-commons-nc-jp; f4ea
+ creative-commons-nd; f4eb
+ creative-commons-pd; f4ec
+ creative-commons-pd-alt; f4ed
+ creative-commons-remix; f4ee
+ creative-commons-sa; f4ef
+ creative-commons-sampling; f4f0
+ creative-commons-sampling-plus; f4f1
+ creative-commons-share; f4f2
+ creative-commons-zero; f4f3
+ credit-card; f09d
+ critical-role; f6c9
+ crop; f125
+ crop-alt; f565
+ cross; f654
+ crosshairs; f05b
+ crow; f520
+ crown; f521
+ crutch; f7f7
+ css3; f13c
+ css3-alt; f38b
+ cube; f1b2
+ cubes; f1b3
+ cut; f0c4
+ cuttlefish; f38c
+ d-and-d; f38d
+ d-and-d-beyond; f6ca
+ dailymotion e052
+ dashcube; f210
+ database; f1c0
+ deaf; f2a4
+ deezer e077
+ delicious; f1a5
+ democrat; f747
+ deploydog; f38e
+ deskpro; f38f
+ desktop; f108
+ dev; f6cc
+ deviantart; f1bd
+ dharmachakra; f655
+ dhl; f790
+ diagnoses; f470
+ diaspora; f791
+ dice; f522
+ dice-d20; f6cf
+ dice-d6; f6d1
+ dice-five; f523
+ dice-four; f524
+ dice-one; f525
+ dice-six; f526
+ dice-three; f527
+ dice-two; f528
+ digg; f1a6
+ digital-ocean; f391
+ digital-tachograph; f566
+ directions; f5eb
+ discord; f392
+ discourse; f393
+ disease; f7fa
+ divide; f529
+ dizzy; f567
+ dna; f471
+ dochub; f394
+ docker; f395
+ dog; f6d3
+ dollar-sign; f155
+ dolly; f472
+ dolly-flatbed; f474
+ donate; f4b9
+ door-closed; f52a
+ door-open; f52b
+ dot-circle; f192
+ dove; f4ba
+ download; f019
+ draft2digital; f396
+ drafting-compass; f568
+ dragon; f6d5
+ draw-polygon; f5ee
+ dribbble; f17d
+ dribbble-square; f397
+ dropbox; f16b
+ drum; f569
+ drum-steelpan; f56a
+ drumstick-bite; f6d7
+ drupal; f1a9
+ dumbbell; f44b
+ dumpster; f793
+ dumpster-fire; f794
+ dungeon; f6d9
+ dyalog; f399
+ earlybirds; f39a
+ ebay; f4f4
+ edge; f282
+ edge-legacy e078
+ edit; f044
+ egg; f7fb
+ eject; f052
+ elementor; f430
+ ellipsis-h; f141
+ ellipsis-v; f142
+ ello; f5f1
+ ember; f423
+ empire; f1d1
+ envelope; f0e0
+ envelope-open; f2b6
+ envelope-open-text; f658
+ envelope-square; f199
+ envira; f299
+ equals; f52c
+ eraser; f12d
+ erlang; f39d
+ ethereum; f42e
+ ethernet; f796
+ etsy; f2d7
+ euro-sign; f153
+ evernote; f839
+ exchange-alt; f362
+ exclamation; f12a
+ exclamation-circle; f06a
+ exclamation-triangle; f071
+ expand; f065
+ expand-alt; f424
+ expand-arrows-alt; f31e
+ expeditedssl; f23e
+ external-link-alt; f35d
+ external-link-square-alt; f360
+ eye; f06e
+ eye-dropper; f1fb
+ eye-slash; f070
+ ; facebook; f09a
+ ; facebook-f; f39e
+ ; facebook-messenger; f39f
+ ; facebook-square; f082
+ ; fan; f863
+ ; fantasy-flight-games; f6dc
+ ; fast-backward; f049
+ ; fast-forward; f050
+ ; faucet e005
+ ; fax; f1ac
+ ; feather; f52d
+ ; feather-alt; f56b
+ ; fedex; f797
+ ; fedora; f798
+ ; female; f182
+ ; fighter-jet; f0fb
+ ; figma; f799
+ ; file; f15b
+ ; file-alt; f15c
+ ; file-archive; f1c6
+ ; file-audio; f1c7
+ ; file-code; f1c9
+ ; file-contract; f56c
+ ; file-csv; f6dd
+ ; file-download; f56d
+ ; file-excel; f1c3
+ ; file-export; f56e
+ ; file-image; f1c5
+ ; file-import; f56f
+ ; file-invoice; f570
+ ; file-invoice-dollar; f571
+ ; file-medical; f477
+ ; file-medical-alt; f478
+ ; file-pdf; f1c1
+ ; file-powerpoint; f1c4
+ ; file-prescription; f572
+ ; file-signature; f573
+ ; file-upload; f574
+ ; file-video; f1c8
+ ; file-word; f1c2
+ ; fill; f575
+ ; fill-drip; f576
+ ; film; f008
+ ; filter; f0b0
+ ; fingerprint; f577
+ ; fire; f06d
+ ; fire-alt; f7e4
+ ; fire-extinguisher; f134
+ ; firefox; f269
+ ; firefox-browser e007
+ ; first-aid; f479
+ ; first-order; f2b0
+ ; first-order-alt; f50a
+ ; firstdraft; f3a1
+ ; fish; f578
+ ; fist-raised; f6de
+ ; flag; f024
+ ; flag-checkered; f11e
+ ; flag-usa; f74d
+ ; flask; f0c3
+ ; flickr; f16e
+ ; flipboard; f44d
+ ; flushed; f579
+ ; fly; f417
+ ; folder; f07b
+ ; folder-minus; f65d
+ ; folder-open; f07c
+ ; folder-plus; f65e
+ ; font; f031
+ ; font-awesome; f2b4
+ ; font-awesome-alt; f35c
+ ; font-awesome-flag; f425
+ ; fonticons; f280
+ ; fonticons-fi; f3a2
+ ; football-ball; f44e
+ ; fort-awesome; f286
+ ; fort-awesome-alt; f3a3
+ ; forumbee; f211
+ ; forward; f04e
+ ; foursquare; f180
+ ; free-code-camp; f2c5
+ ; freebsd; f3a4
+ ; frog; f52e
+ ; frown; f119
+ ; frown-open; f57a
+ ; fulcrum; f50b
+ ; funnel-dollar; f662
+ ; futbol; f1e3
+ galactic-republic; f50c
+ galactic-senate; f50d
+ gamepad; f11b
+ gas-pump; f52f
+ gavel; f0e3
+ gem; f3a5
+ genderless; f22d
+ get-pocket; f265
+ gg; f260
+ gg-circle; f261
+ ghost; f6e2
+ gift; f06b
+ gifts; f79c
+ git; f1d3
+ git-alt; f841
+ git-square; f1d2
+ github; f09b
+ github-alt; f113
+ github-square; f092
+ gitkraken; f3a6
+ gitlab; f296
+ gitter; f426
+ glass-cheers; f79f
+ glass-martini; f000
+ glass-martini-alt; f57b
+ glass-whiskey; f7a0
+ glasses; f530
+ glide; f2a5
+ glide-g; f2a6
+ globe; f0ac
+ globe-africa; f57c
+ globe-americas; f57d
+ globe-asia; f57e
+ globe-europe; f7a2
+ gofore; f3a7
+ golf-ball; f450
+ goodreads; f3a8
+ goodreads-g; f3a9
+ google; f1a0
+ google-drive; f3aa
+ google-pay e079
+ google-play; f3ab
+ google-plus; f2b3
+ google-plus-g; f0d5
+ google-plus-square; f0d4
+ google-wallet; f1ee
+ gopuram; f664
+ graduation-cap; f19d
+ gratipay; f184
+ grav; f2d6
+ greater-than; f531
+ greater-than-equal; f532
+ grimace; f57f
+ grin; f580
+ grin-alt; f581
+ grin-beam; f582
+ grin-beam-sweat; f583
+ grin-hearts; f584
+ grin-squint; f585
+ grin-squint-tears; f586
+ grin-stars; f587
+ grin-tears; f588
+ grin-tongue; f589
+ grin-tongue-squint; f58a
+ grin-tongue-wink; f58b
+ grin-wink; f58c
+ grip-horizontal; f58d
+ grip-lines; f7a4
+ grip-lines-vertical; f7a5
+ grip-vertical; f58e
+ gripfire; f3ac
+ grunt; f3ad
+ guilded e07e
+ guitar; f7a6
+ gulp; f3ae
+ h-square; f0fd
+ hacker-news; f1d4
+ hacker-news-square; f3af
+ hackerrank; f5f7
+ hamburger; f805
+ hammer; f6e3
+ hamsa; f665
+ hand-holding; f4bd
+ hand-holding-heart; f4be
+ hand-holding-medical e05c
+ hand-holding-usd; f4c0
+ hand-holding-water; f4c1
+ hand-lizard; f258
+ hand-middle-finger; f806
+ hand-paper; f256
+ hand-peace; f25b
+ hand-point-down; f0a7
+ hand-point-left; f0a5
+ hand-point-right; f0a4
+ hand-point-up; f0a6
+ hand-pointer; f25a
+ hand-rock; f255
+ hand-scissors; f257
+ hand-sparkles e05d
+ hand-spock; f259
+ hands; f4c2
+ hands-helping; f4c4
+ hands-wash e05e
+ handshake; f2b5
+ handshake-alt-slash e05f
+ handshake-slash e060
+ hanukiah; f6e6
+ hard-hat; f807
+ hashtag; f292
+ hat-cowboy; f8c0
+ hat-cowboy-side; f8c1
+ hat-wizard; f6e8
+ hdd; f0a0
+ head-side-cough e061
+ head-side-cough-slash e062
+ head-side-mask e063
+ head-side-virus e064
+ heading; f1dc
+ headphones; f025
+ headphones-alt; f58f
+ headset; f590
+ heart; f004
+ heart-broken; f7a9
+ heartbeat; f21e
+ helicopter; f533
+ highlighter; f591
+ hiking; f6ec
+ hippo; f6ed
+ hips; f452
+ hire-a-helper; f3b0
+ history; f1da
+ hive e07f
+ hockey-puck; f453
+ holly-berry; f7aa
+ home; f015
+ hooli; f427
+ hornbill; f592
+ horse; f6f0
+ horse-head; f7ab
+ hospital; f0f8
+ hospital-alt; f47d
+ hospital-symbol; f47e
+ hospital-user; f80d
+ hot-tub; f593
+ hotdog; f80f
+ hotel; f594
+ hotjar; f3b1
+ hourglass; f254
+ hourglass-end; f253
+ hourglass-half; f252
+ hourglass-start; f251
+ house-damage; f6f1
+ house-user e065
+ houzz; f27c
+ hryvnia; f6f2
+ html5; f13b
+ hubspot; f3b2
+ i-cursor; f246
+ ice-cream; f810
+ icicles; f7ad
+ icons; f86d
+ id-badge; f2c1
+ id-card; f2c2
+ id-card-alt; f47f
+ ideal e013
+ igloo; f7ae
+ image; f03e
+ images; f302
+ imdb; f2d8
+ inbox; f01c
+ indent; f03c
+ industry; f275
+ infinity; f534
+ info; f129
+ info-circle; f05a
+ innosoft e080
+ instagram; f16d
+ instagram-square e055
+ instalod e081
+ intercom; f7af
+ internet-explorer; f26b
+ invision; f7b0
+ ioxhost; f208
+ italic; f033
+ itch-io; f83a
+ itunes; f3b4
+ itunes-note; f3b5
+ java; f4e4
+ jedi; f669
+ jedi-order; f50e
+ jenkins; f3b6
+ jira; f7b1
+ joget; f3b7
+ joint; f595
+ joomla; f1aa
+ journal-whills; f66a
+ js; f3b8
+ js-square; f3b9
+ jsfiddle; f1cc
+ kaaba; f66b
+ kaggle; f5fa
+ key; f084
+ keybase; f4f5
+ keyboard; f11c
+ keycdn; f3ba
+ khanda; f66d
+ kickstarter; f3bb
+ kickstarter-k; f3bc
+ kiss; f596
+ kiss-beam; f597
+ kiss-wink-heart; f598
+ kiwi-bird; f535
+ korvue; f42f
+ landmark; f66f
+ language; f1ab
+ laptop; f109
+ laptop-code; f5fc
+ laptop-house e066
+ laptop-medical; f812
+ laravel; f3bd
+ lastfm; f202
+ lastfm-square; f203
+ laugh; f599
+ laugh-beam; f59a
+ laugh-squint; f59b
+ laugh-wink; f59c
+ layer-group; f5fd
+ leaf; f06c
+ leanpub; f212
+ lemon; f094
+ less; f41d
+ less-than; f536
+ less-than-equal; f537
+ level-down-alt; f3be
+ level-up-alt; f3bf
+ life-ring; f1cd
+ lightbulb; f0eb
+ line; f3c0
+ link; f0c1
+ linkedin; f08c
+ linkedin-in; f0e1
+ linode; f2b8
+ linux; f17c
+ lira-sign; f195
+ list; f03a
+ list-alt; f022
+ list-ol; f0cb
+ list-ul; f0ca
+ location-arrow; f124
+ lock; f023
+ lock-open; f3c1
+ long-arrow-alt-down; f309
+ long-arrow-alt-left; f30a
+ long-arrow-alt-right; f30b
+ long-arrow-alt-up; f30c
+ low-vision; f2a8
+ luggage-cart; f59d
+ lungs; f604
+ lungs-virus e067
+ lyft; f3c3
+ magento; f3c4
+ magic; f0d0
+ magnet; f076
+ mail-bulk; f674
+ mailchimp; f59e
+ male; f183
+ mandalorian; f50f
+ map; f279
+ map-marked; f59f
+ map-marked-alt; f5a0
+ map-marker; f041
+ map-marker-alt; f3c5
+ map-pin; f276
+ map-signs; f277
+ markdown; f60f
+ marker; f5a1
+ mars; f222
+ mars-double; f227
+ mars-stroke; f229
+ mars-stroke-h; f22b
+ mars-stroke-v; f22a
+ mask; f6fa
+ mastodon; f4f6
+ maxcdn; f136
+ mdb; f8ca
+ medal; f5a2
+ medapps; f3c6
+ medium; f23a
+ medium-m; f3c7
+ medkit; f0fa
+ medrt; f3c8
+ meetup; f2e0
+ megaport; f5a3
+ meh; f11a
+ meh-blank; f5a4
+ meh-rolling-eyes; f5a5
+ memory; f538
+ mendeley; f7b3
+ menorah; f676
+ mercury; f223
+ meteor; f753
+ microblog e01a
+ microchip; f2db
+ microphone; f130
+ microphone-alt; f3c9
+ microphone-alt-slash; f539
+ microphone-slash; f131
+ microscope; f610
+ microsoft; f3ca
+ minus; f068
+ minus-circle; f056
+ minus-square; f146
+ mitten; f7b5
+ mix; f3cb
+ mixcloud; f289
+ mixer e056
+ mizuni; f3cc
+ mobile; f10b
+ mobile-alt; f3cd
+ modx; f285
+ monero; f3d0
+ money-bill; f0d6
+ money-bill-alt; f3d1
+ money-bill-wave; f53a
+ money-bill-wave-alt; f53b
+ money-check; f53c
+ money-check-alt; f53d
+ monument; f5a6
+ moon; f186
+ mortar-pestle; f5a7
+ mosque; f678
+ motorcycle; f21c
+ mountain; f6fc
+ mouse; f8cc
+ mouse-pointer; f245
+ mug-hot; f7b6
+ music; f001
+ napster; f3d2
+ neos; f612
+ network-wired; f6ff
+ neuter; f22c
+ newspaper; f1ea
+ nimblr; f5a8
+ node; f419
+ node-js; f3d3
+ not-equal; f53e
+ notes-medical; f481
+ npm; f3d4
+ ns8; f3d5
+ nutritionix; f3d6
+ object-group; f247
+ object-ungroup; f248
+ octopus-deploy e082
+ odnoklassniki; f263
+ odnoklassniki-square; f264
+ oil-can; f613
+ old-republic; f510
+ om; f679
+ opencart; f23d
+ openid; f19b
+ opera; f26a
+ optin-monster; f23c
+ orcid; f8d2
+ osi; f41a
+ otter; f700
+ outdent; f03b
+ page4; f3d7
+ pagelines; f18c
+ pager; f815
+ paint-brush; f1fc
+ paint-roller; f5aa
+ palette; f53f
+ palfed; f3d8
+ pallet; f482
+ paper-plane; f1d8
+ paperclip; f0c6
+ parachute-box; f4cd
+ paragraph; f1dd
+ parking; f540
+ passport; f5ab
+ pastafarianism; f67b
+ paste; f0ea
+ patreon; f3d9
+ pause; f04c
+ pause-circle; f28b
+ paw; f1b0
+ paypal; f1ed
+ peace; f67c
+ pen; f304
+ pen-alt; f305
+ pen-fancy; f5ac
+ pen-nib; f5ad
+ pen-square; f14b
+ pencil-alt; f303
+ pencil-ruler; f5ae
+ penny-arcade; f704
+ people-arrows e068
+ people-carry; f4ce
+ pepper-hot; f816
+ perbyte e083
+ percent; f295
+ percentage; f541
+ periscope; f3da
+ person-booth; f756
+ phabricator; f3db
+ phoenix-framework; f3dc
+ phoenix-squadron; f511
+ phone; f095
+ phone-alt; f879
+ phone-slash; f3dd
+ phone-square; f098
+ phone-square-alt; f87b
+ phone-volume; f2a0
+ photo-video; f87c
+ php; f457
+ pied-piper; f2ae
+ pied-piper-alt; f1a8
+ pied-piper-hat; f4e5
+ pied-piper-pp; f1a7
+ pied-piper-square e01e
+ piggy-bank; f4d3
+ pills; f484
+ pinterest; f0d2
+ pinterest-p; f231
+ pinterest-square; f0d3
+ pizza-slice; f818
+ place-of-worship; f67f
+ plane; f072
+ plane-arrival; f5af
+ plane-departure; f5b0
+ plane-slash e069
+ play; f04b
+ play-circle; f144
+ playstation; f3df
+ plug; f1e6
+ plus; f067
+ plus-circle; f055
+ plus-square; f0fe
+ podcast; f2ce
+ poll; f681
+ poll-h; f682
+ poo; f2fe
+ poo-storm; f75a
+ poop; f619
+ portrait; f3e0
+ pound-sign; f154
+ power-off; f011
+ pray; f683
+ praying-hands; f684
+ prescription; f5b1
+ prescription-bottle; f485
+ prescription-bottle-alt; f486
+ print; f02f
+ procedures; f487
+ product-hunt; f288
+ project-diagram; f542
+ pump-medical e06a
+ pump-soap e06b
+ pushed; f3e1
+ puzzle-piece; f12e
+ python; f3e2
+ qq; f1d6
+ qrcode; f029
+ question; f128
+ question-circle; f059
+ quidditch; f458
+ quinscape; f459
+ quora; f2c4
+ quote-left; f10d
+ quote-right; f10e
+ quran; f687
+ r-project; f4f7
+ radiation; f7b9
+ radiation-alt; f7ba
+ rainbow; f75b
+ random; f074
+ raspberry-pi; f7bb
+ ravelry; f2d9
+ react; f41b
+ reacteurope; f75d
+ readme; f4d5
+ rebel; f1d0
+ receipt; f543
+ record-vinyl; f8d9
+ recycle; f1b8
+ red-river; f3e3
+ reddit; f1a1
+ reddit-alien; f281
+ reddit-square; f1a2
+ redhat; f7bc
+ redo; f01e
+ redo-alt; f2f9
+ registered; f25d
+ remove-format; f87d
+ renren; f18b
+ reply; f3e5
+ reply-all; f122
+ replyd; f3e6
+ republican; f75e
+ researchgate; f4f8
+ resolving; f3e7
+ restroom; f7bd
+ retweet; f079
+ rev; f5b2
+ ribbon; f4d6
+ ring; f70b
+ road; f018
+ robot; f544
+ rocket; f135
+ rocketchat; f3e8
+ rockrms; f3e9
+ route; f4d7
+ rss; f09e
+ rss-square; f143
+ ruble-sign; f158
+ ruler; f545
+ ruler-combined; f546
+ ruler-horizontal; f547
+ ruler-vertical; f548
+ running; f70c
+ rupee-sign; f156
+ rust e07a
+ sad-cry; f5b3
+ sad-tear; f5b4
+ safari; f267
+ salesforce; f83b
+ sass; f41e
+ satellite; f7bf
+ satellite-dish; f7c0
+ save; f0c7
+ schlix; f3ea
+ school; f549
+ screwdriver; f54a
+ scribd; f28a
+ scroll; f70e
+ sd-card; f7c2
+ search; f002
+ search-dollar; f688
+ search-location; f689
+ search-minus; f010
+ search-plus; f00e
+ searchengin; f3eb
+ seedling; f4d8
+ sellcast; f2da
+ sellsy; f213
+ server; f233
+ servicestack; f3ec
+ shapes; f61f
+ share; f064
+ share-alt; f1e0
+ share-alt-square; f1e1
+ share-square; f14d
+ shekel-sign; f20b
+ shield-alt; f3ed
+ shield-virus e06c
+ ship; f21a
+ shipping-fast; f48b
+ shirtsinbulk; f214
+ shoe-prints; f54b
+ shopify e057
+ shopping-bag; f290
+ shopping-basket; f291
+ shopping-cart; f07a
+ shopware; f5b5
+ shower; f2cc
+ shuttle-van; f5b6
+ sign; f4d9
+ sign-in-alt; f2f6
+ sign-language; f2a7
+ sign-out-alt; f2f5
+ signal; f012
+ signature; f5b7
+ sim-card; f7c4
+ simplybuilt; f215
+ sink e06d
+ sistrix; f3ee
+ sitemap; f0e8
+ sith; f512
+ skating; f7c5
+ sketch; f7c6
+ skiing; f7c9
+ skiing-nordic; f7ca
+ skull; f54c
+ skull-crossbones; f714
+ skyatlas; f216
+ skype; f17e
+ slack; f198
+ slack-hash; f3ef
+ slash; f715
+ sleigh; f7cc
+ sliders-h; f1de
+ slideshare; f1e7
+ smile; f118
+ smile-beam; f5b8
+ smile-wink; f4da
+ smog; f75f
+ smoking; f48d
+ smoking-ban; f54d
+ sms; f7cd
+ snapchat; f2ab
+ snapchat-ghost; f2ac
+ snapchat-square; f2ad
+ snowboarding; f7ce
+ snowflake; f2dc
+ snowman; f7d0
+ snowplow; f7d2
+ soap e06e
+ socks; f696
+ solar-panel; f5ba
+ sort; f0dc
+ sort-alpha-down; f15d
+ sort-alpha-down-alt; f881
+ sort-alpha-up; f15e
+ sort-alpha-up-alt; f882
+ sort-amount-down; f160
+ sort-amount-down-alt; f884
+ sort-amount-up; f161
+ sort-amount-up-alt; f885
+ sort-down; f0dd
+ sort-numeric-down; f162
+ sort-numeric-down-alt; f886
+ sort-numeric-up; f163
+ sort-numeric-up-alt; f887
+ sort-up; f0de
+ soundcloud; f1be
+ sourcetree; f7d3
+ spa; f5bb
+ space-shuttle; f197
+ speakap; f3f3
+ speaker-deck; f83c
+ spell-check; f891
+ spider; f717
+ spinner; f110
+ splotch; f5bc
+ spotify; f1bc
+ spray-can; f5bd
+ square; f0c8
+ square-full; f45c
+ square-root-alt; f698
+ squarespace; f5be
+ stack-exchange; f18d
+ stack-overflow; f16c
+ stackpath; f842
+ stamp; f5bf
+ star; f005
+ star-and-crescent; f699
+ star-half; f089
+ star-half-alt; f5c0
+ star-of-david; f69a
+ star-of-life; f621
+ staylinked; f3f5
+ steam; f1b6
+ steam-square; f1b7
+ steam-symbol; f3f6
+ step-backward; f048
+ step-forward; f051
+ stethoscope; f0f1
+ sticker-mule; f3f7
+ sticky-note; f249
+ stop; f04d
+ stop-circle; f28d
+ stopwatch; f2f2
+ stopwatch-20 e06f
+ store; f54e
+ store-alt; f54f
+ store-alt-slash e070
+ store-slash e071
+ strava; f428
+ stream; f550
+ street-view; f21d
+ strikethrough; f0cc
+ stripe; f429
+ stripe-s; f42a
+ stroopwafel; f551
+ studiovinari; f3f8
+ stumbleupon; f1a4
+ stumbleupon-circle; f1a3
+ subscript; f12c
+ subway; f239
+ suitcase; f0f2
+ suitcase-rolling; f5c1
+ sun; f185
+ superpowers; f2dd
+ superscript; f12b
+ supple; f3f9
+ surprise; f5c2
+ suse; f7d6
+ swatchbook; f5c3
+ swift; f8e1
+ swimmer; f5c4
+ swimming-pool; f5c5
+ symfony; f83d
+ synagogue; f69b
+ sync; f021
+ sync-alt; f2f1
+ syringe; f48e
+ table; f0ce
+ table-tennis; f45d
+ tablet; f10a
+ tablet-alt; f3fa
+ tablets; f490
+ tachometer-alt; f3fd
+ tag; f02b
+ tags; f02c
+ tape; f4db
+ tasks; f0ae
+ taxi; f1ba
+ teamspeak; f4f9
+ teeth; f62e
+ teeth-open; f62f
+ telegram; f2c6
+ telegram-plane; f3fe
+ temperature-high; f769
+ temperature-low; f76b
+ tencent-weibo; f1d5
+ tenge; f7d7
+ terminal; f120
+ text-height; f034
+ text-width; f035
+ th; f00a
+ th-large; f009
+ th-list; f00b
+ the-red-yeti; f69d
+ theater-masks; f630
+ themeco; f5c6
+ themeisle; f2b2
+ thermometer; f491
+ thermometer-empty; f2cb
+ thermometer-full; f2c7
+ thermometer-half; f2c9
+ thermometer-quarter; f2ca
+ thermometer-three-quarters; f2c8
+ think-peaks; f731
+ thumbs-down; f165
+ thumbs-up; f164
+ thumbtack; f08d
+ ticket-alt; f3ff
+ tiktok e07b
+ times; f00d
+ times-circle; f057
+ tint; f043
+ tint-slash; f5c7
+ tired; f5c8
+ toggle-off; f204
+ toggle-on; f205
+ toilet; f7d8
+ toilet-paper; f71e
+ toilet-paper-slash e072
+ toolbox; f552
+ tools; f7d9
+ tooth; f5c9
+ torah; f6a0
+ torii-gate; f6a1
+ tractor; f722
+ trade-federation; f513
+ trademark; f25c
+ traffic-light; f637
+ trailer e041
+ train; f238
+ tram; f7da
+ transgender; f224
+ transgender-alt; f225
+ trash; f1f8
+ trash-alt; f2ed
+ trash-restore; f829
+ trash-restore-alt; f82a
+ tree; f1bb
+ trello; f181
+ trophy; f091
+ truck; f0d1
+ truck-loading; f4de
+ truck-monster; f63b
+ truck-moving; f4df
+ truck-pickup; f63c
+ tshirt; f553
+ tty; f1e4
+ tumblr; f173
+ tumblr-square; f174
+ tv; f26c
+ twitch; f1e8
+ twitter; f099
+ twitter-square; f081
+ typo3; f42b
+ uber; f402
+ ubuntu; f7df
+ uikit; f403
+ umbraco; f8e8
+ umbrella; f0e9
+ umbrella-beach; f5ca
+ uncharted e084
+ underline; f0cd
+ undo; f0e2
+ undo-alt; f2ea
+ uniregistry; f404
+ unity e049
+ universal-access; f29a
+ university; f19c
+ unlink; f127
+ unlock; f09c
+ unlock-alt; f13e
+ unsplash e07c
+ untappd; f405
+ upload; f093
+ ups; f7e0
+ usb; f287
+ user; f007
+ user-alt; f406
+ user-alt-slash; f4fa
+ user-astronaut; f4fb
+ user-check; f4fc
+ user-circle; f2bd
+ user-clock; f4fd
+ user-cog; f4fe
+ user-edit; f4ff
+ user-friends; f500
+ user-graduate; f501
+ user-injured; f728
+ user-lock; f502
+ user-md; f0f0
+ user-minus; f503
+ user-ninja; f504
+ user-nurse; f82f
+ user-plus; f234
+ user-secret; f21b
+ user-shield; f505
+ user-slash; f506
+ user-tag; f507
+ user-tie; f508
+ user-times; f235
+ users; f0c0
+ users-cog; f509
+ users-slash e073
+ usps; f7e1
+ ussunnah; f407
+ utensil-spoon; f2e5
+ utensils; f2e7
+ vaadin; f408
+ vector-square; f5cb
+ venus; f221
+ venus-double; f226
+ venus-mars; f228
+ vest e085
+ vest-patches e086
+ viacoin; f237
+ viadeo; f2a9
+ viadeo-square; f2aa
+ vial; f492
+ vials; f493
+ viber; f409
+ video; f03d
+ video-slash; f4e2
+ vihara; f6a7
+ vimeo; f40a
+ vimeo-square; f194
+ vimeo-v; f27d
+ vine; f1ca
+ virus e074
+ virus-slash e075
+ viruses e076
+ vk; f189
+ vnv; f40b
+ voicemail; f897
+ volleyball-ball; f45f
+ volume-down; f027
+ volume-mute; f6a9
+ volume-off; f026
+ volume-up; f028
+ vote-yea; f772
+ vr-cardboard; f729
+ vuejs; f41f
+ walking; f554
+ wallet; f555
+ warehouse; f494
+ watchman-monitoring e087
+ water; f773
+ wave-square; f83e
+ waze; f83f
+ weebly; f5cc
+ weibo; f18a
+ weight; f496
+ weight-hanging; f5cd
+ weixin; f1d7
+ whatsapp; f232
+ whatsapp-square; f40c
+ wheelchair; f193
+ whmcs; f40d
+ wifi; f1eb
+ wikipedia-w; f266
+ wind; f72e
+ window-close; f410
+ window-maximize; f2d0
+ window-minimize; f2d1
+ window-restore; f2d2
+ windows; f17a
+ wine-bottle; f72f
+ wine-glass; f4e3
+ wine-glass-alt; f5ce
+ wix; f5cf
+ wizards-of-the-coast; f730
+ wodu e088
+ wolf-pack-battalion; f514
+ won-sign; f159
+ wordpress; f19a
+ wordpress-simple; f411
+ wpbeginner; f297
+ wpexplorer; f2de
+ wpforms; f298
+ wpressr; f3e4
+ wrench; f0ad
+ x-ray; f497
+ xbox; f412
+ xing; f168
+ xing-square; f169
+ y-combinator; f23b
+ yahoo; f19e
+ yammer; f840
+ yandex; f413
+ yandex-international; f414
+ yarn; f7e3
+ yelp; f1e9
+ yen-sign; f157
+ yin-yang; f6ad
+ yoast; f2b1
+ youtube; f167
+ youtube-square; f431
+ zhihu; f63f
--- /dev/null
+#!/bin/sh
+
+# Probes xrandr for connected displays and lets user select one to use. User
+# may also select "manual selection" which opens arandr. (arandr can be buggy)
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+# based on a script by Luke Smith (lukesmith.xyz)
+
+
+twoscreen() { # If multi-monitor is selected and there are two screens.
+
+ mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?")
+ # Mirror displays using native resolution of external display and a scaled
+ # version for the internal display
+ if [ "$mirror" = "yes" ]; then
+ external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:")
+ internal=$(echo "$screens" | grep -v "$external")
+
+ res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \
+ tail -n 1 | awk '{print $1}')
+ res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \
+ tail -n 1 | awk '{print $1}')
+
+ res_ext_x=$(echo "$res_external" | sed 's/x.*//')
+ res_ext_y=$(echo "$res_external" | sed 's/.*x//')
+ res_int_x=$(echo "$res_internal" | sed 's/x.*//')
+ res_int_y=$(echo "$res_internal" | sed 's/.*x//')
+
+ scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l)
+ scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l)
+
+ xrandr --output "$external" --auto --scale 1.0x1.0 \
+ --output "$internal" --auto --same-as "$external" \
+ --scale "$scale_x"x"$scale_y"
+ else
+
+ primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
+ secondary=$(echo "$screens" | grep -v "$primary")
+ direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
+ xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0
+ fi
+ }
+
+morescreen() { # If multi-monitor is selected and there are more than two screens.
+ primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
+ secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:")
+ direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
+ tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:")
+ xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto
+}
+
+multimon() { # Multi-monitor handler.
+ case "$(echo "$screens" | wc -l)" in
+ 2) twoscreen ;;
+ *) morescreen ;;
+ esac ;}
+
+onescreen() { # If only one output available or chosen.
+ xrandr --output "$1" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "\b$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -)
+}
+
+postrun() { # Stuff to run to clean up.
+ bgloc="${XDG_DATA_HOME:-$HOME/.local/share}/bg"
+ xwallpaper --zoom "$bgloc" # Fix background if screen size/arangement has changed.
+ { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen
+}
+
+# Get all possible displays
+allposs=$(xrandr -q | grep "connected")
+
+# Get all connected screens.
+screens=$(echo "$allposs" | awk '/ connected/ {print $1}')
+
+# If there's only one screen
+[ "$(echo "$screens" | wc -l)" -lt 2 ] &&
+ { onescreen "$screens"; postrun; notify-send "Only one screen detected." "Using it in its optimal settings..."; exit ;}
+
+# Get user choice including multi-monitor and manual selection:
+chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") &&
+case "$chosen" in
+ "manual selection") arandr ; exit ;;
+ "multi-monitor") multimon ;;
+ *) onescreen "$chosen" ;;
+esac
+
+postrun
--- /dev/null
+#!/bin/sh
+
+# Feed this script a link and dmenu will return some choice programs to open
+# it.
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+# based on a script by Luke Smith (lukesmith.xyz)
+
+feed="${1:-$(true | dmenu -p 'Paste URL or file path')}"
+
+case "$(printf "copy url\\nbrowser\\nmpv\\nnsxiv\\nPDF\\nlynx\\nvim\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in
+ "copy url") echo "$feed" | xclip -selection clipboard ;;
+ mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;;
+ "queue yt-dlp") qndl "$feed" >/dev/null 2>&1 ;;
+ "queue yt-dlp audio") qndl "$feed" 'yt-dlp -o "%(title)s.%(ext)s" -f bestaudio --embed-metadata --restrict-filenames' ;;
+ "queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;;
+ PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
+ nsxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && nsxiv -a "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
+ vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
+ browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+killall mpv
--- /dev/null
+#!/bin/sh
+
+# dmenu screenshot utillity. Requires maim
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+output="$(date '+%y%m%d-%H%M-%S').png"
+xclip_cmd="xclip -sel clip -t image/png"
+
+case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in
+ "a selected area") maim -u -s pic-selected-"${output}" ;;
+ "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;;
+ "full screen") maim -q -d 0.2 pic-full-"${output}" ;;
+ "a selected area (copy)") maim -u -s | ${xclip_cmd} ;;
+ "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;;
+ "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Gives a dmenu prompt to mount unmounted local NAS shares for read/write.
+# Requirements - "%wheel ALL=(ALL) NOPASSWD: ALL"
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+# based on a script by Luke Smith (lukesmith.xyz)
+
+srvname=$(avahi-browse _smb._tcp -t | awk '{print $4}' | dmenu -i -p "Which NAS?") || exit 1
+notify-send "Searching for network shares..." "Please wait..."
+share=$(smbclient -L "$srvname" -N | grep Disk | awk '{print $1}' | dmenu -i -p "Mount which share?") || exit 1
+share2mnt=//"$srvname".local/"$share"
+
+sharemount() {
+ mounted=$(mount -v | grep "$share2mnt") || ([ ! -d /mnt/"$share" ] && sudo mkdir /mnt/"$share")
+ [ -z "$mounted" ] && sudo mount -t cifs "$share2mnt" -o user=nobody,password="",noperm /mnt/"$share" && notify-send "Netshare $share mounted" && exit 0
+ notify-send "Netshare $share already mounted"; exit 1
+}
+
+sharemount
--- /dev/null
+#!/bin/bash
+
+# Mounts Android Phones and USB drives (encrypted or not).
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+# based on a script by Luke Smith (lukesmith.xyz)
+
+IFS='
+'
+# Function for escaping cell-phone names.
+escape(){ echo "$@" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g" ;}
+
+# Check for phones.
+phones="$(simple-mtpfs -l 2>/dev/null | sed "s/^/📱/")"
+mountedphones="$(grep "simple-mtpfs" /etc/mtab)"
+# If there are already mounted phones, remove them from the list of mountables.
+[ -n "$mountedphones" ] && phones="$(for phone in $phones; do
+ for mounted in $mountedphones; do
+ escphone="$(escape "$phone")"
+ [[ "$mounted" =~ "$escphone" ]] && break 1
+ done && continue 1
+ echo "$phone"
+done)"
+
+# Check for drives.
+lsblkoutput="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")"
+# Get all LUKS drives
+allluks="$(echo "$lsblkoutput" | grep crypto_LUKS)"
+# Get a list of the LUKS drive UUIDs already decrypted.
+decrypted="$(find /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-* | sed "s|.*LUKS2-||;s|-.*||")"
+# Functioning for formatting drives correctly for dmenu:
+filter() { sed "s/ /:/g" | awk -F':' '$7==""{printf "%s%s (%s) %s\n",$1,$3,$5,$6}' ; }
+
+# Get only LUKS drives that are not decrypted.
+unopenedluks="$(for drive in $allluks; do
+ uuid="${drive%% *}"
+ uuid="${uuid//-}" # This is a bashism.
+ [ -n "$decrypted" ] && for open in $decrypted; do
+ [ "$uuid" = "$open" ] && break 1
+ done && continue 1
+ echo "🔒 $drive"
+done | filter)"
+
+# Get all normal, non-encrypted or decrypted partitions that are not mounted.
+normalparts="$(echo "$lsblkoutput"| grep -v crypto_LUKS | grep 'part\|rom\|crypt' | sed "s/^/💾 /" | filter )"
+
+# Add all to one variable. If no mountable drives found, exit.
+alldrives="$(echo "$phones
+$unopenedluks
+$normalparts" | sed "/^$/d;s/ *$//")"
+
+# Quit the script if a sequential command fails.
+set -e
+
+test -n "$alldrives"
+
+# Feed all found drives to dmenu and get user choice.
+chosen="$(echo "$alldrives" | dmenu -p "Mount which drive?" -i)"
+
+# Function for prompting user for a mountpoint.
+getmount(){
+ mp="$(find /mnt /media /mount /home -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")"
+ test -n "$mp"
+ if [ ! -d "$mp" ]; then
+ mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?")
+ [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
+ fi
+}
+
+attemptmount(){
+ # Attempt to mount without a mountpoint, to see if drive is in fstab.
+ sudo -A mount "$chosen" || return 1
+ notify-send "💾Drive Mounted." "$chosen mounted."
+ exit
+}
+
+case "$chosen" in
+ 💾*)
+ chosen="${chosen%% *}"
+ chosen="${chosen:1}" # This is a bashism.
+ parttype="$(echo "$lsblkoutput" | grep "$chosen")"
+ attemptmount || getmount
+ case "${parttype##* }" in
+ vfat) sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000 ;;
+ btrfs) sudo -A mount "$chosen" "$mp" ;;
+ *) sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)" ;;
+ esac
+ notify-send "💾Drive Mounted." "$chosen mounted to $mp."
+ ;;
+
+ 🔒*)
+ chosen="${chosen%% *}"
+ chosen="${chosen:1}" # This is a bashism.
+ # Number the drive.
+ while true; do
+ [ -f "/dev/mapper/usb$num" ] || break
+ num="$(printf "%02d" "$((num +1))")"
+ done
+
+ # Decrypt in a terminal window
+ ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$chosen" "usb$num"
+ # Check if now decrypted.
+ test -b "/dev/mapper/usb$num"
+
+ attemptmount || getmount
+ sudo -A mount "/dev/mapper/usb$num" "$mp" -o uid="$(id -u)",gid="$(id -g)"
+ notify-send "🔓Decrypted drive Mounted." "$chosen decrypted and mounted to $mp."
+ ;;
+
+ 📱*)
+ notify-send "❗Note" "Remember to allow file access on your phone now."
+ getmount
+ number="${chosen%%:*}"
+ number="${chosen:1}" # This is a bashism.
+ sudo -A simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp"
+ notify-send "🤖 Android Mounted." "Android device mounted to $mp."
+ ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Set this script as the SUDO_ASKPASS variable. Will function as a password
+# prompt.
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+dmenu -fn Monospace-18 -P -p "$1" <&- && echo
--- /dev/null
+#!/bin/sh
+
+# dmenu screen capture utillity
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+# based on a script by Luke Smith (lukesmith.xyz)
+
+getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;}
+
+updateicon() { \
+ echo "$1" > /tmp/recordingicon
+ pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
+ }
+
+killrecording() {
+ recpid="$(cat /tmp/recordingpid)"
+ kill -15 "$recpid"
+ rm -f /tmp/recordingpid
+ updateicon ""
+ pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
+ }
+
+screencast() { \
+ ffmpeg -y \
+ -f x11grab \
+ -framerate 30 \
+ -s "$(getdim)" \
+ -i "$DISPLAY" \
+ -r 24 \
+ -use_wallclock_as_timestamps 1 \
+ -f alsa -thread_queue_size 1024 -i default \
+ -c:v h264 \
+ -crf 0 -preset ultrafast -c:a aac \
+ "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
+ echo $! > /tmp/recordingpid
+ updateicon "⏺️🎙️"
+ }
+
+video() { ffmpeg \
+ -f x11grab \
+ -framerate 30 \
+ -s "$(getdim)" \
+ -i "$DISPLAY" \
+ -c:v libx264 -qp 0 -r 30 \
+ "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "⏺️"
+ }
+
+webcamhidef() { ffmpeg \
+ -f v4l2 \
+ -i /dev/video0 \
+ -video_size 1920x1080 \
+ "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "🎥"
+ }
+
+webcam() { ffmpeg \
+ -f v4l2 \
+ -i /dev/video0 \
+ -video_size 640x480 \
+ "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "🎥"
+ }
+
+
+audio() { \
+ ffmpeg \
+ -f alsa -i default \
+ -c:a flac \
+ "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" &
+ echo $! > /tmp/recordingpid
+ updateicon "🎙️"
+ }
+
+askrecording() { \
+ choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
+ case "$choice" in
+ screencast) screencast;;
+ audio) audio;;
+ video) video;;
+ *selected) videoselected;;
+ webcam) webcam;;
+ "webcam (hi-def)") webcamhidef;;
+ esac
+ }
+
+asktoend() { \
+ response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
+ [ "$response" = "Yes" ] && killrecording
+ }
+
+videoselected()
+{
+ slop -f "%x %y %w %h" > /tmp/slop
+ read -r X Y W H < /tmp/slop
+ rm /tmp/slop
+
+ ffmpeg \
+ -f x11grab \
+ -framerate 30 \
+ -video_size "$W"x"$H" \
+ -i :0.0+"$X,$Y" \
+ -c:v libx264 -qp 0 -r 30 \
+ "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" &
+ echo $! > /tmp/recordingpid
+ updateicon "⏺️"
+}
+
+case "$1" in
+ screencast) screencast;;
+ audio) audio;;
+ video) video;;
+ *selected) videoselected;;
+ kill) killrecording;;
+ *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
+esac
--- /dev/null
+#!/bin/sh
+
+# stream radio stations
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+streamList="
+WXXI Classical (Rochester Classical Radio) link:https://22213.live.streamtheworld.com/WXXIFM.mp3
+Classical WSMR (Tampa Classical Radio) link:https://worldradiomap.com/us-fl/play/wsmr_live
+WHTK Fox Sports 1280 AM (Rochester Sports Radio) link:https://worldradiomap.com/us-ny/play/whtk_live
+WDAE 620 AM/95.3 FM (Tampa Sports Radio) link:https://worldradiomap.com/us-fl/play/wdae_live
+"
+
+selected=$(echo "$streamList" | grep -P "^$(echo "$streamList" | grep "https:" | sed 's/link:.*//g' | dmenu -i -p "Select a Stream" -l 20 | awk '{print $1}')\s")
+name=$(echo "$selected" | sed 's/link:.*//g')
+
+notify-send "now-playing" "$name"
+echo "$selected" | sed 's/.*link://' | xargs -r mpv --no-video --terminal=no || notify-send "mpv failed"
--- /dev/null
+#!/bin/sh
+
+# dmenu wrapper script for system functions.
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+export WM="dwm"
+case "$(readlink -f /sbin/init)" in
+ *systemd*) ctl='systemctl' ;;
+ *) ctl='loginctl' ;;
+esac
+
+wmpid(){ # This function is needed if there are multiple instances of the window manager.
+ tree="$(pstree -ps $$)"
+ tree="${tree#*$WM(}"
+ echo "${tree%%)*}"
+}
+
+case "$(printf " lock\n leave $WM\n renew $WM\n hibernate\n reboot\n shutdown\n sleep\n display off" | dmenu -i -p 'Action: ')" in
+ ' lock') slock ;;
+ " leave $WM") kill -TERM "$(wmpid)" ;;
+ " renew $WM") kill -HUP "$(wmpid)" ;;
+ ' hibernate') slock $ctl hibernate -i ;;
+ ' sleep') slock $ctl suspend -i ;;
+ ' reboot') $ctl reboot -i ;;
+ ' shutdown') $ctl poweroff -i ;;
+ ' display off') xset dpms force off ;;
+ *) exit 1 ;;
+esac
--- /dev/null
+#!/bin/sh
+
+# Unmount USB drives or Android phones.
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+# based on a script by Luke Smith (lukesmith.xyz)
+
+set -e
+
+mounteddroids="$(grep simple-mtpfs /etc/mtab | awk '{print "📱" $2}')"
+lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")"
+mounteddrives="$(echo "$lsblkoutput" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "💾%s (%s)\n",$4,$3}')"
+
+allunmountable="$(echo "$mounteddroids
+$mounteddrives" | sed "/^$/d;s/ *$//")"
+test -n "$allunmountable"
+
+chosen="$(echo "$allunmountable" | dmenu -i -p "Unmount which drive?")"
+chosen="${chosen%% *}"
+test -n "$chosen"
+
+sudo -A umount -l "/${chosen#*/}"
+notify-send "Device unmounted." "$chosen has been unmounted."
+
+# Close the chosen drive if decrypted.
+cryptid="$(echo "$lsblkoutput" | grep "/${chosen#*/}$")"
+cryptid="${cryptid%% *}"
+test -b /dev/mapper/"${cryptid##*/}"
+sudo -A cryptsetup close "$cryptid"
+notify-send "🔒Device dencryption closed." "Drive is now securely locked again."
--- /dev/null
+#!/bin/sh
+
+# Tucker Johnson (git.newer.systems) (tucker@newer.systems)
+
+# This script is to add out-of the box features to my dmenu build. If you want
+# to make changes, make them in the source directory and reinstall.
+
+chosen=$(cut -d ';' -f1 /usr/lib/TuCLS/chars/* | dmenu -i -l 30 | sed "s/ .*//")
+
+[ -z "$chosen" ] && exit
+
+if [ -n "$1" ]; then
+ xdotool type "$chosen"
+else
+ printf "%s" "$chosen" | xclip -selection clipboard
+ notify-send "'$chosen' copied to clipboard." &
+fi
--- /dev/null
+#!/bin/sh
+
+cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}"
+cache="$cachedir/dmenu_run"
+
+[ ! -e "$cachedir" ] && mkdir -p "$cachedir"
+
+IFS=:
+if stest -dqr -n "$cache" $PATH; then
+ stest -flx $PATH | sort -u | tee "$cache"
+else
+ cat "$cache"
+fi
--- /dev/null
+#!/bin/sh
+dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} &