diff options
author | awy <awy@awy.one> | 2025-07-29 03:42:18 +0300 |
---|---|---|
committer | awy <awy@awy.one> | 2025-07-29 03:42:18 +0300 |
commit | ef6dff4cce15186a66ba34cdd7bd39958ebf7f58 (patch) | |
tree | fcfa61164ca6e79c900b5d11f6afc6b46aaccb84 /.local | |
download | hyprdots-ef6dff4cce15186a66ba34cdd7bd39958ebf7f58.tar.gz |
first commit
Diffstat (limited to '.local')
88 files changed, 7411 insertions, 0 deletions
diff --git a/.local/bin/bookmarks b/.local/bin/bookmarks new file mode 100755 index 0000000..a04a403 --- /dev/null +++ b/.local/bin/bookmarks @@ -0,0 +1,142 @@ +#!/bin/dash + +URLQUERY_FILE="${HOME}/.local/share/urlquery" +ACTION_MENU="@@" + +CLIPBOARD() { + wl-paste +} + +DMENU() { + mew -i -l "${1}" -p "${2}" +} + +error_notify() { + notify-send "${1}" + exit "1" +} + +ensure_file_exists() { + [ -f "${URLQUERY_FILE}" ] || { + notify-send "${URLQUERY_FILE} does not exist. Creating it now." + printf "SearXNG=https://searx.tiekoetter.com/search?q=\n" > "${URLQUERY_FILE}" + } +} + +get_selection() { + cut -d= -f1 "${URLQUERY_FILE}" | DMENU "${LINE_COUNT}" "Bookmarks" +} + +update_file() { + pattern="${1}" + replacement="${2}" + + sed "/${pattern}/c\\${replacement}" "${URLQUERY_FILE}" > "${URLQUERY_FILE}.tmp" && + mv "${URLQUERY_FILE}.tmp" "${URLQUERY_FILE}" || + error_notify "Failed to update the file." +} + +is_valid_url() { + printf "%s\n" "${1}" | rg -q "^https?://[^[:space:]/?#][^[:space:]]+$" +} + +add_bookmark() { + URL="$(CLIPBOARD)" + + is_valid_url "${URL}" || error_notify "The clipboard content is not a valid URL." + + rg -q "=${URL}$" "${URLQUERY_FILE}" && + notify-send "The URL is already in the list." && return + + NAME="$(printf "" | DMENU "0" "Name")" + + [ -n "${NAME}" ] && printf "%s\n" "${NAME}=${URL}" >> "${URLQUERY_FILE}" && + notify-send "'${NAME}' is bookmarked." +} + +delete_bookmark() { + NAME="$(get_selection)" + + [ -z "${NAME}" ] && error_notify "Failed to delete the bookmark." && return + + sed "/^${NAME}=/d" "${URLQUERY_FILE}" > "${URLQUERY_FILE}.tmp" + mv "${URLQUERY_FILE}.tmp" "${URLQUERY_FILE}" + + [ -s "${URLQUERY_FILE}" ] && rg -q "\S" "${URLQUERY_FILE}" || rm "${URLQUERY_FILE}" + + notify-send "'${NAME}' is deleted." +} + +edit_name() { + OLD_NAME="${1}" + NEW_NAME="$(printf "" | DMENU "0" "New Name")" + + [ -z "${NEW_NAME}" ] && return + + URL="$(rg "^${OLD_NAME}=" "${URLQUERY_FILE}" | cut -d= -f2)" + + update_file "^${OLD_NAME}=" "${NEW_NAME}=${URL}" +} + +edit_url() { + NAME="${1}" + NEW_URL="$(echo "" | DMENU "0" "New URL")" + + [ -z "${NEW_URL}" ] && return + + update_file "^${NAME}=.*" "${NAME}=${NEW_URL}" +} + +edit_bookmark() { + NAME="$(get_selection)" + + [ -z "${NAME}" ] && error_notify "Failed to edit the bookmark." && return + + FIELD="$(printf "Name\nURL\n" | DMENU "2" "Edit")" + + case "${FIELD}" in + "Name")edit_name "${NAME}";; + "URL")edit_url "${NAME}" + esac + + notify-send "'${NAME}' is updated." +} + +open_bookmark() { + URL="$(rg "^${SELECTION}=" "${URLQUERY_FILE}" | cut -d= -f2-)" + + [ -z "${URL}" ] && notify-send "Bookmark not found." && exit "1" + + case "${URL}" in + *"search"* | *"wiki"* | *"packages"* | *"chatgpt"*) QUERY="$(echo "" | DMENU "0" "Search")" + URL="${URL}${QUERY}" + ;; + esac + + "${BROWSER}" "${URL}" || notify-send "Failed to open the URL." +} + +ensure_file_exists + +LINE_COUNT="$(wc -l < "${URLQUERY_FILE}")" + +[ "${LINE_COUNT}" -ge "15" ] && LINE_COUNT="15" + +SELECTION="$(get_selection)" + +[ -z "${SELECTION}" ] && exit + +case "${SELECTION}" in + "${ACTION_MENU}") + ACTION="$(printf "Add\nDelete\nEdit\n" | DMENU "3" "Action")" + + case "${ACTION}" in + "Add") add_bookmark ;; + "Delete") delete_bookmark ;; + "Edit") edit_bookmark ;; + esac + ;; + *) + open_bookmark + ;; +esac diff --git a/.local/bin/booksplit b/.local/bin/booksplit new file mode 100755 index 0000000..079d85f --- /dev/null +++ b/.local/bin/booksplit @@ -0,0 +1,43 @@ +#!/bin/sh + +# Requires ffmpeg + +[ ! -f "$2" ] && printf "The first file should be the audio, the second should be the timecodes.\\n" && exit + +echo "Enter the album/book title:"; read -r booktitle +echo "Enter the artist/author:"; read -r author +echo "Enter the publication year:"; read -r year + +inputaudio="$1" +ext="${1##*.}" + +# Get a safe file name from the book. +escbook="$(echo "$booktitle" | iconv -c -f UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")" + +! mkdir -p "$escbook" && + echo "Do you have write access in this directory?" && + exit 1 + +# Get the total number of tracks from the number of lines. +total="$(wc -l < "$2")" + +cmd="ffmpeg -i \"$inputaudio\" -nostdin -y" + +while read -r x; +do + end="$(echo "$x" | cut -d' ' -f1)" + file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext" + if [ -n "$start" ]; then + cmd="$cmd -metadata artist=\"$author\" -metadata title=\"$title\" -metadata album=\"$booktitle\" -metadata year=\"$year\" -metadata track=\"$track\" -metadata total=\"$total\" -ss \"$start\" -to \"$end\" -vn -c:a copy \"$file\" " + fi + title="$(echo "$x" | cut -d' ' -f2-)" + esctitle="$(echo "$title" | iconv -c -f UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")" + track="$((track+1))" + start="$end" +done < "$2" + +# Last track must be added out of the loop. +file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext" +cmd="$cmd -metadata artist=\"$author\" -metadata title=\"$title\" -metadata album=\"$booktitle\" -metadata year=\"$year\" -metadata track=\"$track\" -ss \"$start\" -vn -c copy \"$file\"" + +eval "$cmd" diff --git a/.local/bin/cleanup b/.local/bin/cleanup new file mode 100755 index 0000000..4f0bee1 --- /dev/null +++ b/.local/bin/cleanup @@ -0,0 +1,2 @@ +#!/bin/sh +yes | paru -Scc diff --git a/.local/bin/compiler b/.local/bin/compiler new file mode 100755 index 0000000..5c02164 --- /dev/null +++ b/.local/bin/compiler @@ -0,0 +1,42 @@ +#!/bin/sh + +# This script will compile or run another finishing operation on a document. I +# have this script run via vim. + +# Compiles .tex. groff (.mom, .ms), .rmd, .md, .org. Opens .sent files as sent +# presentations. Runs scripts based on extension or shebang. + +file="${1}" +ext="${file##*.}" +dir=${file%/*} +base="${file%.*}" + +cd "${dir}" || exit "1" + +case "${ext}" in + [0-9]) preconv "${file}" | refer -PS -e | groff -mandoc -T pdf > "${base}.pdf" ;; + mom|ms) preconv "${file}" | refer -PS -e | groff -T pdf -m"${ext}" > "${base}.pdf" ;; + c) cc "${file}" -o "${base}" && "${base}" ;; + cob) cobc -x -o "$base" "$file" && "$base" ;; + cpp|cc) g++ "${file}" -o "${base}" && "${base}" ;; + cs) mcs "${file}" && mono "${base}.exe" ;; + go) go run "${file}" ;; + h) doas make install ;; + java) javac -d classes "${file}" && java -cp classes "${base}" ;; + m) octave "${file}" ;; + md) [ -x "$(command -v lowdown)" ] && \ + lowdown --parse-no-intraemph "${file}" -Tms | groff -mpdfmark -ms -kept -T pdf > "${base}.pdf" || \ + [ -x "$(command -v groffdown)" ] && \ + groffdown -i "${file}" | groff -T pdf > "${base}.pdf" || \ + pandoc -t ms --highlight-style="kate" -s -o "${base}.pdf" "${file}" ;; + org) emacs "${file}" --batch -u "${USER}" -f org-latex-export-to-pdf ;; + py) python "${file}" ;; + rink) rink -f "${file}" ;; + [rR]md) Rscript -e "rmarkdown::render('${file}', quiet=TRUE)" ;; + rs) cargo build && cargo run --quiet ;; + sass) sassc -a "${file}" "${base}.css" ;; + scad) openscad -o "${base}.stl" "${file}" ;; + sent) setsid -f sent "${file}" 2> "/dev/null" ;; + tex) latexmk ;; + *) sed -n '/^#!/s/^#!//p; q' "${file}" | xargs -r -I % "${file}" ;; +esac diff --git a/.local/bin/cron/README.md b/.local/bin/cron/README.md new file mode 100644 index 0000000..e314296 --- /dev/null +++ b/.local/bin/cron/README.md @@ -0,0 +1,14 @@ +# Important Note + +These cronjobs have components that require information about your current display to display notifications correctly. + +When you add them as cronjobs, I recommend you precede the command with commands as those below: + +``` +export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u $USER)/bus; export WAYLAND_DISPLAY=wayland-1; . $HOME/.zprofile; then_command_goes_here +``` + +This ensures that notifications will display, wtype/wlrctl commands will function and environmental variables will work as well. + +# Also important +DBUS_SESSION_BUS_ADDRESS variable will always have a random address in the /tmp directory when you are using dinit as your init system. diff --git a/.local/bin/cron/checkup b/.local/bin/cron/checkup new file mode 100755 index 0000000..fbe8e0f --- /dev/null +++ b/.local/bin/cron/checkup @@ -0,0 +1,17 @@ +#!/bin/sh + +# Syncs repositories and downloads updates, meant to be run as a cronjob. + +notify-send "๐ฆ Repository Sync" "Checking for package updates..." + +doas pacman -Syyuw --noconfirm || notify-send "Error downloading updates. + +Check your internet connection, if pacman is already running, or run update manually to see errors." +pkill -RTMIN+8 "${STATUSBAR:-waybar}" + +if pacman -Qu | rg -v "\[ignored\]" +then + notify-send "๐ Repository Sync" "Updates available. Click statusbar icon (๐ฆ) for update." +else + notify-send "๐ฆ Repository Sync" "Sync complete. No new packages for update." +fi diff --git a/.local/bin/cron/crontog b/.local/bin/cron/crontog new file mode 100755 index 0000000..c9a640f --- /dev/null +++ b/.local/bin/cron/crontog @@ -0,0 +1,6 @@ +#!/bin/sh + +# Toggles all cronjobs off/on. +# Stores disabled crontabs in ~/.config/cronsaved until restored. + +([ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved ] && crontab - < "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && rm "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && notify-send "๐ Cronjobs re-enabled.") || ( crontab -l > "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && crontab -r && notify-send "๐ Cronjobs saved and disabled.") diff --git a/.local/bin/cron/mailup b/.local/bin/cron/mailup new file mode 100755 index 0000000..0b2ab2d --- /dev/null +++ b/.local/bin/cron/mailup @@ -0,0 +1,9 @@ +#!/bin/sh + +pgrep -f mailsync && exit + +echo ๐ > /tmp/mailupdate +pkill -RTMIN+12 "${STATUSBAR:-waybar}" +/usr/local/bin/mailsync +rm -f /tmp/mailupdate +pkill -RTMIN+12 "${STATUSBAR:-waybar}" diff --git a/.local/bin/cron/newsup b/.local/bin/cron/newsup new file mode 100755 index 0000000..efdf4ae --- /dev/null +++ b/.local/bin/cron/newsup @@ -0,0 +1,18 @@ +#!/bin/sh + +# Set as a cron job to check for new RSS entries for newsboat. +# If newsboat is open, sends it an "R" key to refresh. + +export XDG_RUNTIME_DIR=/run/user/1000 +export WAYLAND_DISPLAY=wayland-1 + +/usr/bin/notify-send "๐ฐ Updating RSS feeds..." + +pgrep -f newsboat$ && /usr/bin/wlrctl window focus title:newsboat && /usr/bin/wlrctl keyboard type R && exit + +echo ๐ > /tmp/newsupdate +pkill -RTMIN+6 "${STATUSBAR:-waybar}" +/usr/bin/newsboat -x reload +rm -f /tmp/newsupdate +pkill -RTMIN+6 "${STATUSBAR:-waybar}" +/usr/bin/notify-send "๐ฐ RSS feed update complete." diff --git a/.local/bin/define b/.local/bin/define new file mode 100755 index 0000000..8452671 --- /dev/null +++ b/.local/bin/define @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +word=${1:-$(xclip -o -selection primary 2>/dev/null || wl-paste 2>/dev/null)} + +# Check for empty word or special characters +[[ -z "$word" || "$word" =~ [\/] ]] && notify-send -h string:bgcolor:#bf616a -t 3000 "Invalid input." && exit 0 + +query=$(curl -s --connect-timeout 5 --max-time 10 "https://api.dictionaryapi.dev/api/v2/entries/en_US/$word") + +# Check for connection error (curl exit status stored in $?) +[ $? -ne 0 ] && notify-send -h string:bgcolor:#bf616a -t 3000 "Connection error." && exit 1 + +# Check for invalid word response +[[ "$query" == *"No Definitions Found"* ]] && notify-send -h string:bgcolor:#bf616a -t 3000 "Invalid word." && exit 0 + +# Show only first 3 definitions +def=$(echo "$query" | jq -r '[.[].meanings[] | {pos: .partOfSpeech, def: .definitions[].definition}] | .[:3].[] | "\n\(.pos). \(.def)"') + +# Requires a notification daemon to be installed +notify-send -t 60000 "$word -" "$def" + + +### MORE OPTIONS :) + +# Show first definition for each part of speech (thanks @morgengabe1 on youtube) +# def=$(echo "$query" | jq -r '.[0].meanings[] | "\(.partOfSpeech): \(.definitions[0].definition)\n"') + +# Show all definitions +# def=$(echo "$query" | jq -r '.[].meanings[] | "\n\(.partOfSpeech). \(.definitions[].definition)"') + +# Regex + rg for just definition, if anyone prefers that to jq +# def=$(rg -Po '"definition":"\K(.*?)(?=")' <<< "$query") + +# bold=$(tput bold) # Print text bold with echo, for visual clarity +# normal=$(tput sgr0) # Reset text to normal +# echo "${bold}Definition of $word" +# echo "${normal}$def" diff --git a/.local/bin/displayselect b/.local/bin/displayselect new file mode 100755 index 0000000..4744dd3 --- /dev/null +++ b/.local/bin/displayselect @@ -0,0 +1,82 @@ +#!/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" | rg -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" | rg -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" | rg -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" | rg -v ^"$primary"$ | rg -v ^"$secondary"$ | dmenu -i -p "Select third display:") + xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | rg -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" | rg -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 | rg "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 diff --git a/.local/bin/dmenuhandler b/.local/bin/dmenuhandler new file mode 100755 index 0000000..875bbc2 --- /dev/null +++ b/.local/bin/dmenuhandler @@ -0,0 +1,21 @@ +#!/bin/sh + +# Feed this script a link and it will give mew +# some choice programs to use to open it. +feed="${1:-$(true | mew -p 'Paste URL or file path')}" + +case "$(printf "copy url\\nswayimg\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | mew -i -p "Open it with?")" in + "copy url") echo "$feed" | wl-copy ;; + 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 ;; + swayimg) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && swayimg "/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 ; swaybg -i $XDG_CACHE_HOME/pic -m fill & >/dev/null 2>&1 ;; + browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;; + lynx) lynx "$feed" >/dev/null 2>&1 ;; +esac diff --git a/.local/bin/dmenumountcifs b/.local/bin/dmenumountcifs new file mode 100755 index 0000000..4832213 --- /dev/null +++ b/.local/bin/dmenumountcifs @@ -0,0 +1,19 @@ +#!/bin/sh +# Gives a mew 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}' | mew -i -p "Which NAS?") || exit 1 +notify-send "Searching for network shares..." "Please wait..." +# Choose share disk... +share=$(smbclient -L "$srvname" -N | rg Disk | awk '{print $1}' | mew -i -p "Mount which share?") || exit 1 +# Format URL... +share2mnt=//"$srvname".local/"$share" + +sharemount() { + mounted=$(mount -v | rg "$share2mnt") || ([ ! -d /mnt/"$share" ] && doas mkdir /mnt/"$share") + [ -z "$mounted" ] && doas 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 diff --git a/.local/bin/dmenupass b/.local/bin/dmenupass new file mode 100755 index 0000000..bea2ad9 --- /dev/null +++ b/.local/bin/dmenupass @@ -0,0 +1,6 @@ +#!/bin/sh + +# This script is the SUDO_ASKPASS variable, meaning that it will be used as a +# password prompt if needed. + +mew -P -p "password:" <&- diff --git a/.local/bin/dmenurecord b/.local/bin/dmenurecord new file mode 100755 index 0000000..6f51f5f --- /dev/null +++ b/.local/bin/dmenurecord @@ -0,0 +1,113 @@ +#!/bin/sh + +# Usage: +# `$0`: Ask for recording type via mew +# `$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() { + screens=$(hyprctl monitors | grep Monitor | cut -d' ' -f2) + choice=$(printf "$screens\nExit\n" | mew) + [ "${choice}" != "Exit" ] || [ -z "${choice}" ] || exit && + echo $choice +} + +updateicon() { \ + echo "$1" > /tmp/recordingicon + pkill -RTMIN+9 "${STATUSBAR:-waybar}" +} + +killrecording() { + recpid="$(bat /tmp/recordingpid)" + echo $recpid + kill -2 "$recpid" + rm -f /tmp/recordingpid + updateicon "" + pkill -RTMIN+9 "${STATUSBAR:-waybar}" +} + +screencast() { gpu-screen-recorder \ + -w "$(getdim)" \ + -f 60 \ + -a default_output \ + -a default_input \ + -o "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & + echo $! > /tmp/recordingpid + updateicon "โบ๏ธ๐๏ธ" +} + +video() { gpu-screen-recorder \ + -w "$(getdim)" \ + -f 60 \ + -o "$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)" | mew -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" | mew -i -p "Recording still active. End recording?") && + [ "$response" = "Yes" ] && killrecording +} + +videoselected() +{ + gpu-screen-recorder \ + -w region -region $(slurp -f "%wx%h+%x+%y") \ + -f 60 \ + -o "$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 diff --git a/.local/bin/dmenuunicode b/.local/bin/dmenuunicode new file mode 100755 index 0000000..2c09c80 --- /dev/null +++ b/.local/bin/dmenuunicode @@ -0,0 +1,20 @@ +#!/bin/sh + +# The famous "get a menu of emojis to copy" script. + +# Get user selection via mew from emoji file. +chosen=$(cut -d ';' -f1 ~/.local/share/larbs/chars/* | mew -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 + # currently only ascii supported in wlrctl + # wlrctl keyboard type"$chosen" + wtype "$chosen" +else + printf "%s" "$chosen" | wl-copy + notify-send "'$chosen' copied to clipboard." & +fi diff --git a/.local/bin/doas_askpass b/.local/bin/doas_askpass new file mode 100755 index 0000000..f5d61ef --- /dev/null +++ b/.local/bin/doas_askpass @@ -0,0 +1,47 @@ +#!/usr/bin/expect -- + +# askpass implementation for doas +# example usage: DOAS_ASKPASS="mew -P -p password:" doas_askpass echo working + +# don't mind the man behind the curtain +log_user 0 + +# no command, then nothing to do +if { $argc == 0 } { exit 0 } + +# treat all arguments as command input +set cmd [lrange $argv 0 end]; + +# read askpass from env or fallback to dmenu_pass () +if {[info exists ::env(DOAS_ASKPASS)]} { + set askpass "$::env(DOAS_ASKPASS)" +} else { + set askpass "dmenu_pass password:" +} + +# read password from user +set pwd [exec {*}$askpass] + +# spawn doas operation +spawn doas {*}$cmd + +# send password and execute command +expect "doas*password:" { + send -- "$pwd\r" + expect \r + log_user 1 + expect eof +} + +# get the exit status of the spawned doas command +set status [wait] + +# check exit code (4th element of wait result) +set exit_code [lindex $status 3] + +# exit with 1 if doas failed, else 0 +if { $exit_code != 0 } { + exit 1 +} else { + exit 0 +} diff --git a/.local/bin/getbib b/.local/bin/getbib new file mode 100755 index 0000000..2c3f026 --- /dev/null +++ b/.local/bin/getbib @@ -0,0 +1,71 @@ +#!/bin/sh + +BIB_FILE="${HOME}/latex/uni.bib" +[ -f "${BIB_FILE}" ] || BIB_FILE="${2:-$(find "${HOME}" -path "${HOME}/.*" \ + -prune -o -type "f" -name "*.bib" -print -quit)}" + +{ [ -f "${BIB_FILE}" ] || [ "${2}" ]; } || { + printf "%s\n" "Create a .bib file or provide as \$2." && exit "1" +} + +filter() { + sed -n -E 's/.*((DOI|doi)((\.(org))?\/?|:? *))([^: ]+[^ .]).*/\6/p; T; q' +} + +fpdf() { + pdf="${1}" + doi="$(pdfinfo "${pdf}" 2> "/dev/null" | filter)" + + [ "${doi}" ] || doi="$(pdftotext -q -l "2" "${pdf}" - 2> "/dev/null" | filter)" + + [ "${doi}" ] || printf "%s\n" "No DOI found for PDF: ${pdf}" >&2 + + printf "%s\n" "${doi}" +} + +arrange() { + sed 's/\}, /\},\n /g + s/, /,\n / + s/ }/\n}/ + s/,\s*pages=/,\n\tpages=/' | + sed '1s/^ *// + 1s/[0-9]*\([0-9]\{2\}\)/\1/ + 1s/_// + 1s/.*/\L&/ + s/.*=/\L&/ + s/=/ = /' +} + +doi2bib() { + doi="${1#doi:}" + url="https://api.crossref.org/works/${doi}/transform/application/x-bibtex" + entry="$(curl -kLsS --no-fail "${url}" | arrange)" + red='\033[0;31m' + reset='\033[0m' + + printf "${red}%s${reset}\n" "${entry}" + + [ "${entry%"${entry#?}"}" != "@" ] && { + printf "%s\n" "Failed to fetch bibtex entry for DOI: ${doi}" + return "1" + } + + rg -iFq "doi = {${doi}}" "${BIB_FILE}" 2> "/dev/null" && { + printf "%s\n" "Bibtex entry for DOI: ${doi} already exists in the file." + } || { + [ -s "${BIB_FILE}" ] && printf "\n" >> "${BIB_FILE}" + printf "%s\n" "${entry}" >> "${BIB_FILE}" + printf "%s\n" "Added bibtex entry for DOI: ${doi}" + } +} + +[ "${1}" ] || { + printf "%s\n" "Give either a pdf file or a DOI or a directory path that has PDFs as an argument." + exit "1" +} + +[ -f "${1}" ] && doi="$(fpdf "${1}")" && doi2bib "${doi}" && exit "0" + +[ -d "${1}" ] && for i in "${1}"/*.pdf; do doi="$(fpdf "${i}")" && doi2bib "${doi}"; done && exit "0" + +doi="$(printf "%s\n" "${1}" | filter)" && doi2bib "${doi}" diff --git a/.local/bin/getcomproot b/.local/bin/getcomproot new file mode 100755 index 0000000..dbee348 --- /dev/null +++ b/.local/bin/getcomproot @@ -0,0 +1,9 @@ +#!/bin/sh + +# A helper script for LaTeX/groff files used by `compiler` and `opout`. +# The user can add the root file of a larger project as a comment as below: +# % root = mainfile.tex +# And the compiler script will run on that instead of the opened file. + +texroot="$(sed -n 's/^\s*%.*root\s*=\s*\(\S\+\).*/\1/p' "${1}")" +[ -f "${texroot}" ] && readlink -f "${texroot}" || exit "1" diff --git a/.local/bin/ifinstalled b/.local/bin/ifinstalled new file mode 100755 index 0000000..c192eba --- /dev/null +++ b/.local/bin/ifinstalled @@ -0,0 +1,12 @@ +#!/bin/sh + +# Some optional functions in LARBS require programs not installed by default. I +# use this little script to check to see if a command exists and if it doesn't +# it informs the user that they need that command to continue. This is used in +# various other scripts for clarity's sake. + +for x in "$@"; do + if ! which "$x" >/dev/null 2>&1 && ! pacman -Qq "$x" >/dev/null 2>&1; then + notify-send "๐ฆ $x" "must be installed for this function." && exit 1 ; + fi +done diff --git a/.local/bin/linkhandler b/.local/bin/linkhandler new file mode 100755 index 0000000..cb12bf9 --- /dev/null +++ b/.local/bin/linkhandler @@ -0,0 +1,32 @@ +#!/bin/sh + +# Feed script a url or file location. +# If an image, it will view in swayimg, +# if a video or gif, it will view in mpv +# if a music file or pdf, it will download, +# otherwise it opens link in browser. + +if [ -z "$1" ]; then + url="$(wl-paste)" +else + url="$1" +fi + +# Check if the URL is from inv.nadeko.net and adjust it for YouTube +echo "$url" | rg -q 'inv.nadeko.net/watch' +if [ $? -eq 0 ]; then + url="https://www.youtube.com/watch?v=$(echo "$url" | sed 's/.*inv\.nadeko\.net\/watch?v=\([^&]*\)/\1/')" +fi + +case "$url" in + *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtube.com/v/*|*youtube.com/shorts*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*) + setsid -f mpv -quiet "$url" >/dev/null 2>&1 ;; + *png|*jpg|*jpe|*jpeg|*gif|*webp) + curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && swayimg "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; + *pdf|*cbz|*cbr) + curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; + *mp3|*flac|*opus|*mp3?source*) + qndl "$url" 'curl -LO' >/dev/null 2>&1 ;; + *) + [ -f "$url" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$url" >/dev/null 2>&1 || setsid -f "$BROWSER" "$url" >/dev/null 2>&1 +esac diff --git a/.local/bin/maimpick b/.local/bin/maimpick new file mode 100755 index 0000000..29cf327 --- /dev/null +++ b/.local/bin/maimpick @@ -0,0 +1,37 @@ +#!/bin/sh + +# This is bound to Shift+PrintScreen by default, requires grim (also optionally tesseract and swappy). It lets you +# choose the kind of screenshot to take, including copying the image or even +# highlighting an area to copy. + +# variables +output="$(date '+%y%m%d-%H%M-%S').png" +wclip_cmd="wl-copy -t image/png" +ocr_cmd="wl-copy" + +get_active_window() { + hyprctl -j activewindow | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' +} + +case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)\\na selected area (swappy)\\ncurrent window (swappy)\\nfull screen (swappy)\\ncopy selected image to text" | mew -l 10 -i -p "Screenshot which area?")" in + "a selected area") geometry=$(slurp) && sleep 0.2 && grim -g "$geometry" pic-selected-"${output}" && notify-send "๐ธ maimpick" "Screenshot saved as pic-selected-$output." ;; + "current window") + geometry=$(get_active_window) + sleep 0.2 + grim -g "$geometry" pic-window-"${output}" && notify-send "๐ธ maimpick" "Screenshot saved as pic-window-$output." ;; + "full screen") geometry=$(slurp -o) && sleep 0.2 && grim -g "$geometry" pic-full-"${output}" && notify-send "๐ธ maimpick" "Screenshot saved as pic-full-$output." ;; + "a selected area (copy)") geometry=$(slurp) && sleep 0.2 && grim -g "$geometry" - | ${wclip_cmd} && notify-send "๐ธ maimpick" "Selected area screenshot copied to clipboard." ;; + "current window (copy)") + geometry=$(get_active_window) + sleep 0.2 + grim -g "$geometry" - | ${wclip_cmd} && notify-send "๐ธ maimpick" "Window screenshot copied to clipboard." ;; + "full screen (copy)") geometry=$(slurp -o) && sleep 0.2 && grim -g "$geometry" - | ${wclip_cmd} && notify-send "๐ธ maimpick" "Full screen screenshot copied to clipboard.";; + "a selected area (swappy)") geometry=$(slurp) && sleep 0.2 && grim -g "$geometry" - | swappy -f - ;; + "current window (swappy)") + geometry=$(get_active_window) + sleep 0.2 + grim -g "$geometry" - | swappy -f - ;; + "full screen (swappy)") geometry=$(slurp -o) && sleep 0.2 && grim -g "$geometry" - | swappy -f - ;; + "copy selected image to text") tmpfile=$(mktemp /tmp/ocr-XXXXXX.png) && slurp | grim -g - - > "$tmpfile" && tesseract "$tmpfile" - -l eng | ${ocr_cmd} && rm "$tmpfile" && notify-send "๐ธ maimpick" "Detected text copied to clipboard.\n$(wl-paste)" ;; + *) notify-send "๐ธ maimpick" "Wrong option." +esac diff --git a/.local/bin/mounter b/.local/bin/mounter new file mode 100755 index 0000000..6d65c2c --- /dev/null +++ b/.local/bin/mounter @@ -0,0 +1,114 @@ +#!/bin/bash + +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="$(rg "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="$(doas lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")" +# Get all LUKS drives +allluks="$(echo "$lsblkoutput" | rg 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 mew: +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"| rg -v crypto_LUKS | rg '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 mew and get user choice. +chosen="$(echo "$alldrives" | mew -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 | mew -i -p "Mount this drive where?")" + test -n "$mp" + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | mew -i -p "$mp does not exist. Create it?") + [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || doas_askpass mkdir -p "$mp") + fi +} + +attemptmount(){ + # Attempt to mount without a mountpoint, to see if drive is in fstab. + doas 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" | rg "$chosen" | awk '{print $NF}' | tr -d '[:space:]\r\n')" + attemptmount || getmount + case "${parttype##* }" in + vfat) doas mount -t vfat "$chosen" "$mp" -o rw,umask=0000 ;; + btrfs) doas mount "$chosen" "$mp" ;; + ntfs) doas mount -t ntfs3 "$chosen" "$mp" ;; + *) doas 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} -a termfloat -e doas cryptsetup open "$chosen" "usb$num" + # Check if now decrypted. + test -b "/dev/mapper/usb$num" + + attemptmount || getmount + doas mount "/dev/mapper/usb$num" "$mp" + 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. + doas_askpass simple-mtpfs -o allow_other -o fsname="simple-mtpfs-$(escape "$chosen")" --device "$number" "$mp" + notify-send "๐ค Android Mounted." "Android device mounted to $mp." + ;; +esac diff --git a/.local/bin/noisereduce b/.local/bin/noisereduce new file mode 100755 index 0000000..13f2a0d --- /dev/null +++ b/.local/bin/noisereduce @@ -0,0 +1,81 @@ +#!/usr/bin/sh + +usage () +{ + printf "Usage : noisereduce <input video file> <output video file>\n" + exit +} + +# Tests for requirements +ifinstalled ffmpeg || { echo >&2 "We require 'ffmpeg' but it's not installed."; exit 1; } +ifinstalled sox || { echo >&2 "We require 'ffmpeg' but it's not installed."; exit 1; } + +if [ "$#" -ne 2 ] +then + usage +fi + +if [ ! -e "$1" ] +then + printf "File not found: %s\n" "$1" + exit +fi + +if [ -e "$2" ] +then + printf "File %s already exists, overwrite? [y/N]\n: " "$2" + read -r yn + case $yn in + [Yy]* ) ;; + * ) exit;; + esac +fi + +inBasename=$(basename "$1") +inExt="${inBasename##*.}" + +isVideoStr=$(ffprobe -v warning -show_streams "$1" | rg codec_type=video) +if [ -n "$isVideoStr" ] +then + isVideo=1 + printf "Detected %s as a video file\n" "$inBasename" +else + isVideo=0 + printf "Detected %s as an audio file\n" "$inBasename" +fi + +printf "Sample noise start time [00:00:00]: " +read -r sampleStart +if [ -z "$sampleStart" ] ; then sampleStart="00:00:00"; fi +printf "Sample noise end time [00:00:00.900]: " +read -r sampleEnd +if [ -z "$sampleEnd" ] ; then sampleEnd="00:00:00.900"; fi +printf "Noise reduction amount [0.21]: " +read -r sensitivity +if [ -z "$sensitivity" ] ; then sensitivity="0.21"; fi + + +tmpVidFile="/tmp/noiseclean_tmpvid.$inExt" +tmpAudFile="/tmp/noiseclean_tmpaud.wav" +noiseAudFile="/tmp/noiseclean_noiseaud.wav" +noiseProfFile="/tmp/noiseclean_noise.prof" +tmpAudCleanFile="/tmp/noiseclean_tmpaud-clean.wav" + +printf "Cleaning noise on %s...\n" "$1" + +if [ $isVideo -eq "1" ]; then + ffmpeg -v warning -y -i "$1" -qscale:v 0 -vcodec copy -an "$tmpVidFile" + ffmpeg -v warning -y -i "$1" -qscale:a 0 "$tmpAudFile" +else + cp "$1" "$tmpAudFile" +fi +ffmpeg -v warning -y -i "$1" -vn -ss "$sampleStart" -t "$sampleEnd" "$noiseAudFile" +sox "$noiseAudFile" -n noiseprof "$noiseProfFile" +sox "$tmpAudFile" "$tmpAudCleanFile" noisered "$noiseProfFile" "$sensitivity" +if [ $isVideo -eq "1" ]; then + ffmpeg -v warning -y -i "$tmpAudCleanFile" -i "$tmpVidFile" -vcodec copy -qscale:v 0 -qscale:a 0 "$2" +else + cp "$tmpAudCleanFile" "$2" +fi + +printf "Done" diff --git a/.local/bin/opout b/.local/bin/opout new file mode 100755 index 0000000..d2b447a --- /dev/null +++ b/.local/bin/opout @@ -0,0 +1,13 @@ +#!/bin/sh + +# opout: "open output": A general handler for opening a file's intended output, +# usually the pdf of a compiled document. I find this useful especially +# running from vim. + +basename="${1%.*}" + +case "${*}" in + *.tex|*.sil|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) target="$(getcomproot "$1" || echo "$1")" ; setsid -f xdg-open "${target%.*}".pdf >/dev/null 2>&1 ;; + *.html) setsid -f "$BROWSER" "$basename".html >/dev/null 2>&1 ;; + *.sent) setsid -f sent "$1" >/dev/null 2>&1 ;; +esac diff --git a/.local/bin/pauseallmpv b/.local/bin/pauseallmpv new file mode 100755 index 0000000..d69a414 --- /dev/null +++ b/.local/bin/pauseallmpv @@ -0,0 +1,10 @@ +#!/bin/sh + +# You might notice all mpv commands are aliased to have this input-ipc-server +# thing. That's just for this particular command, which allows us to pause +# every single one of them with one command! This is bound to super + shift + p +# (with other things) by default and is used in some other places. + +for i in $(ls /tmp/mpvSockets/*); do + echo '{ "command": ["set_property", "pause", true] }' | socat - "$i"; +done diff --git a/.local/bin/peertubetorrent b/.local/bin/peertubetorrent new file mode 100755 index 0000000..6821a40 --- /dev/null +++ b/.local/bin/peertubetorrent @@ -0,0 +1,9 @@ +#!/bin/sh +# torrent peertube videos, requires the transadd script +# first argument is the video link, second is the quality (360, 480 or 1080) +# 13/07/20 - Arthur Bais + +instance=$(echo "$1" | sed "s|/w.\+||") +vidid=$(echo "$1" | sed "s|.\+/||") +link=$(curl -s "$instance/api/v1/videos/$vidid" | rg -o "$instance/download/torrents/.\{37\}$2.torrent") +transadd "$link" diff --git a/.local/bin/podentr b/.local/bin/podentr new file mode 100755 index 0000000..9454b07 --- /dev/null +++ b/.local/bin/podentr @@ -0,0 +1,7 @@ +#!/bin/sh + +# entr command to run `queueandnotify` when newsboat queue is changed + +[ "$(pgrep -x "$(basename "$0")" | wc -l)" -gt 2 ] && exit + +echo "${XDG_DATA_HOME:-$HOME/.local/share}"/newsboat/queue | entr -p queueandnotify 2>/dev/null diff --git a/.local/bin/portal b/.local/bin/portal new file mode 100755 index 0000000..b0afa23 --- /dev/null +++ b/.local/bin/portal @@ -0,0 +1,5 @@ +#!/bin/sh +sleep 1 +killall xdg-desktop-portal-wlr +killall xdg-desktop-portal +/lib/xdg-desktop-portal-wlr & diff --git a/.local/bin/qndl b/.local/bin/qndl new file mode 100755 index 0000000..48bc61e --- /dev/null +++ b/.local/bin/qndl @@ -0,0 +1,12 @@ +#!/bin/sh + +# $1 is a url; $2 is a command +[ -z "$1" ] && exit +base="$(basename "$1")" +notify-send "โณ Queuing $base..." +cmd="$2" +[ -z "$cmd" ] && cmd="yt-dlp --embed-metadata -ic" +idnum="$(tsp $cmd "$1")" +realname="$(echo "$base" | sed "s/?\(source\|dest\).*//;s/%20/ /g")" +tsp -D "$idnum" mv "$base" "$realname" +tsp -D "$idnum" notify-send "๐ $realname done." diff --git a/.local/bin/queueandnotify b/.local/bin/queueandnotify new file mode 100755 index 0000000..1c3025c --- /dev/null +++ b/.local/bin/queueandnotify @@ -0,0 +1,14 @@ +#!/bin/sh + +# Podboat sucks. This script replaces it. +# It reads the newsboat queue, queuing downloads with taskspooler. +# It also removes the junk from extensions. +queuefile="${XDG_DATA_HOME:-$HOME/.local/share}/newsboat/queue" + +while read -r line; do + [ -z "$line" ] && continue + url="${line%%[ ]*}" + qndl "$url" "curl -LO" +done < "$queuefile" + +echo > "$queuefile" diff --git a/.local/bin/randombg b/.local/bin/randombg new file mode 100755 index 0000000..6e386ef --- /dev/null +++ b/.local/bin/randombg @@ -0,0 +1,21 @@ +#!/bin/sh +killall swaybg +PIDFILE="/tmp/randombg.pid" +# Check if the PID file exists and if the process is running +if [ -e "$PIDFILE" ] && kill -0 "$(bat "$PIDFILE")"; then + echo "Another instance of the script is already running." + kill -9 "$(bat $PIDFILE)" # Forcefully kill the old process +fi +echo $$ > "$PIDFILE" +trap 'rm -f "$PIDFILE"; exit' INT TERM EXIT + +swaybg -i $(fd . /mnt/ssd/papes -t f | shuf -n1) -m fill & +OLD_PID=$! +while true; do + sleep 300 + swaybg -i $(fd . /mnt/ssd/papes -t f | shuf -n1) -m fill & + NEXT_PID=$! + sleep 5 + kill $OLD_PID + OLD_PID=$NEXT_PID +done diff --git a/.local/bin/rssadd b/.local/bin/rssadd new file mode 100755 index 0000000..13a525f --- /dev/null +++ b/.local/bin/rssadd @@ -0,0 +1,18 @@ +#!/bin/sh + +if echo "$1" | rg -q "https*://\S\+\.[A-Za-z]\+\S*" ; then + url="$1" +else + url="$(rg -Eom1 '<[^>]+(rel="self"|application/[a-z]+\+xml)[^>]+>' "$1" | + rg -o "https?://[^\" ]")" + + echo "$url" | rg -q "https*://\S\+\.[A-Za-z]\+\S*" || + notify-send "That doesn't look like a full URL." && exit 1 +fi + +RSSFILE="${XDG_CONFIG_HOME:-$HOME/.config}/newsboat/urls" +if awk '{print $1}' "$RSSFILE" | rg "^$url$" >/dev/null; then + notify-send "You already have this RSS feed." +else + echo "$url" >> "$RSSFILE" && notify-send "RSS feed added." +fi diff --git a/.local/bin/rssget b/.local/bin/rssget new file mode 100755 index 0000000..45064b7 --- /dev/null +++ b/.local/bin/rssget @@ -0,0 +1,115 @@ +#!/bin/bash + +# Searches the website for RSS feeds and adds them to newsboat url list. Can +# also find hidden RSS feeds on various websites, namely Youtube, Reddit, +# Vimeo, Github, Gitlab and Medium. Gets site url as $1 or (if not present) +# from X clipboard. Gets tags as $2. If it finds more than one feed, calls +# mew for the user to choose which one to add. I have bound it to a keyboard +# shortcut so i copy a site link and easily add its feed to the reader. + +# Inspired by and based on the logic of this extension: +# https://github.com/shevabam/get-rss-feed-url-extension + +# This script requires rssadd to add feeds to the list. + +getlink () { + local url="$1" + feeds="$(curl -s "$url" | rg -x '.*type=.*(rss|rdf|atom).*' | sed 's/ //g')" + url="$(echo $url | sed 's|^\(https://[^/]*/\).*|\1|')" + + for rsspath in $feeds; do + rsspath="$(echo $rsspath | sed -n "s|.*href=['\"]\([^'\"]*\)['\"].*|\1|p")" + if echo "$rsspath" | rg "http" > /dev/null; then + link="$rsspath" + elif echo "$rsspath" | rg "^/" > /dev/null; then + link="$url$(echo $rsspath | sed 's|^/||')" + else + link="$url$rsspath" + fi + echo $link + done +} + +getRedditRss() { + echo "${1%/}.rss" +} + +getYoutubeRss() { + local url="$1" + path=$(echo "$url" | sed -e 's|^http[s]*://||') + case "$path" in + *"/channel/"*) channel_id="$(echo $path | sed -r 's|.*channel/([^/]*).*|\1|')" && feed="https://www.youtube.com/feeds/videos.xml?channel_id=${channel_id}" ;; + *"/c/"*|*"/user/"*) + feed=$(wget -q "$url" -O tmp_rssget_yt \ + && sed -n 's|.*\("rssUrl":"[^"]*\).*|\1|; p' tmp_rssget_yt \ + | rg rssUrl \ + | sed 's|"rssUrl":"||') ;; + esac + echo "$feed" +} + +getVimeoRss() { + local url="$1" + if echo "$url" | rg -q "/videos$"; then + feed_url=$(echo "$url" | sed 's/\/videos$//' | sed 's/\/$/\/rss/') + else + feed_url="${url}/videos/rss" + fi + echo "$feed_url" +} + +getGithubRss () { + local url="${1%/}" + if echo $url | rg "github.com/[^/]*/[a-zA-Z0-9].*" >/dev/null ; then + echo "${url}/commits.atom" + echo "${url}/releases.atom" + echo "${url}/tags.atom" + elif echo $url | rg "github.com/[^/]*(/)" >/dev/null ; then + echo "${url}.atom" + fi +} + +getGitlabRss () { + local url="${1%/}" + echo "${url}.atom" +} + +getMediumRss () { + echo $1 | sed 's|/tag/|/feed/|' +} + + +if [ -n "$1" ] ; then + url="$1" +else + url="$(wl-paste)" + [ -z "$url" ] && echo "usage: $0 url 'tag1 tag2 tag3'" && exit 1 +fi + +declare -a list=() + +yt_regex="^(http(s)?://)?((w){3}\.)?(youtube\.com|invidio\.us|invidious\.flokinet\.to|invidious\.materialio\.us|iv\.datura\.network|invidious\.perennialte\.ch|invidious\.fdn\.fr|invidious\.private\.coffee|invidious\.protokolla\.fi|invidious\.privacyredirect\.com|yt\.artemislena\.eu|yt\.drgnz\.club|invidious\.incogniweb\.net|yewtu\.be|inv\.tux\.pizza|invidious\.reallyaweso\.me|iv\.melmac\.space|inv\.us\.projectsegfau\.lt|inv\.nadeko\.net|invidious\.darkness\.services|invidious\.jing\.rocks|invidious\.privacydev\.net|inv\.in\.projectsegfau\.lt|invidious\.drgns\.space)/(channel|user|c).+" +reddit_regex="^(http(s)?://)?((w){3}\.)?reddit\.com.*" +vimeo_regex="^(http(s)?://)?((w){3}.)?vimeo\.com.*" +if echo $url | rg -x "$yt_regex" >/dev/null ; then + list="$(getYoutubeRss "$url")" +elif echo $url | rg -x "$reddit_regex" >/dev/null ; then + list="$(getRedditRss "$url")" +# vimeo actually works with getlink +elif echo $url | rg "$vimeo_regex" >/dev/null ; then + list="$(getVimeoRss "$url")" +elif echo $url | rg "github.com" >/dev/null ; then + list="$(getGithubRss "$url")" +# gitlab also works with getlink +elif echo $url | rg "gitlab.com/[a-zA-Z0-9].*" >/dev/null ; then + list="$(getGitlabRss "$url")" +elif echo $url | rg "medium.com/tag" >/dev/null ; then + list="$(getMediumRss "$url")" +else + list="$(getlink "$url")" +fi + +[ "$(echo "$list" | wc -l)" -eq 1 ] && chosen_link="$list" || chosen_link=$(printf '%s\n' "${list[@]}" | mew -p "Choose a feed:") +tags="$2" +ifinstalled rssadd && rssadd "$chosen_link" "$tags" +echo "$chosen_link" "$tags" diff --git a/.local/bin/sd b/.local/bin/sd new file mode 100755 index 0000000..6ac08a6 --- /dev/null +++ b/.local/bin/sd @@ -0,0 +1,22 @@ +#!/bin/sh + +# Open a terminal window in the same directory as the currently active window. + +windowPID=$(hyprctl activewindow | rg -oP '^\s*pid:\s*\K.*\S.*') +PIDlist=$(pstree -lpATna "$windowPID" | sed -En 's/.*,([0-9]+).*/\1/p' | tac) +for PID in $PIDlist; do + cmdline=$(ps -o args= -p "$PID") + process_group_leader=$(ps -o comm= -p "$(ps -o pgid= -p "$PID" | tr -d ' ')") + cwd=$(readlink /proc/"$PID"/cwd) + # zsh and yazi won't be ignored even if it shows ~ or / + case "$cmdline" in + 'Yazi') continue ;; + "${SHELL##*/}"|'yazi'|'yazi '*) break ;; + esac + # git (and its sub-processes) will show the root of a repository instead of the actual cwd, so they're ignored + [ "$process_group_leader" = 'git' ] || [ ! -d "$cwd" ] && continue + # This is to ignore programs that show ~ or / instead of the actual working directory + [ "$cwd" != "$HOME" ] && [ "$cwd" != '/' ] && break +done +[ "$PWD" != "$cwd" ] && [ -d "$cwd" ] && { cd "$cwd" || exit 1; } +"$TERMINAL" diff --git a/.local/bin/setbg b/.local/bin/setbg new file mode 100755 index 0000000..e6d4d01 --- /dev/null +++ b/.local/bin/setbg @@ -0,0 +1,42 @@ +#!/bin/sh + +# This script does the following: +# Run by itself, set the wallpaper (at X start). +# If given a file, set that as the new wallpaper. +# If given a directory, choose random file in it. +# If wal is installed, also generates a colorscheme. + +# Location of link to wallpaper link. +bgloc="${XDG_DATA_HOME:-$HOME/.local/share}/bg" + +# Configuration files of applications that have their themes changed by pywal. +dunstconf="${XDG_CONFIG_HOME:-$HOME/.config}/dunst/dunstrc" +zathuraconf="${XDG_CONFIG_HOME:-$HOME/.config}/zathura/zathurarc" + +# Give -s as parameter to make notifications silent. +while getopts "s" o; do case "${o}" in + s) silent='1' ;; +esac done + +shift $((OPTIND - 1)) + +trueloc="$(readlink -f "$1")" && +case "$(file --mime-type -b "$trueloc")" in + image/* ) ln -sf "$trueloc" "$bgloc" && [ -z "$silent" ] && notify-send -i "$bgloc" "Changing wallpaper..." ;; + inode/directory ) ln -sf "$(find "$trueloc" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" && [ -z "$silent" ] && notify-send -i "$bgloc" "Random Wallpaper chosen." ;; + *) [ -z "$silent" ] && notify-send "๐ผ๏ธ Error" "Not a valid image or directory." ; exit 1;; +esac + +# If pywal is installed, use it. +if command -v wal >/dev/null 2>&1 ; then + wal -n -i "$(readlink -f $bgloc)" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 +# If pywal is removed, return config files to normal. +else + [ -f "$dunstconf.bak" ] && unlink "$dunstconf" && mv "$dunstconf.bak" "$dunstconf" + [ -f "$zathuraconf.bak" ] && unlink "$zathuraconf" && mv "$zathuraconf.bak" "$zathuraconf" +fi + +killall swaybg +swaybg -i "$bgloc" -m fill & +# If running, dwm hit the key to refresh the color scheme. +# pidof dwm >/dev/null && xdotool key super+F5 diff --git a/.local/bin/shortcuts b/.local/bin/shortcuts new file mode 100755 index 0000000..bc2fb9e --- /dev/null +++ b/.local/bin/shortcuts @@ -0,0 +1,59 @@ +#!/bin/sh + +bmdirs="${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs" +bmfiles="${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-files" + +# Output locations. Unactivated progs should go to /dev/null. +shell_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc" +shell_env_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutenvrc" +zsh_named_dirs="${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc" +lf_shortcuts="/dev/null" +vim_shortcuts="/dev/null" +qute_shortcuts="/dev/null" +fish_shortcuts="/dev/null" +vifm_shortcuts="/dev/null" +yazi_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/yazi/keymap.toml" + +# Remove, prepare files +rm -f "$lf_shortcuts" "$qute_shortcuts" "$zsh_named_dirs" "$vim_shortcuts" "$yazi_shortcuts" 2>/dev/null +printf "# vim: filetype=sh\\n" > "$fish_shortcuts" +printf "# vim: filetype=sh\\nalias " > "$shell_shortcuts" +printf "# vim: filetype=sh\\n" > "$shell_env_shortcuts" +printf "\" vim: filetype=vim\\n" > "$vifm_shortcuts" + +# Format the `directories` file in the correct syntax and sent it to all three configs. +eval "echo \"$(bat "$bmdirs")\"" | \ +awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\"); + printf(\"%s=\42cd %s && ls -A\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ; + printf(\"[ -n \42%s\42 ] && export %s=\42%s\42 \n\",\$1,\$1,\$2) >> \"$shell_env_shortcuts\" ; + printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ; + printf(\"abbr %s \42cd %s; and ls -A\42\n\",\$1,\$2) >> \"$fish_shortcuts\" ; + printf(\"map g%s :cd %s<CR>\nmap t%s <tab>:cd %s<CR><tab>\nmap M%s <tab>:cd %s<CR><tab>:mo<CR>\nmap Y%s <tab>:cd %s<CR><tab>:co<CR> \n\",\$1,\$2, \$1, \$2, \$1, \$2, \$1, \$2) >> \"$vifm_shortcuts\" ; + printf(\"config.bind(';%s', \42set downloads.location.directory %s ;; hint links download\42) \n\",\$1,\$2) >> \"$qute_shortcuts\" ; + printf(\"map C%s cd \42%s\42 \n\",\$1,\$2) >> \"$lf_shortcuts\" ; + printf(\"cmap ;%s %s\n\",\$1,\$2) >> \"$vim_shortcuts\" ; + split(\$1, a, \"\") + chars = \"\" + for (i = 1; i <= length(a); i++) { + chars = chars sprintf(\"\\\"%s\\\"\", a[i]) + if (i < length(a)) chars = chars \", \" + } + printf(\"[[mgr.prepend_keymap]]\\non = [\\\"g\\\", %s]\\nrun = \\\"cd %s\\\"\\n\\n\", chars, \$2) >> \"$yazi_shortcuts\" }" + +# Format the `files` file in the correct syntax and sent it to both configs. +eval "echo \"$(bat "$bmfiles")\"" | \ +awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\"); + printf(\"%s=\42\$EDITOR %s\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ; + printf(\"[ -n \42%s\42 ] && export %s=\42%s\42 \n\",\$1,\$1,\$2) >> \"$shell_env_shortcuts\" ; + printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ; + printf(\"abbr %s \42\$EDITOR %s\42 \n\",\$1,\$2) >> \"$fish_shortcuts\" ; + printf(\"map %s :e %s<CR> \n\",\$1,\$2) >> \"$vifm_shortcuts\" ; + printf(\"map E%s \$\$EDITOR \42%s\42 \n\",\$1,\$2) >> \"$lf_shortcuts\" ; + printf(\"cmap ;%s %s\n\",\$1,\$2) >> \"$vim_shortcuts\" ; + split(\$1, a, \"\") + chars = \"\" + for (i = 1; i <= length(a); i++) { + chars = chars sprintf(\"\\\"%s\\\"\", a[i]) + if (i < length(a)) chars = chars \", \" + } + printf(\"[[mgr.prepend_keymap]]\\non = [\\\"e\\\", %s]\\nrun = 'shell --block \\\"\$EDITOR %s\\\"'\\n\\n\", chars, \$2) >> \"$yazi_shortcuts\" }" diff --git a/.local/bin/singboxwrap b/.local/bin/singboxwrap new file mode 100755 index 0000000..e52db36 --- /dev/null +++ b/.local/bin/singboxwrap @@ -0,0 +1,32 @@ +#!/bin/sh + +config_dir="/mnt/ssd/settings/sing-box" +default_path="${XDG_DATA_HOME:-$HOME/.local/share}/singboxcfg" + +input=$1 + +run_singbox () { + sing-box check -c "$1" && { + pidof sing-box >/dev/null && killall sing-box + setsid -f sing-box -c "$1" run + if [ "$input" = menu ]; then + notify-send "sing-box with $(readlink "$1") is running now" + fi + } || notify-send "Config check has failed. Check your configuration at $(readlink $1)" & exit 1 +} + +choose_menu () { + choose="$(fd . $config_dir -d 1 -t f | mew -p "Config to use")" + [ -n "$choose" ] || exit 1 + ln -sf "$choose" "$default_path" + echo "$default_path" +} + +if [ ! -f "$default_path" ]; then + input="menu" +fi + +case $input in + menu) run_singbox $(choose_menu) ;; + *) run_singbox $default_path ;; +esac diff --git a/.local/bin/slider b/.local/bin/slider new file mode 100755 index 0000000..a7615f7 --- /dev/null +++ b/.local/bin/slider @@ -0,0 +1,126 @@ +#!/bin/sh + +# Give a file with images and timecodes and creates a video slideshow of them. +# +# Timecodes must be in format 00:00:00. +# +# Imagemagick and ffmpeg required. + +# Application cache if not stated elsewhere. +cache="${XDG_CACHE_HOME:-$HOME/.cache}/slider" + +while getopts "hvrpi:c:a:o:d:f:t:e:x:s:" o; do case "${o}" in + c) bgc="$OPTARG" ;; + t) fgc="$OPTARG" ;; + f) font="$OPTARG" ;; + i) file="$OPTARG" ;; + a) audio="$OPTARG" ;; + o) outfile="$OPTARG" ;; + d) prepdir="$OPTARG" ;; + r) redo="$OPTARG" ;; + s) ppt="$OPTARG" ;; + e) endtime="$OPTARG" ;; + x) res="$OPTARG" + echo "$res" | rg -qv "^[0-9]\+x[0-9]\+$" && + echo "Resolution must be dimensions separated by a 'x': 1280x720, etc." && + exit 1 ;; + p) echo "Purge old build files in $cache? [y/N]" + read -r confirm + echo "$confirm" | rg -iq "^y$" && rm -rf "$cache" && echo "Done." + exit ;; + v) verbose=True ;; + *) echo "$(basename "$0") usage: + -i input timecode list (required) + -a audio file + -c color of background (use html names, black is default) + -t text color for text slides (white is default) + -s text font size for text slides (150 is default) + -f text font for text slides (sans serif is default) + -o output video file + -e if no audio given, the time in seconds that the last slide will be shown (5 is default) + -x resolution (1920x1080 is default) + -d tmp directory + -r rerun imagemagick commands even if done previously (in case files or background has changed) + -p purge old build files instead of running + -v be verbose" && exit 1 + +esac done + +# Check that the input file looks like it should. +{ head -n 1 "$file" 2>/dev/null | rg -q "^00:00:00 " ;} || { + echo "Give an input file with -i." && + echo "The file should look as this example: + +00:00:00 first_image.jpg +00:00:03 otherdirectory/next_image.jpg +00:00:09 this_image_starts_at_9_seconds.jpg +etc... + +Timecodes and filenames must be separated by Tabs." && + exit 1 + } + +if [ -n "${audio+x}" ]; then + # Check that the audio file looks like an actual audio file. + case "$(file --dereference --brief --mime-type -- "$audio")" in + audio/*) ;; + *) echo "That doesn't look like an audio file."; exit 1 ;; + esac + totseconds="$(date '+%s' -d $(ffmpeg -i "$audio" 2>&1 | awk '/Duration/ {print $2}' | sed s/,//))" +fi + +prepdir="${prepdir:-$cache/$file}" +outfile="${outfile:-$file.mp4}" +prepfile="$prepdir/$file.prep" + +[ -n "${verbose+x}" ] && echo "Preparing images... May take a while depending on the number of files." +mkdir -p "$prepdir" + +{ +while read -r x; +do + # Get the time from the first column. + time="${x%% *}" + seconds="$(date '+%s' -d "$time")" + # Duration is not used on the first looped item. + duration="$((seconds - prevseconds))" + + # Get the filename/text content from the rest. + content="${x#* }" + base="$(basename "$content")" + base="${base%.*}.jpg" + + if [ -f "$content" ]; then + # If images have already been made in a previous run, do not recreate + # them unless -r was given. + { [ ! -f "$prepdir/$base" ] || [ -n "${redo+x}" ] ;} && + magick -size "${res:-1920x1080}" canvas:"${bgc:-black}" -gravity center "$content" -resize 1920x1080 -composite "$prepdir/$base" + else + { [ ! -f "$prepdir/$base" ] || [ -n "${redo+x}" ] ;} && + magick -size "${res:-1920x1080}" -background "${bgc:-black}" -fill "${fgc:-white}" -font "${font:-Sans}" -pointsize "${ppt:-150}" -gravity center label:"$content" "$prepdir/$base" + fi + + # If the first line, do not write yet. + [ "$time" = "00:00:00" ] || echo "file '$prevbase' +duration $duration" + + # Keep the information required for the next file. + prevbase="$base" + prevtime="$time" + prevseconds="$(date '+%s' -d "$prevtime")" +done < "$file" +# Do last file which must be given twice as follows +endtime="$((totseconds-seconds))" +echo "file '$base' +duration ${endtime:-5} +file '$base'" +} > "$prepfile" +if [ -n "${audio+x}" ]; then + ffmpeg -hide_banner -y -f concat -safe 0 -i "$prepfile" -i "$audio" -c:a aac -vsync vfr -c:v libx264 -pix_fmt yuv420p "$outfile" +else + ffmpeg -hide_banner -y -f concat -safe 0 -i "$prepfile" -vsync vfr -c:v libx264 -pix_fmt yuv420p "$outfile" +fi + +# Might also try: +# -vf "fps=${fps:-24},format=yuv420p" "$outfile" +# but has given some problems. diff --git a/.local/bin/start-pipewire b/.local/bin/start-pipewire new file mode 100755 index 0000000..63fc043 --- /dev/null +++ b/.local/bin/start-pipewire @@ -0,0 +1,5 @@ +#!/bin/sh +killall pipewire +killall pipewire-pulse +killall wireplumber +setsid -f pipewire diff --git a/.local/bin/statusbar/sb-battery b/.local/bin/statusbar/sb-battery new file mode 100755 index 0000000..0e25e72 --- /dev/null +++ b/.local/bin/statusbar/sb-battery @@ -0,0 +1,37 @@ +#!/bin/sh + +# Prints all batteries, their percentage remaining and an emoji corresponding +# to charge status (๐ for plugged up, ๐ for discharging on battery, etc.). + +case $BLOCK_BUTTON in + 3) notify-send "๐ Battery module" "๐: discharging + ๐: not charging + โป: stagnant charge + ๐: charging + โก: charged + โ: battery very low! + - Scroll to change adjust xbacklight." ;; + 4) xbacklight -inc 10 ;; + 5) xbacklight -dec 10 ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +# Loop through all attached batteries and format the info +for battery in /sys/class/power_supply/BAT?*; do + # If non-first battery, print a space separator. + [ -n "${capacity+x}" ] && printf " " + # Sets up the status and capacity + case "$(bat "$battery/status" 2>&1)" in + "Full") status="โก" ;; + "Discharging") status="๐" ;; + "Charging") status="๐" ;; + "Not charging") status="๐" ;; + "Unknown") status="โป๏ธ" ;; + *) exit 1 ;; + esac + capacity="$(bat "$battery/capacity" 2>&1)" + # Will make a warn variable if discharging and low + [ "$status" = "๐" ] && [ "$capacity" -le 25 ] && warn="โ" + # Prints the info + printf "%s%s%d%%" "$status" "$warn" "$capacity"; unset warn +done && printf "\\n" diff --git a/.local/bin/statusbar/sb-brightness b/.local/bin/statusbar/sb-brightness new file mode 100755 index 0000000..30fe76b --- /dev/null +++ b/.local/bin/statusbar/sb-brightness @@ -0,0 +1,23 @@ +#!/bin/sh + +# current brightness +curr_brightness=$(bat /sys/class/backlight/*/brightness) + +# max_brightness +max_brightness=$(bat /sys/class/backlight/*/max_brightness) + +# brightness percentage +brightness_per=$((100 * curr_brightness / max_brightness)) + +case $BLOCK_BUTTON in + 1) + ;; + 3) + notify-send "๐ก Brightness module" "\- Shows current brightness level โ๏ธ." + ;; + 8) + setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 + ;; +esac + +echo "๐ก ${brightness_per}%" diff --git a/.local/bin/statusbar/sb-clock b/.local/bin/statusbar/sb-clock new file mode 100755 index 0000000..d23af8d --- /dev/null +++ b/.local/bin/statusbar/sb-clock @@ -0,0 +1,29 @@ +#!/bin/sh + +clock=$(date '+%I') + +case "$clock" in + "00") icon="๐" ;; + "01") icon="๐" ;; + "02") icon="๐" ;; + "03") icon="๐" ;; + "04") icon="๐" ;; + "05") icon="๐" ;; + "06") icon="๐" ;; + "07") icon="๐" ;; + "08") icon="๐" ;; + "09") icon="๐" ;; + "10") icon="๐" ;; + "11") icon="๐" ;; + "12") icon="๐" ;; +esac + +case $BLOCK_BUTTON in + 1) notify-send "This Month" "$(cal | sed "s/\<$(date +'%e'|tr -d ' ')\>/<b><span color='red'>&<\/span><\/b>/")" && notify-send "Appointments" "$(calcurse -d3)" ;; + 2) setsid -f "$TERMINAL" -e calcurse >/dev/null 2>&1 ;; + 3) notify-send "๐
Time/date module" "\- Left click to show upcoming appointments for the next three days via \`calcurse -d3\` and show the month via \`cal\` +- Middle click opens calcurse if installed" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +date "+%Y %b %d (%a) $icon%H:%M" diff --git a/.local/bin/statusbar/sb-cpu b/.local/bin/statusbar/sb-cpu new file mode 100755 index 0000000..e9c9cae --- /dev/null +++ b/.local/bin/statusbar/sb-cpu @@ -0,0 +1,12 @@ +#!/bin/sh + +case $BLOCK_BUTTON in + 1) notify-send "๐ฅ CPU hogs" "$(ps axch -o cmd,%cpu | awk '{cmd[$1]+=$2} END {for (i in cmd) print i, cmd[i]}' | sort -nrk2 | head)\\n(100% per core)" ;; + 2) setsid -f "$TERMINAL" -e btop >/dev/null 2>&1 ;; + 3) notify-send "๐ฅ CPU module " "\- Shows CPU temperature. +- Click to show intensive processes. +- Middle click to open btop." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +sensors | awk '/Core 0/ {print "๐ก" $3}' diff --git a/.local/bin/statusbar/sb-cpubars b/.local/bin/statusbar/sb-cpubars new file mode 100755 index 0000000..a0d5dce --- /dev/null +++ b/.local/bin/statusbar/sb-cpubars @@ -0,0 +1,44 @@ +#!/bin/sh + +# Module showing CPU load as a changing bars. +# Just like in polybar. +# Each bar represents amount of load on one core since +# last run. + +# Cache in tmpfs to improve speed and reduce SSD load +cache=/tmp/cpubarscache + +case $BLOCK_BUTTON in + 2) setsid -f "$TERMINAL" -e btop >/dev/null 2>&1 ;; + 3) notify-send "๐ชจ CPU load module" "Each bar represents +one CPU core";; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +# id total idle +stats=$(awk '/cpu[0-9]+/ {printf "%d %d %d\n", substr($1,4), ($2 + $3 + $4 + $5), $5 }' /proc/stat) +[ ! -f $cache ] && echo "$stats" > "$cache" +old=$(bat "$cache") +printf "๐ชจ" +echo "$stats" | while read -r row; do + id=${row%% *} + rest=${row#* } + total=${rest%% *} + idle=${rest##* } + + case "$(echo "$old" | awk '{if ($1 == id) + printf "%d\n", (1 - (idle - $3) / (total - $2))*100 /12.5}' \ + id="$id" total="$total" idle="$idle")" in + + "0") printf "โ";; + "1") printf "โ";; + "2") printf "โ";; + "3") printf "โ";; + "4") printf "โ
";; + "5") printf "โ";; + "6") printf "โ";; + "7") printf "โ";; + "8") printf "โ";; + esac +done; printf "\\n" +echo "$stats" > "$cache" diff --git a/.local/bin/statusbar/sb-disk b/.local/bin/statusbar/sb-disk new file mode 100755 index 0000000..adfa0e3 --- /dev/null +++ b/.local/bin/statusbar/sb-disk @@ -0,0 +1,23 @@ +#!/bin/sh + +# Status bar module for disk space +# $1 should be drive mountpoint, otherwise assumed /. + +location=${1:-/} + +[ -d "$location" ] || exit + +case $BLOCK_BUTTON in + 1) notify-send "๐ฝ Disk space" "$(df -h --output=target,used,size)" ;; + 3) notify-send "๐ฝ Disk module" "\- Shows used hard drive space. +- Click to show all disk info." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +case "$location" in + "/home"* ) icon="๐ " ;; + "/mnt"* ) icon="๐พ" ;; + *) icon="๐ฅ";; +esac + +printf "%s: %s\n" "$icon" "$(df -h "$location" | awk ' /[0-9]/ {print $3 "/" $2}')" diff --git a/.local/bin/statusbar/sb-doppler b/.local/bin/statusbar/sb-doppler new file mode 100755 index 0000000..1930752 --- /dev/null +++ b/.local/bin/statusbar/sb-doppler @@ -0,0 +1,241 @@ +#!/bin/sh + +# Show a Doppler RADAR of a user's preferred location. + +secs=600 # Download a new doppler radar if one hasn't been downloaded in $secs seconds. +radarloc="${XDG_CACHE_HOME:-$HOME/.cache}/radar" +doppler="${XDG_CACHE_HOME:-$HOME/.cache}/doppler.gif" + +pickloc() { chosen="$(echo "US: CONUS: Continental United States +US: Northeast +US: Southeast +US: PacNorthWest +US: PacSouthWest +US: UpperMissVly +US: SouthMissVly +US: SouthPlains +US: NorthRockies +US: SouthRockies +US: Alaska +US: Carib +US: Hawaii +US: CentGrLakes +US: Conus-Large +US: KABR: Aberdeen, SD +US: KBIS: Bismarck, ND +US: KFTG: Denver/Boulder, CO +US: KDMX: Des Moines, IA +US: KDTX: Detroit, MI +US: KDDC: Dodge City, KS +US: KDLH: Duluth, MN +US: KCYS: Cheyenne, WY +US: KLOT: Chicago, IL +US: KGLD: Goodland, KS +US: KUEX: Hastings, NE +US: KGJX: Grand Junction, CO +US: KGRR: Grand Rapids, MI +US: KMVX: Fargo/Grand Forks, ND +US: KGRB: Green Bay, WI +US: KIND: Indianapolis, IN +US: KJKL: Jackson, KY +US: KARX: La Crosse, WI +US: KILX: Lincoln/Central Illinois, IL +US: KLVX: Louisville, KY +US: KMQT: Marquette +US: KMKX: Milwaukee, WI +US: KMPX: Minneapolis, MN +US: KAPX: Gaylord/Alpena, MI +US: KLNX: North Platte, NE +US: KIWX: N. Webster/Northern, IN +US: KOAX: Omaha, NE +US: KPAH: Paducah, KY +US: KEAX: Pleasant Hill, MO +US: KPUX: Pueblo, CO +US: KDVN: Quad Cities, IA +US: KUDX: Rapid City, SD +US: KRIW: Riverton, WY +US: KSGF: Springfield, MO +US: KLSX: St. LOUIS, MO +US: KFSD: Sioux Falls, SD +US: KTWX: Topeka, KS +US: KICT: Wichita, KS +US: KVWX: Paducah, KY +US: ICAO: Responsible Wfo +US: KLTX: WILMINGTON, NC +US: KCCX: State College/Central, PA +US: KLWX: Sterling, VA +US: KFCX: Blacksburg/Roanoke, VA +US: KRAX: Raleigh/Durham, NC +US: KGYX: Portland, ME +US: KDIX: Mt Holly/Philadelphia, PA +US: KPBZ: Pittsburgh, PA +US: KAKQ: Wakefield, VA +US: KMHX: Morehead City, NC +US: KGSP: Greer/Greenville/Sprtbg, SC +US: KILN: Wilmington/Cincinnati, OH +US: KCLE: Cleveland, OH +US: KCAE: Columbia, SC +US: KBGM: Binghamton, NY +US: KENX: Albany, NY +US: KBUF: Buffalo, NY +US: KCXX: Burlington, VT +US: KCBW: Caribou, ME +US: KBOX: Boston /Taunton, MA +US: KOKX: New York City, NY +US: KCLX: Charleston, SC +US: KRLX: Charleston, WV +US: ICAO: Responsible WFO +US: KBRO: Brownsville, TX +US: KABX: Albuquerque, NM +US: KAMA: Amarillo, TX +US: KFFC: Peachtree City/Atlanta, GA +US: KEWX: Austin/Sanantonio, TX +US: KBMX: Birmingham, AL +US: KCRP: Corpus Christi, TX +US: KFWS: Dallas / Ft. Worth, TX +US: KEPZ: El Paso, TX +US: KHGX: Houston/ Galveston, TX +US: KJAX: Jacksonville, FL +US: KBYX: Key West, FL +US: KMRX: Morristown/knoxville, TN +US: KLBB: Lubbock, TX +US: KLZK: Little Rock, AR +US: KLCH: Lake Charles, LA +US: KOHX: Nashville, TN +US: KMLB: Melbourne, FL +US: KNQA: Memphis, TN +US: KAMX: Miami, FL +US: KMAF: Midland/odessa, TX +US: KTLX: Norman, OK +US: KHTX: Huntsville, AL +US: KMOB: Mobile, AL +US: KTLH: Tallahassee, FL +US: KTBW: Tampa Bay Area, FL +US: KSJT: San Angelo, TX +US: KINX: Tulsa, OK +US: KSRX: Tulsa, OK +US: KLIX: New Orleans/slidell, LA +US: KDGX: Jackson, MS +US: KSHV: Shreveport, LA +US: ICAO: Responsible WFO +US: KLGX: Seattle / Tacoma, WA +US: KOTX: Spokane, WA +US: KEMX: Tucson, AZ +US: KYUX: Phoenix, AZ +US: KNKX: San Diego, CA +US: KMUX: Monterey/san Francisco, CA +US: KHNX: San Joaquin/hanford, CA +US: KSOX: San Diego, CA +US: KATX: Seattle / Tacoma, WA +US: KIWA: Phoenix, AZ +US: KRTX: Portland, OR +US: KSFX: Pocatello, ID +US: KRGX: Reno, NV +US: KDAX: Sacramento, CA +US: KMTX: Salt Lake City, UT +US: KPDT: Pendleton, OR +US: KMSX: Missoula, MT +US: KESX: Las Vegas, NV +US: KVTX: Los Angeles, CA +US: KMAX: Medford, OR +US: KFSX: Flagstaff, AZ +US: KGGW: Glasgow, MT +US: KLRX: Elko, NV +US: KBHX: Eureka, CA +US: KTFX: Great Falls, MT +US: KCBX: Boise, ID +US: KBLX: Billings, MT +US: KICX: Salt Lake City, UT +US: ICAO: Responsible Wfo W/ MSCF +US: PABC: Anchorage, AK +US: PAPD: Fairbanks, AK +US: PHKM: Honolulu, HI +US: PAHG: Anchorage, AK +US: PAKC: Anchorage, AK +US: PAIH: Anchorage, AK +US: PHMO: Honolulu, HI +US: PAEC: Fairbanks, AK +US: TJUA: San Juan, PR +US: PACG: Juneau, AK +US: PHKI: Honolulu, HI +US: PHWA: Honolulu, HI +US: ICAO: Responsible Wfo W/ MSCF +US: KFDR: Norman, OK +US: PGUA: Guam +US: KBBX: Sacramento, CA +US: KFDX: Albuquerque, NM +US: KGWX: Jackson, MS +US: KDOX: Wakefield, VA +US: KDYX: San Angelo, TX +US: KEYX: Las Vegas, NV +US: KEVX: Mobile, AL +US: KHPX: Paducah, KY +US: KTYX: Burlington, VT +US: KGRK: Dallas / Ft. Worth, TX +US: KPOE: Lake Charles, LA +US: KEOX: Tallahassee, FL +US: KHDX: El Paso, TX +US: KDFX: San Antonio, TX +US: KMXX: Birmingham, AL +US: KMBX: Bismarck, ND +US: KVAX: Jacksonville, FL +US: KJGX: Peachtree City/atlanta, GA +US: KVNX: Norman, OK +US: KVBX: Vandenberg Afb: Orcutt, CA +DE: BAW: Baden-Wรผrttemberg +DE: BAY: Bavaria +DE: BBB: Berlin +DE: BBB: Brandenburg +DE: HES: Hesse +DE: MVP: Mecklenburg-Western Pomerania +DE: NIB: Lower Saxony +DE: NIB: Bremen +DE: NRW: North Rhine-Westphalia +DE: RPS: Rhineland-Palatinate +DE: RPS: Saarland +DE: SAC: Saxony +DE: SAA: Saxony-Anhalt +DE: SHH: Schleswig-Holstein +DE: SHH: Hamburg +DE: THU: Thuringia +NL: The Netherlands +RU: Russian Federation" | mew -i -l 50 -p "Select a radar to use as default:")" + +# Ensure user did not escape. +[ -z "$chosen" ] && exit 1 + +# Set country code and radar code. +countrycode=${chosen%%:*} +radarcode=${chosen#* } radarcode=${radarcode%:*} + +# Print codes to $radarloc file. + printf "%s,%s\\n" "$countrycode" "$radarcode" > "$radarloc" ;} + +getdoppler() { + country=$(cut -c -2 "$radarloc") + province=$(cut -c 4- "$radarloc") + notify-send "๐ฆ๏ธ Doppler RADAR" "Pulling most recent Doppler RADAR for $province." + case "$country" in + "US") province="$(echo "$province" | tr "[:lower:]" "[:upper:]")" + curl -sL "https://radar.weather.gov/ridge/standard/${province}_loop.gif" > "$doppler" ;; + "DE") province="$(echo "$province" | tr "[:upper:]" "[:lower:]")" + curl -sL "https://www.dwd.de/DWD/wetter/radar/radfilm_${province}_akt.gif" > "$doppler" ;; + "NL") curl -sL "https://cdn.knmi.nl/knmi/map/general/weather-map.gif" > "$doppler" ;; + "RU") curl -sL "https://meteoinfo.ru/hmc-output/rmap/phenomena.gif" > "$doppler" ;; + esac +} + +showdoppler() { setsid -f mpv --no-osc --loop=inf --no-terminal "$doppler" >/dev/null 2>&1 ;} + +case $BLOCK_BUTTON in + 1) [ ! -f "$radarloc" ] && pickloc && getdoppler + [ $(($(date '+%s') - $(stat -c %Y "$doppler"))) -gt "$secs" ] && getdoppler + showdoppler ;; + 2) pickloc && getdoppler && showdoppler ;; + 3) notify-send "๐บ๏ธ Doppler RADAR module" "\- Left click for local Doppler RADAR. +- Middle click to update RADAR location. +After $secs seconds, new clicks will also automatically update the doppler RADAR." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +echo ๐
diff --git a/.local/bin/statusbar/sb-forecast b/.local/bin/statusbar/sb-forecast new file mode 100755 index 0000000..eb07dfe --- /dev/null +++ b/.local/bin/statusbar/sb-forecast @@ -0,0 +1,65 @@ +#!/bin/sh + +# Displays today's precipication chance (โ), and daily low (๐ฅถ) and high (๐). +# Usually intended for the statusbar. + +url="${WTTRURL:-wttr.in}" +weatherreport="${XDG_CACHE_HOME:-$HOME/.cache}/weatherreport" + +# Get a weather report from 'wttr.in' and save it locally. +getforecast() { { rg -q -m1 '^up$' /sys/class/net/w*/operstate || rg -q -m1 '^up$' /sys/class/net/e*/operstate; } && + curl -sf "$url/$LOCATION" --output "$weatherreport" && touch "$weatherreport" +} + +# Forecast should be updated only once a day. +checkforecast() { + [ "$(stat -c %y "$weatherreport" 2>/dev/null | + cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] +} + +getprecipchance() { + echo "$weatherdata" | sed '16q;d' | # Extract line 16 from file + rg -wo "[0-9]*%" | # Find a sequence of digits followed by '%' + sort -rn | # Sort in descending order + head -1q # Extract first line +} + +getdailyhighlow() { + echo "$weatherdata" | sed '13q;d' | # Extract line 13 from file + rg -o "m[-+]?[0-9]+" | # Find temperatures in the format "m<signed number>" + sed 's/[+m]//g' | # Remove '+' and 'm' + sort -g | # Sort in ascending order + sed -e 1b -e '$!d' # Extract the first and last lines +} + +readfile() { weatherdata="$(bat "$weatherreport")" ;} + +showweather() { + readfile + # shellcheck disable=SC2046,SC2183 + printf "โ%s โ๏ธ%sยฐ ๐%sยฐ\n" "$(getprecipchance)" $(getdailyhighlow) +} + +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e less -Sf "$weatherreport" >/dev/null 2>&1 ;; + 2) getforecast && showweather ;; + 3) notify-send "๐ Weather module" "\- Left click for full forecast. +- Middle click to update forecast. +โ: Chance of rain/snow +โ๏ธ: Daily low +๐: Daily high" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +# shellcheck disable=SC2015 +checkforecast && showweather || + ( flock -n 9 && + ( tries=0; while [ $tries -ne 100 ]; do + getforecast && break || + { tries=$((tries+1)); sleep .1; } + done + ! checkforecast && + until getforecast; do sleep 60; done + pkill -RTMIN+5 "${STATUSBAR:-waybar}" + ) & + echo ) 9>"${XDG_RUNTIME_DIR}/sb-forecast.lock" diff --git a/.local/bin/statusbar/sb-internet b/.local/bin/statusbar/sb-internet new file mode 100755 index 0000000..2c7fd96 --- /dev/null +++ b/.local/bin/statusbar/sb-internet @@ -0,0 +1,35 @@ +#!/bin/sh + +# Show wifi ๐ถ and percent strength or ๐ก if none. +# Show ๐ if connected to ethernet or โ if none. +# Show ๐ if a vpn connection is active + +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e nmtui >/dev/null 2>&1 ; pkill -RTMIN+4 waybar ;; + 3) notify-send "๐ Internet module" "\- Click to connect +โ: wifi disabled +๐ก: no wifi connection +๐ถ: wifi connection with quality +โ: no ethernet +๐: ethernet working +๐งญ: vpn is active (routing) +๐: vpn is active + " ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +# Wifi +if [ "$(bat /sys/class/net/w*/operstate 2>/dev/null)" = 'up' ] ; then + wifiicon="$(awk '/^\s*w/ { print "๐ถ", int($3 * 100 / 70) "% " }' /proc/net/wireless)" +elif [ "$(bat /sys/class/net/w*/operstate 2>/dev/null)" = 'down' ] ; then + [ "$(bat /sys/class/net/w*/flags 2>/dev/null)" = '0x1003' ] && wifiicon="๐ก " || wifiicon="โ " +fi + +# Ethernet +[ "$(bat /sys/class/net/e*/operstate 2>/dev/null)" = 'up' ] && ethericon="๐" || ethericon="โ" + +# TUN +[ -n "$(bat /sys/class/net/tun*/operstate 2>/dev/null)" ] && tunicon=" ๐" +[ -n "$(bat /sys/class/net/route*/operstate 2>/dev/null)" ] && tunicon=" ๐งญ" + +printf "%s%s%s\n" "$wifiicon" "$ethericon" "$tunicon" diff --git a/.local/bin/statusbar/sb-iplocate b/.local/bin/statusbar/sb-iplocate new file mode 100755 index 0000000..83a37e9 --- /dev/null +++ b/.local/bin/statusbar/sb-iplocate @@ -0,0 +1,15 @@ +#!/bin/sh + +# Gets your public ip address checks which country you are in and +# displays that information in the statusbar +# +# https://www.maketecheasier.com/ip-address-geolocation-lookups-linux/ + +set -e + +ifinstalled "geoip" +addr="$(geoiplookup "$(curl -sfm 1 ifconfig.me 2>/dev/null)")" +name="${addr##*, }" +flag="$(rg "flag: $name" "${XDG_DATA_HOME:-$HOME/.local/share}/larbs/emoji")" +flag="${flag%% *}" +printf "%s %s\\n" "$flag" "$name" diff --git a/.local/bin/statusbar/sb-kbselect b/.local/bin/statusbar/sb-kbselect new file mode 100755 index 0000000..f4d3e9e --- /dev/null +++ b/.local/bin/statusbar/sb-kbselect @@ -0,0 +1,26 @@ +#!/bin/sh +# works on any init system +# requirements: mew + +kbquery() +{ + kblayout=$(swaymsg --raw -t get_inputs | jq -r '.[] | select(.type == "keyboard") | .xkb_active_layout_name' | sort -u) || exit 1 + kblayout=$(echo "$kblayout" | sed 's/(/\\(/g; s/)/\\)/g') || exit 1 + kblayout=$(rg -oP "^\s*\K\w+(?=\s+$kblayout)" /usr/share/X11/xkb/rules/base.lst) || exit 1 + echo $kblayout +} + +kb=$(kbquery) + +case $BLOCK_BUTTON in + 1) kb_choice="$(awk '/! layout/{flag=1; next} /! variant/{flag=0} flag {print $2, "- " $1}' /usr/share/X11/xkb/rules/base.lst | mew -l 15)" + [ -z "$kb_choice" ] && exit 0 + kb="$(echo "$kb_choice" | awk '{print $3}')" + swaymsg input "type:keyboard" xkb_layout "$kb" >/dev/null 2>&1 + pkill -RTMIN+30 "${STATUSBAR:-waybar}";; + 3) notify-send "โจ Keyboard/language module" "$(printf "%s" "\- Current layout: $(kbquery)") +- Left click to change keyboard.";; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +echo "$kb" diff --git a/.local/bin/statusbar/sb-mailbox b/.local/bin/statusbar/sb-mailbox new file mode 100755 index 0000000..13ded2b --- /dev/null +++ b/.local/bin/statusbar/sb-mailbox @@ -0,0 +1,24 @@ +#!/bin/sh + +# Displays number of unread mail and an loading icon if updating. +# When clicked, brings up `neomutt`. + +case $BLOCK_BUTTON in + 1) setsid -w -f "$TERMINAL" -e neomutt ; pkill -RTMIN+12 "${STATUSBAR:-waybar}" ;; + 2) setsid -f mailup >/dev/null && exit ;; + 3) notify-send "๐ฌ Mail module" "\- Shows unread mail +- Shows ๐ if syncing mail +- Left click opens neomutt +- Middle click syncs mail" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +unread="$(fd . "${XDG_DATA_HOME:-$HOME/.local/share}"/mail/*/[Ii][Nn][Bb][Oo][Xx]/new/ -t f | wc -l 2>/dev/null)" + +icon=$(bat /tmp/mailupdate 2>/dev/null) + +if [ "$unread" -eq 0 ]; then + [ -n "$icon" ] && echo "๐ฌ$icon" || exit 0 +else + echo "๐ฌ$unread$icon" +fi diff --git a/.local/bin/statusbar/sb-memory b/.local/bin/statusbar/sb-memory new file mode 100755 index 0000000..a37f1ca --- /dev/null +++ b/.local/bin/statusbar/sb-memory @@ -0,0 +1,12 @@ +#!/bin/sh + +case $BLOCK_BUTTON in + 1) notify-send "๐ง Memory hogs" "$(ps axch -o cmd,%mem | awk '{cmd[$1]+=$2} END {for (i in cmd) print i, cmd[i]}' | sort -nrk2 | head)" ;; + 2) setsid -f "$TERMINAL" -e btop >/dev/null 2>&1 ;; + 3) notify-send "๐ง Memory module" "\- Shows Memory Used/Total. +- Click to show memory hogs. +- Middle click to open btop." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +free --mebi | sed -n '2{p;q}' | awk '{printf ("๐ง %sMB\n", ($3))}' diff --git a/.local/bin/statusbar/sb-microphone b/.local/bin/statusbar/sb-microphone new file mode 100755 index 0000000..fc1c07a --- /dev/null +++ b/.local/bin/statusbar/sb-microphone @@ -0,0 +1,39 @@ +#!/bin/sh + +# Prints the current microphone volume or ๏ฑ if muted. + +case $BLOCK_BUTTON in + 1) setsid -w -f "$TERMINAL" -e pulsemixer; pkill -RTMIN+23 "${STATUSBAR:-waybar}" ;; + 2) wpctl set-mute @DEFAULT_SOURCE@ toggle ;; + 4) wpctl set-volume @DEFAULT_SOURCE@ 1%+ ;; + 5) wpctl set-volume @DEFAULT_SOURCE@ 1%- ;; + 3) notify-send "๐ค Microphone volume module" "\- Shows volume ๐๏ธ, ๏ฑ if muted. +- Middle click to mute. +- Scroll to change." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +vol="$(wpctl get-volume @DEFAULT_AUDIO_SOURCE@)" + +# If muted, print ๏ฑ and exit. +[ "$vol" != "${vol%\[MUTED\]}" ] && echo ๏ฑ && exit + +vol="${vol#Volume: }" + +split() { + # For ommiting the . without calling and external program. + IFS=$2 + set -- $1 + printf '%s' "$@" +} + +vol="$(printf "%.0f" "$(split "$vol" ".")")" + +case 1 in + $((vol >= 70)) ) icon="๐๏ธ" ;; + $((vol >= 30)) ) icon="๐๏ธ" ;; + $((vol >= 1)) ) icon="๐๏ธ" ;; + * ) echo ๏ฑ && exit ;; +esac + +echo "$icon$vol%" diff --git a/.local/bin/statusbar/sb-moonphase b/.local/bin/statusbar/sb-moonphase new file mode 100755 index 0000000..f91a751 --- /dev/null +++ b/.local/bin/statusbar/sb-moonphase @@ -0,0 +1,37 @@ +#!/bin/sh + +# Shows the current moon phase. + +moonfile="${XDG_DATA_HOME:-$HOME/.local/share}/moonphase" + +[ -s "$moonfile" ] && [ "$(stat -c %y "$moonfile" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] || + { curl -sf "wttr.in/?format=%m" > "$moonfile" || exit 1 ;} + +icon="$(bat "$moonfile")" + +case "$icon" in + ๐) name="New" ;; + ๐) name="Waxing Crescent" ;; + ๐) name="First Quarter" ;; + ๐) name="Waxing Gibbous" ;; + ๐) name="Full" ;; + ๐) name="Waning Gibbous" ;; + ๐) name="Last Quarter" ;; + ๐) name="Waning Crescent" ;; + *) exit 1 ;; +esac + +echo "${icon-?}" + +case $BLOCK_BUTTON in + 3) notify-send "๐ Moon phase module" "Displays current moon phase. +- ๐: New +- ๐: Waxing Crescent +- ๐: First Quarter +- ๐: Waxing Gibbous +- ๐: Full +- ๐: Waning Gibbous +- ๐: Last Quarter +- ๐: Waning Crescent" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac diff --git a/.local/bin/statusbar/sb-mpdup b/.local/bin/statusbar/sb-mpdup new file mode 100755 index 0000000..42bd737 --- /dev/null +++ b/.local/bin/statusbar/sb-mpdup @@ -0,0 +1,8 @@ +#!/bin/sh + +# This loop will update the mpd statusbar module whenever a command changes the +# music player's status. mpd must be running on X's start for this to work. + +while : ; do + mpc idle >/dev/null && kill -45 "$(pidof "waybar")" || break +done diff --git a/.local/bin/statusbar/sb-music b/.local/bin/statusbar/sb-music new file mode 100755 index 0000000..8b0ae77 --- /dev/null +++ b/.local/bin/statusbar/sb-music @@ -0,0 +1,19 @@ +#!/bin/sh + +filter() { sed "/^volume:/d;s/\\[paused\\].*/โธ/g;/\\[playing\\].*/d;/^ERROR/Q" | paste -sd ' ' -;} + +pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 & + +case $BLOCK_BUTTON in + 1) mpc status | filter ; setsid -f "$TERMINAL" -e rmpc >/dev/null 2>&1 < /dev/null;; # right click, pause/unpause + 2) mpc toggle | filter ;; # right click, pause/unpause + 3) mpc status | filter ; notify-send "๐ต Music module" "\- Shows mpd song playing. +- โธ when paused. +- Left click opens rmpc. +- Middle click pauses. +- Scroll changes track.";; # right click, pause/unpause + 4) mpc prev | filter ;; # scroll up, previous + 5) mpc next | filter ;; # scroll down, next + 8) mpc status | filter ; setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 < /dev/null ;; + *) mpc status | filter ;; +esac diff --git a/.local/bin/statusbar/sb-nettraf b/.local/bin/statusbar/sb-nettraf new file mode 100755 index 0000000..8921123 --- /dev/null +++ b/.local/bin/statusbar/sb-nettraf @@ -0,0 +1,28 @@ +#!/bin/sh + +# Module showing network traffic. Shows how much data has been received (RX) or +# transmitted (TX) since the previous time this script ran. So if run every +# second, gives network traffic per second. + +case $BLOCK_BUTTON in + 3) notify-send "๐ Network traffic module" "๐ป: Traffic received +๐บ: Traffic transmitted" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +update() { + sum=0 + for arg; do + read -r i < "$arg" + sum=$(( sum + i )) + done + cache=/tmp/${1##*/} + [ -f "$cache" ] && read -r old < "$cache" || old=0 + printf %d\\n "$sum" > "$cache" + printf %d\\n $(( sum - old )) +} + +rx=$(update /sys/class/net/[ew]*/statistics/rx_bytes) +tx=$(update /sys/class/net/[ew]*/statistics/tx_bytes) + +printf "๐ป%4sB ๐บ%4sB\\n" $(numfmt --to=iec $rx $tx) diff --git a/.local/bin/statusbar/sb-news b/.local/bin/statusbar/sb-news new file mode 100755 index 0000000..440de7c --- /dev/null +++ b/.local/bin/statusbar/sb-news @@ -0,0 +1,17 @@ +#!/bin/sh + +# Displays number of unread news items and an loading icon if updating. +# When clicked, brings up `newsboat`. + +case $BLOCK_BUTTON in + 1) setsid "$TERMINAL" -T newsboat -e newsboat >/dev/null 2>&1 ;; + 2) setsid -f newsup >/dev/null && exit ;; + 3) notify-send "๐ฐ News module" "\- Shows unread news items +- Shows ๐ if updating with \`newsup\` +- Left click opens newsboat +- Middle click syncs RSS feeds +<b>Note:</b> Only one instance of newsboat (including updates) may be running at a time." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + + bat /tmp/newsupdate 2>/dev/null || echo "$(newsboat -x print-unread | awk '{ if($1>0) print "๐ฐ" $1}')$(bat "${XDG_CONFIG_HOME:-$HOME/.config}"/newsboat/.update 2>/dev/null)" diff --git a/.local/bin/statusbar/sb-pacpackages b/.local/bin/statusbar/sb-pacpackages new file mode 100755 index 0000000..08b4235 --- /dev/null +++ b/.local/bin/statusbar/sb-pacpackages @@ -0,0 +1,29 @@ +#!/bin/sh + +# Displays number of upgradeable packages. +# For this to work, have a `pacman -Sy` command run in the background as a +# cronjob every so often as root. This script will then read those packages. +# When clicked, it will run an upgrade via pacman. +# +# Add the following text as a file in /usr/share/libalpm/hooks/statusbar.hook: +# +# [Trigger] +# Operation = Upgrade +# Type = Package +# Target = * +# +# [Action] +# Description = Updating statusbar... +# When = PostTransaction +# Exec = /usr/bin/pkill -RTMIN+8 dwmblocks # Or waybar if using sway/hyprland. + +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e sb-popupgrade >/dev/null 2>&1 ;; + 2) notify-send "$(/usr/bin/pacman -Qu)" ;; + 3) notify-send "๐ Upgrade module" "๐ฆ: number of upgradable packages +- Left click to upgrade packages +- Middle click to show upgradable packages" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +pacman -Qu | rg -Fcv "[ignored]" | sed "s/^/๐ฆ/;s/^๐ฆ0$//g" diff --git a/.local/bin/statusbar/sb-popupgrade b/.local/bin/statusbar/sb-popupgrade new file mode 100755 index 0000000..94279c8 --- /dev/null +++ b/.local/bin/statusbar/sb-popupgrade @@ -0,0 +1,9 @@ +#!/bin/sh + +printf "Beginning upgrade.\\n" + +paru +pkill -RTMIN+8 "${STATUSBAR:-waybar}" + +printf "\\nUpgrade complete.\\nPress <Enter> to exit window.\\n\\n" +read -r _ diff --git a/.local/bin/statusbar/sb-price b/.local/bin/statusbar/sb-price new file mode 100755 index 0000000..d320511 --- /dev/null +++ b/.local/bin/statusbar/sb-price @@ -0,0 +1,59 @@ +#!/bin/sh + +# Usage: +# price <currency-base currency> <name of currency> <icon> <signal> +# price bat-btc "Basic Attention Token" ๐ฆ 24 +# This will give the price of BAT denominated in BTC and will update on +# signal 24. +# When the name of the currency is multi-word, put it in quotes. + +[ -z "$1" ] && exit 1 + +url="${CRYPTOURL:-rate.sx}" +target="${1%%-*}" +denom="${1##*-}" +name="${2:-$1}" +icon="${3:-๐ฐ}" +case "$denom" in + "$target"|usd) denom="usd"; symb="$" ;; + gbp) symb="ยฃ" ;; + eur) symb="โฌ" ;; + rub) symb="โฝ" ;; + btc) symb="๏
" ;; +esac +interval="@14d" # History contained in chart preceded by '@' (7d = 7 days) +dir="${XDG_CACHE_HOME:-$HOME/.cache}/crypto-prices" +pricefile="$dir/$target-$denom" +chartfile="$dir/$target-$denom-chart" +filestat="$(stat -c %y "$pricefile" 2>/dev/null)" + +[ -d "$dir" ] || mkdir -p "$dir" + +updateprice() { curl -sf \ + --fail-early "${denom}.${url}/1${target}" "${denom}.${url}/${target}${interval}" \ + --output "$pricefile" --output "$chartfile" || + rm -f "$pricefile" "$chartfile" ;} + +[ "${filestat%% *}" != "$(date '+%Y-%m-%d')" ] && + updateme="1" + +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e less -Srf "$chartfile" >/dev/null ;; + 2) notify-send -u low "$icon Updating..." "Updating $name price..." ; updateme="1" ; showupdate="1" ;; + 3) uptime="$(date -d "$filestat" '+%D at %T' | sed "s|$(date '+%D')|Today|")" + notify-send "$icon $name module" "\- <b>Exact price: $symb$(bat "$pricefile")</b> +- Left click for chart of changes. +- Middle click to update. +- Shows ๐ if updating prices. +- <b>Last updated: +$uptime</b>" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null ;; +esac + +[ -n "$updateme" ] && + updateprice "$target" && + [ -n "$showupdate" ] && + notify-send "$icon Update complete." "$name price is now +$symb$(bat "$pricefile")" + +[ -f "$pricefile" ] && printf "%s%s%0.2f\n" "$icon" "$symb" "$(bat "$pricefile")" diff --git a/.local/bin/statusbar/sb-tasks b/.local/bin/statusbar/sb-tasks new file mode 100755 index 0000000..14778a2 --- /dev/null +++ b/.local/bin/statusbar/sb-tasks @@ -0,0 +1,20 @@ +#!/bin/sh + +# Originally by Andr3as07 <https://github.com/Andr3as07> +# Some changes by Luke +# Rebuild by Tenyun + +# This block displays the number running background tasks. Requires tsp. + +num=$(tsp -l | awk -v numr=0 -v numq=0 '{if (/running/)numr++; if (/queued/)numq++} END{print numr+numq"("numq")"}') + +# Handle mouse clicks +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e tsp -l >/dev/null 2>&1 ;; + 3) notify-send "Tasks module" "๐ค: number of running/queued background tasks +- Left click opens tsp" ;; # Right click + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +[ "$num" != "0(0)" ] && + echo "๐ค$num" diff --git a/.local/bin/statusbar/sb-ticker b/.local/bin/statusbar/sb-ticker new file mode 100755 index 0000000..5b26160 --- /dev/null +++ b/.local/bin/statusbar/sb-ticker @@ -0,0 +1,49 @@ +#!/bin/bash + +# Usage +# sb-ticker +# Sample output +# ^DJI: 0.09% +# CL=F: -1.88% +# Description +# displays/retrieves the latest percent-change in stock market quotes listed in $XDG_CONFIG_HOME/tickers. +# defaults to S&P 500, Dow Jones Industrial, and the Nasdaq +# +# intended to be used in the statusbar, which will display the first quote price in the output + +url="terminal-stocks.dev" +pricefile="${XDG_CACHE_HOME:-$HOME/.cache}/stock-prices" +tickerfile="${XDG_CONFIG_HOME:-$HOME/.config}/tickers" + +[ -f "$tickerfile" ] && tickers="$(bat "$tickerfile")" || tickers="^GSPC,^DJI,^IXIC"; + +checkprice() { + [ -s "$pricefile" ] && [ "$(stat -c %y "$pricefile" 2>/dev/null | + cut -d':' -f1)" != "$(date '+%Y-%m-%d %H')" ] +} + +getchange() { + mapfile -t changes < <(sed -e 's/ / /g' "$pricefile" | rg -oe '[m-]\+[0-9]\+\.[0-9]\+' | sed 's/[m ]/;/g') + IFS=',' read -ra TICKER <<< "$tickers" + for idx in "${!TICKER[@]}"; do + printf "%s: %s%%\n" "${TICKER[$idx]}" "${changes[$idx]//;/}" + done +} + +updateprice() { curl -sfm 10 "$url/$tickers" --output "$pricefile" || rm -f "$pricefile" ; } + +case $BLOCK_BUTTON in + 1) setsid "$TERMINAL" -e less -Srf "$pricefile" >/dev/null 2>&1 ;; + 2) notify-send -u low "Updating..." "Updating prices" ; updateme="1" ;; + 3) notify-send "Current prices:" "Current stock prices:\n<b>$(getchange)</b> +- Left click to show price file +- Middle click to update stock prices +- Right click to get stock overview" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +[ -n "$updateme" ] && updateprice + +[ -f "$pricefile" ] && getchange + +checkprice && updateprice diff --git a/.local/bin/statusbar/sb-torrent b/.local/bin/statusbar/sb-torrent new file mode 100755 index 0000000..868b3aa --- /dev/null +++ b/.local/bin/statusbar/sb-torrent @@ -0,0 +1,27 @@ +#!/bin/sh + +transmission-remote -l | rg % | + sed " # The letters are for sorting and will not appear. +s/.*Stopped.*/A ๐/; +s/.*Seeding.*/Z ๐ฑ/; +s/.*100%.*/N โ
/; +s/.*Idle.*/B ๐ฐ๏ธ/; +s/.*Uploading.*/L โฌ๏ธ/; +s/.*%.*/M โฌ๏ธ/" | + sort -h | uniq -c | awk '{print $3 $1}' | paste -sd ' ' - + +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e stig >/dev/null 2>&1 ;; + 2) td-toggle ;; + 3) notify-send "๐ฑ Torrent module" "\- Left click to open stig. +- Middle click to toggle transmission. +- Shift click to edit script. +Module shows number of torrents: +๐: paused +๐ฐ: idle (seeds needed) +๐ผ: uploading (unfinished) +๐ฝ: downloading +โ
: done +๐ฑ: done and seeding" ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac diff --git a/.local/bin/statusbar/sb-volume b/.local/bin/statusbar/sb-volume new file mode 100755 index 0000000..6742bf5 --- /dev/null +++ b/.local/bin/statusbar/sb-volume @@ -0,0 +1,39 @@ +#!/bin/sh + +# Prints the current volume or ๐ if muted. + +case $BLOCK_BUTTON in + 1) setsid -w -f "$TERMINAL" -e pulsemixer; pkill -RTMIN+10 "${STATUSBAR:-waybar}" ;; + 2) wpctl set-mute @DEFAULT_SINK@ toggle ;; + 4) wpctl set-volume @DEFAULT_SINK@ 1%+ ;; + 5) wpctl set-volume @DEFAULT_SINK@ 1%- ;; + 3) notify-send "๐ข Volume module" "\- Shows volume ๐, ๐ if muted. +- Middle click to mute. +- Scroll to change." ;; + 8) setsid -f "$TERMINAL" -e "$EDITOR" "$0" >/dev/null 2>&1 ;; +esac + +vol="$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" + +# If muted, print ๐ and exit. +[ "$vol" != "${vol%\[MUTED\]}" ] && echo ๐ && exit + +vol="${vol#Volume: }" + +split() { + # For ommiting the . without calling and external program. + IFS=$2 + set -- $1 + printf '%s' "$@" +} + +vol="$(printf "%.0f" "$(split "$vol" ".")")" + +case 1 in + $((vol >= 70)) ) icon="๐" ;; + $((vol >= 30)) ) icon="๐" ;; + $((vol >= 1)) ) icon="๐" ;; + * ) echo ๐ && exit ;; +esac + +echo "$icon$vol%" diff --git a/.local/bin/sysact b/.local/bin/sysact new file mode 100755 index 0000000..44a3868 --- /dev/null +++ b/.local/bin/sysact @@ -0,0 +1,36 @@ +#!/bin/sh + +# A mew wrapper script for system functions. +export WM="Hyprland" +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%%)*}" +} + +lock(){ + mpc pause + pauseallmpv + wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + kill -44 $(pidof waybar) + swaylock + wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + kill -44 $(pidof waybar) +} + +case "$(printf "๐ lock\n๐ช leave $WM\nโป๏ธ renew $WM\n๐ป hibernate\n๐ reboot\n๐ฅ shutdown\n๐ค sleep\n๐บ display off" | mew -i -p 'Action: ')" in + '๐ lock') lock ;; + "๐ช leave $WM") hyprctl dispatch exit ;; + "โป๏ธ renew $WM") hyprctl reload ;; + '๐ป hibernate') $ctl hibernate -i ;; + '๐ค sleep') $ctl suspend -i ;; + '๐ reboot') $ctl reboot -i ;; + '๐ฅ๏ธshutdown') $ctl poweroff -i ;; + '๐บ display off') xset dpms force off ;; + *) exit 1 ;; +esac diff --git a/.local/bin/tag b/.local/bin/tag new file mode 100755 index 0000000..92d6323 --- /dev/null +++ b/.local/bin/tag @@ -0,0 +1,49 @@ +#!/bin/sh + +err() { echo "Usage: + tag [OPTIONS] file +Options: + -a: artist/author + -t: song/chapter title + -A: album/book title + -n: track/chapter number + -N: total number of tracks/chapters + -d: year of publication + -g: genre + -c: comment +You will be prompted for title, artist, album and track if not given." && exit 1 ;} + +while getopts "a:t:A:n:N:d:g:c:" o; do case "${o}" in + a) artist="${OPTARG}" ;; + t) title="${OPTARG}" ;; + A) album="${OPTARG}" ;; + n) track="${OPTARG}" ;; + N) total="${OPTARG}" ;; + d) date="${OPTARG}" ;; + g) genre="${OPTARG}" ;; + c) comment="${OPTARG}" ;; + *) printf "Invalid option: -%s\\n" "$OPTARG" && err ;; +esac done + +shift $((OPTIND - 1)) + +file="$1" + +temp="$(mktemp -p "$(dirname "$file")")" +trap 'rm -f $temp' HUP INT QUIT TERM PWR EXIT + +[ ! -f "$file" ] && echo 'Provide file to tag.' && err + +[ -z "$title" ] && echo 'Enter a title.' && read -r title +[ -z "$artist" ] && echo 'Enter an artist.' && read -r artist +[ -z "$album" ] && echo 'Enter an album.' && read -r album +[ -z "$track" ] && echo 'Enter a track number.' && read -r track + +cp -f "$file" "$temp" && ffmpeg -i "$temp" -map 0 -y -codec copy \ + -metadata title="$title" \ + -metadata album="$album" \ + -metadata artist="$artist" \ + -metadata track="${track}${total:+/"$total"}" \ + ${date:+-metadata date="$date"} \ + ${genre:+-metadata genre="$genre"} \ + ${comment:+-metadata comment="$comment"} "$file" diff --git a/.local/bin/td-toggle b/.local/bin/td-toggle new file mode 100755 index 0000000..977cc56 --- /dev/null +++ b/.local/bin/td-toggle @@ -0,0 +1,12 @@ +#!/bin/sh + +# If transmission-daemon is running, will ask to kill, else will ask to start. + +if pidof transmission-daemon >/dev/null ; +then + [ "$(printf "No\\nYes" | mew -i -p "Turn off transmission-daemon?")" = "Yes" ] && killall transmission-daemon && notify-send "transmission-daemon disabled." +else + ifinstalled transmission-cli || exit + [ "$(printf "No\\nYes" | mew -i -p "Turn on transmission daemon?")" = "Yes" ] && transmission-daemon && notify-send "transmission-daemon enabled." +fi +sleep 3 && pkill -RTMIN+7 "${STATUSBAR:-waybar}" diff --git a/.local/bin/torwrap b/.local/bin/torwrap new file mode 100755 index 0000000..4bbeb35 --- /dev/null +++ b/.local/bin/torwrap @@ -0,0 +1,7 @@ +#!/bin/sh + +ifinstalled stig transmission-cli || exit 1 + +! pidof transmission-daemon >/dev/null && transmission-daemon && notify-send "Starting torrent daemon..." + +$TERMINAL -e stig; pkill -RTMIN+7 "${STATUSBAR:-waybar}" diff --git a/.local/bin/transadd b/.local/bin/transadd new file mode 100755 index 0000000..ee7e162 --- /dev/null +++ b/.local/bin/transadd @@ -0,0 +1,9 @@ +#!/bin/sh + +# Mimeapp script for adding torrent to transmission-daemon, but will also start the daemon first if not running. + +# transmission-daemon sometimes fails to take remote requests in its first moments, hence the sleep. + +pidof transmission-daemon >/dev/null || (transmission-daemon && notify-send "Starting transmission daemon..." && sleep 3 && pkill -RTMIN+7 "${STATUSBAR:-waybar}") + +transmission-remote -a "$@" && notify-send "๐ฝ Torrent added." diff --git a/.local/bin/unix b/.local/bin/unix new file mode 100755 index 0000000..fd15826 --- /dev/null +++ b/.local/bin/unix @@ -0,0 +1,26 @@ +#!/bin/sh + +#original artwork by http://www.sanderfocus.nl/#/portfolio/tech-heroes +#converted to shell by #nixers @ irc.unix.chat + +bat << 'eof' + [38;5;255m,_ ,_==โโ[0m + [38;5;255m, โโโโโ
โ
[48;5;240mโ
[48;5;20mโ[48;5;240mโ
ยพ[0m. [38;5;199m/ [38;5;20m/[0m + [38;5;255m[48;5;20mโ[0m[38;5;255m[48;5;199mโ[38;5;16m[48;5;255m<ยด [38;5;32m"[38;5;34mยป[38;5;255mโโ[48;5;32mโ[48;5;240m%[0m\ [38;5;199m/ [38;5;20m/ [38;5;45m/ [38;5;118m/[0m + [38;5;255m,[38;5;255m[48;5;240mโ
[38;5;16m[48;5;255m7" [38;5;160mยด[38;5;34m>[38;5;255m[48;5;39mโโ[38;5;199m[48;5;255mโ[0m[38;5;255m% [38;5;20m/ [38;5;118m/ [38;5;199m> [38;5;118m/ [38;5;199m>[38;5;255m/[38;5;45m%[0m + [38;5;255mโ[48;5;240m[38;5;255mยถ[48;5;240m[38;5;255mโ[48;5;255m [38;5;196m,[38;5;34mยป[48;5;201m[38;5;255mโโ[0m[38;5;255mยพยด[0m [38;5;199m/[38;5;255m> %[38;5;199m/[38;5;118m%[38;5;255m/[38;5;199m/ [38;5;45m/ [38;5;199m/[0m + [38;5;255m[48;5;240mโ[48;5;255m[38;5;16mโ[48;5;16m[38;5;255mโ
โ
[38;5;16m[48;5;255mโ
โ,,[38;5;32mโ[38;5;16mโ
[38;5;255m[48;5;16mโ
โ
[38;5;255m[48;5;20mร[0m[38;5;255m\[0m[38;5;20m/[38;5;118m/[38;5;255m /[38;5;118m/[38;5;199m/[38;5;255m>[38;5;45m// [38;5;255m/[38;5;118m>[38;5;199m/ [38;5;20m/[0m + [48;5;20m[38;5;255mV[48;5;255m[38;5;16mโ[48;5;20m[38;5;255mยซ[0m[38;5;255mยผ.;[48;5;240m[38;5;255mโ[48;5;255m[38;5;16m โ[0m[38;5;255m<ยซ.,[48;5;25m[38;5;255m`[48;5;240m=[0m[38;5;20m/[38;5;199m/ [38;5;255m/>[38;5;45m/[38;5;118m/[38;5;255m%/[38;5;199m% / [38;5;20m/[0m + [38;5;20m//[48;5;255m[38;5;16mโ <ยด -ยฒ,)[48;5;16m[38;5;255m(โ[48;5;255m[38;5;16m~"-[38;5;199mโ/[0m[38;5;255mยพ[0m[38;5;199m/ [38;5;118m%[38;5;255m/[38;5;118m>[38;5;45m/ [38;5;118m/[38;5;199m>[0m + [38;5;20m/ / [38;5;118m/ [48;5;20m[38;5;255mโ[48;5;240m[38;5;16m%[48;5;255m -./โโโ[48;5;16m[38;5;255mโ
[48;5;255m[38;5;16mโ[48;5;255m[38;5;16m, [38;5;199m/[48;5;199m[38;5;255m7[0m[38;5;20m/[38;5;199m/[38;5;255m;/[38;5;199m/[38;5;118m% [38;5;20m/ /[0m + [38;5;20m/ [38;5;199m/[38;5;255m/[38;5;45m/[38;5;118m/[38;5;255m[48;5;240m`[48;5;20m[38;5;255mโ[48;5;20m[38;5;255mโ[48;5;255m[38;5;16m %z[0m[38;5;255mWv xX[48;5;20m[38;5;255mโ[48;5;34m[38;5;255mโ[48;5;199m[38;255mโ[0m[38;5;20m/[38;5;199m/[38;5;255m&;[38;5;20m% [38;5;199m/ [38;5;20m/[0m + [38;5;20m/ / [38;5;255m/ [38;5;118m%[38;5;199m/[38;5;255m/%/[48;5;240m[38;5;255mยพ[48;5;255m[38;5;16mยฝยด[38;5;255m[48;5;16mโ[0m[38;5;246mโโ[38;5;255mโโ[38;5;246mโโโ[0m[48;5;16m[38;5;255mโ[38;5;255m[48;5;199mยถ[48;5;20m[38;5;255m\[0m[38;5;20m/[0m[48;5;255m[38;5;240m&[0m [38;5;20m/[0m + [38;5;199m<[38;5;118m/ [38;5;45m/[38;5;255m</[38;5;118m%[38;5;255m/[38;5;45m/[38;5;255m`[48;5;16mโ[48;5;255m[38;5;16m![48;5;240m[38;5;255m%[48;5;16m[38;5;255mโ[0m[38;5;255m%[48;5;240m[38;5;255mโฃ[48;5;240m[38;5;255;โฃ[0m[38;5;255mW[0m[38;5;250mY<Y)[48;5;255m[38;5;16my&[0m[38;5;255m/`[48;5;240m\[0m + [38;5;20m/ [38;5;199m/ [38;5;199m%[38;5;255m/%[38;5;118m/[38;5;45m/[38;5;255m<[38;5;118m/[38;5;199m%[38;5;45m/[38;5;20m/[48;5;240m[38;5;255m\[38;5;16m[48;5;255mi7; โ N[0m[38;5;246m>[38;5;255m)VY>[48;5;240m[38;5;255m7[0m[38;5;255m; [38;5;255m[48;5;240m\[0m[38;5;255m_[0m [38;5;255mUNIX IS VERY SIMPLE [38;5;45mIT JUST NEEDS A[0m + [38;5;20m/ [38;5;255m/[38;5;118m<[38;5;255m/ [38;5;45m/[38;5;255m/<[38;5;199m/[38;5;20m/[38;5;199m/[38;5;20m<[38;5;255m_/%\[38;5;255m[48;5;16mโ[48;5;255m[38;5;16m V[0m[38;5;255m%[48;5;255m[38;5;16mW[0m[38;5;255m%ยฃ)XY[0m [38;5;240m_/%[38;5;255mโพ\_,[0m [38;5;45mGENIUS TO UNDERSTAND ITS SIMPLICITY[38;5;255m[0m + [38;5;199m/ [38;5;255m/ [38;5;199m/[38;5;255m/[38;5;118m%[38;5;199m/[48;5;240m[38;5;255m_,=-[48;5;20m-^[0m[38;5;255m/%/%%[48;5;255m[38;5;16m\ยพ%[0m[38;5;255mยถ[0m[48;5;255m[38;5;16m%[0m[38;5;255m%}[0m [38;5;240m/%%%[38;5;20m%%[38;5;240m%;\,[0m + [38;5;45m%[38;5;20m/[38;5;199m< [38;5;20m/[48;5;20m[38;5;255m_/[48;5;240m [0m[38;5;255m%%%[38;5;240m%%[38;5;20m;[38;5;255mX[38;5;240m%[38;5;20m%[38;5;255m\%[38;5;240m%;, _/%%%;[38;5;20m,[38;5;240m \[0m + [38;5;118m/ [38;5;20m/ [38;5;240m%[38;5;20m%%%%[38;5;240m%;, [38;5;255m\[38;5;240m%[38;5;20m%[38;5;255ml[38;5;240m%%;// _/[38;5;20m%;,[0m [38;5;234mdmr[0m + [38;5;20m/ [38;5;240m%[38;5;20m%%;,[0m [38;5;255m<[38;5;20m;[38;5;240m\-=-/ /[0m + [38;5;20m;,[0m [38;5;240ml[0m +eof diff --git a/.local/bin/unmounter b/.local/bin/unmounter new file mode 100755 index 0000000..fe1d01a --- /dev/null +++ b/.local/bin/unmounter @@ -0,0 +1,25 @@ +#!/bin/sh + +set -e + +mounteddroids="$(rg 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" | mew -i -p "Unmount which drive?")" +chosen="${chosen%% *}" +test -n "$chosen" + +doas umount -l "/${chosen#*/}" +notify-send "Device unmounted." "$chosen has been unmounted." + +# Close the chosen drive if decrypted. +cryptid="$(echo "$lsblkoutput" | rg "/${chosen#*/}$")" +cryptid="${cryptid%% *}" +test -b /dev/mapper/"${cryptid##*/}" +doas_askpass cryptsetup close "$cryptid" +notify-send "๐Device decryption closed." "Drive is now securely locked again." diff --git a/.local/bin/weath b/.local/bin/weath new file mode 100755 index 0000000..ed23534 --- /dev/null +++ b/.local/bin/weath @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Get the weather on the terminal. You can pass an alternative location as a parameter, +# and/or use the 'cp' option to copy the forecast as plaintext to the clipboard. + +report="${XDG_CACHE_HOME:-$HOME/.cache}/weatherreport" + +if [ "$1" = 'cp' ]; then + # shellcheck disable=SC2015 + [ -z "$2" ] && sed 's/\x1b\[[^m]*m//g' "$report" | wl-copy && + notify-send "Weather forecast for '${LOCATION:-$(head -n 1 "$report" | cut -d' ' -f3-)}' copied to clipboard." || + { data="$(curl -sfm 5 "${WTTRURL:-wttr.in}/$2?T")" && + notify-send "Weather forecast for '$2' copied to clipboard." && + echo "$data" | wl-copy || + notify-send 'Failed to get weather forecast!' 'Check your internet connection and the supplied location.'; } +else + [ -n "$2" ] && + notify-send "Invalid option '$1'! The only valid option is 'cp'." && + exit 1 + + # shellcheck disable=SC2015 + [ -z "$1" ] && less -S "$report" || + data="$(curl -sfm 5 "${WTTRURL:-wttr.in}/$1")" && echo "$data" | less -S || + notify-send 'Failed to get weather forecast!' 'Check your internet connection and the supplied location.' +fi diff --git a/.local/bin/xdg-terminal-exec b/.local/bin/xdg-terminal-exec new file mode 100755 index 0000000..12b18ff --- /dev/null +++ b/.local/bin/xdg-terminal-exec @@ -0,0 +1,3 @@ +#!/bin/sh + +"$TERMINAL" -e "$@" diff --git a/.local/share/applications/file.desktop b/.local/share/applications/file.desktop new file mode 100644 index 0000000..dcdf465 --- /dev/null +++ b/.local/share/applications/file.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=File Manager +Exec=/usr/bin/footclient -e yazi %u diff --git a/.local/share/applications/img.desktop b/.local/share/applications/img.desktop new file mode 100644 index 0000000..a20b4f2 --- /dev/null +++ b/.local/share/applications/img.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Image viewer +Exec=/usr/bin/swayimg %f diff --git a/.local/share/applications/mail.desktop b/.local/share/applications/mail.desktop new file mode 100644 index 0000000..e7e16ae --- /dev/null +++ b/.local/share/applications/mail.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Mail +Exec=/usr/bin/footclient -e neomutt %u diff --git a/.local/share/applications/pdf.desktop b/.local/share/applications/pdf.desktop new file mode 100644 index 0000000..8c38677 --- /dev/null +++ b/.local/share/applications/pdf.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=PDF reader +Exec=/usr/bin/zathura %u diff --git a/.local/share/applications/rss.desktop b/.local/share/applications/rss.desktop new file mode 100644 index 0000000..6fafc4f --- /dev/null +++ b/.local/share/applications/rss.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=RSS feed addition +Exec=/usr/bin/env rssadd %U diff --git a/.local/share/applications/text.desktop b/.local/share/applications/text.desktop new file mode 100644 index 0000000..ac53b06 --- /dev/null +++ b/.local/share/applications/text.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Text editor +Exec=/usr/bin/footclient -e nvim %u diff --git a/.local/share/applications/torrent.desktop b/.local/share/applications/torrent.desktop new file mode 100644 index 0000000..f6d28d9 --- /dev/null +++ b/.local/share/applications/torrent.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Torrent +Exec=/usr/bin/env transadd %U diff --git a/.local/share/applications/video.desktop b/.local/share/applications/video.desktop new file mode 100644 index 0000000..a29a0b1 --- /dev/null +++ b/.local/share/applications/video.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Video viewer +Exec=/usr/bin/mpv -quiet %f diff --git a/.local/share/bg b/.local/share/bg new file mode 120000 index 0000000..b41641d --- /dev/null +++ b/.local/share/bg @@ -0,0 +1 @@ +thiemeyer_road_to_samarkand.jpg
\ No newline at end of file diff --git a/.local/share/larbs/chars/emoji b/.local/share/larbs/chars/emoji new file mode 100644 index 0000000..6803731 --- /dev/null +++ b/.local/share/larbs/chars/emoji @@ -0,0 +1,1630 @@ +๐ 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 diff --git a/.local/share/larbs/chars/font-awesome b/.local/share/larbs/chars/font-awesome new file mode 100644 index 0000000..3283be3 --- /dev/null +++ b/.local/share/larbs/chars/font-awesome @@ -0,0 +1,1456 @@ +๏ฎ 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 diff --git a/.local/share/larbs/emoji b/.local/share/larbs/emoji new file mode 100644 index 0000000..6803731 --- /dev/null +++ b/.local/share/larbs/emoji @@ -0,0 +1,1630 @@ +๐ 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 diff --git a/.local/share/thiemeyer_road_to_samarkand.jpg b/.local/share/thiemeyer_road_to_samarkand.jpg Binary files differnew file mode 100644 index 0000000..6a30adb --- /dev/null +++ b/.local/share/thiemeyer_road_to_samarkand.jpg |