diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 5f4d5a09..00000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016-2021 Henrik Lissner. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index f6041ecb..00000000 --- a/README.md +++ /dev/null @@ -1,128 +0,0 @@ -[![Made with Doom Emacs](https://img.shields.io/badge/Made_with-Doom_Emacs-blueviolet.svg?style=flat-square&logo=GNU%20Emacs&logoColor=white)](https://github.com/hlissner/doom-emacs) -[![NixOS Unstable](https://img.shields.io/badge/NixOS-unstable-blue.svg?style=flat-square&logo=NixOS&logoColor=white)](https://nixos.org) - -**Hey,** you. You're finally awake. You were trying to configure your OS declaratively, right? Walked right into that NixOS ambush, same as us, and those dotfiles over there. - - - -

- - - -

- ------- - -| | | -|-|-| -| **Shell:** | zsh + zgen | -| **DM:** | lightdm + lightdm-mini-greeter | -| **WM:** | bspwm + polybar | -| **Editor:** | [Doom Emacs][doom-emacs] (and occasionally [vim]) | -| **Terminal:** | st | -| **Launcher:** | rofi | -| **Browser:** | firefox | -| **GTK Theme:** | [Ant Dracula](https://github.com/EliverLara/Ant-Dracula) | - ------ - -## Quick start - -1. Yoink the latest build of [NixOS 21.05][nixos]. -2. Boot into the installer. -3. Do your partitions and mount your root to `/mnt` ([for example](hosts/kuro/README.org)) -4. Install these dotfiles: -5. `nix-shell -p git nixFlakes` -6. `git clone https://github.com/hlissner/dotfiles /mnt/etc/nixos` -7. Install NixOS: `nixos-install --root /mnt --flake /mnt/etc/nixos#XYZ`, where - `XYZ` is [the host you want to install](hosts/). Use `#generic` for a - simple, universal config, or create a sub-directory in `hosts/` for your device. See [host/kuro] for an example. -8. Reboot! -9. Change your `root` and `$USER` passwords! - -## Management - -And I say, `bin/hey`. [What's going on?](http://hemansings.com/) - -``` -Usage: hey [global-options] [command] [sub-options] - -Available Commands: - check Run 'nix flake check' on your dotfiles - gc Garbage collect & optimize nix store - generations Explore, manage, diff across generations - help [SUBCOMMAND] Show usage information for this script or a subcommand - rebuild Rebuild the current system's flake - repl Open a nix-repl with nixpkgs and dotfiles preloaded - rollback Roll back to last generation - search Search nixpkgs for a package - show [ARGS...] - ssh HOST [COMMAND] Run a bin/hey command on a remote NixOS system - swap PATH [PATH...] Recursively swap nix-store symlinks with copies (or back). - test Quickly rebuild, for quick iteration - theme THEME_NAME Quickly swap to another theme module - update [INPUT...] Update specific flakes or all of them - upgrade Update all flakes and rebuild system - -Options: - -d, --dryrun Don't change anything; preform dry run - -D, --debug Show trace on nix errors - -f, --flake URI Change target flake to URI - -h, --help Display this help, or help for a specific command - -i, -A, -q, -e, -p Forward to nix-env -``` - -## Frequently asked questions - -+ **Why NixOS?** - - Because declarative, generational, and immutable configuration is a godsend - when you have a fleet of computers to manage. - -+ **How do you manage secrets?** - - With [agenix]. - -+ **How do I change the default username?** - - 1. Set the `USER` environment variable the first time you run `nixos-install`: - `USER=myusername nixos-install --root /mnt --flake /path/to/dotfiles#XYZ` - 2. Or change `"hlissner"` in modules/options.nix. - -+ **Why did you write bin/hey?** - - I envy Guix's CLI and want similar for NixOS, but its toolchain is spread - across many commands, none of which are as intuitive: `nix`, - `nix-collect-garbage`, `nixos-rebuild`, `nix-env`, `nix-shell`. - - I don't claim `hey` is the answer, but everybody likes their own brew. - -+ **How 2 flakes?** - - Would it be the NixOS experience if I gave you all the answers in one, - convenient place? - - No. Suffer my pain: - - + [A three-part tweag article that everyone's read.](https://www.tweag.io/blog/2020-05-25-flakes/) - + [An overengineered config to scare off beginners.](https://github.com/nrdxp/nixflk) - + [A minimalistic config for scared beginners.](https://github.com/colemickens/nixos-flake-example) - + [A nixos wiki page that spells out the format of flake.nix.](https://nixos.wiki/wiki/Flakes) - + [Official documentation that nobody reads.](https://nixos.org/learn.html) - + [Some great videos on general nixOS tooling and hackery.](https://www.youtube.com/channel/UC-cY3DcYladGdFQWIKL90SQ) - + A couple flake configs that I - [may](https://github.com/LEXUGE/nixos) - [have](https://github.com/bqv/nixrc) - [shamelessly](https://git.sr.ht/~dunklecat/nixos-config/tree) - [rummaged](https://github.com/utdemir/dotfiles) - [through](https://github.com/purcell/dotfiles). - + [Some notes about using Nix](https://github.com/justinwoo/nix-shorts) - + [What helped me figure out generators (for npm, yarn, python and haskell)](https://myme.no/posts/2020-01-26-nixos-for-development.html) - + [What y'all will need when Nix drives you to drink.](https://www.youtube.com/watch?v=Eni9PPPPBpg) - - -[doom-emacs]: https://github.com/hlissner/doom-emacs -[vim]: https://github.com/hlissner/.vim -[nixos]: https://releases.nixos.org/?prefix=nixos/unstable/ -[host/kuro]: https://github.com/hlissner/dotfiles/tree/master/hosts/kuro -[agenix]: https://github.com/ryantm/agenix diff --git a/backup.nix b/backup.nix new file mode 100644 index 00000000..8fa6f01c --- /dev/null +++ b/backup.nix @@ -0,0 +1,34 @@ +{ + # Assumes the remote borg backup server has already been initialized + # borg init --encryption-key=repokey-blake2 -rsh 'ssh -i /run/keys/id_ed25519_borgbase' 20779@hk-s020.rsync.net: + services.borgbackup.jobs = { + backupTaskwarriorRsync = { + paths = [ "/var/lib/taskserver" ]; + doInit = true; + repo = "20779@hk-s020.rsync.net:taskwarrior" ; + encryption = { + mode = "repokey-blake2"; + passCommand = "cat /run/keys/rsync"; + }; + environment = { BORG_RSH = "ssh -i /run/keys/id_ed25519_borgbase"; }; + compression = "auto,lzma"; + startAt = "weekly"; + extraArgs = "--remote-path=borg1"; + }; + }; + services.borgbackup.jobs = { + backupShaarliRsync = { + paths = [ "/var/www/shaarli-config/data/datastore.php" "/var/www/shaarli-config/config" "/var/www/shaarli-config/.json.config" ]; + doInit = true; + repo = "20779@hk-s020.rsync.net:shaarli" ; + encryption = { + mode = "repokey-blake2"; + passCommand = "cat /run/keys/rsync"; + }; + environment = { BORG_RSH = "ssh -i /run/keys/id_ed25519_borgbase"; }; + compression = "auto,lzma"; + startAt = "weekly"; + extraArgs = "--remote-path=borg1"; + }; + }; +} diff --git a/bin/autoclicker b/bin/autoclicker deleted file mode 100755 index 7a39f10c..00000000 --- a/bin/autoclicker +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -while true; do - xdotool mousedown 1 - sleep 0.01 - xdotool mouseup 1 - sleep 0.01 -done diff --git a/bin/bspwm/focus b/bin/bspwm/focus deleted file mode 100755 index af8b1fb2..00000000 --- a/bin/bspwm/focus +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -# Script: bspc-focus -# Author: Henrik Lissner -# Usage: -# bspc-focus [-m] (west|south|north|east) -# bspc-focus south -# bspc-focus -m west -# -# Focus the next window in direction. If -m is supplied, jump to the next -# monitor in that direction. -# -# The behavior of the base 'bspc node -f' is odd when crossing screens. It will -# focus the last selected window on that screen, rather than the window on the -# connecting edge, which is unintuitive. - -set -e - -leap= -if [[ $1 == -m ]]; then - leap=1; shift -fi -dir=$1 -opposite= - -case $dir in - west) opposite=east ;; - east) opposite=west ;; - north) opposite=north ;; - south) opposite=south ;; - *) >&2 echo "Not a valid direction: $dir" - exit 1 -esac - -if [[ -n $leap ]]; then - # jump to monitor in direction - bspc monitor -f "$dir" -else - # jump to window in direction (unless at edge of last monitor) - if ! bspc node -f "$dir.local"; then - if [[ $(bspc query -M -m "$dir") ]]; then - bspc monitor -f "$dir" - # Ensure we start at the edge of the window we arrived from - while bspc node -f "$opposite.local"; do :; done - fi - fi -fi diff --git a/bin/bspwm/presel b/bin/bspwm/presel deleted file mode 100755 index ecd5ffba..00000000 --- a/bin/bspwm/presel +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -i zsh -p jshon - -# Script: bspc-presel -# Author: Henrik Lissner -# Usage: -# bspc-presel RATIO -# bspc-presel 0.2 -# -# Wrote this to invert the ratio on east/south-bound preselections. In English -# that means bspc node -p 0.2 should resize the preselection to 20%, whether or -# not it's on the west or east side of the window (or north or south side), -# which isn't the case by default. -# -# NOTE: We use zsh for this because bash chokes on float arithmetic. - -ratio="$1" -case "$(bspc query -T -n focused | jshon -e presel -e splitDir | tr -d \")" in - west|north) bspc node -o $ratio ;; - east|south) bspc node -o $(( 1.0 - ratio )) ;; -esac diff --git a/bin/bspwm/subtract-presel b/bin/bspwm/subtract-presel deleted file mode 100755 index 4b44478a..00000000 --- a/bin/bspwm/subtract-presel +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -i zsh -p jshon wmutils-core - -# Script: bspc-subtract-presel -# Author: Henrik Lissner (w/ credit to @Chrysostomus) -# Usage: -# bspc-resize-to-presel -# -# (Adapted from Chrysostomus/bspwm-scripts/bin/resizetopresel.sh) -# -# This script resizes the current window by "subtracting" the bspwm preselection -# on the current node. In English, that means this will reduce the window's -# width by 20%: -# -# bspc node -p east -o 0.2 && bspc-subtract-presel -# -# NOTE: We use zsh for this because bash chokes on float arithmetic. - -# Check if the brother node is a receptacle -if [[ $(bspc query -T -n @brother/ | jshon -e client) = null ]]; then - # Yep, it's a receptacle. Get the real dimensions - eval $(grep "window_gap" ~/.config/bspwm/rc.d/theme | tr -cd [0-9]) - # Get orientation - wattr xywh $(pfw) | read focused_x focused_y focused_width focused_height - receptacle_y=$(bspc query -T -n @brother/ | jshon -e rectangle -e y) - if [[ "$focused_y" -eq "$receptacle_y" ]]; then - receptacle_width=$(bspc query -T -n @brother/ | jshon -e rectangle -e width) - receptacle_x=$(bspc query -T -n @brother/ | jshon -e rectangle -e x) - # receptacle and window have the same height, so they are side by side - if [[ receptacle_x -gt focused_x ]]; then - echo "receptacle is right of the window" - # get the true window dimension - true_dim=$(( receptacle_width + gap )) - # kill the repectacle - for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done - # resize the window - bspc node @east -r -$true_dim || bspc node @west -r +$true_dim - else - echo "receptacle is left of the window" - # get the true window dimension - true_dim=$(( receptacle_width + gap )) - # kill the repectacle - for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done - # resize the window - bspc node @west -r +$true_dim || bspc node @east -r -$true_dim - fi - else - receptacle_height=$(bspc query -T -n @brother/ | jshon -e rectangle -e height) - # width is necessarily equal if height is not, because the nodes are - # brothers Window are on the top of each other - if [[ receptacle_y -gt focused_y ]]; then - echo "receptacle is below the window" - # get the true window dimension - true_dim=$(( receptacle_height + gap)) - # kill the repectacle - for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done - # resize the window - bspc node @south -r -$true_dim || bspc node @north -r +$true_dim - else - echo "receptacle is above the window" - # get the true window dimension - true_dim=$(( receptacle_height + gap)) - # kill the repectacle - for i in $(bspc query -N -n .leaf.!window.local); do bspc node $i -k; done - # resize the window - bspc node @north -r +$true_dim || bspc node @south -r -$true_dim - fi - fi - echo $true_dim - exit 0 -fi - -# If the focused window is not preselected, do nothing -[[ "$(bspc query -T -n focused | jshon -e presel)" == null ]] && exit 0 - -dir=$(bspc query -T -n focused | jshon -e presel -e splitDir | tr -d \") -ratio=$(bspc query -T -n focused | jshon -e presel -e splitRatio) -case "$dir" in - west) - cur=$(bspc query -T -n focused | jshon -e rectangle -e width) - bspc node @west -r +$((${cur}*${ratio})) || \ - bspc node @east -r -$((${cur}*${ratio})) - ;; - east) - cur=$(bspc query -T -n focused | jshon -e rectangle -e width) - bspc node @east -r -$((${cur}*(1.0-${ratio}))) || \ - bspc node @west -r +$((${cur}*${ratio})) - ;; - - north) - cur=$(bspc query -T -n focused | jshon -e rectangle -e height) - bspc node @north -r +$((${cur}*${ratio})) || \ - bspc node @south -r -$((${cur}*${ratio})) - ;; - south) - cur=$(bspc query -T -n focused | jshon -e rectangle -e height) - bspc node @south -r -$(( ${cur} * (1.0 - ${ratio}) )) || \ - bspc node @north -r +$(( ${cur} * ${ratio} )) -esac - -bspc node -p cancel diff --git a/bin/bspwm/swap b/bin/bspwm/swap deleted file mode 100755 index 8dd025f0..00000000 --- a/bin/bspwm/swap +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash - -# Script: bspc-swap -# Author: Henrik Lissner -# Usage: -# bspc-swap [-m] (west|south|north|east) -# bspc-swap south -# bspc-swap -m west -# -# Swaps current window with the window in a direction. If -m is set, move window -# to the next monitor in that direction. -# -# The behavior of the base 'bspc node -s' is odd when crossing screens. It will -# swaps with the last selected window on that screen, rather than the window on -# the connecting edge, which is unintuitive. - -set -e - -leap= -if [[ $1 == -m ]]; then - leap=1 - dir=$2 -else - dir=$1 -fi - -case $dir in west|south|north|east) ;; - *) >&2 echo "Not a valid direction: $dir" - exit 1 -esac - -if [[ -n $leap ]]; then - # move window to monitor in direction - old_id=$(bspc query -N -n focused) - if [[ $(bspc query -M -m "$dir") ]]; then - bspc node -m "$dir" - bspc node -f "$old_id" - fi -else - # move window in direction - old_id=$(bspc query -N -n focused) - if bspc node -s "$dir.local"; then - bspc node -f "$old_id" - elif [[ -n $(bspc query -M -m "$dir") ]]; then - bspc node -m "$dir" - bspc node -f "$old_id" - fi -fi diff --git a/bin/hey b/bin/hey deleted file mode 100755 index 4d80aa42..00000000 --- a/bin/hey +++ /dev/null @@ -1,385 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -p ruby_2_7 -i "ruby -S" --quiet - -DESC = <<~DESC - Nix's CLI has a poor user story, in my opinion. It could be better; Guix is a - good role model here. I wrote this script to abstract the more common - workflows, like rebuilding (nixos-rebuild), cleaning up (nix-collect-garbage), - package/env management (nix-env), updating, rolling back, etc. As well as some - utility operations (like managing generations, building remotely, or swapping - themes on the fly). - - Because I can go months without shaving yaks in NixOS, exact flags or details - are often and easily forgotten. This spares me that fumbling phase and also - serves as a reference. - - Note: `hey` can also be used as a shortcut for nix-env: - - hey -q - hey -iA nixos.htop - hey -e htop -DESC - -require 'shellwords' -require 'optparse' - -module Hey - extend self - Command = Struct.new(:name, :desc, :args, :opts, :fn) - - @@opts = {} - @@alias = {} - @@commands = {} - @@cli = nil - def self.defcmd names, &block - names = (names.kind_of?(Array) ? names : [names]).map(&:to_s) - names.drop(1).each { |n| @@alias[n] = names.first } - cli = Command.new names.first, [], [] - cli.opts = OptionParser.new do |opt| - opt.banner = "Usage: #{opt.program_name} #{cli.name} [options]" - opt.separator "\nOptions:" - opt.on_tail('-h', '--help', 'Prints this help') { puts opt; exit } - end - @@cli = cli - fn = block.call cli - cli.fn = lambda do |args| - begin - cli.opts.banner += - (cli.args ? " #{cli.args.join ' '}" : "") + - (cli.desc ? "\n\n#{cli.desc[0]}\n\n#{cli.desc[1..].join "\n"}" : "") - cli.opts.order!(args, into: @@opts) - fn.call args - ensure @@cli = nil end - end - @@commands[cli.name] = @@cli - end - def self.opts(*args) @@cli.opts.on(*args) end - def self.args(*args) @@cli.args = args end - def self.desc(*args) @@cli.desc = args end - def self.sh(args, sudo: false, noerror: false) - raise ArgumentError unless args.kind_of?(Array) - args.unshift('sudo') if sudo - args.compact! - if @@opts[:dryrun] - print "#{args}\n" - return true - else - result = system "#{args.shelljoin} 2>&1" - exit($?.exitstatus) unless noerror or result - return result - end - end - def self.rebuild(*args, sudo: false, host: nil) - host ||= ENV['HOST'] || `hostname`.rstrip - sh ["nixos-rebuild", - "--flake", "#{@@opts[:flake]}##{host}", - "--option", "pure-eval", "no", - *args], sudo: sudo - end - - # - defcmd :repl do - desc "Open a nix-repl with nixpkgs and dotfiles preloaded" - lambda do |args| - tempfile = '/tmp/dotfiles-repl.nix' - File.write('/tmp/dotfiles-repl.nix', "(builtins.getFlake \"#{@@opts[:flake]}\")") - begin - sh ["nix", "repl", "", tempfile, *args] - ensure - File.delete tempfile - end - end - end - - defcmd [:check, :ch] do - desc "Run 'nix flake check' on your dotfiles" - lambda do |args| - sh ["nix", "flake", "check", @@opts[:flake]] - end - end - - defcmd :show do - desc "[ARGS...]", "Run 'nix flake show' on your dotfiles" - lambda do |args| - sh ["nix", "flake", "show", @@opts[:flake]] - end - end - - defcmd :theme do - desc 'Quickly swap to another theme module' - args "THEME_NAME" - lambda do |args| - ENV["THEME"] = args.shift - rebuild "--fast", "test" - end - end - - defcmd [:test, :t] do - desc "Quickly rebuild, for quick iteration" - lambda do |args| - rebuild "--fast", "test", *args - end - end - - defcmd [:rebuild, :re] do - desc "Rebuild the current system's flake" - opts '--build-host HOST', "Where to build the flake" - opts '--target-host HOST', "Where to deploy the built derivations" - opts '--host HOST', "The target nixosConfiguration to build" - opts '--user', "Rebuild as user, rather than root" - opts '--fast', "Equivalent to --no-build-nix --show-trace for quick rebuilding" - lambda do |args| - Dir.chdir(@@opts[:flake]) do - args = ["switch"] unless args.length > 0 - rebuild(*(@@opts[:"build-host"] ? ["--build-host", @@opts[:"build-host"]] : []), - *(@@opts[:"target-host"] ? ["--target-host", @@opts[:"target-host"]] : []), - @@opts[:fast] ? "--fast" : nil, - @@opts[:debug] ? "--show-trace" : nil, - *args, - sudo: !@@opts[:user], - host: @@opts[:host]) - end - end - end - - defcmd :rollback do - desc "Roll back to last generation" - lambda do |_args| - rebuild "--rollback", "switch" - end - end - - defcmd [:update, :u] do - desc "Update specific flakes or all of them" - args "[INPUT...]" - lambda do |args| - if args.empty? - puts "Updating all flakes.." - sh ["nix", "flake", "update", @@opts[:flake]] - else - puts "Trying to update flakes: #{args.join ' '}" - sh ["nix", "flake", "lock"] - .concat(args.map { |f| [ "--update-input", f ]}.flatten) - .concat([@@opts[:flake]]) - end - end - end - - defcmd [:upgrade, :up] do - desc "Update all flakes and rebuild system" - lambda do |_args| - update - rebuild :switch - end - end - - defcmd [:search, :s] do - desc "Search nixpkgs for a package" - lambda do |args| - sh ["nix", "search", "nixpkgs", *args] - end - end - - defcmd :swap do - desc "Recursively swap nix-store symlinks with copies (or back).", - "The purpose is so you can have copies of your dotfiles that can be modified in", - "place (so you can iterate on them quickly instead of 'hey re'ing between", - "changes). Run again to restore the old link(s).\n", - "Warning: backup your copies, or they will be destroyed when restored!" - args "PATH", "[PATH...]" - lambda do |args| - for target in args - if File.directory? target - files = Dir.glob("#{target}/**/*.nix-store-backup") - if files.length > 0 - puts "There are swapped files here. Unswapping!" - call :swap, *files - else - puts "Swapping files in #{target}" - call :swap, *(Dir.glob("#{target}/**/*") - .select { |f| File.symlink? f } - .select { |l| File.readlink(l).match '^/nix/store/' }) - end - elsif File.file? "#{target}.nix-store-backup" - puts "Unswapping #{target}" - sh [:mv, '-i', "#{target}.nix-store-backup", target] - elsif File.file? target - puts "Swapping #{target}" - sh [:mv, target, "#{target}.nix-store-backup"] - sh [:cp, "#{target}.nix-store-backup", target] - else - puts "Not a valid target: #{target}" - exit 1 - end - end - end - end - - defcmd :gc do - desc "Garbage collect & optimize nix store" - opts "-a", "--all", "GC both the user and system profiles" - opts "-s", "--system", "Only GC the system profile" - lambda do |_args| - if @@opts[:all] or @@opts[:system] - puts "Cleaning up your system profile..." - sh %w{nix-collect-garbage -d}, sudo: true - sh %w{nix-store --optimise}, sudo: true - # Clear out left-over secrets. The switch-to-configuration call below will - # regenerate them. - if File.exists?("/run/secrets/*") - sh %w{rm -rf /run/secrets/*}, sudo: true - end - # nix-collect-garbage is a Nix tool, not a NixOS tool. It won't delete old - # boot entries until you do a nixos-rebuild (which means we'll always have - # 2 boot entries at any time). Instead, we properly delete them by - # reloading the current environment. - sh %w{nix-env --delete-generations old --profile /nix/var/nix/profiles/system}, sudo: true - sh %w{/nix/var/nix/profiles/system/bin/switch-to-configuration switch}, sudo: true - end - if @@opts[:all] or not @@opts[:system] - puts "Cleaning up your user profile..." - sh %w{nix-collect-garbage -d} - end - end - end - - defcmd :ssh do - desc "Run a bin/hey command on a remote NixOS system", - "If COMMAND is one of switch, test, or boot (if omitted, 'test' is assumed),", - "that host's config is built locally and then copied to the remote over ssh.", - "This will prompt you for your root password, as it temporarily opens root ssh", - "access (via your existing ssh key) to the remote -- which is immediately removed", - "upon completion.", - "", - "If COMMAND is anything else, it merely runs 'nix run github:hlissner/dotfiles", - "-- COMMAND' on the rmeote." - args "HOST", "[COMMAND]" - opts '--host HOST', "The nixos config to build and deploy to HOST" - lambda do |args| - target, command = args.take(2) - command ||= "test" - if command.match(/switch|test|boot/) - puts "Enabling root ssh access on #{target}. Enter root password for remote system:" - if sh ["ssh", "-t", target, - "sudo mkdir -p /root/.ssh && sudo cp -f ~/.ssh/authorized_keys /root/.ssh/"], - noerror: true - begin - puts "Building #{@@opts[:flake]}##{@@opts[:host] || target} for #{target}" - call "rebuild", ["--user", - "--host", @@opts[:host] || target, - "--build-host", "localhost", - "--target-host", "root@#{target}", - command] - ensure - puts "Undoing root ssh access on #{target}" - sh ["ssh", "-t", "root@#{target}", "rm -f /root/.ssh/authorized_keys"] - end - end - else - command = "nix run github:hlissner/dotfiles -- #{command}" - puts "Running '#{command}' on #{target}" - sh ["ssh", "-t", target, command] - end - end - end - - # TODO Generalize this to nix profiles - defcmd [:generations, :gen] do - desc "Explore, manage, diff across generations" - opts '--diff FROM TO', "Diff profiles FROM with TO (numbers)" - opts '-r', '--remove PROFILE', "Delete PROFILE from history" - lambda do |args| - profile = "/nix/var/nix/profiles/system" - case args.shift - when "diff" - from, to = *args - if from == to - puts "Comparing the same profile! Aborting..." - exit 1 - elsif [from, to].compact.select do |gen| - File.exists? "#{profile}-#{gen}-link" or - puts "Generation #{gen} does not exist!" - end.length != [from, to].compact.length - exit 2 - end - from = from ? "#{profile}-#{from}-link" : profile - to = to ? "#{profile}-#{to}-link" : profile - fromDevs = `nix-store -q --references #{from}`.split - toDevs = `nix-store -q --references #{to}`.split - puts (fromDevs - toDevs).map { |d| "\e[31m-#{d}\e[0m" } - puts (toDevs - fromDevs).map { |d| "\e[32m+#{d}\e[0m" } - when /ls|list/ - sh ["nix-env", "--list-generations", "--profile", profile], sudo: true - when "remove" - sh ["nix-env", "--delete-generations", "--profile", profile, *args], sudo: true - when "switch" - puts "Targeted rollback not supported yet" # TODO Is this true? - exit 1 - end - end - end - - class UsageError < StandardError; end - defcmd [:help, :h] do - desc "Show usage information for this script or a subcommand" - args "[SUBCOMMAND]" - lambda do |args| - raise UsageError unless args.first - call args.first, ["-h", *args.drop(1)] - end - end - - # - def self.call command, args - cmd = command.to_s - cmd = @@alias[cmd] while cmd and not @@commands.key?(cmd) - if cmd - @@commands[cmd].fn.call args - elsif command - puts "Couldn't recognize command '#{command}'" - exit 1 - else - raise UsageError - end - end - - def self.run args=[] - opts = OptionParser.new do |opt| - opt.banner = "Usage: hey [global-options] [command] [sub-options]\n\n" + DESC - opt.separator "\n\nAvailable Commands:" - opt.separator (@@commands.values - .reject { |c| c.desc.empty? } - .sort { |a,b| a.name <=> b.name } - .map { |c| " %-22s %s\n" % ["#{c.name} #{c.args.join ' '}", - c.desc[0]]}) - opt.separator "\nOptions:" - opt.on '-d', '--dryrun', "Don't change anything; preform dry run" - opt.on '-D', '--debug', "Show trace on nix errors" - opt.on '-f', '--flake URI', "Change target flake to URI" - opt.on '-h', '--help', "Display this help, or help for a specific command" - opt.on(*%w{-i -A -q -e -p}, "Forward to nix-env") { sh ["nix-env", *ARGV]; exit } - end - opts.order!(args, into: @@opts) - if @@opts[:flake] and @@opts[:flake].include? "#" - @@opts[:flake], @@opts[:host] = @@opts[:flake].split '#' - end - if not @@opts[:flake] or @@opts[:flake].empty? - @@opts[:flake] = File.expand_path('../', File.dirname(__FILE__)) - end - - begin - args.unshift("help") if @@opts[:help] - if args.length == 0 - puts "Error: No command specified!" - puts - raise UsageError - else - call args.first, args.drop(1) - end - rescue UsageError - puts opts - end - end -end - -Hey.run ARGV.dup diff --git a/bin/mov2gif b/bin/mov2gif deleted file mode 100755 index 5b0bad4f..00000000 --- a/bin/mov2gif +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -i bash -p ffmpeg gifsicle - -# Uses ffmpeg to convert a video file to a gif file. Optimizes the final result -# with gifsicle. -# -# Requires: ffmpeg gifsicle -# -# Example: -# mov2gif some-vid.mp4 output.gif -# mov2gif -f 10 -s 00:00:10 -t 00:00:05 some-vid.mp4 output.gif - -set -e -PALETTE="/tmp/palette.png" - -usage() { - cat <&2 echo "$OPTARG requires an argument" - usage - exit 1 - ;; - *) >&2 echo "Not a valid arg: $opt" - usage - exit 1 - ;; - esac -done -shift $((OPTIND-1)) - -# -if (($# == 0)); then - >&2 echo "No movie file specified" - exit -elif [[ ! -f $1 ]]; then - >&2 echo "$1 does not exist" - exit -fi - -src="$1" -dest="${2:-${src%.*}.gif}" -flags="fps=${fps}$scale" - -# stats_mode=full favors motion, causing the resulting palette to better -# accomodate fades and transitions. -ffmpeg -v warning $start $duration -i "file:$src" -vf "$flags,palettegen=stats_mode=full" -y "$PALETTE" -ffmpeg -v warning $start $duration -i "file:$src" -i "$PALETTE" -lavfi "$flags [x]; [x][1:v] paletteuse" -y "$dest" - -gifsicle -O3 "$dest" -o "$dest" diff --git a/bin/myip b/bin/myip deleted file mode 100755 index 0ac81c6f..00000000 --- a/bin/myip +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env zsh -# Echos your local or WAN IP - -if [[ $1 == -w ]]; then - wan=1 - shift -fi - -if [[ -n $wan ]]; then - dig +short myip.opendns.com @resolver1.opendns.com -else - IF=$(netstat -rn | awk '/^0.0.0.0/ {thif=substr($0,74,10); print thif;} /^default.*UG/ {thif=substr($0,65,10); print thif;}') - if command -v ifconfig >/dev/null; then - ifconfig ${NET_IF} | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' - elif command -v ip >/dev/null; then - ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/' - else - >&2 echo "No easy way to grab your IP" - exit 1 - fi -fi diff --git a/bin/optimimg b/bin/optimimg deleted file mode 100755 index 03bf63a0..00000000 --- a/bin/optimimg +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env zsh - -# Optimize image files (losslessly by default) -# -# Examples: -# imgoptim image.jpg image.png image.gif -# imgoptim directory_of_images/ -# imgoptim directory_of_images/*.png -# -# Requires: -# PNGs: optipng, pngquant (lossy) -# JPGs: jpegtran, jpegoptim (lossy) -# GIFs: gifsicle -# -# Packages (same name on homebrew & arch linux) -# optipng [pngquant] libjpeg-turbo [jpegoptim] gifsicle - -set -e -unset CDPATH - -_usage() { - cat <&2 echo "$OPTARG requires an argument"; _usage; exit 1;; - *) >&2 echo "Not a valid arg: $opt"; _usage; exit 1;; - esac -done -shift $((OPTIND-1)) - -cmds=( optipng jpegtran gifsicle ) -[[ -n $lossy ]] && cmds=( $cmds pngquant jpegoptim ) -for cmd in ${cmds[@]}; do - if ! command -v $cmd >/dev/null; then - >&2 echo "$cmd isn't installed" - error=1 - fi -done -if [[ -n $error ]]; then - >&2 echo "There were errors, aborting" - exit 1 -fi - -for file in $@; do - if [[ -d $file ]]; then - imgoptim $file/* - elif [[ -f $file ]]; then - pre_size=$(_filesize "$file") - case ${file##*.} in - png) - [[ -n $lossy ]] && pngquant $file - optipng -nc -nb -o7 $file - ;; - gif) - gifsicle --batch --optimize=3 "$file" - ;; - jpg|jpeg) - [[ -n $lossy ]] && jpegoptim --max=90 "$file" - jpegtran -copy none -optimize -progressive -outfile "$file" "$file" - ;; - *) - printf "Unrecognized file '$file': ignored" - ;; - esac - post_size=$(_filesize "$file") - perc=$(echo "((${pre_size} - ${post_size}) / ${pre_size}) * 100" | bc -l) - printf "* %s: %d => %d (%.2f%% reduction)\n" "$file" "${pre_size}" "${post_size}" "$perc" - fi -done diff --git a/bin/optimpdf b/bin/optimpdf deleted file mode 100755 index 167e90ba..00000000 --- a/bin/optimpdf +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -# Compress pdf files using ghostscript. -# -# Defaults to 72 dpi. -# -# Usage: -# pdfoptim SRC [TARGET] [DPI] -# -# Requires: ghostscript (gs) - -optimize() { - # Adapted from Alfred Klomp's shrinkpdf script - # - gs -q -dNOPAUSE -dBATCH -dSAFER \ - -sDEVICE=pdfwrite \ - -dPDFSETTINGS=/screen \ - -dCompatibilityLevel=1.3 \ - -dEmbedAllFonts=true \ - -dSubsetFonts=true \ - -dAutoRotatePages=/None \ - -dMonoImageResolution=$3 \ - -dMonoImageDownsampleType=/Bicubic \ - -dGrayImageResolution=$3 \ - -dGrayImageDownsampleType=/Bicubic \ - -dColorImageResolution=$3 \ - -dColorImageDownsampleType=/Bicubic \ - -sOutputFile="$2" \ - "$1" -} - -src="$1" -dest="${2:--}" -dpi="${3:-72}" - -optimize "$src" "$dest" "$dpi" || exit $? diff --git a/bin/rofi/appmenu b/bin/rofi/appmenu deleted file mode 100755 index 3156c692..00000000 --- a/bin/rofi/appmenu +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh -rofi -show drun \ - -modi drun,run \ - -show-icons \ - -theme theme/appmenu.rasi diff --git a/bin/rofi/browsermenu b/bin/rofi/browsermenu deleted file mode 100755 index cdb42e28..00000000 --- a/bin/rofi/browsermenu +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -p ruby_2_7 rubyPackages_2_7.sqlite3 -i "ruby -S" --quiet - -# Open your browser bookmarks or history in your default browser. Currently -# works with Firefox, Brave, and qutebrowser. - -require 'shellwords' -require 'sqlite3' -require 'json' -require 'fileutils' -require 'cgi' - -def rofi items, *args - cmd = [*%w{rofi -dmenu -theme theme/bookmarkmenu.rasi -markup-rows -multi-select -p browser -i}, *args] - IO.popen(cmd.compact.shelljoin, "r+") do |pipe| - pipe.puts items.keys.join "\n" - pipe.close_write - (pipe.gets || "").split "\n" - end -end - -def db file, command - copy = "/tmp/browsermenu-db-#{File.basename(file)}" - begin - # Copy the sqlite database because history/bookmark info is usually small - # and may be locked by an open browser. - unless File.exists? copy - FileUtils.cp file, copy - FileUtils.chmod 0400, copy, verbose: true - end - results = [] - db = SQLite3::Database.open copy - db.execute(command).each { |r| results.push r } - results - ensure - File.delete copy - end -end - -def walk_json children - result = [] - for c in children - if c['children'] - result += walk_json c['children'] - else - result.push [ c['name'], c['url'] ] - end - end - result -end - -def get_bookmarks browser - bookmarks = [] - case browser - when :firefox - # In my nixos dotfiles I hardcode the default profile to $USER.profile, - # which makes this lookup easier, but means this script won't work on any - # other system. - user = ENV['USER'] - ["#{ENV['HOME']}/.mozilla/firefox/#{user}.default", - "#{ENV['XDG_CONFIG_HOME']}/firefox/.mozilla/firefox/#{user}.default", - "#{ENV['XDG_DATA_HOME']}/mozilla/firefox/#{user}.default"].each do |dir| - if Dir.exists? dir - db "#{dir}/places.sqlite", - ["SELECT DISTINCT mb.title, mp.url FROM moz_bookmarks mb", - "INNER JOIN moz_places mp ON mp.id = mb.fk", - "WHERE mb.type = 1 AND mb.title IS NOT NULL", - "ORDER BY mp.frecency DESC", - "LIMIT 200"].join(' ') - end - end - when :brave - f = File.read "#{ENV['XDG_CONFIG_HOME']}/BraveSoftware/Brave-Browser/Default/Bookmarks" - data = JSON.parse f - walk_json data["roots"]["bookmark_bar"]["children"] - when :qutebrowser - bookmarks = File.readlines "#{ENV['XDG_CONFIG_HOME']}/qutebrowser/bookmarks/urls" - bookmarks.map { |s| s.strip.split(' ', 2).reverse } - end -end - -def get_history browser - case browser - when :firefox - # In my nixos dotfiles I hardcode the default profile to $USER.profile, - # which makes this lookup easier, but means this script won't work on any - # other system. - user = ENV['USER'] - ["#{ENV['HOME']}/.mozilla/firefox/#{user}.default", - "#{ENV['XDG_CONFIG_HOME']}/firefox/.mozilla/firefox/#{user}.default", - "#{ENV['XDG_DATA_HOME']}/mozilla/firefox/#{user}.default"].each do |dir| - if Dir.exists? dir - return db "#{dir}/places.sqlite", - ["SELECT title, url", - "FROM moz_places", - "WHERE title<>''", - "ORDER BY last_visit_date DESC"].join(' ') - end - end - return [] - when :brave - db "#{ENV['XDG_CONFIG_HOME']}/BraveSoftware/Brave-Browser/Default/History", - "SELECT title, url FROM urls GROUP BY url ORDER BY last_visit_time DESC LIMIT 200" - when :qutebrowser - db "#{ENV['XDG_DATA_HOME']}/qutebrowser/history.sqlite", - ["SELECT title, url FROM History", - "WHERE title != ''", - "GROUP BY url", - "ORDER BY atime DESC"].join(' ') - end -end - -def list urls - items = urls.map do |x| - x.map! { |x| CGI.escapeHTML x } - [x[0].empty? ? - "#{x[1]}" : - "#{x[0]} #{x[1]}", - x[1]] - end.to_h - selected = rofi items - selected.map { |key| items[key] } -end - -type, browser = *ARGV -browser = (browser || ENV['BROWSER']).to_sym -urls = if type == 'history' - get_history browser -else - get_bookmarks browser -end -urls = list urls -if urls.empty? - puts "No URL selected. Aborting..." - exit 1 -end -Process.detach fork { exec ENV['BROWSER'], *urls } diff --git a/bin/rofi/bwmenu b/bin/rofi/bwmenu deleted file mode 100755 index b43cb375..00000000 --- a/bin/rofi/bwmenu +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -p ruby_2_7 -i "ruby -S" - -# A rofi client for vaultwarden. Similar to passmenu, but uses rofi. (Badly) -# written in ruby because data persistence and frontend logic would be a pain to -# write in bash or zsh. I'll refactor this later perhaps. Maybe. - -require 'shellwords' -require 'json' -require 'optparse' -require 'uri' -require 'base64' -require 'fileutils' - -PersistentData = Struct.new(:path, :ttl, :pid, :data) do - DATADIR = "#{ENV['XDG_DATA_HOME']}/bwmenu" - - def self.load name, ttl: nil - path = "#{DATADIR}/#{name}" - data = JSON::load(Base64.decode64(File.read(path))) if File.exists?(path) - d = PersistentData.new *(data || {}).values - d.path = path - d.ttl = ttl - d - end - - def expire - File.delete(self.path) if File.exists?(self.path) - end - - def save data = nil, onfinish = nil - self.data = data if data - FileUtils.mkdir_p DATADIR unless File.directory?(DATADIR) - File.open(self.path, 'w') do |f| - f.chmod 0600 - f.write Base64.encode64(self.to_h.to_json) - end - if self.pid and system("ps -f p #{self.pid}") - Process.kill self.pid - end - if self.ttl - self.pid = fork do - Signal.trap('TERM') { throw :terminate } - catch :terminate do - sleep self.ttl - end - onfinish.call(self, data) if onfinish.respond_to? :call - self.expire - end - end - end -end - -module BW - extend self - - EXE = {} - def self.bin exe - EXE[exe] = `which #{exe} 2>/dev/null`.rstrip unless EXE[exe] - raise "Couldn't find #{exe} in PATH" if EXE[exe].empty? - EXE[exe] - end - - def self.sh *args, input: nil, sudo: false, nooutput: false - exe, *args = args.flatten.compact.map(&:to_s) - bin exe - cmd = [sudo ? "sudo" : nil, exe, *args.shelljoin].compact.join(' ') - $stderr.puts "$ #{cmd}" - if input - IO.popen(cmd, "r+") do |pipe| - pipe.puts input - pipe.close_write - (pipe.gets || "").rstrip unless nooutput - end - else - (`#{cmd}` || "").rstrip - end - end - - def self.rofi items, *args - input = items.keys.join("\n") if items - result = sh(['rofi', '-dmenu', '-markup-rows', - '-theme', 'theme/passmenu.rasi', - *args], - input: input) - if items - items[result] - else - result - end - end - - def self.notify message, title: nil, urgency: "normal" - sh 'notify-send', '-u', urgency, '-a', "Vaultwarden", *[title, message].compact - end - - def self.error message - $stderr.puts message - notify message, urgency: 'low' - exit 1 - end - - def self.bw *args - sh [:bw, '--session', @@session_id, *args] - end - - def self.xclip *args, **opts - sh :xclip, '-selection', 'clipboard', *args, **opts - end - - @@session = nil - @@session_id = nil - def self.run argv - opts = {} - OptionParser.new do |opt| - opt.banner = "Usage: bwmenu [options] [URL]" - opt.on '--autolock TTL', "How long to keep the vault open" - opt.on '--autoclear TTL' "How long to keep secrets in the clipboard" - opt.on '--debug', "Be more verbose" - opt.on '-f', '--field FIELD', "Extract specific field from selected entry; accepts 'whole' for whole entry" - opt.on '-o', '--output', "Write output to stdout rather than the clipboard" - opt.on '--select', "Select first entry" - opt.on '--select-if-only', "Select first entry if only entry" - opt.on '--default ID', "Highlight item with ID by default" - opt.on '-r', "Resume where you last left off" - end.parse! argv, into: opts - - clipboard_ttl = opts[:autoclear] || 20 - vault_ttl = opts[:autolock] || 900 - - @@session = PersistentData.load :session, ttl: vault_ttl - if @@session.data - sid, data = @@session.data - @@session_id = sid - else - pass = rofi nil, %w{-p Master\ Password -password -lines 0} - error "No password given. Aborting..." if pass.empty? - sid = sh [:bw, :unlock, '--raw', pass] - error "Failed to unlock vault. Aborting..." unless $?.success? - @@session_id = sid - data = JSON.parse(bw(:list, :items)) - @@session.save [sid, data] - end - raise "No session ID" unless @@session_id - - last = PersistentData.load :last_id - last_id, last_field = last.data if last - if opts[:r] and last_id.data - selected = data.find { |u| u['id'] == last_id } - else - select_type = opts[:"select-if-only"] ? :if_only : opts[:select] - selected = list_items data, argv.first, - default: opts[:default], - select: select_type - end - - begin - error "Nothing selected. Aborting..." if selected.empty? - last_id = selected['id'] - item = show_item selected, field: opts[:field] - if not item - error "Nothing selected. Aborting..." if selected.empty? - elsif item.respond_to? :call - item.call - elsif opts[:output] - puts item.rstrip - else - notify "Copied to clipboard for #{clipboard_ttl} seconds" - xclip '-in', input: item.rstrip, nooutput: true - clipboard = PersistentData.load :clipboard, ttl: clipboard_ttl - clipboard.save( - item.rstrip, - lambda { |_, data| xclip('-in', '/dev/null') if item.rstrip == xclip('-out') } - ) - end - ensure - last.save [ last_id, last_field ] - end - end - - # - def list_items data, query = nil, default: nil, select: false - rofiData = {} - rofiData["Sync Vault"] = lambda { notify "Sync vault", bw(:sync) }, - rofiData["Open Vault in Browser"] = lambda { sh ENV['BROWSER'], bw(:config, :server) } - data = data.map do |i| - default_id = i['id'] if i['id'] == default - icon = ["", "", "", ""][i['type'] - 1] - case i['type'] - when 1 # logins - urls = (i['login']['uris'] || []).filter_map do |u| - return unless u['uri'] - uri = URI(u['uri']) - not i['name'].include?((uri.hostname || uri.path).downcase) and - uri.hostname || uri.path - end - subtitle = urls.join ", " if i['type'] == 1 - subtitle = " (#{subtitle})" unless urls.empty? - when 2 # secure notes - when 3 # cards - subtitle = " (#{i['card']['brand'].downcase})" - when 4 # identities - end - ["#{icon} #{i['name']}#{subtitle}", i] - end - case select - when :if_only - return data[0][1] if data.length == 1 - when true - return data[0][1] - end - rofi rofiData.merge(data.to_h), '-p', 'Vaultwarden', '-filter', (query || "") - end - - def show_item item, field: nil - return item.to_json if field == 'whole' - preamble = {} - data = {} - case item['type'] - when 1 # logins - url = item['login']['uris'][0]['uri'] - preamble[" Launch #{url}"] = lambda { sh ENV['BROWSER'], url } - data['Username'] = item['login']['username'] - data['Password'] = item['login']['password'] - data['TOTP'] = bw :get, :totp, url if item['login']['totp'] - return (data[field.capitalize] || item[field]) if field - when 2 # secure notes - data['Notes'] = item['notes'] - return item[field] if field - when 3 # cards - cardInfo = item['card'] - data['Card Type'] = cardInfo['brand'] - data['Card Name'] = cardInfo['cardholderName'] - data['Card Number'] = cardInfo['number'] - data['Expiry Date'] = "#{cardInfo['expMonth']}/#{cardInfo['expYear']}" - data['Security Code'] = cardInfo['code'] - return cardInfo[field] if field - when 4 # identities - item['identity'].each { |k,v| data[k] = v if v } - return item['identity'][field] if field - end - (item['fields'] || []).each do |field| - data[field['name']] = field['value'] - end - maxLength = data.keys.map(&:length).max + 5 - rofiData = {} - preamble.merge(data).each do |label, value| - if value.kind_of? String - valueLabel = value - valueLabel = value.gsub /./, '*' if label == 'Password' - rofiData["%-#{maxLength}s %s" % [label, valueLabel]] = value - else - rofiData[label] = value - end - end - rofi rofiData, '-p', item['name'] - end -end - -BW.run ARGV.dup diff --git a/bin/rofi/filemenu b/bin/rofi/filemenu deleted file mode 100755 index f5ee1fba..00000000 --- a/bin/rofi/filemenu +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env sh -cd $HOME -DIR="$(fd -L -d 4 --type d . | rofi -dmenu -i -p "~/" -theme theme/filemenu.rasi)" -if [ -d "$DIR" ]; then - cd "$DIR" - if [[ $1 == "-x" ]]; then - scratch - else - xst - fi -fi diff --git a/bin/rofi/passmenu b/bin/rofi/passmenu deleted file mode 100755 index bdca124e..00000000 --- a/bin/rofi/passmenu +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash - -# Prompts for a pass entry, then for a specific field. Similar to passmenu, but -# uses rofi, and can resume from a previous session. -# -# Example: passmenu [RESUME] - -ROFI_CMD='rofi -dmenu -theme theme/passmenu.rasi' -MSG_CMD='notify-send' -set -e -shopt -s nullglob globstar - -for prog in xclip pass; do - if ! command -v "$prog" >/dev/null; then - >&2 echo "$prog not installed, aborting" - exit 1 - fi -done - -if [[ $1 == -r ]]; then - resume=1; shift -fi - -url= -# Get qutebrowser's current url -win=$(xdotool getactivewindow) -if [[ -n $win ]]; then - winname=$(xdotool getwindowname $win) - if [[ $winname =~ " - Mozilla Firefox$" ]]; then - url=${winname% - Mozilla*} - url=${url##* - } - while (( ${#url//[^.]/} > 1 )); do - url=${url#*.} - done - fi -fi - -LAST_ENTRY_FILE=/tmp/_upm -if [[ -n $resume && -f $LAST_ENTRY_FILE ]]; then - entry="$(<$LAST_ENTRY_FILE)" -else - prefix=${PASSWORD_STORE_DIR-~/.password-store} - password_files=( "$prefix"/**/*.gpg ) - password_files=( "${password_files[@]#"$prefix"/}" ) - password_files=( "${password_files[@]%.gpg}" ) - entry=$(printf "%s\n" "${password_files[@]}" | $ROFI_CMD -p "..." -filter "$url") -fi - -if [[ -z $entry ]]; then - $MSG_CMD "Error!" "Failed to select $entry" - exit 1 -fi - -echo "$entry" >/tmp/_upm -secrets="$(pass show "$entry")" -if [[ -n $secrets ]]; then - fields=$(awk -F': ' 'NR>1 && !/^otpauth:/ {print $1}' <<<"$secrets") - field=$(printf "password\n%s\notp\n" "${fields[@]}" | $ROFI_CMD -p "$entry") - case $field in - password) pass -c "$entry" ;; - otp) printf "%s" "$(pass otp -c "$entry")" ;; - *) printf "%s" "$(awk -v "key=$field:" '$1 == key {print $2}' <<<"$secrets")" | xclip -selection clipboard -in ;; - esac - $MSG_CMD "Success!" "Copied $entry/$field to clipboard for 45s" -else - $MSG_CMD "Error!" "Failed to retrieve $entry" - exit 2 -fi diff --git a/bin/rofi/powermenu b/bin/rofi/powermenu deleted file mode 100755 index daeb1dc7..00000000 --- a/bin/rofi/powermenu +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env sh - -rofi_command="rofi -theme theme/powermenu.rasi" - -### Options ### -power_off="\tShutdown" -reboot="\tReboot" -lock="\tLock" -suspend="鈴\tSleep" -log_out="\tLogout" -# Variable passed to rofi -options="$power_off\n$reboot\n$lock\n$suspend\n$log_out" - -case "$(echo -e "$options" | $rofi_command -dmenu -selected-row 2)" in - $power_off) - systemctl poweroff - ;; - $reboot) - systemctl reboot - ;; - $lock) - zzz - ;; - $suspend) - dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause - systemctl suspend - ;; - $log_out) - bspc quit - ;; -esac diff --git a/bin/rofi/spotifymenu b/bin/rofi/spotifymenu deleted file mode 100644 index e69de29b..00000000 diff --git a/bin/rofi/windowmenu b/bin/rofi/windowmenu deleted file mode 100755 index a0128aac..00000000 --- a/bin/rofi/windowmenu +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -rofi -show window \ - -show-icons \ - -theme theme/windowmenu.rasi diff --git a/bin/scratch b/bin/scratch deleted file mode 100755 index 93e5019f..00000000 --- a/bin/scratch +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# Toggle a scratch terminal window. A scratch terminal is a disposable terminal -# for one-off, quick commands that don't warrant a dedicated terminal. - -SCRID=scratch -CMD=${1:-'tmux new-session -A -s scratch -n scratch'} -focused=$(xdotool getactivewindow) -scratch=$(xdotool search --onlyvisible --classname $SCRID) -if [[ -n $scratch ]]; then - if [[ $focused == $scratch ]]; then - xdotool windowkill $scratch - else - xdotool windowactivate $scratch - fi -elif command -v urxvt >/dev/null; then - urxvt -name $SCRID \ - -e $SHELL -c "$CMD" -elif command -v xst >/dev/null; then - xst -t $SCRID -n $SCRID -c $SCRID \ - -f "$(xrdb -query | grep 'scratch\.font' | cut -f2)" \ - -e $SHELL -c "$CMD" -else - >&2 echo "No shell to launch the scratch terminal with" - exit 1 -fi diff --git a/bin/scrcap b/bin/scrcap deleted file mode 100755 index 5304ba87..00000000 --- a/bin/scrcap +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -i bash -p maim slop - -# A script that takes a screenshot (prompts you for what region/window to -# capture) and stores it in the clipboard. - -tmp=$(mktemp) -trap "rm -f '$tmp'" EXIT - -# Delay for long enough that we can refocus the targeted window -if maim --delay=${2:-1} -us >"$tmp"; then - xclip -selection clipboard -t image/png "$tmp" && - notify-send "Screenshot saved" "Copied image to clipboard" -else - notify-send -u low "Aborted screenshot" -fi diff --git a/bin/scrrec b/bin/scrrec deleted file mode 100755 index a333674d..00000000 --- a/bin/scrrec +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env cached-nix-shell -#! nix-shell -i bash -p ffmpeg slop - -# Select a region and record it. -# -# If given a gif, it will record an mp4 and convert it afterwards using the -# mov2gif script included in this repo (which is powered by gifsicle and -# ffmpeg). -# -# Usage: scrrec somefile.mp4 -# scrrec another.gif - -is_script= -geom= -delay=1 -count=3 -fps=30 -stopfile=/tmp/_stop -while getopts c:d:f:g:ps opt; do - case $opt in - c) count=$OPTARG ;; - d) delay="$OPTARG" ;; - f) fps=$OPTARG ;; - g) geom="$OPTARG" ;; - p) picom= ;; - s) is_script=1 ;; - esac -done -shift $((OPTIND-1)) - -## -select-region() { - if [[ $geom ]]; then - echo "${geom//[x+]/ }" - else - slop -nof "%w %h %x %y" - fi -} - -countdown() { - if (( count > 0 )); then - for ((i=count;i>0;i--)); do - if [[ $is_script ]]; then - notify-send -u critical -t 1000 "Recording in $i" - else - echo "Recording in $i" - fi - sleep 1 - done - elif [[ $is_script ]]; then - notify-send -u critical "Starting recording..." - else - echo "Started recording..." - fi -} - -recording-start() { - local ffmpeg_opts="-y -f x11grab -show_region 1 -ss $delay -s ${4}x${5} -i :0.0+${2},${3} -framerate ${fps}" - local dest=${1:-./rec.mp4} - local mp4dest= - [[ $dest == *.gif ]] && mp4dest="${dest%.*}.mp4" - countdown - ffmpeg $ffmpeg_opts "${mp4dest:-$dest}" & - pid=$! - echo $pid >$stopfile - wait $pid - rm -f $stopfile - if [[ -f "$mp4dest" ]]; then - mov2gif "$mp4dest" "$dest" && rm -fv "$mp4dest" - fi - echo -n "$dest" | xclip -selection clipboard -in - notify-send "Screencast successful" "Saved to $dest\nAnd copied to your clipboard!" -} - - -# If a recording session is already active, stop that one. -if [[ -n "$is_script" && -f "$stopfile" ]]; then - kill $(cat $stopfile) - echo "Stopped previous recording" - exit 0 -fi - -read -r W H X Y < <(select-region) -[[ -z "$W$H$X$Y" ]] && exit 1 - -# picom with blur and/or transparencies cause unbearable flickering in -# recordings, so temporarily disable it. -picom= -if systemctl is-enabled --user picom >/dev/null; then - systemctl --user stop picom - picom=1 -fi -cleanup() { [[ $picom ]] && systemctl --user start picom; } -trap cleanup EXIT - -# Let 'er rip -recording-start "$1" "$X" "$Y" "$W" "$H" - -# vim:set ft=sh shiftwidth=2: diff --git a/bin/since b/bin/since deleted file mode 100755 index ffe053e2..00000000 --- a/bin/since +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env zsh -set -e -(( $# > 0 )) || exit - -# Displays the time since $1 in a human readable format (e.g. 4h 25m 55s). If -# given a file, the modified time is used. If $1 == "--", then this script acts -# as a converter, converting $2 into human a readable format, e.g. since -- 72 -# #=> 1m 12s - -# TODO: A help fallback -# TODO: Options parsing? - -# If given a file, give time since last modification -(( $# == 1 )) && [[ -f $1 ]] && arg=reference || arg=date - -if [[ $1 == -- ]]; then - t="$2" -else - now=$(date +%s) - then=$(date --$arg="$*" +%s) - - t=$(( now - then )) -fi - -# Bash doesn't support floating point arithmetic like zsh does, so use bc to do -# our arithmetic. -zmodload zsh/mathfunc -t=$(( abs(t) )) -weeks=$(( t / 60 / 60 / 24 / 7 )) -days=$(( t / 60 / 60 / 24 % 7 )) -hours=$(( t / 60 / 60 % 24 )) -minutes=$(( t / 60 % 60 )) -seconds=$(( t % 60 )) -(( weeks > 0 )) && echo -n "${weeks}w " -(( days > 0 )) && echo -n "${days}d " -(( hours > 0 )) && echo -n "${hours}h " -(( minutes > 0 )) && echo -n "${minutes}m " -echo -n "${seconds}s" diff --git a/bin/spell b/bin/spell deleted file mode 100755 index a1d0ea82..00000000 --- a/bin/spell +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -# Find the correct spelling of a word. Uses (and requires) fzf to select the -# correct word. This output can be piped to something like dict to find -# definitions/synonyms. -# -# Requires: aspell, fzf -# Usage: spell mispeling -# Example: dict $(spell mispeling) - -result=$(echo "$@" | aspell -a | tail -n-2) -if [[ "$result" == '*' ]]; then - echo "$@" -else - words=$(echo "$result" | sed $'s/[:,] /\\\n/g' | tail -n +2) - if (( $(wc -l <<< "$words") > 1 )) && command -v sk >/dev/null; then - fzf <<< "$words" - else - echo "$words" - fi -fi diff --git a/bin/timein b/bin/timein deleted file mode 100755 index c530a245..00000000 --- a/bin/timein +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -open=open -[[ $OSTYPE == linux* ]] && open=xdg-open - -$open https://time.is/$1 2>/dev/null & diff --git a/bin/zzz b/bin/zzz deleted file mode 100755 index 99d90d79..00000000 --- a/bin/zzz +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -# If -f, then put computer to sleep. -# Otherwise, lock screen and turn off monitor. - -if [[ $1 == -h ]]; then - bin=${0##*/} - echo "Usage: $bin [-f]" - echo - echo " $bin # put display to sleep" - echo " $bin -f # put computer to sleep" -elif [[ $1 == -f ]]; then - echo "Going to sleep..." - systemctl suspend -else - echo "Shutting my eyes..." - if command -v slock >/dev/null; then - pgrep slock >/dev/null || slock & - fi - sleep 1 - xset dpms force off -fi diff --git a/box.nix b/box.nix new file mode 100644 index 00000000..553460ae --- /dev/null +++ b/box.nix @@ -0,0 +1,28 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./common.nix + ./mossnet.nix + ]; + + users.extraUsers."anish".extraGroups = [ "jackaudio" ]; + +# services.xserver = { +# enable = true; +# displayManager.gdm.enable = true; +# desktopManager.gnome3.enable = true; +# }; + + # task whisperer broken + #nixpkgs.config.allowBroken = true; + + # virtual box + virtualisation.virtualbox.host.enable = true; + + # ErgoDox Firmware (doesn't compile) + # environment.systemPackages = with pkgs; [ + # qmk_firmware + # ]; +} + diff --git a/hosts/common.nix b/common.nix similarity index 58% rename from hosts/common.nix rename to common.nix index 3ce7a772..0790f579 100644 --- a/hosts/common.nix +++ b/common.nix @@ -1,14 +1,16 @@ { config, pkgs, ... }: { -# imports = [ -# ./nvim.nix + imports = [ + ./nvim.nix # ./unstable.nix -# ]; + ]; environment.systemPackages = with pkgs; [ + tailscale htop + fzf iftop wget curl @@ -16,6 +18,7 @@ bat fd ag + wpa_supplicant tcpdump whois mtr @@ -27,51 +30,52 @@ zip unzip rsync - #tmux + tmux pwgen glow + jq gitAndTools.gitFull #neovim defined in ./nvim.nix - #firefox - #fractal - #pinentry_gnome + # wofi + # firefox + # fractal + # pinentry_gnome + pinentry_curses pass gcc less - mpv - zathura + # mpv + # zathura #qmk_firmware + python3 gdb - vcv-rack + # vcv-rack #xdotool #neofetch #calibre #openvpn - gimp + #gimp xxd - kitty + # tilix + # kitty taskwarrior - #gnupg + gnupg openjdk glslviewer - filezilla - signal-desktop - #wire-desktop - #tdesktop - #feedreader - newsflash - syncthing + #filezilla + # signal-desktop + # wire-desktop + # tdesktop + # feedreader + #newsflash +# syncthing dijo - #kdeconnect #ssb-patchwork - #gnome3.gnome-tweaks - #gnome3.pomodoro - #gnomeExtensions.gsconnect - #gnomeExtensions.taskwhisperer + #gnomeExtensions.taskwhisperer #gnome3.networkmanager-openvpn #python3Packages.youtube-dl #appimage-run - #home-manager + home-manager libreoffice fontconfig #hugo @@ -82,14 +86,18 @@ supercollider haskellPackages.tidal pandoc + # calibre ]; programs.bash.enableCompletion = true; + programs.gnupg.agent.enable = true; + programs.gnupg.agent.pinentryFlavor = "curses"; + programs.gnupg.agent.enableSSHSupport = true; # needed for vcv-rack nixpkgs.config.allowUnfree = true; - #system.copySystemConfiguration = true; + system.copySystemConfiguration = true; #services.syncthing = { # enable = true; # openDefaultPorts = true; @@ -99,12 +107,14 @@ #}; #zsh powerlevel10k - programs.zsh.enable = true; - programs.zsh.promptInit = "source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; - users.users.anish.shell = pkgs.zsh; + #programs.zsh.enable = true; + #programs.zsh.promptInit = "source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; + users.users.anish.shell = pkgs.bash; #android programs.adb.enable = true; users.users.anish.extraGroups = ["adbusers"]; + #ssh + services.sshd.enable = true; } diff --git a/config/.gitignore b/config/.gitignore deleted file mode 100644 index 59ba8777..00000000 --- a/config/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -result -result/* diff --git a/config/awesome/init.fnl b/config/awesome/init.fnl deleted file mode 100644 index f9247628..00000000 --- a/config/awesome/init.fnl +++ /dev/null @@ -1,111 +0,0 @@ -(local gears (require :gears)) -(local awful (require :awful)) -(local naughty (require :naughty)) -(require :awful.autofocus) - -(local wincmd (require :commands.window)) -(local tagcmd (require :commands.tag)) -(local pa (require :utils.pulseaudio)) -(local input (require :utils.input)) - - -(fn initialize [bindings] - ;; Error handling - ;; Check if awesome encountered an error during startup and fell back to - ;; another config (This code will only ever execute for the fallback config) - (let [preset { :timeout 0 :bg "#000000" :fg "#ff0000" :max_height 1080 }] - (when awesome.startup_errors - (naughty.notify {:preset preset - :title "Oops, there were errors during startup!" - :text awesome.startup_errors})) - - (var in-error false) - (awesome.connect_signal - "debug::error" - (fn [] - ;; Make sure we don't go into an endless error loop - (when (not in-error) - (set in-error true) - (naughty.notify {:preset preset - :title "Oops, an error happened!" - :text (tostring err)}) - (naughty.notify {:preset preset - :title "Oops, an error happened!" - :text (tostring err)}) - (set in-error false))))) - - (root.keys bindings.global-keys) - - (naughty.notify {:text "Glorious fennel"}) - (gears.wallpaper.set "#282c34")) - - -(local - bindings - { - :global-keys - (gears.table.join - - (input.key-group - "awesome" - [[:mod] :s hotkeys_popup.show_help "show help"] - [[:mod :shift] :r awesome.restart "reload config"] - ) - - (input.key-group - "exec" - [[:mod] :space (fn [] (awful.util.spawn "rofi -show run")) "app launcher"] - [[:mod] :e (fn [] (awful.util.spawn "emacsclient -c -n -e '(switch-to-buffer nil)'")) "emacs"] - [[:mod] :v (fn [] - (let [option "gopass ls --flat" - prompt "rofi -dmenu -p pass" - action "xargs --no-run-if-empty gopass show -c" - cmd (.. option " | " prompt " | " action)] - (awful.spawn.easy_async_with_shell cmd (fn [])))) - "secret vault"] - [[:mod] :Return (fn [] (awful.spawn "xst")) "open terminal"] - [[] :XF86AudioMute pa.toggle-muted "⏼ audio muted"] - [[] :XF86AudioMicMute pa.toggle-mic-mute "⏼ mic muted"] - [[] :XF86AudioRaiseVolume (fn [] (pa.adjust-volume 5)) "raise volume"] - [[] :XF86AudioLowerVolume (fn [] (pa.adjust-volume -5)) "lower volume"] - ) - - (input.key-group - "client" - [[:mod] :h (fn [] (awful.client.focus.bydirection :left)) "focus left"] - [[:mod] :j (fn [] (awful.client.focus.bydirection :down)) "focus down"] - [[:mod] :k (fn [] (awful.client.focus.bydirection :up)) "focus up"] - [[:mod] :l (fn [] (awful.client.focus.bydirection :right)) "focus right"] - [[:mod] :n (fn [] (awful.client.focus.byidx 1)) "focus next"] - [[:mod] :p (fn [] (awful.client.focus.byidx -1)) "focus previous"] - [[:mod :shift] :j (fn [] (awful.client.swap.byidx 1)) "swap next with previous"] - [[:mod :shift] :k (fn [] (awful.client.swap.byidx -1)) "swap next with previous"] - ) - ) - - :client-keys - (gears.table.join - (input.key-group - "client" - [[:mod] :n wincmd.minimize "minimize"] - [[:mod] :t wincmd.toggle-ontop "⏼ keep on top"] - [[:mod] :m wincmd.toggle-maximized "⏼ maximize"] - [[:mod] :f wincmd.toggle-fullscreen "⏼ fullscreen"] - [[:mod :ctrl] :space awful.client.floating.toggle "⏼ floating"] - [[:mod :ctrl] :Return wincmd.move-to-master "move to master"] - [[:mod :ctrl] :m wincmd.toggle-maximize-vertical "⏼ max vertically"] - [[:mod :shift] :m wincmd.toggle-maximize-horizontal "⏼ max horizontally"] - [[:mod :shift] :c wincmd.close "close"] - )) - - :client-buttons - (gears.table.join - (input.mousebind [] input.left-click client.mouse-raise) - (input.mousebind [:mod] input.left-click client.mouse-drag-move) - (input.mousebind [:mod] input.right-click client.mouse-drag-resize) - ) - }) - - -;; -(initialize bindings) diff --git a/config/bspwm/bspwmrc b/config/bspwm/bspwmrc deleted file mode 100755 index b942f75a..00000000 --- a/config/bspwm/bspwmrc +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -# case $HOSTNAME in -# kuro) export LAN=eno1 ;; -# shiro) export LAN=wlp3s0 ;; -# esac - -export MONITOR=$(xrandr -q | grep primary | cut -d' ' -f1) -export MONITORS=( $(xrandr -q | grep ' connected' | cut -d' ' -f1) ) -MONITOR=${MONITOR:-${MONITORS[0]}} - -# Only have workspaces for primary monitor -bspc monitor $MONITOR -d {1,2,3,4,5} - -bspc config remove_disabled_monitors true -bspc config remove_unplugged_monitors true - - -# Rules -bspc rule -r '*' - -bspc rule -a Pinentry state=floating center=on -bspc rule -a Emacs split_ratio=0.28 state=tiled -bspc rule -a Firefox split_ratio=0.32 -bspc rule -a feh state=fullscreen -bspc rule -a 'Emacs:org*' state=floating -bspc rule -a 'Emacs:scratch' state=floating -bspc rule -a 'Emacs:emacs-everywhere' state=floating sticky=on -bspc rule -a '*:scratch' state=floating sticky=on center=on border=off rectangle=1000x800+0+0 - -# -for file in $XDG_CONFIG_HOME/bspwm/rc.d/*; do - source "$file" -done diff --git a/config/docker/aliases.zsh b/config/docker/aliases.zsh deleted file mode 100644 index 2c026a79..00000000 --- a/config/docker/aliases.zsh +++ /dev/null @@ -1,14 +0,0 @@ -alias dk=docker -alias dkc=docker-compose -alias dkm=docker-machine -alias dkl='dk logs' -alias dkcl='dkc logs' - -dkclr() { - dk stop $(docker ps -a -q) - dk rm $(docker ps -a -q) -} - -dke() { - dk exec -it "$1" "${@:1}" -} diff --git a/config/emacs/aliases.zsh b/config/emacs/aliases.zsh deleted file mode 100644 index 13931848..00000000 --- a/config/emacs/aliases.zsh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env zsh - -e() { pgrep emacs && emacsclient -n "$@" || emacs -nw "$@" } -ediff() { emacs -nw --eval "(ediff-files \"$1\" \"$2\")"; } -eman() { emacs -nw --eval "(switch-to-buffer (man \"$1\"))"; } -ekill() { emacsclient --eval '(kill-emacs)'; } diff --git a/config/gimp/menurc b/config/gimp/menurc deleted file mode 100644 index 2dbd2812..00000000 --- a/config/gimp/menurc +++ /dev/null @@ -1,1344 +0,0 @@ -; gimp-2.10 GtkAccelMap rc-file -*- scheme -*- -; this file is an automated accelerator map dump -; -; (gtk_accel_path "/file/file-menu" "") -; (gtk_accel_path "/tools/tools-opacity-set-to-default" "") -; (gtk_accel_path "/context/context-background-value-decrease" "") -; (gtk_accel_path "/vectors/vectors-color-tag-brown" "") -; (gtk_accel_path "/tools/tools-opacity-increase-skip" "greater") -(gtk_accel_path "/tools/tools-vector" "p") -; (gtk_accel_path "/view/view-scroll-left" "") -; (gtk_accel_path "/vectors/vectors-color-tag-orange" "") -; (gtk_accel_path "/tools/tools-airbrush-rate-increase" "") -; (gtk_accel_path "/tools/tools-spacing-set-to-default" "") -; (gtk_accel_path "/view/view-show-statusbar" "") -; (gtk_accel_path "/layers/layers-opacity-transparent" "") -; (gtk_accel_path "/image/image-convert-u8" "") -; (gtk_accel_path "/view/view-zoom-8-1-accel" "KP_4") -; (gtk_accel_path "/context/context-background-value-set" "") -; (gtk_accel_path "/context/context-paint-mode-menu" "") -; (gtk_accel_path "/filters/filters-motion-blur-linear" "") -; (gtk_accel_path "/filters/filters-gegl-graph" "") -; (gtk_accel_path "/context/context-brush-select-set" "") -; (gtk_accel_path "/edit/edit-copy" "c") -; (gtk_accel_path "/context/context-brush-shape-circle" "") -; (gtk_accel_path "/windows/windows-display-0001" "") -(gtk_accel_path "/plug-in/plug_in_bump_map" "m") -; (gtk_accel_path "/vectors/vectors-lock-content" "") -; (gtk_accel_path "/context/context-opacity-opaque" "") -; (gtk_accel_path "/view/view-color-management-menu" "") -; (gtk_accel_path "/filters/filters-spherize" "") -; (gtk_accel_path "/channels/channels-new-last-values" "") -; (gtk_accel_path "/vectors/vectors-merge-visible" "") -; (gtk_accel_path "/plug-in/plug-in-spheredesigner" "") -; (gtk_accel_path "/plug-in/script-fu-slide" "") -; (gtk_accel_path "/filters/filters-curves" "") -; (gtk_accel_path "/channels/channels-lock-position" "") -; (gtk_accel_path "/context/context-brush-menu" "") -; (gtk_accel_path "/context/context-foreground-blue-decrease" "") -; (gtk_accel_path "/context/context-colors-menu" "") -; (gtk_accel_path "/edit/edit-undo-clear" "") -; (gtk_accel_path "/context/context-gradient-select-first" "") -; (gtk_accel_path "/layers/layers-color-tag-brown" "") -; (gtk_accel_path "/plug-in/plug-in-imagemap" "") -; (gtk_accel_path "/filters/filters-recent-menu" "") -; (gtk_accel_path "/plug-in/plug-in-map-object" "") -; (gtk_accel_path "/layers/layers-text-along-vectors" "") -; (gtk_accel_path "/dialogs/dialogs-symmetry" "") -; (gtk_accel_path "/view/view-zoom-revert" "grave") -; (gtk_accel_path "/plug-in/plug-in-script-fu-console" "") -; (gtk_accel_path "/filters/filters-plasma" "") -; (gtk_accel_path "/view/view-color-management-enable" "") -(gtk_accel_path "/dialogs/dialogs-undo-history" "F9") -; (gtk_accel_path "/edit/edit-cut" "x") -; (gtk_accel_path "/context/context-foreground-value-increase-skip" "") -; (gtk_accel_path "/plug-in/script-fu-addborder" "") -; (gtk_accel_path "/view/view-display-intent-absolute-colorimetric" "") -; (gtk_accel_path "/file/file-export-to" "") -; (gtk_accel_path "/vectors/vectors-color-tag-menu" "") -; (gtk_accel_path "/context/context-background-red-decrease" "") -; (gtk_accel_path "/tools/tools-airbrush-rate-maximum" "") -; (gtk_accel_path "/tools/tools-operation" "") -; (gtk_accel_path "/view/view-fullscreen" "F11") -; (gtk_accel_path "/tools/tools-spacing-minimum" "") -; (gtk_accel_path "/context/context-brush-radius-decrease-skip" "") -; (gtk_accel_path "/view/view-zoom-2-1" "2") -(gtk_accel_path "/dialogs/dialogs-brushes" "") -; (gtk_accel_path "/context/context-foreground-blue-maximum" "") -; (gtk_accel_path "/context/context-foreground-red-increase" "") -; (gtk_accel_path "/view/view-snap-to-vectors" "") -(gtk_accel_path "/image/image-properties" "F8") -; (gtk_accel_path "/drawable/drawable-rotate-270" "") -; (gtk_accel_path "/plug-in/script-fu-predator" "") -; (gtk_accel_path "/tools/tools-hardness-increase-percent" "") -; (gtk_accel_path "/plug-in/plug-in-colorify" "") -(gtk_accel_path "/view/view-show-grid" "apostrophe") -; (gtk_accel_path "/image/image-color-management-enabled" "") -; (gtk_accel_path "/tools/tools-angle-increase" "") -; (gtk_accel_path "/vectors/vectors-color-tag-violet" "") -; (gtk_accel_path "/context/context-background-saturation-decrease-skip" "") -; (gtk_accel_path "/layers/layers-composite-mode-union" "") -; (gtk_accel_path "/channels/channels-color-tag-blue" "") -; (gtk_accel_path "/windows/windows-dialogs-menu" "") -; (gtk_accel_path "/tools/tools-gegl" "") -; (gtk_accel_path "/tool-options/tool-options-reset" "") -; (gtk_accel_path "/layers/layers-delete" "") -; (gtk_accel_path "/view/view-display-intent-menu" "") -; (gtk_accel_path "/vectors/vectors-edit" "") -; (gtk_accel_path "/filters/filters-illusion" "") -; (gtk_accel_path "/context/context-colormap-foreground-previous" "") -; (gtk_accel_path "/layers/layers-lock-content" "") -; (gtk_accel_path "/file/file-create-menu" "") -(gtk_accel_path "/plug-in/plug_in_iwarp" "x") -; (gtk_accel_path "/tools/tools-spacing-decrease-skip" "") -; (gtk_accel_path "/filters/filters-dropshadow" "") -; (gtk_accel_path "/layers/layers-alpha-selection-add" "") -; (gtk_accel_path "/context/context-background-green-increase" "") -; (gtk_accel_path "/plug-in/script-fu-make-brush-rectangular-feathered" "") -; (gtk_accel_path "/patterns/patterns-delete" "") -; (gtk_accel_path "/context/context-brush-radius-menu" "") -(gtk_accel_path "/view/view-scroll-page-right" "Page_Down") -; (gtk_accel_path "/layers/layers-blend-space-menu" "") -; (gtk_accel_path "/dockable/dialogs-histogram" "") -; (gtk_accel_path "/layers/layers-opacity-opaque" "") -; (gtk_accel_path "/context/context-background-saturation-increase" "") -; (gtk_accel_path "/dialogs/dialogs-dynamics-editor" "") -; (gtk_accel_path "/layers/layers-composite-space-menu" "") -(gtk_accel_path "/file/file-revert" "F12") -; (gtk_accel_path "/filters/filters-fattal-2002" "") -; (gtk_accel_path "/tools/tools-color-average-radius-set" "") -; (gtk_accel_path "/filters/filters-distorts-menu" "") -(gtk_accel_path "/tools/tools-fuzzy-select" "w") -; (gtk_accel_path "/documents/documents-reload-previews" "") -; (gtk_accel_path "/debug/debug-show-image-graph" "") -; (gtk_accel_path "/brushes/brushes-show-in-file-manager" "") -; (gtk_accel_path "/context/context-brush-angle-maximum" "") -; (gtk_accel_path "/view/view-zoom-selection" "") -(gtk_accel_path "/tools/tools-cage" "") -; (gtk_accel_path "/file/file-open-location" "") -; (gtk_accel_path "/plug-in/plug-in-blur" "") -; (gtk_accel_path "/layers/layers-opacity-decrease" "") -; (gtk_accel_path "/context/context-foreground-hue-decrease-skip" "") -; (gtk_accel_path "/plug-in/plug-in-oilify" "") -(gtk_accel_path "/layers/layers-mask-add" "o") -; (gtk_accel_path "/filters/filters-diffraction-patterns" "") -; (gtk_accel_path "/image/image-convert-rgb" "") -; (gtk_accel_path "/tools/tools-spacing-decrease-percent" "") -; (gtk_accel_path "/context/context-gradient-select-last" "") -; (gtk_accel_path "/plug-in/plug-in-emboss" "") -; (gtk_accel_path "/file/file-create-template" "") -; (gtk_accel_path "/vectors/vectors-color-tag-yellow" "") -; (gtk_accel_path "/layers/layers-preserve-transparency" "") -; (gtk_accel_path "/dockable/dockable-view-type-grid" "") -; (gtk_accel_path "/view/view-navigation-window" "") -; (gtk_accel_path "/windows/windows-tabs-position-bottom" "") -; (gtk_accel_path "/context/context-brush-angle-set" "") -; (gtk_accel_path "/documents/documents-raise-or-open" "") -; (gtk_accel_path "/context/context-background-blue-decrease" "") -; (gtk_accel_path "/context/context-foreground-green-set" "") -(gtk_accel_path "/tools/tools-levels" "l") -; (gtk_accel_path "/plug-in/plug-in-script-fu-server" "") -; (gtk_accel_path "/dock/dock-move-to-screen-menu" "") -; (gtk_accel_path "/windows/windows-tabs-position-right" "") -; (gtk_accel_path "/plug-in/script-fu-line-nova" "") -; (gtk_accel_path "/layers/layers-color-tag-blue" "") -; (gtk_accel_path "/tools/tools-object-1-set" "") -; (gtk_accel_path "/dialogs/dialogs-indexed-palette" "") -; (gtk_accel_path "/channels/channels-new" "") -; (gtk_accel_path "/edit/edit-named-paste" "") -; (gtk_accel_path "/tools/tools-hardness-minimum" "") -; (gtk_accel_path "/plug-in/color-decode-ycocg" "") -; (gtk_accel_path "/filters/filters-menu" "") -; (gtk_accel_path "/tools/tools-opacity-set" "") -; (gtk_accel_path "/dockable/dialogs-toolbox" "b") -; (gtk_accel_path "/plug-in/gimp-help-using-fileformats" "") -; (gtk_accel_path "/edit/edit-strong-redo" "y") -; (gtk_accel_path "/filters/filters-alien-map" "") -; (gtk_accel_path "/plug-in/gimp-online-bugs-features" "") -; (gtk_accel_path "/tools/tools-object-2-last" "") -; (gtk_accel_path "/tools/tools-paintbrush-force-set" "") -; (gtk_accel_path "/vectors/vectors-linked" "") -; (gtk_accel_path "/filters/filters-gaussian-blur-selective" "") -; (gtk_accel_path "/filters/filters-unsharp-mask" "") -; (gtk_accel_path "/fonts/fonts-refresh" "") -; (gtk_accel_path "/file/file-open-recent-menu" "") -; (gtk_accel_path "/tools/tools-hardness-decrease" "") -; (gtk_accel_path "/layers/layers-mask-show" "") -; (gtk_accel_path "/view/view-softproof-intent-absolute-colorimetric" "") -; (gtk_accel_path "/brushes/brushes-open-as-image" "") -; (gtk_accel_path "/plug-in/python-fu-palette-offset" "") -; (gtk_accel_path "/tools/tools-angle-decrease" "") -; (gtk_accel_path "/context/context-background-blue-set" "") -; (gtk_accel_path "/plug-in/plug-in-normalize" "") -; (gtk_accel_path "/tools/tools-opacity-increase-percent" "") -; (gtk_accel_path "/context/context-background-value-decrease-skip" "") -; (gtk_accel_path "/patterns/patterns-new" "") -; (gtk_accel_path "/plug-in/script-fu-spinning-globe" "") -; (gtk_accel_path "/windows/windows-menu" "") -; (gtk_accel_path "/tools/tools-object-1-first" "") -; (gtk_accel_path "/image/image-flip-horizontal" "") -; (gtk_accel_path "/plug-in/plug-in-sharpen" "") -; (gtk_accel_path "/tools/tools-force-decrease-percent" "") -; (gtk_accel_path "/context/context-brush-hardness-set" "") -; (gtk_accel_path "/select/select-stroke-last-values" "") -; (gtk_accel_path "/filters/filters-long-shadow" "") -; (gtk_accel_path "/context/context-brush-radius-increase-percent" "") -; (gtk_accel_path "/plug-in/plug-in-animationoptimize-diff" "") -; (gtk_accel_path "/tools/tools-perspective-clone" "") -; (gtk_accel_path "/image/colors-auto-menu" "") -; (gtk_accel_path "/vectors/vectors-selection-to-vectors-advanced" "") -; (gtk_accel_path "/plug-in/script-fu-unsharp-mask" "") -; (gtk_accel_path "/context/context-background-saturation-decrease" "") -(gtk_accel_path "/tools/tools-rect-select" "m") -; (gtk_accel_path "/tools/tools-angle-set-to-default" "") -; (gtk_accel_path "/view/view-zoom-in-skip" "") -; (gtk_accel_path "/filters/filters-semi-flatten" "") -; (gtk_accel_path "/tools/tools-opacity-maximum" "") -; (gtk_accel_path "/dockable/dockable-tab-style-preview-name" "") -; (gtk_accel_path "/plug-in/python-fu-palette-sort" "") -; (gtk_accel_path "/tools/tools-airbrush-flow-decrease" "") -; (gtk_accel_path "/plug-in/plug-in-dog" "") -; (gtk_accel_path "/edit/edit-paste-as-new-layer" "") -; (gtk_accel_path "/channels/channels-visible" "") -; (gtk_accel_path "/debug/debug-mem-profile" "") -; (gtk_accel_path "/context/context-foreground-hue-maximum" "") -; (gtk_accel_path "/tool-options/tool-options-restore-preset-menu" "") -; (gtk_accel_path "/dockable/dialogs-undo-history" "") -; (gtk_accel_path "/tools/tools-paintbrush-hardness-set" "") -; (gtk_accel_path "/filters/filters-stretch-contrast" "") -; (gtk_accel_path "/filters/filters-color-to-alpha" "") -; (gtk_accel_path "/context/context-brush-aspect-maximum" "") -; (gtk_accel_path "/dockable/dialogs-templates" "") -; (gtk_accel_path "/plug-in/script-fu-ripply-anim" "") -(gtk_accel_path "/view/view-show-menubar" "f") -; (gtk_accel_path "/filters/filters-web-menu" "") -; (gtk_accel_path "/dockable/dialogs-cursor" "") -; (gtk_accel_path "/filters/filters-exposure" "") -; (gtk_accel_path "/tools/tools-spacing-increase" "") -; (gtk_accel_path "/tools/tools-foreground-select-brush-size-set" "") -; (gtk_accel_path "/context/context-background-hue-decrease-skip" "") -; (gtk_accel_path "/select/select-shrink" "") -; (gtk_accel_path "/view/view-scroll-horizontal" "") -; (gtk_accel_path "/select/select-fill-last-values" "") -; (gtk_accel_path "/image/image-resize-to-selection" "") -; (gtk_accel_path "/plug-in/script-fu-tile-blur" "") -; (gtk_accel_path "/filters/filters-color-temperature" "") -; (gtk_accel_path "/plug-in/script-fu-paste-as-pattern" "") -; (gtk_accel_path "/tools/tools-paintbrush-aspect-ratio-set" "") -; (gtk_accel_path "/plug-in/plug-in-gfig" "") -; (gtk_accel_path "/context/context-foreground-hue-set" "") -; (gtk_accel_path "/tools/tools-gradient" "g") -(gtk_accel_path "/select/select-none" "d") -; (gtk_accel_path "/edit/edit-named-cut" "") -; (gtk_accel_path "/context/context-palette-select-set" "") -; (gtk_accel_path "/channels/channels-select-next" "") -; (gtk_accel_path "/image/image-precision-menu" "") -; (gtk_accel_path "/layers/layers-mask-menu" "") -(gtk_accel_path "/layers/layers-alpha-selection-replace" "a") -; (gtk_accel_path "/plug-in/gimp-palette-export-php" "") -; (gtk_accel_path "/filters/filters-noise-hsv" "") -; (gtk_accel_path "/filters/filters-noise-simplex" "") -; (gtk_accel_path "/help/help-help" "F1") -; (gtk_accel_path "/context/context-opacity-increase-skip" "") -; (gtk_accel_path "/view/view-padding-color-light-check" "") -; (gtk_accel_path "/context/context-brush-spikes-minimum" "") -; (gtk_accel_path "/plug-in/plug-in-gflare" "") -; (gtk_accel_path "/context/context-brush-aspect-set" "") -; (gtk_accel_path "/plug-in/plug-in-zealouscrop" "") -; (gtk_accel_path "/dockable/dialogs-gradient-editor" "") -; (gtk_accel_path "/tools/tools-color-menu" "") -; (gtk_accel_path "/tools/tools-airbrush-flow-maximum" "") -; (gtk_accel_path "/view/view-flip-horizontally" "") -; (gtk_accel_path "/layers/layers-composite-mode-auto" "") -; (gtk_accel_path "/plug-in/gimp-online-developer-web-site" "") -; (gtk_accel_path "/dockable/dockable-tab-style-name" "") -(gtk_accel_path "/plug-in/plug_in_gauss" "b") -; (gtk_accel_path "/vectors/vectors-raise-to-top" "") -(gtk_accel_path "/view/view-scroll-page-left" "Page_Up") -; (gtk_accel_path "/tools/tools-threshold" "") -; (gtk_accel_path "/filters/filters-threshold" "") -; (gtk_accel_path "/tools/tools-airbrush-flow-set" "") -; (gtk_accel_path "/context/context-brush-spacing-minimum" "") -(gtk_accel_path "/drawable/drawable-invert" "i") -(gtk_accel_path "/layers/layers-select-bottom" "braceleft") -; (gtk_accel_path "/dockable/dockable-tab-style-preview" "") -; (gtk_accel_path "/dockable/dialogs-channels" "") -; (gtk_accel_path "/channels/channels-color-tag-none" "") -(gtk_accel_path "/tools/tools-paintbrush" "b") -; (gtk_accel_path "/vectors/vectors-color-tag-gray" "") -; (gtk_accel_path "/context/context-brush-spacing-increase-skip" "") -; (gtk_accel_path "/vectors/vectors-stroke-last-values" "") -; (gtk_accel_path "/view/view-show-sample-points" "") -; (gtk_accel_path "/documents/documents-remove" "") -; (gtk_accel_path "/dockable/dockable-preview-size-medium" "") -; (gtk_accel_path "/dockable/dialogs-colors" "") -; (gtk_accel_path "/filters/filters-antialias" "") -; (gtk_accel_path "/debug/debug-benchmark-projection" "") -; (gtk_accel_path "/context/context-brush-spikes-decrease" "") -; (gtk_accel_path "/filters/filters-noise-hurl" "") -; (gtk_accel_path "/file/file-save-and-close" "") -(gtk_accel_path "/dialogs/dialogs-document-history" "h") -; (gtk_accel_path "/context/context-opacity-set" "") -; (gtk_accel_path "/plug-in/script-fu-blend-anim" "") -(gtk_accel_path "/view/view-zoom-in" "equal") -; (gtk_accel_path "/plug-in/plug-in-smooth-palette" "") -; (gtk_accel_path "/context/context-swatch-background-set" "") -; (gtk_accel_path "/windows/windows-tab-position" "") -; (gtk_accel_path "/dialogs/dialogs-error-console" "") -; (gtk_accel_path "/view/view-rotate-15" "") -; (gtk_accel_path "/view/view-zoom" "") -; (gtk_accel_path "/view/view-scroll-top-border" "") -; (gtk_accel_path "/layers/layers-new" "n") -; (gtk_accel_path "/plug-in/gimp-palette-export-java" "") -; (gtk_accel_path "/plug-in/script-fu-burn-in-anim" "") -; (gtk_accel_path "/context/context-foreground-blue-increase-skip" "") -; (gtk_accel_path "/tools/tools-paint-menu" "") -; (gtk_accel_path "/plug-in/plug-in-colormap-swap" "") -; (gtk_accel_path "/dockable/dialogs-mypaint-brushes" "") -; (gtk_accel_path "/dockable/dockable-preview-size-menu" "") -; (gtk_accel_path "/image/colors-menu" "") -; (gtk_accel_path "/vectors/vectors-visible" "") -; (gtk_accel_path "/vectors/vectors-lock-position" "") -(gtk_accel_path "/image/image-flatten" "i") -; (gtk_accel_path "/tools/tools-spacing-decrease" "") -; (gtk_accel_path "/filters/filters-dither" "") -; (gtk_accel_path "/plug-in/plug-in-decompose-registered" "") -; (gtk_accel_path "/channels/channels-selection-intersect" "") -; (gtk_accel_path "/plug-in/plug-in-cartoon" "") -; (gtk_accel_path "/view/view-softproof-intent-perceptual" "") -; (gtk_accel_path "/tools/tools-offset" "") -(gtk_accel_path "/edit/edit-clear" "") -; (gtk_accel_path "/image/image-convert-float" "") -; (gtk_accel_path "/view/view-scroll-down" "") -; (gtk_accel_path "/context/context-foreground-green-increase" "") -; (gtk_accel_path "/color-button/color-button-use-white" "") -; (gtk_accel_path "/image/image-scale" "") -; (gtk_accel_path "/tools/tools-aspect-increase-skip" "") -; (gtk_accel_path "/context/context-colormap-background-previous" "") -; (gtk_accel_path "/image/colors-info-menu" "") -; (gtk_accel_path "/plug-in/plug-in-lic" "") -; (gtk_accel_path "/context/context-background-value-increase" "") -(gtk_accel_path "/dialogs/dialogs-channels" "F7") -; (gtk_accel_path "/filters/filters-component-extract" "") -; (gtk_accel_path "/tools/tools-size-maximum" "") -; (gtk_accel_path "/dockable/dialogs-dashboard" "") -; (gtk_accel_path "/vectors/vectors-select-previous" "") -; (gtk_accel_path "/layers/layers-mode-menu" "") -; (gtk_accel_path "/filters/filters-render-nature-menu" "") -; (gtk_accel_path "/layers/layers-color-tag-none" "") -; (gtk_accel_path "/dockable/dialogs-gradients" "g") -; (gtk_accel_path "/tools/tools-heal" "h") -; (gtk_accel_path "/view/view-scroll-right" "") -; (gtk_accel_path "/dialogs/dialogs-cursor" "") -; (gtk_accel_path "/context/context-foreground-saturation-minimum" "") -; (gtk_accel_path "/context/context-background-red-maximum" "") -; (gtk_accel_path "/context/context-brush-spikes-menu" "") -; (gtk_accel_path "/filters/filters-recent-10" "") -; (gtk_accel_path "/plug-in/file-gif-save2" "") -; (gtk_accel_path "/drawable/drawable-flip-horizontal" "") -; (gtk_accel_path "/layers/layers-merge-group" "") -; (gtk_accel_path "/color-button/color-button-use-background" "") -; (gtk_accel_path "/file/file-open" "o") -; (gtk_accel_path "/plug-in/script-fu-font-map" "") -; (gtk_accel_path "/plug-in/python-fu-console" "") -; (gtk_accel_path "/tools/tools-transform-preview-opacity-set" "") -; (gtk_accel_path "/dialogs/dialogs-histogram" "") -; (gtk_accel_path "/view/view-rotate-set-absolute" "") -; (gtk_accel_path "/layers/layers-mask-apply" "") -; (gtk_accel_path "/context/context-brush-radius-increase-less" "") -; (gtk_accel_path "/dialogs/dialogs-brush-editor" "") -; (gtk_accel_path "/context/context-background-saturation-maximum" "") -; (gtk_accel_path "/context/context-foreground-blue-increase" "") -; (gtk_accel_path "/context/context-palette-select-next" "") -(gtk_accel_path "/layers/layers-duplicate" "j") -; (gtk_accel_path "/context/context-palette-foreground-next-skip" "") -; (gtk_accel_path "/layers/layers-mask-selection-add" "") -(gtk_accel_path "/tools/tools-dodge-burn" "o") -; (gtk_accel_path "/edit/edit-copy-visible" "c") -; (gtk_accel_path "/brushes/brushes-duplicate" "") -(gtk_accel_path "/layers/layers-select-previous" "bracketright") -; (gtk_accel_path "/tools/tools-angle-maximum" "") -; (gtk_accel_path "/dockable/dockable-lock-tab" "") -; (gtk_accel_path "/context/context-foreground-value-minimum" "") -; (gtk_accel_path "/file/file-close-all" "w") -; (gtk_accel_path "/dialogs/dialogs-sample-points" "") -; (gtk_accel_path "/layers/layers-opacity-menu" "") -; (gtk_accel_path "/plug-in/plug-in-metadata-editor" "") -; (gtk_accel_path "/tools/tools-angle-increase-percent" "") -; (gtk_accel_path "/plug-in/script-fu-drop-shadow" "") -; (gtk_accel_path "/filters/filters-render-menu" "") -; (gtk_accel_path "/plug-in/plug-in-jigsaw" "") -; (gtk_accel_path "/dockable/dockable-tab-style-menu" "") -(gtk_accel_path "/context/context-brush-hardness-decrease-skip" "braceleft") -; (gtk_accel_path "/plug-in/file-pdf-load" "") -; (gtk_accel_path "/plug-in/script-fu-guides-from-selection" "") -; (gtk_accel_path "/plug-in/script-fu-selection-to-brush" "") -; (gtk_accel_path "/layers/layers-blend-space-rgb-linear" "") -; (gtk_accel_path "/context/context-background-blue-maximum" "") -; (gtk_accel_path "/tools/tools-zoom" "z") -; (gtk_accel_path "/context/context-swatch-foreground-previous-skip" "") -; (gtk_accel_path "/plug-in/plug-in-checkerboard" "") -; (gtk_accel_path "/context/context-background-red-increase" "") -; (gtk_accel_path "/dockable/dockable-popup" "") -; (gtk_accel_path "/dockable/dockable-preview-size-extra-small" "") -; (gtk_accel_path "/filters/filters-render-clouds-menu" "") -; (gtk_accel_path "/context/context-palette-foreground-first" "") -; (gtk_accel_path "/view/view-zoom-4-1" "3") -; (gtk_accel_path "/channels/channels-duplicate" "") -; (gtk_accel_path "/tools/tools-object-2-set" "") -; (gtk_accel_path "/context/context-brush-aspect-menu" "") -; (gtk_accel_path "/context/context-brush-radius-increase" "") -; (gtk_accel_path "/view/view-display-black-point-compensation" "") -; (gtk_accel_path "/tools/tools-size-decrease" "bracketleft") -(gtk_accel_path "/dialogs/dialogs-colors" "F6") -; (gtk_accel_path "/context/context-swatch-background-next" "") -; (gtk_accel_path "/filters/filters-edge" "") -(gtk_accel_path "/image/image-rotate-180" "8") -; (gtk_accel_path "/image/image-new" "n") -; (gtk_accel_path "/tool-options/tool-options-delete-preset-menu" "") -; (gtk_accel_path "/tools/tools-ink-blob-size-set" "") -; (gtk_accel_path "/filters/filters-value-propagate" "") -; (gtk_accel_path "/image/image-color-profile-assign" "") -; (gtk_accel_path "/layers/layers-composite-space-rgb-perceptual" "") -; (gtk_accel_path "/context/context-foreground-green-decrease" "") -; (gtk_accel_path "/layers/layers-scale" "") -; (gtk_accel_path "/layers/layers-transparency-menu" "") -; (gtk_accel_path "/layers/layers-alpha-remove" "") -; (gtk_accel_path "/context/context-pattern-select-set" "") -; (gtk_accel_path "/filters/filters-image-gradient" "") -; (gtk_accel_path "/select/select-all" "a") -; (gtk_accel_path "/plug-in/plug-in-filter-pack" "") -; (gtk_accel_path "/context/context-brush-hardness-maximum" "") -; (gtk_accel_path "/plug-in/plug-in-recompose" "") -; (gtk_accel_path "/view/view-zoom-menu" "") -; (gtk_accel_path "/image/image-convert-u16" "") -; (gtk_accel_path "/filters/filters-kaleidoscope" "") -; (gtk_accel_path "/context/context-colormap-foreground-previous-skip" "") -; (gtk_accel_path "/view/view-snap-to-grid" "") -; (gtk_accel_path "/vectors/vectors-fill" "") -; (gtk_accel_path "/view/view-color-management-reset" "") -; (gtk_accel_path "/context/context-background-green-set" "") -; (gtk_accel_path "/tools/tools-force-maximum" "") -; (gtk_accel_path "/context/context-foreground-saturation-increase" "") -; (gtk_accel_path "/dockable/dialogs-device-status" "") -; (gtk_accel_path "/edit/edit-named-copy" "") -; (gtk_accel_path "/filters/filters-video-degradation" "") -; (gtk_accel_path "/edit/edit-paste-as-new-layer-in-place" "") -(gtk_accel_path "/drawable/drawable-desaturate" "u") -; (gtk_accel_path "/layers/layers-resize" "") -; (gtk_accel_path "/layers/layers-blend-space-rgb-perceptual" "") -; (gtk_accel_path "/layers/layers-stack-menu" "") -; (gtk_accel_path "/dockable/dockable-show-button-bar" "") -; (gtk_accel_path "/view/view-zoom-fill" "") -; (gtk_accel_path "/filters/filters-stretch-contrast-hsv" "") -; (gtk_accel_path "/view/view-padding-color-prefs" "") -; (gtk_accel_path "/plug-in/plug-in-depth-merge" "") -; (gtk_accel_path "/tools/tools-opacity-decrease-skip" "less") -; (gtk_accel_path "/plug-in/plug-in-guillotine" "") -; (gtk_accel_path "/windows/windows-tabs-position-left" "") -; (gtk_accel_path "/documents/documents-recreate-preview" "") -; (gtk_accel_path "/layers/layers-opacity-increase" "") -; (gtk_accel_path "/image/colors-tone-mapping-menu" "") -; (gtk_accel_path "/tools/tools-size-set" "") -; (gtk_accel_path "/context/context-brush-angle-increase-skip" "") -; (gtk_accel_path "/dialogs/dialogs-fonts" "") -; (gtk_accel_path "/channels/channels-linked" "") -; (gtk_accel_path "/dockable/dockable-preview-size-gigantic" "") -; (gtk_accel_path "/plug-in/script-fu-difference-clouds" "") -; (gtk_accel_path "/plug-in/plug-in-dbbrowser" "") -; (gtk_accel_path "/plug-in/color-decode-ycocg-scaled" "") -; (gtk_accel_path "/context/context-background-hue-set" "") -; (gtk_accel_path "/plug-in/plug-in-align-layers" "") -; (gtk_accel_path "/context/context-background-blue-increase" "") -; (gtk_accel_path "/dockable/dialogs-palettes" "") -; (gtk_accel_path "/filters/filters-hue-chroma" "") -; (gtk_accel_path "/plug-in/plug-in-blinds" "") -; (gtk_accel_path "/dockable/dockable-preview-size-enormous" "") -; (gtk_accel_path "/channels/channels-lock-content" "") -(gtk_accel_path "/tools/tools-color-picker" "i") -; (gtk_accel_path "/context/context-paint-mode-next" "") -(gtk_accel_path "/tools/tools-clone" "s") -; (gtk_accel_path "/plug-in/script-fu-make-brush-elliptical-feathered" "") -; (gtk_accel_path "/context/context-background-value-minimum" "") -; (gtk_accel_path "/drawable/drawable-linked" "") -; (gtk_accel_path "/select/select-sharpen" "") -; (gtk_accel_path "/filters/filters-noise-cie-lch" "") -; (gtk_accel_path "/context/context-colormap-foreground-next" "") -; (gtk_accel_path "/view/view-zoom-4-1-accel" "KP_3") -; (gtk_accel_path "/edit/edit-undo" "z") -(gtk_accel_path "/plug-in/tiny_fu_refresh" "t") -; (gtk_accel_path "/plug-in/script-fu-paste-as-brush" "") -(gtk_accel_path "/file/file-save-a-copy" "s") -; (gtk_accel_path "/filters/filters-edge-detect-menu" "") -; (gtk_accel_path "/vectors/vectors-selection-replace" "") -; (gtk_accel_path "/filters/filters-invert-perceptual" "") -; (gtk_accel_path "/vectors/vectors-color-tag-blue" "") -; (gtk_accel_path "/channels/channels-edit-attributes" "") -; (gtk_accel_path "/vectors/vectors-delete" "") -; (gtk_accel_path "/file/file-show-in-file-manager" "f") -; (gtk_accel_path "/context/context-swatch-background-previous-skip" "") -; (gtk_accel_path "/windows/windows-tabs-position-top" "") -; (gtk_accel_path "/context/context-brush-radius-decrease" "") -; (gtk_accel_path "/filters/filters-light-shadow-menu" "") -(gtk_accel_path "/layers/layers-mode-previous" "underscore") -; (gtk_accel_path "/vectors/vectors-export" "") -; (gtk_accel_path "/tools/tools-hardness-increase" "") -; (gtk_accel_path "/tools/tools-value-2-decrease" "") -; (gtk_accel_path "/tools/tools-size-increase-percent" "") -; (gtk_accel_path "/view/view-zoom-16-1-accel" "KP_5") -; (gtk_accel_path "/filters/filters-deinterlace" "") -; (gtk_accel_path "/plug-in/plug-in-compose" "") -; (gtk_accel_path "/context/context-colors-swap" "x") -; (gtk_accel_path "/context/context-foreground-value-decrease-skip" "") -; (gtk_accel_path "/drawable/drawable-lock-position" "") -; (gtk_accel_path "/context/context-palette-background-first" "") -; (gtk_accel_path "/select/select-grow" "") -; (gtk_accel_path "/filters/filters-invert-linear" "") -; (gtk_accel_path "/filters/filters-recent-09" "") -; (gtk_accel_path "/help/help-context-help" "F1") -; (gtk_accel_path "/documents/documents-remove-dangling" "") -; (gtk_accel_path "/tools/tools-opacity-decrease-percent" "") -; (gtk_accel_path "/plug-in/plug-in-gimpressionist" "") -; (gtk_accel_path "/dockable/dialogs-images" "") -; (gtk_accel_path "/plug-in/script-fu-selection-rounded-rectangle" "") -; (gtk_accel_path "/filters/filters-recent-08" "") -; (gtk_accel_path "/dockable/dialogs-navigation" "") -(gtk_accel_path "/dialogs/dialogs-tool-options" "F5") -; (gtk_accel_path "/plug-in/script-fu-grid-system" "") -; (gtk_accel_path "/dockable/dialogs-vectors" "") -; (gtk_accel_path "/view/view-zoom-in-accel" "KP_Add") -; (gtk_accel_path "/context/context-colormap-background-previous-skip" "") -; (gtk_accel_path "/context/context-colormap-foreground-first" "") -(gtk_accel_path "/dialogs/dialogs-palettes" "l") -; (gtk_accel_path "/tools/tools-unified-transform" "t") -; (gtk_accel_path "/file/file-quit" "q") -; (gtk_accel_path "/context/context-foreground-saturation-decrease" "") -; (gtk_accel_path "/image/image-menubar" "") -; (gtk_accel_path "/dockable/dockable-tab-style-icon" "") -; (gtk_accel_path "/filters/filters-recent-07" "") -; (gtk_accel_path "/plug-in/script-fu-circuit" "") -; (gtk_accel_path "/plug-in/script-fu-make-brush-rectangular" "") -(gtk_accel_path "/tools/tools-curves" "m") -; (gtk_accel_path "/plug-in/script-fu-erase-rows" "") -; (gtk_accel_path "/filters/filters-noise-pick" "") -(gtk_accel_path "/tools/tools-ellipse-select" "m") -; (gtk_accel_path "/file/file-export-as" "e") -; (gtk_accel_path "/layers/layers-color-tag-red" "") -; (gtk_accel_path "/view/view-scroll-center" "j") -; (gtk_accel_path "/image/image-popup" "") -; (gtk_accel_path "/filters/filters-recent-06" "") -; (gtk_accel_path "/tools/tools-airbrush-flow-increase" "") -; (gtk_accel_path "/dialogs/dialogs-toolbox" "b") -; (gtk_accel_path "/view/view-scroll-bottom-border" "") -; (gtk_accel_path "/plug-in/plug-in-palettemap" "") -; (gtk_accel_path "/plug-in/plug-in-softglow" "") -; (gtk_accel_path "/context/context-pattern-select-previous" "") -; (gtk_accel_path "/edit/edit-menu" "") -; (gtk_accel_path "/filters/filters-recent-05" "") -; (gtk_accel_path "/plug-in/plug-in-wavelet-decompose" "") -; (gtk_accel_path "/image/image-color-profile-convert" "") -; (gtk_accel_path "/context/context-palette-select-last" "") -; (gtk_accel_path "/filters/filters-recent-04" "") -(gtk_accel_path "/view/view-scroll-page-down" "Page_Down") -; (gtk_accel_path "/context/context-foreground-value-increase" "") -; (gtk_accel_path "/image/image-convert-linear" "") -(gtk_accel_path "/tools/tools-hue-saturation" "u") -; (gtk_accel_path "/view/view-zoom-out-accel" "KP_Subtract") -; (gtk_accel_path "/brushes/brushes-edit" "") -; (gtk_accel_path "/image/image-crop-to-selection" "") -; (gtk_accel_path "/context/context-brush-radius-maximum" "") -; (gtk_accel_path "/filters/filters-oilify" "") -; (gtk_accel_path "/layers/layers-opacity-increase-skip" "") -(gtk_accel_path "/plug-in/script_fu_refresh" "r") -; (gtk_accel_path "/windows/windows-docks-menu" "") -; (gtk_accel_path "/filters/filters-emboss" "") -; (gtk_accel_path "/dockable/dockable-menu" "") -; (gtk_accel_path "/filters/filters-recent-03" "") -; (gtk_accel_path "/plug-in/plug-in-qbist" "") -(gtk_accel_path "/layers/layers-lower" "bracketleft") -(gtk_accel_path "/tools/tools-align" "") -; (gtk_accel_path "/context/context-brush-aspect-increase-skip" "") -; (gtk_accel_path "/tools/tools-handle-transform" "l") -; (gtk_accel_path "/layers/layers-new-group" "") -; (gtk_accel_path "/filters/filters-waves" "") -; (gtk_accel_path "/context/context-opacity-menu" "") -; (gtk_accel_path "/filters/filters-recent-02" "") -; (gtk_accel_path "/layers/layers-crop-to-content" "") -; (gtk_accel_path "/filters/filters-whirl-pinch" "") -; (gtk_accel_path "/filters/filters-render-pattern-menu" "") -(gtk_accel_path "/tools/tools-measure" "u") -; (gtk_accel_path "/dockable/dialogs-tool-presets" "") -; (gtk_accel_path "/tools/tools-aspect-maximum" "") -(gtk_accel_path "/tools/tools-flip" "f") -; (gtk_accel_path "/tools/tools-airbrush-rate-minimum" "") -; (gtk_accel_path "/help/help-menu" "") -; (gtk_accel_path "/filters/filters-recent-01" "") -; (gtk_accel_path "/image/image-color-profile-save" "") -; (gtk_accel_path "/filters/filters-median-blur" "") -; (gtk_accel_path "/vectors/vectors-paste" "") -; (gtk_accel_path "/context/context-foreground-blue-minimum" "") -; (gtk_accel_path "/filters/filters-apply-canvas" "") -; (gtk_accel_path "/drawable/drawable-levels-stretch" "") -; (gtk_accel_path "/plug-in/file-png-save2" "") -; (gtk_accel_path "/filters/filters-difference-of-gaussians" "") -; (gtk_accel_path "/tools/tools-angle-increase-skip" "") -; (gtk_accel_path "/context/context-swatch-background-last" "") -(gtk_accel_path "/tools/tools-move" "v") -(gtk_accel_path "/tools/tools-convolve" "r") -; (gtk_accel_path "/tools/tools-airbrush-flow-increase-skip" "") -; (gtk_accel_path "/context/context-foreground-saturation-increase-skip" "") -; (gtk_accel_path "/channels/channels-color-tag-green" "") -; (gtk_accel_path "/tools/tools-aspect-decrease-percent" "") -; (gtk_accel_path "/plug-in/gimp-help-using-photography" "") -; (gtk_accel_path "/dialogs/dialogs-dashboard" "") -; (gtk_accel_path "/layers/layers-crop-to-selection" "") -; (gtk_accel_path "/layers/layers-mask-selection-subtract" "") -; (gtk_accel_path "/plug-in/script-fu-guides-remove" "") -; (gtk_accel_path "/dialogs/dialogs-palette-editor" "") -; (gtk_accel_path "/filters/filters-channel-mixer" "") -; (gtk_accel_path "/images/images-raise-views" "") -; (gtk_accel_path "/plug-in/script-fu-waves-anim" "") -; (gtk_accel_path "/context/context-foreground-green-maximum" "") -; (gtk_accel_path "/view/view-menu" "") -; (gtk_accel_path "/view/view-dot-for-dot" "") -; (gtk_accel_path "/context/context-gradient-select-set" "") -; (gtk_accel_path "/dockable/dockable-close-tab" "") -; (gtk_accel_path "/dockable/dialogs-dynamics-editor" "") -; (gtk_accel_path "/plug-in/python-fu-palette-to-gradient-repeating" "") -; (gtk_accel_path "/vectors/vectors-selection-intersect" "") -; (gtk_accel_path "/vectors/vectors-stroke" "") -; (gtk_accel_path "/filters/filters-little-planet" "") -; (gtk_accel_path "/context/context-pattern-menu" "") -; (gtk_accel_path "/plug-in/python-fu-palette-to-gradient" "") -(gtk_accel_path "/view/view-show-rulers" "r") -; (gtk_accel_path "/context/context-brush-spikes-increase" "") -(gtk_accel_path "/view/view-snap-to-guides" "semicolon") -; (gtk_accel_path "/layers/layers-alpha-selection-subtract" "") -; (gtk_accel_path "/channels/channels-select-top" "") -; (gtk_accel_path "/plug-in/script-fu-sota-chrome-it" "") -; (gtk_accel_path "/view/view-move-to-screen-:0.0" "") -; (gtk_accel_path "/plug-in/gimp-palette-export-python" "") -; (gtk_accel_path "/context/context-swatch-foreground-next" "0") -; (gtk_accel_path "/select/selection-popup" "") -; (gtk_accel_path "/brushes/brushes-refresh" "") -(gtk_accel_path "/edit/edit-paste-into" "v") -; (gtk_accel_path "/tools/tools-opacity-decrease" "less") -; (gtk_accel_path "/context/context-brush-angle-minimum" "") -; (gtk_accel_path "/tools/tools-aspect-increase" "") -; (gtk_accel_path "/context/context-brush-spikes-maximum" "") -; (gtk_accel_path "/filters/filters-generic-menu" "") -; (gtk_accel_path "/tools/tools-aspect-set" "") -; (gtk_accel_path "/fonts/fonts-popup" "") -; (gtk_accel_path "/layers/layers-popup" "") -; (gtk_accel_path "/image/image-resize-to-layers" "") -; (gtk_accel_path "/context/context-foreground-green-increase-skip" "") -; (gtk_accel_path "/tools/tools-magnify" "") -; (gtk_accel_path "/vectors/vectors-selection-to-vectors-short" "") -; (gtk_accel_path "/windows/windows-use-single-window-mode" "") -; (gtk_accel_path "/channels/channels-lower-to-bottom" "") -; (gtk_accel_path "/context/context-colormap-background-first" "") -(gtk_accel_path "/edit/edit-fill-pattern" "") -; (gtk_accel_path "/context/context-paint-mode-first" "") -; (gtk_accel_path "/plug-in/script-fu-reverse-layers" "") -; (gtk_accel_path "/dockable/dockable-preview-size-extra-large" "") -; (gtk_accel_path "/dockable/dialogs-indexed-palette" "") -; (gtk_accel_path "/context/context-brush-spikes-set" "") -; (gtk_accel_path "/vectors/vectors-new-last-values" "") -; (gtk_accel_path "/tools/tools-object-2-previous" "") -; (gtk_accel_path "/plug-in/plug-in-retinex" "") -; (gtk_accel_path "/context/context-swatch-foreground-previous" "9") -; (gtk_accel_path "/context/context-foreground-value-decrease" "") -; (gtk_accel_path "/context/context-brush-select-first" "") -; (gtk_accel_path "/context/context-swatch-foreground-next-skip" "") -; (gtk_accel_path "/tools/tools-force-increase-skip" "") -; (gtk_accel_path "/dockable/dockable-detach-tab" "") -(gtk_accel_path "/image/image-print-size" "p") -; (gtk_accel_path "/filters/filters-fractal-trace" "") -; (gtk_accel_path "/filters/filters-panorama-projection" "") -; (gtk_accel_path "/context/context-paint-mode-last" "") -; (gtk_accel_path "/image/colors-components-menu" "") -; (gtk_accel_path "/plug-in/file_print_gimp" "") -; (gtk_accel_path "/context/context-colormap-foreground-last" "") -(gtk_accel_path "/view/view-zoom-out" "minus") -; (gtk_accel_path "/plug-in/plug-in-colormap-remap" "") -; (gtk_accel_path "/context/context-palette-background-next-skip" "") -; (gtk_accel_path "/tools/tools-force-decrease" "") -; (gtk_accel_path "/context/context-background-hue-maximum" "") -; (gtk_accel_path "/plug-in/plug-in-mail-image" "") -; (gtk_accel_path "/filters/filters-mantiuk-2006" "") -; (gtk_accel_path "/plug-in/plug-in-small-tiles" "") -; (gtk_accel_path "/layers/layers-composite-mode-clip-to-layer" "") -; (gtk_accel_path "/filters/filters-noise-menu" "") -; (gtk_accel_path "/layers/layers-mask-disable" "") -; (gtk_accel_path "/tools/tools-brightness-contrast" "") -; (gtk_accel_path "/context/context-brush-spikes-increase-skip" "") -; (gtk_accel_path "/context/context-palette-select-previous" "") -; (gtk_accel_path "/filters/filters-erode" "") -; (gtk_accel_path "/plug-in/script-fu-clothify" "") -; (gtk_accel_path "/context/context-pattern-select-first" "") -; (gtk_accel_path "/layers/layers-transform-menu" "") -; (gtk_accel_path "/tools/tools-spacing-increase-percent" "") -; (gtk_accel_path "/select/select-border" "") -; (gtk_accel_path "/vectors/vectors-color-tag-none" "") -; (gtk_accel_path "/edit/edit-paste-into-in-place" "") -; (gtk_accel_path "/layers/layers-new-last-values" "") -; (gtk_accel_path "/context/context-opacity-transparent" "") -; (gtk_accel_path "/plug-in/plug-in-animationoptimize" "") -; (gtk_accel_path "/context/context-colormap-background-next" "") -; (gtk_accel_path "/layers/layers-blend-space-auto" "") -; (gtk_accel_path "/plug-in/file-pdf-save-multi" "") -; (gtk_accel_path "/layers/layers-merge-layers" "") -; (gtk_accel_path "/layers/layers-composite-space-auto" "") -; (gtk_accel_path "/context/context-opacity-decrease-skip" "") -; (gtk_accel_path "/dockable/dialogs-buffers" "") -; (gtk_accel_path "/tools/tools-perspective" "p") -; (gtk_accel_path "/context/context-foreground-red-increase-skip" "") -; (gtk_accel_path "/context/context-colormap-foreground-set" "") -; (gtk_accel_path "/plug-in/script-fu-copy-visible" "") -; (gtk_accel_path "/filters/filters-high-pass" "") -; (gtk_accel_path "/layers/layers-composite-mode-clip-to-backdrop" "") -; (gtk_accel_path "/tools/tools-menu" "") -; (gtk_accel_path "/context/context-background-green-maximum" "") -; (gtk_accel_path "/filters/filters-brightness-contrast" "") -; (gtk_accel_path "/filters/filters-shadows-highlights" "") -; (gtk_accel_path "/filters/filters-threshold-alpha" "") -; (gtk_accel_path "/channels/channels-color-tag-brown" "") -; (gtk_accel_path "/patterns/patterns-popup" "") -; (gtk_accel_path "/filters/filters-desaturate" "") -; (gtk_accel_path "/context/context-palette-foreground-previous" "") -; (gtk_accel_path "/plug-in/plug-in-nlfilt" "") -; (gtk_accel_path "/plug-in/gimp-palette-export-text" "") -; (gtk_accel_path "/context/context-palette-foreground-set" "") -; (gtk_accel_path "/tools/tools-paintbrush-spacing-set" "") -; (gtk_accel_path "/filters/filters-offset" "o") -; (gtk_accel_path "/filters/filters-softglow" "") -; (gtk_accel_path "/vectors/vectors-select-top" "") -; (gtk_accel_path "/context/context-brush-shape-square" "") -; (gtk_accel_path "/qmask/qmask-toggle" "") -; (gtk_accel_path "/tools/tools-opacity-minimum" "") -; (gtk_accel_path "/channels/channels-raise-to-top" "") -; (gtk_accel_path "/filters/filters-reinhard-2005" "") -; (gtk_accel_path "/plug-in/plug-in-fractal-trace" "") -; (gtk_accel_path "/view/view-zoom-2-1-accel" "KP_2") -; (gtk_accel_path "/context/context-foreground-hue-minimum" "") -; (gtk_accel_path "/tools/tools-aspect-decrease" "") -; (gtk_accel_path "/tools/tools-angle-decrease-percent" "") -; (gtk_accel_path "/tools/tools-mypaint-brush-radius-set" "") -; (gtk_accel_path "/context/context-brush-spacing-decrease-skip" "") -; (gtk_accel_path "/vectors/vectors-lower" "") -; (gtk_accel_path "/context/context-brush-aspect-minimum" "") -; (gtk_accel_path "/context/context-tool-select-first" "") -; (gtk_accel_path "/layers/layers-mask-delete" "") -; (gtk_accel_path "/context/context-background-green-increase-skip" "") -; (gtk_accel_path "/plug-in/plug-in-ccanalyze" "") -; (gtk_accel_path "/filters/filters-artistic-menu" "") -; (gtk_accel_path "/select/select-flood" "") -; (gtk_accel_path "/tools/tools-hardness-set-to-default" "") -(gtk_accel_path "/tools/tools-bucket-fill" "g") -; (gtk_accel_path "/tools/tools-angle-set" "") -; (gtk_accel_path "/tools/tools-ink-blob-aspect-set" "") -; (gtk_accel_path "/tools/tools-size-increase" "bracketright") -; (gtk_accel_path "/tools/tools-force-increase-percent" "") -; (gtk_accel_path "/image/image-color-management-menu" "") -; (gtk_accel_path "/channels/channels-selection-replace" "") -; (gtk_accel_path "/dockable/dialogs-layers" "l") -(gtk_accel_path "/view/view-zoom-fit-in" "0") -; (gtk_accel_path "/brushes/brushes-delete" "") -; (gtk_accel_path "/filters/filters-repeat" "f") -; (gtk_accel_path "/filters/filters-maze" "") -; (gtk_accel_path "/context/context-brush-shape-menu" "") -; (gtk_accel_path "/dockable/dialogs-palette-editor" "") -; (gtk_accel_path "/context/context-colors-default" "d") -; (gtk_accel_path "/drawable/drawable-flip-vertical" "") -; (gtk_accel_path "/filters/filters-color-balance" "") -; (gtk_accel_path "/tools/tools-size-set-to-default" "backslash") -(gtk_accel_path "/layers/layers-raise-to-top" "braceright") -; (gtk_accel_path "/context/context-foreground-blue-decrease-skip" "") -; (gtk_accel_path "/plug-in/plug-in-gradmap" "") -; (gtk_accel_path "/filters/filters-checkerboard" "") -; (gtk_accel_path "/image/image-convert-grayscale" "") -; (gtk_accel_path "/plug-in/script-fu-fuzzy-border" "") -; (gtk_accel_path "/filters/filters-tile-paper" "") -; (gtk_accel_path "/dialogs/dialogs-selection-editor" "") -; (gtk_accel_path "/layers/layers-edit" "") -; (gtk_accel_path "/image/colors-desaturate-menu" "") -; (gtk_accel_path "/layers/layers-flatten-image" "") -; (gtk_accel_path "/tools/tools-airbrush-rate-increase-skip" "") -; (gtk_accel_path "/channels/channels-select-bottom" "") -(gtk_accel_path "/dialogs/dialogs-preferences" "k") -; (gtk_accel_path "/plug-in/plug-in-animationplay" "") -; (gtk_accel_path "/context/context-brush-angle-menu" "") -; (gtk_accel_path "/tools/tools-airbrush-flow-minimum" "") -; (gtk_accel_path "/view/view-rotate-menu" "") -; (gtk_accel_path "/vectors/vectors-import" "") -; (gtk_accel_path "/plug-in/script-fu-xach-effect" "") -; (gtk_accel_path "/view/view-rotate-345" "") -; (gtk_accel_path "/plug-in/plug-in-decompose" "") -; (gtk_accel_path "/plug-in/gimp-palette-export-css" "") -; (gtk_accel_path "/filters/filters-color-exchange" "") -; (gtk_accel_path "/tools/tools-warp-effect-size-set" "") -; (gtk_accel_path "/view/view-display-intent-perceptual" "") -; (gtk_accel_path "/dialogs/dialogs-navigation" "") -; (gtk_accel_path "/dock/dock-open-display" "") -; (gtk_accel_path "/context/context-paint-mode-previous" "") -; (gtk_accel_path "/plug-in/plug-in-hot" "") -; (gtk_accel_path "/tools/tools-aspect-decrease-skip" "") -; (gtk_accel_path "/view/view-zoom-out-skip" "") -; (gtk_accel_path "/dialogs/dialogs-keyboard-shortcuts" "") -; (gtk_accel_path "/view/view-zoom-maximum" "") -; (gtk_accel_path "/dockable/dockable-preview-size-tiny" "") -; (gtk_accel_path "/dialogs/dialogs-input-devices" "") -; (gtk_accel_path "/dockable/dialogs-document-history" "") -; (gtk_accel_path "/quick-mask/quick-mask-invert-on" "") -; (gtk_accel_path "/context/context-swatch-foreground-first" "") -(gtk_accel_path "/file/file-export" "") -; (gtk_accel_path "/plug-in/script-fu-set-cmap" "") -; (gtk_accel_path "/layers/layers-text-discard" "") -; (gtk_accel_path "/context/context-foreground-red-maximum" "") -; (gtk_accel_path "/filters/filters-render-noise-menu" "") -; (gtk_accel_path "/context/context-font-select-next" "") -; (gtk_accel_path "/plug-in/script-fu-guide-new-percent" "") -; (gtk_accel_path "/view/view-show-scrollbars" "") -; (gtk_accel_path "/channels/channels-delete" "") -; (gtk_accel_path "/view/view-zoom-fit-to" "") -; (gtk_accel_path "/image/image-flip-vertical" "") -; (gtk_accel_path "/layers/layers-opacity-set" "") -; (gtk_accel_path "/context/context-menu" "") -; (gtk_accel_path "/vectors/vectors-popup" "") -; (gtk_accel_path "/image/image-convert-half" "") -; (gtk_accel_path "/view/view-flip-vertically" "") -; (gtk_accel_path "/file/file-overwrite" "") -; (gtk_accel_path "/context/context-background-red-increase-skip" "") -; (gtk_accel_path "/tools/tools-size-increase-skip" "bracketright") -; (gtk_accel_path "/image/image-rotate-90" "") -; (gtk_accel_path "/filters/filters-edge-sobel" "") -(gtk_accel_path "/edit/edit-fill-bg" "BackSpace") -; (gtk_accel_path "/context/context-palette-menu" "") -; (gtk_accel_path "/layers/layers-properties-menu" "") -(gtk_accel_path "/layers/layers-mode-next" "plus") -; (gtk_accel_path "/context/context-foreground-hue-increase" "") -(gtk_accel_path "/select/select-invert" "i") -(gtk_accel_path "/tools/tools-iscissors" "") -; (gtk_accel_path "/file/file-save-as" "s") -; (gtk_accel_path "/context/context-swatch-foreground-last" "") -; (gtk_accel_path "/context/context-palette-background-next" "") -(gtk_accel_path "/image/image-rotate-270" "7") -; (gtk_accel_path "/context/context-brush-hardness-menu" "") -(gtk_accel_path "/tools/tools-warp" "") -; (gtk_accel_path "/context/context-brush-radius-decrease-less" "") -; (gtk_accel_path "/quick-mask/quick-mask-popup" "") -; (gtk_accel_path "/plug-in/plug-in-sparkle" "") -; (gtk_accel_path "/vectors/vectors-selection-subtract" "") -; (gtk_accel_path "/filters/filters-combine-menu" "") -(gtk_accel_path "/layers/layers-raise" "bracketright") -; (gtk_accel_path "/edit/edit-strong-undo" "z") -; (gtk_accel_path "/context/context-colormap-foreground-next-skip" "") -; (gtk_accel_path "/context/context-brush-aspect-increase" "") -; (gtk_accel_path "/filters/filters-invert-value" "") -; (gtk_accel_path "/tools/tools-value-2-increase" "") -; (gtk_accel_path "/context/context-foreground-blue-set" "") -; (gtk_accel_path "/filters/filters-bump-map" "") -; (gtk_accel_path "/plug-in/file-gih-save-internal" "") -; (gtk_accel_path "/plug-in/script-fu-old-photo" "") -; (gtk_accel_path "/context/context-background-blue-increase-skip" "") -(gtk_accel_path "/tools/tools-desaturate" "u") -; (gtk_accel_path "/patterns/patterns-edit" "") -; (gtk_accel_path "/dialogs/dialogs-module-dialog" "") -; (gtk_accel_path "/image/image-configure-grid" "") -; (gtk_accel_path "/context/context-tool-menu" "") -; (gtk_accel_path "/view/view-zoom-1-1-accel" "KP_1") -; (gtk_accel_path "/filters/filters-noise-spread" "") -; (gtk_accel_path "/plug-in/script-fu-round-corners" "") -; (gtk_accel_path "/tools/tools-hardness-increase-skip" "") -; (gtk_accel_path "/select/select-save" "") -; (gtk_accel_path "/context/context-background-saturation-set" "") -; (gtk_accel_path "/plug-in/script-fu-guide-new" "") -; (gtk_accel_path "/tools/tools-size-minimum" "") -; (gtk_accel_path "/tools/tools-hardness-decrease-percent" "") -; (gtk_accel_path "/plug-in/gimp-help-concepts-paths" "") -; (gtk_accel_path "/vectors/vectors-select-next" "") -; (gtk_accel_path "/filters/filters-gaussian-blur" "") -; (gtk_accel_path "/tools/tools-text" "t") -; (gtk_accel_path "/view/view-rotate-180" "") -; (gtk_accel_path "/plug-in/plug-in-screenshot" "") -(gtk_accel_path "/plug-in/plug_in_c_astretch" "l") -; (gtk_accel_path "/plug-in/gimp-online-wiki" "") -; (gtk_accel_path "/filters/filters-noise-solid" "") -; (gtk_accel_path "/file/file-open-as-layers" "o") -; (gtk_accel_path "/context/context-background-red-minimum" "") -; (gtk_accel_path "/layers/layers-text-to-vectors" "") -; (gtk_accel_path "/filters/filters-noise-cell" "") -; (gtk_accel_path "/plug-in/script-fu-refresh" "") -(gtk_accel_path "/quick-mask/quick-mask-toggle" "q") -; (gtk_accel_path "/vectors/vectors-fill-last-values" "") -; (gtk_accel_path "/documents/documents-popup" "") -; (gtk_accel_path "/view/view-padding-color-menu" "") -(gtk_accel_path "/tools/tools-smudge" "") -; (gtk_accel_path "/context/context-font-menu" "") -; (gtk_accel_path "/tools/tools-mypaint-brush-hardness-set" "") -; (gtk_accel_path "/plug-in/plug-in-pagecurl" "") -(gtk_accel_path "/dialogs/dialogs-layers" "F7") -; (gtk_accel_path "/context/context-colormap-background-last" "") -; (gtk_accel_path "/plug-in/script-fu-selection-to-image" "") -; (gtk_accel_path "/channels/channels-selection-add" "") -; (gtk_accel_path "/context/context-palette-select-first" "") -; (gtk_accel_path "/layers/layers-lock-position" "") -; (gtk_accel_path "/tools/tools-object-1-next" "") -; (gtk_accel_path "/dialogs/dialogs-device-status" "") -; (gtk_accel_path "/view/view-scroll-vertical" "") -(gtk_accel_path "/view/view-show-selection" "h") -; (gtk_accel_path "/plug-in/plug-in-borderaverage" "") -; (gtk_accel_path "/color-button/color-button-use-foreground" "") -; (gtk_accel_path "/filters/filters-photocopy" "") -; (gtk_accel_path "/channels/channels-color-tag-orange" "") -; (gtk_accel_path "/tools/tools-ink-blob-angle-set" "") -; (gtk_accel_path "/context/context-background-saturation-minimum" "") -; (gtk_accel_path "/layers/layers-lock-alpha" "") -; (gtk_accel_path "/tools/tools-transform-menu" "") -; (gtk_accel_path "/tools/tools-spacing-maximum" "") -; (gtk_accel_path "/view/view-padding-color-theme" "") -; (gtk_accel_path "/plug-in/script-fu-gradient-example" "") -; (gtk_accel_path "/filters/filters-color-rotate" "") -; (gtk_accel_path "/dockable/dialogs-dynamics" "") -; (gtk_accel_path "/patterns/patterns-copy-location" "") -; (gtk_accel_path "/plug-in/gimp-online-roadmap" "") -; (gtk_accel_path "/filters/filters-vignette" "") -; (gtk_accel_path "/filters/filters-edge-neon" "") -(gtk_accel_path "/plug-in/plug_in_colortoalpha" "a") -; (gtk_accel_path "/filters/filters-apply-lens" "") -; (gtk_accel_path "/tools/tools-angle-minimum" "") -; (gtk_accel_path "/tools/tools-ink" "k") -; (gtk_accel_path "/tools/tools-airbrush-rate-set" "") -; (gtk_accel_path "/layers/layers-mask-add-button" "") -; (gtk_accel_path "/layers/layers-color-tag-orange" "") -; (gtk_accel_path "/plug-in/python-fu-gradient-save-as-css" "") -; (gtk_accel_path "/view/view-display-filters" "") -; (gtk_accel_path "/plug-in/script-fu-coffee-stain" "") -; (gtk_accel_path "/context/context-swatch-background-first" "") -; (gtk_accel_path "/layers/layers-composite-mode-intersection" "") -; (gtk_accel_path "/filters/filters-noise-rgb" "") -; (gtk_accel_path "/context/context-foreground-hue-decrease" "") -; (gtk_accel_path "/plug-in/plug-in-tile" "") -; (gtk_accel_path "/plug-in/plug-in-despeckle" "") -; (gtk_accel_path "/dialogs/dialogs-about" "") -(gtk_accel_path "/plug-in/plug-in-c-astretch" "l") -; (gtk_accel_path "/tools/tools-spacing-set" "") -; (gtk_accel_path "/dialogs/dialogs-templates" "") -; (gtk_accel_path "/tools/tools-object-2-first" "") -; (gtk_accel_path "/context/context-background-blue-minimum" "") -; (gtk_accel_path "/documents/documents-file-open-dialog" "") -; (gtk_accel_path "/quick-mask/quick-mask-invert-off" "") -; (gtk_accel_path "/filters/filters-tile-seamless" "") -; (gtk_accel_path "/filters/filters-red-eye-removal" "") -(gtk_accel_path "/layers/layers-resize-to-image" "y") -; (gtk_accel_path "/filters/filters-lens-flare" "") -; (gtk_accel_path "/filters/filters-render-fractals-menu" "") -; (gtk_accel_path "/context/context-brush-angle-decrease-skip" "") -; (gtk_accel_path "/plug-in/gimp-help-using-web" "") -(gtk_accel_path "/dialogs/dialogs-vectors" "F9") -; (gtk_accel_path "/view/view-color-management-softproof" "") -; (gtk_accel_path "/edit/edit-buffer-menu" "") -; (gtk_accel_path "/plug-in/script-fu-make-brush-elliptical" "") -; (gtk_accel_path "/plug-in/plug-in-grid" "") -; (gtk_accel_path "/plug-in/file-pdf-save" "") -; (gtk_accel_path "/filters/filters-color-enhance" "") -; (gtk_accel_path "/plug-in/file-png-save" "") -; (gtk_accel_path "/view/view-padding-color-custom" "") -; (gtk_accel_path "/plug-in/script-fu-weave" "") -; (gtk_accel_path "/filters/filters-blur-menu" "") -; (gtk_accel_path "/context/context-brush-aspect-decrease" "") -; (gtk_accel_path "/tools/tools-paintbrush-angle-set" "") -; (gtk_accel_path "/context/context-pattern-select-next" "") -; (gtk_accel_path "/channels/channels-lower" "") -; (gtk_accel_path "/view/view-rotate-other" "") -; (gtk_accel_path "/context/context-brush-hardness-minimum" "") -; (gtk_accel_path "/filters/filters-mosaic" "") -; (gtk_accel_path "/patterns/patterns-show-in-file-manager" "") -; (gtk_accel_path "/debug/debug-menu" "") -; (gtk_accel_path "/context/context-brush-radius-increase-skip" "") -; (gtk_accel_path "/view/view-softproof-black-point-compensation" "") -; (gtk_accel_path "/select/select-menu" "") -; (gtk_accel_path "/color-button/color-button-use-black" "") -; (gtk_accel_path "/plug-in/plug-in-sample-colorize" "") -(gtk_accel_path "/file/file-open-recent-10" "") -(gtk_accel_path "/tools/tools-by-color-select" "") -; (gtk_accel_path "/context/context-palette-background-previous" "") -; (gtk_accel_path "/tools/tools-force-minimum" "") -; (gtk_accel_path "/channels/channels-color-tag-violet" "") -; (gtk_accel_path "/context/context-swatch-background-next-skip" "") -; (gtk_accel_path "/dockable/dialogs-brush-editor" "") -; (gtk_accel_path "/plug-in/gimp-help-using-simpleobjects" "") -; (gtk_accel_path "/filters/filters-recursive-transform" "") -; (gtk_accel_path "/plug-in/script-fu-add-bevel" "") -; (gtk_accel_path "/dialogs/dialogs-dynamics" "") -; (gtk_accel_path "/plug-in/plug-in-curve-bend" "") -; (gtk_accel_path "/context/context-background-saturation-increase-skip" "") -(gtk_accel_path "/view/view-scroll-page-up" "Page_Up") -; (gtk_accel_path "/filters/filters-convolution-matrix" "") -; (gtk_accel_path "/tools/tools-pencil" "n") -; (gtk_accel_path "/filters/filters-levels" "") -; (gtk_accel_path "/layers/layers-color-tag-violet" "") -; (gtk_accel_path "/tools/tools-opacity-increase" "greater") -; (gtk_accel_path "/context/context-brush-radius-decrease-percent" "") -; (gtk_accel_path "/context/context-foreground-red-set" "") -; (gtk_accel_path "/select/select-fill" "") -; (gtk_accel_path "/filters/filters-colorize" "") -; (gtk_accel_path "/view/view-padding-color-dark-check" "") -; (gtk_accel_path "/tools/tools-hardness-maximum" "") -; (gtk_accel_path "/tool-options/tool-options-save-new-preset" "") -; (gtk_accel_path "/tools/tools-spacing-increase-skip" "") -; (gtk_accel_path "/context/context-gradient-select-previous" "") -; (gtk_accel_path "/layers/layers-new-from-visible" "") -(gtk_accel_path "/tools/tools-crop" "c") -; (gtk_accel_path "/plug-in/plug-in-flame" "") -; (gtk_accel_path "/images/images-popup" "") -; (gtk_accel_path "/dockable/dockable-view-type-list" "") -; (gtk_accel_path "/context/context-font-select-last" "") -; (gtk_accel_path "/vectors/vectors-new" "") -; (gtk_accel_path "/tool-options/tool-options-popup" "") -; (gtk_accel_path "/filters/filters-posterize" "") -; (gtk_accel_path "/channels/channels-color-tag-menu" "") -; (gtk_accel_path "/filters/filters-slic" "") -; (gtk_accel_path "/view/view-rotate-reset" "exclam") -; (gtk_accel_path "/filters/filters-shift" "") -; (gtk_accel_path "/drawable/drawable-rotate-90" "") -; (gtk_accel_path "/plug-in/plug-in-lighting" "") -; (gtk_accel_path "/tools/tools-mypaint-brush" "y") -; (gtk_accel_path "/layers/layers-mode-last" "") -; (gtk_accel_path "/filters/filters-saturation" "") -(gtk_accel_path "/layers/layers-merge-down" "e") -; (gtk_accel_path "/dialogs/dialogs-tips" "") -; (gtk_accel_path "/tools/tools-warp-effect-hardness-set" "") -; (gtk_accel_path "/layers/layers-alpha-add" "") -; (gtk_accel_path "/filters/filters-map-menu" "") -; (gtk_accel_path "/context/context-palette-foreground-previous-skip" "") -; (gtk_accel_path "/context/context-tool-select-set" "") -; (gtk_accel_path "/plug-in/plug-in-color-enhance" "") -; (gtk_accel_path "/filters/filters-dilate" "") -; (gtk_accel_path "/context/context-palette-background-last" "") -; (gtk_accel_path "/image/image-mode-menu" "") -; (gtk_accel_path "/vectors/vectors-selection-to-vectors" "") -; (gtk_accel_path "/vectors/vectors-raise" "") -; (gtk_accel_path "/edit/edit-named-copy-visible" "") -; (gtk_accel_path "/dockable/dockable-preview-size-small" "") -; (gtk_accel_path "/drawable/drawable-rotate-180" "") -; (gtk_accel_path "/filters/filters-decor-menu" "") -; (gtk_accel_path "/layers/layers-composite-mode-menu" "") -; (gtk_accel_path "/tools/tools-airbrush-rate-decrease" "") -; (gtk_accel_path "/image/image-convert-gamma" "") -; (gtk_accel_path "/context/context-foreground-hue-increase-skip" "") -; (gtk_accel_path "/view/view-zoom-16-1" "5") -; (gtk_accel_path "/tools/tools-force-increase" "") -; (gtk_accel_path "/layers/layers-alpha-selection-intersect" "") -; (gtk_accel_path "/image/image-guides-menu" "") -; (gtk_accel_path "/channels/channels-color-tag-yellow" "") -(gtk_accel_path "/context/context-brush-select-next" "period") -; (gtk_accel_path "/channels/channels-popup" "") -(gtk_accel_path "/plug-in/plug-in-iwarp" "x") -; (gtk_accel_path "/filters/filters-waterpixels" "") -; (gtk_accel_path "/context/context-brush-spacing-increase" "") -; (gtk_accel_path "/dockable/dialogs-brushes" "b") -(gtk_accel_path "/layers/layers-select-next" "bracketleft") -; (gtk_accel_path "/tools/tools-rotate-arbitrary" "") -; (gtk_accel_path "/dialogs/dialogs-action-search" "slash") -; (gtk_accel_path "/layers/layers-opacity-decrease-skip" "") -; (gtk_accel_path "/plug-in/gimp-help-concepts-usage" "") -; (gtk_accel_path "/debug/debug-dump-keyboard-shortcuts" "") -; (gtk_accel_path "/image/image-color-profile-discard" "") -; (gtk_accel_path "/layers/layers-color-tag-yellow" "") -; (gtk_accel_path "/context/context-brush-aspect-decrease-skip" "") -; (gtk_accel_path "/dock/dock-move-to-screen-:0.0" "") -; (gtk_accel_path "/filters/filters-animation-menu" "") -; (gtk_accel_path "/filters/filters-noise-reduction" "") -(gtk_accel_path "/dialogs/dialogs-gradients" "g") -; (gtk_accel_path "/tools/tools-object-1-previous" "") -(gtk_accel_path "/image/image-duplicate" "") -; (gtk_accel_path "/documents/documents-show-in-file-manager" "") -; (gtk_accel_path "/dockable/dialogs-patterns" "p") -; (gtk_accel_path "/view/view-scroll-right-border" "") -; (gtk_accel_path "/edit/edit-paste" "v") -; (gtk_accel_path "/context/context-palette-foreground-next" "") -; (gtk_accel_path "/channels/channels-color-tag-red" "") -; (gtk_accel_path "/filters/filters-mono-mixer" "") -; (gtk_accel_path "/context/context-font-select-set" "") -; (gtk_accel_path "/patterns/patterns-duplicate" "") -; (gtk_accel_path "/filters/filters-spiral" "") -; (gtk_accel_path "/plug-in/plug-in-unit-editor" "") -; (gtk_accel_path "/tools/tools-angle-decrease-skip" "") -; (gtk_accel_path "/tools/tools-airbrush-flow-decrease-skip" "") -; (gtk_accel_path "/vectors/vectors-select-bottom" "") -; (gtk_accel_path "/context/context-foreground-value-set" "") -; (gtk_accel_path "/debug/debug-dump-items" "") -; (gtk_accel_path "/view/view-scroll-up" "") -; (gtk_accel_path "/plug-in/gimp-help-using-selections" "") -; (gtk_accel_path "/plug-in/plug-in-cml-explorer" "") -; (gtk_accel_path "/select/select-stroke" "") -; (gtk_accel_path "/context/context-foreground-saturation-decrease-skip" "") -; (gtk_accel_path "/tool-options/tool-options-reset-all" "") -; (gtk_accel_path "/drawable/drawable-visible" "") -; (gtk_accel_path "/image/image-metadata-menu" "") -; (gtk_accel_path "/channels/channels-select-previous" "") -; (gtk_accel_path "/context/context-brush-angle-increase" "") -; (gtk_accel_path "/filters/filters-snn-mean" "") -; (gtk_accel_path "/tools/tools-hardness-set" "") -; (gtk_accel_path "/layers/layers-color-tag-menu" "") -; (gtk_accel_path "/tools/tools-object-1-last" "") -; (gtk_accel_path "/context/context-background-value-increase-skip" "") -; (gtk_accel_path "/plug-in/python-fu-histogram-export" "") -; (gtk_accel_path "/view/view-display-intent-relative-colorimetric" "") -; (gtk_accel_path "/tools/tools-aspect-set-to-default" "") -; (gtk_accel_path "/filters/filters-supernova" "") -; (gtk_accel_path "/image/image-transform-menu" "") -(gtk_accel_path "/view/view-shrink-wrap" "") -; (gtk_accel_path "/images/images-delete" "") -; (gtk_accel_path "/context/context-swatch-foreground-set" "") -; (gtk_accel_path "/plug-in/file-pat-save-internal" "") -; (gtk_accel_path "/context/context-foreground-red-decrease" "") -; (gtk_accel_path "/view/view-zoom-8-1" "4") -; (gtk_accel_path "/context/context-brush-hardness-increase" "") -; (gtk_accel_path "/filters/filters-sepia" "") -; (gtk_accel_path "/debug/debug-dump-attached-data" "") -; (gtk_accel_path "/context/context-brush-radius-minimum" "") -; (gtk_accel_path "/context/context-foreground-saturation-set" "") -; (gtk_accel_path "/view/view-softproof-gamut-check" "") -; (gtk_accel_path "/dialogs/dialogs-images" "") -; (gtk_accel_path "/layers/layers-mask-selection-intersect" "") -; (gtk_accel_path "/plug-in/file-print-gtk" "") -; (gtk_accel_path "/filters/filters-reshow" "f") -; (gtk_accel_path "/dialogs/dialogs-gradient-editor" "") -; (gtk_accel_path "/view/view-move-to-screen-menu" "") -; (gtk_accel_path "/documents/documents-copy-location" "") -; (gtk_accel_path "/view/view-open-display" "") -; (gtk_accel_path "/layers/layers-linked" "") -; (gtk_accel_path "/plug-in/file-tiff-save2" "") -; (gtk_accel_path "/tool-options/tool-options-save-preset-menu" "") -; (gtk_accel_path "/context/context-brush-spacing-maximum" "") -; (gtk_accel_path "/dialogs/dialogs-buffers" "") -; (gtk_accel_path "/file/file-copy-location" "") -; (gtk_accel_path "/tools/tools-color-balance" "") -; (gtk_accel_path "/layers/layers-menu" "") -; (gtk_accel_path "/tools/tools-aspect-minimum" "") -; (gtk_accel_path "/context/context-foreground-green-decrease-skip" "") -; (gtk_accel_path "/context/context-palette-background-previous-skip" "") -(gtk_accel_path "/edit/edit-paste-as-new-image" "") -; (gtk_accel_path "/filters/filters-stress" "") -; (gtk_accel_path "/dialogs/dialogs-patterns" "p") -; (gtk_accel_path "/filters/filters-edge-laplace" "") -; (gtk_accel_path "/context/context-background-green-decrease" "") -; (gtk_accel_path "/view/view-rotate-90" "") -; (gtk_accel_path "/plug-in/color-decode-alpha-exp" "") -; (gtk_accel_path "/context/context-brush-spacing-decrease" "") -; (gtk_accel_path "/tool-options/tool-options-edit-preset-menu" "") -; (gtk_accel_path "/plug-in/plug-in-ifscompose" "") -; (gtk_accel_path "/context/context-background-hue-increase-skip" "") -; (gtk_accel_path "/filters/filters-ripple" "") -(gtk_accel_path "/tools/tools-airbrush" "j") -; (gtk_accel_path "/view/view-softproof-intent-menu" "") -; (gtk_accel_path "/filters/filters-sinus" "") -; (gtk_accel_path "/filters/filters-c2g" "") -; (gtk_accel_path "/plug-in/plug-in-metadata-viewer" "") -; (gtk_accel_path "/plug-in/plug-in-neon" "") -; (gtk_accel_path "/view/view-close" "w") -; (gtk_accel_path "/layers/layers-edit-text" "") -; (gtk_accel_path "/context/context-brush-shape-diamond" "") -; (gtk_accel_path "/tools/tools-force-decrease-skip" "") -; (gtk_accel_path "/plug-in/gimp-online-main-web-site" "") -; (gtk_accel_path "/vectors/vectors-edit-attributes" "") -; (gtk_accel_path "/context/context-opacity-increase" "") -; (gtk_accel_path "/dockable/dialogs-tool-options" "") -; (gtk_accel_path "/context/context-brush-spacing-set" "") -; (gtk_accel_path "/context/context-pattern-select-last" "") -; (gtk_accel_path "/filters/filters-distance-map" "") -(gtk_accel_path "/tools/tools-free-select" "l") -; (gtk_accel_path "/context/context-foreground-green-minimum" "") -; (gtk_accel_path "/file/file-open-recent-09" "9") -; (gtk_accel_path "/dockable/dialogs-fonts" "") -; (gtk_accel_path "/context/context-tool-select-next" "") -(gtk_accel_path "/layers/layers-select-top" "braceright") -; (gtk_accel_path "/channels/channels-selection-subtract" "") -; (gtk_accel_path "/file/file-open-recent-08" "8") -; (gtk_accel_path "/context/context-background-hue-increase" "") -; (gtk_accel_path "/context/context-colormap-background-next-skip" "") -; (gtk_accel_path "/tools/tools-paint-brush-size-increase" "") -; (gtk_accel_path "/context/context-brush-spikes-decrease-skip" "") -; (gtk_accel_path "/dialogs/dialogs-mypaint-brushes" "") -; (gtk_accel_path "/context/context-font-select-previous" "") -; (gtk_accel_path "/file/file-open-recent-07" "7") -; (gtk_accel_path "/plug-in/plug-in-film" "") -(gtk_accel_path "/layers/layers-anchor" "h") -; (gtk_accel_path "/view/view-new" "") -(gtk_accel_path "/edit/edit-redo" "") -; (gtk_accel_path "/context/context-brush-angle-decrease" "") -; (gtk_accel_path "/file/file-open-recent-06" "6") -; (gtk_accel_path "/images/images-new-view" "") -; (gtk_accel_path "/plug-in/plug-in-goat-exercise" "") -; (gtk_accel_path "/plug-in/plug-in-reset-all" "") -; (gtk_accel_path "/plug-in/file-gbr-save-internal" "") -; (gtk_accel_path "/edit/edit-paste-in-place" "v") -; (gtk_accel_path "/view/view-info-window" "") -; (gtk_accel_path "/vectors/vectors-selection-add" "") -; (gtk_accel_path "/tools/tools-aspect-increase-percent" "") -; (gtk_accel_path "/drawable/drawable-lock-content" "") -; (gtk_accel_path "/layers/layers-edit-attributes" "") -; (gtk_accel_path "/file/file-open-recent-05" "5") -; (gtk_accel_path "/plug-in/gimp-help-using-docks" "") -; (gtk_accel_path "/filters/filters-hue-saturation" "") -; (gtk_accel_path "/context/context-foreground-red-decrease-skip" "") -; (gtk_accel_path "/filters/filters-lens-distortion" "") -; (gtk_accel_path "/image/image-convert-indexed" "") -; (gtk_accel_path "/filters/filters-tile-glass" "") -; (gtk_accel_path "/plug-in/script-fu-lava" "") -; (gtk_accel_path "/file/file-open-recent-04" "4") -; (gtk_accel_path "/dock/dock-auto-follow-active" "") -; (gtk_accel_path "/plug-in/script-fu-spyrogimp" "") -; (gtk_accel_path "/patterns/patterns-open-as-image" "") -; (gtk_accel_path "/context/context-foreground-saturation-maximum" "") -; (gtk_accel_path "/image/colors-map-menu" "") -; (gtk_accel_path "/context/context-brush-radius-set" "") -; (gtk_accel_path "/file/file-open-recent-03" "3") -; (gtk_accel_path "/context/context-brush-hardness-decrease" "") -; (gtk_accel_path "/windows/windows-show-display-previous" "Tab") -; (gtk_accel_path "/view/view-softproof-intent-relative-colorimetric" "") -; (gtk_accel_path "/tools/tools-force-set-to-default" "") -; (gtk_accel_path "/file/file-open-recent-02" "2") -; (gtk_accel_path "/drawable/drawable-equalize" "") -; (gtk_accel_path "/context/context-font-select-first" "") -; (gtk_accel_path "/plug-in/plug-in-animationunoptimize" "") -; (gtk_accel_path "/layers/layers-mask-selection-replace" "") -; (gtk_accel_path "/plug-in/python-fu-foggify" "") -; (gtk_accel_path "/patterns/patterns-refresh" "") -; (gtk_accel_path "/file/file-open-recent-01" "1") -; (gtk_accel_path "/image/image-crop-to-content" "") -; (gtk_accel_path "/filters/filters-polar-coordinates" "") -; (gtk_accel_path "/brushes/brushes-new" "") -; (gtk_accel_path "/context/context-background-hue-minimum" "") -(gtk_accel_path "/tools/tools-rotate" "") -; (gtk_accel_path "/image/image-convert-double" "") -; (gtk_accel_path "/view/view-zoom-1-8" "4") -; (gtk_accel_path "/context/context-background-green-decrease-skip" "") -(gtk_accel_path "/edit/edit-fill-fg" "BackSpace") -(gtk_accel_path "/tools/tools-scale" "t") -; (gtk_accel_path "/context/context-brush-select-last" "") -; (gtk_accel_path "/plug-in/script-fu-distress-selection" "") -; (gtk_accel_path "/edit/undo-popup" "") -; (gtk_accel_path "/layers/layers-mode-first" "") -; (gtk_accel_path "/view/view-zoom-1-16" "5") -; (gtk_accel_path "/dockable/dockable-add-tab-menu" "") -; (gtk_accel_path "/context/context-tool-select-previous" "") -; (gtk_accel_path "/channels/channels-color-tag-gray" "") -; (gtk_accel_path "/dockable/dialogs-error-console" "") -; (gtk_accel_path "/context/context-foreground-value-maximum" "") -; (gtk_accel_path "/channels/channels-raise" "") -; (gtk_accel_path "/context/context-background-red-set" "") -; (gtk_accel_path "/plug-in/script-fu-perspective-shadow" "") -; (gtk_accel_path "/context/context-opacity-decrease" "") -; (gtk_accel_path "/plug-in/plug-in-newsprint" "") -; (gtk_accel_path "/filters/filters-cubism" "") -; (gtk_accel_path "/filters/filters-motion-blur-circular" "") -; (gtk_accel_path "/plug-in/plug-in-max-rgb" "") -; (gtk_accel_path "/context/context-gradient-menu" "") -; (gtk_accel_path "/plug-in/gimp-online-docs-web-site" "") -; (gtk_accel_path "/vectors/vectors-color-tag-green" "") -; (gtk_accel_path "/vectors/vectors-copy" "") -; (gtk_accel_path "/view/view-zoom-1-4" "3") -; (gtk_accel_path "/image/image-resize" "") -; (gtk_accel_path "/context/context-palette-foreground-last" "") -; (gtk_accel_path "/filters/filters-pixelize" "") -; (gtk_accel_path "/dock/dock-close" "") -; (gtk_accel_path "/tools/tools-airbrush-rate-decrease-skip" "") -; (gtk_accel_path "/tools/tools-shear" "h") -; (gtk_accel_path "/context/context-background-green-minimum" "") -; (gtk_accel_path "/view/view-snap-to-canvas" "") -; (gtk_accel_path "/view/view-scroll-left-border" "") -; (gtk_accel_path "/plug-in/python-fu-slice" "") -; (gtk_accel_path "/windows/windows-show-display-next" "Tab") -; (gtk_accel_path "/windows/windows-hide-docks" "Tab") -; (gtk_accel_path "/view/view-show-layer-boundary" "") -; (gtk_accel_path "/file/file-save" "s") -; (gtk_accel_path "/layers/layers-composite-space-rgb-linear" "") -; (gtk_accel_path "/tools/tools-paint-brush-size-decrease" "") -; (gtk_accel_path "/context/context-background-hue-decrease" "") -; (gtk_accel_path "/brushes/brushes-copy-location" "") -; (gtk_accel_path "/filters/filters-noise-slur" "") -; (gtk_accel_path "/view/view-zoom-1-2" "2") -; (gtk_accel_path "/image/image-menu" "") -; (gtk_accel_path "/plug-in/plug-in-photocopy" "") -; (gtk_accel_path "/tools/tools-blend" "") -; (gtk_accel_path "/edit/edit-paste-as-menu" "") -; (gtk_accel_path "/tools/tools-select-menu" "") -(gtk_accel_path "/view/view-zoom-1-1" "0") -; (gtk_accel_path "/plug-in/plug-in-warp" "") -; (gtk_accel_path "/dockable/dockable-preview-size-huge" "") -; (gtk_accel_path "/dockable/dockable-tab-style-automatic" "") -; (gtk_accel_path "/layers/layers-mask-edit" "") -; (gtk_accel_path "/windows/windows-show-tabs" "") -; (gtk_accel_path "/layers/layers-mask-add-last-values" "") -; (gtk_accel_path "/plug-in/file-raw-save" "") -(gtk_accel_path "/image/image-merge-layers" "") -; (gtk_accel_path "/filters/filters-noise-perlin" "") -; (gtk_accel_path "/plug-in/plug-in-destripe" "") -; (gtk_accel_path "/dockable/dockable-tab-style-icon-name" "") -; (gtk_accel_path "/dockable/dockable-preview-size-large" "") -; (gtk_accel_path "/layers/layers-color-tag-green" "") -; (gtk_accel_path "/context/context-background-red-decrease-skip" "") -; (gtk_accel_path "/tools/tools-size-decrease-skip" "bracketleft") -; (gtk_accel_path "/dockable/dialogs-selection-editor" "") -; (gtk_accel_path "/quick-mask/quick-mask-configure" "") -; (gtk_accel_path "/filters/filters-cartoon" "") -; (gtk_accel_path "/plug-in/plug-in-fractalexplorer" "") -; (gtk_accel_path "/view/view-softproof-profile" "") -; (gtk_accel_path "/view/view-rotate-270" "") -; (gtk_accel_path "/vectors/vectors-lower-to-bottom" "") -; (gtk_accel_path "/context/context-colormap-background-set" "") -; (gtk_accel_path "/layers/layers-color-tag-gray" "") -; (gtk_accel_path "/tools/tools-paintbrush-size-set" "") -; (gtk_accel_path "/brushes/brushes-popup" "") -; (gtk_accel_path "/dock/dock-show-image-menu" "") -(gtk_accel_path "/context/context-brush-hardness-increase-skip" "braceright") -; (gtk_accel_path "/plug-in/script-fu-selection-to-pattern" "") -; (gtk_accel_path "/documents/documents-clear" "") -; (gtk_accel_path "/plug-in/script-fu-carve-it" "") -; (gtk_accel_path "/plug-in/plug-in-plug-in-details" "") -(gtk_accel_path "/context/context-brush-select-previous" "comma") -; (gtk_accel_path "/context/context-palette-background-set" "") -(gtk_accel_path "/tools/tools-eraser" "e") -(gtk_accel_path "/select/select-float" "") -; (gtk_accel_path "/context/context-gradient-select-next" "") -; (gtk_accel_path "/filters/filters-grid" "") -; (gtk_accel_path "/tools/tools-size-decrease-percent" "") -; (gtk_accel_path "/layers/layers-visible" "") -; (gtk_accel_path "/documents/documents-open" "") -; (gtk_accel_path "/dockable/dialogs-sample-points" "") -; (gtk_accel_path "/context/context-background-blue-decrease-skip" "") -; (gtk_accel_path "/view/view-softproof-intent-saturation" "") -; (gtk_accel_path "/view/view-zoom-minimum" "") -; (gtk_accel_path "/filters/filters-rgb-clip" "") -; (gtk_accel_path "/tools/tools-hardness-decrease-skip" "") -(gtk_accel_path "/windows/windows-display-0009" "9") -; (gtk_accel_path "/context/context-background-value-maximum" "") -(gtk_accel_path "/layers/layers-lower-to-bottom" "braceleft") -; (gtk_accel_path "/tools/tools-force-set" "") -; (gtk_accel_path "/filters/filters-wind" "") -; (gtk_accel_path "/context/context-foreground-red-minimum" "") -; (gtk_accel_path "/filters/filters-displace" "") -; (gtk_accel_path "/debug/debug-dump-managers" "") -; (gtk_accel_path "/context/context-tool-select-last" "") -(gtk_accel_path "/windows/windows-display-0008" "8") -; (gtk_accel_path "/filters/filters-enhance-menu" "") -; (gtk_accel_path "/vectors/vectors-duplicate" "") -; (gtk_accel_path "/filters/filters-engrave" "") -; (gtk_accel_path "/vectors/vectors-selection-from-vectors" "v") -; (gtk_accel_path "/tools/tools-object-2-next" "") -(gtk_accel_path "/view/view-show-guides" "apostrophe") -; (gtk_accel_path "/vectors/vectors-color-tag-red" "") -; (gtk_accel_path "/view/view-zoom-other" "") -(gtk_accel_path "/windows/windows-display-0007" "7") -; (gtk_accel_path "/image/image-convert-u32" "") -; (gtk_accel_path "/dockable/dialogs-symmetry" "") -; (gtk_accel_path "/context/context-swatch-background-previous" "") -(gtk_accel_path "/select/select-feather" "d") -; (gtk_accel_path "/filters/filters-motion-blur-zoom" "") -; (gtk_accel_path "/dialogs/dialogs-tool-presets" "") -(gtk_accel_path "/windows/windows-display-0006" "1") -; (gtk_accel_path "/view/view-display-intent-saturation" "") -; (gtk_accel_path "/tools/tools-foreground-select" "") diff --git a/config/git/aliases.zsh b/config/git/aliases.zsh deleted file mode 100644 index 35eaa2d3..00000000 --- a/config/git/aliases.zsh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env zsh - -g() { [[ $# = 0 ]] && git status --short . || git $*; } - -alias git='noglob git' -alias ga='git add' -alias gap='git add --patch' -alias gb='git branch -av' -alias gop='git open' -alias gbl='git blame' -alias gc='git commit' -alias gcm='git commit -m' -alias gca='git commit --amend' -alias gcf='git commit --fixup' -alias gcl='git clone' -alias gco='git checkout' -alias gcoo='git checkout --' -alias gf='git fetch' -alias gi='git init' -alias gl='git log --graph --pretty="format:%C(yellow)%h%Creset %C(red)%G?%Creset%C(green)%d%Creset %s %Cblue(%cr) %C(bold blue)<%aN>%Creset"' -alias gll='git log --pretty="format:%C(yellow)%h%Creset %C(red)%G?%Creset%C(green)%d%Creset %s %Cblue(%cr) %C(bold blue)<%aN>%Creset"' -alias gL='gl --stat' -alias gp='git push' -alias gpl='git pull --rebase --autostash' -alias gs='git status --short .' -alias gss='git status' -alias gst='git stash' -alias gr='git reset HEAD' -alias grv='git rev-parse' diff --git a/config/git/attributes b/config/git/attributes deleted file mode 100644 index a1bd92e5..00000000 --- a/config/git/attributes +++ /dev/null @@ -1,3 +0,0 @@ -*.lisp diff=lisp -*.el diff=lisp -*.org diff=org diff --git a/config/git/config b/config/git/config deleted file mode 100644 index 32869dc5..00000000 --- a/config/git/config +++ /dev/null @@ -1,46 +0,0 @@ -[user] - name = Henrik Lissner - email = henrik@lissner.net -[core] - whitespace = trailing-space -[init] - defaultBranch = main -[github] - user = chickensoupwithrice -[gitlab] - user = -[rebase] - autosquash = true -[push] - default = current -[pull] - rebase = true -[alias] - unadd = reset HEAD - # data analysis - ranked-authors = !git authors | sort | uniq -c | sort -n - emails = !git log --format="%aE" | sort -u - email-domains = !git log --format="%aE" | awk -F'@' '{print $2}' | sort -u -[filter "lfs"] - required = true - smudge = git-lfs smudge -- %f - process = git-lfs filter-process - clean = git-lfs clean -- %f -[url "https://github.com/"] - insteadOf = gh: -[url "git@github.com:"] - insteadOf = ssh+gh: -[url "git@github.com:chickensoupwithrice/"] - insteadOf = gh:/ -[url "https://gitlab.com/"] - insteadOf = gl: -[url "https://gist.github.com/"] - insteadOf = gist: -[url "https://bitbucket.org/"] - insteadOf = bb: -[url "https://git.v0.com"] - insteadOf = v0: -[diff "lisp"] - xfuncname = "^(((;;;+ )|\\(|([ \t]+\\(((cl-|el-patch-)?def(un|var|macro|method|custom)|gb/))).*)$" -[diff "org"] - xfuncname = "^(\\*+ +.*)$" diff --git a/config/git/ignore b/config/git/ignore deleted file mode 100644 index 663d047a..00000000 --- a/config/git/ignore +++ /dev/null @@ -1,36 +0,0 @@ -# For emacs: -*~ -*.*~ -\#* -.\#* - -# For vim: -*.swp -.*.sw[a-z] -*.un~ -.netrwhist - -# OS generated files # -###################### -.DS_Store? -.DS_Store -.CFUserTextEncoding -.Trash -.Xauthority -thumbs.db -Thumbs.db -Icon? - -# Code stuffs # -############### -.ccls-cache/ -.sass-cache/ -__pycache__/ - -# Compiled thangs # -################### -*.class -*.exe -*.o -*.pyc -*.elc diff --git a/config/ncmpcpp/aliases.zsh b/config/ncmpcpp/aliases.zsh deleted file mode 100644 index e2314296..00000000 --- a/config/ncmpcpp/aliases.zsh +++ /dev/null @@ -1,3 +0,0 @@ -alias rate=mpd-rate -alias mpcs='mpc search any' -alias mpcsp='mpc searchplay any' diff --git a/config/ncmpcpp/bindings b/config/ncmpcpp/bindings deleted file mode 100644 index 8170bafe..00000000 --- a/config/ncmpcpp/bindings +++ /dev/null @@ -1,424 +0,0 @@ -def_key "k" - scroll_up - -def_key "j" - scroll_down - -def_key "K" - select_item - scroll_up - -def_key "J" - select_item - scroll_down - -def_key "h" - previous_column - -def_key "l" - next_column - -def_key "L" - show_lyrics - -def_key "up" - volume_up - -def_key "down" - volume_down - -#def_key "right" -# next_column -# -#def_key "left" -# previous_column -# -#def_key "mouse" -# mouse_event -# -#def_key "up" -# scroll_up -# -#def_key "shift-up" -# select_item -# scroll_up -# -#def_key "down" -# scroll_down -# -#def_key "shift-down" -# select_item -# scroll_down -# -#def_key "[" -# scroll_up_album -# -#def_key "]" -# scroll_down_album -# -#def_key "{" -# scroll_up_artist -# -#def_key "}" -# scroll_down_artist -# -#def_key "page_up" -# page_up -# -#def_key "page_down" -# page_down -# -#def_key "home" -# move_home -# -#def_key "end" -# move_end -# -#def_key "insert" -# select_item -# -#def_key "enter" -# enter_directory -# -#def_key "enter" -# toggle_output -# -#def_key "enter" -# run_action -# -#def_key "enter" -# play_item -# -#def_key "space" -# add_item_to_playlist -# -#def_key "space" -# toggle_lyrics_update_on_song_change -# -#def_key "space" -# toggle_visualization_type -# -#def_key "delete" -# delete_playlist_items -# -#def_key "delete" -# delete_browser_items -# -#def_key "delete" -# delete_stored_playlist -# -#def_key "right" -# next_column -# -#def_key "right" -# slave_screen -# -#def_key "right" -# volume_up -# -#def_key "+" -# volume_up -# -#def_key "left" -# previous_column -# -#def_key "left" -# master_screen -# -#def_key "left" -# volume_down -# -#def_key "-" -# volume_down -# -#def_key ":" -# execute_command -# -#def_key "tab" -# next_screen -# -#def_key "shift-tab" -# previous_screen -# -#def_key "f1" -# show_help -# -#def_key "1" -# show_playlist -# -#def_key "2" -# show_browser -# -#def_key "2" -# change_browse_mode -# -#def_key "3" -# show_search_engine -# -#def_key "3" -# reset_search_engine -# -#def_key "4" -# show_media_library -# -#def_key "4" -# toggle_media_library_columns_mode -# -#def_key "5" -# show_playlist_editor -# -#def_key "6" -# show_tag_editor -# -#def_key "7" -# show_outputs -# -#def_key "8" -# show_visualizer -# -#def_key "=" -# show_clock -# -#def_key "@" -# show_server_info -# -#def_key "s" -# stop -# -#def_key "p" -# pause -# -#def_key ">" -# next -# -#def_key "<" -# previous -# -#def_key "ctrl-h" -# jump_to_parent_directory -# -#def_key "ctrl-h" -# replay_song -# -#def_key "backspace" -# jump_to_parent_directory -# -#def_key "backspace" -# replay_song -# -#def_key "f" -# seek_forward -# -#def_key "b" -# seek_backward -# -#def_key "r" -# toggle_repeat -# -#def_key "z" -# toggle_random -# -#def_key "y" -# save_tag_changes -# -#def_key "y" -# start_searching -# -#def_key "y" -# toggle_single -# -#def_key "R" -# toggle_consume -# -#def_key "Y" -# toggle_replay_gain_mode -# -#def_key "T" -# toggle_add_mode -# -#def_key "|" -# toggle_mouse -# -#def_key "#" -# toggle_bitrate_visibility -# -#def_key "Z" -# shuffle -# -#def_key "x" -# toggle_crossfade -# -#def_key "X" -# set_crossfade -# -#def_key "u" -# update_database -# -#def_key "ctrl-s" -# sort_playlist -# -#def_key "ctrl-s" -# toggle_browser_sort_mode -# -#def_key "ctrl-s" -# toggle_media_library_sort_mode -# -#def_key "ctrl-r" -# reverse_playlist -# -#def_key "ctrl-_" -# select_found_items -# -#def_key "/" -# find -# -#def_key "/" -# find_item_forward -# -#def_key "?" -# find -# -#def_key "?" -# find_item_backward -# -#def_key "." -# next_found_item -# -#def_key "," -# previous_found_item -# -#def_key "w" -# toggle_find_mode -# -#def_key "e" -# edit_song -# -#def_key "e" -# edit_library_tag -# -#def_key "e" -# edit_library_album -# -#def_key "e" -# edit_directory_name -# -#def_key "e" -# edit_playlist_name -# -#def_key "e" -# edit_lyrics -# -#def_key "i" -# show_song_info -# -#def_key "I" -# show_artist_info -# -#def_key "g" -# jump_to_position_in_song -# -#def_key "l" -# show_lyrics -# -#def_key "ctrl-v" -# select_range -# -#def_key "v" -# reverse_selection -# -#def_key "V" -# remove_selection -# -#def_key "B" -# select_album -# -#def_key "a" -# add_selected_items -# -#def_key "c" -# clear_playlist -# -#def_key "c" -# clear_main_playlist -# -#def_key "C" -# crop_playlist -# -#def_key "C" -# crop_main_playlist -# -#def_key "m" -# move_sort_order_up -# -#def_key "m" -# move_selected_items_up -# -#def_key "m" -# set_visualizer_sample_multiplier -# -#def_key "n" -# move_sort_order_down -# -#def_key "n" -# move_selected_items_down -# -#def_key "M" -# move_selected_items_to -# -#def_key "A" -# add -# -#def_key "S" -# save_playlist -# -#def_key "o" -# jump_to_playing_song -# -#def_key "G" -# jump_to_browser -# -#def_key "G" -# jump_to_playlist_editor -# -#def_key "~" -# jump_to_media_library -# -#def_key "E" -# jump_to_tag_editor -# -#def_key "U" -# toggle_playing_song_centering -# -#def_key "P" -# toggle_display_mode -# -#def_key "\\" -# toggle_interface -# -#def_key "!" -# toggle_separators_between_albums -# -#def_key "L" -# toggle_lyrics_fetcher -# -#def_key "F" -# toggle_fetching_lyrics_in_background -# -#def_key "ctrl-l" -# toggle_screen_lock -# -#def_key "`" -# toggle_library_tag_type -# -#def_key "`" -# refetch_lyrics -# -#def_key "`" -# add_random_items -# -#def_key "ctrl-p" -# set_selected_items_priority -# -#def_key "q" -# quit -# diff --git a/config/ncmpcpp/config b/config/ncmpcpp/config deleted file mode 100644 index d9ed1d46..00000000 --- a/config/ncmpcpp/config +++ /dev/null @@ -1,433 +0,0 @@ -##### directories ###### -ncmpcpp_directory = ~/.config/ncmpcpp - -## Directory for storing downloaded lyrics. -lyrics_directory = ~/music/.db/lyrics - -##### connection settings ##### -mpd_host = "~/.config/mpd/mpd.sock" -#mpd_host = "127.0.0.1" -#mpd_port = 6600 -#mpd_connection_timeout = 5 - -## Needed for tag editor and file operations to work. -mpd_music_dir = ~/music -mpd_crossfade_time = 5 - -##### music visualizer ##### -## -## Note: In order to make music visualizer work you'll -## need to use mpd fifo output, whose format parameter -## has to be set to 44100:16:1 for mono visualization -## or 44100:16:2 for stereo visualization. Example -## configuration (it has to be put into mpd.conf): -## -## audio_output { -## type "fifo" -## name "Visualizer feed" -## path "/tmp/mpd.fifo" -## format "44100:16:2" -## } -## -#visualizer_fifo_path = /tmp/mpd.fifo - -## -## Note: Below parameter is needed for ncmpcpp -## to determine which output provides data for -## visualizer and thus allow syncing between -## visualization and sound as currently there -## are some problems with it. -## -#visualizer_output_name = Visualizer feed - -## -## If you set format to 44100:16:2, make it 'yes'. -## -visualizer_in_stereo = no - -## -## Multiply received samples by given value. Very -## useful for proper visualization of quiet music. -## -#visualizer_sample_multiplier = 1.0 - -## -## Note: Below parameter defines how often ncmpcpp -## has to "synchronize" visualizer and audio outputs. -## 30 seconds is optimal value, but if you experience -## synchronization problems, set it to lower value. -## Keep in mind that sane values start with >=10. -## -visualizer_sync_interval = 30 - -## -## Note: To enable spectrum frequency visualization -## you need to compile ncmpcpp with fftw3 support. -## -# -## Available values: spectrum, wave, wave_filled, ellipse. -visualizer_type = spectrum -## Alternative subset of 256 colors for terminals that support it. -#visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161 -visualizer_color = blue, cyan, green, yellow, magenta, red -#visualizer_look = ●▮ -# -##### system encoding ##### -## -## ncmpcpp should detect your charset encoding -## but if it failed to do so, you can specify -## charset encoding you are using here. -## -## Note: You can see whether your ncmpcpp build -## supports charset detection by checking output -## of `ncmpcpp --version`. -## -## Note: Since MPD uses UTF-8 by default, setting -## this option makes sense only if your encoding -## is different. -## -#system_encoding = "" -# -##### delays ##### -# -## Time of inactivity (in seconds) after playlist -## highlighting will be disabled (0 = always on). -## -#playlist_disable_highlight_delay = 5 -# -## Defines how long messages are supposed to be visible. -## -message_delay_time = 2 -# -##### song format ##### -## -## For a song format you can use: -## -## %l - length -## %f - filename -## %D - directory -## %a - artist -## %A - album artist -## %t - title -## %b - album -## %y - date -## %n - track number (01/12 -> 01) -## %N - full track info (01/12 -> 01/12) -## %g - genre -## %c - composer -## %p - performer -## %d - disc -## %C - comment -## %P - priority -## $R - begin right alignment -## -## If you want to make sure that a part of the format is displayed -## only when certain tags are present, you can archieve it by -## grouping them with brackets, e.g. '{%a - %t}' will be evaluated -## to 'ARTIST - TITLE' if both tags are present or '' otherwise. -## It is also possible to define a list of alternatives by providing -## several groups and separating them with '|', e.g. '{%t}|{%f}' -## will be evaluated to 'TITLE' or 'FILENAME' if the former is not -## present. -## -## Note: If you want to set limit on maximal length of a tag, just -## put the appropriate number between % and character that defines -## tag type, e.g. to make album take max. 20 terminal cells, use '%20b'. -## -## In addition, formats support markers used for text attributes. -## They are followed by character '$'. After that you can put: -## -## - 0 - default window color (discards all other colors) -## - 1 - black -## - 2 - red -## - 3 - green -## - 4 - yellow -## - 5 - blue -## - 6 - magenta -## - 7 - cyan -## - 8 - white -## - 9 - end of current color -## - b - bold text -## - u - underline text -## - r - reverse colors -## - a - use alternative character set -## -## If you don't want to use a non-color attribute anymore, just put it -## again, but this time insert character '/' between '$' and attribute -## character, e.g. {$b%t$/b}|{$r%f$/r} will display bolded title tag -## or filename with reversed colors. -## -## If you want to use 256 colors and/or background colors in formats -## (the naming scheme is described below in section about color -## definitions), it can be done with the syntax $(COLOR), e.g. to set -## the artist tag to one of the non-standard colors and make it have -## yellow background, you need to write $(197_yellow)%a$(end). Note -## that for standard colors this is interchangable with attributes -## listed above. -## -## Note: colors can be nested. -## -# -# song_list_format = {%a }$2%t$9 %C $R{%b }$2%25l$9 -#song_list_format = {{$5%a$9 }{$7%A$9 }}{%n }$(16)%t$(end) $R{$8%l$9} -# song_status_format = {{%a{ $3%b{ (%y)}$9} }{$8%t$9}}|{%f} -#song_library_format = {%n - }{%t}|{%f} -song_list_format = "{$2%a$9} {$5%t$9} $R {$3%b$3} $9({$9%l$9})" -song_library_format = "%n %t" -song_status_format = "$b{$6%a$9 $1|$9} {$7%t$9} $1|$9 {$2%b$9} $1|$9 {$6%y$9} $1|$9" -# -# -#alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b -#alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D} -# -now_playing_prefix = "$(3_236)> " -now_playing_suffix = $0 -# -#browser_playlist_prefix = "$2playlist$9 " -# -selected_item_prefix = "$(6_237)+ " -selected_item_suffix = $9 -# -# modified_item_prefix = $3> $9 -# -## -## Note: attributes are not supported for the following variables. -## -#song_window_title_format = {%a - }{%t}|{%f} -## -## Note: Below variables are used for sorting songs in browser. -## The sort mode determines how songs are sorted, and can be used -## in combination with a sort format to specify a custom sorting format. -## Available values for browser_sort_mode are "name", "mtime", "format" -## and "noop". -## -# -#browser_sort_mode = name -#browser_sort_format = {%a - }{%t}|{%f} {(%l)} -# -##### columns settings ##### -## -## syntax of song columns list format is "column column etc." -## -## - syntax for each column is: -## -## (width of the column)[color of the column]{displayed tag} -## -## Note: Width is by default in %, if you want a column to -## have fixed size, add 'f' after the value, e.g. (10)[white]{a} -## will be the column that take 10% of screen (so the real width -## will depend on actual screen size), whereas (10f)[white]{a} -## will take 10 terminal cells, no matter how wide the screen is. -## -## - color is optional (if you want the default one, -## leave the field empty). -## -## Note: You can give a column additional attributes by putting appropriate -## character after displayed tag character. Available attributes are: -## -## - r - column will be right aligned -## - E - if tag is empty, empty tag marker won't be displayed -## -## You can also: -## -## - give a column custom name by putting it after attributes, -## separated with character ':', e.g. {lr:Length} gives you -## right aligned column of lengths named "Length". -## -## - define sequence of tags, that have to be displayed in case -## predecessor is empty in a way similar to the one in classic -## song format, i.e. using '|' character, e.g. {a|c|p:Owner} -## creates column named "Owner" that tries to display artist -## tag and then composer and performer if previous ones are -## not available. -## -song_columns_list_format = (3f)[241]{NEr:#} (8f)[5]{l} (22)[6]{a|A:Artist} (40)[9]{t|f:Title} (30)[13]{b} -# -##### various settings ##### -# -## -## Note: Custom command that will be executed each -## time song changes. Useful for notifications etc. -## -execute_on_song_change = "mpd-notify-song" -#playlist_show_mpd_host = no -playlist_show_remaining_time = yes -playlist_shorten_total_times = yes -#playlist_separate_albums = no -# -## -## Note: Possible display modes: classic, columns. -## -playlist_display_mode = classic -browser_display_mode = columns -#search_engine_display_mode = classic -#playlist_editor_display_mode = classic -discard_colors_if_item_is_selected = yes -incremental_seeking = yes -seek_time = 2 -volume_change_step = 10 -#autocenter_mode = no -#centered_cursor = no -# -## -## Note: You can specify third character which will -## be used to build 'empty' part of progressbar. -## -progressbar_look = "─╼ " -#progressbar_boldness -progressbar_color = 1 -progressbar_elapsed_color = 4 -# -## Available values: database, playlist. -## -#default_place_to_search_in = database -# -## Available values: classic, alternative. -## -user_interface = alternative -#data_fetching_delay = yes -# -## Available values: artist, album_artist, date, genre, composer, performer. -## -#media_library_primary_tag = artist -# -## Available values: wrapped, normal. -## -#default_find_mode = wrapped -#default_tag_editor_pattern = %n - %t -header_visibility = yes -statusbar_visibility = yes -titles_visibility = no -#header_text_scrolling = yes -#cyclic_scrolling = no -#lines_scrolled = 2 -#follow_now_playing_lyrics = no -#fetch_lyrics_for_current_song_in_background = no -#store_lyrics_in_song_dir = no -#generate_win32_compatible_filenames = yes -allow_for_physical_item_deletion = yes -# -## -## Note: If you set this variable, ncmpcpp will try to -## get info from last.fm in language you set and if it -## fails, it will fall back to english. Otherwise it will -## use english the first time. -## -## Note: Language has to be expressed as an ISO 639 alpha-2 code. -## -#lastfm_preferred_language = en -#show_hidden_files_in_local_browser = no -# -## -## How shall screen switcher work? -## -## - "previous" - switch between the current and previous screen. -## - "screen1,...,screenN" - switch between given sequence of screens. -## -## Screens available for use: help, playlist, browser, search_engine, -## media_library, playlist_editor, tag_editor, outputs, visualizer, clock. -## -#screen_switcher_mode = playlist, browser -# -## -## Note: You can define startup screen -## by choosing screen from the list above. -## -#startup_screen = playlist -# -## -## Note: You can define startup slave screen -## by choosing screen from the list above or -## an empty value for no slave screen. -## -#startup_slave_screen = "" -#startup_slave_screen_focus = no -# -## -## Default width of locked screen (in %). -## Acceptable values are from 20 to 80. -## -# -#locked_screen_width_part = 50 -#ask_for_locked_screen_width_part = yes -jump_to_now_playing_song_at_start = yes -#ask_before_clearing_playlists = yes -#clock_display_seconds = no -#display_volume_level = no -#display_bitrate = yes -display_remaining_time = no -# -## Available values: none, basic, extended, perl. -## -#regular_expressions = perl -# -## -## Note: If below is enabled, ncmpcpp will ignore leading -## "The" word while sorting items in browser, tags in -## media library, etc. -## -#ignore_leading_the = no -#block_search_constraints_change_if_items_found = yes -#mouse_support = yes -#mouse_list_scroll_whole_page = yes -empty_tag_marker = -#tags_separator = " | " -tag_editor_extended_numeration = yes -#media_library_sort_by_mtime = no -enable_window_title = yes -# -## -## Note: You can choose default search mode for search -## engine. Available modes are: -## -## - 1 - use mpd built-in searching (no regexes, pattern matching) -## - 2 - use ncmpcpp searching (pattern matching with support for regexes, -## but if your mpd is on a remote machine, downloading big database -## to process it can take a while -## - 3 - match only exact values (this mode uses mpd function for searching -## in database and local one for searching in current playlist) -## -search_engine_default_search_mode = 2 -external_editor = vim - -## Note: set to yes if external editor is a console application. -use_console_editor = yes - -##### colors definitions ##### -## -## It is possible to set a background color by setting a color -## value "_", e.g. red_black will set -## foregound color to red and background color to black. -## -## In addition, for terminals that support 256 colors it -## is possible to set one of them by using a number in range -## [1, 256] instead of color name, e.g. numerical value -## corresponding to red_black is 2_1. To find out if the -## terminal supports 256 colors, run ncmpcpp and check out -## the bottom of the help screen for list of available colors -## and their numerical values. -## -## Note: due to technical limitations of ncurses, if 256 colors -## are used, it is possible to either use only the colors with -## default background color, or all pairs from 1_1 up to 254_127, -## depending on the ncurses version used. -## -colors_enabled = yes -empty_tag_color = 13 -header_window_color = 241 -volume_color = 239 -state_line_color = 13 -state_flags_color = 13 -main_window_color = green -color1 = white -color2 = blue -# main_window_highlight_color = yellow -statusbar_color = 13 -statusbar_time_color = 6 -player_state_color = 14 -alternative_ui_separator_color = 2 -current_item_prefix = $(9_238) -current_item_suffix = $(end) -# active_column_color = red -window_border_color = 13 -active_window_border = 13 diff --git a/config/qutebrowser/config.py b/config/qutebrowser/config.py deleted file mode 100644 index f2547de4..00000000 --- a/config/qutebrowser/config.py +++ /dev/null @@ -1,349 +0,0 @@ -import os -import glob - -## Load settings applied with :set -config.load_autoconfig() - -## General config -c.content.default_encoding = 'utf-8' -c.content.javascript.enabled = True -c.content.local_storage = True -c.content.plugins = True - -c.editor.encoding = 'utf-8' - -## Security & privacy -c.content.autoplay = False # don't autoplay videos - -## Adblocking -# Use (superior) Brave adblock if available, or fall back to host blocking -c.content.blocking.method = "auto" -c.content.blocking.hosts.lists = [ - 'https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts', - 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext' - # 'https://www.malwaredomainlist.com/hostslist/hosts.txt', - # 'http://someonewhocares.org/hosts/hosts', - # 'http://winhelp2002.mvps.org/hosts.zip', - # 'http://malwaredomains.lehigh.edu/files/justdomains.zip', -] -# c.content.blocking.whitelist = [] - -## Options -c.downloads.position = 'bottom' -c.downloads.location.directory = os.path.expanduser("~/dl") -c.downloads.location.prompt = False -c.input.insert_mode.auto_leave = True -c.input.insert_mode.auto_load = False -c.input.links_included_in_focus_chain = False -c.new_instance_open_target = 'tab-silent' -c.prompt.filebrowser = False -c.prompt.radius = 0 -c.spellcheck.languages = ['en-US'] -c.session.lazy_restore = True -c.tabs.show = 'multiple' -c.tabs.title.format = '{audio}{current_title} - {host}' -c.tabs.title.format_pinned = '' -c.window.title_format = '{current_title} - {host} - qutebrowser' - - -# -## Keybindings - -# Universal Emacsien C-g alias for Escape -config.bind('', 'clear-keychain ;; search ;; fullscreen --leave') -for mode in ['caret', 'command', 'hint', 'insert', 'passthrough', 'prompt', 'register']: - config.bind('', 'mode-leave', mode=mode) - -# ... -config.bind('zz', 'close') -config.bind('tm', 'tab-mute') -config.bind('wi', 'devtools bottom') -config.bind(';;', 'hint inputs --first') # easier to reach than ;t -config.bind(';e', 'hint inputs --first ;; fake-key ;; :spawn nohup bspc rule -a "Emacs:*" -o state=floating sticky=on && emacsclient --eval "(emacs-everywhere)"') -# ;v already bound to 'spawn mpv {url}' -config.bind(';V', 'hint links spawn mpv {hint-url}') - -# Use external editor -c.editor.command = ['emacsclient', '-c', '-F', '((name . "qutebrowser-editor"))', '+{line}:{column}', '{}'] -# Though we set it, I use the more specialzied emacs-everywhere instead -config.bind('', 'edit-text', mode='insert') -config.bind('', 'hint inputs --first ;; edit-text', mode='normal') -config.bind('', 'fake-key ', mode='insert') - -# Vaultwarden integration -config.bind(";pp", 'spawn -u qute-bwmenu') -config.bind(";pu", 'spawn -u qute-bwmenu --field username') -config.bind(";ps", 'spawn -u qute-bwmenu --field password') -config.bind(";po", 'spawn -u qute-bwmenu --field otp') -config.bind(";pl", 'spawn -u qute-bwmenu --last') - -## Ex-commands - - -## Bindings for normal mode -# config.bind("'", 'enter-mode jump_mark') -# config.bind('+', 'zoom-in') -# config.bind('-', 'zoom-out') -# config.bind('.', 'repeat-command') -# config.bind('/', 'set-cmd-text /') -# config.bind(':', 'set-cmd-text :') -# config.bind(';I', 'hint images tab') -# config.bind(';O', 'hint links fill :open -t -r {hint-url}') -# config.bind(';R', 'hint --rapid links window') -# config.bind(';Y', 'hint links yank-primary') -# config.bind(';b', 'hint all tab-bg') -# config.bind(';d', 'hint links download') -# config.bind(';f', 'hint all tab-fg') -# config.bind(';h', 'hint all hover') -# config.bind(';i', 'hint images') -# config.bind(';o', 'hint links fill :open {hint-url}') -# config.bind(';r', 'hint --rapid links tab-bg') -# config.bind(';t', 'hint inputs') -# config.bind(';y', 'hint links yank') -# config.bind('', 'tab-focus 1') -# config.bind('', 'tab-focus 2') -# config.bind('', 'tab-focus 3') -# config.bind('', 'tab-focus 4') -# config.bind('', 'tab-focus 5') -# config.bind('', 'tab-focus 6') -# config.bind('', 'tab-focus 7') -# config.bind('', 'tab-focus 8') -# config.bind('', 'tab-focus -1') -# config.bind('', 'navigate increment') -# config.bind('', 'print') -# config.bind('', 'scroll-page 0 -1') -# config.bind('', 'scroll-page 0 0.5') -# config.bind('', 'reload -f') -# config.bind('', 'scroll-page 0 1') -# config.bind('', 'open -w') -# config.bind('', 'tab-next') -# config.bind('', 'tab-prev') -# config.bind('', 'quit') -# config.bind('', 'follow-selected -t') -# config.bind('', 'open -p') -# config.bind('', 'undo') -# config.bind('', 'close') -# config.bind('', 'open -t') -# config.bind('', 'tab-focus last') -# config.bind('', 'scroll-page 0 -0.5') -# config.bind('', 'enter-mode passthrough') -# config.bind('', 'tab-close') -# config.bind('', 'navigate decrement') -# config.bind('', 'tab-focus last') -# config.bind('', 'home') -# config.bind('', 'tab-pin') -# config.bind('', 'stop') -# config.bind('', 'clear-keychain ;; search ;; fullscreen --leave') -# config.bind('', 'fullscreen') -# config.bind('', 'reload') -# config.bind('', 'follow-selected') -# config.bind('', 'back') -# config.bind('', 'forward') -# config.bind('=', 'zoom') -# config.bind('?', 'set-cmd-text ?') -# config.bind('@', 'run-macro') -# config.bind('B', 'set-cmd-text -s :quickmark-load -t') -# config.bind('D', 'tab-close -o') -# config.bind('F', 'hint all tab') -# config.bind('G', 'scroll-to-perc') -# config.bind('H', 'back') -# config.bind('J', 'tab-next') -# config.bind('K', 'tab-prev') -# config.bind('L', 'forward') -# config.bind('M', 'bookmark-add') -# config.bind('N', 'search-prev') -# config.bind('O', 'set-cmd-text -s :open -t') -# config.bind('PP', 'open -t -- {primary}') -# config.bind('Pp', 'open -t -- {clipboard}') -# config.bind('R', 'reload -f') -# config.bind('Sb', 'open qute://bookmarks#bookmarks') -# config.bind('Sh', 'open qute://history') -# config.bind('Sq', 'open qute://bookmarks') -# config.bind('Ss', 'open qute://settings') -# config.bind('T', 'tab-focus') -# config.bind('ZQ', 'quit') -# config.bind('ZZ', 'quit --save') -# config.bind('[[', 'navigate prev') -# config.bind(']]', 'navigate next') -# config.bind('`', 'enter-mode set_mark') -# config.bind('ad', 'download-cancel') -# config.bind('b', 'set-cmd-text -s :quickmark-load') -# config.bind('cd', 'download-clear') -# config.bind('co', 'tab-only') -# config.bind('d', 'tab-close') -# config.bind('f', 'hint') -# config.bind('g$', 'tab-focus -1') -# config.bind('g0', 'tab-focus 1') -# config.bind('gB', 'set-cmd-text -s :bookmark-load -t') -# config.bind('gC', 'tab-clone') -# config.bind('gO', 'set-cmd-text :open -t -r {url:pretty}') -# config.bind('gU', 'navigate up -t') -# config.bind('g^', 'tab-focus 1') -# config.bind('ga', 'open -t') -# config.bind('gb', 'set-cmd-text -s :bookmark-load') -# config.bind('gd', 'download') -# config.bind('gf', 'view-source') -# config.bind('gg', 'scroll-to-perc 0') -# config.bind('gl', 'tab-move -') -# config.bind('gm', 'tab-move') -# config.bind('go', 'set-cmd-text :open {url:pretty}') -# config.bind('gr', 'tab-move +') -# config.bind('gt', 'set-cmd-text -s :buffer') -# config.bind('gu', 'navigate up') -# config.bind('h', 'scroll left') -# config.bind('i', 'enter-mode insert') -# config.bind('j', 'scroll down') -# config.bind('k', 'scroll up') -# config.bind('l', 'scroll right') -# config.bind('m', 'quickmark-save') -# config.bind('n', 'search-next') -# config.bind('o', 'set-cmd-text -s :open') -# config.bind('pP', 'open -- {primary}') -# config.bind('pp', 'open -- {clipboard}') -# config.bind('q', 'record-macro') -# config.bind('r', 'reload') -# config.bind('sf', 'save') -# config.bind('sk', 'set-cmd-text -s :bind') -# config.bind('sl', 'set-cmd-text -s :set -t') -# config.bind('ss', 'set-cmd-text -s :set') -# config.bind('th', 'back -t') -# config.bind('tl', 'forward -t') -# config.bind('u', 'undo') -# config.bind('v', 'enter-mode caret') -# config.bind('wB', 'set-cmd-text -s :bookmark-load -w') -# config.bind('wO', 'set-cmd-text :open -w {url:pretty}') -# config.bind('wP', 'open -w -- {primary}') -# config.bind('wb', 'set-cmd-text -s :quickmark-load -w') -# config.bind('wf', 'hint all window') -# config.bind('wh', 'back -w') -# config.bind('wi', 'inspector') -# config.bind('wl', 'forward -w') -# config.bind('wo', 'set-cmd-text -s :open -w') -# config.bind('wp', 'open -w -- {clipboard}') -# config.bind('xO', 'set-cmd-text :open -b -r {url:pretty}') -# config.bind('xb', 'config-cycle statusbar.hide') -# config.bind('xo', 'set-cmd-text -s :open -b') -# config.bind('xt', 'config-cycle tabs.show always switching') -# config.bind('xx', 'config-cycle statusbar.hide ;; config-cycle tabs.show always switching') -# config.bind('yD', 'yank domain -s') -# config.bind('yP', 'yank pretty-url -s') -# config.bind('yT', 'yank title -s') -# config.bind('yY', 'yank -s') -# config.bind('yd', 'yank domain') -# config.bind('yp', 'yank pretty-url') -# config.bind('yt', 'yank title') -# config.bind('yy', 'yank') -# config.bind('{{', 'navigate prev -t') -# config.bind('}}', 'navigate next -t') - -## Bindings for caret mode -# config.bind('$', 'move-to-end-of-line', mode='caret') -# config.bind('0', 'move-to-start-of-line', mode='caret') -# config.bind('', 'drop-selection', mode='caret') -# config.bind('', 'leave-mode', mode='caret') -# config.bind('', 'yank selection', mode='caret') -# config.bind('', 'toggle-selection', mode='caret') -# config.bind('G', 'move-to-end-of-document', mode='caret') -# config.bind('H', 'scroll left', mode='caret') -# config.bind('J', 'scroll down', mode='caret') -# config.bind('K', 'scroll up', mode='caret') -# config.bind('L', 'scroll right', mode='caret') -# config.bind('Y', 'yank selection -s', mode='caret') -# config.bind('[', 'move-to-start-of-prev-block', mode='caret') -# config.bind(']', 'move-to-start-of-next-block', mode='caret') -# config.bind('b', 'move-to-prev-word', mode='caret') -# config.bind('c', 'enter-mode normal', mode='caret') -# config.bind('e', 'move-to-end-of-word', mode='caret') -# config.bind('gg', 'move-to-start-of-document', mode='caret') -# config.bind('h', 'move-to-prev-char', mode='caret') -# config.bind('j', 'move-to-next-line', mode='caret') -# config.bind('k', 'move-to-prev-line', mode='caret') -# config.bind('l', 'move-to-next-char', mode='caret') -# config.bind('v', 'toggle-selection', mode='caret') -# config.bind('w', 'move-to-next-word', mode='caret') -# config.bind('y', 'yank selection', mode='caret') -# config.bind('{', 'move-to-end-of-prev-block', mode='caret') -# config.bind('}', 'move-to-end-of-next-block', mode='caret') - -## Bindings for command mode -# config.bind('', 'rl-backward-word', mode='command') -# config.bind('', 'rl-backward-kill-word', mode='command') -# config.bind('', 'rl-kill-word', mode='command') -# config.bind('', 'rl-forward-word', mode='command') -# config.bind('', 'rl-delete-char', mode='command') -# config.bind('', 'rl-beginning-of-line', mode='command') -# config.bind('', 'rl-backward-char', mode='command') -# config.bind('', 'completion-item-del', mode='command') -# config.bind('', 'rl-end-of-line', mode='command') -# config.bind('', 'rl-forward-char', mode='command') -config.bind('', 'rl-backward-word', mode='command') -config.bind('', 'rl-forward-word', mode='command') -# config.bind('', 'rl-backward-delete-char', mode='command') -# config.bind('', 'rl-kill-line', mode='command') -# config.bind('', 'command-history-next', mode='command') -# config.bind('', 'command-history-prev', mode='command') -# config.bind('', 'completion-item-focus prev-category', mode='command') -# config.bind('', 'completion-item-focus next-category', mode='command') -# config.bind('', 'rl-unix-line-discard', mode='command') -# config.bind('', 'rl-unix-word-rubout', mode='command') -# config.bind('', 'rl-yank', mode='command') -# config.bind('', 'command-history-next', mode='command') -# config.bind('', 'leave-mode', mode='command') -# config.bind('', 'command-accept', mode='command') -# config.bind('', 'completion-item-del', mode='command') -# config.bind('', 'completion-item-focus prev', mode='command') -# config.bind('', 'completion-item-focus next', mode='command') -# config.bind('', 'command-history-prev', mode='command') - -## Bindings for hint mode -# config.bind('', 'hint all tab-bg', mode='hint') -# config.bind('', 'hint links', mode='hint') -# config.bind('', 'hint --rapid links tab-bg', mode='hint') -# config.bind('', 'mode-leave', mode='hint') -# config.bind('', 'follow-hint', mode='hint') - -## Bindings for insert mode -# config.bind('', 'open-editor', mode='insert') -# config.bind('', 'leave-mode', mode='insert') -# config.bind('', 'insert-text {primary}', mode='insert') - -## Bindings for passthrough mode -# config.bind('', 'leave-mode', mode='passthrough') - -## Bindings for prompt mode -# config.bind('', 'rl-backward-word', mode='prompt') -# config.bind('', 'rl-backward-kill-word', mode='prompt') -# config.bind('', 'rl-kill-word', mode='prompt') -# config.bind('', 'rl-forward-word', mode='prompt') -# config.bind('', 'rl-delete-char', mode='prompt') -# config.bind('', 'rl-beginning-of-line', mode='prompt') -# config.bind('', 'rl-backward-char', mode='prompt') -# config.bind('', 'rl-end-of-line', mode='prompt') -# config.bind('', 'rl-forward-char', mode='prompt') -config.bind('', 'rl-backward-word', mode='prompt') -config.bind('', 'rl-forward-word', mode='prompt') -# config.bind('', 'rl-backward-delete-char', mode='prompt') -# config.bind('', 'rl-kill-line', mode='prompt') -# config.bind('', 'rl-unix-line-discard', mode='prompt') -# config.bind('', 'rl-unix-word-rubout', mode='prompt') -# config.bind('', 'prompt-open-download', mode='prompt') -# config.bind('', 'rl-yank', mode='prompt') -# config.bind('', 'prompt-item-focus next', mode='prompt') -# config.bind('', 'leave-mode', mode='prompt') -# config.bind('', 'prompt-accept', mode='prompt') -# config.bind('', 'prompt-item-focus prev', mode='prompt') -# config.bind('', 'prompt-item-focus next', mode='prompt') -# config.bind('', 'prompt-item-focus prev', mode='prompt') -# config.bind('n', 'prompt-accept no', mode='prompt') -# config.bind('y', 'prompt-accept yes', mode='prompt') - -## Bindings for register mode -# config.bind('', 'leave-mode', mode='register') - -## Per-domain settings -c.content.user_stylesheets = glob.glob(os.path.expanduser('~/.local/share/qutebrowser/userstyles.css')) - - -## Load theme -for path in glob.glob(os.path.expanduser('~/.config/qutebrowser/extra/*.py')): - config.source(path) diff --git a/config/qutebrowser/greasemonkey/let-there-be-light.user.js b/config/qutebrowser/greasemonkey/let-there-be-light.user.js deleted file mode 100644 index 4f306856..00000000 --- a/config/qutebrowser/greasemonkey/let-there-be-light.user.js +++ /dev/null @@ -1,23 +0,0 @@ -// ==UserScript== -// @name Let there be Light -// @description Change page background to white. -// @version 0.1 -// @author Ingvix -// @include * -// ==/UserScript== - -// Needed to counterbalance my colors.webpage.bg hack to prevent the blinding -// flash of white between page loads. -(function () { - 'use strict'; - - function _bg(element) { - return window.getComputedStyle(element).backgroundColor; - } - - if (_bg(document.documentElement) === "rgba(0, 0, 0, 0)" && - _bg(document.body) === "rgba(0, 0, 0, 0)") { - var sheet = window.document.styleSheets[0]; - sheet.insertRule('body { background-color: white; }', sheet.cssRules.length); - } -})(); diff --git a/config/qutebrowser/greasemonkey/per-domain-stylesheets.user.js b/config/qutebrowser/greasemonkey/per-domain-stylesheets.user.js deleted file mode 100644 index 8f2f54c6..00000000 --- a/config/qutebrowser/greasemonkey/per-domain-stylesheets.user.js +++ /dev/null @@ -1,21 +0,0 @@ -// ==UserScript== -// @name DomainStyles -// @namespace https://github.com/hlissner -// @description Make it possible to use per-domain stylesheets. -// @include * -// @run-at document-start -// @version 1 -// @author Henrik Lissner -// ==/UserScript== - -(function () { - 'use strict'; - - document.addEventListener('readystatechange', function onReadyStateChange() { - if (document.readyState == 'interactive') { - const doc = document.documentElement; - doc.setAttribute('qb-url', window.location.href); - doc.setAttribute('qb-domain', window.location.host); - } - }); -})(); diff --git a/config/stumpwm/config b/config/stumpwm/config deleted file mode 100644 index ed0213ef..00000000 --- a/config/stumpwm/config +++ /dev/null @@ -1,124 +0,0 @@ -;; -*- lisp -*- -;; -;; Author: Henrik Lissner -;; URL: https://github.com/hlissner/doom-emacs -;; -;;; -(in-package :stumpwm) -;; (swank:create-server -;; :dont-close t -;; :port swank::default-server-port) - -;;; -(defvar *config-dir* "~/.config/dotfiles/config/stumpwm") - -(defcommand reload-dotfiles () () - (load (concat *config-dir* "/config")) - (message "Config reloaded")) -(define-key *top-map* (kbd "s-r") "reload-dotfiles") - -;; (load (concat *config-dir* "/core/core.lisp")) - - -(defun show-key-seq (key seq val) - (message (print-key-seq (reverse seq)))) -(add-hook *key-press-hook* 'show-key-seq) - - -;;; Config -(setf *mouse-focus-policy* :click) -(set-font "-CTDB-Fira Sans-normal-normal-normal-*-12-*-*-*-m-0-iso10646-1") - - -;;; Keybinds -(set-prefix-key (kbd "C-z")) -(define-key *top-map* (kbd "C-RET") "exec urxvt") - -(let ((map *top-map*)) - ;; (gnew "a") - ;; (gnew "b") - ;; (gnew "c") - (dotimes (i 9) - (define-key map (kbd (format nil "s-~D" i)) - (format nil "gselect ~D" i)) - (define-key map (kbd (format nil "s-S-~D" i)) - (format nil "gmove ~D" i)))) - -;; Window management -(define-key *top-map* (kbd "s-f") "float-this") -(define-key *top-map* (kbd "s-F") "unfloat-this") - -(define-key *top-map* (kbd "s-h") "move-focus left") -(define-key *top-map* (kbd "s-j") "move-focus down") -(define-key *top-map* (kbd "s-k") "move-focus up") -(define-key *top-map* (kbd "s-l") "move-focus right") - -(define-key *top-map* (kbd "s-H") "move-window left") -(define-key *top-map* (kbd "s-J") "move-window down") -(define-key *top-map* (kbd "s-K") "move-window up") -(define-key *top-map* (kbd "s-L") "move-window right") - -(define-key *top-map* (kbd "s-RET") "exec xst") -(define-key *top-map* (kbd "s-SPC") "exec rofi/appmenu") - -(define-key *top-map* (kbd "s-TAB") "next-in-frame") -(define-key *top-map* (kbd "s-ISO_Left_Tab") "prev-in-frame") - -(define-key *top-map* (kbd "s-`") "exec scratch") - - -(defvar *window-manipulation-map* (make-sparse-keymap)) - -(defcommand kill-or-delete-window () () - (and (delete-window) - (remove-split))) - -(define-key *top-map* (kbd "s-q") "delete-window") -(define-key *top-map* (kbd "s-Q") "kill-or-delete-window") -(define-key *top-map* (kbd "s-w") *window-manipulation-map*) -(let ((map *window-manipulation-map*)) - (define-key map (kbd "s-c") "remove-split") - (define-key map (kbd "s-s") "hsplit") - (define-key map (kbd "s-v") "vsplit")) - - -;;; Modeline -(setf *bar-med-color* "^B^3") -(setf *bar-hi-color* "^B^3") -(setf *bar-crit-color* "^B^1") - -(setf *colors* - '("#101216" ; fg - "#f9a03f" ; orange - "#8BD49C" ; green - "#8abeb7" ; cyan - "#5EC4FF" ; blue - "#cc6666" ; red - "#E27E8D" ; magenta - "#f0c674" ; yellow - )) - -(update-color-map (current-screen)) - -(setf *group-format* " %t ") -(setf *window-format* "%m%s%20t ") -(setf *mode-line-timeout* 1) - -(setf *time-modeline-string* "^B^3 %e %b %H:%M ^n") - -(set-focus-color (elt *colors* 6)) -(set-unfocus-color (elt *colors* 0)) - -(setf *screen-mode-line-format* - (list "^B^3%g ^n^b %W ^> " - "  %B  %d" - )) - -(setf *mode-line-border-width* 0) -(setf *mode-line-pad-x* 0) -(setf *mode-line-pad-y* 0) -(setf *mode-line-background-color* (elt *colors* 0)) -(setf *mode-line-foreground-color* (elt *colors* 1)) - -(unless (head-mode-line (current-head)) - (toggle-mode-line (current-screen) (current-head))) diff --git a/config/sxhkd/sxhkdrc b/config/sxhkd/sxhkdrc deleted file mode 100644 index d9acf138..00000000 --- a/config/sxhkd/sxhkdrc +++ /dev/null @@ -1,129 +0,0 @@ -super + alt + Escape - bspc quit - -super + {_,shift + }q - bspc node -{c,k} - -super + t - bspc desktop -l next - -super + apostrophe - bspc window -s last - -# Attach to a detached session. If none is available create a new one, rather -# than attach to one that is already attached to elsewhere. -super + Return - kitty - -ctrl + super + Return - xst -e bash -c "(tmux ls | grep -qEv 'attached|scratch' && tmux at) || tmux" - -# Open a disposable, floating terminal window, for quick shell commands. -super + grave - scratch - -# Open a disposable scratch buffer in a floating Emacs window, to run arbitrary -# code or quickly note something down. -super + shift + grave - emacsclient --eval "(open-scratch-frame)" - -# Invoke emacs-everywhere at point. -super + e - emacsclient --eval "(emacs-everywhere)" - -super + space - $DOTFILES_BIN/rofi/appmenu - -super + Tab - $DOTFILES_BIN/rofi/windowmenu - -super + p - $DOTFILES_BIN/rofi/bwmenu - -super + shift + p - $DOTFILES_BIN/rofi/bwmenu -r - -super + slash - $DOTFILES_BIN/rofi/filemenu -x - -super + Escape - pkill -USR1 -x sxhkd - - -# -## - -## Toggle floating/fullscreen -super + {_,ctrl + }f - bspc node -t ~{floating,fullscreen} - - -super + {_,ctrl +}{h,j,k,l} - $DOTFILES_BIN/bspwm/focus {_,-m }{west,south,north,east} - -super + shift + {_,ctrl +}{h,j,k,l} - $DOTFILES_BIN/bspwm/swap {_,-m }{west,south,north,east} - -## Resize by preselection -super + alt + {1-9} - $DOTFILES/bin/bspwm/presel 0.{1-9} - -super + alt + {h,j,k,l} - bspc node -p {west,south,north,east} - -super + alt + Return - $DOTFILES/bin/bspwm/subtract-presel - -super + alt + Delete - bspc node -p cancel - -super + {_,shift +}{1-9,0} - bspc {desktop -f,node -d} {1-9,10}; - -# expand a window by moving one of its side outward -super + {Left,Down,Up,Right} - bspc node -z {left -40 0,bottom 0 40,top 0 -40,right 40 0} - -# contract a window by moving one of its side inward -super + ctrl + {Left,Down,Up,Right} - bspc node -z {right -40 0,top 0 40,bottom 0 -40,left 40 0} - -# move a floating window -super + shift + {Left,Down,Up,Right} - bspc node -v {-40 0,0 40,0 -40,40 0} - - -# -## Media keys - -# screenshot region -Print - scrcap -# screencast region to mp4 -super + Print - scrrec -s ~/recordings/$(date +%F-%T).mp4 -# screencast region to gif -super + ctrl + Print - scrrec -s ~/recordings/$(date +%F-%T).gif - -XF86MonBrightnessUp - light -A 5 -XF86MonBrightnessDown - light -U 5 - -XF86AudioMute - amixer -q set Master toggle -XF86AudioLowerVolume - amixer -q set Master 10%- unmute -XF86AudioRaiseVolume - amixer -q set Master 10%+ unmute - -XF86Audio{Play,Pause} - spt-send toggle -XF86AudioNext - spt-send next -XF86AudioPrev - spt-send prev - -# X86Search - diff --git a/config/tmux/aliases.zsh b/config/tmux/aliases.zsh deleted file mode 100644 index 4480414c..00000000 --- a/config/tmux/aliases.zsh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env zsh - -alias ta='tmux attach' -alias tl='tmux ls' - -if [[ -n $TMUX ]]; then # From inside tmux - alias tf='tmux find-window' - # Detach all other clients to this session - alias mine='tmux detach -a' - # Send command to other tmux window - tt() { - tmux send-keys -t .+ C-u && \ - tmux set-buffer "$*" && \ - tmux paste-buffer -t .+ && \ - tmux send-keys -t .+ Enter; - } - # Create new session (from inside one) - tn() { - local name="${1:-`basename $PWD`}" - TMUX= tmux new-session -d -s "$name" - tmux switch-client -t "$name" - tmux display-message "Session #S created" - } -else # From outside tmux - # Start grouped session so I can be in two different windows in one session - tdup() { tmux new-session -t "${1:-`tmux display-message -p '#S'`}"; } -fi diff --git a/config/tmux/swap-pane.sh b/config/tmux/swap-pane.sh deleted file mode 100755 index f5a6e989..00000000 --- a/config/tmux/swap-pane.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash -CONF="$TMUX_PLUGINS_PATH/lastpane" -swap() { tmux swap-pane -s"$1" -t"$2"; } - -target= -case $1 in - up) target="U" ;; - down) target="D" ;; - left) target="L" ;; - right) target="R" ;; - master) target="M" ;; - *) exit 1 ;; -esac - -src_pane=$(tmux display-message -p "#P") -tmux select-pane -${target} - -dst_pane=$(tmux display-message -p "#P") -tmux select-pane -${src_pane} - -[[ "$target" == M ]] && dst_pane=0 -swap "$src_pane" "$dst_pane" -tmux select-pane -t"$dst_pane" diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf deleted file mode 100644 index 82412e2a..00000000 --- a/config/tmux/tmux.conf +++ /dev/null @@ -1,124 +0,0 @@ -# tmux.conf -# By Henrik Lissner -# https://github.com/hlissner/dotfiles -######################################## - -set -g default-terminal "xterm-256color" - -new-session # spawn session if attaching when none are running - -setw -g automatic-rename on # rename window after current program -set -g renumber-windows on # renumber windows when one is closed -# Zero-based indexing is fine in programming languages, but not so much in a -# multiplexer when zero is on the other side of the keyboard. -set -g base-index 1 -setw -g pane-base-index 1 -# display tmux messages longer -set -g display-time 1500 -set -g display-panes-time 800 -# Address vim-mode switching delay (http://superuser.com/a/252717/65504) -set -s escape-time 0 -set -sg repeat-time 600 -set -g history-limit 10000 -# Rather than constraining window size to the maximum size of any client -# connected to the *session*, constrain window size to the maximum size of any -# client connected to *that window*. Much more reasonable. -setw -g aggressive-resize off -# For terminals that support them, propagate these events to programs that -# understand them. -set -s focus-events on -# Enable mouse + mouse wheel -set -g mouse on - -######################################## -# Keybinds # -######################################## - -# Rebind prefix to C-c. Press twice to send literal C-c. -unbind C-b -set -g prefix C-c -bind C-c send-prefix - -# Vi-style keybinds -set -g status-keys vi -set -g mode-keys vi - -bind c new-window -c "#{pane_current_path}" -bind v split-window -h -c "#{pane_current_path}" -bind s split-window -v -c "#{pane_current_path}" - -bind h select-pane -L -bind j select-pane -D -bind k select-pane -U -bind l select-pane -R -bind H run '$TMUX_HOME/swap-pane.sh left' -bind J run '$TMUX_HOME/swap-pane.sh down' -bind K run '$TMUX_HOME/swap-pane.sh up' -bind L run '$TMUX_HOME/swap-pane.sh right' -bind M run '$TMUX_HOME/swap-pane.sh master' - -bind o resize-pane -Z -bind S choose-session -bind W choose-window -bind / choose-session -bind . choose-window - -# bind = select-layout tiled -bind | select-layout even-horizontal -bind _ select-layout even-vertical - -# Disable confirmation -bind x kill-pane -bind X kill-window -bind q kill-session -bind Q kill-server - -# Smart pane switching with awareness of vim splits -# See: https://github.com/christoomey/vim-tmux-navigator -is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?x?)(diff)?$"' -bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L" -bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D" -bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U" -bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R" -bind -n C-\\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l" -bind C-w last-pane -bind C-n next-window -bind C-p previous-window - -# break pane into a window -bind = select-layout even-vertical -bind + select-layout even-horizontal -bind - break-pane -bind _ join-pane - -# reload config without killing server -bind r source-file $DOTFILES/config/tmux/tmux.conf \; display-message " Config reloaded..". -bind ^r refresh-client - - -######################################## -# Copy mode # -######################################## - -bind Enter copy-mode # enter copy mode -bind b list-buffers # list paster buffers -bind B choose-buffer # choose which buffer to paste from -bind p paste-buffer # paste from the top paste buffer -bind P run "xclip -selection clipboard -o | tmux load-buffer - ; tmux paste-buffer" - -bind -T copy-mode-vi v send-keys -X begin-selection -bind -T copy-mode-vi C-v send-keys -X rectangle-toggle -bind -T copy-mode-vi Escape send-keys -X cancel -bind -T copy-mode-vi C-g send-keys -X cancel -bind -T copy-mode-vi H send-keys -X start-of-line -bind -T copy-mode-vi L send-keys -X end-of-line - - -######################################## -# Local config # -######################################## -set -g @open-editor 'C-e' -set -g @open-S 'https://www.duckduckgo.com/' - -source $TMUX_HOME/extraInit -if '[ -f ~/.tmux.conf ]' 'source ~/.tmux.conf' diff --git a/config/zsh/.zshenv b/config/zsh/.zshenv deleted file mode 100644 index 430d11c3..00000000 --- a/config/zsh/.zshenv +++ /dev/null @@ -1,5 +0,0 @@ -## Auto-generated by my nix config -[ -f "${0:a:h}/extra.zshenv" ] && source "${0:a:h}/extra.zshenv" - -# If you have host-local configuration, this is where you'd put it -[ -f ~/.zshenv ] && source ~/.zshenv diff --git a/config/zsh/.zshrc b/config/zsh/.zshrc deleted file mode 100644 index a14a06da..00000000 --- a/config/zsh/.zshrc +++ /dev/null @@ -1,51 +0,0 @@ -[ -d "$ZGEN_DIR" ] || git clone https://github.com/tarjoilija/zgen "$ZGEN_DIR" -source $ZGEN_SOURCE -if ! zgen saved; then - echo "Initializing zgen" - zgen load hlissner/zsh-autopair autopair.zsh - zgen load zsh-users/zsh-history-substring-search - zgen load zdharma/history-search-multi-word - zgen load zsh-users/zsh-completions src - zgen load junegunn/fzf shell - [ -z "$SSH_CONNECTION" ] && zgen load zdharma/fast-syntax-highlighting - zgen save -fi - -source $ZDOTDIR/config.zsh -if [[ $TERM != dumb ]]; then - source $ZDOTDIR/keybinds.zsh - source $ZDOTDIR/completion.zsh - source $ZDOTDIR/aliases.zsh - - ## - function _cache { - command -v "$1" >/dev/null || return 1 - local cache_dir="$XDG_CACHE_HOME/${SHELL##*/}" - local cache="$cache_dir/$1" - if [[ ! -f $cache || ! -s $cache ]]; then - echo "Caching $1" - mkdir -p $cache_dir - "$@" >$cache - fi - source $cache || rm -f $cache - } - - # fd > find - if command -v fd >/dev/null; then - export FZF_DEFAULT_OPTS="--reverse --ansi" - export FZF_DEFAULT_COMMAND="fd ." - export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" - export FZF_ALT_C_COMMAND="fd -t d . $HOME" - fi - _cache fasd --init posix-alias zsh-{hook,{c,w}comp{,-install}} - - ## Auto-generated by my nix config - source $ZDOTDIR/extra.zshrc - - ## - autoload -Uz compinit && compinit -u -d $ZSH_CACHE/zcompdump - autopair-init - - # If you have host-local configuration, this is where you'd put it - [ -f ~/.zshrc ] && source ~/.zshrc -fi diff --git a/config/zsh/aliases.zsh b/config/zsh/aliases.zsh deleted file mode 100644 index 060b08f6..00000000 --- a/config/zsh/aliases.zsh +++ /dev/null @@ -1,74 +0,0 @@ -alias ..='cd ..' -alias ...='cd ../..' -alias ....='cd ../../..' -alias -- -='cd -' -alias cdg='cd `git rev-parse --show-toplevel`' - -alias q=exit -alias clr=clear -alias sudo='sudo ' -alias rm='rm -i' -alias cp='cp -i' -alias mv='mv -i' -alias mkdir='mkdir -pv' -alias wget='wget -c' -alias path='echo -e ${PATH//:/\\n}' -alias ports='netstat -tulanp' - -alias mk=make -alias gurl='curl --compressed' - -alias shutdown='sudo shutdown' -alias reboot='sudo reboot' - -# An rsync that respects gitignore -rcp() { - # -a = -rlptgoD - # -r = recursive - # -l = copy symlinks as symlinks - # -p = preserve permissions - # -t = preserve mtimes - # -g = preserve owning group - # -o = preserve owner - # -z = use compression - # -P = show progress on transferred file - # -J = don't touch mtimes on symlinks (always errors) - rsync -azPJ \ - --include=.git/ \ - --filter=':- .gitignore' \ - --filter=":- $XDG_CONFIG_HOME/git/ignore" \ - "$@" -}; compdef rcp=rsync -alias rcpd='rcp --delete --delete-after' -alias rcpu='rcp --chmod=go=' -alias rcpdu='rcpd --chmod=go=' - -alias y='xclip -selection clipboard -in' -alias p='xclip -selection clipboard -out' - -alias jc='journalctl -xe' -alias sc=systemctl -alias ssc='sudo systemctl' - -if command -v exa >/dev/null; then - alias exa="exa --group-directories-first --git"; - alias l="exa -1"; - alias ll="exa -lg"; - alias la="LC_COLLATE=C exa -la"; -fi - -autoload -U zmv - -take() { - mkdir "$1" && cd "$1"; -}; compdef take=mkdir - -zman() { - PAGER="less -g -I -s '+/^ "$1"'" man zshall; -} - -# Create a reminder with human-readable durations, e.g. 15m, 1h, 40s, etc -r() { - local time=$1; shift - sched "$time" "notify-send --urgency=critical 'Reminder' '$@'; ding"; -}; compdef r=sched diff --git a/config/zsh/completion.zsh b/config/zsh/completion.zsh deleted file mode 100644 index d3b47639..00000000 --- a/config/zsh/completion.zsh +++ /dev/null @@ -1,174 +0,0 @@ -fpath+=( $ZDOTDIR/completions ) - -## Options -setopt COMPLETE_IN_WORD # Complete from both ends of a word. -setopt PATH_DIRS # Perform path search even on command names with slashes. -setopt AUTO_MENU # Show completion menu on a successive tab press. -setopt AUTO_LIST # Automatically list choices on ambiguous completion. -setopt AUTO_PARAM_SLASH # If completed parameter is a directory, add a trailing slash. -setopt AUTO_PARAM_KEYS -setopt FLOW_CONTROL # Disable start/stop characters in shell editor. -unsetopt MENU_COMPLETE # Do not autoselect the first completion entry. -unsetopt COMPLETE_ALIASES # Completion for aliases -unsetopt ALWAYS_TO_END # Move cursor to the end of a completed word. -unsetopt CASE_GLOB - -# Use caching to make completion for commands such as dpkg and apt usable. -zstyle ':completion::complete:*' use-cache on -zstyle ':completion::complete:*' cache-path "$ZSH_CACHE/zcompcache" - -# Case-insensitive (all), partial-word, and then substring completion. -zstyle ':completion:*' matcher-list '' \ - 'm:{a-z\-}={A-Z\_}' \ - 'r:[^[:alpha:]]||[[:alpha:]]=** r:|=* m:{a-z\-}={A-Z\_}' \ - 'r:[[:ascii:]]||[[:ascii:]]=** r:|=* m:{a-z\-}={A-Z\_}' - -# Group matches and describe. -zstyle ':completion:*:*:*:*:*' menu select -zstyle ':completion:*:matches' group 'yes' -zstyle ':completion:*:options' description 'yes' -zstyle ':completion:*:options' auto-description '%d' -zstyle ':completion:*:corrections' format ' %F{green}-- %d (errors: %e) --%f' -zstyle ':completion:*:descriptions' format ' %F{yellow}-- %d --%f' -zstyle ':completion:*:messages' format ' %F{purple} -- %d --%f' -zstyle ':completion:*:warnings' format ' %F{red}-- no matches found --%f' -zstyle ':completion:*:default' list-prompt '%S%M matches%s' -zstyle ':completion:*' format ' %F{yellow}-- %d --%f' -zstyle ':completion:*' group-name '' -zstyle ':completion:*' verbose yes - -# Fuzzy match mistyped completions. -zstyle ':completion:*' completer _complete _list _match _approximate -zstyle ':completion:*:match:*' original only -zstyle ':completion:*:approximate:*' max-errors 1 numeric - -# Increase the number of errors based on the length of the typed word. -zstyle -e ':completion:*:approximate:*' max-errors 'reply=($((($#PREFIX+$#SUFFIX)/3))numeric)' - -# Don't complete unavailable commands. -zstyle ':completion:*:functions' ignored-patterns '(_*|pre(cmd|exec))' - -# Array completion element sorting. -zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters - -# Directories -zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} -zstyle ':completion:*:*:cd:*' ignore-parents parent pwd -zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories -zstyle ':completion:*:*:cd:*:directory-stack' menu yes select -zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand' -zstyle ':completion:*' squeeze-slashes true -zstyle ':completion:*' special-dirs true - -# History -zstyle ':completion:*:history-words' stop yes -zstyle ':completion:*:history-words' remove-all-dups yes -zstyle ':completion:*:history-words' list false -zstyle ':completion:*:history-words' menu yes - -# Environmental Variables -zstyle ':completion::*:(-command-|export):*' fake-parameters ${${${_comps[(I)-value-*]#*,}%%,*}:#-*-} - -# Populate hostname completion. -zstyle -e ':completion:*:hosts' hosts 'reply=( - ${=${=${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) 2>/dev/null)"}%%[#| ]*}//\]:[0-9]*/ }//,/ }//\[/ } - ${=${${${${(@M)${(f)"$(cat ~/.ssh/config 2>/dev/null)"}:#Host *}#Host }:#*\**}:#*\?*}} -)' - -# Don't complete uninteresting users... -zstyle ':completion:*:*:*:users' ignored-patterns \ - adm amanda apache avahi beaglidx bin cacti canna clamav daemon \ - dbus distcache dovecot fax ftp games gdm gkrellmd gopher \ - hacluster haldaemon halt hsqldb ident junkbust ldap lp mail \ - mailman mailnull mldonkey mysql nagios \ - named netdump news nfsnobody nobody nscd ntp nut nx openvpn \ - operator pcap postfix postgres privoxy pulse pvm quagga radvd \ - rpc rpcuser rpm shutdown squid sshd sync uucp vcsa xfs '_*' - -# ... unless we really want to. -zstyle '*' single-ignored show - -# Ignore multiple entries. -zstyle ':completion:*:(rm|kill|diff):*' ignore-line other -zstyle ':completion:*:rm:*' file-patterns '*:all-files' - -# Kill -zstyle ':completion:*:*:*:*:processes' command 'ps -u $LOGNAME -o pid,user,command -w' -zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;36=0=01' -zstyle ':completion:*:*:kill:*' menu yes select -zstyle ':completion:*:*:kill:*' force-list always -zstyle ':completion:*:*:kill:*' insert-ids single - -# Man -zstyle ':completion:*:manuals' separate-sections true -zstyle ':completion:*:manuals.(^1*)' insert-sections true - -# Media Players -zstyle ':completion:*:*:mpg123:*' file-patterns '*.(mp3|MP3):mp3\ files *(-/):directories' -zstyle ':completion:*:*:mpg321:*' file-patterns '*.(mp3|MP3):mp3\ files *(-/):directories' -zstyle ':completion:*:*:ogg123:*' file-patterns '*.(ogg|OGG|flac):ogg\ files *(-/):directories' -zstyle ':completion:*:*:mocp:*' file-patterns '*.(wav|WAV|mp3|MP3|ogg|OGG|flac):ogg\ files *(-/):directories' - -# SSH/SCP/RSYNC -zstyle ':completion:*:(scp|rsync):*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *' -zstyle ':completion:*:(scp|rsync):*' group-order users files all-files hosts-domain hosts-host hosts-ipaddr -zstyle ':completion:*:ssh:*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *' -zstyle ':completion:*:ssh:*' group-order users hosts-domain hosts-host users hosts-ipaddr -zstyle ':completion:*:(ssh|scp|rsync):*:hosts-host' ignored-patterns '*(.|:)*' loopback ip6-loopback localhost ip6-localhost broadcasthost -zstyle ':completion:*:(ssh|scp|rsync):*:hosts-domain' ignored-patterns '<->.<->.<->.<->' '^[-[:alnum:]]##(.[-[:alnum:]]##)##' '*@*' -zstyle ':completion:*:(ssh|scp|rsync):*:hosts-ipaddr' ignored-patterns '^(<->.<->.<->.<->|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.<->' '255.255.255.255' '::1' 'fe80::*' - -# fzf -if command -v fzf >/dev/null; then - # fuzzy completion with 'z' when called without args - unalias z 2> /dev/null - z() { - [ $# -gt 0 ] && _z "$*" && return - cd "$(_z -l 2>&1 | fzf --height 40% --nth 2.. --reverse --inline-info +s --tac --query "${*##-* }" | sed 's/^[0-9,.]* *//')" - } - - __git_log () { - # format str implies: - # --abbrev-commit - # --decorate - git log \ - --color=always \ - --graph \ - --all \ - --date=short \ - --format="%C(bold blue)%h%C(reset) %C(green)%ad%C(reset) | %C(white)%s %C(red)[%an] %C(bold yellow)%d" - } - - _fzf_complete_git() { - ARGS="$@" - - # these are commands I commonly call on commit hashes. - # cp->cherry-pick, co->checkout - - if [[ $ARGS == 'git cp'* || \ - $ARGS == 'git cherry-pick'* || \ - $ARGS == 'git co'* || \ - $ARGS == 'git checkout'* || \ - $ARGS == 'git reset'* || \ - $ARGS == 'git show'* || \ - $ARGS == 'git log'* ]]; then - _fzf_complete "--reverse --multi" "$@" < <(__git_log) - else - eval "zle ${fzf_default_completion:-expand-or-complete}" - fi - } - - _fzf_complete_git_post() { - sed -e 's/^[^a-z0-9]*//' | awk '{print $1}' - } - - # pass completion suggested by @d4ndo (#362) (slightly modified) - _fzf_complete_pass() { - _fzf_complete '+m' "$@" < <( - local pwdir=${PASSWORD_STORE_DIR-~/.password-store/} - find "$pwdir" -name "*.gpg" -print | - sed -e "s#${pwdir}/\{0,1\}##" | - sed -e 's/\(.*\)\.gpg/\1/' - ) - } -fi diff --git a/config/zsh/completions/_hey b/config/zsh/completions/_hey deleted file mode 100755 index fe091bf4..00000000 --- a/config/zsh/completions/_hey +++ /dev/null @@ -1,36 +0,0 @@ -#compdef hey - -_hey_dispatch () { - local cmd="$@" - local offset=$# - CURRENT=$((CURRENT-$offset)) - words=($cmd "${words[$((2 + offset)),-1]}") - _$cmd -} - -_hey_command_list () { - hey | sed '1,/Available commands:/d' | awk '{ print $1 }' -} - -_hey () { - local -a commands - IFS=$'\n' commands=($(_hey_command_list)) - - if (( CURRENT == 2 )); then - _describe -t commands "hey commands" commands - return - fi - integer ret=1 - case ${words[2]} in - ch|channel) _hey_dispatch nix-channel ;; - b|build) _hey_dispatch nix-build ;; - ch|check) _hey_dispatch nix flake check ;; - sh|show) _hey_dispatch nix flake show ;; - s|search) _hey_dispatch nix search nixpkgs ;; - -*) _hey_dispatch nix-env ;; - *) _message "Command not found: ${words[2]}" ;; - esac - return ret -} - -_hey diff --git a/config/zsh/config.zsh b/config/zsh/config.zsh deleted file mode 100644 index 048e8470..00000000 --- a/config/zsh/config.zsh +++ /dev/null @@ -1,64 +0,0 @@ -# Stop TRAMP (in Emacs) from hanging or term/shell from echoing back commands -if [[ $TERM == dumb || -n $INSIDE_EMACS ]]; then - unsetopt zle prompt_cr prompt_subst - whence -w precmd >/dev/null && unfunction precmd - whence -w preexec >/dev/null && unfunction preexec - PS1='$ ' -fi - -## General -export _FASD_DATA="$XDG_CACHE_HOME/fasd" -export _FASD_VIMINFO="$XDG_CACHE_HOME/viminfo" - -# Treat these characters as part of a word. -WORDCHARS='_-*?[]~&.;!#$%^(){}<>' - -unsetopt BRACE_CCL # Allow brace character class list expansion. -setopt COMBINING_CHARS # Combine zero-length punc chars (accents) with base char -setopt RC_QUOTES # Allow 'Henry''s Garage' instead of 'Henry'\''s Garage' -setopt HASH_LIST_ALL -unsetopt CORRECT_ALL -unsetopt NOMATCH -unsetopt MAIL_WARNING # Don't print a warning message if a mail file has been accessed. -unsetopt BEEP # Hush now, quiet now. -setopt IGNOREEOF - -## Jobs -setopt LONG_LIST_JOBS # List jobs in the long format by default. -setopt AUTO_RESUME # Attempt to resume existing job before creating a new process. -setopt NOTIFY # Report status of background jobs immediately. -unsetopt BG_NICE # Don't run all background jobs at a lower priority. -unsetopt HUP # Don't kill jobs on shell exit. -unsetopt CHECK_JOBS # Don't report on jobs when shell exit. - -## History -HISTFILE="$XDG_CACHE_HOME/zhistory" -HISTSIZE=1000 # Max events to store in internal history. -SAVEHIST=1000 # Max events to store in history file. - -setopt BANG_HIST # Don't treat '!' specially during expansion. -setopt EXTENDED_HISTORY # Write the history file in the ':start:elapsed;command' format. -setopt APPEND_HISTORY # Appends history to history file on exit -setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. -setopt SHARE_HISTORY # Share history between all sessions. -setopt HIST_EXPIRE_DUPS_FIRST # Expire a duplicate event first when trimming history. -setopt HIST_IGNORE_DUPS # Do not record an event that was just recorded again. -setopt HIST_IGNORE_ALL_DUPS # Delete an old recorded event if a new event is a duplicate. -setopt HIST_FIND_NO_DUPS # Do not display a previously found event. -setopt HIST_IGNORE_SPACE # Do not record an event starting with a space. -setopt HIST_SAVE_NO_DUPS # Do not write a duplicate event to the history file. -setopt HIST_VERIFY # Do not execute immediately upon history expansion. -setopt HIST_BEEP # Beep when accessing non-existent history. - -## Directories -DIRSTACKSIZE=9 -setopt AUTO_CD # Auto changes to a directory without typing cd. -setopt AUTO_PUSHD # Push the old directory onto the stack on cd. -setopt PUSHD_IGNORE_DUPS # Do not store duplicates in the stack. -setopt PUSHD_SILENT # Do not print the directory stack after pushd or popd. -setopt PUSHD_TO_HOME # Push to home directory when no argument is given. -setopt CDABLE_VARS # Change directory to a path stored in a variable. -setopt MULTIOS # Write to multiple descriptors. -setopt EXTENDED_GLOB # Use extended globbing syntax. -unsetopt GLOB_DOTS -unsetopt AUTO_NAME_DIRS # Don't add variable-stored paths to ~ list diff --git a/config/zsh/keybinds.zsh b/config/zsh/keybinds.zsh deleted file mode 100644 index 645e0f6d..00000000 --- a/config/zsh/keybinds.zsh +++ /dev/null @@ -1,127 +0,0 @@ -# The surround module wasn't working if KEYTIMEOUT was <= 10. Specifically, -# (delete|change)-surround immediately abort into insert mode if KEYTIMEOUT <= -# 8. If <= 10, then add-surround does the same. At 11, all these issues vanish. -# Very strange! -export KEYTIMEOUT=15 - -autoload -U is-at-least - -## vi-mode ############### -bindkey -v -bindkey -M viins 'jk' vi-cmd-mode -bindkey -M viins ' ' magic-space -# bindkey -M viins '^I' expand-or-complete-prefix - -# surround -autoload -Uz surround -zle -N delete-surround surround -zle -N add-surround surround -zle -N change-surround surround -bindkey -a cs change-surround -bindkey -a ds delete-surround -bindkey -a ys add-surround - -# <5.0.8 doesn't have visual map -if is-at-least 5.0.8; then - bindkey -M visual S add-surround - - # add vimmish text-object support to zsh - autoload -U select-quoted; zle -N select-quoted - for m in visual viopp; do - for c in {a,i}{\',\",\`}; do - bindkey -M $m $c select-quoted - done - done - autoload -U select-bracketed; zle -N select-bracketed - for m in visual viopp; do - for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do - bindkey -M $m $c select-bracketed - done - done -fi - -# Open current prompt in external editor -autoload -Uz edit-command-line; zle -N edit-command-line -bindkey '^ ' edit-command-line - -bindkey -M viins '^n' history-substring-search-down -bindkey -M viins '^p' history-substring-search-up -bindkey -M viins '^s' history-incremental-pattern-search-backward -bindkey -M viins '^u' backward-kill-line -bindkey -M viins '^w' backward-kill-word -bindkey -M viins '^b' backward-word -bindkey -M viins '^f' forward-word -bindkey -M viins '^g' push-line-or-edit -bindkey -M viins '^a' beginning-of-line -bindkey -M viins '^e' end-of-line -bindkey -M viins '^d' push-line-or-edit - -bindkey -M vicmd '^k' kill-line -bindkey -M vicmd 'H' run-help - -# Shift + Tab -bindkey -M viins '^[[Z' reverse-menu-complete - -# bind UP and DOWN arrow keys -bindkey '^[[A' history-substring-search-up -bindkey '^[[B' history-substring-search-down - -# C-z to toggle current process (background/foreground) -fancy-ctrl-z () { - if [[ $#BUFFER -eq 0 ]]; then - BUFFER="fg" - zle accept-line - else - zle push-input - zle clear-screen - fi -} -zle -N fancy-ctrl-z -bindkey '^Z' fancy-ctrl-z - -# Omni-Completion -bindkey -M viins '^x^f' fasd-complete-f # C-x C-f to do fasd-complete-f (only files) -bindkey -M viins '^x^d' fasd-complete-d # C-x C-d to do fasd-complete-d (only directories) -# Completing words in buffer in tmux -if [ -n "$TMUX" ]; then - _tmux_pane_words() { - local expl - local -a w - if [[ -z "$TMUX_PANE" ]]; then - _message "not running inside tmux!" - return 1 - fi - w=( ${(u)=$(tmux capture-pane \; show-buffer \; delete-buffer)} ) - _wanted values expl 'words from current tmux pane' compadd -a w - } - - zle -C tmux-pane-words-prefix complete-word _generic - zle -C tmux-pane-words-anywhere complete-word _generic - - bindkey -M viins '^x^n' tmux-pane-words-prefix - bindkey -M viins '^x^o' tmux-pane-words-anywhere - - zstyle ':completion:tmux-pane-words-(prefix|anywhere):*' completer _tmux_pane_words - zstyle ':completion:tmux-pane-words-(prefix|anywhere):*' ignore-line current - zstyle ':completion:tmux-pane-words-anywhere:*' matcher-list 'b:=* m:{A-Za-z}={a-zA-Z}' -fi - -# Vim's C-x C-l in zsh -history-beginning-search-backward-then-append() { - zle history-beginning-search-backward - zle vi-add-eol -} -zle -N history-beginning-search-backward-then-append -bindkey -M viins '^x^l' history-beginning-search-backward-then-append - -# Fix the DEL key -bindkey -M vicmd "^[[3~" delete-char -bindkey "^[[3~" delete-char - -# Fix vimmish ESC -bindkey -sM vicmd '^[' '^G' -bindkey -rM viins '^X' -bindkey -M viins '^X,' _history-complete-newer \ - '^X/' _history-complete-older \ - '^X`' _bash_complete-word - diff --git a/configuration.nix b/configuration.nix new file mode 100644 index 00000000..232ebc51 --- /dev/null +++ b/configuration.nix @@ -0,0 +1,143 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ config, pkgs, ... }: + +{ + imports = + [ # Include the results of the hardware scan. + ./hardware-configuration.nix + ./common.nix + ./box.nix + ]; + + environment.systemPackages = [ pkgs.wpa_supplicant ]; + # Use the GRUB 2 boot loader. + boot.loader.efi.canTouchEfiVariables = false; + boot.loader.efi.efiSysMountPoint = "/boot/efi"; + boot.loader.grub = { + enable = true; + device = "nodev"; + version = 2; + efiSupport = true; + enableCryptodisk = true; + efiInstallAsRemovable = true; + }; + + boot.initrd.secrets = { + "/keyfile0.bin" = /etc/secrets/initrd/keyfile0.bin; + "/keyfile1.bin" = /etc/secrets/initrd/keyfile1.bin; + }; + + boot.initrd.luks.devices = { + "root" = { + #name = "root"; + device = "/dev/disk/by-uuid/f37f3222-47d7-42d8-b400-363320a31853"; # UUID for /dev/nvme01np2 + preLVM = true; + allowDiscards = true; + keyFile = "/keyfile0.bin"; + }; + }; + + # Data mount + fileSystems."/data" = { + device = "/dev/disk/by-uuid/3276a297-9ee4-4998-b262-1ed100366c06"; # UUID for /dev/mapper/crypted-data + encrypted = { + enable = true; + label = "crypted-data"; + blkDev = "/dev/disk/by-uuid/8a317bf4-fe13-4334-a6df-5fe5a5048b5e"; # UUID for /dev/sda1 + keyFile = "/keyfile1.bin"; + }; + }; + + # boot.loader.grub.efiInstallAsRemovable = true; + # boot.loader.efi.efiSysMountPoint = "/boot/efi"; + # Define on which hard drive you want to install Grub. + # boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only + + networking.hostName = "box"; # Define your hostname. + networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + + # The global useDHCP flag is deprecated, therefore explicitly set to false here. + # Per-interface useDHCP will be mandatory in the future, so this generated config + # replicates the default behaviour. + networking.useDHCP = false; + networking.interfaces.wlp3s0.useDHCP = true; + networking.interfaces.enp2s0.useDHCP = false; + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. + # i18n = { + # consoleFont = "Lat2-Terminus16"; + # consoleKeyMap = "us"; + # defaultLocale = "en_US.UTF-8"; + # }; + + # Set your time zone. + # time.timeZone = "Europe/Amsterdam"; + + # List packages installed in system profile. To search, run: + # $ nix search wget + # environment.systemPackages = with pkgs; [ + # wget vim + # ]; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { enable = true; enableSSHSupport = true; }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + services.openssh.enable = true; + services.openssh.permitRootLogin = "yes"; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound. + sound.enable = false; + # hardware.pulseaudio.enable = true; + + # Enable the X11 windowing system. + # services.xserver.enable = true; + # services.xserver.layout = "us"; + # services.xserver.xkbOptions = "eurosign:e"; + + # Enable touchpad support. + # services.xserver.libinput.enable = true; + + # Enable the KDE Desktop Environment. + # services.xserver.displayManager.sddm.enable = true; + # services.xserver.desktopManager.plasma5.enable = true; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.anish = { + isNormalUser = true; + extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. + hashedPassword = "MO0Pbd2O4eIlA"; + openssh.authorizedKeys.keys = [" + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCeWQsf9rbE+KBrWLkLkg1PMKx0jPfDP8xyv+XtddIQzAskRTN+JSSQp1GpoRgfQij7bx6f6DfjkwSQK5NWDQNQ+klGhcdEwEdptWUzpRAvKHMImjyIwFHmRKKEgcfH8+DSHVM93nRSQKrLezX4PzPkHF9f3TLxFdGeQDeY0J2oP2Oa97hRtuTJZW9BwUojyvDYUbg7F3fxf+pdFCvIAFaayiLkhOYdTXnjLt1Ks6NOhSzM78ZibHv4pFYI9r6dhflkFP/SzyLeSSm1aVAtxqE7vF5HnnORAg0byDsiOv/9RXxiDx7gkAAw3xENDSpp9TRj54M7iz1OSsRMhmD6orHjZFIRejlE4DIn+PBPm3PH+U5ILKTogE6n5MfPT28V0QdtHuqq3b5tSWiDcFpnjxbIUmEIo5hLzMR0tXZoNLQhBCSNfxjE8CYzpk7mHbvhSs2GPfG+NI1vvldbw2EF8beJFQHNYTqJw8y7p8RXpCwZqqpSitJX6v9DiYdLVG1hWvE= nix-on-droid@localhost + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDM0Zvei46x/yZl/IeBCq6+IYQQ0avulzVyBysF9cPigZMCybWRV7IEU+E3k9t6JrbdbdGfJkcZIWmsWDdKS8W8mBnZpVoT0ffLynu8JQ/TKdGm4Qv6bgUeKNrGsNv0ZPs2CDaGSLj0oJfRF7Ko10tcLP0vW+yujrh+y6TH/vVzJioaV4TGvtCUpn+wEQah9ROwPQLUUofsSWdnRsDJ/gp37zXWs4l5wyjSKtP3O9RZUP7kBekbSqEgSXiTk0oUQSVqIWl9NDiP6onk/gSOjXsR/JPqsSN/XI/c/yj6gyY0f51Ru2D7iBxuMJIJcWV+rU6coIj+ULcQWLzt/7TI8jq5AOOzI/ll4zbL24Eo84Rz+TP9tvMMhDZ0VaMN22AJ8qQEjc5P09tWKsX7Jg39XelyV1jHXncE4yvIE9F4RSCHzWCeKeXakizQNuzSaxTxIExRFYHjNW5bR6+3MTGwVrEIXU+qML+0yFTR86MT+tdY5AreAJQLwbog79O1NupeXJE= anish@curve + "]; + }; + + # This value determines the NixOS release with which your system is to be + # compatible, in order to avoid breaking some software such as database + # servers. You should change this only after NixOS release notes say you + # should. + system.stateVersion = "19.09"; # Did you read the comment? + +} + diff --git a/cron.nix b/cron.nix new file mode 100644 index 00000000..acb3d9d3 --- /dev/null +++ b/cron.nix @@ -0,0 +1,10 @@ +{ pkgs, lib, ... }: + +{ + services.cron = { + enable = true; + systemCronJobs = [ + "* */24 * * * * anish ~/get-music.sh" + ]; + }; +} diff --git a/default.nix b/default.nix deleted file mode 100644 index 24aa4e6e..00000000 --- a/default.nix +++ /dev/null @@ -1,67 +0,0 @@ -{ inputs, config, lib, pkgs, ... }: - -with lib; -with lib.my; -{ - imports = - # I use home-manager to deploy files to $HOME; little else - [ inputs.home-manager.nixosModules.home-manager ] - # All my personal modules - ++ (mapModulesRec' (toString ./modules) import); - - # Common config for all nixos machines; and to ensure the flake operates - # soundly - environment.variables.DOTFILES = config.dotfiles.dir; - environment.variables.DOTFILES_BIN = config.dotfiles.binDir; - - # Configure nix and nixpkgs - environment.variables.NIXPKGS_ALLOW_UNFREE = "1"; - nix = - let filteredInputs = filterAttrs (n: _: n != "self") inputs; - nixPathInputs = mapAttrsToList (n: v: "${n}=${v}") filteredInputs; - registryInputs = mapAttrs (_: v: { flake = v; }) filteredInputs; - in { - package = pkgs.nixFlakes; - extraOptions = "experimental-features = nix-command flakes"; - nixPath = nixPathInputs ++ [ - "nixpkgs-overlays=${config.dotfiles.dir}/overlays" - "dotfiles=${config.dotfiles.dir}" - ]; - binaryCaches = [ - "https://nix-community.cachix.org" - ]; - binaryCachePublicKeys = [ - "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" - ]; - registry = registryInputs // { dotfiles.flake = inputs.self; }; - autoOptimiseStore = true; - }; - system.configurationRevision = with inputs; mkIf (self ? rev) self.rev; - system.stateVersion = "21.05"; - - ## Some reasonable, global defaults - # This is here to appease 'nix flake check' for generic hosts with no - # hardware-configuration.nix or fileSystem config. - fileSystems."/".device = mkDefault "/dev/disk/by-label/nixos"; - - # Use the latest kernel - boot = { - kernelPackages = mkDefault pkgs.linuxPackages_5_12; - loader = { - efi.canTouchEfiVariables = mkDefault true; - systemd-boot.configurationLimit = 10; - systemd-boot.enable = mkDefault true; - }; - }; - - # Just the bear necessities... - environment.systemPackages = with pkgs; [ - bind - cached-nix-shell - git - vim - wget - gnumake - unzip - ]; -} diff --git a/dev.nix b/dev.nix new file mode 100644 index 00000000..18f33c16 --- /dev/null +++ b/dev.nix @@ -0,0 +1,10 @@ +{config, pkgs, ...}: + +{ + # Database + services.postgresql.enable = true; + + # Docker + virtualisation.docker.enable = true; + users.users."anish".extraGroups = [ "docker" ]; +} diff --git a/dns.nix b/dns.nix new file mode 100644 index 00000000..96800e0a --- /dev/null +++ b/dns.nix @@ -0,0 +1,16 @@ +{ config, pkgs, lib, ... }: +{ + services.dnsmasq.enable = true; + services.dnsmasq.extraConfig = '' + domain-needed + no-resolv + local=/lan/ + local=/moss/ + cache-size=5000 + addn-hosts=/ec/adblock.hosts + ''; + services.dnsmasq.servers = [ "45.90.30.49" "45.90.28.49" "1.1.1.1" "8.8.8.8" ]; + networking.hosts = {"192.168.1.240" = ["mossnet.lan" "links.mossnet.lan" "read.mossnet.lan" "stats.mossnet.lan" "music.moss" "tasks.moss" "headphones.moss" "cloud.moss" "links.moss" "read.moss" "stats.moss" "rss.moss"];}; + networking.firewall.allowedTCPPorts = [ 53 ]; + networking.firewall.allowedUDPPorts = [ 53 ]; +} diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 38860b6b..00000000 --- a/flake.lock +++ /dev/null @@ -1,117 +0,0 @@ -{ - "nodes": { - "agenix": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1626960455, - "narHash": "sha256-N3+qOtsADo59UcG8PxqNMhT94wqTQ73k08gpy1dLaWU=", - "owner": "ryantm", - "repo": "agenix", - "rev": "fb00f178b3a49a39cc964049075439b575d36d60", - "type": "github" - }, - "original": { - "owner": "ryantm", - "repo": "agenix", - "type": "github" - } - }, - "emacs-overlay": { - "locked": { - "lastModified": 1627320437, - "narHash": "sha256-1HGXjkm7kElz3VsGSciaQlZclUhyvfIXVl+FOooBTJo=", - "owner": "nix-community", - "repo": "emacs-overlay", - "rev": "9da066d11fbedda841cae9d06c5391e1ebd65801", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "emacs-overlay", - "type": "github" - } - }, - "home-manager": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1627312560, - "narHash": "sha256-h2mpDJIu/rd4nZX4i5U1AFA/3MGXrmFRFy04FDxnvhE=", - "owner": "rycee", - "repo": "home-manager", - "rev": "f6f6990fc811454cb3082ba3662b711488fd0554", - "type": "github" - }, - "original": { - "owner": "rycee", - "ref": "master", - "repo": "home-manager", - "type": "github" - } - }, - "nixos-hardware": { - "locked": { - "lastModified": 1627212500, - "narHash": "sha256-KMUQCT3JSqznp+dR6BTvbwLqPFErjNlotVpkp/P/ZmM=", - "owner": "nixos", - "repo": "nixos-hardware", - "rev": "03e7686c72345f237405c0b46b153dccd3ec9913", - "type": "github" - }, - "original": { - "owner": "nixos", - "repo": "nixos-hardware", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1627128856, - "narHash": "sha256-yw3lA8zyNFhj309lmxvNByEEymRT1rRy5oE+jEPnsP4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "dd14e5d78e90a2ccd6007e569820de9b4861a6c2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-unstable", - "type": "indirect" - } - }, - "nixpkgs-unstable": { - "locked": { - "lastModified": 1627170405, - "narHash": "sha256-6t7ISnt0Iqc2jxIf5+/su6eFmZNWnPAOA1JeOv9lLRE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "ecaf3da9340231e5493eccc3db87604a3705da42", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixpkgs-unstable", - "type": "indirect" - } - }, - "root": { - "inputs": { - "agenix": "agenix", - "emacs-overlay": "emacs-overlay", - "home-manager": "home-manager", - "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs", - "nixpkgs-unstable": "nixpkgs-unstable" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 4154b202..00000000 --- a/flake.nix +++ /dev/null @@ -1,85 +0,0 @@ -# flake.nix --- the heart of my dotfiles -# -# Author: Henrik Lissner -# URL: https://github.com/hlissner/dotfiles -# License: MIT -# -# Welcome to ground zero. Where the whole flake gets set up and all its modules -# are loaded. - -{ - description = "A grossly incandescent nixos config."; - - inputs = - { - # Core dependencies. - nixpkgs.url = "nixpkgs/nixos-unstable"; # primary nixpkgs - nixpkgs-unstable.url = "nixpkgs/nixpkgs-unstable"; # for packages on the edge - home-manager.url = "github:rycee/home-manager/master"; - home-manager.inputs.nixpkgs.follows = "nixpkgs"; - agenix.url = "github:ryantm/agenix"; - agenix.inputs.nixpkgs.follows = "nixpkgs"; - - # Extras - emacs-overlay.url = "github:nix-community/emacs-overlay"; - nixos-hardware.url = "github:nixos/nixos-hardware"; - }; - - outputs = inputs @ { self, nixpkgs, nixpkgs-unstable, ... }: - let - inherit (lib.my) mapModules mapModulesRec mapHosts; - - system = "x86_64-linux"; - - mkPkgs = pkgs: extraOverlays: import pkgs { - inherit system; - config.allowUnfree = true; # forgive me Stallman senpai - overlays = extraOverlays ++ (lib.attrValues self.overlays); - }; - pkgs = mkPkgs nixpkgs [ self.overlay ]; - pkgs' = mkPkgs nixpkgs-unstable [ ]; - - lib = nixpkgs.lib.extend - (self: super: { my = import ./lib { inherit pkgs inputs; lib = self; }; }); - in { - lib = lib.my; - - overlay = - final: prev: { - unstable = pkgs'; - my = self.packages."${system}"; - }; - - overlays = - mapModules ./overlays import; - - packages."${system}" = - mapModules ./packages (p: pkgs.callPackage p {}); - - nixosModules = - { dotfiles = import ./.; } // mapModulesRec ./modules import; - - nixosConfigurations = - mapHosts ./hosts {}; - - devShell."${system}" = - import ./shell.nix { inherit pkgs; }; - - templates = { - full = { - path = ./.; - description = "A grossly incandescent nixos config"; - }; - minimal = { - path = ./templates/minimal; - description = "A grossly incandescent and minimal nixos config"; - }; - }; - defaultTemplate = self.templates.minimal; - - defaultApp."${system}" = { - type = "app"; - program = ./bin/hey; - }; - }; -} diff --git a/ftp.nix b/ftp.nix new file mode 100644 index 00000000..4b0da48a --- /dev/null +++ b/ftp.nix @@ -0,0 +1,20 @@ +{ pkgs, lib, ... }: + +{ + networking.firewall.allowedTCPPorts = [ 20 21 ]; + networking.firewall.allowedTCPPortRanges = [ { from = 51000; to = 51999; } ]; + services.vsftpd = { + enable = true; + writeEnable = true; + anonymousUser = true; + anonymousUserNoPassword = true; + anonymousUploadEnable = true; + anonymousMkdirEnable = true; + anonymousUserHome = "/home/ftp"; + extraConfig = '' + pasv_enable=Yes + pasv_min_port=51000 + pasv_max_port=51999 + ''; + }; +} diff --git a/gonic.nix b/gonic.nix new file mode 100644 index 00000000..11bed1f2 --- /dev/null +++ b/gonic.nix @@ -0,0 +1,12 @@ +{ config, lib, pkgs, ... }: +{ + services.gonic.enable = true; + services.gonic.settings = '' + music-path /data/music + podcast-path /data/music + cache-path /data/cache + ''; + services.gonic.group = "audio"; + services.gonic.user = "headphones"; + networking.firewall.allowedTCPPorts = [ 4747 ]; +} diff --git a/hosts/curve/hardware-configuration.nix b/hardware-configuration.nix similarity index 52% rename from hosts/curve/hardware-configuration.nix rename to hardware-configuration.nix index 9b8a0228..5a3f3976 100644 --- a/hosts/curve/hardware-configuration.nix +++ b/hardware-configuration.nix @@ -8,30 +8,30 @@ [ (modulesPath + "/installer/scan/not-detected.nix") ]; - boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; boot.initrd.kernelModules = [ "dm-snapshot" ]; - boot.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; boot.extraModulePackages = [ ]; fileSystems."/" = - { device = "/dev/disk/by-uuid/6ee9d430-1b1b-4e39-bced-606145570a78"; - fsType = "btrfs"; - options = [ "subvol=root" ]; + { device = "/dev/disk/by-uuid/ade0752d-84d3-4e39-865b-9027ba2d5c67"; + fsType = "ext4"; }; - fileSystems."/home" = - { device = "/dev/disk/by-uuid/6ee9d430-1b1b-4e39-bced-606145570a78"; - fsType = "btrfs"; - options = [ "subvol=home" ]; - }; - - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/AD0C-92EF"; + fileSystems."/boot/efi" = + { device = "/dev/disk/by-uuid/1715-278E"; fsType = "vfat"; }; + fileSystems."/data" = + { device = "/dev/disk/by-uuid/3276a297-9ee4-4998-b262-1ed100366c06"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."crypted-data".device = "/dev/disk/by-uuid/8a317bf4-fe13-4334-a6df-5fe5a5048b5e"; + swapDevices = - [ { device = "/dev/disk/by-uuid/5486bd9f-6826-4ac7-b09b-8768a35c331f"; } + [ { device = "/dev/disk/by-uuid/b790abb4-ba5f-4476-8f09-b0fc575414aa"; } ]; powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; diff --git a/headphones.nix b/headphones.nix new file mode 100644 index 00000000..a4211f76 --- /dev/null +++ b/headphones.nix @@ -0,0 +1,12 @@ +{config, lib, pkgs, ... }: +{ + services.headphones = { + enable = true; + host = "172.16.11.240"; + port = 8181; + user = "headphones"; + group = "audio"; + dataDir = "/data/music"; + }; + networking.firewall.allowedTCPPorts = [ 8181 ]; +} diff --git a/hosts/README.org b/hosts/README.org deleted file mode 100644 index f8dbafb9..00000000 --- a/hosts/README.org +++ /dev/null @@ -1,9 +0,0 @@ -#+TITLE: Host Configurations - -* Systems -+ kuro -+ shiro -+ ao -+ aka -+ aijiro -+ unlisted: 100+ linodes, 7 VMs diff --git a/hosts/aijiro/README.org b/hosts/aijiro/README.org deleted file mode 100644 index 04b4e810..00000000 --- a/hosts/aijiro/README.org +++ /dev/null @@ -1,30 +0,0 @@ -#+TITLE: Aijiro -#+DATE: September 3, 2021 - -* Overview -... - -* Specs -+ Intel i5-6400 -+ 8GB - -* Installation -** Set up root file system -#+BEGIN_SRC sh -parted /dev/sda -- mklabel gpt -parted /dev/sda -- mkpart ESP fat32 1MiB 512MiB -parted /dev/sda -- mkpart primary linux-swap 512MiB 8.5GiB -parted /dev/sda -- mkpart primary 8.5GiB 100% -parted /dev/sda -- set 1 boot on -mkfs.fat -F32 -n BOOT /dev/sda1 -mkswap -L swap /dev/sda2 -mkfs.ext4 -L nixos /dev/sda3 -#+END_SRC - -** Mount drives -#+BEGIN_SRC sh -mount /dev/sda3 /mnt -mkdir -p /mnt/boot -mount /dev/sda1 /mnt/boot -swapon /dev/sda2 -#+END_SRC diff --git a/hosts/aijiro/default.nix b/hosts/aijiro/default.nix deleted file mode 100644 index fa198463..00000000 --- a/hosts/aijiro/default.nix +++ /dev/null @@ -1,86 +0,0 @@ -# Shiro -- my laptop - -{ ... }: -{ - imports = [ - ../home.nix - ./hardware-configuration.nix - ]; - - ## Modules - modules = { - desktop = { - bspwm.enable = true; - apps = { - discord.enable = true; - rofi.enable = true; - # godot.enable = true; - }; - browsers = { - default = "brave"; - brave.enable = true; - # firefox.enable = true; - # qutebrowser.enable = true; - }; - gaming = { - # steam.enable = true; - # emulators.enable = true; - # emulators.psx.enable = true; - }; - media = { - daw.enable = true; - documents.enable = true; - graphics.enable = true; - mpv.enable = true; - recording.enable = true; - spotify.enable = true; - }; - term = { - default = "xst"; - st.enable = true; - }; - vm = { - qemu.enable = true; - }; - }; - dev = { - node.enable = true; - rust.enable = true; - python.enable = true; - }; - editors = { - default = "nvim"; - emacs.enable = true; - vim.enable = true; - }; - shell = { - # adl.enable = true; - vaultwarden.enable = true; - direnv.enable = true; - git.enable = true; - gnupg.enable = true; - tmux.enable = true; - zsh.enable = true; - }; - services = { - ssh.enable = true; - docker.enable = true; - # Needed occasionally to help the parental units with PC problems - # teamviewer.enable = true; - }; - theme.active = "alucard"; - }; - - - ## Local config - programs.ssh.startAgent = true; - services.openssh.startWhenNeeded = true; - - networking.wireless.enable = true; - # The global useDHCP flag is deprecated, therefore explicitly set to false - # here. Per-interface useDHCP will be mandatory in the future, so this - # generated config replicates the default behaviour. - networking.useDHCP = false; - - time.timeZone = "Europe/Copenhagen"; -} diff --git a/hosts/aijiro/hardware-configuration.nix b/hosts/aijiro/hardware-configuration.nix deleted file mode 100644 index 3a2c0dd1..00000000 --- a/hosts/aijiro/hardware-configuration.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ config, lib, pkgs, inputs, modulesPath, ... }: - -{ - imports = [ - (modulesPath + "/installer/scan/not-detected.nix") - ]; - - boot = { - initrd.availableKernelModules = [ "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" "sr_mod" "nvme" ]; - initrd.kernelModules = [ "dm-snapshot" ]; - kernelModules = [ "kvm-intel" ]; - extraModulePackages = [ ]; - kernelParams = [ - # HACK Disables fixes for spectre, meltdown, L1TF and a number of CPU - # vulnerabilities. Don't copy this blindly! And especially not for - # mission critical or server/headless builds exposed to the world. - "mitigations=off" - ]; - - # Refuse ICMP echo requests on my desktop/laptop; nobody has any business - # pinging them, unlike my servers. - kernel.sysctl."net.ipv4.icmp_echo_ignore_broadcasts" = 1; - }; - - # Modules - modules.hardware = { - audio.enable = true; - fs = { - enable = true; - ssd.enable = true; - }; - }; - - # CPU - nix.maxJobs = lib.mkDefault 4; - hardware.cpu.intel.updateMicrocode = true; - # performance gives better battery life/perf than ondemand on sandy bridge and - # newer because of intel pstates. - powerManagement.cpuFreqGovernor = "performance"; - # Without this wpa_supplicant may fail to auto-discover wireless interfaces at - # startup (and must be restarted). - networking.wireless.interfaces = [ "wlp3s0" ]; - - # Storage - fileSystems = { - "/" = { - device = "/dev/disk/by-label/nixos"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - "/boot" = { - device = "/dev/disk/by-label/BOOT"; - fsType = "vfat"; - }; - }; - swapDevices = [ { device = "/dev/disk/by-label/swap"; }]; -} diff --git a/hosts/ao/README.org b/hosts/ao/README.org deleted file mode 100644 index a00290e4..00000000 --- a/hosts/ao/README.org +++ /dev/null @@ -1,26 +0,0 @@ -#+TITLE: Ao -#+DATE: December 16, 2014 - -* Overview -Mac Mini 2014. Used as a low-power home server. - -* Specs -https://support.apple.com/kb/SP710?locale=en_CA - -* Installation -** Set up root file system -#+BEGIN_SRC sh -parted /dev/sda -- mklabel gpt -parted /dev/sda -- mkpart ESP fat32 1MiB 512MiB -parted /dev/sda -- mkpart primary 512MiB 100% -parted /dev/sda -- set 1 boot on -mkfs.fat -F32 -n BOOT /dev/sda1 -mkfs.ext4 -L nixos /dev/sda2 -#+END_SRC - -** Mount drives -#+BEGIN_SRC sh -mount /dev/sda2 /mnt -mkdir -p /mnt/boot -mount /dev/sda1 /mnt/boot -#+END_SRC diff --git a/hosts/ao/default.nix b/hosts/ao/default.nix deleted file mode 100644 index c4446748..00000000 --- a/hosts/ao/default.nix +++ /dev/null @@ -1,61 +0,0 @@ -# Ao -- my home development and user-facing server - -{ config, lib, ... }: - -with lib.my; -{ - imports = [ - ../server.nix - ../home.nix - ./hardware-configuration.nix - - ./modules/backup.nix - ./modules/gitea.nix - ./modules/vaultwarden.nix - ]; - - - ## Modules - modules = { - shell = { - direnv.enable = true; - git.enable = true; - zsh.enable = true; - }; - services = { - fail2ban.enable = true; - ssh.enable = true; - nginx.enable = true; - }; - - theme.active = "alucard"; - }; - - ## Local config - networking.networkmanager.enable = true; - - # nginx hosts - services.nginx.virtualHosts."v0.io" = { - default = true; - forceSSL = true; - enableACME = true; - locations = { - "~* \.(?:ico|css|map|js|gif|jpe?g|png|ttf|woff)$".extraConfig = '' - access_log off; - expires 30d; - add_header Pragma public; - add_header Cache-Control "public, mustrevalidate, proxy-revalidate"; - proxy_pass http://kiiro:8000; - proxy_buffering off; - ''; - "/".extraConfig = '' - client_max_body_size 10m; - proxy_pass http://kiiro:8000; - proxy_buffering off; - proxy_redirect off; - ''; - }; - }; - - security.acme.email = "henrik@lissner.net"; -} diff --git a/hosts/ao/hardware-configuration.nix b/hosts/ao/hardware-configuration.nix deleted file mode 100644 index 2a77977a..00000000 --- a/hosts/ao/hardware-configuration.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ config, lib, modulesPath, ... }: -{ - imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; - - boot = { - initrd.availableKernelModules = [ "ohci_pci" "ehci_pci" "ahci" "firewire_ohci" "usb_storage" "usbhid" "sd_mod" "sr_mod" "sdhci_pci" ]; - initrd.kernelModules = [ ]; - kernelModules = [ "kvm-intel" "wl" ]; - extraModulePackages = []; - }; - - ## CPU - nix.maxJobs = lib.mkDefault 2; - powerManagement.cpuFreqGovernor = "ondemand"; - - ## Harddrives - fileSystems = { - "/" = { - device = "/dev/disk/by-label/nixos"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - "/boot" = { - device = "/dev/disk/by-label/boot"; - fsType = "vfat"; - }; - "/usr/drive" = { - device = "kiiro:/volume1/homes/hlissner/Drive/backup/ao"; - fsType = "nfs"; - options = [ - "nofail" "noauto" "noatime" "x-systemd.automount" "x-systemd.idle-timeout=5min" - "nodev" "nosuid" "noexec" - ]; - }; - }; - swapDevices = [{ device = "/dev/disk/by-label/swap"; }]; -} diff --git a/hosts/ao/modules/backup.nix b/hosts/ao/modules/backup.nix deleted file mode 100644 index 1008bea8..00000000 --- a/hosts/ao/modules/backup.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ config, lib, pkgs, ... }: - -{ - services.vaultwarden.backupDir = "/backups/vaultwarden"; - services.gitea.dump.enable = true; - services.gitea.dump.backupDir = "/backups/gitea"; - system.activationScripts.createBackupDir = '' - mkdir -m 750 -p "${config.services.vaultwarden.backupDir}" || true - mkdir -m 750 -p "${config.services.gitea.dump.backupDir}" || true - chown vaultwarden:vaultwarden "${config.services.vaultwarden.backupDir}" - chown git:gitea "${config.services.gitea.dump.backupDir}" - ''; - - # systemd = { - # services.backups = { - # description = "Backup /backups to NAS"; - # wants = [ "usr-drive.mount" ]; - # path = [ pkgs.rsync ]; - # environment = { - # SRC_DIR = "/backups"; - # DEST_DIR = "/usr/drive"; - # }; - # script = '' - # if [[ -d "$1" && -d "$2" ]]; then - # echo "---- BACKUPING UP $1 TO $2 ----" - # rsync -rlptPJ --delete --delete-after \ - # --chmod=go= \ - # --chown=hlissner:users \ - # --exclude=lost+found/ \ - # --exclude=@eaDir/ \ - # --include=.git/ \ - # --filter=':- .gitignore' \ - # --filter=':- $XDG_CONFIG_HOME/git/ignore' \ - # "$SRC_DIR/" "$DEST_DIR" - # fi - # ''; - # serviceConfig = { - # Type = "oneshot"; - # Nice = 19; - # IOSchedulingClass = "idle"; - # }; - # }; - # timers.backups = { - # wantedBy = [ "timers.target" ]; - # partOf = [ "backups.service" ]; - # timerConfig.OnCalendar = "*-*-* 03:00:00"; - # timerConfig.Persistent = true; - # }; - # }; -} diff --git a/hosts/ao/modules/gitea.nix b/hosts/ao/modules/gitea.nix deleted file mode 100644 index b66d5301..00000000 --- a/hosts/ao/modules/gitea.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ config, lib, ... }: - -{ - modules.services.gitea.enable = true; - - services.gitea = { - appName = "V-NOUGHT"; - domain = "v0.io"; - rootUrl = "https://git.v0.io/"; - disableRegistration = true; - settings = { - server.SSH_DOMAIN = "v0.io"; - mailer = { - ENABLED = true; - FROM = "mail@v0.io"; - HOST = "mail.gmail.com:465"; - USER = "hlissner@gmail.com"; - MAILER_TYPE = "smtp"; - }; - }; - mailerPasswordFile = config.age.secrets.gitea-smtp.path; - }; - - services.nginx.virtualHosts."git.v0.io" = { - forceSSL = true; - enableACME = true; - root = "/srv/www/git.v0.io"; - locations."/".proxyPass = "http://127.0.0.1:3000"; - }; -} diff --git a/hosts/ao/modules/vaultwarden.nix b/hosts/ao/modules/vaultwarden.nix deleted file mode 100644 index 97eea774..00000000 --- a/hosts/ao/modules/vaultwarden.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ config, lib, ... }: - -{ - modules.services.vaultwarden.enable = true; - - services.vaultwarden.config = { - signupsAllowed = false; - invitationsAllowed = true; - domain = "https://p.v0.io"; - httpPort = 8002; - }; - - # Inject secrets at runtime - systemd.services.vaultwarden.serviceConfig = { - EnvironmentFile = [ config.age.secrets.vaultwarden-smtp-env.path ]; - Restart = "on-failure"; - RestartSec = "2s"; - }; - - services.nginx.virtualHosts."p.v0.io" = { - forceSSL = true; - enableACME = true; - root = "/srv/www/p.v0.io"; - extraConfig = '' - client_max_body_size 128M; - ''; - locations = { - "/".proxyPass = "http://127.0.0.1:8000"; - "/notifications/hub".proxyWebsockets = true; - "/notifications/hub/negotiate".proxyPass = "http://127.0.0.1:8001"; - }; - }; -} diff --git a/hosts/ao/secrets/gitea-smtp.age b/hosts/ao/secrets/gitea-smtp.age deleted file mode 100644 index 580888fc..00000000 --- a/hosts/ao/secrets/gitea-smtp.age +++ /dev/null @@ -1,7 +0,0 @@ -age-encryption.org/v1 --> ssh-ed25519 4+kR2g aFztrZ7QN3Odj4EbFwuaRn+1VSuTFSUZ1Gwtgf5ELmw -H2s3EFMm4cRnFw5AbeOmX+OdADnEuMW5KqR4erH8Rv0 --> (-grease 10P|_2X -JP9WDuBVhwq8P4B/QTPM/UFVgEM ---- IV78E3ztrIne6HidhqvOUfg//H77bnXQlXvEtqmpkBA -,S"2(*b ׍z=CIPmg܅g4tog!DJm \ No newline at end of file diff --git a/hosts/ao/secrets/secrets.nix b/hosts/ao/secrets/secrets.nix deleted file mode 100644 index bac7d92e..00000000 --- a/hosts/ao/secrets/secrets.nix +++ /dev/null @@ -1,5 +0,0 @@ -let key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINd+4ijlEHI98NLpgP/El73BmpBUfzka9ovdt8FoaVAG hlissner@home"; -in { - "vaultwarden-smtp-env.age".publicKeys = [key]; - "gitea-smtp.age".publicKeys = [key]; -} diff --git a/hosts/ao/secrets/vaultwarden-smtp-env.age b/hosts/ao/secrets/vaultwarden-smtp-env.age deleted file mode 100644 index 2f6db06f..00000000 Binary files a/hosts/ao/secrets/vaultwarden-smtp-env.age and /dev/null differ diff --git a/hosts/curve/configuration.nix b/hosts/curve/configuration.nix deleted file mode 100755 index 409453ef..00000000 --- a/hosts/curve/configuration.nix +++ /dev/null @@ -1,85 +0,0 @@ -{ config, pkgs, ... }: - -{ - imports = - [ # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; - - boot.loader.grub.enable = true; - boot.loader.grub.version = 2; - # Define on which hard drive you want to install Grub. - boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only - - # Minimal list of modules to use the EFI system partition and the YubiKey - boot.initrd.kernelModules = [ "vfat" "nls_cp437" "nls_iso8859-1" "usbhid" ]; - - # Enable support for the YubiKey PBA - boot.initrd.luks.yubikeySupport = true; - - # Configuration to use your Luks device - boot.initrd.luks.devices = { - "crypthome" = { - device = "/dev/sda2"; - preLVM = true; # You may want to set this to false if you need to start a network service first - yubikey = { - slot = 2; - twoFactor = true; # Set to false if you did not set up a user password. - storage = { - device = "/dev/sda1"; - }; - }; - }; - }; - - services.udev.extraRules = '' - SUBSYSTEMS=="usb", ATTRS{manufacturer}=="NVIDIA Corp.", ATTRS{product}=="APX", GROUP="switch" - ''; - services.udev.packages = [ pkgs.android-udev-rules ]; - - # nix = { - # package = pkgs.nixUnstable; - # extraOptions = "experimental-features = nix-command flakes"; - # }; - - networking.hostName = "curve"; # Define your hostname. - networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. - - time.timeZone = "Australia/Brisbane"; - - networking.useDHCP = false; - networking.interfaces.enp0s31f6.useDHCP = true; - networking.interfaces.wlp3s0.useDHCP = true; - - # Select internationalisation properties. - i18n.defaultLocale = "en_US.UTF-8"; - # console = { - # font = "Lat2-Terminus16"; - # keyMap = "us"; - # }; - - services.xserver.layout = "us,dvorak"; - - sound.enable = true; - hardware.pulseaudio.enable = true; - - services.xserver.libinput.enable = true; - programs.adb.enable = true; - - users.users.anish = { - isNormalUser = true; - extraGroups = [ "wheel" "video" "switch" "adbusers" ]; - }; - - # Enable the OpenSSH daemon. - # services.openssh.enable = true; - - # This value determines the NixOS release from which the default - # settings for stateful data, like file locations and database versions - # on your system were taken. It‘s perfectly fine and recommended to leave - # this value at the release version of the first install of this system. - # Before changing this value read the documentation for this option - # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). - system.stateVersion = "21.05"; # Did you read the comment? -} - diff --git a/hosts/curve/default.nix b/hosts/curve/default.nix deleted file mode 100644 index 601086f2..00000000 --- a/hosts/curve/default.nix +++ /dev/null @@ -1,131 +0,0 @@ -{ pkgs, config, lib, ... }: -{ - imports = [ - ../home.nix - ../common.nix - ./hardware-configuration.nix - ./configuration.nix - ]; - - ## Modules - modules = { - desktop = { - bspwm.enable = true; - apps = { - discord.enable = true; - rofi.enable = true; - # godot.enable = true; - # signal.enable = true; - }; - browsers = { - default = "firefox"; - brave.enable = false; - firefox.enable = true; - qutebrowser.enable = true; - }; - gaming = { - # steam.enable = true; - # emulators.enable = true; - # emulators.psx.enable = true; - }; - media = { - daw.enable = true; - documents.enable = true; - graphics.enable = true; - mpv.enable = true; - recording.enable = true; - spotify.enable = false; - }; - term = { - default = "xst"; - st.enable = true; - }; - vm = { - qemu.enable = false; - }; - }; - dev = { - node.enable = false; - rust.enable = false; - python.enable = true; - }; - editors = { - default = "vim"; - #emacs.enable = true; - #vim.enable = true; - }; - shell = { - adl.enable = true; - vaultwarden.enable = false; - direnv.enable = true; - git.enable = true; - gnupg.enable = true; - tmux.enable = false; - zsh.enable = false; - }; - services = { - ssh.enable = true; - docker.enable = false; - # Needed occasionally to help the parental units with PC problems - # teamviewer.enable = true; - }; - theme.active = "alucard"; - }; - - - ## Local config - programs.ssh.startAgent = true; - # services.openssh.startWhenNeeded = true; - - # networking.networkmanager.enable = true; - # The global useDHCP flag is deprecated, therefore explicitly set to false - # here. Per-interface useDHCP will be mandatory in the future, so this - # generated config replicates the default behaviour. - networking.useDHCP = false; - programs.neovim.enable = true; - - programs.light.enable = true; - - ## Personal backups - # Syncthing is a bit heavy handed for my needs, so rsync to my NAS instead. - # systemd = { - # services.backups = { - # description = "Backup /usr/store to NAS"; - # wants = [ "usr-drive.mount" ]; - # path = [ pkgs.rsync ]; - # environment = { - # SRC_DIR = "/usr/store"; - # DEST_DIR = "/usr/drive"; - # }; - # script = '' - # rcp() { - # if [[ -d "$1" && -d "$2" ]]; then - # echo "---- BACKUPING UP $1 TO $2 ----" - # rsync -rlptPJ --chmod=go= --delete --delete-after \ - # --exclude=lost+found/ \ - # --exclude=@eaDir/ \ - # --include=.git/ \ - # --filter=':- .gitignore' \ - # --filter=':- $XDG_CONFIG_HOME/git/ignore' \ - # "$1" "$2" - # fi - # } - # rcp "$HOME/projects/" "$DEST_DIR/projects" - # rcp "$SRC_DIR/" "$DEST_DIR" - # ''; - # serviceConfig = { - # Type = "oneshot"; - # Nice = 19; - # IOSchedulingClass = "idle"; - # User = config.user.name; - # Group = config.user.group; - # }; - # }; - # timers.backups = { - # wantedBy = [ "timers.target" ]; - # partOf = [ "backups.service" ]; - # timerConfig.OnCalendar = "*-*-* 00,12:00:00"; - # timerConfig.Persistent = true; - # }; - # }; -} diff --git a/hosts/home.nix b/hosts/home.nix deleted file mode 100644 index f297287b..00000000 --- a/hosts/home.nix +++ /dev/null @@ -1,65 +0,0 @@ -{ config, lib, ... }: - -with lib; -{ - # networking.hosts = - # let hostConfig = { - # "192.168.1.2" = [ "ao" ]; - # "192.168.1.3" = [ "kiiro" ]; - # "192.168.1.10" = [ "kuro" ]; - # "192.168.1.11" = [ "shiro" ]; - # "192.168.1.12" = [ "midori" ]; - # }; - # hosts = flatten (attrValues hostConfig); - # hostName = config.networking.hostName; - # in mkIf (builtins.elem hostName hosts) hostConfig; - - ## Location config -- since Toronto is my 127.0.0.1 - time.timeZone = mkDefault "Australia/Brisbane"; - i18n.defaultLocale = mkDefault "en_US.UTF-8"; - # For redshift, mainly - location = (if config.time.timeZone == "Australia/Brisbane" then { - latitude = 27.470; - longitude = 153.0260; - } else if config.time.timeZone == "Europe/Copenhagen" then { - latitude = 55.88; - longitude = 12.5; - } else {}); - - # So the vaultwarden CLI knows where to find my server. - # modules.shell.vaultwarden.config.server = "p.v0.io"; - - - ## Not using syncthing atm - # services.syncthing.declarative = { - # # Purge folders not declaratively configured! - # overrideFolders = true; - # overrideDevices = true; - # devices = { - # kuro.id = "4UJSUBN-V7LCISG-6ZE7SBN-YPXM5FQ-CE7CD2U-W4KZC7O-4HUZZSW-6DXAGQQ"; - # shiro.id = "G4DUO25-AMQQIWS-SRZE5TJ-43CCQZJ-5ULEZBS-P2LMZZU-V5JA5CS-6X7RLQK"; - # kiiro.id = "3A6G2NR-WQMASWG-7EFUX6G-GJB6WYX-HYGDA7N-EYZYANY-NDRKI3W-32RQ4QG"; - # }; - # folders = - # let mkShare = devices: type: paths: attrs: (rec { - # inherit devices type; - # path = if lib.isAttrs paths - # then paths."${config.networking.hostName}" - # else paths; - # watch = false; - # rescanInterval = 3600; # every hour - # enable = lib.elem config.networking.hostName devices; - # } // attrs); - # in { - # projects = mkShare [ "kuro" "shiro" ] "sendreceive" # "${config.user.home}/projects" - # { watch = true; - # rescanInterval = 3600 * 4; }; # every 4 hours - # serverBackup = mkShare [ "ao" "kiiro" ] "sendonly" "/run/backups" - # mainBackup = mkShare [ "kuro" "kiiro" ] "sendreceive" # "/usr/store" - # { versioning = { - # type = "staggered"; - # params.maxAge = "356"; - # }; }; - # }; - # }; -} diff --git a/hosts/kuro/README.org b/hosts/kuro/README.org deleted file mode 100644 index e76e1342..00000000 --- a/hosts/kuro/README.org +++ /dev/null @@ -1,88 +0,0 @@ -#+TITLE: Kuro -#+DATE: September 13, 2020 - -* Overview -My main driver for work on Linux. - -Have a separate Windows rig for gaming/adobe (Midori). - -* Specs -| CASE | [[https://www.amazon.com/Fractal-Design-Define-Cases-FD-CA-DEF-R4-BL/dp/B008HD3CTI][Fractal Design Define R4 ATX Tower Case Black Pearl]] | -| CPU | [[https://www.newegg.ca/amd-ryzen-9-3900x/p/N82E16819113103][AMD Ryzen 9 3900X 12-core, 24-thread]] | -| MOBO | [[https://www.newegg.ca/gigabyte-b550-aorus-elite/p/N82E16813145214?Item=N82E16813145214&IsFeedbackTab=true#scrollFullInfo][GIGABYTE B550 AORUS Elite]] | -| COOL | [[https://www.newegg.ca/cooler-master-hyper-212-evo-rr-212e-20pk-r2/p/N82E16835103099][Cooler Master Hyper 212 Evo]] | -| GPU | EVGA GeForce 680 GTX SC | -| RAM | [[https://www.newegg.ca/g-skill-64gb-288-pin-ddr4-sdram/p/N82E16820374003?Description=G.SKILL%20Ripjaws%20V%20Series%2064gb&cm_re=G.SKILL_Ripjaws%20V%20Series%2064gb-_-20-374-003-_-Product][G.SKILL Ripjaws V Series 64GB (2x 32GB)]] | -| HDD | [[https://www.newegg.ca/samsung-970-evo-plus-500gb/p/N82E16820147742?Description=samsung%20970%20evo%20plus&cm_re=samsung_970%20evo%20plus-_-20-147-742-_-Product][Samsung 970 EVO Plus 500GB NVMe M2]] | -| KBD | [[https://ergodox-ez.com/][ErgoDox-EZ]] | -| MOUSE | [[https://www.anker.com/products/variant/anker-24g-wireless-vertical-ergonomic-optical-mouse/A7852011][Anker Wireless Vertical Mouse]] | - -* Installation -** Set up root file system -#+BEGIN_SRC sh -# EVO Plus 500gb -parted /dev/nvme0n1 -- mklabel gpt -parted /dev/nvme0n1 -- mkpart ESP fat32 1MiB 512MiB -parted /dev/nvme0n1 -- mkpart primary 512MiB 200GiB -parted /dev/nvme0n1 -- mkpart primary 200GiB 100% -parted /dev/nvme0n1 -- set 1 boot on -mkfs.fat -F32 -n BOOT /dev/nvme0n1p1 -mkfs.ext4 -L nixos /dev/nvme0n1p2 -mkfs.ext4 -L home /dev/nvme0n1p3 -#+END_SRC - -** Set up VM SSDs -#+BEGIN_SRC shell -# 2x SSDs for VMs -parted /dev/sda -- mklabel gpt -parted -a optimal /dev/sda -- mkpart primary 0% 100% -parted /dev/sdb -- mklabel gpt -parted -a optimal /dev/sdb -- mkpart primary 0% 100% -mkfs.ext4 -L vm1 /dev/sda1 -mkfs.ext4 -L vm2 /dev/sdb1 -#+END_SRC - -** Set up backup file system -#+BEGIN_SRC sh -parted /dev/sdc -- mklabel gpt -parted /dev/sdc -- mkpart primary ext4 0% 100% -mkfs.ext4 -L store /dev/sdc -#+END_SRC - -** +Set up backup file system+ -Backup was moved to an NAS, so this is no longer needed. It's kept as a -reference. - -#+BEGIN_SRC sh -# 2x 1TB mirrored backup -zpool create -R /mnt \ - -O mountpoint=none \ - -O xattr=sa \ - -O atime=off \ - -O compression=lz4 \ - -O recordsize=1M \ - -o ashift=9 \ - usr mirror /dev/sdc /dev/sdd - -# aux -zfs create -o mountpoint=legacy usr/media -zfs create -o mountpoint=legacy usr/backup -zfs create -o mountpoint=legacy -o recordsize=128K usr/share -zfs create -o mountpoint=legacy -o recordsize=128K usr/local -#+END_SRC - -** Mount drives -#+BEGIN_SRC sh -mount /dev/nvme0n1p2 /mnt - -mkdir -p /mnt/{home,boot,usr/store} -mount /dev/nvme0n1p1 /mnt/boot -mount /dev/nvme0n1p3 /mnt/home -# mount -t zfs {usr,/mnt/usr}/backup -# mount -t zfs {usr,/mnt/usr}/media -# mount -t zfs {usr,/mnt/usr}/share -# mount -t zfs {usr,/mnt/usr}/local -mount /dev/sda1 /usr/vm/windows -mount /dev/sdb1 /usr/vm/macos -mount /dev/sdc2 /usr/store -#+END_SRC diff --git a/hosts/kuro/default.nix b/hosts/kuro/default.nix deleted file mode 100644 index db2abe2e..00000000 --- a/hosts/kuro/default.nix +++ /dev/null @@ -1,127 +0,0 @@ -{ pkgs, config, lib, ... }: -{ - imports = [ - ../home.nix - ./hardware-configuration.nix - ]; - - ## Modules - modules = { - desktop = { - bspwm.enable = true; - apps = { - discord.enable = true; - rofi.enable = true; - # godot.enable = true; - signal.enable = true; - }; - browsers = { - default = "brave"; - brave.enable = true; - firefox.enable = true; - qutebrowser.enable = true; - }; - gaming = { - steam.enable = true; - # emulators.enable = true; - # emulators.psx.enable = true; - }; - media = { - daw.enable = true; - documents.enable = true; - graphics.enable = true; - mpv.enable = true; - recording.enable = true; - spotify.enable = true; - }; - term = { - default = "xst"; - st.enable = true; - }; - vm = { - qemu.enable = true; - }; - }; - dev = { - node.enable = true; - rust.enable = true; - python.enable = true; - }; - editors = { - default = "nvim"; - emacs.enable = true; - vim.enable = true; - }; - shell = { - adl.enable = true; - vaultwarden.enable = true; - direnv.enable = true; - git.enable = true; - gnupg.enable = true; - tmux.enable = true; - zsh.enable = true; - }; - services = { - ssh.enable = true; - docker.enable = true; - # Needed occasionally to help the parental units with PC problems - # teamviewer.enable = true; - }; - theme.active = "alucard"; - }; - - - ## Local config - programs.ssh.startAgent = true; - services.openssh.startWhenNeeded = true; - - networking.networkmanager.enable = true; - # The global useDHCP flag is deprecated, therefore explicitly set to false - # here. Per-interface useDHCP will be mandatory in the future, so this - # generated config replicates the default behaviour. - networking.useDHCP = false; - - - ## Personal backups - # Syncthing is a bit heavy handed for my needs, so rsync to my NAS instead. - systemd = { - services.backups = { - description = "Backup /usr/store to NAS"; - wants = [ "usr-drive.mount" ]; - path = [ pkgs.rsync ]; - environment = { - SRC_DIR = "/usr/store"; - DEST_DIR = "/usr/drive"; - }; - script = '' - rcp() { - if [[ -d "$1" && -d "$2" ]]; then - echo "---- BACKUPING UP $1 TO $2 ----" - rsync -rlptPJ --chmod=go= --delete --delete-after \ - --exclude=lost+found/ \ - --exclude=@eaDir/ \ - --include=.git/ \ - --filter=':- .gitignore' \ - --filter=':- $XDG_CONFIG_HOME/git/ignore' \ - "$1" "$2" - fi - } - rcp "$HOME/projects/" "$DEST_DIR/projects" - rcp "$SRC_DIR/" "$DEST_DIR" - ''; - serviceConfig = { - Type = "oneshot"; - Nice = 19; - IOSchedulingClass = "idle"; - User = config.user.name; - Group = config.user.group; - }; - }; - timers.backups = { - wantedBy = [ "timers.target" ]; - partOf = [ "backups.service" ]; - timerConfig.OnCalendar = "*-*-* 00,12:00:00"; - timerConfig.Persistent = true; - }; - }; -} diff --git a/hosts/kuro/hardware-configuration.nix b/hosts/kuro/hardware-configuration.nix deleted file mode 100644 index 2a410e8a..00000000 --- a/hosts/kuro/hardware-configuration.nix +++ /dev/null @@ -1,96 +0,0 @@ -{ config, lib, pkgs, modulesPath, ... }: - -{ - imports = [ "${modulesPath}/installer/scan/not-detected.nix" ]; - - boot = { - initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; - initrd.kernelModules = []; - extraModulePackages = []; - kernelModules = [ "kvm-amd" ]; - kernelParams = [ - # HACK Disables fixes for spectre, meltdown, L1TF and a number of CPU - # vulnerabilities. Don't copy this blindly! And especially not for - # mission critical or server/headless builds exposed to the world. - "mitigations=off" - ]; - - # Refuse ICMP echo requests on my desktop/laptop; nobody has any business - # pinging them, unlike my servers. - kernel.sysctl."net.ipv4.icmp_echo_ignore_broadcasts" = 1; - }; - - # Modules - modules.hardware = { - audio.enable = true; - ergodox.enable = true; - fs = { - enable = true; - ssd.enable = true; - }; - nvidia.enable = true; - sensors.enable = true; - }; - - # CPU - nix.maxJobs = lib.mkDefault 16; - powerManagement.cpuFreqGovernor = "performance"; - hardware.cpu.amd.updateMicrocode = true; - - # Displays - services.xserver = { - # This must be done manually to ensure my screen spaces are arranged exactly - # as I need them to be *and* the correct monitor is "primary". Using - # xrandrHeads does not work. - monitorSection = '' - VendorName "Unknown" - ModelName "DELL U2515H" - HorizSync 30.0 - 113.0 - VertRefresh 56.0 - 86.0 - Option "DPMS" - ''; - screenSection = '' - Option "metamodes" "HDMI-0: nvidia-auto-select +1920+0, DVI-I-1: nvidia-auto-select +0+180, DVI-D-0: nvidia-auto-select +4480+180" - Option "SLI" "Off" - Option "MultiGPU" "Off" - Option "BaseMosaic" "off" - Option "Stereo" "0" - Option "nvidiaXineramaInfoOrder" "DFP-1" - ''; - }; - - # Storage - fileSystems = { - "/" = { - device = "/dev/disk/by-label/nixos"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - "/boot" = { - device = "/dev/disk/by-label/BOOT"; - fsType = "vfat"; - }; - "/home" = { - device = "/dev/disk/by-label/home"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - "/usr/drive" = { - device = "kiiro:/volume1/homes/hlissner/Drive"; - fsType = "nfs"; - options = [ - "nofail" "noauto" "noatime" "x-systemd.automount" "x-systemd.idle-timeout=5min" - "nodev" "nosuid" "noexec" - ]; - }; - "/usr/store" = { - device = "/dev/disk/by-label/store"; - fsType = "ext4"; - options = [ - "noauto" "noatime" "x-systemd.automount" "x-systemd.idle-timeout=5min" - "nodev" "nosuid" "noexec" - ]; - }; - }; - swapDevices = []; -} diff --git a/hosts/linode.nix b/hosts/linode.nix deleted file mode 100644 index 6f517dc6..00000000 --- a/hosts/linode.nix +++ /dev/null @@ -1,117 +0,0 @@ -# 1. Create three (3) disk images: -# - Installer: 1024mb -# - Swap: 512mb -# - NixOS: rest -# -# 2. Boot in rescue mode with: -# - /dev/sda -> Installer -# - /dev/sdb -> Swap -# - /dev/sdc -> NixOS -# -# 3. Once booted into Finnix (step 2) pipe this script to sh: -# iso=https://channels.nixos.org/nixos-20.09/latest-nixos-minimal-x86_64-linux.iso -# update-ca-certificates -# curl -k $iso | dd bs=1M of=/dev/sda -# -# 4. Create two configuration profiles: -# - Installer -# - Kernel: Direct Disk -# - /dev/sda -> NixOS -# - /dev/sdb -> Swap -# - /dev/sdc -> Installer -# - Helpers: distro and auto network helpers = off -# - Boot -# - Kernel: GRUB 2 -# - /dev/sda -> NixOS -# - /dev/sdb -> Swap -# - Helpers: distro and auto network helpers = off -# -# 5. Boot into installer profile. -# -# 6. Generate hardware-configuration.nix -# e2label /dev/sda nixos -# swaplabel -L swap /dev/sdb -# mount /dev/disk/by-label/nixos /mnt -# swapon /dev/disk/by-label/swap -# nixos-generate-config --root /mnt -# vim /mnt/etc/nixos/hardware-configuration.nix # change uuids to labels -# -# 7. Install dotfiles: -# nix-env -iA nixos.git nixos.nixFlakes -# mkdir -p /mnt/home/hlissner/.config -# cd /mnt/home/hlissner/.config -# git clone https://github.com/hlissner/dotfiles -# nixos-install --root /mnt --flake .#linode --impure -# OR (on older versions of nixos) -# nixos-install --root /mnt --flake .#linode --option pure-eval false -# -# 8. Reboot into "Boot" profile. - -{ modulesPath, config, lib, pkgs, ... }: - -with lib; -{ - imports = [ - "${modulesPath}/profiles/qemu-guest.nix" - ./server.nix - ]; - - environment.systemPackages = - with pkgs; [ inetutils mtr sysstat git ]; - - modules = { - editors = { - default = "nvim"; - vim.enable = true; - }; - shell = { - git.enable = true; - zsh.enable = true; - }; - services.ssh.enable = true; - }; - - # GRUB - boot = { - kernelModules = []; - # Needed for LISH (part 1) - kernelParams = [ "console=ttyS0" ]; - extraModulePackages = []; - initrd = { - availableKernelModules = [ "virtio_pci" "ahci" "sd_mod" ]; - kernelModules = []; - }; - loader = { - timeout = 10; - grub = { - enable = true; - version = 2; - device = "/dev/sda"; - copyKernels = true; - fsIdentifier = "provided"; - # Needed for LISH (part 2) - extraConfig = "serial; terminal_input serial; terminal_output serial"; - # GRUB will complain about blocklists when trying to install grub on a - # partition-less disk. This tells it to ignore the warning and carry on. - forceInstall = true; - }; - # Disable globals - systemd-boot.enable = false; - efi.canTouchEfiVariables = false; - }; - }; - - networking = { - useDHCP = false; - usePredictableInterfaceNames = false; - interfaces.eth0 = { - useDHCP = true; - }; - }; - - fileSystems."/" = { - device = "/dev/sda"; - fsType = "ext4"; - }; - swapDevices = [ { device = "/dev/sdb"; } ]; -} diff --git a/hosts/server.nix b/hosts/server.nix deleted file mode 100644 index 5edf73a2..00000000 --- a/hosts/server.nix +++ /dev/null @@ -1,31 +0,0 @@ -# hosts/server.nix -# -# Only to be used for headless servers, at home or abroad, with more -# security/automation-minded configuration. - -{ config, lib, pkgs, ... }: - -{ - boot.kernelPackages = pkgs.linuxPackages_latest_hardened; - - nix.gc = { - automatic = true; - dates = "weekly"; - options = "--delete-older-than 30d"; - }; - - systemd = { - services.clear-log = { - description = "Clear >1 month-old logs every week"; - serviceConfig = { - Type = "oneshot"; - ExecStart = "${pkgs.systemd}/bin/journalctl --vacuum-time=30d"; - }; - }; - timers.clear-log = { - wantedBy = [ "timers.target" ]; - partOf = [ "clear-log.service" ]; - timerConfig.OnCalendar = "weekly UTC"; - }; - }; -} diff --git a/hosts/shiro/README.org b/hosts/shiro/README.org deleted file mode 100644 index 5e1bb0fa..00000000 --- a/hosts/shiro/README.org +++ /dev/null @@ -1,18 +0,0 @@ -#+TITLE: Shiro -#+DATE: December 29, 2018 - -* Overview -For work on the go. Dual boots Windows and NixOS. - -* Specs -| MAKE | [[https://www.dell.com/support/manuals/en-ca/xps-13-9370-laptop/xps-13-9370-setupandspecs/specifications-for-xps-13-9370?guid=guid-c3a6ce65-b23d-41b2-b9c9-244850da6393&lang=en-us][Dell 13" 9370]] | -| CPU | Intel i7-8550U | -| RAM | 16gb | -| HDD | 500gb NVMe | - -* Installation -The primary partition needs to be shrunk on the Windows side, then: - -#+BEGIN_SRC sh -# TODO -#+END_SRC diff --git a/hosts/shiro/default.nix b/hosts/shiro/default.nix deleted file mode 100644 index 1e0ef52d..00000000 --- a/hosts/shiro/default.nix +++ /dev/null @@ -1,67 +0,0 @@ -# Shiro -- my laptop - -{ ... }: -{ - imports = [ - ../home.nix - ./hardware-configuration.nix - ]; - - ## Modules - modules = { - desktop = { - bspwm.enable = true; - apps = { - discord.enable = true; - rofi.enable = true; - # skype.enable = true; - }; - browsers = { - default = "firefox"; - firefox.enable = true; - }; - media = { - # daw.enable = true; - documents.enable = true; - graphics.enable = true; - mpv.enable = true; - recording.enable = true; - spotify.enable = true; - }; - term = { - default = "xst"; - st.enable = true; - }; - vm = {}; - }; - editors = { - default = "nvim"; - emacs.enable = true; - vim.enable = true; - }; - dev = {}; - shell = { - vaultwarden.enable = true; - direnv.enable = true; - git.enable = true; - gnupg.enable = true; - tmux.enable = true; - zsh.enable = true; - }; - services = { - # syncthing.enable = true; - ssh.enable = true; - }; - theme.active = "alucard"; - }; - - - ## Local config - programs.ssh.startAgent = true; - services.openssh.startWhenNeeded = true; - - networking.wireless.enable = true; - hardware.opengl.enable = true; - - # time.timeZone = "Europe/Copenhagen"; -} diff --git a/hosts/shiro/hardware-configuration.nix b/hosts/shiro/hardware-configuration.nix deleted file mode 100644 index 68e3e383..00000000 --- a/hosts/shiro/hardware-configuration.nix +++ /dev/null @@ -1,84 +0,0 @@ -{ config, lib, pkgs, inputs, modulesPath, ... }: - -{ - imports = [ - (modulesPath + "/installer/scan/not-detected.nix") - inputs.nixos-hardware.nixosModules.dell-xps-13-9370 - ]; - - boot = { - initrd.availableKernelModules = [ "xhci_pci" "nvme" "rtsx_pci_sdmmc" ]; - initrd.kernelModules = [ "dm-snapshot" ]; - kernelModules = [ "kvm-intel" ]; - extraModulePackages = [ ]; - kernelParams = [ - # HACK Disables fixes for spectre, meltdown, L1TF and a number of CPU - # vulnerabilities. Don't copy this blindly! And especially not for - # mission critical or server/headless builds exposed to the world. - "mitigations=off" - ]; - - # Refuse ICMP echo requests on my desktop/laptop; nobody has any business - # pinging them, unlike my servers. - kernel.sysctl."net.ipv4.icmp_echo_ignore_broadcasts" = 1; - }; - - # Modules - modules.hardware = { - audio.enable = true; - fs = { - enable = true; - ssd.enable = true; - }; - }; - - # CPU - nix.maxJobs = lib.mkDefault 8; - hardware.cpu.intel.updateMicrocode = true; - # performance gives better battery life/perf than ondemand on sandy bridge and - # newer because of intel pstates. - powerManagement.cpuFreqGovernor = "performance"; - # Without this wpa_supplicant may fail to auto-discover wireless interfaces at - # startup (and must be restarted). - networking.wireless.interfaces = [ "wlp2s0" ]; - - # Power management - environment.systemPackages = [ pkgs.acpi ]; - powerManagement.powertop.enable = true; - # Monitor backlight control - programs.light.enable = true; - user.extraGroups = [ "video" ]; - - # Storage - fileSystems = { - "/" = { - device = "/dev/disk/by-label/nixos"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - "/boot" = { - device = "/dev/disk/by-label/BOOT"; - fsType = "vfat"; - }; - "/home" = { - device = "/dev/disk/by-label/home"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - "/usr/drive" = { - device = "kiiro:/volume1/homes/hlissner/Drive"; - fsType = "nfs"; - options = [ - "nofail" "noauto" "noatime" "x-systemd.automount" "x-systemd.idle-timeout=5min" - "nodev" "nosuid" "noexec" - ]; - }; - }; - swapDevices = [ { device = "/dev/disk/by-label/swap"; }]; - - boot.initrd.luks.devices.home = { - device = "/dev/nvme0n1p8"; - preLVM = true; - allowDiscards = true; - }; -} diff --git a/lib/attrs.nix b/lib/attrs.nix deleted file mode 100644 index 0f8ebd19..00000000 --- a/lib/attrs.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ lib, ... }: - -with builtins; -with lib; -rec { - # attrsToList - attrsToList = attrs: - mapAttrsToList (name: value: { inherit name value; }) attrs; - - # mapFilterAttrs :: - # (name -> value -> bool) - # (name -> value -> { name = any; value = any; }) - # attrs - mapFilterAttrs = pred: f: attrs: filterAttrs pred (mapAttrs' f attrs); - - # Generate an attribute set by mapping a function over a list of values. - genAttrs' = values: f: listToAttrs (map f values); - - # anyAttrs :: (name -> value -> bool) attrs - anyAttrs = pred: attrs: - any (attr: pred attr.name attr.value) (attrsToList attrs); - - # countAttrs :: (name -> value -> bool) attrs - countAttrs = pred: attrs: - count (attr: pred attr.name attr.value) (attrsToList attrs); -} diff --git a/lib/default.nix b/lib/default.nix deleted file mode 100644 index 8cd67160..00000000 --- a/lib/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ inputs, lib, pkgs, ... }: - -let - inherit (lib) makeExtensible attrValues foldr; - inherit (modules) mapModules; - - modules = import ./modules.nix { - inherit lib; - self.attrs = import ./attrs.nix { inherit lib; self = {}; }; - }; - - mylib = makeExtensible (self: - with self; mapModules ./. - (file: import file { inherit self lib pkgs inputs; })); -in -mylib.extend - (self: super: - foldr (a: b: a // b) {} (attrValues super)) diff --git a/lib/generators.nix b/lib/generators.nix deleted file mode 100644 index 4b298e52..00000000 --- a/lib/generators.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ lib, pkgs, ... }: - -with builtins; -with lib; -{ - toCSSFile = file: - let fileName = removeSuffix ".scss" (baseNameOf file); - compiledStyles = - pkgs.runCommand "compileScssFile" - { buildInputs = [ pkgs.sass ]; } '' - mkdir "$out" - scss --sourcemap=none \ - --no-cache \ - --style compressed \ - --default-encoding utf-8 \ - "${file}" \ - >>"$out/${fileName}.css" - ''; - in "${compiledStyles}/${fileName}.css"; - - toFilteredImage = imageFile: options: - let result = "result.png"; - filteredImage = - pkgs.runCommand "filterWallpaper" - { buildInputs = [ pkgs.imagemagick ]; } '' - mkdir "$out" - convert ${options} ${imageFile} $out/${result} - ''; - in "${filteredImage}/${result}"; -} diff --git a/lib/modules.nix b/lib/modules.nix deleted file mode 100644 index 47743f12..00000000 --- a/lib/modules.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ self, lib, ... }: - -let - inherit (builtins) attrValues readDir pathExists concatLists; - inherit (lib) id mapAttrsToList filterAttrs hasPrefix hasSuffix nameValuePair removeSuffix; - inherit (self.attrs) mapFilterAttrs; -in -rec { - mapModules = dir: fn: - mapFilterAttrs - (n: v: - v != null && - !(hasPrefix "_" n)) - (n: v: - let path = "${toString dir}/${n}"; in - if v == "directory" && pathExists "${path}/default.nix" - then nameValuePair n (fn path) - else if v == "regular" && - n != "default.nix" && - hasSuffix ".nix" n - then nameValuePair (removeSuffix ".nix" n) (fn path) - else nameValuePair "" null) - (readDir dir); - - mapModules' = dir: fn: - attrValues (mapModules dir fn); - - mapModulesRec = dir: fn: - mapFilterAttrs - (n: v: - v != null && - !(hasPrefix "_" n)) - (n: v: - let path = "${toString dir}/${n}"; in - if v == "directory" - then nameValuePair n (mapModulesRec path fn) - else if v == "regular" && n != "default.nix" && hasSuffix ".nix" n - then nameValuePair (removeSuffix ".nix" n) (fn path) - else nameValuePair "" null) - (readDir dir); - - mapModulesRec' = dir: fn: - let - dirs = - mapAttrsToList - (k: _: "${dir}/${k}") - (filterAttrs - (n: v: v == "directory" && !(hasPrefix "_" n)) - (readDir dir)); - files = attrValues (mapModules dir id); - paths = files ++ concatLists (map (d: mapModulesRec' d id) dirs); - in map fn paths; -} diff --git a/lib/nixos.nix b/lib/nixos.nix deleted file mode 100644 index 4595af76..00000000 --- a/lib/nixos.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ inputs, lib, pkgs, ... }: - -with lib; -with lib.my; -let sys = "x86_64-linux"; -in { - mkHost = path: attrs @ { system ? sys, ... }: - nixosSystem { - inherit system; - specialArgs = { inherit lib inputs system; }; - modules = [ - { - nixpkgs.pkgs = pkgs; - networking.hostName = mkDefault (removeSuffix ".nix" (baseNameOf path)); - } - (filterAttrs (n: v: !elem n [ "system" ]) attrs) - ../. # /default.nix - (import path) - ]; - }; - - mapHosts = dir: attrs @ { system ? system, ... }: - mapModules dir - (hostPath: mkHost hostPath attrs); -} diff --git a/lib/options.nix b/lib/options.nix deleted file mode 100644 index 2b9c0810..00000000 --- a/lib/options.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ lib, ... }: - -let - inherit (lib) mkOption types; -in -rec { - mkOpt = type: default: - mkOption { inherit type default; }; - - mkOpt' = type: default: description: - mkOption { inherit type default description; }; - - mkBoolOpt = default: mkOption { - inherit default; - type = types.bool; - example = true; - }; -} diff --git a/mod-grasp.nix b/mod-grasp.nix new file mode 100644 index 00000000..4318650a --- /dev/null +++ b/mod-grasp.nix @@ -0,0 +1,12 @@ +{ config, lib, pkgs, ...}: + +{ + systemd.services.grasp = { + description = "grasp server"; + wantedBy = [ "default.target" ]; + + serviceConfig = { + ExecStart = "{$pkgs.grasp}/server/grasp_server.py --path /data/grasp/capture.org"; + }; + }; +} diff --git a/mod-wallabag.nix b/mod-wallabag.nix new file mode 100644 index 00000000..dda36c14 --- /dev/null +++ b/mod-wallabag.nix @@ -0,0 +1,220 @@ +{ config, options, lib, pkgs, ... }: + +with lib; +let + cfg = config.services.wallabag; + + poolName = "wallabag"; + + configFile = pkgs.writeTextFile { + name = "wallabag-config"; + text = cfg.conf; + destination = "/config/parameters.yml"; + }; + + appDir = pkgs.buildEnv { + name = "wallabag-app-dir"; + ignoreCollisions = true; + checkCollisionContents = false; + paths = [ configFile "${cfg.package}/app" ]; + }; + +in { + + options = { + + services.wallabag = { + enable = mkEnableOption "wallabag"; + + user = mkOption { + type = types.str; + default = "nginx"; + description = '' + User account under which both the update daemon and the web-application run. + ''; + }; + + dataDir = mkOption { + type = types.path; + default = "/var/lib/wallabag"; + description = '' + Data directory. + ''; + }; + + package = mkOption { + type = types.package; + default = pkgs.wallabag; + description = '' + Wallabag package to use. + ''; + }; + + hostName = mkOption { + type = types.str; + description = '' + Name of the nginx virtualhost to use and setup. + ''; + }; + + poolConfig = mkOption { + type = types.lines; + default = '' + pm = dynamic + pm.max_children = 75 + pm.start_servers = 1 + pm.min_spare_servers = 1 + pm.max_spare_servers = 20 + pm.max_requests = 500 + catch_workers_output = 1 + ''; + description = '' + Options for wallabag's PHP pool. See the documentation on php-fpm.conf for details on configuration directives. + ''; + }; + + conf = mkOption { + type = types.str; + description = '' + Contents of the wallabag configuration file (parameters.yml) + ''; + }; + }; + }; + + + config = mkIf cfg.enable { + + services.phpfpm.pools."${poolName}" = { + user = "${cfg.user}"; + group = "nginx"; + settings = { + "listen.owner" = "nginx"; + "listen.group" = "nginx"; + "listen.mode" = "0600"; + "user" = "${cfg.user}"; + "group" = "nginx"; + "env[WALLABAG_DATA]" = "${cfg.dataDir}"; + "pm" = "dynamic"; + "pm.max_children" = "75"; + "pm.min_spare_servers" = "5"; + "pm.max_spare_servers" = "20"; + "pm.max_requests" = "10"; + "catch_workers_output" = "1"; + "php_admin_value[error_log]" = "/var/log/nginx/${poolName}-phpfpm-error.log"; + }; + }; + services.phpfpm.phpOptions = '' + max_execution_time = 120 + ''; + + services.nginx.enable = mkDefault true; + + services.nginx.virtualHosts."${cfg.hostName}" = { + enableACME = false; + forceSSL = false; + root = "${cfg.package}/web"; + + extraConfig = '' + add_header X-Frame-Options SAMEORIGIN; + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + ''; + + locations."/" = { + extraConfig = '' + try_files $uri /app.php$is_args$args; + ''; + }; + + locations."/assets".root = "${cfg.dataDir}/web"; + + locations."~ ^/app\\.php(/|$)" = { + extraConfig = '' + fastcgi_pass unix:${config.services.phpfpm.pools."${poolName}".socket}; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + + fastcgi_param SCRIPT_FILENAME ${cfg.package}/web/$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT ${cfg.package}/web; + fastcgi_read_timeout 120; + + fastcgi_param QUERY_STRING $query_string; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SCRIPT_NAME $fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; + fastcgi_param REQUEST_URI $request_uri; + fastcgi_param DOCUMENT_URI $document_uri; + fastcgi_param SERVER_PROTOCOL $server_protocol; + + fastcgi_param GATEWAY_INTERFACE CGI/1.1; + fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + + fastcgi_param REMOTE_ADDR $remote_addr; + fastcgi_param REMOTE_PORT $remote_port; + fastcgi_param SERVER_ADDR $server_addr; + fastcgi_param SERVER_PORT $server_port; + fastcgi_param SERVER_NAME $server_name; + + internal; + ''; + }; + + locations."~ /(?!app)\\.php$" = { + extraConfig = '' + return 404; + ''; + }; + }; + + systemd.services.wallabag-install = { + description = "Wallabag install service"; + wantedBy = [ "multi-user.target" ]; + before = [ "phpfpm-wallabag.service" ]; + after = [ "mysql.service" "postgresql.service" ]; + path = with pkgs; [ coreutils php phpPackages.composer ]; + + serviceConfig = { + User = cfg.user; + Type = "oneshot"; + RemainAfterExit = "yes"; + PermissionsStartOnly = true; + }; + + preStart = '' + mkdir -p "${cfg.dataDir}" + chown ${cfg.user}:nginx "${cfg.dataDir}" + ''; + + script = '' + echo "Setting up wallabag files in ${cfg.dataDir} ..." + cd "${cfg.dataDir}" + + rm -rf var/cache/* + rm -f app + ln -sf ${appDir} app + ln -sf ${cfg.package}/composer.{json,lock} . + + export WALLABAG_DATA="${cfg.dataDir}" + if [ ! -f installed ]; then + php ${cfg.package}/bin/console --env=prod doctrine:database:create --if-not-exists --no-interaction + php ${cfg.package}/bin/console --env=prod doctrine:migrations:migrate --no-interaction + # Until https://github.com/wallabag/wallabag/issues/3662 is fixed + # yes no | php ${cfg.package}/bin/console --env=prod wallabag:install + touch installed + else + php ${cfg.package}/bin/console --env=prod doctrine:migrations:migrate --no-interaction + fi + php ${cfg.package}/bin/console --env=prod cache:clear + ''; + }; + }; + + meta = with stdenv.lib; { + maintainers = with maintainers; [ nadrieril ]; + }; +} diff --git a/module-gonic.nix b/module-gonic.nix new file mode 100644 index 00000000..f3a32fca --- /dev/null +++ b/module-gonic.nix @@ -0,0 +1,109 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.gonic; + configFile = "/etc/gonic/config"; + dataFolder = "/var/lib/gonic"; +in { + options = { + + services.gonic = { + enable = mkEnableOption "Gonic music server and streamer"; + + settings = lib.mkOption { + type = types.str; + default = {}; + example = literalExample '' + music-path + podcast-path + cache-path + ''; + description = '' + Configuration for Gonic, see for supported values. + ''; + }; + + user = mkOption { + type = types.str; + default = "gonic"; + description = "User account under which gonic runs."; + }; + + group = mkOption { + type = types.str; + default = "gonic"; + description = "Group account under which gonic runs."; + }; + + }; + }; + + config = mkIf cfg.enable { + + environment.etc."gonic/config".text = cfg.settings; + + systemd.services.gonic = { + description = "gonic Music Server and Streamer compatible with Subsonic/Airsonic"; + after = [ "remote-fs.target" "network.target" ]; + wantedBy = [ "multi-user.target" ]; + environment = { + #GONIC_MUSIC_PATH + #GONIC_PODCAST_PATH + #GONIC_CACHE_PATH + #GONIC_DB_PATH + GONIC_SCAN_INTERVAL="800"; + #... + }; + serviceConfig = { + ExecStart = "${pkgs.gonic}/bin/gonic -config-path /etc/gonic/config"; + WorkingDirectory = dataFolder; + TimeoutStopSec = "20"; + KillMode = "process"; + Restart = "on-failure"; + RestartSec = "10"; + User = cfg.user; + Group = cfg.group; + DevicePolicy = "closed"; + NoNewPrivileges= " yes"; + PrivateTmp = "yes"; + PrivateUsers = "yes"; + ProtectControlGroups = "yes"; + ProtectKernelModules = "yes"; + ProtectKernelTunables = "yes"; + RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6"; + RestrictNamespaces = "yes"; + RestrictRealtime = "yes"; + SystemCallFilter = "~@clock @debug @module @mount @obsolete @privileged @reboot @setuid @swap"; + ReadWritePaths = dataFolder; + StateDirectory = baseNameOf dataFolder; + }; + }; + + users.users = optionalAttrs (cfg.user == "gonic") ({ + gonic = { + description = "gonic service user"; + name = cfg.user; + group = cfg.group; + isSystemUser = true; + }; + }); + + users.groups = optionalAttrs (cfg.group == "gonic") ({ + gonic = {}; + }); + + services.nginx.virtualHosts."music.mossnet.lan" = { + enableACME = false; + forceSSL = false; + + locations."/" = { + extraConfig = '' + proxy_pass http://localhost:4747/; + proxy_set_header X-Forwarded-Host $host; + ''; + }; + }; + }; +} diff --git a/modules/agenix.nix b/modules/agenix.nix deleted file mode 100644 index f82e8e97..00000000 --- a/modules/agenix.nix +++ /dev/null @@ -1,29 +0,0 @@ -# modules/agenix.nix -- encrypt secrets in nix store - -{ options, config, inputs, lib, pkgs, ... }: - -with builtins; -with lib; -with lib.my; -let inherit (inputs) agenix; - secretsDir = "${toString ../hosts}/${config.networking.hostName}/secrets"; - secretsFile = "${secretsDir}/secrets.nix"; -in { - imports = [ agenix.nixosModules.age ]; - environment.systemPackages = [ agenix.defaultPackage.x86_64-linux ]; - - age = { - secrets = - if pathExists secretsFile - then mapAttrs' (n: _: nameValuePair (removeSuffix ".age" n) { - file = "${secretsDir}/${n}"; - owner = mkDefault config.user.name; - }) (import secretsFile) - else {}; - sshKeyPaths = - options.age.sshKeyPaths.default ++ (filter pathExists [ - "${config.user.home}/.ssh/id_ed25519" - "${config.user.home}/.ssh/id_rsa" - ]); - }; -} diff --git a/modules/desktop/apps/discord.nix b/modules/desktop/apps/discord.nix deleted file mode 100644 index e1dddf05..00000000 --- a/modules/desktop/apps/discord.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.apps.discord; -in { - options.modules.desktop.apps.discord = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - # If not installed from the bleeding edge, Discord will sometimes - # soft-lock itself on a "there's an update for discord" screen. - unstable.discord - ]; - }; -} diff --git a/modules/desktop/apps/godot.nix b/modules/desktop/apps/godot.nix deleted file mode 100644 index 102cf139..00000000 --- a/modules/desktop/apps/godot.nix +++ /dev/null @@ -1,21 +0,0 @@ -# modules/dev/godot.nix --- https://godotengine.org/ -# -# Gamedev is my hobby. C++ or Rust are my main drivers (and occasionally Lua), -# but to prototype (for 3D, mainly) I'll occasionally reach for godot. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.apps.godot; -in { - options.modules.desktop.apps.godot = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - godot - ]; - }; -} diff --git a/modules/desktop/apps/rofi.nix b/modules/desktop/apps/rofi.nix deleted file mode 100644 index 4b1f4916..00000000 --- a/modules/desktop/apps/rofi.nix +++ /dev/null @@ -1,58 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.apps.rofi; -in { - options.modules.desktop.apps.rofi = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - # link recursively so other modules can link files in its folder - # home.xdg.configFile."rofi" = { - # source = ; - # recursive = true; - # }; - - user.packages = with pkgs; [ - (writeScriptBin "rofi" '' - #!${stdenv.shell} - exec ${pkgs.rofi}/bin/rofi -terminal xst -m -1 "$@" - '') - - # Fake rofi dmenu entries - (makeDesktopItem { - name = "rofi-browsermenu"; - desktopName = "Open Bookmark in Browser"; - icon = "bookmark-new-symbolic"; - exec = "${config.dotfiles.binDir}/rofi/browsermenu"; - }) - (makeDesktopItem { - name = "rofi-browsermenu-history"; - desktopName = "Open Browser History"; - icon = "accessories-clock"; - exec = "${config.dotfiles.binDir}/rofi/browsermenu history"; - }) - (makeDesktopItem { - name = "rofi-filemenu"; - desktopName = "Open Directory in Terminal"; - icon = "folder"; - exec = "${config.dotfiles.binDir}/rofi/filemenu"; - }) - (makeDesktopItem { - name = "rofi-filemenu-scratch"; - desktopName = "Open Directory in Scratch Terminal"; - icon = "folder"; - exec = "${config.dotfiles.binDir}/rofi/filemenu -x"; - }) - - (makeDesktopItem { - name = "lock-display"; - desktopName = "Lock screen"; - icon = "system-lock-screen"; - exec = "${config.dotfiles.binDir}/zzz"; - }) - ]; - }; -} diff --git a/modules/desktop/apps/signal.nix b/modules/desktop/apps/signal.nix deleted file mode 100644 index 283928d0..00000000 --- a/modules/desktop/apps/signal.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.apps.signal; -in { - options.modules.desktop.apps.signal = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - # If not installed from the bleeding edge, signal will refuse to work. - unstable.signal-desktop - ]; - }; -} diff --git a/modules/desktop/apps/skype.nix b/modules/desktop/apps/skype.nix deleted file mode 100644 index f12fbbce..00000000 --- a/modules/desktop/apps/skype.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.apps.skype; -in { - options.modules.desktop.apps.skype = { - enable = mkEnableOption false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - skypeforlinux - skype_call_recorder - ]; - }; -} diff --git a/modules/desktop/apps/unity3d.nix b/modules/desktop/apps/unity3d.nix deleted file mode 100644 index afe1251f..00000000 --- a/modules/desktop/apps/unity3d.nix +++ /dev/null @@ -1,20 +0,0 @@ -# modules/dev/unity3d.nix --- https://unity.com -# -# I don't use Unity often, but when I do, it's in a team or with students. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.apps.unity3d; -in { - options.modules.desktop.apps.unity3d = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - unity3d - ]; - }; -} diff --git a/modules/desktop/awesomewm.nix b/modules/desktop/awesomewm.nix deleted file mode 100644 index f0600c6f..00000000 --- a/modules/desktop/awesomewm.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.awesomewm; - configDir = config.dotfiles.configDir; -in { - options.modules.desktop.awesomewm = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - nixpkgs.overlays = [ - (self: super: with super; { - awesome = super.awesome.override { luaPackages = super.luajitPackages; }; - }) - ]; - - environment.systemPackages = with pkgs; [ - luajit - my.fennel - ]; - - services = { - picom.enable = true; - redshift.enable = true; - xserver = { - enable = true; - displayManager = { - lightdm.enable = true; - # lightdm.greeters.mini.enable = true; - }; - windowManager.awesome.enable = true; - }; - }; - - home.configFile = { - "awesome" = { source = "${configDir}/awesome"; recursive = true; }; - "awesome/rc.lua".text = '' - -- File was auto-generated by nix. Do not touch! - - -- Load system fennel - package.path = package.path .. ";${pkgs.my.fennel}/?.lua" - local fennel = require("fennel") - debug.traceback = fennel.traceback - - -- Then load our awesomewm config - fennel.path = fennel.path .. ";.config/awesome/?.fnl" - table.insert(package.loaders or package.searchers, fennel.makeSearcher({ - correlate = true, - useMetadata = true - })) - require("init") - ''; - }; - }; -} diff --git a/modules/desktop/browsers/brave.nix b/modules/desktop/browsers/brave.nix deleted file mode 100644 index ab985404..00000000 --- a/modules/desktop/browsers/brave.nix +++ /dev/null @@ -1,28 +0,0 @@ -# modules/browser/brave.nix --- https://publishers.basicattentiontoken.org -# -# A FOSS and privacy-minded browser. - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.browsers.brave; -in { - options.modules.desktop.browsers.brave = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - brave - (makeDesktopItem { - name = "brave-private"; - desktopName = "Brave Web Browser"; - genericName = "Open a private Brave window"; - icon = "brave"; - exec = "${brave}/bin/brave --incognito"; - categories = "Network"; - }) - ]; - }; -} diff --git a/modules/desktop/browsers/default.nix b/modules/desktop/browsers/default.nix deleted file mode 100644 index 972985ed..00000000 --- a/modules/desktop/browsers/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.browsers; -in { - options.modules.desktop.browsers = { - default = mkOpt (with types; nullOr str) null; - }; - - config = mkIf (cfg.default != null) { - env.BROWSER = cfg.default; - }; -} diff --git a/modules/desktop/browsers/firefox.nix b/modules/desktop/browsers/firefox.nix deleted file mode 100644 index 3ebbed87..00000000 --- a/modules/desktop/browsers/firefox.nix +++ /dev/null @@ -1,161 +0,0 @@ -# modules/browser/firefox.nix --- https://www.mozilla.org/en-US/firefox -# -# Oh firefox, gateway to the interwebs, devourer of ram. Give onto me your -# infinite knowledge and shelter me from ads. - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.browsers.firefox; -in { - options.modules.desktop.browsers.firefox = with types; { - enable = mkBoolOpt false; - profileName = mkOpt types.str config.user.name; - - settings = mkOpt' (attrsOf (oneOf [ bool int str ])) {} '' - Firefox preferences to set in user.js - ''; - extraConfig = mkOpt' lines "" '' - Extra lines to add to user.js - ''; - - userChrome = mkOpt' lines "" "CSS Styles for Firefox's interface"; - userContent = mkOpt' lines "" "Global CSS Styles for websites"; - }; - - config = mkIf cfg.enable (mkMerge [ - { - user.packages = with pkgs; [ - firefox-bin - (makeDesktopItem { - name = "firefox-private"; - desktopName = "Firefox (Private)"; - genericName = "Open a private Firefox window"; - icon = "firefox"; - exec = "${firefox-bin}/bin/firefox --private-window"; - categories = "Network"; - }) - ]; - - # Prevent auto-creation of ~/Desktop. The trailing slash is necessary; see - # https://bugzilla.mozilla.org/show_bug.cgi?id=1082717 - env.XDG_DESKTOP_DIR = "$HOME/"; - - modules.desktop.browsers.firefox.settings = { - "devtools.theme" = "dark"; - # Enable userContent.css and userChrome.css for our theme modules - "toolkit.legacyUserProfileCustomizations.stylesheets" = true; - # Stop creating ~/Downloads! - "browser.download.dir" = "${config.user.home}/downloads"; - # Don't use the built-in password manager; a nixos user is more likely - # using an external one (you are using one, right?). - #"signon.rememberSignons" = false; - # Do not check if Firefox is the default browser - "browser.shell.checkDefaultBrowser" = false; - # Disable the "new tab page" feature and show a blank tab instead - # https://wiki.mozilla.org/Privacy/Reviews/New_Tab - # https://support.mozilla.org/en-US/kb/new-tab-page-show-hide-and-customize-top-sites#w_how-do-i-turn-the-new-tab-page-off - "browser.newtabpage.enabled" = false; - "browser.newtab.url" = "about:blank"; - # Disable Activity Stream - # https://wiki.mozilla.org/Firefox/Activity_Stream - "browser.newtabpage.activity-stream.enabled" = false; - # Disable new tab tile ads & preload - # http://www.thewindowsclub.com/disable-remove-ad-tiles-from-firefox - # http://forums.mozillazine.org/viewtopic.php?p=13876331#p13876331 - # https://wiki.mozilla.org/Tiles/Technical_Documentation#Ping - # https://gecko.readthedocs.org/en/latest/browser/browser/DirectoryLinksProvider.html#browser-newtabpage-directory-source - # https://gecko.readthedocs.org/en/latest/browser/browser/DirectoryLinksProvider.html#browser-newtabpage-directory-ping - "browser.newtabpage.enhanced" = false; - "browser.newtab.preload" = false; - "browser.newtabpage.directory.ping" = ""; - "browser.newtabpage.directory.source" = "data:text/plain,{}"; - # Disable some not so useful functionality. - "media.videocontrols.picture-in-picture.video-toggle.enabled" = false; - "extensions.htmlaboutaddons.recommendations.enabled" = false; - "extensions.htmlaboutaddons.discover.enabled" = false; - "extensions.pocket.enabled" = false; - "app.normandy.enabled" = false; - "app.normandy.api_url" = ""; - "extensions.shield-recipe-client.enabled" = false; - "app.shield.optoutstudies.enabled" = false; - # Disable battery API - # https://developer.mozilla.org/en-US/docs/Web/API/BatteryManager - # https://bugzilla.mozilla.org/show_bug.cgi?id=1313580 - "dom.battery.enabled" = false; - # Disable "beacon" asynchronous HTTP transfers (used for analytics) - # https://developer.mozilla.org/en-US/docs/Web/API/navigator.sendBeacon - "beacon.enabled" = false; - # Disable pinging URIs specified in HTML ping= attributes - # http://kb.mozillazine.org/Browser.send_pings - "browser.send_pings" = false; - # Disable gamepad API to prevent USB device enumeration - # https://www.w3.org/TR/gamepad/ - # https://trac.torproject.org/projects/tor/ticket/13023 - "dom.gamepad.enabled" = false; - # Don't try to guess domain names when entering an invalid domain name in URL bar - # http://www-archive.mozilla.org/docs/end-user/domain-guessing.html - "browser.fixup.alternate.enabled" = false; - # Disable telemetry - # https://wiki.mozilla.org/Platform/Features/Telemetry - # https://wiki.mozilla.org/Privacy/Reviews/Telemetry - # https://wiki.mozilla.org/Telemetry - # https://www.mozilla.org/en-US/legal/privacy/firefox.html#telemetry - # https://support.mozilla.org/t5/Firefox-crashes/Mozilla-Crash-Reporter/ta-p/1715 - # https://wiki.mozilla.org/Security/Reviews/Firefox6/ReviewNotes/telemetry - # https://gecko.readthedocs.io/en/latest/browser/experiments/experiments/manifest.html - # https://wiki.mozilla.org/Telemetry/Experiments - # https://support.mozilla.org/en-US/questions/1197144 - # https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/telemetry/internals/preferences.html#id1 - "toolkit.telemetry.enabled" = false; - "toolkit.telemetry.unified" = false; - "toolkit.telemetry.archive.enabled" = false; - "experiments.supported" = false; - "experiments.enabled" = false; - "experiments.manifest.uri" = ""; - # Disable health reports (basically more telemetry) - # https://support.mozilla.org/en-US/kb/firefox-health-report-understand-your-browser-perf - # https://gecko.readthedocs.org/en/latest/toolkit/components/telemetry/telemetry/preferences.html - "datareporting.healthreport.uploadEnabled" = false; - "datareporting.healthreport.service.enabled" = false; - "datareporting.policy.dataSubmissionEnabled" = false; - }; - - # Use a stable profile name so we can target it in themes - home.file = let cfgPath = ".mozilla/firefox"; in { - "${cfgPath}/profiles.ini".text = '' - [Profile0] - Name=default - IsRelative=1 - Path=${cfg.profileName}.default - Default=1 - - [General] - StartWithLastProfile=1 - Version=2 - ''; - - "${cfgPath}/${cfg.profileName}.default/user.js" = - mkIf (cfg.settings != {} || cfg.extraConfig != "") { - text = '' - ${concatStrings (mapAttrsToList (name: value: '' - user_pref("${name}", ${builtins.toJSON value}); - '') cfg.settings)} - ${cfg.extraConfig} - ''; - }; - - "${cfgPath}/${cfg.profileName}.default/chrome/userChrome.css" = - mkIf (cfg.userChrome != "") { - text = cfg.userChrome; - }; - - "${cfgPath}/${cfg.profileName}.default/chrome/userContent.css" = - mkIf (cfg.userContent != "") { - text = cfg.userContent; - }; - }; - } - ]); -} diff --git a/modules/desktop/browsers/qutebrowser.nix b/modules/desktop/browsers/qutebrowser.nix deleted file mode 100644 index 8421feea..00000000 --- a/modules/desktop/browsers/qutebrowser.nix +++ /dev/null @@ -1,56 +0,0 @@ -# modules/browser/qutebrowser.nix --- https://github.com/qutebrowser/qutebrowser -# -# Qutebrowser is cute because it's not enough of a browser to be handsome. -# Still, we can all tell he'll grow up to be one hell of a lady-killer. - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.browsers.qutebrowser; - pkg = pkgs.unstable.qutebrowser; - configDir = config.dotfiles.configDir; -in { - options.modules.desktop.browsers.qutebrowser = with types; { - enable = mkBoolOpt false; - userStyles = mkOpt lines ""; - extraConfig = mkOpt lines ""; - dicts = mkOpt (listOf str) [ "en-US" ]; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - pkg - (makeDesktopItem { - name = "qutebrowser-private"; - desktopName = "Qutebrowser (Private)"; - genericName = "Open a private Qutebrowser window"; - icon = "qutebrowser"; - exec = ''${pkg}/bin/qutebrowser -T -s content.private_browsing true''; - categories = "Network"; - }) - # For Brave adblock in qutebrowser, which is significantly better than the - # built-in host blocking. Works on youtube and crunchyroll ads! - python39Packages.adblock - ]; - - home = { - configFile = { - "qutebrowser" = { - source = "${configDir}/qutebrowser"; - recursive = true; - }; - "qutebrowser/extra/00-extraConfig.py".text = cfg.extraConfig; - }; - dataFile."qutebrowser/userstyles.css".text = cfg.userStyles; - }; - - # Install language dictionaries for spellcheck backends - system.userActivationScripts.qutebrowserInstallDicts = - concatStringsSep "\\\n" (map (lang: '' - if ! find "$XDG_DATA_HOME/qutebrowser/qtwebengine_dictionaries" -type d -maxdepth 1 -name "${lang}*" 2>/dev/null | grep -q .; then - ${pkgs.python3}/bin/python ${pkg}/share/qutebrowser/scripts/dictcli.py install ${lang} - fi - '') cfg.dicts); - }; -} diff --git a/modules/desktop/bspwm.nix b/modules/desktop/bspwm.nix deleted file mode 100644 index 3c0c9c84..00000000 --- a/modules/desktop/bspwm.nix +++ /dev/null @@ -1,60 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.bspwm; - configDir = config.dotfiles.configDir; -in { - options.modules.desktop.bspwm = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - modules.theme.onReload.bspwm = '' - ${pkgs.bspwm}/bin/bspc wm -r - source $XDG_CONFIG_HOME/bspwm/bspwmrc - ''; - - environment.systemPackages = with pkgs; [ - lightdm - dunst - libnotify - (polybar.override { - pulseSupport = true; - nlSupport = true; - }) - ]; - - services = { - picom.enable = true; - redshift.enable = true; - xserver = { - enable = true; - displayManager = { - defaultSession = "none+bspwm"; - lightdm.enable = true; - lightdm.greeters.mini.enable = true; - }; - windowManager.bspwm.enable = true; - }; - }; - - systemd.user.services."dunst" = { - enable = true; - description = ""; - wantedBy = [ "default.target" ]; - serviceConfig.Restart = "always"; - serviceConfig.RestartSec = 2; - serviceConfig.ExecStart = "${pkgs.dunst}/bin/dunst"; - }; - - # link recursively so other modules can link files in their folders - home.configFile = { - "sxhkd".source = "${configDir}/sxhkd"; - "bspwm" = { - source = "${configDir}/bspwm"; - recursive = true; - }; - }; - }; -} diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix deleted file mode 100644 index 1a79188e..00000000 --- a/modules/desktop/default.nix +++ /dev/null @@ -1,123 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop; -in { - config = mkIf config.services.xserver.enable { - assertions = [ - { - assertion = (countAttrs (n: v: n == "enable" && value) cfg) < 2; - message = "Can't have more than one desktop environment enabled at a time"; - } - { - assertion = - let srv = config.services; - in srv.xserver.enable || - srv.sway.enable || - !(anyAttrs - (n: v: isAttrs v && - anyAttrs (n: v: isAttrs v && v.enable)) - cfg); - message = "Can't enable a desktop app without a desktop environment"; - } - ]; - - user.packages = with pkgs; [ - feh # image viewer - xclip - xdotool - xorg.xwininfo - libqalculate # calculator cli w/ currency conversion - (makeDesktopItem { - name = "scratch-calc"; - desktopName = "Calculator"; - icon = "calc"; - exec = ''scratch "${tmux}/bin/tmux new-session -s calc -n calc qalc"''; - categories = "Development"; - }) - ]; - - fonts = { - fontDir.enable = true; - enableGhostscriptFonts = true; - fonts = with pkgs; [ - ubuntu_font_family - dejavu_fonts - symbola - noto-fonts - noto-fonts-cjk - ]; - }; - - ## Apps/Services - services.xserver.displayManager.lightdm.greeters.mini.user = config.user.name; - - services.picom = { - backend = "glx"; - vSync = true; - opacityRules = [ - # "100:class_g = 'Firefox'" - # "100:class_g = 'Vivaldi-stable'" - "100:class_g = 'VirtualBox Machine'" - # Art/image programs where we need fidelity - "100:class_g = 'Gimp'" - "100:class_g = 'Inkscape'" - "100:class_g = 'aseprite'" - "100:class_g = 'krita'" - "100:class_g = 'feh'" - "100:class_g = 'mpv'" - "100:class_g = 'Rofi'" - "100:class_g = 'Peek'" - "99:_NET_WM_STATE@:32a = '_NET_WM_STATE_FULLSCREEN'" - ]; - shadowExclude = [ - # Put shadows on notifications, the scratch popup and rofi only - "! name~='(rofi|scratch|Dunst)$'" - ]; - settings = { - blur-background-exclude = [ - "window_type = 'dock'" - "window_type = 'desktop'" - "class_g = 'Rofi'" - "_GTK_FRAME_EXTENTS@:c" - ]; - - # Unredirect all windows if a full-screen opaque window is detected, to - # maximize performance for full-screen windows. Known to cause - # flickering when redirecting/unredirecting windows. - unredir-if-possible = true; - - # GLX backend: Avoid using stencil buffer, useful if you don't have a - # stencil buffer. Might cause incorrect opacity when rendering - # transparent content (but never practically happened) and may not work - # with blur-background. My tests show a 15% performance boost. - # Recommended. - glx-no-stencil = true; - - # Use X Sync fence to sync clients' draw calls, to make sure all draw - # calls are finished before picom starts drawing. Needed on - # nvidia-drivers with GLX backend for some users. - xrender-sync-fence = true; - }; - }; - - # Try really hard to get QT to respect my GTK theme. - env.GTK_DATA_PREFIX = [ "${config.system.path}" ]; - env.QT_QPA_PLATFORMTHEME = "gtk2"; - qt5 = { style = "gtk2"; platformTheme = "gtk2"; }; - - services.xserver.displayManager.sessionCommands = '' - # GTK2_RC_FILES must be available to the display manager. - export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc" - ''; - - # Clean up leftovers, as much as we can - system.userActivationScripts.cleanupHome = '' - pushd "${config.user.home}" - rm -rf .compose-cache .nv .pki .dbus .fehbg - [ -s .xsession-errors ] || rm -f .xsession-errors* - popd - ''; - }; -} diff --git a/modules/desktop/gaming/emulators.nix b/modules/desktop/gaming/emulators.nix deleted file mode 100644 index cc1f7b91..00000000 --- a/modules/desktop/gaming/emulators.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.gaming.emulators; -in { - options.modules.desktop.gaming.emulators = { - psx.enable = mkBoolOpt false; # Playstation - ds.enable = mkBoolOpt false; # Nintendo DS - gb.enable = mkBoolOpt false; # GameBoy + GameBoy Color - gba.enable = mkBoolOpt false; # GameBoy Advance - snes.enable = mkBoolOpt false; # Super Nintendo - }; - - config = { - user.packages = with pkgs; [ - (mkIf cfg.psx.enable epsxe) - (mkIf cfg.ds.enable desmume) - (mkIf (cfg.gba.enable || - cfg.gb.enable || - cfg.snes.enable) - higan) - ]; - }; -} diff --git a/modules/desktop/gaming/steam.nix b/modules/desktop/gaming/steam.nix deleted file mode 100644 index 56cd1c35..00000000 --- a/modules/desktop/gaming/steam.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.gaming.steam; -in { - options.modules.desktop.gaming.steam = with types; { - enable = mkBoolOpt false; - hardware.enable = mkBoolOpt false; - libDir = mkOpt str "$XDG_DATA_HOME/steamlib"; - }; - - config = mkIf cfg.enable (mkMerge [ - { - # I avoid programs.steam.enable because it installs another steam binary, - # which the xdesktop package invokes, instead of my steam shims below. - hardware.opengl.enable = true; - hardware.opengl.driSupport32Bit = true; - hardware.pulseaudio.support32Bit = config.hardware.pulseaudio.enable; - - user.packages = with pkgs; [ - # Get steam to keep its garbage out of $HOME - (writeScriptBin "steam" '' - #!${stdenv.shell} - HOME="${cfg.libDir}" exec ${steam}/bin/steam "$@" - '') - # for running GOG and humble bundle games - (writeScriptBin "steam-run" '' - #!${stdenv.shell} - HOME="${cfg.libDir}" exec ${steam-run-native}/bin/steam-run "$@" - '') - # So a rofi entry exists - (makeDesktopItem { - name = "steam"; - desktopName = "Steam"; - icon = "steam"; - exec = "steam"; - terminal = "false"; - mimeType = "x-scheme-handler/steam"; - categories = "Network;FileTransfer;Game"; - }) - ]; - system.userActivationScripts.setupSteamDir = ''mkdir -p "${cfg.libDir}"''; - - # better for steam proton games - systemd.extraConfig = "DefaultLimitNOFILE=1048576"; - } - - (mkIf cfg.hardware.enable { - hardware.steam-hardware.enable = true; - }) - ]); -} diff --git a/modules/desktop/media/daw.nix b/modules/desktop/media/daw.nix deleted file mode 100644 index fa6cb2da..00000000 --- a/modules/desktop/media/daw.nix +++ /dev/null @@ -1,25 +0,0 @@ -# modules/desktop/media/daw.nix -# -# I make music for my games. LMMS is my DAW; or will be, once I've weened myself -# off of Fruityloops. When I'm in the mood for a quicky I fire up sunvox -# instead. It runs absolutely anywhere, even on my ipad and phone. As if I'd -# ever need to. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.daw; -in { - options.modules.desktop.media.daw = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - lmms # for making music - # sunvox # my favorite midi tracker - # audacity # for recording and remastering audio - ]; - }; -} diff --git a/modules/desktop/media/documents.nix b/modules/desktop/media/documents.nix deleted file mode 100644 index 4bc87e70..00000000 --- a/modules/desktop/media/documents.nix +++ /dev/null @@ -1,24 +0,0 @@ -# modules/desktop/media/docs.nix - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.documents; -in { - options.modules.desktop.media.documents = { - enable = mkBoolOpt false; - pdf.enable = mkBoolOpt false; - ebook.enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - (mkIf cfg.ebook.enable calibre) - (mkIf cfg.pdf.enable evince) - # zathura - ]; - - # TODO calibre/evince/zathura dotfiles - }; -} diff --git a/modules/desktop/media/graphics.nix b/modules/desktop/media/graphics.nix deleted file mode 100644 index 2b0f5387..00000000 --- a/modules/desktop/media/graphics.nix +++ /dev/null @@ -1,57 +0,0 @@ -# modules/desktop/media/graphics.nix -# -# The hardest part about switching to linux? Sacrificing Adobe. It really is -# difficult to replace and its open source alternatives don't *quite* cut it, -# but enough that I can do a fraction of it on Linux. For the rest I have a -# second computer dedicated to design work (and gaming). - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.graphics; - configDir = config.dotfiles.configDir; -in { - options.modules.desktop.media.graphics = { - enable = mkBoolOpt false; - tools.enable = mkBoolOpt true; - raster.enable = mkBoolOpt true; - vector.enable = mkBoolOpt true; - sprites.enable = mkBoolOpt true; - models.enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; - (if cfg.tools.enable then [ - font-manager # so many damned fonts... - imagemagick # for image manipulation from the shell - ] else []) ++ - - # replaces illustrator & indesign - (if cfg.vector.enable then [ - unstable.inkscape - ] else []) ++ - - # Replaces photoshop - (if cfg.raster.enable then [ - krita - gimp - gimpPlugins.resynthesizer # content-aware scaling in gimp - ] else []) ++ - - # Sprite sheets & animation - (if cfg.sprites.enable then [ - aseprite-unfree - ] else []) ++ - - # 3D modelling - (if cfg.models.enable then [ - blender - ] else []); - - home.configFile = mkIf cfg.raster.enable { - "GIMP/2.10" = { source = "${configDir}/gimp"; recursive = true; }; - }; - }; -} diff --git a/modules/desktop/media/mpv.nix b/modules/desktop/media/mpv.nix deleted file mode 100644 index 96dcf5e3..00000000 --- a/modules/desktop/media/mpv.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.mpv; -in { - options.modules.desktop.media.mpv = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - mpv-with-scripts - mpvc # CLI controller for mpv - ]; - }; -} diff --git a/modules/desktop/media/ncmpcpp.nix b/modules/desktop/media/ncmpcpp.nix deleted file mode 100644 index 449f069d..00000000 --- a/modules/desktop/media/ncmpcpp.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.ncmpcpp; - configDir = config.dotfiles.configDir; -in { - options.modules.desktop.media.ncmpcpp = { - enable = mkBoolOpt false; - # modipy.enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - (ncmpcpp.override { visualizerSupport = true; }) - ]; - - env.NCMPCPP_HOME = "$XDG_CONFIG_HOME/ncmpcpp"; - - # Symlink these one at a time because ncmpcpp writes other files to - # ~/.config/ncmpcpp, so it needs to be writeable. - home.configFile = { - "ncmpcpp/config".source = "${configDir}/ncmpcpp/config"; - "ncmpcpp/bindings".source = "${configDir}/ncmpcpp/bindings"; - }; - }; -} diff --git a/modules/desktop/media/recording.nix b/modules/desktop/media/recording.nix deleted file mode 100644 index 2a141d26..00000000 --- a/modules/desktop/media/recording.nix +++ /dev/null @@ -1,26 +0,0 @@ -# modules/desktop/media/recording.nix -# -# OBS to capture footage/stream, audacity for audio, handbrake to encode it all. -# This, paired with DaVinci Resolve for video editing (on my Windows system) and -# I have what I need for youtube videos and streaming. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.recording; -in { - options.modules.desktop.media.recording = { - enable = mkBoolOpt false; - audio.enable = mkBoolOpt true; - video.enable = mkBoolOpt true; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; - # for recording and remastering audio - (if cfg.audio.enable then [ audacity ] else []) ++ - # for longer term streaming/recording the screen - (if cfg.video.enable then [ obs-studio handbrake ] else []); - }; -} diff --git a/modules/desktop/media/spotify.nix b/modules/desktop/media/spotify.nix deleted file mode 100644 index 3587cfa0..00000000 --- a/modules/desktop/media/spotify.nix +++ /dev/null @@ -1,100 +0,0 @@ -# I use spotify for my music needs. Gone are the days where I'd manage 200gb+ of -# local music; most of which I haven't heard or don't even like. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.media.spotify; -in { - options.modules.desktop.media.spotify = { - enable = mkBoolOpt false; - tui.enable = mkBoolOpt false; # TODO - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - # spotify-tui is fine for selecting and playing music, but incomplete. We - # still occasionally need the official client for more sophisticated - # search and the "made for you" playlists. - spotify - - # # services.spotifyd doesn't work so we'll have to roll our own spotifyd + - # # spotify-tui solution. The dbus interface doesn't work, though, so we - # # have to wait for spotify-tui to implement CLI command for controlling - # # spotify playback. See - # # https://github.com/Rigellute/spotify-tui/issues/147 or for spotifyd to - # # get fixed. - # master.spotifyd - # (writeScriptBin "spt" '' - # #!${stdenv.shell} - # if ! systemctl --user is-active spotifyd >/dev/null; then - # systemctl --user start spotifyd - # fi - # echo $TMUX >/tmp/spt.tmux - # exec ${master.spotify-tui}/bin/spt - # '') - - # # Since dbus doesn't work with Nix's spotifyd/spotify-tui, and I always - # # use tmux for my terminal, may as well exploit tmux to control spotify. - # playerctl - # (writeScriptBin "spt-send" '' - # #!${stdenv.shell} - # dbus_cmd='playerctl -p spotify' - # tmux_cmd="tmux send-keys -t $(cat /tmp/spt.tmux | cut -d, -f3)" - # case "$1" in - # toggle) $dbus_cmd play-pause 2>/dev/null || $tmux_cmd " " ;; - # next) $dbus_cmd next 2>/dev/null || $tmux_cmd n ;; - # prev) $dbus_cmd previous 2>/dev/null || $tmux_cmd p ;; - # esac - # '') - - # (writeScriptBin "spt-send-notify" '' - # #!${stdenv.shell} - # client_id=$(pass www/spotify.com | grep -E '^client_id:' | awk '{print $2}') - # client_secretd=$(pass www/spotify.com | grep -E '^client_secret:' | awk '{print $2}') - # jq="${pkgs.jq}/bin/jq" - - # token=$(curl -s -X 'POST' -u $client_id:$client_secretd -d grant_type=client_credentials https://accounts.spotify.com/api/token | $jq '.access_token' | cut -d\" -f2) - # result=$? - # if [[ $result != 0 ]]; then - # notify-send "spt-send failure" "Could not acquire token" - # exit 1 - # fi - # case "$PLAYER_EVENT" in - # start) - # curl -s -X 'GET' https://api.spotify.com/v1/tracks/$TRACK_ID -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization:\"Bearer $token\"" | $jq '.name, .artists[].name, .album.name, .album.release_date, .track_number, .album.total_tracks' | xargs printf "\"Playing '%s' from '%s' (album: '%s' in %s (%s/%s))\"" | xargs notify-send --urgency=low --expire-time=3000 --icon=/usr/share/icons/gnome/32x32/actions/player_play.png --app-name=spotifyd spotifyd - # ;; - # stop) - # curl -s -X 'GET' https://api.spotify.com/v1/tracks/$TRACK_ID -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization:\"Bearer $token\"" | $jq '.name, .artists[].name, .album.name, .album.release_date, .track_number, .album.total_tracks' | xargs printf "Stoping music (Last song: '%s' from '%s' (album: '%s' in %s (%s/%s)))\"" | xargs notify-send --urgency=low --expire-time=3000 --icon=/usr/share/icons/gnome/32x32/actions/player_stop.png --app-name=spotifyd spotifyd - # ;; - # change) - # curl -s -X 'GET' https://api.spotify.com/v1/tracks/$TRACK_ID -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization:\"Bearer $token\"" | $jq '.name, .artists[].name, .album.name, .album.release_date, .track_number, .album.total_tracks' | xargs printf "\"Music changed to '%s' from '%s' (album: '%s' in %s (%s/%s))\"" | xargs notify-send --urgency=low --expire-time=3000 --icon=/usr/share/icons/gnome/32x32/actions/player_fwd.png --app-name=spotifyd spotifyd - # ;; - # *) 2>&1 echo "Unkown event." - # exit 2 - # ;; - # esac - # '') - ]; - - # systemd.user.services.spotifyd.serviceConfig = - # let spotifydConf = pkgs.writeText "spotifyd.conf" '' - # [global] - # username = g2qwjcs6334oacg1zg9wrihnn - # password_cmd = ${pkgs.pass}/bin/pass www/spotify.com | head -n1 - # backend = pulseaudio - # on_song_change_hook = spt-send-notify - # cache_path = ${config.my.home}/.cache/spotifyd - # ''; - # in { - # ExecStart = '' - # ${pkgs.master.spotifyd}/bin/spotifyd --no-daemon \ - # --cache-path /tmp/spotifyd \ - # --config-path ${spotifydConf} - # ''; - # Restart = "always"; - # RestartSec = 6; - # }; - }; -} diff --git a/modules/desktop/stumpwm.nix b/modules/desktop/stumpwm.nix deleted file mode 100644 index 18bacfff..00000000 --- a/modules/desktop/stumpwm.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.stumpwm; - configDir = config.dotfiles.configDir; -in { - options.modules.desktop.stumpwm = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - lightdm - dunst - libnotify - ]; - - # master.services.picom.enable = true; - services = { - redshift.enable = true; - xserver = { - enable = true; - windowManager.default = "stumpwm"; - windowManager.stumpwm.enable = true; - displayManager.lightdm.enable = true; - displayManager.lightdm.greeters.mini.enable = true; - }; - }; - - # link recursively so other modules can link files in their folders - home.configFile."stumpwm" = { - source = "${configDir}/stumpwm"; - recursive = true; - }; - }; -} diff --git a/modules/desktop/term/default.nix b/modules/desktop/term/default.nix deleted file mode 100644 index 79528254..00000000 --- a/modules/desktop/term/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.term; -in { - options.modules.desktop.term = { - default = mkOpt types.str "xterm"; - }; - - config = { - services.xserver.desktopManager.xterm.enable = mkDefault (cfg.default == "xterm"); - - env.TERMINAL = cfg.default; - }; -} diff --git a/modules/desktop/term/st.nix b/modules/desktop/term/st.nix deleted file mode 100644 index f95e2e2a..00000000 --- a/modules/desktop/term/st.nix +++ /dev/null @@ -1,34 +0,0 @@ -# modules/desktop/term/st.nix -# -# I like (x)st. This appears to be a controversial opinion; don't tell anyone, -# mkay? - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.term.st; -in { - options.modules.desktop.term.st = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - # xst-256color isn't supported over ssh, so revert to a known one - modules.shell.zsh.rcInit = '' - [ "$TERM" = xst-256color ] && export TERM=xterm-256color - ''; - - user.packages = with pkgs; [ - xst # st + nice-to-have extensions - (makeDesktopItem { - name = "xst"; - desktopName = "Suckless Terminal"; - genericName = "Default terminal"; - icon = "utilities-terminal"; - exec = "${xst}/bin/xst"; - categories = "Development;System;Utility"; - }) - ]; - }; -} diff --git a/modules/desktop/vm/lxd.nix b/modules/desktop/vm/lxd.nix deleted file mode 100644 index 44b74d12..00000000 --- a/modules/desktop/vm/lxd.nix +++ /dev/null @@ -1,32 +0,0 @@ -# Inspired by https://www.srid.ca/2012301.html - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.vm.lxd; -in { - options.modules.desktop.vm.lxd = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - virtualisation.lxd.enable = true; - - user.packages = [ - (pkgs.writeScriptBin "lxc-build-nixos-image" '' - #!/usr/bin/env nix-shell - #!nix-shell -i bash -p nixos-generators - set -xe - config=$1 - metaimg=`nixos-generate -f lxc-metadata \ - | xargs -r cat \ - | awk '{print $3}'` - img=`nixos-generate -c $config -f lxc \ - | xargs -r cat \ - | awk '{print $3}'` - lxc image import --alias nixos $metaimg $img - '') - ]; - }; -} diff --git a/modules/desktop/vm/qemu.nix b/modules/desktop/vm/qemu.nix deleted file mode 100644 index 2dd8967a..00000000 --- a/modules/desktop/vm/qemu.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.vm.qemu; -in { - options.modules.desktop.vm.qemu = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - qemu - ]; - }; -} - -# Creating an image: -# qemu-img create -f qcow2 disk.img -# Creating a snapshot (don't tamper with disk.img): -# qemu-img create -f qcow2 -b disk.img snapshot.img diff --git a/modules/desktop/vm/virtualbox.nix b/modules/desktop/vm/virtualbox.nix deleted file mode 100644 index 018b314a..00000000 --- a/modules/desktop/vm/virtualbox.nix +++ /dev/null @@ -1,25 +0,0 @@ -# modules/desktop/vm/virtualbox.nix -# -# For testing or building software on other OSes. If I find out how to get macOS -# on qemu/libvirt I'd be happy to leave virtualbox behind. - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.desktop.vm.virtualbox; -in { - options.modules.desktop.vm.virtualbox = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - virtualisation.virtualbox.host = { - enable = true; - # urg, takes so long to build, but needed for macOS guest - # enableExtensionPack = true; - }; - - user.extraGroups = [ "vboxusers" ]; - }; -} diff --git a/modules/dev/cc.nix b/modules/dev/cc.nix deleted file mode 100644 index 61291196..00000000 --- a/modules/dev/cc.nix +++ /dev/null @@ -1,27 +0,0 @@ -# modules/dev/cc.nix --- C & C++ -# -# I love C. I tolerate C++. I adore C with a few choice C++ features tacked on. -# Liking C/C++ seems to be an unpopular opinion. It's my guilty secret, so don't -# tell anyone pls. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.cc; -in { - options.modules.dev.cc = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - clang - gcc - bear - gdb - cmake - llvmPackages.libcxx - ]; - }; -} diff --git a/modules/dev/clojure.nix b/modules/dev/clojure.nix deleted file mode 100644 index 23f267d5..00000000 --- a/modules/dev/clojure.nix +++ /dev/null @@ -1,22 +0,0 @@ -# modules/dev/clojure.nix --- https://clojure.org/ -# -# I don't use clojure. Perhaps one day... - -{ config, options, lib, pkgs, my, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.clojure; -in { - options.modules.dev.clojure = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - clojure - joker - leiningen - ]; - }; -} diff --git a/modules/dev/common-lisp.nix b/modules/dev/common-lisp.nix deleted file mode 100644 index 71fc25bd..00000000 --- a/modules/dev/common-lisp.nix +++ /dev/null @@ -1,21 +0,0 @@ -# modules/dev/common-lisp.nix --- https://common-lisp.net/ -# -# Mostly for my stumpwm config, and the occasional dip into lisp gamedev. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.common-lisp; -in { - options.modules.dev.common-lisp = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - sbcl - lispPackages.quicklisp - ]; - }; -} diff --git a/modules/dev/lua.nix b/modules/dev/lua.nix deleted file mode 100644 index d1fbd93e..00000000 --- a/modules/dev/lua.nix +++ /dev/null @@ -1,26 +0,0 @@ -# modules/dev/lua.nix --- https://www.lua.org/ -# -# I use lua for modding, awesomewm or Love2D for rapid gamedev prototyping (when -# godot is overkill and I have the luxury of avoiding JS). I write my Love games -# in moonscript to get around lua's idiosynchrosies. That said, I install love2d -# on a per-project basis. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.lua; -in { - options.modules.dev.lua = { - enable = mkBoolOpt false; - love2D.enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - lua - luaPackages.moonscript - (mkIf cfg.love2D.enable love2d) - ]; - }; -} diff --git a/modules/dev/node.nix b/modules/dev/node.nix deleted file mode 100644 index e366fa7e..00000000 --- a/modules/dev/node.nix +++ /dev/null @@ -1,47 +0,0 @@ -# modules/dev/node.nix --- https://nodejs.org/en/ -# -# JS is one of those "when it's good, it's alright, when it's bad, it's a -# disaster" languages. - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.node; - node = pkgs.nodejs_latest; -in { - options.modules.dev.node = { - enable = mkBoolOpt false; - enableGlobally = mkBoolOpt false; - }; - - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.enableGlobally { - user.packages = with pkgs; [ - node - yarn - ]; - - # Run locally installed bin-script, e.g. n coffee file.coffee - environment.shellAliases = { - n = "PATH=\"$(${node}/bin/npm bin):$PATH\""; - ya = "yarn"; - }; - - env.PATH = [ "$(${pkgs.yarn}/bin/yarn global bin)" ]; - }) - - { - env.NPM_CONFIG_USERCONFIG = "$XDG_CONFIG_HOME/npm/config"; - env.NPM_CONFIG_CACHE = "$XDG_CACHE_HOME/npm"; - env.NPM_CONFIG_TMP = "$XDG_RUNTIME_DIR/npm"; - env.NPM_CONFIG_PREFIX = "$XDG_CACHE_HOME/npm"; - env.NODE_REPL_HISTORY = "$XDG_CACHE_HOME/node/repl_history"; - - home.configFile."npm/config".text = '' - cache=$XDG_CACHE_HOME/npm - prefix=$XDG_DATA_HOME/npm - ''; - } - ]); -} diff --git a/modules/dev/python.nix b/modules/dev/python.nix deleted file mode 100644 index 721166eb..00000000 --- a/modules/dev/python.nix +++ /dev/null @@ -1,51 +0,0 @@ -# modules/dev/python.nix --- https://godotengine.org/ -# -# Python's ecosystem repulses me. The list of environment "managers" exhausts -# me. The Py2->3 transition make trainwrecks jealous. But SciPy, NumPy, iPython -# and Jupyter can have my babies. Every single one. - -{ config, options, lib, pkgs, my, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.python; -in { - options.modules.dev.python = { - enable = mkBoolOpt false; - enableGlobally = mkBoolOpt false; - }; - - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.enableGlobally { - user.packages = with pkgs; [ - python37 - python37Packages.pip - python37Packages.ipython - python37Packages.black - python37Packages.setuptools - python37Packages.pylint - python37Packages.poetry - ]; - - environment.shellAliases = { - py = "python"; - py2 = "python2"; - py3 = "python3"; - po = "poetry"; - ipy = "ipython --no-banner"; - ipylab = "ipython --pylab=qt5 --no-banner"; - }; - }) - - { - env.IPYTHONDIR = "$XDG_CONFIG_HOME/ipython"; - env.PIP_CONFIG_FILE = "$XDG_CONFIG_HOME/pip/pip.conf"; - env.PIP_LOG_FILE = "$XDG_DATA_HOME/pip/log"; - env.PYLINTHOME = "$XDG_DATA_HOME/pylint"; - env.PYLINTRC = "$XDG_CONFIG_HOME/pylint/pylintrc"; - env.PYTHONSTARTUP = "$XDG_CONFIG_HOME/python/pythonrc"; - env.PYTHON_EGG_CACHE = "$XDG_CACHE_HOME/python-eggs"; - env.JUPYTER_CONFIG_DIR = "$XDG_CONFIG_HOME/jupyter"; - } - ]); -} diff --git a/modules/dev/rust.nix b/modules/dev/rust.nix deleted file mode 100644 index b009911e..00000000 --- a/modules/dev/rust.nix +++ /dev/null @@ -1,40 +0,0 @@ -# modules/dev/rust.nix --- https://rust-lang.org -# -# Oh Rust. The light of my life, fire of my loins. Years of C++ has conditioned -# me to believe there was no hope left, but the gods have heard us. Sure, you're -# not going to replace C/C++. Sure, your starlight popularity has been -# overblown. Sure, macros aren't namespaced, cargo bypasses crates.io, and there -# is no formal proof of your claims for safety, but who said you have to solve -# all the world's problems to be wonderful? - -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.rust; -in { - options.modules.dev.rust = { - enable = mkBoolOpt false; - enableGlobally = mkBoolOpt false; - }; - - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.enableGlobally { - user.packages = [ pkgs.rustup ]; - - env.PATH = [ "$(${pkgs.yarn}/bin/yarn global bin)" ]; - }) - - { - env.RUSTUP_HOME = "$XDG_DATA_HOME/rustup"; - env.CARGO_HOME = "$XDG_DATA_HOME/cargo"; - env.PATH = [ "$CARGO_HOME/bin" ]; - - environment.shellAliases = { - rs = "rustc"; - rsp = "rustup"; - ca = "cargo"; - }; - } - ]); -} diff --git a/modules/dev/scala.nix b/modules/dev/scala.nix deleted file mode 100644 index 90106062..00000000 --- a/modules/dev/scala.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, options, lib, pkgs, my, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.scala; -in { - options.modules.dev.scala = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - scala - jdk - sbt - ]; - }; -} diff --git a/modules/dev/shell.nix b/modules/dev/shell.nix deleted file mode 100644 index 4e4e539f..00000000 --- a/modules/dev/shell.nix +++ /dev/null @@ -1,23 +0,0 @@ -# modules/dev/shell.nix --- http://zsh.sourceforge.net/ -# -# Shell script programmers are strange beasts. Writing programs in a language -# that wasn't intended as a programming language. Alas, it is not for us mere -# mortals to question the will of the ancient ones. If they want shell programs, -# they get shell programs. - -{ config, options, lib, pkgs, my, ... }: - -with lib; -with lib.my; -let cfg = config.modules.dev.shell; -in { - options.modules.dev.shell = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - shellcheck - ]; - }; -} diff --git a/modules/editors/default.nix b/modules/editors/default.nix deleted file mode 100644 index 590df572..00000000 --- a/modules/editors/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.editors; -in { - options.modules.editors = { - default = mkOpt types.str "vim"; - }; - - config = mkIf (cfg.default != null) { - env.EDITOR = cfg.default; - }; -} diff --git a/modules/editors/emacs.nix b/modules/editors/emacs.nix deleted file mode 100644 index d824a7cc..00000000 --- a/modules/editors/emacs.nix +++ /dev/null @@ -1,87 +0,0 @@ -# Emacs is my main driver. I'm the author of Doom Emacs -# https://github.com/hlissner/doom-emacs. This module sets it up to meet my -# particular Doomy needs. - -{ config, lib, pkgs, inputs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.editors.emacs; - configDir = config.dotfiles.configDir; -in { - options.modules.editors.emacs = { - enable = mkBoolOpt false; - doom = { - enable = mkBoolOpt true; - fromSSH = mkBoolOpt false; - }; - }; - - config = mkIf cfg.enable { - nixpkgs.overlays = [ inputs.emacs-overlay.overlay ]; - - user.packages = with pkgs; [ - ## Emacs itself - binutils # native-comp needs 'as', provided by this - # emacsPgtkGcc # 28 + pgtk + native-comp - ((emacsPackagesNgGen emacsPgtkGcc).emacsWithPackages (epkgs: [ - epkgs.vterm - ])) - - ## Doom dependencies - git - (ripgrep.override {withPCRE2 = true;}) - gnutls # for TLS connectivity - - ## Optional dependencies - fd # faster projectile indexing - imagemagick # for image-dired - (mkIf (config.programs.gnupg.agent.enable) - pinentry_emacs) # in-emacs gnupg prompts - zstd # for undo-fu-session/undo-tree compression - - ## Module dependencies - # :checkers spell - (aspellWithDicts (ds: with ds; [ - en en-computers en-science - ])) - # :checkers grammar - languagetool - # :tools editorconfig - editorconfig-core-c # per-project style config - # :tools lookup & :lang org +roam - sqlite - # :lang cc - ccls - # :lang javascript - nodePackages.javascript-typescript-langserver - # :lang latex & :lang org (latex previews) - texlive.combined.scheme-medium - # :lang beancount - beancount - unstable.fava # HACK Momentarily broken on nixos-unstable - # :lang rust - rustfmt - unstable.rust-analyzer - ]; - - env.PATH = [ "$XDG_CONFIG_HOME/emacs/bin" ]; - - modules.shell.zsh.rcFiles = [ "${configDir}/emacs/aliases.zsh" ]; - - fonts.fonts = [ pkgs.emacs-all-the-icons-fonts ]; - - # init.doomEmacs = mkIf cfg.doom.enable '' - # if [ -d $HOME/.config/emacs ]; then - # ${optionalString cfg.doom.fromSSH '' - # git clone git@github.com:hlissner/doom-emacs.git $HOME/.config/emacs - # git clone git@github.com:hlissner/doom-emacs-private.git $HOME/.config/doom - # ''} - # ${optionalString (cfg.doom.fromSSH == false) '' - # git clone https://github.com/hlissner/doom-emacs $HOME/.config/emacs - # git clone https://github.com/hlissner/doom-emacs-private $HOME/.config/doom - # ''} - # fi - # ''; - }; -} diff --git a/modules/editors/vim.nix b/modules/editors/vim.nix deleted file mode 100644 index e4d26962..00000000 --- a/modules/editors/vim.nix +++ /dev/null @@ -1,286 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.editors.vim; -in { - options.modules.editors.vim = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - editorconfig-core-c - unstable.neovim - ]; - - # options.users - home-manager.users.anish.programs.neovim = { - enable = true; - - # = TODO something like this n00b. - # builtins.concatStringsSep "\n" [ - # (lib.strings.fileContents ./base.vim) - # (lib.strings.fileContents ./plugins.vim) - # (lib.strings.fileContents ./lsp.vim) - - # # this allows you to add lua config files - # '' - # lua << EOF - # ${lib.strings.fileContents ./config.lua} - # ${lib.strings.fileContents ./lsp.lua} - # EOF - # '' - # ]; - - #home-manager.programs.nvim = { - # extraConfig = '' - # set tabstop=2 - # set showmatch - # set shiftwidth=2 - # set noexpandtab - # set autoindent - # - # set foldmethod=indent " fold based on indent - # set number - # set nocompatible - # set relativenumber - # set showtabline=2 - # set autowriteall - # syntax on - # set list lcs=tab:\|\ - # filetype plugin on - # - # set termguicolors - # let ayucolor="dark" - # colorscheme ayu - # - # " window - # nmap wh :topleft vnew - # nmap wl :botright vnew - # nmap wk :topleft new - # nmap wj :botright new - # - # let mapleader = "\" - # - # " lightline colorscheme - # let g:lightline = { - # \ 'colorscheme': 'seoul256', - # \ } - # - # " moving splits with vim movements. - # :tnoremap h - # :tnoremap j - # :tnoremap k - # :tnoremap l - # :inoremap h - # :inoremap j - # :inoremap k - # :inoremap l - # :nnoremap h - # :nnoremap j - # :nnoremap k - # :nnoremap l - # :nnoremap "=strftime("%Y-%m-%d %H:%M:") - # :inoremap =strftime("%Y-%m-%d %H:%M:") - # - # " exit normal mode in terminal - # :tnoremap - # - # let g:syntastic_always_populate_loc_list = 1 - # let g:syntastic_auto_loc_list = 1 - # let g:syntastic_check_on_open = 1 - # let g:syntastic_check_on_wq = 0 - # - # let g:rainbow_active = 0 - # autocmd BufReadPost,BufNewFile c,py,nix RainbowParenthesesToggleAll - # - # " keyboard commands - # map t :NERDTreeToggle - # map s :w - # map q :wq - # map r :RainbowParenthesesToggleAll - # map zs :ZettelSearch - # map zo :ZettelOpen - # map zn :ZettelNew - # - # - # " NERDTree - # " open on directory - # autocmd StdinReadPre * let s:std_in=1 - # - # " coc - # " - # " if hidden is not set, TextEdit might fail. - # set hidden - # - # " Some servers have issues with backup files, see #649 - # set nobackup - # set nowritebackup - # - # " Better display for messages - # set cmdheight=2 - # - # " You will have bad experience for diagnostic messages when it's default 4000. - # set updatetime=300 - # - # " don't give |ins-completion-menu| messages. - # set shortmess+=c - # - # " always show signcolumns - # set signcolumn=yes - # - # " Use tab for trigger completion with characters ahead and navigate. - # " Use command ':verbose imap ' to make sure tab is not mapped by other plugin. - # inoremap - # \ pumvisible() ? "\" : - # \ check_back_space() ? "\" : - # \ coc#refresh() - # inoremap pumvisible() ? "\" : "\" - # - # function! s:check_back_space() abort - # let col = col('.') - 1 - # return !col || getline('.')[col - 1] =~# '\s' - # endfunction - # - # " Use to trigger completion. - # inoremap coc#refresh() - # - # " Use to confirm completion, `u` means break undo chain at current position. - # " Coc only does snippet and additional edit on confirm. - # inoremap pumvisible() ? "\" : "\u\" - # " Or use `complete_info` if your vim support it, like: - # " inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" - # - # " Use `[g` and `]g` to navigate diagnostics - # nmap [g (coc-diagnostic-prev) - # nmap ]g (coc-diagnostic-next) - # - # " Remap keys for gotos - # nmap gd (coc-definition) - # nmap gy (coc-type-definition) - # nmap gi (coc-implementation) - # nmap gr (coc-references) - # - # " Use K to show documentation in preview window - # nnoremap K :call show_documentation() - # - # function! s:show_documentation() - # if (index(['vim','help'], &filetype) >= 0) - # execute 'h '.expand('') - # else - # call CocAction('doHover') - # endif - # endfunction - # - # " Highlight symbol under cursor on CursorHold - # autocmd CursorHold * silent call CocActionAsync('highlight') - # - # " Remap for rename current word - # nmap rn (coc-rename) - # - # " Remap for format selected region - # xmap f (coc-format-selected) - # nmap f (coc-format-selected) - # - # augroup mygroup - # autocmd! - # " Setup formatexpr specified filetype(s). - # autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') - # " Update signature help on jump placeholder - # autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') - # augroup end - # - # " Remap for do codeAction of selected region, ex: `aap` for current paragraph - # xmap a (coc-codeaction-selected) - # nmap a (coc-codeaction-selected) - # - # " Remap for do codeAction of current line - # nmap ac (coc-codeaction) - # " Fix autofix problem of current line - # nmap qf (coc-fix-current) - # - # " Create mappings for function text object, requires document symbols feature of languageserver. - # xmap if (coc-funcobj-i) - # xmap af (coc-funcobj-a) - # omap if (coc-funcobj-i) - # omap af (coc-funcobj-a) - # - # " Use for select selections ranges, needs server support, like: coc-tsserver, coc-python - # nmap (coc-range-select) - # xmap (coc-range-select) - # - # " Use `:Format` to format current buffer - # command! -nargs=0 Format :call CocAction('format') - # - # " Use `:Fold` to fold current buffer - # command! -nargs=? Fold :call CocAction('fold', ) - # - # " use `:OR` for organize import of current buffer - # command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') - # - # " Add status line support, for integration with other plugin, checkout `:h coc-status` - # " set statusline^=%{coc#status()}%{get(b:,'coc_current_function',"")} - # - # " Using CocList - # " Show all diagnostics - # nnoremap a :CocList diagnostics - # " Manage extensions - # nnoremap e :CocList extensions - # " Show commands - # nnoremap c :CocList commands - # " Find symbol of current document - # nnoremap o :CocList outline - # " Search workspace symbols - # nnoremap s :CocList -I symbols - # " Do default action for next item. - # nnoremap j :CocNext - # " Do default action for previous item. - # nnoremap k :CocPrev - # " Resume latest coc list - # nnoremap p :CocListResume - # - # au BufNewFile,BufRead *.frag,*.vert,*.fp,*.vp,*.glsl setf glsl - # ''; - - # extraPackages = with pkgs.vimPlugins; [ - # vim-nix - # fzf-vim - # vim-elixir - # emmet-vim - # nerdtree - # goyo-vim - # vim-sneak - # lightline-vim - # csv-vim - # vimwiki - # coc-nvim - # coc-json - # coc-python - # coc-pairs - # coc-emmet - # emmet-vim - # LanguageClient-neovim - # ayu-vim - # rainbow_parentheses-vim - # vim-surround - # vim-fugitive - # #iron-nvim - # #nvim-colorizer - # vim-devicons - # # testing - # #vim-processing - # #vim-tidal - # taskwiki - # #vim-zettel - # ]; - }; - - environment.shellAliases = { - vim = "nvim"; - v = "nvim"; - k = "vim -c :VimwikiIndex"; - kz = "vim -c :VimwikiIndex -c :ZettelNew"; - }; - }; -} diff --git a/modules/hardware/audio.nix b/modules/hardware/audio.nix deleted file mode 100644 index 9508b3d4..00000000 --- a/modules/hardware/audio.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.audio; -in { - options.modules.hardware.audio = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - sound.enable = true; - hardware.pulseaudio.enable = true; - - # HACK Prevents ~/.esd_auth files by disabling the esound protocol module - # for pulseaudio, which I likely don't need. Is there a better way? - hardware.pulseaudio.configFile = - let inherit (pkgs) runCommand pulseaudio; - paConfigFile = - runCommand "disablePulseaudioEsoundModule" - { buildInputs = [ pulseaudio ]; } '' - mkdir "$out" - cp ${pulseaudio}/etc/pulse/default.pa "$out/default.pa" - sed -i -e 's|load-module module-esound-protocol-unix|# ...|' "$out/default.pa" - ''; - in mkIf config.hardware.pulseaudio.enable - "${paConfigFile}/default.pa"; - - user.extraGroups = [ "audio" ]; - }; -} diff --git a/modules/hardware/bluetooth.nix b/modules/hardware/bluetooth.nix deleted file mode 100644 index 195f1237..00000000 --- a/modules/hardware/bluetooth.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let hwCfg = config.modules.hardware; - cfg = hwCfg.bluetooth; -in { - options.modules.hardware.bluetooth = { - enable = mkBoolOpt false; - audio.enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable (mkMerge [ - { hardware.bluetooth.enable = true; } - - (mkIf cfg.audio.enable { - hardware.pulseaudio = { - # NixOS allows either a lightweight build (default) or full build of - # PulseAudio to be installed. Only the full build has Bluetooth - # support, so it must be selected here. - package = pkgs.pulseaudioFull; - # Enable additional codecs - extraModules = [ pkgs.pulseaudio-modules-bt ]; - }; - - hardware.bluetooth.config = { - General.Enable = "Source,Sink,Media,Socket"; - }; - }) - ]); -} diff --git a/modules/hardware/ergodox.nix b/modules/hardware/ergodox.nix deleted file mode 100644 index 3353b17f..00000000 --- a/modules/hardware/ergodox.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.ergodox; -in { - options.modules.hardware.ergodox = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = [ pkgs.unstable.wally-cli ]; - - hardware.keyboard.zsa.enable = true; - - user.extraGroups = [ "plugdev" ]; - - services.xserver.xkbOptions = "compose:ralt"; - }; -} diff --git a/modules/hardware/fs.nix b/modules/hardware/fs.nix deleted file mode 100644 index 15476b3d..00000000 --- a/modules/hardware/fs.nix +++ /dev/null @@ -1,46 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.fs; -in { - options.modules.hardware.fs = { - enable = mkBoolOpt false; - zfs.enable = mkBoolOpt false; - ssd.enable = mkBoolOpt false; - # TODO automount.enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable (mkMerge [ - { - programs.udevil.enable = true; - - # Support for more filesystems, mostly to support external drives - environment.systemPackages = with pkgs; [ - sshfs - exfat # Windows drives - ntfs3g # Windows drives - hfsprogs # MacOS drives - ]; - } - - (mkIf (!cfg.zfs.enable && cfg.ssd.enable) { - services.fstrim.enable = true; - }) - - (mkIf cfg.zfs.enable (mkMerge [ - { - boot.loader.grub.copyKernels = true; - boot.supportedFilesystems = [ "zfs" ]; - boot.zfs.devNodes = "/dev/disk/by-partuuid"; - services.zfs.autoScrub.enable = true; - } - - (mkIf cfg.ssd.enable { - # Will only TRIM SSDs; skips over HDDs - services.fstrim.enable = false; - services.zfs.trim.enable = true; - }) - ])) - ]); -} diff --git a/modules/hardware/nvidia.nix b/modules/hardware/nvidia.nix deleted file mode 100644 index 4073118d..00000000 --- a/modules/hardware/nvidia.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.nvidia; -in { - options.modules.hardware.nvidia = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - hardware.opengl.enable = true; - - services.xserver.videoDrivers = [ "nvidia" ]; - - environment.systemPackages = with pkgs; [ - # Respect XDG conventions, damn it! - (writeScriptBin "nvidia-settings" '' - #!${stdenv.shell} - mkdir -p "$XDG_CONFIG_HOME/nvidia" - exec ${config.boot.kernelPackages.nvidia_x11.settings}/bin/nvidia-settings --config="$XDG_CONFIG_HOME/nvidia/settings" - '') - ]; - }; -} diff --git a/modules/hardware/razer.nix b/modules/hardware/razer.nix deleted file mode 100644 index 48e2a13f..00000000 --- a/modules/hardware/razer.nix +++ /dev/null @@ -1,22 +0,0 @@ -# modules/hardware/razer.nix --- support for razer devices - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.razer; -in { - options.modules.hardware.razer = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - hardware.openrazer.enable = true; - - user.extraGroups = [ "plugdev" ]; - - environment.systemPackages = with pkgs; [ - # TODO Install polychromatic - ]; - }; -} diff --git a/modules/hardware/sensors.nix b/modules/hardware/sensors.nix deleted file mode 100644 index 42739013..00000000 --- a/modules/hardware/sensors.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.sensors; -in { - options.modules.hardware.sensors = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = [ pkgs.lm_sensors ]; - }; -} diff --git a/modules/hardware/wacom.nix b/modules/hardware/wacom.nix deleted file mode 100644 index b93bccf6..00000000 --- a/modules/hardware/wacom.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.hardware.wacom; -in -{ - options.modules.hardware.wacom = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - # For my intuos4 pro. Doesn't work for cintiqs. - services.xserver.wacom.enable = true; - # TODO Move this to udev - system.userActivationScripts.wacom = '' - # lock tablet to main display - if xinput list --id-only "Wacom Intuos Pro S Pen stylus" 2>&1 >/dev/null; then - xinput map-to-output $(xinput list --id-only "Wacom Intuos Pro S Pen stylus") DVI-I-1 - xinput map-to-output $(xinput list --id-only "Wacom Intuos Pro S Pen eraser") DVI-I-1 - xinput map-to-output $(xinput list --id-only "Wacom Intuos Pro S Pen cursor") DVI-I-1 - fi - ''; - }; -} diff --git a/modules/options.nix b/modules/options.nix deleted file mode 100644 index 2a7fc8f3..00000000 --- a/modules/options.nix +++ /dev/null @@ -1,94 +0,0 @@ -{ config, options, lib, home-manager, ... }: - -with lib; -with lib.my; -{ - options = with types; { - user = mkOpt attrs {}; - - dotfiles = { - dir = mkOpt path - (findFirst pathExists (toString ../.) [ - "${config.user.home}/.config/dotfiles" - "/etc/dotfiles" - ]); - binDir = mkOpt path "${config.dotfiles.dir}/bin"; - configDir = mkOpt path "${config.dotfiles.dir}/config"; - modulesDir = mkOpt path "${config.dotfiles.dir}/modules"; - themesDir = mkOpt path "${config.dotfiles.modulesDir}/themes"; - }; - - home = { - file = mkOpt' attrs {} "Files to place directly in $HOME"; - configFile = mkOpt' attrs {} "Files to place in $XDG_CONFIG_HOME"; - dataFile = mkOpt' attrs {} "Files to place in $XDG_DATA_HOME"; - }; - - env = mkOption { - type = attrsOf (oneOf [ str path (listOf (either str path)) ]); - apply = mapAttrs - (n: v: if isList v - then concatMapStringsSep ":" (x: toString x) v - else (toString v)); - default = {}; - description = "TODO"; - }; - }; - - config = { - user = - let user = builtins.getEnv "USER"; - name = if elem user [ "" "root" ] then "anish" else user; - in { - inherit name; - description = "The primary user account"; - extraGroups = [ "wheel" ]; - isNormalUser = true; - home = "/home/${name}"; - group = "users"; - uid = 1000; - }; - - # Install user packages to /etc/profiles instead. Necessary for - # nixos-rebuild build-vm to work. - home-manager = { - useUserPackages = true; - - # I only need a subset of home-manager's capabilities. That is, access to - # its home.file, home.xdg.configFile and home.xdg.dataFile so I can deploy - # files easily to my $HOME, but 'home-manager.users.hlissner.home.file.*' - # is much too long and harder to maintain, so I've made aliases in: - # - # home.file -> home-manager.users.hlissner.home.file - # home.configFile -> home-manager.users.hlissner.home.xdg.configFile - # home.dataFile -> home-manager.users.hlissner.home.xdg.dataFile - users.${config.user.name} = { - home = { - file = mkAliasDefinitions options.home.file; - # Necessary for home-manager to work with flakes, otherwise it will - # look for a nixpkgs channel. - stateVersion = config.system.stateVersion; - }; - xdg = { - configFile = mkAliasDefinitions options.home.configFile; - dataFile = mkAliasDefinitions options.home.dataFile; - }; - }; - }; - - users.users.${config.user.name} = mkAliasDefinitions options.user; - - nix = let users = [ "root" config.user.name ]; in { - trustedUsers = users; - allowedUsers = users; - }; - - # must already begin with pre-existing PATH. Also, can't use binDir here, - # because it contains a nix store path. - env.PATH = [ "$DOTFILES_BIN" "$XDG_BIN_HOME" "$PATH" ]; - - environment.extraInit = - concatStringsSep "\n" - (mapAttrsToList (n: v: "export ${n}=\"${v}\"") config.env); - }; -} diff --git a/modules/security.nix b/modules/security.nix deleted file mode 100644 index 45ab953d..00000000 --- a/modules/security.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ config, lib, ... }: - -{ - ## System security tweaks - # sets hidepid=2 on /proc (make process info visible only to owning user) - # NOTE Was removed on nixpkgs-unstable because it doesn't do anything - # security.hideProcessInformation = true; - # Prevent replacing the running kernel w/o reboot - security.protectKernelImage = true; - - # tmpfs = /tmp is mounted in ram. Doing so makes temp file management speedy - # on ssd systems, and volatile! Because it's wiped on reboot. - boot.tmpOnTmpfs = lib.mkDefault true; - # If not using tmpfs, which is naturally purged on reboot, we must clean it - # /tmp ourselves. /tmp should be volatile storage! - boot.cleanTmpDir = lib.mkDefault (!config.boot.tmpOnTmpfs); - - # Fix a security hole in place for backwards compatibility. See desc in - # nixpkgs/nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix - boot.loader.systemd-boot.editor = false; - - boot.kernel.sysctl = { - # The Magic SysRq key is a key combo that allows users connected to the - # system console of a Linux kernel to perform some low-level commands. - # Disable it, since we don't need it, and is a potential security concern. - "kernel.sysrq" = 0; - - ## TCP hardening - # Prevent bogus ICMP errors from filling up logs. - "net.ipv4.icmp_ignore_bogus_error_responses" = 1; - # Reverse path filtering causes the kernel to do source validation of - # packets received from all interfaces. This can mitigate IP spoofing. - "net.ipv4.conf.default.rp_filter" = 1; - "net.ipv4.conf.all.rp_filter" = 1; - # Do not accept IP source route packets (we're not a router) - "net.ipv4.conf.all.accept_source_route" = 0; - "net.ipv6.conf.all.accept_source_route" = 0; - # Don't send ICMP redirects (again, we're on a router) - "net.ipv4.conf.all.send_redirects" = 0; - "net.ipv4.conf.default.send_redirects" = 0; - # Refuse ICMP redirects (MITM mitigations) - "net.ipv4.conf.all.accept_redirects" = 0; - "net.ipv4.conf.default.accept_redirects" = 0; - "net.ipv4.conf.all.secure_redirects" = 0; - "net.ipv4.conf.default.secure_redirects" = 0; - "net.ipv6.conf.all.accept_redirects" = 0; - "net.ipv6.conf.default.accept_redirects" = 0; - # Protects against SYN flood attacks - "net.ipv4.tcp_syncookies" = 1; - # Incomplete protection again TIME-WAIT assassination - "net.ipv4.tcp_rfc1337" = 1; - - ## TCP optimization - # TCP Fast Open is a TCP extension that reduces network latency by packing - # data in the sender’s initial TCP SYN. Setting 3 = enable TCP Fast Open for - # both incoming and outgoing connections: - "net.ipv4.tcp_fastopen" = 3; - # Bufferbloat mitigations + slight improvement in throughput & latency - "net.ipv4.tcp_congestion_control" = "bbr"; - "net.core.default_qdisc" = "cake"; - }; - boot.kernelModules = [ "tcp_bbr" ]; - - # Change me later! - user.initialPassword = "nixos"; - users.users.root.initialPassword = "nixos"; - - # So we don't have to do this later... - security.acme.acceptTerms = true; -} diff --git a/modules/services/calibre.nix b/modules/services/calibre.nix deleted file mode 100644 index 22c28347..00000000 --- a/modules/services/calibre.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.calibre; -in { - options.modules.services.calibre = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.calibre-server.enable = true; - - networking.firewall.allowedTCPPorts = [ 8080 ]; - }; -} diff --git a/modules/services/docker.nix b/modules/services/docker.nix deleted file mode 100644 index 1c037243..00000000 --- a/modules/services/docker.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.docker; - configDir = config.dotfiles.configDir; -in { - options.modules.services.docker = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - docker - docker-compose - ]; - - env.DOCKER_CONFIG = "$XDG_CONFIG_HOME/docker"; - env.MACHINE_STORAGE_PATH = "$XDG_DATA_HOME/docker/machine"; - - user.extraGroups = [ "docker" ]; - - modules.shell.zsh.rcFiles = [ "${configDir}/docker/aliases.zsh" ]; - - virtualisation = { - docker = { - enable = true; - autoPrune.enable = true; - enableOnBoot = false; - # listenOptions = []; - }; - }; - }; -} diff --git a/modules/services/fail2ban.nix b/modules/services/fail2ban.nix deleted file mode 100644 index bdc7b478..00000000 --- a/modules/services/fail2ban.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.fail2ban; -in { - options.modules.services.fail2ban = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.fail2ban = { - enable = true; - ignoreIP = [ "127.0.0.1/16" "192.168.1.0/24" ]; - banaction-allports = "iptables-allports"; - bantime-increment = { - enable = true; - maxtime = "168h"; - factor = "4"; - }; - jails.DEFAULT = '' - blocktype = DROP - bantime = 1h - findtime = 1h - ''; - }; - - # Extra filters - environment.etc = { - "fail2ban/filter.d/vaultwarden.conf".text = '' - [INCLUDES] - before = common.conf - - [Definition] - failregex = ^.*Username or password is incorrect\. Try again\. IP: \. Username:.*$ - ignoreregex = - journalmatch = _SYSTEMD_UNIT=vaultwarden.service - ''; - "fail2ban/filter.d/gitea.conf".text = '' - [Definition] - failregex = .*(Failed authentication attempt|invalid credentials|Attempted access of unknown user).* from - ignoreregex = - journalmatch = _SYSTEMD_UNIT=gitea.service - ''; - }; - }; -} diff --git a/modules/services/gitea.nix b/modules/services/gitea.nix deleted file mode 100644 index ea226bfd..00000000 --- a/modules/services/gitea.nix +++ /dev/null @@ -1,59 +0,0 @@ -# modules/services/gitea.nix -# -# Gitea is essentially a self-hosted github. This modules configures it with the -# expectation that it will be served over an SSL-secured reverse proxy (best -# paired with my modules.services.nginx module). -# -# Resources -# Config: https://docs.gitea.io/en-us/config-cheat-sheet/ -# API: https://docs.gitea.io/en-us/api-usage/ - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.gitea; -in { - options.modules.services.gitea = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - # Allows git@... clone addresses rather than gitea@... - users.users.git = { - useDefaultShell = true; - home = "/var/lib/gitea"; - group = "gitea"; - isSystemUser = true; - }; - - user.extraGroups = [ "gitea" ]; - - services.gitea = { - enable = true; - lfs.enable = true; - - user = "git"; - database.user = "git"; - - # We're assuming SSL-only connectivity - cookieSecure = true; - # Only log what's important, but Info is necessary for fail2ban to work - log.level = "Info"; - settings = { - server.DISABLE_ROUTER_LOG = true; - database.LOG_SQL = false; - service.ENABLE_BASIC_AUTHENTICATION = false; - }; - - dump.interval = "daily"; - }; - - services.fail2ban.jails.gitea = '' - enabled = true - filter = gitea - banaction = %(banaction_allports)s - maxretry = 5 - ''; - }; -} diff --git a/modules/services/jellyfin.nix b/modules/services/jellyfin.nix deleted file mode 100644 index ecb6914f..00000000 --- a/modules/services/jellyfin.nix +++ /dev/null @@ -1,23 +0,0 @@ -# Finally, a decent open alternative to Plex! - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.jellyfin; -in { - options.modules.services.jellyfin = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.jellyfin.enable = true; - - networking.firewall = { - allowedTCPPorts = [ 8096 ]; - allowedUDPPorts = [ 8096 ]; - }; - - user.extraGroups = [ "jellyfin" ]; - }; -} diff --git a/modules/services/nginx.nix b/modules/services/nginx.nix deleted file mode 100644 index ffb145e5..00000000 --- a/modules/services/nginx.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.nginx; -in { - options.modules.services.nginx = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - networking.firewall.allowedTCPPorts = [ 80 443 ]; - - user.extraGroups = [ "nginx" ]; - - services.nginx = { - enable = true; - - # Use recommended settings - recommendedGzipSettings = true; - recommendedOptimisation = true; - recommendedProxySettings = true; - recommendedTlsSettings = true; - - # Reduce the permitted size of client requests, to reduce the likelihood - # of buffer overflow attacks. This can be tweaked on a per-vhost basis, as - # needed. - clientMaxBodySize = "128k"; # default 10m - commonHttpConfig = '' - client_body_buffer_size 4k; # default: 8k - large_client_header_buffers 2 4k; # default: 4 8k - ''; - }; - }; -} - -# Helpful nginx snippets -# -# Set expires headers for static files and turn off logging. -# location ~* ^.+\.(js|css|swf|xml|txt|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|r ss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav |bmp|rtf)$ { -# access_log off; log_not_found off; expires 30d; -# } -# -# Deny all attempts to access PHP Files in the uploads directory -# location ~* /(?:uploads|files)/.*\.php$ { -# deny all; -# } diff --git a/modules/services/ssh.nix b/modules/services/ssh.nix deleted file mode 100644 index 331c8f84..00000000 --- a/modules/services/ssh.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ options, config, lib, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.ssh; -in { - options.modules.services.ssh = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.openssh = { - enable = true; - challengeResponseAuthentication = false; - passwordAuthentication = false; - }; - - user.openssh.authorizedKeys.keys = - if config.user.name == "hlissner" - then [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB71rSnjuC06Qq3NLXQJwSz7jazoB+umydddrxL6vg1a henrik@lissner.net" ] - else []; - }; -} diff --git a/modules/services/syncthing.nix b/modules/services/syncthing.nix deleted file mode 100644 index f21a6fd5..00000000 --- a/modules/services/syncthing.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ config, options, pkgs, lib, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.syncthing; -in { - options.modules.services.syncthing = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.syncthing = rec { - enable = true; - openDefaultPorts = true; - user = config.user.name; - configDir = "${config.user.home}/.config/syncthing"; - dataDir = "${config.user.home}/.local/share/syncthing"; - }; - }; -} diff --git a/modules/services/teamviewer.nix b/modules/services/teamviewer.nix deleted file mode 100644 index c26e7a49..00000000 --- a/modules/services/teamviewer.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.teamviewer; -in { - options.modules.services.teamviewer = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.teamviewer.enable = true; - }; -} diff --git a/modules/services/transmission.nix b/modules/services/transmission.nix deleted file mode 100644 index 203c43e5..00000000 --- a/modules/services/transmission.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ config, options, pkgs, lib, my, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.transmission; -in { - options.modules.services.transmission = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.transmission = { - enable = true; - home = "${config.user.home}/torrents"; - settings = { - incomplete-dir-enabled = true; - rpc-whitelist = "127.0.0.1,192.168.*.*"; - rpc-host-whitelist = "*"; - rpc-host-whitelist-enabled = true; - ratio-limit = 0; - ratio-limit-enabled = true; - }; - }; - - networking.firewall = { - allowedTCPPorts = [ 51413 ]; - allowedUDPPorts = [ 51413 ]; - }; - - user.extraGroups = [ "transmission" ]; - }; -} diff --git a/modules/services/vaultwarden.nix b/modules/services/vaultwarden.nix deleted file mode 100644 index d325d7c6..00000000 --- a/modules/services/vaultwarden.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.services.vaultwarden; -in { - options.modules.services.vaultwarden = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - services.vaultwarden.enable = true; - - user.extraGroups = [ "vaultwarden" ]; - - services.fail2ban.jails.vaultwarden = '' - enabled = true - filter = vaultwarden - port = 80,443,8002 - maxretry = 5 - ''; - }; -} diff --git a/modules/shell/adl.nix b/modules/shell/adl.nix deleted file mode 100644 index ddd97924..00000000 --- a/modules/shell/adl.nix +++ /dev/null @@ -1,27 +0,0 @@ -# modules/shell/adl.nix -# -# To maintain my filty weeb habits, I need tools. Tools that make it easy to -# watch animu and track 'em on anilist. Laziness > my weebery. - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.adl; -in { - options.modules.shell.adl = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - # Dependencies - my.trackma - my.anime-downloader - mpv - - # The star of the show - my.adl - ]; - }; -} diff --git a/modules/shell/direnv.nix b/modules/shell/direnv.nix deleted file mode 100644 index 60609c64..00000000 --- a/modules/shell/direnv.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.direnv; -in { - options.modules.shell.direnv = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = [ pkgs.direnv ]; - modules.shell.zsh.rcInit = ''eval "$(direnv hook zsh)"''; - }; -} diff --git a/modules/shell/git.nix b/modules/shell/git.nix deleted file mode 100644 index 6562c437..00000000 --- a/modules/shell/git.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.git; - configDir = config.dotfiles.configDir; -in { - options.modules.shell.git = { - enable = mkBoolOpt false; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - gitAndTools.gh - gitAndTools.git-open - gitAndTools.diff-so-fancy - (mkIf config.modules.shell.gnupg.enable - gitAndTools.git-crypt) - act - ]; - - home.configFile = { - "git/config".source = "${configDir}/git/config"; - "git/ignore".source = "${configDir}/git/ignore"; - "git/attributes".source = "${configDir}/git/attributes"; - }; - - modules.shell.zsh.rcFiles = [ "${configDir}/git/aliases.zsh" ]; - }; -} diff --git a/modules/shell/gnupg.nix b/modules/shell/gnupg.nix deleted file mode 100644 index 1eaf05ab..00000000 --- a/modules/shell/gnupg.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ config, options, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.gnupg; -in { - options.modules.shell.gnupg = with types; { - enable = mkBoolOpt false; - cacheTTL = mkOpt int 3600; # 1hr - }; - - config = mkIf cfg.enable { - environment.variables.GNUPGHOME = "$XDG_CONFIG_HOME/gnupg"; - - programs.gnupg.agent.enable = true; - - user.packages = [ pkgs.tomb ]; - - # HACK Without this config file you get "No pinentry program" on 20.03. - # programs.gnupg.agent.pinentryFlavor doesn't appear to work, and this - # is cleaner than overriding the systemd unit. - home.configFile."gnupg/gpg-agent.conf" = { - text = '' - default-cache-ttl ${toString cfg.cacheTTL} - pinentry-program ${pkgs.pinentry.gtk2}/bin/pinentry - ''; - }; - }; -} diff --git a/modules/shell/pass.nix b/modules/shell/pass.nix deleted file mode 100644 index 0b6a262a..00000000 --- a/modules/shell/pass.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ config, options, pkgs, lib, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.pass; -in { - options.modules.shell.pass = with types; { - enable = mkBoolOpt false; - passwordStoreDir = mkOpt str "$HOME/.secrets/password-store"; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - (pass.withExtensions (exts: [ - exts.pass-otp - exts.pass-genphrase - ] ++ (if config.modules.shell.gnupg.enable - then [ exts.pass-tomb ] - else []))) - ]; - env.PASSWORD_STORE_DIR = cfg.passwordStoreDir; - }; -} diff --git a/modules/shell/tmux.nix b/modules/shell/tmux.nix deleted file mode 100644 index b134bd50..00000000 --- a/modules/shell/tmux.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ config, options, pkgs, lib, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.tmux; - configDir = config.dotfiles.configDir; -in { - options.modules.shell.tmux = with types; { - enable = mkBoolOpt false; - rcFiles = mkOpt (listOf (either str path)) []; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ tmux ]; - - modules.theme.onReload.tmux = "${pkgs.tmux}/bin/tmux source-file $TMUX_HOME/extraInit"; - - modules.shell.zsh = { - rcInit = "_cache tmuxifier init -"; - rcFiles = [ "${configDir}/tmux/aliases.zsh" ]; - }; - - home.configFile = { - "tmux" = { source = "${configDir}/tmux"; recursive = true; }; - "tmux/extraInit".text = '' - # This file is auto-generated by nixos, don't edit by hand! - run-shell ${pkgs.tmuxPlugins.copycat}/share/tmux-plugins/copycat/copycat.tmux - run-shell ${pkgs.tmuxPlugins.prefix-highlight}/share/tmux-plugins/prefix-highlight/prefix_highlight.tmux - run-shell ${pkgs.tmuxPlugins.yank}/share/tmux-plugins/yank/yank.tmux - - ${concatMapStrings (path: "source '${path}'\n") cfg.rcFiles} - ''; - }; - - env = { - PATH = [ "$TMUXIFIER/bin" ]; - TMUX_HOME = "$XDG_CONFIG_HOME/tmux"; - TMUXIFIER = "$XDG_DATA_HOME/tmuxifier"; - TMUXIFIER_LAYOUT_PATH = "$XDG_DATA_HOME/tmuxifier"; - }; - }; -} diff --git a/modules/shell/vaultwarden.nix b/modules/shell/vaultwarden.nix deleted file mode 100644 index 7fbb14ca..00000000 --- a/modules/shell/vaultwarden.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ config, options, pkgs, lib, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.vaultwarden; -in { - options.modules.shell.vaultwarden = with types; { - enable = mkBoolOpt false; - config = mkOpt attrs {}; - }; - - config = mkIf cfg.enable { - user.packages = with pkgs; [ - bitwarden-cli - ]; - - modules.shell.zsh.rcInit = "_cache bw completion --shell zsh; compdef _bw bw;"; - - system.userActivationScripts = mkIf (cfg.config != {}) { - initVaultwarden = '' - ${concatStringsSep "\n" (mapAttrsToList (n: v: "bw config ${n} ${v}") cfg.config)} - ''; - }; - }; -} diff --git a/modules/shell/zsh.nix b/modules/shell/zsh.nix deleted file mode 100644 index edbf1cd5..00000000 --- a/modules/shell/zsh.nix +++ /dev/null @@ -1,84 +0,0 @@ -{ config, options, pkgs, lib, ... }: - -with lib; -with lib.my; -let cfg = config.modules.shell.zsh; - configDir = config.dotfiles.configDir; -in { - options.modules.shell.zsh = with types; { - enable = mkBoolOpt false; - - aliases = mkOpt (attrsOf (either str path)) {}; - - rcInit = mkOpt' lines "" '' - Zsh lines to be written to $XDG_CONFIG_HOME/zsh/extra.zshrc and sourced by - $XDG_CONFIG_HOME/zsh/.zshrc - ''; - envInit = mkOpt' lines "" '' - Zsh lines to be written to $XDG_CONFIG_HOME/zsh/extra.zshenv and sourced - by $XDG_CONFIG_HOME/zsh/.zshenv - ''; - - rcFiles = mkOpt (listOf (either str path)) []; - envFiles = mkOpt (listOf (either str path)) []; - }; - - config = mkIf cfg.enable { - users.defaultUserShell = pkgs.zsh; - - programs.zsh = { - enable = true; - enableCompletion = true; - # I init completion myself, because enableGlobalCompInit initializes it - # too soon, which means commands initialized later in my config won't get - # completion, and running compinit twice is slow. - enableGlobalCompInit = false; - promptInit = ""; - }; - - user.packages = with pkgs; [ - zsh - nix-zsh-completions - bat - exa - fasd - fd - fzf - tldr - ripgrep - ]; - - env = { - ZDOTDIR = "$XDG_CONFIG_HOME/zsh"; - ZSH_CACHE = "$XDG_CACHE_HOME/zsh"; - ZGEN_DIR = "$XDG_DATA_HOME/zsh"; - ZGEN_SOURCE = "$ZGEN_DIR/zgen.zsh"; - }; - - home.configFile = { - # Write it recursively so other modules can write files to it - "zsh" = { source = "${configDir}/zsh"; recursive = true; }; - - # Why am I creating extra.zsh{rc,env} when I could be using extraInit? - # Because extraInit generates those files in /etc/profile, and mine just - # write the files to ~/.config/zsh; where it's easier to edit and tweak - # them in case of issues or when experimenting. - "zsh/extra.zshrc".text = - let aliasLines = mapAttrsToList (n: v: "alias ${n}=\"${v}\"") cfg.aliases; - in '' - # This file was autogenerated, do not edit it! - ${concatStringsSep "\n" aliasLines} - ${concatMapStrings (path: "source '${path}'\n") cfg.rcFiles} - ${cfg.rcInit} - ''; - - "zsh/extra.zshenv".text = '' - # This file is autogenerated, do not edit it! - ${concatMapStrings (path: "source '${path}'\n") cfg.envFiles} - ${cfg.envInit} - ''; - }; - - system.userActivationScripts.cleanupZgen = "rm -fv $XDG_CACHE_HOME/zsh/*"; - }; -} diff --git a/modules/themes/alucard/README.org b/modules/themes/alucard/README.org deleted file mode 100644 index d6f512dd..00000000 --- a/modules/themes/alucard/README.org +++ /dev/null @@ -1,14 +0,0 @@ -#+TITLE: Alucard -#+AUTHOR: Henrik Lissner -#+DATE: October 1, 2019 - -A regal dracula-inspired theme for piles of miserable secrets. - -* Wallpaper -![Alucard wallpaper](config/wallpaper.jpg) - -* Screenshots -![My desktop, pretending to look busy, with gaps](/../screenshots/alucard/fakebusy.png?raw=true) -![My desktop, unfettered by windows](/../screenshots/alucard/desktop.png?raw=true) -![My app launcher, rofi](/../screenshots/alucard/rofi.png?raw=true) -![The gapless experience](/../screenshots/alucard/tiling.png?raw=true) diff --git a/modules/themes/alucard/config/Xresources b/modules/themes/alucard/config/Xresources deleted file mode 100644 index c0c48f61..00000000 --- a/modules/themes/alucard/config/Xresources +++ /dev/null @@ -1,80 +0,0 @@ -!! Colors -#define blk #1E2029 -#define bblk #282a36 -#define red #ffb86c -#define bred #de935f -#define grn #50fa7b -#define bgrn #0189cc -#define ylw #f0c674 -#define bylw #f9a03f -#define blu #61bfff -#define bblu #8be9fd -#define mag #bd93f9 -#define bmag #ff79c6 -#define cyn #8be9fd -#define bcyn #0189cc -#define wht #f8f8f2 -#define bwht #e2e2dc -#define bg blk -#define fg wht - -*.foreground: fg -*.background: bg -*.cursorColor: mag - -*.color0: blk -*.color8: bblk -*.color1: red -*.color9: bred -*.color2: grn -*.color10: bgrn -*.color3: ylw -*.color11: bylw -*.color4: blu -*.color12: bblu -*.color5: mag -*.color13: bmag -*.color6: cyn -*.color14: bcyn -*.color7: wht -*.color15: bwht - -! greys -*.color234: #1E2029 -*.color235: #282a36 -*.color236: #373844 -*.color237: #44475a -*.color239: #565761 -*.color240: #6272a4 -*.color241: #b6b6b2 - - -!! general -st.scratch.font: JetBrainsMono:pixelsize=16 - - -!! xst -st.font: JetBrainsMono:pixelsize=12 -st.borderpx: 10 - - -!! urxvt -URxvt*depth: 32 -URxvt*.background: blk -URxvt*.borderless: 1 -URxvt*.buffered: true -URxvt*.cursorBlink: true -URxvt*.font: xft:Fira Code:pixelsize=12 -URxvt*.internalBorder: 10 -URxvt*.letterSpace: 0 -URxvt*.lineSpace: 0 -URxvt*.loginShell: false -URxvt*.matcher.button: 1 -URxvt*.matcher.rend.0: Uline Bold fg5 -URxvt*.saveLines: 5000 -URxvt*.scrollBar: false -URxvt*.underlineColor: grey -URxvt.clipboard.autocopy: true -URxvt.iso14755: false -URxvt.iso14755_52: false -URxvt.perl-ext-common: default,matcher diff --git a/modules/themes/alucard/config/bspwmrc b/modules/themes/alucard/config/bspwmrc deleted file mode 100755 index df59d5c2..00000000 --- a/modules/themes/alucard/config/bspwmrc +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env sh - -bspc config borderless_monocle true -bspc config gapless_monocle true - -bspc config border_width 1 -bspc config window_gap 4 - -bspc config normal_border_color "#181a23" -bspc config active_border_color "#181a23" -bspc config focused_border_color "#bd93f9" -bspc config presel_feedback_color "#bd93f9" - -# Extra padding for polybar -bspc config -m primary top_padding 34 -bspc config -m primary bottom_padding 0 diff --git a/modules/themes/alucard/config/dunstrc b/modules/themes/alucard/config/dunstrc deleted file mode 100644 index 8fcfe622..00000000 --- a/modules/themes/alucard/config/dunstrc +++ /dev/null @@ -1,49 +0,0 @@ -[global] -alignment = left -bounce_freq = 0 -browser = firefox -new-tab -corner_radius = 2 -dmenu = rofi -dmenu -p dunst: -follow = none -font = Fira Sans 11 -format = "%s\n%b" -frame_color = "#1a1c25" -frame_width = 1 -# geometry [{width}]x{height}][+/-{x}+/-{y}] -geometry = "440x15-26+26" -history_length = 20 -horizontal_padding = 16 -icon_position = right -idle_threshold = 120 -ignore_newline = no -indicate_hidden = yes -line_height = 0 -markup = full -max_icon_size = 64 -monitor = 0 -padding = 20 -separator_color = auto -separator_height = 4 -show_age_threshold = 60 -show_indicators = yes -shrink = no -sort = yes -startup_notification = false -sticky_history = yes -transparency = 5 -word_wrap = yes - -[urgency_low] -background = "#1E2029" -foreground = "#bbc2cf" -timeout = 8 - -[urgency_normal] -background = "#2a2d39" -foreground = "#bbc2cf" -timeout = 14 - -[urgency_critical] -background = "#cc6666" -foreground = "#1E2029" -timeout = 0 diff --git a/modules/themes/alucard/config/firefox/userChrome.css b/modules/themes/alucard/config/firefox/userChrome.css deleted file mode 100644 index 35680185..00000000 --- a/modules/themes/alucard/config/firefox/userChrome.css +++ /dev/null @@ -1,275 +0,0 @@ -/* @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); */ - -@-moz-document url(chrome://browser/content/browser.xul), - url(chrome://browser/content/browser.xhtml) -{ - /*** TREE STYLE TABS ***/ - /* Hide main tabs toolbar */ - #TabsToolbar { - visibility: collapse !important; - } - /* Sidebar min and max width removal */ - :root { - /* expanded width of the sidebar. - used for userChrome-static, and hover */ - --sidebar-width: 250px; - /* initial width of the sidebar. - advised not to change since tst css relies on this value*/ - --sidebar-collapsed-width: 60px; - } - - #sidebar-box { - z-index: 1000 !important; - position: relative !important; - min-width: var(--sidebar-collapsed-width) !important; - max-width: var(--sidebar-collapsed-width) !important; - } - - #sidebar-header, - #sidebar-splitter { - display: none !important; - } - - /* inner width = expanded width & move inner to only show initial-width long section */ - #sidebar-box #sidebar { - position: absolute !important; - min-width: var(--sidebar-width) !important; - max-width: var(--sidebar-width) !important; - width: var(--sidebar-width) !important; - transform: translateX(calc(var(--sidebar-collapsed-width) - var(--sidebar-width))); - transition: all var(--transition-time) var(--ease-out); - } - - /* move inner to show entire sidebar */ - #sidebar-box #sidebar:hover { - transform: translateX(0) !important; - box-shadow: 2px 0 33px -3px var(--sidebar-shadow-color); - } - - #sidebar-box[sidebarcommand="viewBookmarksSidebar"] #sidebar { - transform: translateX(0) !important; - box-shadow: 2px 0 33px -3px var(--sidebar-shadow-color); - } - /* hide sidebar header for tree style tabs sidebar */ - #sidebar-box #sidebar-header { - display: none; - } - - #sidebar { - border-right: solid var(--dividers) var(--sidebar-shadow-color) !important; - } - - toolbar { - border: none !important; - } - - #tabbrowser-arrowscrollbox { - margin: 7px 14px 7px 14px; - } - - .tabbrowser-tab::after { - border: none !important; - } - - .tab-background .tab-line, - .tab-background .tab-bottom-line { - display: none; - } - - tab[selected="true"] > .tab-stack > .tab-background { - background: var(--tl-tab-background-gradient, var(--arrowpanel-dimmed-further)) !important; - } - - tab:not([selected="true"]) > .tab-stack:hover > .tab-background { - background: var(--arrowpanel-background) !important; - } - - .tab-stack { - border-radius: 7px; - margin-right: 5px; - overflow: hidden; - } - - .tab-stack .tab-icon-image, - .tab-stack .tab-label-container { - transform: translateX(0px); - transition: all var(--tl-animation-duration) var(--ease-out) !important; - } - - .tab-stack .tab-icon-image { - transition-duration: calc(var(--tl-animation-duration) * 2) !important; - } - - tab:not([pinned="true"]) .tab-stack:hover .tab-icon-image { - transform: translateX(-25px) !important; - } - - .tab-stack:hover .tab-label-container { - transform: translateX(-23px) !important; - } - - /* containers */ - tab:not([selected="true"]).identity-color-blue > .tab-stack, - tab:not([selected="true"]).identity-color-orange > .tab-stack, - tab:not([selected="true"]).identity-color-green > .tab-stack, - tab:not([selected="true"]).identity-color-pink > .tab-stack{ - border-radius: 0 0 7px 7px !important; - } - - tab[selected="true"].identity-color-blue > .tab-stack .tab-label-container, - tab[selected="true"].identity-color-orange > .tab-stack .tab-label-container, - tab[selected="true"].identity-color-green > .tab-stack .tab-label-container, - tab[selected="true"].identity-color-pink > .tab-stack .tab-label-container{ - color: #000 !important; - } - - /* blue */ - tab[selected="true"].identity-color-blue > .tab-stack > .tab-background{ - background: linear-gradient(to right, #3182CE , #0BC5EA) !important; - } - - tab:not([selected="true"]).identity-color-blue > .tab-stack > .tab-background{ - border-top: solid 4px #63B3ED !important; - } - - /* orange */ - tab[selected="true"].identity-color-orange > .tab-stack > .tab-background{ - background: linear-gradient(to right, #DD6B20 , #F56565) !important; - } - - tab:not([selected="true"]).identity-color-orange > .tab-stack > .tab-background{ - border-top: solid 4px #F6AD55 !important; - } - - /* green */ - tab[selected="true"].identity-color-green > .tab-stack > .tab-background{ - background: linear-gradient(to right, #38A169 , #38B2AC) !important; - } - - tab:not([selected="true"]).identity-color-green > .tab-stack > .tab-background{ - border-top: solid 4px #68D391 !important; - } - - /* pink */ - tab[selected="true"].identity-color-pink > .tab-stack > .tab-background{ - background: linear-gradient(to right, #D53F8C , #9F7AEA) !important; - } - - tab:not([selected="true"]).identity-color-pink > .tab-stack > .tab-background{ - border-top: solid 4px #F687B3 !important; - } - - - .tab-stack .tab-close-button { - border-radius: 50%; - margin-left: -20px !important; - background: var(--lwt-text-color); - fill: var(--lwt-accent-color) !important; - transform: translateX(30px) !important; - transition: all var(--tl-animation-duration) var(--ease-out) !important; - } - - .tab-stack:hover .tab-close-button { - transform: translateX(0px) !important; - } - -#tabbrowser-tabs[closebuttons="activetab"] > #tabbrowser-arrowscrollbox > -.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button:not([selected="true"]){ - display: block !important; -} - - /* hide tabs */ - .tabbrowser-tab { - display: none; - } - - #tabs-newtab-button { - display: none; - } - - .titlebar-spacer { - display: none !important; - } - - - /*** TAB BAR ***/ - /* Ensure tab doesn't show through auto-completion popup */ - .tabbrowser-tab { z-index: 0 !important; } - /* Ensure tab "spacers" don't show through the completion window */ - #tabbrowser-arrowscrollbox > spacer { z-index: -1 !important; } - #mainPopupSet { z-index: 9999 !important; } - - /* Hide tabbar if only one tab */ - @import url(./css/tabs-hide-if-only-one.css); - - - /* Remove the colored overline on the focused tab */ - .tabbrowser-tab .tab-line { background: none !important; } - - /* Replace favicon on tabs with close button on mouse hover */ - .tabbrowser-tab:not(:hover) .tab-close-button, - .tabbrowser-tab:not([pinned]):hover .tab-icon-image { display: none !important; } - .tabbrowser-tab:not([pinned]):hover .tab-close-button { display:block !important; } - - .tabbrowser-tab:hover .tab-throbber, - .tabbrowser-tab:hover .tab-icon-image, - .tabbrowser-tab:hover .tab-sharing-icon-overlay, - .tabbrowser-tab:hover .tab-icon-overlay, - .tabbrowser-tab:hover .tab-label-container, - .tabbrowser-tab:hover .tab-icon-sound { - -moz-box-ordinal-group: 2 !important; - } - - .tabbrowser-tab .tab-close-button { - margin-left: -2px !important; - margin-right: 4px !important; - } - - .tab-close-button:hover { - fill-opacity: 0 !important; - } - - .tabbrowser-tab::after, - .tabbrowser-tab::before { - border-left: none !important; - border-right: none !important; - } - - .scrollbutton-up[orient="horizontal"]~spacer { border-width: 0px; opacity: 0 } - - - /*** NAV BAR ***/ - /* Hide urlbar */ - #nav-bar { - position: relative !important; - z-index: 2 !important; - height: 2px !important; - min-height: 2px !important; - margin-bottom: -2px !important; - opacity: 0 !important; - border: none !important; - } - - /* But unfocus it when we invoke it with ctrl+L */ - #nav-bar:focus-within { - height: auto !important; - margin-bottom: 0px !important; - opacity: 1 !important; - overflow: show !important; - } - - #urlbar-container { - min-height: 0 !important; - } - - #urlbar { - top: 0 !important; - } - - #urlbar-input-container { - height: 28px !important; - } - - /*** Load local overrides ***/ - @import url(./userChrome.local.css); -} diff --git a/modules/themes/alucard/config/firefox/userstyles/stylus-2020-02-11.json b/modules/themes/alucard/config/firefox/userstyles/stylus-2020-02-11.json deleted file mode 100644 index b387e721..00000000 --- a/modules/themes/alucard/config/firefox/userstyles/stylus-2020-02-11.json +++ /dev/null @@ -1,272 +0,0 @@ -[ - { - "enabled": true, - "updateUrl": null, - "md5Url": null, - "url": null, - "originalMd5": null, - "installDate": 1562423881810, - "name": "Monospace textareas", - "sections": [ - { - "code": "textarea {\n font-family: monospace;\n}" - } - ], - "updateDate": 1562423881810, - "id": 3 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/119903.json", - "md5Url": "https://update.userstyles.org/119903.md5", - "url": "http://userstyles.org/styles/119903", - "originalMd5": "0b2b6adac6c0d80d1e0512d007323127", - "installDate": 1565469520822, - "sections": [ - { - "urls": [], - "urlPrefixes": [], - "domains": [ - "www.keyhero.com" - ], - "regexps": [], - "code": "body {\r\n background-color: #2C2C2C !important;\r\n color: #ccc;\r\n}\r\n.description-block {\r\n background-color: #2C2C2C !important;\r\n color: white !important;\r\n}\r\ntr.head td {\r\n background-color: #2C2C2C !important;\r\n color: white !important;\r\n}\r\ndiv.new-post a {\r\n background-color: #2C2C2C !important;\r\n color: white !important;\r\n}\r\n.quote-current {\r\n background: black;\r\n}\r\n.quote-left {\r\n color: black;\r\n}\r\n.navbar-default .navbar-collapse,\r\n.navbar-default .navbar-form {\r\n background: #202020 !important;\r\n}\r\n.navbar-default {\r\n background-color: #202020 !important;\r\n box-shadow: none !important;\r\n}\r\nh4,\r\n.h4 {\r\n color: #ccc !important;\r\n}\r\nspan {\r\n color: #A2A2A2 !important;\r\n}\r\n.dl-horizontal dd {\r\n background-color: #2c2c2c !important;\r\n}\r\n.dl-horizontal dt {\r\n color: #808080 !important;\r\n}\r\n.table-striped>tbody>tr:nth-child(odd)>td,\r\n.table-striped>tbody>tr:nth-child(odd)>th {\r\n background: #2c2c2c !important;\r\n}\r\n.row {\r\n background: #2c2c2c !important;\r\n}\r\nfooter {\r\n background: #2c2c2c !important;\r\n}\r\nh3,\r\n.h3 {\r\n color: #ccc !important;\r\n}\r\n.alert-info {\r\n background: #3c3c3c !important;\r\n}\r\n.form-control {\r\n background: #202020 !important;\r\n color: #ccc !important;\r\n border: none !important;\r\n}\r\n.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {\r\n background: #3c3c3c !important;\r\n}\r\ninput, button, select {\r\n background: #2c2c2c !important;\r\n}\r\ntextarea {\r\n\tbackground: #3c3c3c !important;\r\n}\r\n.panel-body {\r\n background: #3c3c3c !important;\r\n}\r\n.panel-default>.panel-heading {\r\n background: #3c3c3c !important;\r\n}\r\n.quote-bg-error {\r\n background: #4c4c4c !important;\r\n}\r\n.correction {\r\n background: #2c2c2c !important;\r\n}\r\n.label-awesome {\r\n background-color: #84840B !important;\r\n}\r\n#tooltip {\r\n background-color: #202020 !important;\r\n}\r\n.legendLabel {\r\n background: #202020 !important;\r\n color: #ccc !important;\r\n}\r\n.btn-success {\r\n background: #21692B !important;\r\n border-color: #21692B !important;\r\n}\r\n.btn-info {\r\n\tbackground: #772953 !important;\r\n}\r\n.well {\r\n \tbackground: #202020; \r\n}\r\n.navbar-default .navbar-nav>li>a {\r\n\tcolor: #ccc !important;\r\n}\r\n.media, .media-body {\r\n\tbackground: #262626 !important;\r\n\tborder-radius: 5px !important;\r\n}\r\n.table-striped>tbody>tr:nth-child(odd)>td, .table-striped>tbody>tr:nth-child(odd)>th {\r\n\tbackground: #3c3c3c !important;\r\n}\r\n.topic-message {\r\n\tborder: none !important;\r\n\tborder-radius: 5px !important;\r\n\tbackground: #202020 !important;\r\n}\r\n.pager li>a, .pager li>span {\r\n\tbackground: #202020 !important;\r\n\tborder: 1px solid #313131 !important;\r\n}\r\n.btn-link {\r\n\tbackground: #242424 !important;\r\n\tborder-radius: 5px;\r\n}\r\n.btn-primary {\r\n\tbackground: #dd4814 !important;\r\n}\r\n.comment-reply {\r\n\tbackground: #2c2c2c !important;\r\n\tborder-radius: 3px !important;\r\n}\r\n.btn-default {\r\n\tborder-color: #202020 !important;\r\n}\r\n.parent-message {\r\n\tbackground: #2c2c2c !important;\r\n}\r\n.alert-warning {\r\n\tbackground: #3c3c3c !important;\r\n\tborder-color: #a9a9a9 !important;\r\n}\r\n.label-great {\r\n background: #8E4D00;\r\n}\r\n\r\n/* vimmium styles */\r\ndiv.internalVimiumHintMarker {\r\n \tborder: black !important;\r\n\tbackground: rgb(78, 146, 255) !important;\r\n}\r\ndiv.internalVimiumHintMarker span {\r\n color: black !important;\r\n text-shadow: none !important;\r\n}\r\ndiv.internalVimiumHintMarker {\r\n\tcolor: red !important;\r\n}\r\ndiv.internalVimiumHintMarker > .matchingCharacter {\r\n\tcolor: white !important;\r\n}\r\n/* 14.11.2015 12:35 */" - } - ], - "name": "KeyHero: Dark Reign", - "originalDigest": "74af3625a2069f9717126deec918ef9d35e35d0a", - "id": 5 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/169544.json", - "md5Url": "https://update.userstyles.org/169544.md5", - "url": "http://userstyles.org/styles/169544", - "originalMd5": "98c3766882c44152c5b3afc51fc7327e", - "installDate": 1566107759034, - "sections": [ - { - "code": "body {\n background-color: #1E2029!important\n}\ndiv.grid_page,\ndiv[class*=\"side_bar\"],\ndiv[class*=\"sidebar\"],\ndiv[class*=\"Sidebar\"] {\n background-color: #1E2029!important\n}\ndiv.Toggle.ContentPageFeed.SimpleToggle {\n background-color: #1E2029!important\n}\n.SiteHeader {\n background-color: #282a36!important;\n border-bottom: 1px solid #373844!important\n}\nspan.expanded {\n color: gainsboro!important\n}\nspan.expanded:hover {\n color: #6272a4!important\n}\n.ui_qtext_rendered_qtext,\n.rendered_qtext {\n color: #b6b6c2!important\n}\ndiv.AmaSelfServeQuestionsPrompt {\n background-color: #1E2029!important\n}\n.selector_input.text {\n color: gainsboro!important\n}\ndiv[class*=\"story\"],\ndiv[class$=\"answer\"] {\n background-color: #282a36!important\n}\ndiv[id$=\"item\"] {\n background-color: #282a36!important\n}\n.container,\ndiv[class*=\"bundle\"] {\n background-color: #282a36!important\n}\n.comments_preview_toggle,\n.answer_auto_expanded_comments,\n.show_child_link {\n background-color: #282a36!important\n}\n.BetterUserHoverMenuContents,\n.BetterTopicHoverMenuContents.ObjectCard {\n background-color: #1E2029!important\n}\na.user,\n.NameCredential,\n.TopicName,\n.header_text_main,\n.user,\n.prompt_title,\ndiv[class^=\"answer\"] {\n color: lightgrey!important\n}\n.layout_1col_main_card,\n.layout_1col_secondary_card {\n background-color: #282a36!important\n}\n.grid_page h3 {\n color: #b6b6b2!important\n}\n.AboutListItem .main_text,\n.UserCredential {\n color: #b6b6b2!important\n}\n.icon_action_bar.sticky,\n.hover_menu_title {\n background-color: #282a36!important\n}\n.hover_menu_contents,\n.Notif {\n background-color: #1E2029!important;\n color: white!important\n}\n[class*=\"LookupBarResults\"] {\n background-color: #1E2029!important;\n color: #f8f8f2!important\n}", - "regexps": [ - "https?://(www|blog).quora.com.*" - ] - } - ], - "name": "Quora - Dark focused mode", - "originalDigest": "fabde60a33e2fc6a17c8c3f585c652854c631728", - "id": 6, - "updateDate": 1581131678066 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/124693.json", - "md5Url": "https://update.userstyles.org/124693.md5", - "url": "http://userstyles.org/styles/124693", - "originalMd5": "963068df63c3ae5642decc633d44f6d0", - "installDate": 1572046592546, - "sections": [ - { - "urls": [], - "urlPrefixes": [], - "domains": [ - "stackexchange.com", - "superuser.com", - "askubuntu.com" - ], - "regexps": [], - "code": "/* @-moz-document regexp(\"^https?://((chat|meta)\\.)?((tex|math|unix)\\.)?stackexchange\\.com.*\") { */\r\n /***************************************************************\r\n \r\n \r\n Worlbuilding Dark v0.9.1 (05/10/2014)\r\n\r\n - 0.9.1\r\n - fixed answered questions not showing up with a different color\r\n \r\n based on:\r\n \r\n StackOverflow Dark v2.5.7 (10/2/2014)\r\n https://github.com/StylishThemes/StackOverflow-Dark\r\n http://userstyles.org/styles/35345\r\n\r\n this is still quite crude\r\n \r\n the logo image is made by me ivycarp@gmail.com from a public domain\r\n image created by NASA that you can find on Wikipedia\r\n ****************************************************************/\r\n \r\n /***** Modifications by Abhishek Chakraborty *****/\r\n \r\n /*** codereview.stackexchange.com ***/\r\n #question-header {\r\n background-color: #232323;\r\n }\r\n \r\n #mainbar {\r\n background-color: transparent;\r\n }\r\n \r\n #sidebar .module:not(.community-bulletin) {\r\n background-color: transparent;\r\n }\r\n \r\n #sidebar .ad-container {\r\n background-color: #232323;\r\n }\r\n \r\n div.ad > a > img {\r\n filter: invert(100%);\r\n }\r\n \r\n #footer #footer-menu {\r\n background-color: transparent;\r\n }\r\n \r\n /*** askubuntu.com ***/\r\n \r\n #footer .footerwrap {\r\n background-color: transparent;\r\n }\r\n \r\n /***************************************************/\r\n \r\n\r\n * {\r\n border-color: #444 !important;\r\n text-shadow: none !important;\r\n box-shadow: none !important;\r\n }\r\n\r\n #content{\r\n background-color: rgba(255,255,255,0);\r\n }\r\n \r\n .mention{\r\n background-color: #666;\r\n color: #111;\r\n }\r\n .reviewed-action{\r\n background-color: #444 !important;\r\n color: #00aa00 !important;\r\n \r\n }\r\n span.comments{\r\n color: #aaa !important;\r\n }\r\n div.cp div{\r\n border: 0px !important;\r\n }\r\n .bottom-notice{\r\n background-color: #222;\r\n }\r\n #promo-box{\r\n background-color: #222;\r\n }\r\n table.history-table tbody tr span[style*=\"color:maroon;\"]{\r\n color: red !important;\r\n }\r\n div.question-summary.narrow:not(.tagget-interesting) div.cp div{\r\n background: none !important;\r\n }\r\n div.status.answered-accepted > *{\r\n color: #4C9067 !important;\r\n }\r\n div.status.answered-accepted{\r\n border: 1px solid #4C9067 !important;\r\n width: 46px !important;\r\n height: 36px !important;\r\n }\r\n\r\n body, .container, #footer {\r\n background-color: #191919 !important;\r\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkAgMAAAANjH3HAAAACVBMVEUaGhohISElJSUh9lebAAAB20lEQVRIx4XWuZXDMAwE0C0SAQtggIIYoAAEU+aKOHhYojTrYP2+QfOW/5QIJOih/q8HwF/pb3EX+UPIveYcQGgEHiu9hI+ihEc5Jz5KBIlRRRaJ1JtoSAl5Hw96hLB1/up1tnIXOck5jZQy+3iU2hAOKSH1JvwxHsp+5TLF5MOl1/MQXsVs1miXc+KDbYydyMeUgpPQreZ7fWidbNhkXNJSeAhc6qHmHD8AYovunYyEACWEbyIhNeB9fRrH3hFi0bGPLuEW7xCNaohw1vAlS805nfsrTspclB/hVdoqusg53eH7FWot+wjYpOViX8KbFFKTwlnzvj65P9H/vD0/hibYBGhPwlPO8TmxRsaxsNnrUmUXpNhirlJMPr6Hqq9k5Xn/8iYQHYIuQsWFC6Z87IOxLxHphSY4SpuiU87xJnJr5axfeRd+lnMExXpEWPpuZ1v7qZdNBOjiHzDREHX5fs5Zz9p6X0vVKbKKchlSl5rv+3p//FJ/PYvoKryI8vs+2G9lzRmnEKkh+BU8yDk515jDj/HAswu7CCz6U/Mxb/PnC9N41ndpU4hUU7JGk/C9PmP/M2xZYdvBW2PObyf1IUiIzoHmHW9yTncliYs9A9tVNppdShfgQaTLMf+j3X723tLeHgAAAABJRU5ErkJggg==) !important;\r\n background-clip: border-box !important;\r\n background-origin: padding-box !important;\r\n background-repeat: repeat !important;\r\nbackground-size: auto !important;\r\nbackground-position: left top !important;\r\n background-attachment: scroll !important;\r\n }\r\n\r\n /* === custom color === */\r\n a, .profile-popup a, .seWrapper a, .post-tag, .comments-link, .tag-synonym-link {\r\n color: #4183C4 !important\r\n }\r\n/*\r\n .nav .primarynav li a:hover {\r\n color: #fff !important;\r\n background: #4183C4 !important;\r\n }\r\n*/\r\n \r\n .post-tag:hover, .comments-link:hover, .summary .post-tag:hover , .commentslink, .bounty-indicator,\r\n .bounty-indicator-tab, .bounty-award {\r\n background-color: #4183C4 !important;\r\n color: #eee !important;\r\n }\r\n\r\n /* === text selection === */\r\n ::selection {\r\n background: #4183C4 !important;\r\n color: #fff !important;\r\n }\r\n ::-moz-selection {\r\n background: #4183C4 !important;\r\n color: #fff !important;\r\n }\r\n\r\n /* === input focus hightlight === */\r\n input:focus {\r\n border-color: #4183C4 !important;\r\n box-shadow: 0px 1px 2px rgba(255, 255, 255, 0.075) inset, 0px 0px 5px rgba(255, 255, 255, .075) !important;\r\n }\r\n .tag-editor input:focus {\r\n border: 0 !important;\r\n box-shadow: none !important;\r\n }\r\n\r\n /* === hidden === */\r\n div.hireme, div#hireme {\r\n display: none !important;\r\n }\r\n\r\n /* === background color === */\r\n /* from darkest to lightest grey */\r\n .search-container input[type=text] {\r\n background-color: #000 !important;\r\n }\r\n\r\n #custom-header, .review-bar, .diff-choices a.selected, #header #topbar, td.owner, a.owner, .question-status,\r\n .profile-popup, .profile-popup div, .profile-popup th, .profile-popup td, #global, .actual-edit-overlay,\r\n input:not([type='submit']), textarea, #search input, .tag-editor {\r\n background-color: #111 !important;\r\n color: #ddd !important;\r\n }\r\n\r\n .summary .post-tag, .onebox, .profile-ad {\r\n background: #151515 !important;\r\n }\r\n\r\n html, blockquote, #post-preview, .nav .primarynav li a, #container, #hsearch .textbox, .form-item, .grippie,\r\n .welovestackoverflow, #wmd-button-bar, .wmd-button-bar, .qa-block, .content-block, .user-info-rep, .sidebar,\r\n .popup {\r\n background: #191919 none !important\r\n }\r\n\r\n .authcomment, .seIntro, .seFooter {\r\n background-color: #191919 !important;\r\n border: 2px solid #262626 !important;\r\n }\r\n\r\n #tabs a {\r\n border: 1px solid transparent !important;\r\n }\r\n\r\n #tabs a.youarehere, .tag-suggestions {\r\n background: #191919 !important;\r\n border: 1px solid #444 !important;\r\n }\r\n \r\n .nav .youarehere{\r\n font-weight: bold !important;\r\n background: none !important;\r\n color: blue !important;\r\n }\r\n\r\n #user-about-me, .user-about-me, .mine .messages {\r\n background: #191919 !important;\r\n border: 0px !important;\r\n color: #C1BEBA !important;\r\n }\r\n\r\n .topbar-dialog .header, .topbar-dialog .modal-content li:hover, .share-tip,\r\n #tag-menu, .sidebar h3, #overlay-header, .action-list .action-selected, .switcher-nudge-lightbox,\r\n .user-rep-chart-summary-tooltip:hover, #footer {\r\n background-color: #222 !important;\r\n color: #ddd !important;\r\n }\r\n\r\n .profile-popup, .profile-popup tr, .profile-popup th, .profile-gravatar, .newuser, .roomcard,\r\n .seWrapper, h2.index.header, .privilege-table-row:hover {\r\n background-color: #222 !important;\r\n border-color: #555 !important;\r\n color: #ddd !important;\r\n }\r\n\r\n #header #topbar, .revision-comment, .date-span, .post-tag, .form-submit input, .preferred-login,\r\n .mdhelp, .wmd-help-button.active-help, .date_brick, .more-info {\r\n background: #222 !important;\r\n color: #ddd !important;\r\n -webkit-border-radius: 3px !important;\r\n border-radius: 3px !important;\r\n }\r\n\r\n .ad502-room, .messages, .messages,.topbar-dialog .unread-item {\r\n background-color: #232323 !important;\r\n border: 1px solid #191919 !important;\r\n }\r\n\r\n .rep-recent-row, .bounty, .diff-choices a:hover, div.meter, .narrow .votes, .stats, .ob-post-votes {\r\n background-color: #232323 !important;\r\n color: #bbb !important;\r\n }\r\n\r\n .answer, #system-message, .commentlist, .revision td, #hero-content, .mdhelp-tabs .selected, .tabs .selected {\r\n background: #232323 !important;\r\n color: #999 !important;\r\n }\r\n\r\n .tagged-interesting, .tagged-interesting .views, .highlight-row, .highlighted {\r\n background-color: #242424 !important;\r\n background-image: none !important;\r\n }\r\n\r\n /*.nav li,*/ .seNav, .topbar a.topbar-icon-on, .topbar a.topbar-icon-on:hover, .topbar-dialog, .owner,\r\n .module li.current, .seCurrent, .community-bulletin, .owner-revision td, .markdown-diff .skip,\r\n #footer .container, .current-site-container, .body-diffs .skip, .newsletter-anon, .tag-suggestions>div:hover {\r\n background-color: #333 !important;\r\n }\r\n\r\n .owner-answer, .question-status, #input-area, .notification, #feed-ticker, #top-menu, .vote-revision td {\r\n background: #404040 !important;\r\n }\r\n\r\n tr.comment:hover, .reply-parent, .timestamp, .usercard, .page-numbers.current,\r\n .comment-help, .answer-help-background, .mdhelp-tabs, .tabs li, .hi, .seNavLinks a:hover,\r\n .seNavLinks a:focus, .itemBoxNew {\r\n background-color: #444 !important;\r\n color: #ddd !important;\r\n }\r\n\r\n #post-text-container div span {\r\n background: #c1beba !important\r\n }\r\n\r\n /* === Brown(ish) === */\r\n .new-post-activity, #new-answer-activity {\r\n background-color: #840 !important;\r\n }\r\n\r\n /* chat room buttons */\r\n a.button {\r\n background: #840 !important;\r\n color: #eee !important;\r\n }\r\n\r\n .supernovabg, .hotbg, /*.nav .youarehere,*/ /*.nav li:hover,*/ a.button:hover {\r\n background-color: #d80 !important;\r\n }\r\n\r\n /* === Green === */\r\n .accepted-answer, .suggested-edit .inserted, .markdown-diff .inserted {\r\n background: #232 !important;\r\n }\r\n\r\n .answered, .answer-votes {\r\n background: #232323 !important;\r\n /*color: #4b553c !important*/\r\n color: #00aa00 !important\r\n }\r\n\r\n .answered-accepted, .answered-accepted strong, .rep-up.bounty-indicator-tab, .user-rep-chart-summary-bar {\r\n background: #4b553c !important;\r\n color: #fff !important;\r\n border: none !important;\r\n }\r\n\r\n .answered strong {\r\n color: #4b553c !important\r\n }\r\n\r\n /* === Red === */\r\n .deleted-answer, .suggested-edit .deleted, .markdown-diff .deleted {\r\n background-color: #200 !important;\r\n }\r\n\r\n a.moderator-tag {\r\n background-color: #400 !important;\r\n }\r\n\r\n a.moderator-tag:hover {\r\n background-color: #600 !important;\r\n }\r\n\r\n /* === Transparent background === */\r\n div.message .meta, .spaces, .comment, span.feed-icon, a.role-switch, .nav.careers li, .nav.careers li:hover,\r\n .switcher-nudge-content p {\r\n background-color: transparent !important;\r\n }\r\n\r\n #tabs a:hover {\r\n background-color: transparent !important;\r\n border: 1px solid #666666 !important;\r\n border-bottom: 1px solid #444 !important;\r\n }\r\n\r\n .highcharts-container rect[fill=\"#FFFFFF\"], rect[fill=\"rgb(255, 255, 255)\"] {\r\n fill: transparent !important;\r\n }\r\n\r\n /* === Dark border === */\r\n .body-diffs table * {\r\n border-color: #111 !important;\r\n }\r\n\r\n a.required-tag, .welovestackoverflow, .question-summary {\r\n border-color: #333 !important;\r\n }\r\n\r\n #tabs a.youarehere {\r\n border-bottom: 1px solid #191919 !important;\r\n }\r\n\r\n /* === No/hide border === */\r\n div.list > div {\r\n border-right: 0 !important;\r\n }\r\n\r\n .module {\r\n border-color: transparent !important;\r\n }\r\n\r\n /* blue label count */\r\n .bounty-indicator-tab {\r\n background: #07d !important;\r\n color: #ccc !important;\r\n }\r\n\r\n /* === Text Color === */\r\n div, input, .accepted-answer .post-text, .accepted-answer .user-action-time, #question-header a,\r\n .post-text, .user-info, .topbar-dialog .header h3, .topbar-dialog .header h3 a, .topbar-dialog span,\r\n .search-result .answered .vote-count-post strong, .votes-cast-stats th {\r\n color: #ddd !important;\r\n }\r\n\r\n /* placeholder */\r\n ::-webkit-input-placeholder {\r\n color: #ddd !important;\r\n }\r\n ::-moz-placeholder {\r\n color: #ddd !important;\r\n }\r\n\r\n .user-details td, .content-page, h2, h2 a, .profile-popup a:hover, .module h4, .page-description,\r\n #openid_identifier, .form-item label {\r\n color: #c1beba !important\r\n }\r\n\r\n .comment, #top-menu a, .subheader a, .reputation a, .reputation-score, a:visited, .relativetime.old,\r\n .votes-cast-stats td {\r\n color: #aaa !important;\r\n }\r\n\r\n .answered-accepted strong, .youarehere, .nav .primarynav li a, .nav a, a:hover, .rep-up.special-rep {\r\n color: #fff !important\r\n }\r\n\r\n input, .actual-edit-overlay {\r\n -webkit-text-fill-color: #fff !important;\r\n }\r\n\r\n .rep-up {\r\n /*color: #4b553c !important;*/\r\n color: #00dd00 !important;\r\n }\r\n .rep-down {\r\n color: #d65 !important;\r\n }\r\n\r\n /* dark blue */\r\n .result-highlight {\r\n color: #aa0 !important;\r\n }\r\n\r\n /* brown/dark orange */\r\n .warm {\r\n color: #840 !important;\r\n }\r\n\r\n /* orange */\r\n .hot {\r\n color: #a20 !important;\r\n }\r\n\r\n /* light brown */\r\n .unanswered {\r\n color: #9a4444 !important;\r\n }\r\n\r\n /* === Style adjustments === */\r\n a.question-hyperlink, a:hover, a:visited {\r\n text-decoration: underline !important;\r\n }\r\n\r\n .nav a, .post-tag, .comments-link, .tag-synonym-link, a.post-tag:hover, .topbar a {\r\n text-decoration: none !important;\r\n }\r\n\r\n .post-tag, .comments-link, .tag-synonym-link {\r\n margin: 2px !important;\r\n padding: 3px !important;\r\n font-size: 80% !important;\r\n line-height: 2.2 !important;\r\n white-space: nowrap !important\r\n }\r\n\r\n .stats {\r\n float: right !important;\r\n margin-top: 5px !important;\r\n }\r\n\r\n #hsearch, .statscontainer {\r\n margin-right: 5px !important;\r\n }\r\n\r\n .stats {\r\n margin-bottom: 4px !important;\r\n }\r\n\r\n .nav .primarynav li a {\r\n display: block !important;\r\n float: left !important\r\n }\r\n\r\n /* === badges === */\r\n a.badge[title^=\"bronze\"], a.badge-tag[title^=\"bronze\"], .badge3 + .badgecount {\r\n color: #cc9966 !important;\r\n }\r\n a.badge[title^=\"silver\"], a.badge-tag[title^=\"silver\"], .badge2 + .badgecount {\r\n color: #c5c5c5 !important;\r\n }\r\n a.badge[title^=\"gold\"], a.badge-tag[title^=\"gold\"], .badge1 + .badgecount {\r\n color: #ffcc46 !important;\r\n }\r\n .badge-tag {\r\n background-color: #191919 !important;\r\n border-color: #111 !important;\r\n }\r\n\r\n /* === code & syntax highlighting === */\r\n pre, code, .pln, .youarehere {\r\n background: #333 !important;\r\n color: #ccc !important;\r\n }\r\n\r\n .str { color: #0a0 !important; }\r\n .lit { color: #d65 !important; }\r\n .pun { color: #999 !important; } /* parenthesis */\r\n .kwd { color: #08f !important; } /* keyword */\r\n .tag { color: #999 !important; } /* html tag */\r\n .atn { color: #088 !important; } /* attribute */\r\n .atv { color: #0a0 !important; } /* attribute value*/\r\n .dec { color: #90a !important; } /* doc type */\r\n\r\n /* === Images === */\r\n .wmd-button>span {\r\n background-image: url(http://StylishThemes.github.io/StackOverflow-Dark/images/wmd-buttons.png) !important;\r\n }\r\n\r\n .statsarrow {\r\n width: 7px !important;\r\n height: 13px !important;\r\n background: url('data:image/gif;base64,R0lGODlhBwANAIAAACMjI////yH5BAEAAAEALAAAAAAHAA0AAAITRI5gGLrnXlzT1NsidEkx/zFHAQA7') 0 0 !important;\r\n }\r\n\r\n #hlogo img, .everyonelovesstackoverflow, #newsletter-ad { opacity: 0.3 !important; }\r\n\r\n /* chat domain logo */\r\n #header-logo a {\r\n display: block;\r\n width: 150px !important;\r\n height: 36px !important;\r\n background-size: cover !important;\r\n background-position: 0 -2px !important;\r\n }\r\n\r\n #header-logo img {\r\n display: none;\r\n }" - }, - { - "urls": [], - "urlPrefixes": [], - "domains": [], - "regexps": [ - "^https?://(chat.)?worldbuilding.stackexchange.com.*" - ], - "code": "#hlogo a {\r\n /* background-image: url(http://StylishThemes.github.io/StackOverflow-Dark/images/logo.png) !important; */\r\n /* background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAA9CAYAAACEAXQxAAAgAElEQVR4nMyd519U1xb3T6JXyI2JJorSq/Te29CbdJDee1GwxQoYbNgwCgYxiAVFUCzYiYgokaKoqInGaJJ7b+697/Vf+D0vzqw9+xxmAE3u8zwv9mdgGGbOOXO+e631W2uvLXxzYQO+ubABe8+twd5za9DQVYXaE4XY+F0uvvo2C199m4WV+9NR0ZCM8p1JKN+ZhLIdiahoSEZxfTzya2KQs2EpCuviUFgXh6Kv45C1NhI566OQsz4KGavDkb4qDJlrIrC2OQvxJQoklgUirkh8pJFQGoD4EgXiihRIrgxCcmUQUqtCkb4qDPElCizN9UVElhei830RW+iP9FVhSCoPQkJpAJLKgxCd74vofPE1EVleCEv3RFi6JwKTXBGY5ApFgjO8IuzgHWkPvxhHxJcoYONhAjsvM9h4mMDGwwRWrsawdDGCmb0+TO30YGytC2NrXRhaLGLDwFyHDX2zhdAzXYDFRl9isdGX0DGYj4X687BAdx6+XPw5vlj0Gb5Y9Bnm68zFF4s+g67xAszXmYv5OnMxb4FqfP7lp5i3YC7722KjL2HtZgIDcx0YWy2GqZ0eljgbwiXACg4+FnAPsYFvtAPC0j0RV6RAUnkQ0laGImN1OLLXRSJnw1J2/XPWRyF3YzSy1kYifVUYe13G6nCkVoUitSoUSeVBSCoPQlyRgo34EgViC/0RW+iPpbm+iMrxQVyR+Fx0vi8is73Zd5G5JgJpK0PZd5haFYq0leJIWRGC6HxfLM31RVyRgn12+qowxBb6IzDJFd6R9vCKsINXhB18ox3gFWEH9xAbOPpZSIaDjwVsPU1h62kKGw8T9mjjYQJrN9WwcjWGlasxljgbThoWjqph7mDAhpm9Pszs9fHzHxOS303t9CT3grG1LoytFk+6H/TNFkLfbCF0jcX7YZHhF1hk+IXkfuC/+7nzP8Hc+Z/g088/wd8/08Ync7UkY4723zB7ziw2Zs2ehY9nfYyPPv4IwkfCjMbsObNUv7de24aWK/Vo7q3Fvp612HtuDbadLsfmo/moaS/AprY8bGrLw9pmEfjqxjSs3J+OlfvTUbUvFcX18SjdloiyHYko3ZaIkq0JKKyLQ0FtLArr4tjNlrkmgt0QqVWhSK4MYjde5poIZK+LRNbaSHYTpK8KQ876KHxzYQO7aQh++h8aNKHQjcVPIHFFCkTn+yI8wwuhaR4ITfPA0lxfKBKc4R1pD7dga7gEWMHRzwKxhf54/d/n7EYws9eHiY34JRtZqodd13gB+1IXGX4hgf2LRZ9JgDcw15kEOk0COgbzoWMwH7rGC2BosQjGVoth7mAAK1dj2HmZwVlhCe9Ie4SleyI635fBTedfUBuL3I3RyNscza5/QW2sCP2GpchaG8lgJ9jomqVWifAvWx6Mjv79iCnwQ3yJasKliYCuZ9rKUORujEbOhqVIWRGC/JoYpFaForAuDiVbE5C9LhKJZYGIzvdlr6fviMAPSnaDIs4ZfjGO8Iqwg1+MIzxCbeEeYgPXICs4+S+Bk/8SOPhYwN7bnAE+E9B54DXBLgechoWjIYPbxEaPff8EuJm9vuT71zNdwCb7mcBNYBPc2p/OgdYnc/A3rdn4m9ZsCdjvA/W04+jNXfju+k60XtuG1mvbcODiRuzrWYvd3avQ0FWFHZ3Lse10ObadLkftiUJsaM3FprY8bGjNxbqWbKzcn44Ve1NQvjMJX32bhYqGZFQ0JKNkawIqGpJRtS9V4gkU18ejZGsCiuvj2SRRvjMJlbuWscniq2+zmNdAf1uxNwUr9qZgQ2suKnctmzTovYrr41FYF4e8zdHMstENTvCTVQrP8GIW3y/GEf6xTsjdGM1uoCXO4g1BX7oceEOLRWwW579kGjzscgs/b4EI+EL9eVhs9CWz3mb2+rByNYa1mwkc/SzgG+2AwCRXRGZ7I6k8CBmrwxnYRV/HsVG2Q5xs6XcCXQ575poIZKwOR+aaCDah0qSavioMP/7jIbLWRjL401eFiR7ahqUoqI1F5a5lKNmawCbVgtpY9j3n18QgoTQAcUUKZK2NZJN+9rpIJFeqPIbqxjRmtWm4BllJBoHOW3PeovPA87DbeppOadk1WXLeeksAt1oMI0vp5K4OcB5uApy8NbnlJmvOW+zZc0Sw/1K4+XH8+304/v0+tPftxtGbu9B6bRsOXtqEg5c2Yf/59djVXY3d3avY2NVdjfqOUtQcL8Dmo/mi5T9egHUt2dh6qgxffZuFyl3LUL4zCcv3LEN1YxqqG9OwoTUXm4/mY01TJioaktnkUL4zCSv2pqC6MQ0NXVXYdroca5uzsLY5C2uaMrGmKRPrWrLR0FWFDa25qDtZhHUt2dh8NB9bOopRd7IIm9rysK4lG199m4XVBzPYWLE3Bcv3LGMTRtHXcWwSoJuZrFRElhfCM7ygSHCGT5QD3IKt4ehnATsvM1i5GjMLTzeDlasxbD1NmcumyY3noacbYYHuPCwy/AL6ZgtF622tC3MHA1i7mcDe2xzuITYITHJFeIYXEssCRRA3LEXJ1gSUbE1g100+2U0HOsHOW/X0VWHIXqdy63d0LkfmmgjkbY5mYFftS8Xqgxnsc1cdSGfffXVjGrLWRrLjZGHbhqVIWxmK2EJ/RGZ7IzhFtOCKONGT8o60Z5B7hNpOAl0d7E7+S+ARajsJdh54Rz+LSVbd2s1kWmtOcJvY6MHYajED3MhykeT75eGWh2oE92df/B1z56ss998/02aWW+6OE9zqAFf33Bztv30Y6L3DJ3DuXis6B5pwqv8AOvr348j17czCf3tlC5p7a9HYsw77z6/HNxc2YM/Z1djVXY2GrirUd5Rid/cq7Dm7GltPlWHrqTJxImgvwFffisBSrL/+cA7WH85hEK9tzsK6lmzUtBeg5ngBtnQUo76jlAG89VQZak8UYld3NfacXY2Grirs6q7GzjMr0NBVxT53d/cqbO+swLbT5djSUYwtHcWoOS6+5/rDOdjQKuoN1Y1pWL5HBIKsTd7maKSvCkNqVSjiikQtIDjFDX4xjvCJckBElhfsvMxg52UGSxcjLHFW79LzN4M6d17HYL5auC1djBCd7wsn/yVQxDljaa4vEkoDkL0uEgW1sWzCrNylmjTXNGWya0shVNW+VAY7AU+Q7+hcPsmF58MeAjN7nWiFy3YkMg9tQ2suVh0QQ7X959ejZ+gI9pxdjerGNGSvi0TaylBUN6ahbEcicjYsRe7GaCxbHoyILC8R7gRnBCa5IiDRBYFJrvCPdUJMgR8D3SPUlo3pYHfyXwL3EBuNrry6WJ2HnAedt+L8d0nfJ6/BTOeak9Xm4f5krha0PpkjibVnzZ4Mt3xMB+ys2bM+DPRLw8dw7l4rzt49zGA/enMX2vt2o+1GA9puNODozV04fHUrWq9tw5Hr29HcW4umSzX45sIG7Oquxv7z61mc/82FDegebJFMBAQdTQQUDtR3lGJH53IWIuzoXI59PWvxzYUNOHhpE5p7a3Hoch2bdNpuNKD12jZ8d30njlzfjsNXtzIvhI6JPJFvLmxAY8867Dm7momMW0+VYfPRfKw/nIM1TZlYfTAD61qyWUiRsz6KiVPR+b5MKKI4Xg67mb0+E2Z4QUbuzuuZquJuUzs92HubM+vtG+2A4BQ3JJQGIHNNBArr4lDRkIzVBzPw1bdZzHuhsaktD1s6irHtdDk2fieGT+QBVe1LRXVjmsTCl+1IZG4+wU7xdd7maOZRkdezfM8yZrG/+jYLm4/mY0fncrRe24bd3atQtS+V6QGl2xKxfI/oveWsj0JiWSDiS0RNJCrHB8EpbgxuGj5RDqjvKIVHqC18ohwkoKsDngDnLbujn8W0kMsBl1txucBGkzWBPZ2oRlabd8nJahPcMwH7Q2D/oNE3fg5XRjtweeQkLg0fw6XhY+gcaMLJW404ffsgezzWtxfHv9+Hk7cacfJWI/v50OU67D+/Ht9e2YKWK/X47vpOfHtlC5ou1aC5txbNvbU4cHEjg/fgpU345sIGHLpcJ/l706UaHLi4kYF8rG8vOvr3o6N/P07easSp/gPoHmxB92ALzt49jK7BQ2zQ8dJxXR45ySaGi/fb0TnQhMNXt+LgpU3MMyDrv6ktDxu/U1mt4vp4ZK2NxLLlwUgsC0RElheL4UkJtvU0ZdbB1E5vkgpLVtvcwQBGlqL1tnA0ZHArEpzhH+uE6HxfJlSV7UhEdWMavvo2C5va8piHs6WjGDXtqp/rThZJoKewZW2zGLbwoBPApHfwz1U3pmHjd7kMaAqtak8Uor6jFLu6q5lAu/loPqr2pbLMCnkVpdsSkbM+CmkrQ9n1ItCX5ooaCA85DzuN6UDnrTlBbudl9l6Qy+NwsuCmdnoS1ZzCLl5rIbjl8Tap49qfimCTW/4hYM8U+D81CQxM9KJv/Bxujnfj8shJnB9qQ/dgC071H8Cp/gMM9NO3D+JU/wF0DjThzJ1mdA404VjfXrT37cb5oTYG6HfXd6LtRgOOXN+OthsNaO/bjfa+3TjWtxfH+vai7UYDe1173272Gaf6D+BY3172/j1DR9AzdAS9wydweeQkLt5vR+/wCTZoUro0fAwX77ezcWn4GHqGjuD8UBvO3WuVTF7tfbvRem0b80Yae9Zhd/cq7Ohcjpp20c2vbkxDydYE5NfEIGutKCJF5/siJNUdigRneITawiXACraepiwVZ2KjJ1p3LhVHz1m7iTeis8ISPlEOiMrxYa55cX08qhvTmNUmuMn7aOiqYmPrqTIW2tSeKBTDHVlWhKw6ZUdW7E3BqgPpWNuchS0dxag9UYhtp8slIVZ9Rym2d1ZgR+dyHLy0CYcu16HpUg2+vbIF9R2lWL5nGUq3JaJy1zLRM2svQNW+VJRuS0TuxmgGOYHOpzhDUt0RkOiiEfLpQHcJsGIZEV6U41OiPOQkvDn6WTArPsmCc5OyocUijTH3F4s+Uyum8So575IbWizCQv15DMi/EnYe8Jm8Ru24Od6N2xMXcXviIq6NdYJ35WmcudPMYD99+yC6Bg/hzJ1mdA0ewunbB9E50ISO/v0sxuc9AgKXLPHZu4dx4Yej7Lne4RO4Od6NGw+7cPF+O66MdjAPgx4vj5ycBDgP98X77bjww1E25L9f+OEozg+1sWMhD+XQ5ToculyHxp512HlmBUsrkttbXB+P7HWiaBdT4MfEOu9Ie+bK081EVoJSNNZuJnAPsWEhQFyRglnulfvTmTZR31GKhq4q7Dm7WjKae2vZzzzsFPLwIZEc9lUH0vHVt1moOV6AupNF2HlmBZp7a3H46lZQ3URDVxUOXtqE9r7d6Ojfj7YbDWjoqsLG73JZvM9b/M1H87GuJZu56ZlrIpjnQ6k3ymYQ6BSj8/H5dFadh5yHeyrIeXVdU/wtD7HUwa1JKZfD/Vda7Q+B/n0mBzYB3Hp8Ht8/6sHN8W5cHTuFq2OnGOi8tSUXunOgCT1DR3Dhh6PoHmzByVuNGJjoRc/QEYk1Pnv3MC7eb2egUmhwc7ybeQ83x7vRN34OAxO9GJjoxe2Ji+xYro114urYKQa73IqrG3Lwzw+1sUEewvmhNlz44Sg6B5rQNXgIx/r2ouVKPXPrt54qw3fXd2LvuTWoaEhG3uZo7OquxrLlwUydJzfePcSGxeyWLkYsvUMFLZHZ3kiuDELO+ihUNCQzuAncPWdXY1/PWhy4uBEHLm5kYcy+nrXoGTqCAxc3Mp2B/mdH53KV4Hm8QLTuSuA3fpeLmuMF2NG5HLu7V6GxZx3TOUi7aO6txbG+vegdPoGrY6dwrG8vGrqqsPpgBip3LcOWjmKsacpkE9Dmo/nMw+ELolJWhCBlRYgkx05FS9H5vghN8xBz5WpA9412kMAuB12TFech5y24ujQZH3sT3HzcrWMwn1luirn5HDe55HLL/b+AnGJ6+fOzZs+a9PyHegxC3/g55rpff3AGV0Y7cPF+OwOX3HV6PHv3MLoHW3DmTjNLy1FsTJBfGj6G80NtDOab493of3IBtx6fZ2Ngohd3n1/F/Z9uYvhFH+7/dBNDz69j8NkV3J64iP4nF9gxXR07JZkw5EPu0pMLP91kcH6ojYUh313fiebeWlY/QBaMUn85G5YitUpMF4WmebBCD89wW/hGO8A32gGKBGeW787dKApda5oyGXz7z6/HwUub0HKlnmUz6PHI9e04dLkOh69ulWgXBGhjzzrs61nLoCfxctvpcuzoXI6959YwT4DqIg5drmPvceDiRnT072eTaNuNBuzqrkZNewFLTa5pysTr/z7HqgPpTC9YsTeFVT/SyF4XyfLwVMxE1Y2UK4/IEguUEssCWaFSULIbAhJd4BfjyK4Zn093CbCCe4gNnBWWcFZYThLf1LnplPak0IlXzynfzWc/eLjlRSxyuAlsfnw86+NpB8Gl7nn+kQYBre69ZvqZmo6DfhZ++PEGBp9dwZ2nlxmUF344inP3WhkE5Irz8fmp/gM4ffsgi8GP3tyF07cPomfoCC6PnMS1sU5cf3AG/U8u4PtHPRh8dgWjL/tx/6ebGPv5NiZ+HcbjN0N49PoeHr4axMNXgxh92Y+RF7dw/6ebGHx2BQMTvWyCuPGwC9fGOiXu/EwHPxHwz10aPobe4RO48MNRnL17GKdvH0TLlXo09qwT4/bjBSwtR8ITWXYq5U0oDZBUha3cn45NbXmoO1mE3d2r8M2FDSxbcfz7fUzroEnyu+s78fjNEI5c385G67VtOHx1qwT6pks1aOxZx+oa9vWsRWPPOhy4uBHn7rWio38/E0Np0jpyfTs6+vfj3L1WlkJtuVLPJovGnnUsc1JzvIDpEzXtBciviUH5ziRJmTOv2BPwWWsjWdUiFSRRuXJYuierSAxOcUNwihuCkt2wbHkwC4E8w8VqOLdga7gFW8M1yApuwdYMdCqUsfMyg7WbCSxdjCSViyxs4gpbeMtNohrB/fmXn0ry3HwajLfevBVXV4o6E/D51/LPTTV5vM/7TzW0P50jmTyE4Rd9GHx2hVnQm+PduDLagd7hE8x95y1650ATU9z5n+kmJtBvjndLLPfIi1sY/+Uunv42gme/j+L57w/w7PdRPP1tBE9/G8GTN/cx/stdBjxZ+fs/3cTd51cZ9AMTvRLXnh7JzZ9uTDUh8KIdKc7bOyuwqS0Pqw6oKgBJ1SYhbUtHMY717cXu7lU4fHUr2m404OStRnT070f3YAt6ho6ge7AFN8e70Tt8gukFBDwJm0eub8fRm7tYypCHnc9SfHtlC/OkOgea8ODVAF79+ym+ubABx7/fh+7BFnQNHsL5oTZ0DR7C4atb8d31nTh5qxFn7jTjWN9eNF2qwZ6zq7GjcznLOlCKbe+5NSj6Oo5VLRbUxiK/JkYCPFXLUdlyapVYKUcWPSrHB1E5PgjPEIEnax6Q6ILwDC/4RjswyAl01yArCeDkqhPglCKT1J8rY291FYrqiljkcTdZcfmQAz+ToQ5iOdAEH00g9Df+efnEMNNJgkH9kQALR0N8MldL9dzoy348fDUoAYpiaMqt84IcpdkI+o7+/UykO3OnmYltl0dOYmCiF8Mv+vDw1SAevxnC898f4Kd/juPlH4/xy3+e4eUfj/Hyj8d48a9H+PEfD/Hs91FM/DqMF/96hIlfh/Hw1SAevBqQgH/3+dVJ7j2NGw+72CC3/9pYp2TIJ4VrY51M+KMJ7ty9Vhzr24vDV7cyoa6+o5SJYWQND12uY5mFzoEm9D+5gIv323FtrJMdj1xroBCCrumZO83o6N/PshI0KMVI4/j3+3Dn6WUmhHYONOHozV349soWlmK8NHwM3YMt7G+kT9x42IWTtxpx8X47Tt5qRNOlGlbjsKWjmKXr9pxdzarfSrYm4OClTQx2su4Efd7maFZsw9fRU+ERn2Lj8+nkrvMxObnqTv5LWOqMUmQEOF+9xq83ILipKIlKjflCFnmumx/qnqNBVv5vWrMlP8vHh0wKM5045C79TK28IAhS1338l7sY+/k2hp5fl1hOiotJyOJdebIkZNFJce8ebGFuYu/wCfQ/uYDhF30Y/+WuBOpX/36K1/99jl/+8wyv/v0Ur/79VPL3n/45zqB/8uY+Jn4dZi6+HHzexecHTQQ0SHTkNQmaFAh+fvQMHWHne/z7fTjWtxenbx/E7YmL6B0+gWtjnSxbcff5VQy/6MPoy36M/Xxb4oncfX6VvY5PY14aPsYeKRXYOdDEshpn7x5m15FeS5PD2buHcXXsFPrGz+HaWCcTP0/easThq1tZMRH93HSphg0S97Z3VkhAX9eSjVUH0ll8TmXM5TuTULotkQ1y5XnYs9epFiNRwVFMgR8is73ZCkJawOIdaT9p8QpvvWkFIS+wmdjoMbc8INEFpnZ6kmIWPu6Ww81XqskHD7v8Od7Sy0HnYfxfgj6TMIL3CDR5ErPnzILw7PdRjP9yV2ItByZ6WZxN1ujs3cNMuaabkoeeIL88chLn7rXiymgHA/3HfzzEi389wuv/Psfr/z7Hz39M4Jf/PGO/84PgJ/B/+uc4fvrnOJ7//gBPfxvBxK/DbAJ4/GYID18NYuzn2wz84Rd9LM7nxw8/3mBiH2kSpPTfenxeAj9lA25PXMSdp5fxw483MPLiFh68GsCj1/cw8eswfvrn+KTzePXvp+xYH78ZklzXO08v487Ty+xz+CwCWd5rY524/9NNibdB2Y1z91pxbayTCZg04dB30dG/H12Dh1gVI1+92NizTjJIwd/eWcGqBTe05rJSYSoeonw8LVSqaEhG6TaxvJase+7GaFY0Q5oFv2BIEecscdP5IhhamSZX0PmYm89389abd8352FsO+J8Zmqw9xfSahibL/1d5APL34IHWNIQf//EQP/7jIZ7+NoKHrwYx/KKPWXaCgNxgErHOD7Vh7Ofb7CY7e/cwU9nJXe0bP4fBZ1fw8NUgA/bFvx7h5R+P8erfTzWCrmn88p9n+PmPCbz84zF7pEFuPz8R0CDgSPAjj2DkxS2JDkATAI37P93Eo9f38ODVAB6/GcKz30fx4l+Pppyk5MA/fjOEB68GJGERn+G4Od6N7x/14PtHPSy1+P2jHpb9oBoH0jhIMOVDEdIVKBdOlvzw1a1ouVLPYOehl4NOC5Q2tOZKymrXNGWywhsecgJc7q6TFae0Gq+qk8BGK9Dkq80o5pZXGE6VEuPX8i8y/ILBTvE4WXYafxZ6+dD6ZM6kMdUEMN3kwP9MQGt/OucvmRwEHhhym8lS8ir4wEQvg57iWkpj8TfenaeXcff5VYy+7Mej1/eY8PbiX48YIOS6/y8G7w3w8T8v/vGhAHkEpFWQnjDx6zCe/T7KLPeHHMdP/xzH099GGOz3f7qJO08vM0+BXHv58yMvbuHpbyN4/GYIIy9u4e7zq2xioHFp+BiLzanikECn9Qi8Yk+FMpSqIwWfFgnt6FzOqu4IelqMRK48LS0uqI1linvKipDJVjxBZcVD0zzgEqBy0QlwPu7m4Saw+VWAPNzyph188w5Ng+CXTwIzmQw+maul1rqToDed+y/3BN5nYpjKI3hf+IVX/36Kn/+YAD0SHGQpf/zHQzx5cx+jL/tZeuyHH2/gztPLLIVGFunmeDeGnl/Hg1cDeP3f53j++wM8//0BfvzHQwbe/xLymQzeGyD46ThJKPyrjvHlH4/x9LcRjP9yl7n+47/cZY+UiXj8Zggv/3jMJogHrwaYu08WnSbYK6MdzNUn0GlNwLG+vaD+ArxVpwVHBPzec2sk0JN1395ZwerpqcPQ6oMZrKcA30iEXPXYQn+EZ0jLXcmSuwVbI7EskOXBrd1MpA09ZIo5r5rTsl5+DT816eBddgJf/rOmiYCH/dPPJwM/0wlgukGK/lSQz2S8T0gwVYggyGNMgp63iryVJ8s0+rKfufa8hRp5cQuPXt/DL/95hqe/jUhA/xDL+L8av/znmWT8rz0MXnQk+J/+NsJe99M/xyXaAll7st7n7rWi/8kFdA0ewrl7rUxdVwf60Zu7mCBHkMutuzxe33a6HHUni5glX9OUydKJlDPn4Q5L90RwihuD2ydKtOCUD+c7w9DCEnLPnRWWLOaWu+YUe/ONOnjYabkvD7ocdk2WX27d5ZZdDrem8ffPtCU/G1osmgS6Oouuyd1/X9jfB3wGOt309PjzHxOSIQf++e8PmFtPse34L3cxMNGL+z/dZJbr4atBjP9yl4lXZDnpvf4q6AkgdeP/9WSi6Xh5i89bcXLTb09cxPUHZ5jYdu5eK84PtbH0GT1HsBPoZM15i97cW4vX/33OlvCS8k5r+KmElgCnOn9ap59cKSrovHruG+3A1pNTuaq9tzlr0rHE2RAmNmKu29LFCCY2epPW6ZNLLnfL5RZ8JoNvyzWdG6/OlacxFdhTxe4LdOcxd56P5+UuvaaYXw42D+pM3PoZue6arBzBqCnfTYry4LMrTM2+/9NNNgmM/XwbYz/flijVfNxLufQPsaZ8iMGHF5Srp8GLf/S/j17f+38O+8s/HuPxmyE8fjPEniMlnQqWLvxwlBXaEOiUhiPIafAWnarrDl/dylaiHbm+Hbu7V2HnmRXYeWYFW+pKq/WoPVTuxmjWcovaQZErTikxUsz5dBgVsZCYZuVqDEc/C7Vw8xabB/t94Z7OeuuZLpjUFEJuub9Y9NlfJtjJgVYn3k0Ftyag/6rUnKDpZpS7tuqs+5M39/Ho9T0WZz55c1+ibo/9fJtZdsqHy4tm3hfwF/96xGLrJ2/uSwYdA42JX4dZJR4JchRKvPjXI7z45zgbL//1CD//6wle/+eZhvGUGxPceMI9PsHr/zyWPce/9ile/mscT3+9j8ev7+LBz/24/+MNyWIeKtoh0MV05mHlaMG5ey04O9iMroH96BrYj+6BRnT270bH9ztw/MbXaL9Wg/ZrNWjp/QrnB7/BwfNV2HOmDA2dJfj6WOf4Y3kAACAASURBVC42Hs7Emm9SsbIxBZUNiSipj0XmmjAklSkQkeGJwCRn+Mc6wDvSFq5BlnBWWMDBxxx2XiawcTeGlYshljgawMxWFybWi2BiuQhGS3RgYL4QBuYLoW9GYpoI92KjLyRttciK86213hd0Hmh1HXU///JTtlBFk4tOJbAUl78PyBR/q8vHy+NyeXw+R/tvmK8zF7rGC9Ra7Kly9lPl1+frzJ0y1aYRdE1uJ5/eIuiojFVdOuvhq0E8en3vT4FOn0efRVDTJEPKOU0qFDLQoNfwj49e32NWlSYI8gI0hRV8TP1nXPenv40wN51EN1oTQKk3Wn1Hy2z5nDu/jJgEOcqfk4tOdfC7uqtxrG8vU8/Ldyax1BjVpYemebA4OzrfFy4BViy/zRevyJd6yruwyBtk8kCr653HW/b3td5TxeHqYnECmnfR3zefTm2Yzez1p1TXp4rHycX/7Iu/a7Tkcvedz59PB/9fAjpv7dWlr3jgCSSCnIAige6nf47PKI6WA06wUkxLVXI//HgDP/x4gxXN0CCQCCp6DT9IU3j0+h47vv+VcEjptpEXtyS5cxr8wiKqWeALlc7da0XX4CHmrlNKreVKPfb1rEVDVxXrnENwU3+8jNXhbDlpaJoHovN9WZ7bNUjsGR+U7MbKT+XpL3U98aj0VN4Mk1fOedjloH+om67JkquLwWcK9kzcbu1P52Ch/rxpU2lyqy5/Tm7NZ6qe//0z7fdOrc2a/YGg8649KfVkdfkqNn7xCl/UQqLcVBb95z8mWOzNW22++EQ+bj0+z8pd+8bP4cbDLlx/cIYV8VAums8UEPijL/uZnvDkzX38+I+Hf7kaT9acUmskvMkhp6o4cuEpFifLTdab2mNRPT415CS4KeaOL1GwHDctr6U+eKSM89bb1E5PbZNE3nrzgPPCGoGuZ7pArZvOA/4+oKvb8EJT2kxuyWcK+XSAzyRNNkf7b/j7Z9qYrzNXYqHli2f+6qq56cpgPxj0mU4EvKLPp++m8hRooqAwgC/a4ZtkqFuCyi8ekXef4RtRUIkvNb744ccbGH3Zz/QGPjVIouRfAT5fCMMXytB5Uaksv7SUz48fulwn6RKz7XQ5NrXlYeX+dLEBpDLHHVckwh2Q6MJUcmq2yAtp1BWVxDQjy0WwcDSccvcROeRya64pFlcHvLqhKWaXg65OOdeUQptJ7ftMhjrYCWbePf/8y0/fy2r/FeWxU9W9/89A/ysmCT6fz69uI2X/hx9vYGCiFzcedjHIr46dwvUHZyYNWqxCkwK5xLRAhYp+qK6dKuUevxn6S607VcvxVp1gvzLawdx6ypGTkk45cFpLvqWjGBtac5n1zlwTgaTyIIRneCF3YzQCk1yZWk6VaVSVxrc8pgUjvHtOFpwvZFEXj8vh5t32qYDnoeeLYuRbWMlh15QTV5dCk1t2TcBPZ+Hlbve8BXPfq+5dk1Xn4abj0hSHT1fHPpWF/9Ou+/9y8OEAKeQklD37fZSFAA9fDWLkxS0MPb+O2xMX2Yqu2xMXJS69fOEKKduXho8xoevyyEnm2vc/ucBKUSd+Hf5LQaeCGQKah/z1f5/j7N3DrLkm33Biz9nVkn75K/amoLAujm3uEFvoz7Y5ohw3lZ3yyz6ZsKa03nyLat6CL3E2nFS1xndJ1QS7jsF8LDb6kv3+5eLP1QJPgBtZLpqxJZ8qJtckwk1VCCOHW92iGF6I0ySyabLa9Du9hqy83IJThmA6Sz3V6rTpJoT/r0CnQhde1aeYn6rr+HJVsu5Dz6+z2JtWpZHwJu9Yw9frUxzMu/m9wydw42EXBp9dYWvp+dVqtCDnQ8Gnc3jwaoCp7VfHTuH8UBsevxmSNIXY3lnBNqFYfzgHK/ens0YQmWsimGqesTqctVYmyKmBA63vnrS9lKwbqrp95eQbCFLPc35HGrniTq79VBafH3LrrmlCmGnMzg+5O68OfAJaHfz8c5pi9vdZ2cZb7L9pzWaf8SGquqYlquqA/79u0Wey6kueqydRjwYP/cNXg7g53o3BZ1ckoA89v84U9ZEXt9hKtaHn19nadRK+aKUYpa9o1Ri1v6IiIPIoqAiH0owEPz8BTDURvPzjMcZ/uYvBZ1dw6/F5XB45ia7BQ2i70YCmSzXYf349GrqqUNNegNUHM9g+dlRjnr4qjC0iicrxwdsKS7ytsMS7SnG8rbDC2worvKu0nLSQhKrWNHVJJfjl+8tp2kV2KksvH28rxeOkx3f0e4XltJOBfMPCmRTMaEq5zbTclSCUK/Ka4nt1de1TufHTNbT4s3H6pBj9f1nnLVfleTD4AhwCiF8yy7eZ4oUxcuUpbue7x5KoNvLiliRvTuW6/IIcUuf51XgUr/PuO6XfHr2+Jym44Y9F0wSgTsR7/GYI93+6iRsPu3D27mHWtqqxZ51owdUATnvE0QYJfAeXt5WWGF2ohVEdLfFROd5WWEosO6+u82u/aecYY2tdtbuHyhsuqtsuWB308vGuwhKjC7UxpqOtOlYd8Tjlwp6R5SIo4pyZtecfP6SCTh30mopopquUo+dnUvmmrliGQP9fC3RqQZ8OdgJWbrE0PU9LNB++GpSsQ+ctNS+u8fl3KrqhQX/nAecniNGX/egbP8dAf0fWolJlPXir97bCEu8qrNQuu+XjdPIOaOIQ38OKe18rvKsUf3+ntFTvOKvFQ08T28NXgxiY6MWV0Q6cudOM1mvb0NizjinnFHsX18ezohaCnO+wyrdVfqsEyMxxEUzsF8PIZhFGFmjhbaW4YQT1ZGPHKbGqVuzY6RpRPzb5mLSNkdIDeMvO3Ur13sr34938d5WWGFuohUg/DywN9EJMmDdGF2rhnRJ0iu91DObDNcgKF344ivk6cyeVzapb7PIhZbTTLV/99PNPYGavj4X689SCv8jwC8xbMFflTUmu4+RrIbkX6Vop78W3/PeiHO/496kQf/8zirwgB1UT6JqGusUkfHzNWziyfGTVhl/0sSWZ1JSB1rFTsQ3VyRPs8gYWwy/6WLuoO08v412Flcqy6WhhdKHSguhIrR15AnLQCfZbj89j8NkVFeiVqvcdW8hbT23Vo442Rhdq422FpWStwE//HMfoy37cHO/Gqf4D6Bk6gubeWuaiE+DUR54Ap86qBHhMgR8DfGmu6Lq/q7DEqI4WzJwWw9RhMYxsF7FzpN5sbsHWKsu/UFs8fh358YvQ8S497TYjf47fbVSTR/GOA13XeAGbkCJ9PbE0wBPRod7sONWl6ghyvhccPfLq/VRw8wq+OtDVNar4+2faWKA7D59/+em0q9hEL4W713To+qruBfFRS/XIDx3ZfaT2tap76k+BrgngP+OqkzWTTwgTvw5jYKIX1x+cwcBEL66OnWINJ6mDbM/QEVwZ7UDf+Dn88OMNVjrL166TdacCFMpH33l6Ge8qxRuq8NtQlBwJQ1lbBCqORaLieAQqjoWzm4tv5ECAkzh3c7wbAxO9LEYf+/k2u1FzdzkjZ6cTsnc6oFYQUCsIyKy3QcYWK2TUWWJ0gXiT0zV59Poei8WPf78PBy9tYi46AV6+Mwl5m6NZN1XeRafdTwhuaqVMbZTfKm82c5fFMHVcBGO7xRhdoIW3FdK9y97ShOBoBHMXY1i4mcDSwxRWnmaw9rYQvYAKK2ncLovd1Y23yusd7O+GYH83hPi5sWvMu/Q0IUR6eyBK4Ymlwd7K41QPOq/YU5zOd3d9Xys+nWJPsFu7mWC+ztxp43jyUOgeSCqJQlJJJBKKwxFfFIa4whDEFAYhuiAQSwsC2OtqBQF1goDQHE+E5HggOMsdQVmuCMx0RkCmE/wzHOGdZgP3ZeZwSjKEbdwi9t1ofTIHi42+/CB3XiPo7wu83JXnBTaKk/ufXGCrrA5c3IiGriq2KQFtSLDn7Gq0XtuGY317ce5eK26Od7O12/KYnTyHZ7+Pom/8HIZf9DHLW9AUgqKWEJS0hqHsaAQqjouwjyyQWnS++ysV0NyeuMggf/BqABO/DrMJJHe3M3IanJCz0xGJgoAkQUDmVltk1Fsj42srZs1++uc425TizJ1mfHd9Jxp71qG+o5QtBy2si2ONFWnvsoTSAMSXiH3jyWoT2GHpnqxHOm1FTKBbuOqKVt1+ETtHvm0Tvc7U0RBmzkawcDWGpbsprDzNYeNtzuCciQpv6WLE4vO3Sg8q2N8NwX6uCPFzw4jMoi82+pJNNJHe7ojy88TSIC8R9EpLtp30dOq8uvw7b7E1NZ2YqhONPBfPp9mmSsnR9awTBCwrjUayEvTE4nAkFIchrigUMYXBiCkIRHSBAknKeyVJEJAoCAjL8URItgeCs90QlO2KwCwXKDKd4Z/hCN90W7inLIFzkhHs4hezCfFvWrMxa/asKeN3TZPAtKCrA16TCy+Hf/yXu7g9cZFtxdR6bRvqO0pZ19F1LdmSnT/XNot7fG3pKMbOMyvQdKkGXYOHcHXsFIaeX8f4L3clLaH4Bo3Pfh/FzfFu9gXkfROEgqZgFJFlPxqOymOR7KJRUczIi1vMdec3nBh92Y/Hb4bYZ7yttMSojjbydrsgd5cTchocoRAEKAQBmdtskUmgcxPJldEOnL59EAcvbcK+nrVMaKvctQz5NTGs9pwseHyJyj0nuENS3RGY5DppSyMaBFqt8gaqEQQ22VBZ6xJnQxXoDoYwcxKt+hI3U1h6msHaSwW6urTaVEMMHbQRrBCteYi/G7sGfLEND0aS8jhpQqL4fLo0m7r6ePlKNk3x+EzXqM+0bJY8lNSyWCwri0ZyaRSSikXQ44tFix5bGIzowiBEFwSwe4VGWI4XQnM8EZztjqAsNwRmuSCAgW4Pz5QlcEk2hn2CLps41bWTmumYlF5TB7FUPFA9yiFXiQckWqlEiXdc2odPsTDxjBPRaH/ud9znTRI0+GPhRAyKe0YWqG7+ohaCPYJB8OTNfckCnBsPuyalfXjBhGDK3eOK3N0uyG1wgp0gwE4QkL3dDpnbbJBZb81Ao3Pnz5euTdrKUOXfrbi0GAk6VojM9paIOBKxp1J6vei4kjjQR5TQ8hVw9Fr+9UvcTGDpbiqCrrSu8r3e9UwXSI5D9f2KQt6YEt5ghStz32vpGnD/N6qj5jiVoPP7j9N14a8HLx5KxL9KK7xTXsPPv/xUKnzJBDL+XuIf31VYTgm5JuDJQ0kti1Va9KVIKolCYnEEnObMQXxRKGKLghFTILrvdK/YKx8Z6Dnu7G/88OcnxIUqi/4hQ23BjDp3nU5KHNpMwHlXackgJ1FIIvDoyEUfbZVAJhOC+N/fVlqiZGuCClwd7UlixpiOTNCg91XePG8rLDGyQBu1goCC5hAUtYSi9Eg4+zu/yObpbyPM4qgXS7TZpJG31w25u12Ru8sZhoIAA0FA1g57ZG2zQ+ZWW86qahBflCmlUfnxc0JhYJKrcnLRlh2LtvK8VdeX4FFwNwadI6+S8xMXwW7haoIlSvddHegEOS8UjfHfJedJEOghfm5IUsai/L1Cx+kv8zzIdSeLLv881flrQ/19o80mb3XXUyKQyf+u/C54y67Omhtb605as85b9JSyaCwrXYrkkkh2TxgIAgwFAWZaWogpCGS/02N4rgp0/nkDJegKNRPih4Ku1qKrG+8qLRFS5ABFji18M6xRS7NMpSWbGChPWisI8Eq2hNcyS3gvs5QIEL4Z1vDLtIFflg0U2TZQ5NgiMM8Ogfl2CCqwR53ydfwXVysIiKh0RtQKZ0RVuaBWEBC90hUxa9wQu8YdcV95IH69BxI2erCZj1J4NPnkfROEguZgFLeEsovGF+HQl1anPNaSbxUoPqRAUZMvipp8UHjAG4XfeEIhCMjf547cPa7I2+2CeYKA+YKA7J0OyN5uh6yttlAIAjK+FoW59FoLpG02R9omM6RuNGHXgkScOkFATIUhokoNEVlswM7bJcCKaQ1+yfrwSdCHV5w+uz70Pg6BurDz14WNjy6svBbD0l0X5i6qmI7Pf/M58HeVVhjV0Rbdd3cTWHmYsf+hjQlFyK0k10UR6IKAQBcEBLgiIMAFgQpXBCpcoRAEBCncEOTvimB/V2aN6P/CfN0R7uuOcB8PhHt7IEIZp49yrjsN+t5TC4KQXhaMzBUhqBUE5KyPQF5NJPLrl6Jw51IU74tBycFYdh3pXqkVBKy6kIKV51OxsicFK8+mororFdWdqagVBFQdT8WK9jQsb01j98J0xTJfLv58EvzkpaSWxyGlLEYEvTQKBsp7gsY85ZD/Hp7rLQpy2R7seYJ80mQog5yOYTq4+Tz9jEB/W2EJ3zQreCUvgXu8BdwSLCTuGX05dYIA93gLuMdbwCPBAh6JS5ir5p1iCZ8UK/ikWsE33Rp+Gdbwz7SGItsGAbm2CMizQ2CBncoacFYgvNwJEZVOiFwuwr602gVLV4mwx6xVwU5fHKXgyDrkNAYi70AQCg+pQH/62whe/vFYBJ07/tLWIJS0BChh90NRky8KD/qg4IA3CvZ7In+fB/L3uiFvjyu0BAFaBPoOe2Rts0XWVhsR9C2WSK9bgrQac6RuFkFP3WDMAKDrErvcEEvLDBFZYshAt/U0Zcfkt0wfvkl68IrXY/9Doo5jkB7sFbqw9dWFtZcuLD0Ww8J18bTCGhPwnI2wxFV03+l/+AUtb7nQwCXcDopAZwQEukAR4ILAAFcEKh+DFK4i5AoRdN71TBIEhPm6IczHHeE+7ojwcUeEtwcifVSg8zG4CvRApJUEI2N5KLJWhSJ7XQRyN0cgf0sUCncsRfHeGJQeiEPZoTh2zyQJAqrPLhNBv5Aign4uBdVdKajuTEFVRyqqTqRieXsqlh9JY58/VfdXTcUzdA1Fiy6CLrruovJO94aWIEBbOfjnwnK8REEuRwSdICdrLtcxeIDpWGZiyakwZ2agV1rCKc0CDpkWsM82h0OWhcw9U0HpnGoBl2RzuCaZwy3BAgpBQG55CjyTLOCVtATeyyzhnWoFnzQrpYW3hn+WaN0Dcu2wqWEle+9E5UmHlTkqYXdG5AoXJeyuWLrKDdGrybK7M9Hi6W8jooCm/DKy9wQgd38Q8g8GMxf19X+fM9edLFfZdyEoPRKEksOBKGlRoOSQP4oY7N4o+MZLCbsb8va64WNBwMeCgJwGRxH07aL7Tum29LolzKqnbjZD6gYTpKw3ZuelEATErjBEdIUhlpYaMI/E1tOUxdSKFAP4JYlWnb8BagQBjkG6cAjQg62fLqy9F8PKUxdL3NSDzots5C2YOxkx951uKL6ena6fc4gtXMLs4RbhwFl1FwQqaIigBylcEeznKrFIZNHDfJWge4sj0kc1MVO6zDfagWU3UvKDkFocjIzKEGRWhyF7bThyN0WKoG9fiqLdMSjZH4uy5njm5q7oSEJ1twj6qgupWNmTipXnUlHdnSqCfjoVK06kYsWxNCxvS2Wg8xacz6drqnvnXfc0ZtFFQS6RE+TiC0OgPWcOu0/4IVp0L6Xy7o7gbEqxqZR3j5QlEsX9fYa8Y+yMSmDfVljButgcNkXmsCkwh22BORSCALs8c9jlKkeO+JxDlgUcM83hmG4B5xQL2AkC3BJFK++eYAGPpCXwShaB90m1gm+a0rpnWUORbYuAHDv2xSkEUbwILXFAWJkjwsiyK2HfoqWFzPIYxChhp4vS0b8fZ+8eZgBn7vJH9t5A5H0TyF5DBS3Pf3+At0pRqbwtFGXfBYtW/XAASlo4q97kowK90R15+9whCAIEQUBOgxOydzoiazvF6jbI/NpahL12CdJqLET3fZNo1em87AQBcVWGiKkUrTqBrkqHaUORqi+674n6KndugRZGF2hhZKEWapTXytZXVwTdXeW6y3c9kcTdOloS9Z28iUllqzpK0EPt4BZuD4XSopMLH6hwYRY9SCnGJXJe2YgyHqbjjPD2EC26twebkMwdDDBfZ66YhlMClJIbiNSiIKSXhyCzOhTZa8NRujoTebWRKNi6FIW7olHcGIuypjjmQazoSEJV1zKsOp+ClRdSxcdzKVjZLbrvVadSUXUyFVXH0rCiLY1N+tM1h1T393eVooZS+/HHHOhLlSm2CCQUhyG+MBSxhcGIKQxk94rAQPeRKu/ZpLw7QcGUd0vlNbKatmRWDrZ8CLTQgt8qSQ7/2wor+Gc4wj5+MYwitWFZag57QYBNoQVsCpXw55mLrkeOOeyzzWGfZQ6HTAsYkpVPModrgjnc4ywkwoOBIMAnzQp+6Urrnm0DeyXkdsq/hxQ5ILTUkcHObqQFMuFFWayyoTUX206XK29obaTv8EfWLgVy9qlAH3x2BRfvt+PyyEllvKWN8qNhKGsLQdmRYJQeDoSh8jgNlfFV4UFvFBzwQv5+D+Q3cqDvcuasuj1zxegc02sskFZjjrRNpkjZYAJ7zlWLqzZCzHJDRJcbsuO39TRlhSgBaQbwT9GHT5I+O2c+OzCi9KZE930xLD10WcEMb8UlxStKS23mZCiC7moiUcDZQhTlROkcLILuGm4PRaCz5LubLwic+y6CrhIEVVkY0m8oTo/09mCg8akwEmCX5QQitVCM0zNWhDJvxl8QULA1CoU7o1G8LwalB+PYtVxxIglVnclY2ZOCVedT2HdH30X1aSXox9OwvE0Vo890kQu/nJXEUgrDUkpjZKCHI64oVFI487Eg4COl6x6e64OwXBXowVluCMwUU2yKTEf4pzvAK9VSOflbSaCVu+Xqer5PAp1foEGxLTVIpAngXaUlxgw+R3C2G/wzHOCYaAB7QYBlqTmsSixEa18oQm2XZwG7XHPY55hjkZYW5gsCHDPM4ZRqDudl5nBNsmDiBAkT3imWStit4JdhLb4PdyMFF9ojpNgBISUi7KrYZXLN8LsKS1Q0JKO4Pp7dqGnbfJHR4I+sPQHsy73xsAvdgy1ovbYN7yqtRIt+NExl1Y8EMcDnK78cMVYXrXpBoztzwyjdRrG6Fnd+8wUB6XVK0JWxOr2vgSAgYaUhYlcYIqbCSJJKoXAoIN0AilR9+CbrM8hpbbm1mwmzzrb+urD2EeN03nVXt9RUnlO3cDVh/8OvRCOB1SnYRgm6HdwiHSTXxUAQEESgK2N0dbE3fabKffdgr+NBp5BlWXYAUguCkFYWgszloWxyTxQEBMyaJQpye2NQciCWCVkEevU50X2fJzvOqtNKq348FSuOqmJ0dUtXecg1TQJ07fnMR3JJJBJZhVyoMp8ugk7x+TxBQESuD8JyvRGa46HWU6PHkQVidutD9nOTgM73QSfgab03PU8nFJXnj9AcDwRkOsMr1Qq28YtgHKkNq1JzWBebI3JtGGwKzWGbbwG7PAt2Ug7KuN4x3QKfaWlJRAktQcA8bW2VK59ujfmcFTUQBATl24uwFzmgdvZsdlMaWS6Cmb0+7LzMEJjkCu9Ie4RneGHl/nREZnsz9yql3hdp2/2QuUshERGP3tyF+o5S5i6Wt4ej/GgoytpC4KylxY6BjvNzbW0UHlDG6o2e7PncPaoiGnXn97m2tui+bzZD6iZTySSXsMoIcVVGiKk04nQPVWFJUIYBAtL04Z9sIH7pFZZsa2Eze31mLe39dWGjFOVGFkyO0fnuMe840M2djGHhasxSgu8qLVnzR3pvxyAbOIfYwSXMTnJd6Ptx0dYWYfd3RZDCjR0nX6b6rtISYzoi6OHTga6jhWVZgUjJD0JaSbAEhBrldSncHo2iPdEo+SaWHcvyY4moOp2M6u5l+Fxbm11//jinAn26wUNP3iJNPv6CwDy1+YKAT2fPRnyxEvSCYEQXBLLv3FAQEJ7nw5R3PiXKe2t8vv/PbuIo8GWlr/79lC0T5ScAAiGuKBRR+SLsgZku8Eu3h1OiIcyjP4du2EewKjFXWncxjmcpA6U775BlDscMc0mqYb4gwCNRGbeniCIduWLkHgbm2YmwF9lL3EJ9s4UsbbTE2RDOCkt4hNoid2M03ENsmEVaVueD1K2+SN/hj+RZs5iI+LbSUlmYI1r+imMRIuxtoSj7LoTd0HScRc2+EqtOfxNBd0bOLifk7HSYlFLJ2GIpEeXovOYJAhJXGyGh2hCxyw0R8PHHEgU5JMcAQZn6IujLpBadlpqSpbRX6Inuu7cu8wqoVn1SfbrcorsYI4mui7I+QrW0VAtOQdYsTncNt5dcFwNBUCrwpLyrat150OkeCvNxR4SPGKdT/Clx3ZWfmZypQEpeINKKgyXqM3k6TJBrjGFwVbYnYkVHMqq7RIv+MWdBDQQB1Z1Ki34iDSvaJ4POVozJ1szTIw89n5Ega27PGaj5gsBq3mMLxcIZ+t7tBAEReb5K192LHcf7NKDkl7zKl72qe61AS0HVDZoA3lVYYVRHC0klUYgtDEZkvh9CcjwQlOkKvwwHOCcZYUnMfOiHz2KwWxdZqFIGuRawy1Eq9pkW7IRpuMeLqTjP5CXwTrFkKQZKNwTk2rJc++jCOSyW1DdbyNxTQ4tFMLHRg7WbCdyCrWHlaswEraQab6R87YO0bX7IbFBIxCK+hLTyeCQq2iNQ3h6Gsu9CJx1ncbOfmFdXKvD0fN4eN7EGfpczcnY6TiqOSN9ihYzaJWKsvtmMnZeBICBpjRESVhohtsoIMRWGTLFWCAJCcg0QnG2AwHR9+Kfqq+oXKiZXxtkH6MHOTwSdz7+yyrtKSwY9xf8m9gYwdTSCubMRlriZqK6LjrSOwTHQGk4hNgx0+XUJDBDz6eS+yyvjSOysFQRJmo00BxZ2cfUMyRkBWJYbiNSiYInlp+Mq2BaFooYYFO+LhZ3yOlceTcTyk0mo7lqGledTWDxMHmL1mVTRfT+ZihXHUtnkQTXw0qKvyQU5EtCV91Z6eTxSy+MkoNN1iS8KQ1yREvTCIInxisjzFS16rhd3HaQVlPyy57eVltNOAFMNgd9pRd148uY+S8eklMUgoTgcMQWBiMjzRUi2BwIzneGXYQ+nJONJsNsq9gAEjQAAEWhJREFUb1jbfJU6b59tIVr2dHM48SJdgoWYgku2ZKq7vxIIyrUH5tsxa05NCGkL3kWGX8DAXAfG1rqw9zaHiY0eu3ESN3kiuc4bqfU+SN/hh6zdikn5+kQC/VikyqofCUZpa7CYbvtWgeJD/ihq8hOt+jdeDNi8va7I2+OiXPDiiOwdDkoFnku1bVGm2mrMWWrNVhCQvNYIicx9N0R0mSEiFE4ILzBAWJ4S9AwxTlcds/aktKZDgKp4hp/IqDLsbYUlW5VGltHY3gCmDkYwczJWptnMJNeFwgfHQGtlnG7L4nRFgJhiC6CcOgc6/x7yCj4RdNGiy49zTEf1XSSlK7AsJwCphUES0Y5gLNgahcKGaJTsi2Euc+XRRCw/kYSqM8lY2bNMTLGR8n42FSu7UpkgJwd93oK5zEqXbEtHyZYMFG3MQOHaDLa+Xz3oCUgri1PVvJcshbOWFlPeRUFOtOh0P9sJAiJyfZnyPul6sUpAacWkpg0hNG3PzD8n8DuqqBvjv9xlN0ZaeRySSyIRVxiCqHx/hOd6I1hLCyHa2vBNt4VjogEsoj+HnhJ2UkqjV0SIcXuuOexzzZUxuwi7c4o5XJMt4BYvwr6yppTFZGTZ/LNsxNRbri07aVqswHcdXWT4BXSNFzBLT8cdv94TSZu9kLLFB2nbfJG501+ZWw9EQVMw+5zy9kiVVT8airLvQlGqVOBLWgLEarlmEfTCg97wV05GefvEAprc3S7KlW2qAprMehtk1FshfYulMtVmjkTu3JK/MkbiaiPEVxuxnHpUqQEiCg0Qlm+gdN8NRPVdeT1rBQGeMfpwj9KDS7gunEN04RioK7rvPrqw9lyMJe66sHBZDFPHxeyGJtAppDG20+cEOTHNZqVc5GLrs4Sp3AS6GKeL+fQAvkqOcunKNJuCO85QP3eE+Lkj1Fcc4cp8eriycCbKxwNLAzwRE+ItiXeT0hRYlh2I1IIgiUWn7zS/Xqm8741h3l9lWwKWn0gUlXelIDepQu50Kqo6UrHieCq7lwh08hZKtitB35SBwq8yWH3GJNB1tJChBD2lLBbLqEKuJEqZSxeV99iiEMQUBLFzUwgCIvN8EZHrg1Blii0k2x3B2arFLYoMR/gpU2ykeUy1K4y6TR35IdDGBbQtMu2DThslPnw1KIlHlpVGI6EoHDEFQYjM82PVWooMJ3imWMI+QQ9mS+eyqigC1ibfQkzB5VrAnsXsFnBKN4dLijlcE83hHm8hqQiiL94vQ6ygU+TaspPmixv41Uuk9DLVWEcLces9kLDRE8m13kip92VWPWdfIPIPBjHwVFY9AhVKq176XYgyrx6I4haF6L4rY3U6dyqgyd3twqXaHFj9e0a9NSugIStG12XZOiPRfV9lhLgVolWPKjNEZJEhwvMNRfc9ywAB6frsGJMEAZ4xenBfqgfXCD04h+rBMVgXDgpdZfGMLiw9dGHhuhhmToslMbuJjR7z0Ixt9SVx+hI3U1h5iKDb+FhIrotjsDWc5Pl0yqXzVt3fVbIkM8TPDaF+bgjzdRNB95GCHukjrk+PDvGWfF5SqgLLsgKQmh/EUkwS0L9WVsjtiWYxsp0goPK4KMipQE/Bqp4UsXCmKwXVnamoPqUEfZJFF7MvpTsyULIlA8WbM1C4LoO51Tzo75TXML0iAenlcUgtF0EXF7dEIrFEmUsvCkVcUQiSZs1iQmKiEnSWS89Wgp7lhqBMZS4900mZYrNiHo2mxpQz6UcvPHw1iDtPL2Ps59usiSINWsrJx7GpZTFILIlAbGEIluYrWJVWYJYL/DMc4JZsBps4HVYVRUUdtYIAW8q355rDTplrd8ywgFOaBVyWmav+h5aSKj/TN8Ma/plifTy57nxek09/8MsVKRatEwTEb/BA0mYvLNvirUy3KZC9JwB53wSycyAAK5koF8aq5UoPi68rPuSPomY/FB30Yf+Xv89DBH2PK2oEZaXcTgdkb7dXLWHdYiW5JjSR1QgCktYqQa8yRMxyQywtN0BkiSFqBAGheSLogRn67PU1ggCvWH14LNWDW6QenMP04BSsC3ty370Xw9JzMZa46cLcWWrRTWz02KqzWkFgcbqFi5hms/QwhZWXOWy8LSTXpFYQxHx6mB3cIlSgKwLEcw7kUmw13HGG+ImAh/m5Kyvk3KSlsN4eiFJ4ITrYS/J/SSkKJGcFICUvUCLaUTiWtyUKBduXonh3NAOIYF9xOhkru0XXfRWVwp5NgbOWlhind4iCHAHMFH+lkl66Mx0lX6ejuCYDReszJ00IvPXPINC5UthkrhQ2viiUnRPPQkSeLyLyfBCW463MpXsoLbqr0qI7wT/DAV5pqqXPH7rpxCdztSBcHTuFGw+7cONhF/rGz6H/yQXWXYVaKT14NSBZ5sgXqowsUP1O+T8+H0gz8Ijs7yNqil1ovK2wxKzZs1RtihaoPkfuxlDOk+8WwmZo5QQlOS4uR8l/pqZjkQozqkov+fuOcNdFfq7y9+LXB6j9TO5c+fMe0XAsIwtkx8MfC3dNqf+b5LO59x6Rfba6Y5d832qOWX6d1V1v+TWUXq85qvPiHpnrrpy8+TwzXyFIsPOiGImiK7tTmPK+4oTKossVf/6Y6RjkoL/V8P2NyK4Tf5+z/5HfL/x1kv/fgjnsf/8U6NRd5dy9Vlz44aikb9q1sU4MTPSKoFeoW1stbWCnrhHe7DmzJj0nH/IGhR/P+hgfz/qYS3VYSf9HWUDAd9qkNIJ85ZHaz5TlKSedRwW/9prWLVup+R8156X2GklzoollgQhL95z8XrJjecelelTvL3tO3d8rVOux33E/8/3f1F13+bVR9QqwUn/NNPQHUHc9NV2PKa9lhZWkoaUIo/r3ZZmT9kRWCrvyfCqc5sxRLm5R1ryfoRSbCnR9s4UsnTjVvSoHXdM5a7oOYv5dfvxWaj9zUi+Gij8J+qXhY2wL3s6BJpy504wzd5rRM3QEF++34+rYKTx4NSApiX30+h4uj5zE6dsHcehyHRQJzqzBga2nKfRMF2D2nFn4ZK4WZs/RvAPkrNmz8PGsj9kjjVmzZ+Gjjz+S/K6pOb18yxtaxkdb3Gp9IsYwn34ubtFDIp68KwnF9YsMv4Ce6QIYWiyCsbUuLBwNsau7WrLPOzWtoPHw1SDuPr+K/icXcGW0Axfvt6Ojfz+ae2ux88wKbD6azzrLFNfHI3tdJOJLFAhN80BgkisUcc5sfzTvSHv4xzrBK8IOfjGO8ItxZN1cPcNt4Rmu2mLJ3tscDj7iJg3Wbiaw8TCR9HC3cFT1cJcPvsOrsdViSatnTf3hzB0MWN2CvNOMmb2+5He+5Haq/u/q+sHz3WZm2heOYK84mogVJ5NQdUZMsa1iMbpSkDujUt75Cj7qciM/jqk62kzVpop/brqVcZraTf/ZjSEloHcONOHkrUacvNWI9r7d7OeTtxrROdCEi/fbJ4H+/aMenLnTjOPf78Omtjx4htvC2k11g82d/wlL3FMfrtlzpDDLB8EufCRA+EhgP6t7nSbY+RY7c7T/JjlRTRdX3mfsy8WfM/Xe0EKsvCusi5NkIijtSPUGj17fw8iLW/jhxxu48bCLeUjtfbtx9OYuNHRVofZEIVbuT2e94tJWhiKhNABROT7iVkoJzvCJEttDUbsoah1FO6B6htuyrZYIcurXzg8C38LRkHWZoaEJdga9UrDTBLumFXG0hdNUrajk8PMLaKaCXdNuLVLQlUVPbQlYfpJLsZ1PUa5ik4KuqjWwYt831WPwlYRUJbhAd957bRqhbp+4mVbgzWQrKXUTwZSgt91owHfXd04aBP7F++0Y+/m2pNnjxfvt2HtuDdr7dqOgNha+0Q6IzveFvbc5Fhl+gfk64paxdGAE5FSg84Nglw/5pCDfioZc+L9pzWbqJC1CoKWH/I4b/MX7/MtPWU8y3rIbW+sipsCP7cn+4NUAqzugttRP3txnWzrfeXoZwy/62K6tT38bwf7z6yftncZvzkB94qJyfNjmiAmlAaxPHPWHI9AJcBoOPhbsOTsvMwY6vxWymb2+5JFvMyWHf9JGDpyVp7JjddDLJwD5yjn51k7qNm7UtO/6At15MDDXUdsUkl8MU9GWIObSO5NFuCmX3pOKamWKjQRGfk2AsbUuTO30YOFoiCXOhmxHGzp3XeMFWKg//fZQ77tbzJ8B/n1gF5p7a3Hoch3bzK/pUg0OXa7Doct1OHx1K3qGjmD0ZT8D/cGrAXT078ees6ux+Wg+Ygv9Ye1mgsSyQJjY6DFo5s7/BFqfzGGgy8GUw/3Rxx9J3PWZAk8WnAeedsr4ZK6WBHKy5AQ7Wfq58z9hXxrl42mWN7JcBO9Iezx4NcBSjg9eDTDrTn3naTcYamfdM3SEbXvM78ayo3M56jtKsa4lG6XbEpG5JgLJlUFYdSAdg8+uICTVHaFpHghJdUdAogui830RnOIGrwg7uIfYsD3No/N94ehnAZcAKwn4vGUn2OnmJQtPP2sCnWCXW3rycNYfzlG7bdN01l/dHm68hZ9qSyd+80Z1u7C+rbSUCIHqhFK5eEiQm9rpwcrVGO4hNghKdkN4hheCkt3gG+0AW09TNrHpmWqGfboW03JXfqrNI2YKPb87LD1q2jpK2HtuDRp71qGxZx32nluDhq4q7D23BvvPr0dzby1O3z6I4Rd9DPQ7Ty+j5Uo9ak8UIm1lKKJyfGDraYqlub7QMZjPTlLHYL5kEzl5LK7p55mAzgM/a/Ysyc9an4hWnFR53q2Xgy5P0fGdRnn33T3ERlJfQINgp0mANnsk6HuGjqB7sIWFOW03GnDoch12d69C3ckifPVtFioaklnbZ77lc2yhPyKzvRGe4cUsu3ekPVwCrFiMzgPOW3UCneJ1CqmsXI0lv/O7q07l0vP7s70P3JpcfX2zhZP2X5+pS89v4kjuvY7BfPU7oshEVV4ofcdBbu1mgtA0D2StjUR1YxrWNmdhbbPodcUVKeAWbA0LRzE0WWz0pVo3firYZ2L15bG8un3f1cX/ck+Bt/QS0LeeKmP91Rt71mFLRzHqThZh66kyHLi4EUdv7sL9n24y0Md+vo3m3lpsaM1FWLonnPyXIDLbG9ZuJvjsi79Dx2A+5s4XrbrWJ3MmCW+aBll0fkwHutwL4MU9EuXkIiBpB+TW8278519+ivk6k+P0oGQ3VlOgDnT6ffDZFTx+M8RCHNq7nYDvHGjC8e/3ofXaNuzrWcs2clh/OAdrmjJRui2RQZ+yIgTJlUGIL1Ew6AOTXOEVYQevCDsGPg84Ac+DTkMd/AS83L3n4ZcDPwn+KcQ7+TCyFMEi0DW59tPt46ZrLHoD6lx9An+qdtF8WGblaozAJFcU1MZie2cFTt5qZILqoct1WNuchbgiBWw9TWFsrQs90wWTQP9i0WesSw71nue3mNI0+ElL04Qm33Ja3Q418t1j1XXIEbaeKsOWjmJs6ShG7YlCbD6ajw2tudjQmou6k0XYf3497jy9zEB/+tsIdp5ZgbIdiYjI8mLb8prZ60s+nICaCejqIJeDTr+re71ctJs9Z5bEmqtrck/1wGTdedC/WPQZU4T1zRYibWUog3nkxS2M/XybVQ0+fDUoic8fvhr8P/t/9cHZ/+dvH4M35WE3wMCa8gt29P6fvL7uf9eK4v8tS7L/NyxM+181N+F/6dSY/yVTov+nNQf8T6rz/R9d6gG/PdU32Qae2ZHPeYc13dH77ciZGxZHyLU9cmaHZXjkQTtianrkPjysKa+ghXsgT05d4r+6kTzO/j2+TE/Mza3YbnxBzvTII+swt+paKf/3T7X7XzY95v/SPZP/7zm3/v+Ja3v/n7i29//Bi1v+bzy66H/v6jJ4Vyu6xP1/4YRIyGyJnz4E++jDZ0jMXLX+Gzmo/9e1Uv6va6UMv80WVsDCztmHzYggX3OF3upB9jPMj4TOt4fV+OhXSQMAboC0nRvKrGgAAAAASUVORK5CYII=') !important; */\r\n /*\r\n width: 250px;\r\n height: 61px;\r\n font-size: 0px;*/\r\n }" - }, - { - "urls": [], - "urlPrefixes": [], - "domains": [], - "regexps": [ - "^https?://meta.worldbuilding.stackexchange.com.*" - ], - "code": "#hlogo a {\r\n /* background-image: url(http://StylishThemes.github.io/StackOverflow-Dark/images/meta-logo.png) !important; */\r\n /* background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAAA9CAMAAACdmqWRAAAAk1BMVEUAAAD///////////////////////////////////////////////////+MiYaLiISJhoKKh4OHhICIhYGLh4SMiISKh4OHhYGIg34IAAAUAAAHAAAOAACLiokKAAARAACMh4JsAACDg4OHgnyBfnqLiomMioeOiIQpAABfAABmAAAbAABXAABOAAA/AAA0AABIAADInvqVAAAAIXRSTlMA6RGs1cFmVSJ3M5mIRCYRSeafz4q6elwzQfEXp29ix2ZyYf0pAAAIQElEQVRo3uSXW27iQBBF7wr8woABCyhhQT9s4/2vbqguFzFkPiZGDSPlfCSNZaSc1O3qavwjybFI8Fso8/xyyfBbWF5urPAGavwHlKy7RHw6avF5MtbNER9HtMFnyFIo1YVJEZsNEe3wCZLlqYSSBt0KsdnedPEJjqcbX3456x4RG09k8QGqE5M/tuYSsTH0oVZVBN8CI6v3tOaeqMMnSPPgm72tNavugI+QSZxTBJILkyAG+x2UjqjHFztjtngT5TTOKfeqGGPktSWi1khf5vUVir/JvzHci2mcl7Nbs2mpx64b//DNYNlOaUno+UXnjB/cDQuEbwgbvIXqFJA4F6xbzJB1XLGaGAsYtRMsP9xZIvKAde46GMfwCSy8rb4a5yWY47zWbIkZSGivquDB8Ecj/4MW8MaTdVdzA3D8tY0nBtHI0u9xDhHO5o2Rrfo5Fn+u2CgepA7gReuuYMwYgTaqbtI06+nHUyB5oTXXLpR1i7142tqMuR41N2NwjVTbiG4/vtNH1S2apllU01GSWfBybmvuubSSa8ks5PfEpZbt/KyrhXeIRNYEigTKMviWL9zwe+1MrUbWapi7sbobibfu5aluTUO8KXrRjNy10lOg0hv+PF2jugNUVxYM/zTPuuis7cONsI+nm919F2t9pHE+zhgjtelsVdfrope7vHCFf9RVvPcS/FiscxUuquldoZx1w9d+BLXch8KpLjGmDm8Z803XW9L9Ho101ShFOrkrVAjVTfBTDnrqtFNvo9UdoDzrDlz3PvqYkRTqm68lzoF0tcqSFD9mR+TV0kG3rNFF+5d9Pnm9jqv7vIUzjXOZYiaO7KNuiLDWz0LYPOrqTj9IACKzbhg9lPLTosJs7JPu/j5EetLtDEM2+Kuutij/Fl2kRaOsUJV4gY7sPcOSbu3VeBA/iG4PRldDLN2kWCWYUH0lOsULeD04nejKUFHfE9tpwTnMnRU5PawMxdJdn8/nvFgn3w+lAq/Qt6K7G5VwGGcpTXPvvRy+96vRwcLKABKwiEBxFhaiPDmUUrzClaurlp4f6CKslRY6PNs/3JjZbqswEIbBgxcMBqchjdQjcnGkSCkKUd//6TpjM1Vw94Qu6n/D8A8Z+4sX4uDI0rv5aw+8K2Jl5FvfPr2UttdUPeCZ/TCMBz7X3+1CwLxs83n/NN2y/0AGjfzSahiVtY5L2V81lXdISwqzk0/6M95/p+Nw/4A3/P/UPR6NTxgch2G8oytvbIuq9bfrBJiX8jI6nMbxOI7DOGn34d8p/F0srWZ78wwZt+W/LERezUY4++tqm7N5fbNERWtFtqiEVkqLzFhrTfYp/Ue9sZS3/MQ1ynO9KG2ZowohAC/qEty2adpnyLSU21+IG2gZt7wEt9/v96v1puv63p+TU/Q6roBCfz+uKRbBZUXyTdd737yDW+Q/gOsIVlmbXY7b7V9W9wtxFQ0tBZfjbl7B7b8MVxgjpgjFLoZpnm2yhHgDV2Cew7M6M49Hd/VRXGGsNWIKi1xxYfbnDya4jCN0JYtC1hZjUwGAjtkaQ0WR43wQ2c7WaIE2riZc7dwc1yiQhQRFTWpAiViRazvyDMPQ3ux933Wb9Tm5T3E10EYhKy0yUUlsF6CixmqJPnbQMJcKRmVnuCVAJMwnldgp6nQV0pYshx+e5SNWVUSHU8lW5eRkS8d1uGIEr0OUTtWEvElwS2ICKl1nBgKhBGwMIwnhPrSCOQwDsI64vOoUd58Ue6vpKp5WJUaIxKqT50G/iEsdYB+H/bH1Mkt6GwSCsFlmYbtE7n/IBJq2iP9SOaoKL4YBjfpjRgOGQJ5Za8sFawHz/etmUSweY6xd/ExmDTL+dNxykB2PrB59pNDiG9dODTkhHhUHixGrb/7UuyBIxJWUQ3KXvAaSDtwocImpuEIp2yO22OHrGW4Ljcm6S5ViaL5/kUQ6f5DTEdFFBFrEUyFIjXFhNQQzUVJFIHpEioRE0SVG7z5dIrSR3y7Ppu7R+6LC2OER2WzYB8L8umkn7vSv95WZG7A2u/+ozFXWe88vq0PD2NmskOZIaa6cWJi4P4jKhsFWFkTbsBTgDYnzCPeVQv+CK6EsmfUT1yUIUgAbzaBkpzioX/NMoil+cOIWlzDstbchAVfhyZ7gstb4F1wIjh+4U5ptJ4wV4lgRnIaRbxxZLSyR33HZgau0t3R57DLfVuH7CS5fkCU1jQcuDlIKLFNQ/sDVnbc/cUNl0i47Uvxs+hhX9r3a58pR2GuvJ7g8TgOanbhOa7jBlZA1h36Du4qTJXj9H7iwaJpbXOdcQko/q8y8LdmErsDd75URj2T+xF0gBWjHt4sU4w6cg1bfLT7BxW3i8NhXZRD6fo77IhZwITvX0z5C8A9c1OsUrwIFcPScVyZYoZjtOy4LFHuHx4GA0+Vj3PMEJq7taBHXYT9wO5ZdJ74yKAnuKI7zA+7GP+DSVH/4RhZV+C7PcSOocCTxlD1xHW7bZQCuEaqy3pVa26XCKI5Ks3n0IcHucLlJMjyCSMxNyI2YYpt5fSPM97ZpW6p/3Z4S0rOSJzboqjk0n2MTIy4yLG02NnEeaRTHcGRZNrvBRQ9MAGdrh5PxJpfXM1xQ5KZms+S1COHSy6Kc9iJHduWuBeuOf0TolfM+j9YZAGJwwT0uJoDr6PHKyJiyImLRE1zwJqrokfpDvt6WizA7BZa57sKNsouvbGmVDJXi+PS14B735Y0k3jOFHRvYL/LxEBd6q/bWujkNbmrTPsofs/rLlDXaemsFA1UnlWo9ZiFtr1FGGv5667oXmO7H6EPtrcfwHJRNBWyuytH404Wn33iFQHtUqeywAAAAAElFTkSuQmCC') !important; */\r\n }" - } - ], - "name": "StackExchange Dark", - "originalDigest": "ce78ad218ea4e735ac86babbd088cf6709dfa384", - "id": 9 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/118568.json", - "md5Url": "https://update.userstyles.org/118568.md5", - "url": "http://userstyles.org/styles/118568", - "originalMd5": "badf151eede9eb53f25c70bab174e664", - "installDate": 1574150561677, - "sections": [ - { - "urls": [], - "urlPrefixes": [], - "domains": [], - "regexps": [ - "https?://([^:]+)(:[0-9]+)?/transmission/web/.*" - ], - "code": "@namespace url(http://www.w3.org/1999/xhtml);\n* {\r\n background-color: transparent !important;\r\n color: inherit !important;\r\n border-color: var(--border-color) !important;\r\n }\r\n \r\n body, div.dialog_container div.dialog_window, .inspector-tab, div#jqContextMenu ul, .ui-widget-content {\r\n background-color: var(--background-color) !important;\r\n color: var(--foreground-color) !important;\r\n }\r\n \r\n div#toolbar, #statusbar, div.torrent_footer, .ui-widget-header {\r\n background-color: var(--background-color) !important;\r\n background-image: var(--gradient-header) !important;\r\n }\r\n\r\n div.dialog_container div.dialog_window a {\r\n background-color: var(--background-color) !important;\r\n background-image: var(--gradient-button) !important;\r\n }\r\n div.dialog_container div.dialog_window a:hover, div.dialog_container div.dialog_window a:active {\r\n background-color: var(--background-color) !important;\r\n background-image: var(--gradient-button-selected);\r\n border-color: var(--border-color-selected) !important;\r\n }\r\n\r\n .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {\r\n background-color: var(--background-color) !important;\r\n background-image: var(--gradient-tab);\r\n }\r\n .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {\r\n background-color: var(--background-color) !important;\r\n background-image: var(--gradient-tab-selected) !important;\r\n border-color: var(--border-color-selected) !important;\r\n }\r\n \r\n ul {\r\n list-style: none;\r\n }\r\n \r\n ul.torrent_list li.torrent.even {\r\n background-color: rgba(255, 255, 255, 0.1) !important;\r\n }\r\n ul.torrent_list li.torrent.selected, ul.torrent_list li.torrent.selected.even, div#jqContextMenu ul li:hover {\r\n color: var(--foreground-color-selected) !important;\r\n border-color: var(--border-color-selected) !important;\r\n }\r\n \r\n\r\n \r\n div.inspector-tab.selected { border-color: var(--border-color-selected) !important; }\r\n #inspector-tab-files { background-image: var(--tab-files), var(--gradient-button) !important; }\r\n #inspector-tab-files.selected { background-image: var(--tab-files), var(--gradient-button-selected) !important; }\r\n #inspector-tab-info { background-image: var(--tab-info), var(--gradient-button) !important; }\r\n #inspector-tab-info.selected { background-image: var(--tab-info), var(--gradient-button-selected) !important; }\r\n #inspector-tab-peers { background-image: var(--tab-peers), var(--gradient-button) !important; }\r\n #inspector-tab-peers.selected { background-image: var(--tab-peers), var(--gradient-button-selected) !important; }\r\n #inspector-tab-trackers { background-image: var(--tab-trackers), var(--gradient-button) !important; }\r\n #inspector-tab-trackers.selected { background-image: var(--tab-trackers), var(--gradient-button-selected) !important; }\r\n\r\n div.torrent_footer div.selected { border-color: var(--border-color-selected) !important; }\r\n div.torrent_footer div.main_container { display: none; }\r\n #prefs-button { background-image: var(--button-prefs), var(--gradient-button) !important; }\r\n #turtle-button { background-image: var(--button-turtle), var(--gradient-button) !important; }\r\n #turtle-button.selected { background-image: var(--button-turtle), var(--gradient-button-selected) !important; }\r\n #compact-button { background-image: var(--button-compact), var(--gradient-button) !important; }\r\n #compact-button.selected { background-image: var(--button-compact), var(--gradient-button-selected) !important; }\r\n\r\n div.file-priority-radiobox > div.selected { border-color: var(--border-color-selected) !important; }\r\n div.file-priority-radiobox > div.low { background-image: var(--priority-low), var(--gradient-button) !important; }\r\n div.file-priority-radiobox > div.low.selected { background-image: var(--priority-low), var(--gradient-button-selected) !important; }\r\n div.file-priority-radiobox > div.normal { background-image: var(--priority-normal), var(--gradient-button) !important; }\r\n div.file-priority-radiobox > div.normal.selected { background-image: var(--priority-normal), var(--gradient-button-selected) !important; }\r\n div.file-priority-radiobox > div.high { background-image: var(--priority-high), var(--gradient-button) !important; }\r\n div.file-priority-radiobox > div.high.selected { background-image: var(--priority-high), var(--gradient-button-selected) !important; }\r\n \r\n :root {\r\n --background-color: #333;\r\n --border-color: #222;\r\n --border-color-selected: #666;\r\n --foreground-color: rgba(255, 255, 255, 0.8);\r\n --foreground-color-selected: rgba(0, 255, 0, 0.8);\r\n --gradient-to-top: linear-gradient(to top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1));\r\n --gradient-to-bottom: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1));\r\n --gradient-selected: linear-gradient(to right, rgba(0, 255, 0, 0.2), rgba(0, 255, 0, 0), rgba(0, 255, 0, 0.2));\r\n\r\n --gradient-header: var(--gradient-to-top);\r\n --gradient-button: var(--gradient-to-top);\r\n --gradient-button-selected: var(--gradient-to-top), var(--gradient-selected);\r\n --gradient-button-selected: var(--gradient-to-bottom);\r\n --gradient-tab: var(--gradient-to-bottom);\r\n --gradient-tab-selected: var(--gradient-to-top);\r\n\r\n /* Images */\r\n --priority-high: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAwUlEQVQokcXQMYoCMBAF0I9mqmRIkUkRkibpkiY38Bja7RU8hMcQPIedeCdLYWxUlhXBRvbDr+bBMAP8S+achznn4RO77L3vxhg6xtDe+w7A8h1e1Fr3rTX93VrrHsDiRaeUTqUUzTlrzvnnXi2laErp9ITMHEIIRxFREbnEGNePWYxxLSIXEdEQwpGZA6y1Z2ZW59zVe7/5u9l7v3HOXZlZrbVnENGWiNQYs3p3nDFmRURKRFsAMADaBx9sd/vl3ACk0StFsQlurQAAAABJRU5ErkJggg==\");\r\n --priority-normal: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAASklEQVQokWNgGIlAVFRURVZW9qmMjMwDfFhWVvadiIiIFIOEhISWpKTkfyKxPIOIiAiviIhIk4iISD0+LCoq2i4oKMg/0CFCDQAAK2Qigs7t83QAAAAASUVORK5CYII=\");\r\n --priority-low: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAwUlEQVQokb3QQQoCMQwF0FBn064KQlMoE4rQQKG5gseY2XkFDzHHGPAc7sQ7uRTiRl0Myqz0QzbhEZIA/COdiOzW0NN00Fo7iojWWvffcK11LyLaWjsCM1+ZWUsp95zzuMQ557GUcmdmZeYrpJS2RHQmIu37/kZEwwsT0fDsKRGdU0rb9yREvCCixhg1hHAIIRxijIqIioiXT6sa7/3svddFzQBgvt23cc5N1lq11qpzbgKAzdoHwRhzMsacVuFP8gCN6y5Xkv6lMgAAAABJRU5ErkJggg==\");\r\n\r\n --button-turtle: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAAmklEQVQokY3PPQoCUQwE4E9sFEsbK8FOEES0trT0FLZ2Woi9XkTY4l3DO1haCHoJwWfzFtafXR0IhGQyk+ETLayQ4YDlF04pRrgjvtUZzQKvgc77cTuRH18EIq4YYFaYbYsCl4rjMuE9dHH64Z7XDTvM0cud+9jg+Id7M8ZYewkeQqinNkukBcYYpszTlD8ms1IETCr26/T6C54Bx0EzYFeoXQAAAABJRU5ErkJggg==\");\r\n --button-prefs: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAA7klEQVQokZWP0YmEMBCG5yEkEMEwQsDgihIhAcEYK70SUsKVsCWkhCvhSph7MYcPruv+8MEQ5mPyA9xIjDFt20Yxxp87+/9ZliWFECiEQOu6preCtVaVeZ5n2vn96CoAgHMue+/Je0/OubS/Je/9dQVrrbLWpmma6IxLeRiGPI4jveB1/8fjQUf6vk9d1+Uyn0qIqIwx2RhDBzIiqlPhKGqts9aaCm3bXncrIiLmpmmogIj5rQgAqq7rXNc1HcgAcP1VAFBSylxVFRWklLdE4JwnIQQJIZ5CCOKc3xMBABhjX4wx2rkvHpIA4PtT8Q/UuVtO1WtEUAAAAABJRU5ErkJggg==\");\r\n --button-compact: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAAbUlEQVQokcWQMQrAMAwD5UAwmUoGZzDK/5/nJ7hLU9op3Sq4RXAaBJI559xCMt19AsBySCbcPb/Sez8AvByYWYwxcoeZBa4s59n9GFWN1lruUNUAcDwdVQ3UWvMra+DViUiUUnKHiNyHLUdE4gRg62K+ejzZwAAAAABJRU5ErkJggg==\");\r\n\r\n --tab-files: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABBklEQVQ4jdWTsWqFMBiFfxwqjh26Xejz6hv8PoZ3EDcXQUTQIQYhLi5ZXFxcXE6HxlAsarx06YFvzEc4JyH67/GYGXEc/+L5fCoi8u4KfWbGuq6WrusAAGVZIkmS29KAmbEsi6VtW2xhZhDR223hPM+Wuq4tRhjcEkZRBCEEhBAYhgHTNFlchIcjZFmGpmnQ9z201tBaOwlPR0jTFFVVYRxHjOPoJLwcoSgKKKWglHIXno2Q5zmklJBSugt/Fr8fIQxDMLPFSbiVvscIPonoYfggIv9SuJW+xwjfza0CIzv9KQEz29L3vPSQmdmWvudl4Rl3hT59F/044HKEfTxzIDjgcoQ/zxc9wNC8RsMJhQAAAABJRU5ErkJggg==\");\r\n --tab-info: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAClElEQVQ4jdWUS0hUYRiGP4UxBV0JgpJLL8d/lHFOUYFCNEaLMogSBN1ZE4JQeYsghjHJhamImhQKKTahgVcKpCIvVLSwclGjjgkFSV4WXtIiCp4W58jozJi07IcHzvf+//fyfuccfpH/dqV2Tyar4eU2NbLpVS9AvQA1sulVw8ttqd2Tyf/iFaYGl9ptI3B2Ai55oeqjwSWvoR0YAzW41C4iYXuZhauhjanj41D5Hq57Q1PxHnLGQA1tTIlI+O7JuhbaHU+g7B2Ub+PmB/j+G8aX/FrZW3A8BdW1EDppUvWYltEDF19ByeuduN4Zhs+/7tSdLyGjB5Kqx7SgUbXWxV5HP5wfDebWJFx9HaxfGAVHH2iti72Bo1tUy/r0mUEoHPbjfAaf1gFg8xecewQn+iH7IRzuBv0B2DpBtaxPi4hlu2GkaoKzfXCu30/PFLS8MQy//QS9Ixj7PVBNICKR2w2jVC2cvA+nPH5yOqHhlWE4NAP63WDsd0DVgohE7TBMc63NZLeCow2OtcGh26A3w8QXw7DssVEHYquHNNfaTKBhpFY6P5B5A440gl7nZ2s5e6B+ZOeeXgcZbtBK5wcCR7Yk5jYetJaDvRr0GoOjDbD+wzCc+GzUW3t6DWRWgbUcEk83Hwj8KOEiEqM557rSS8HuAt1tkNsIzg5/vYXdBelXQHPOdYlITOBvIyISISKxWtGqz1oM9krQr4UmswKsxaAVrfpEJNbsDVph5ouNSynweaxFkO4EWwnYLxvYSgzNWgQpBT6PiMSZPbteEuHmgdgE3Z2VkufzpOWvzKpCUIWQlr8ym5Ln8yTo7iwzWVSoUUMljRCRaLMpXkT2m8SbWrR5Zs/rKzCtRUT2mUmizGfL31L9ARu1bU1qe+H9AAAAAElFTkSuQmCC\");\r\n --tab-peers: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABZUlEQVQ4je2UMWrDMBhGf0JJ3EUpNTJElrEhKgYPxuAWgfFgAjbEYIgne/It0qX3yNBT5ATJJQqla+g9vg5NoSEdEs198CZJD/0gRPTPb6qqcpqm2TdNg6P7qqoc096orutd27YYhgHDMKBtW9R1vSOikUlwXJYluq5D3/fo+x5d16EsSxDR2CR4WxQFVqvViUVRgIhujYJ5nmO5XJ6Y57l5UGuNxWJxotbaPJgkyYfWGlmWIcsyaK2RJMmHaXAShuE6jmOkaYo0TRHHMcIwXBPRxCR4Q0R3SqltFEWIoghKqS0R3R3XrkNK+eD7/ksQBO/z+RxKKQRB8On7/qvneU8XRTjnSgjxLIR4c10XUkp4nneilBKu60IIcRBCbGaz2eOfMdu2nzjn4JzDcZyL/Nlv2/b5jRljG8YYptPpVTLGwBjbnAUtyzpYlgVDD39NfU9ELhHJK3WPZ88Y0/eDNdHos7iIL1k4pt0kxY1cAAAAAElFTkSuQmCC\");\r\n --tab-trackers: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACC0lEQVQ4jdWSsWsiQRTGvyoEIsmUuS7/QRbOImwRbDRbpNhiFyZYLOyyLKwh4hVrJdhsY5ohsOfYbGVlY2ezZf4ELYVUIW2IheV3jQaJcpru7oMHj5lvfu/NmwH+e9m2Xcmy7CXLshfbtisHHxyAP3bleZ6/z+dzzudz5nn+vs//qd/gz135aDRaFEXBoig4Go0W+/yf0uD1E3i6yssZeA4A4/H4fjKZvE0mk7fxeHwPABl4rsEyADyBpxq83gL2wcq6Uh+80OBdFzwiKUherUJ0wSMN3vXBi3V3fbCya4ZnGmx2weMV9EaDl6ZpGr1ej71ej6ZpGhq87IM3ANAFjzXYHIBnW8AV1B2A3uZakiRDpRSVUkySZPjF7w1AdydsY5ZKg81H8EQIITqdziIMw2UYhstOp7MQQohH8ESDTQ2qv8IAIANLGvyVgSUppR/HMdvt9nO73X6O45hSSn/Tsxf45bozx3GYpinTNKXjOEySZPYtyFqGYRhxHNPzvFeSFZIVz/Ne4zimYRjGt4G+7w+llGw0Gmy1Wmy1Wmw0GpRS0vf94X7ChoQQIoqiD8uyltPp9Hbd4XQ6vbUsaxlF0YcQQhwMrNVqvpSSrusyiiIGQcAgCBhFEV3XpZSStVrNPxhYr9dn1WqVSqmHdXfrUEo9VKtV1uv1wx+HZHkF2PoWJEurvfLBwH9KfwCL+zyAGn9UVAAAAABJRU5ErkJggg==\");\r\n }" - } - ], - "name": "Transmission dark theme", - "originalDigest": "870ff0bb623012a14a3ff083756fb0b94f6668a0", - "id": 11 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/157126.json?ik-colorPallets=ik-navyblue&ik-frosted=ik-froston&ik-watchedoverlay=ik-watchedon&ik-searchbox=ik-searchboxcenter", - "md5Url": "https://update.userstyles.org/157126.md5", - "url": "http://userstyles.org/styles/157126", - "originalMd5": "662b85c8aea5f0cc483285ec80705517", - "installDate": 1575341578500, - "sections": [ - { - "code": "/*\n * Name: CleanTube v2\n * Author: Sardorbek Usmonov\n * Version: 2.0.0\n*/\n/* ============ COLOR PALETTE ============ */\n:root {\n --blue-day: #306AF2;\n --blue-night: #4789E5;\n --red-day: #F8333C;\n --red-night: #ee353e;\n /* Day */\n --day-darker: #7d7d7d;\n --day-dark: #B7B7B7;\n --day-light: #DDDDDD;\n --day-lighter: #EAEAEA;\n --day-lightest: #FFFFFF;\n /* Night */\n --night-darkest: #1E2029;\n --night-darker: #282a36;\n --night-dark: #373844;\n --night-light: ##6272a4;\n --night-lighter: #e2e2dc\n}\n/* Cream White Theme */\nhtml:not([style-scope]):not(.style-scope) {\n --yt-spec-brand-background-primary: var(--day-lightest) !important;\n}\nytd-masthead, app-toolbar.ytd-c4-tabbed-header-renderer {\n box-shadow: var(--masterhead-shadow) !important;\n}\n\n/* Day */\nhtml:not([style-scope]):not(.style-scope) {\n /* CUSTOM */\n --watched-bg-color: rgba(255, 255, 255, .45);\n --masterhead-shadow: 0 5px 12px 5px rgba(228, 9, 9, .07), 0 0 0px rgba(0, 0, 0, 0.25);\n /* REMAPPED */\n --yt-spec-brand-background-primary: var(--day-lighter);\n --yt-main-app-background: var(--day-lightest);\n --yt-app-background: var(--day-lightest);\n --yt-main-app-background-tmp: var(--day-lightest);\n --yt-spec-general-background-b: var(--day-lightest);\n --yt-spec-general-background-a: var(--day-lightest);\n --yt-sidebar-background: var(--day-lightest);\n --yt-guide-background: var(--day-lightest);\n --yt-dialog-background: var(--day-lightest);\n --yt-live-chat-background-color: var(--day-lightest);\n --paper-listbox-background-color: var(--day-lightest);\n --yt-spec-brand-background-solid: var(--day-lightest);\n --darker-bg-color: var(--day-lightest);\n --yt-live-chat-vem-background-color: var(--day-lighter);\n --yt-std-surface-300: var(--day-lighter);\n --yt-simple-menu-header-background: var(--day-lighter);\n --yt-featured-channel-title-text-color: var(--day-darker);\n --ytd-metadata-line-color: var(--day-darker);\n --yt-spec-text-disabled: var(--day-darker);\n --yt-spec-text-primary: var(--night-darkest);\n --video-title-text-color: var(--night-darker);\n --yt-expand-color: var(--day-darker);\n --yt-spec-text-secondary: var(--day-darker);\n --link-text-color: var(--day-darker);\n --ytd-badge-icon-color: var(--day-darker);\n --ytd-owner-badge-color: var(--day-darker);\n --yt-spec-call-to-action: var(--day-darker);\n --badge-bg: var(--red-day);\n --badge-color: var(--day-lightest);\n --comment-op-bg-color: var(--day-darker);\n --iron-icon-fill-color: var(--day-darker);\n --comment-op-check-color: var(--day-lightest);\n --yt-button-color: var(--day-darker);\n --yt-spec-brand-button-background: var(--red-day);\n --searchbox-focus-color: var(--red-day);\n --searchresults-bg-color: var(--day-lightest);\n --searchresults-text-color: var(--day-darker);\n --searchresults-text-bg-hovered: var(--day-light);\n --searchbox-placeholder-color: var(--day-darker);\n --searchresults-searched-text-color: var(--blue-day);\n --paper-toggle-button-checked-button-color: var(--blue-day);\n --scrollbar-background: var(--day-lightest);\n --scrollbar-color: var(--day-light);\n --scrollbar-hover: var(--day-dark);\n --scrollbar-active: var(--day-darker);\n --sidepanel-menu-active: rgb(255, 0, 0, .25);\n --sidepanel-menu-active-color: red;\n --yt-spec-10-percent-layer: var(--day-light);\n --yt-spec-icon-disabled: var(--day-light);\n --yt-spec-icon-inactive: var(--day-darker);\n --skeleton-bg-color: var(--day-lighter);\n --paper-toggle-button-unchecked-bar: var(--day-dark);\n --paper-toggle-button-unchecked-bar-color: var(--paper-toggle-button-unchecked-bar);\n --url-color: var(--blue-day);\n}\n\n/* Night */\nhtml[dark]:not([style-scope]):not(.style-scope), [dark]:not([style-scope]):not(.style-scope) {\n /* CUSTOM */\n --watched-bg-color: rgba(0, 0, 0, .65);\n --masterhead-shadow: 0 5px 12px 5px rgba(36, 36, 36, .07), 0 0 0px rgba(0, 0, 0, 0.25);\n /* REMAPPED */\n --yt-spec-brand-background-primary: var(--night-darker) !important;\n --yt-main-app-background: var(--night-darkest);\n --yt-app-background: var(--night-darkest);\n --yt-main-app-background-tmp: var(--night-darkest);\n --yt-spec-general-background-b: var(--night-darkest);\n --yt-spec-general-background-a: var(--night-darkest);\n --yt-sidebar-background: var(--night-darkest);\n --yt-guide-background: var(--night-darkest);\n --yt-dialog-background: var(--night-darkest);\n --yt-live-chat-background-color: var(--night-darkest);\n --paper-listbox-background-color: var(--night-darkest);\n --yt-spec-brand-background-solid: var(--night-darkest);\n --darker-bg-color: var(--night-darkest);\n --yt-live-chat-vem-background-color: var(--night-darker);\n --yt-std-surface-300: var(--night-darker);\n --yt-simple-menu-header-background: var(--night-darker);\n --yt-featured-channel-title-text-color: var(--night-lighter);\n --ytd-metadata-line-color: var(--night-lighter);\n --yt-spec-text-disabled: var(--night-lighter);\n --yt-spec-text-primary: var(--night-lighter);\n --video-title-text-color: var(--day-lightest);\n --yt-expand-color: var(--night-lighter);\n --link-text-color: var(--night-lighter);\n --yt-spec-text-secondary: var(--night-lighter);\n --ytd-badge-icon-color: var(--night-lighter);\n --ytd-owner-badge-color: var(--night-lighter);\n --yt-spec-call-to-action: var(--night-lighter);\n --badge-bg: var(--red-night);\n --badge-color: var(--day-lighter);\n --comment-op-bg-color: var(--night-dark);\n --iron-icon-fill-color: var(--night-lighter);\n --comment-op-check-color: var(--day-lightest);\n --yt-button-color: var(--night-lighter);\n --yt-spec-brand-button-background: var(--red-night);\n --searchbox-focus-color: var(--red-night);\n --searchresults-bg-color: var(--night-darker);\n --searchresults-text-color: var(--night-lighter);\n --searchresults-text-bg-hovered: var(--night-dark);\n --searchbox-placeholder-color: var(--night-lighter);\n --searchresults-searched-text-color: var(--blue-night);\n --paper-toggle-button-checked-button-color: var(--blue-night);\n --scrollbar-background: var(--night-darkest);\n --scrollbar-color: var(--night-dark);\n --scrollbar-hover: var(--night-light);\n --scrollbar-active: var(--night-lighter);\n --sidepanel-menu-active: var(--night-dark);\n --sidepanel-menu-active-color: var(--red-night);\n --yt-spec-10-percent-layer: var(--night-dark);\n --yt-spec-icon-disabled: var(--night-dark);\n --yt-spec-icon-inactive: var(--night-lighter);\n --skeleton-bg-color: var(--night-darker);\n --paper-toggle-button-unchecked-bar: var(--night-dark);\n --paper-toggle-button-unchecked-bar-color: var(--paper-toggle-button-unchecked-bar);\n --url-color: var(--blue-night);\n}\n\n/* ============ FONTS ============ */\n@font-face {\n font-family: Google Sans;\n font-style: normal;\n font-weight: 400;\n src: url(https://fonts.gstatic.com/s/googlesans/v14/4UaGrENHsxJlGDuGo1OIlL3Owp4.woff2);\n}\n\n@font-face {\n font-family: Google Sans;\n font-style: normal;\n font-weight: 500;\n src: url(https://fonts.gstatic.com/s/googlesans/v14/4UabrENHsxJlGDuGo1OIlLU94YtzCwY.woff2);\n}\n\n/* ============ BASE CODE ============ */\nbody, html, #search-input.ytd-searchbox-spt input {\n font-family: 'Google Sans', Roboto, sans-serif;\n font-weight: 400;\n}\n\nb {\n font-family: 'Google Sans', Roboto, sans-serif !important;\n font-weight: 500 !important;\n}\n\nyt-formatted-string[has-link-only_]:not([force-default-style]) a.yt-simple-endpoint.yt-formatted-string, #description-text.ytd-video-renderer, .content.ytd-channel-video-player-renderer, .deemphasize.yt-formatted-string, #caption.ytd-toggle-item-renderer, #label.ytd-pinned-comment-badge-renderer {\n color: var(--link-text-color) !important;\n}\n\nyt-icon.ytd-pinned-comment-badge-renderer {\n fill: var(--link-text-color) !important;\n}\n\n#tabs-inner-container.ytd-c4-tabbed-header-renderer, #channel-header.ytd-c4-tabbed-header-renderer, #container #section, ytd-multi-page-menu-renderer {\n background: var(--darker-bg-color) !important;\n}\n\n#sections.ytd-multi-page-menu-renderer > ytd-background-promo-renderer.ytd-multi-page-menu-renderer {\n background: var(--darker-bg-color);\n margin-bottom: none;\n}\n\npaper-button.ytd-subscribe-button-renderer .deemphasize.yt-formatted-string {\n color: white !important;\n}\n\npaper-button.ytd-subscribe-button-renderer[subscribed] .deemphasize.yt-formatted-string {\n color: var(--yt-spec-text-secondary) !important;\n}\n\n#video-title.yt-simple-endpoint.ytd-grid-video-renderer, h3.ytd-compact-video-renderer, ytd-compact-radio-renderer.use-ellipsis #video-title.ytd-compact-radio-renderer, #video-title.ytd-playlist-panel-video-renderer, .title.ytd-video-primary-info-renderer {\n color: var(--video-title-text-color) !important;\n}\n\nytd-live-chat-frame#chat, #search-icon-legacy.ytd-searchbox:hover {\n border: none;\n box-shadow: none;\n}\n\nytd-author-comment-badge-renderer {\n background: var(--comment-op-bg-color);\n}\n\nytd-author-comment-badge-renderer yt-icon {\n fill: var(--comment-op-check-color);\n}\n\nytd-guide-entry-renderer[active] {\n background-color: var(--sidepanel-menu-active);\n border-radius: 0 25px 25px 0;\n}\n\nytd-guide-entry-renderer[active] .guide-icon.ytd-guide-entry-renderer, ytd-guide-entry-renderer[active] .title.ytd-guide-entry-renderer {\n fill: var(--sidepanel-menu-active-color);\n color: var(--sidepanel-menu-active-color);\n}\n\napp-toolbar.ytd-c4-tabbed-header-renderer {\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15), 0 0 0px rgba(0, 0, 0, 0.25);\n}\n\nytd-sentiment-bar-renderer[activated_] #like-bar.ytd-sentiment-bar-renderer {\n background: var(--blue-day);\n}\n\nytd-toggle-button-renderer.style-default-active[is-icon-button], ytd-toggle-button-renderer.style-default-active[is-icon-button] yt-icon {\n color: var(--blue-day);\n fill: var(--blue-day);\n}\n\n#home-page-skeleton .skeleton-bg-color, .masthead-skeleton-icon, .watch-skeleton .skeleton-bg-color, html[dark] #home-page-skeleton .skeleton-bg-color, html[dark] .masthead-skeleton-icon, html[dark] .watch-skeleton .skeleton-bg-color {\n background-color: var(--skeleton-bg-color);\n}\n\npaper-toggle-button[checked]:not([disabled]) .toggle-bar.paper-toggle-button {\n background-color: var(--paper-toggle-button-unchecked-bar) !important;\n}\n\n#expander yt-formatted-string[has-link-only_]:not([force-default-style]) a.yt-simple-endpoint.yt-formatted-string, #description a.yt-simple-endpoint.yt-formatted-string, #expander a.yt-simple-endpoint.yt-formatted-string {\n color: var(--url-color) !important;\n}\n\n/* ============ SEARCHBOX ============ */\n#search-icon-legacy.ytd-searchbox, #container.ytd-searchbox {\n border: none;\n background: transparent !important;\n}\n\n#container.ytd-searchbox input.ytd-searchbox::placeholder, input#search::placeholder {\n color: var(--searchbox-placeholder-color);\n}\n\nytd-searchbox[has-focus] #container.ytd-searchbox {\n border: none;\n border-bottom: var(--searchbox-focus-color) solid 1px;\n box-shadow: none;\n transition: border-bottom 350ms ease-in-out;\n -webkit-transition: border-bottom 350ms ease-in-out;\n -o-transition: border-bottom 350ms ease-in-out;\n}\n\n#container.ytd-searchbox {\n box-shadow: none !important;\n}\n\n/* ============ SEARCHRESULTS ============ */\n.sbdd_b, .sbsb_a, .sbfl_b {\n background: var(--searchresults-bg-color);\n border: none;\n}\n\n.gsfs, .sbfl_a {\n color: var(--searchresults-text-color);\n}\n\n.sbsb_d {\n background: var(--searchresults-text-bg-color-hovered);\n}\n\n.sbpqs_a {\n color: var(--searchresults-searched-text-color);\n}\n\n.sbdd_a {\n top: 50px !important;\n z-index: 9999 !important;\n}\n\n.sbdd_b {\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15), 0 0 0px rgba(0, 0, 0, 0.25);\n}\n\n/* ============ WATCHED BADGE ============ */\nytd-thumbnail-overlay-toggle-button-renderer, ytd-thumbnail-overlay-time-status-renderer[overlay-style=DEFAULT] {\n z-index: 2;\n}\n\nytd-thumbnail-overlay-resume-playback-renderer, #progress.ytd-thumbnail-overlay-resume-playback-renderer {\n background-color: var(--watched-bg-color);\n height: 100%;\n width: 100%;\n}\n\n#progress.ytd-thumbnail-overlay-resume-playback-renderer:after {\n content: 'WATCHED';\n left: 0;\n top: 0;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n font-size: 1.35rem;\n letter-spacing: 0.035rem;\n height: 21px;\n width: 77px;\n margin: 4px;\n border-radius: 3px;\n opacity: .8;\n color: #fff;\n background: #121212\n}\n\nytd-thumbnail:hover ytd-thumbnail-overlay-resume-playback-renderer, #progress.ytd-thumbnail-overlay-resume-playback-renderer {\n height: 0\n}\n\nyt-formatted-string.ytd-thumbnail-overlay-playback-status-renderer {\n display: none;\n}\n \n/* ============ BADGES ============ */\n.badge-style-type-simple.ytd-badge-supported-renderer, .badge-style-type-live-now.ytd-badge-supported-renderer, .badge-style-type-red.ytd-badge-supported-renderer {\n background: var(--badge-bg);\n color: var(--badge-color);\n border: none;\n}\n\n/* ============ FROSTED ============ */\nytd-thumbnail-overlay-side-panel-renderer {\n --blur: 10px;\n backdrop-filter: blur(var(--blur));\n -webkit-backdrop-filter: blur(var(--blur));\n}\n\n/* ============ SCROLLBAR ============ */\nhtml[hide-scrollbar=\"true\"] ::-webkit-scrollbar, ::-webkit-scrollbar-corner {\n display: none;\n}\n\n::-webkit-scrollbar, ::-webkit-scrollbar-corner {\n background: var(--scrollbar-background);\n width: 10px;\n height: 10px;\n}\n\n::-webkit-scrollbar-button {\n display: none;\n}\n\n::-webkit-scrollbar-thumb {\n background: var(--scrollbar-color);\n}\n\n::-webkit-scrollbar-thumb:not(:active):hover {\n background: var(--scrollbar-hover);\n}\n\n::-webkit-scrollbar-thumb:active, ::-webkit-scrollbar-thumb:hover:active {\n background: var(--scrollbar-active);\n}", - "urlPrefixes": [ - "https://www.youtube.com/" - ] - } - ], - "name": "CleanTube 2 (NEW UPDATE!!!)", - "originalDigest": "f77d1739500a82bd642f03ecabb54308bd2b03f1", - "id": 21, - "updateDate": 1581129986355 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/22251.json", - "md5Url": "https://update.userstyles.org/22251.md5", - "url": "http://userstyles.org/styles/22251", - "originalMd5": "52673f0b8a441088a0229dbbf36f9ee4", - "installDate": 1575343452208, - "sections": [ - { - "code": "@namespace url(http://www.w3.org/1999/xhtml);\n#topRight,\n#topLeft,\n#bottom,\n#middleContainer>h3 {\n display: none !important;\n}\n\n#ctitle {\n color: #dddddd !important;\n}\n\nbody {\n background: #1E2029;\n}\n\n#middleContainer {\n background: #1E2029 !important;\n border: 0 !important;\n color: #1E2029 !important;\n}\n\nul.comicNav li a {\n background: #1E2029 !important;\n border-color: hsl(220, 28%, 40%) !important;\n box-shadow: none !important;\n}\n\nul.comicNav li a:hover {\n background: hsl(211, 38%, 66%) !important;\n color: #ffffff !important;\n}\n\n.imageCaption {\n color: #dddddd !important;\n text-align: center !important;\n background: #282a36 !important;\n margin: 5px 0 0 !important;\n padding: 5px !important;\n font-size: 13px !important;\n}", - "domains": [ - "xkcd.com" - ] - } - ], - "name": "dracula: xkcd", - "originalDigest": "4bc70aa95f0eb41725e1c4e2dbc5b718dcdd0a6f", - "id": 22, - "updateDate": 1581130216156 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/153882.json", - "md5Url": "https://update.userstyles.org/153882.md5", - "url": "http://userstyles.org/styles/153882", - "originalMd5": "cab8c955bd5e6f83d66045dbee50142c", - "installDate": 1575355300691, - "sections": [ - { - "urls": [], - "urlPrefixes": [], - "domains": [ - "nixos.org" - ], - "regexps": [], - "code": "@font-face {\r\n font-family: 'Quattrocento';\r\n font-style: normal;\r\n font-weight: 400;\r\n src: local('Quattrocento'), url(http://themes.googleusercontent.com/static/fonts/quattrocento/v5/WZDISdyil4HsmirlOdBRFKRDOzjiPcYnFooOUGCOsRk.woff) format('woff');\r\n}\r\nbody {\r\n font-family: 'Quattrocento';\r\n font-size: 18px;\r\n line-height: 1.45em;\r\n background-color: #002b36 !important;\r\n color: #93a1a1 !important;\r\n}\r\nh1 {\r\n color: #93a1a1 !important;\r\n}\r\na:link {\r\n color: #268bd2 !important;\r\n}\r\na:visited {\r\n color: #2aa198 !important;\r\n}\r\na:hover {\r\n color: #d33682 !important;\r\n}\r\ndiv.book {\r\n background-color: #073642 !important;\r\n}\r\ndiv.docbook code {\r\n font-size: 0.8em;\r\n}\r\npre {\r\n box-shadow: none !important;\r\n border: none !important;\r\n}\r\ncode,\r\npre {\r\n background-color: #073642 !important;\r\n color: #93a1a1 !important;\r\n}\r\n.alert-info code,\r\n.alert-info pre,\r\n.alert-info {\r\n background-color: #fdf6e3 !important;\r\n color: #586e75 !important;\r\n border: none !important;\r\n line-height: 1.4em !important;\r\n}\r\n.alert-info code,\r\n.alert-info pre {\r\n background-color: #eee8d5 !important;\r\n}\r\ntable#search-results tr.odd > td {\r\n background-color: #073642;\r\n}\r\n.table th,\r\n.table td {\r\n border: none;\r\n}\r\ntable#search-results tr.details > td:hover {\r\n background-color: #002b36;\r\n}\r\n.table-hover tbody tr:hover>td,\r\n.table-hover tbody tr:hover>th {\r\n background-color: #002b36;\r\n}\r\n.navbar-inner {\r\n background-image: none;\r\n background-color: #073642;\r\n border: none;\r\n}\r\n.navbar .brand,\r\n.navbar .nav>li>a {\r\n text-shadow: none;\r\n}\r\n.navbar-search .search-query {\r\n background-color: #002b36;\r\n border: none;\r\n}\r\nul.nixos-blogs > li:nth-child(odd),\r\nul.nixos-commits > li:nth-child(odd) {\r\n background-color: #073642;\r\n}\r\nul.nixos-blogs > li,\r\nul.nixos-commits > li {\r\n border-top: 1px solid #073642;\r\n}\r\nhr {\r\n border-top: 1px solid #073642;\r\n border-bottom: 1px solid #073642;\r\n}\r\ntr.news-header {\r\n border-bottom: 1px solid #073642;\r\n}\r\n.news-short {\r\n color: #b58900;\r\n}\r\n/* $base03: #002b36; */\r\n/* $base02: #073642; */\r\n/* $base01: #586e75; */\r\n/* $base00: #657b83; */\r\n/* $base0: #839496; */\r\n/* $base1: #93a1a1; */\r\n/* $base2: #eee8d5; */\r\n/* $base3: #fdf6e3; */\r\n/* $yellow: #b58900; */\r\n/* $orange: #cb4b16; */\r\n/* $red: #dc322f; */\r\n/* $magenta: #d33682; */\r\n/* $violet: #6c71c4; */\r\n/* $blue: #268bd2; */\r\n/* $cyan: #2aa198; */\r\n/* $green: #859900; */" - } - ], - "name": "Nixos Solarized (Dark)", - "originalDigest": "b8e24095530af971f61ee64a39b373a7ca2e5736", - "id": 25 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/179101.json", - "md5Url": "https://update.userstyles.org/179101.md5", - "url": "http://userstyles.org/styles/179101", - "originalMd5": "5a232c77627dfdb22013e4026899b0b1", - "installDate": 1581128205184, - "sections": [ - { - "code": ":root {\n --bg1: #1E2029;\n --bg2: #282a36;\n --bg3: #282a36;\n --bg4: #21222d;\n /* code background */\n --bg5: #282a36;\n --bg6: #282a36;\n\n --selected: #f8f8f2;\n --selected2: #f8f8f2;\n --accents: #bd93f9;\n\n --btn: #44475a;\n --btn2: #44475a;\n --btn3: #44475a;\n --btn4: #44475a;\n}\n\npre,\ncode,\ntt,\nkbd:not(.badmono),\npre,\nsamp,\n.js-line-number,\n.blob-num,\n.blob-code,\n.file-data pre,\n.line-data,\n#gist-form .file .input textarea,\n.blob-code-inner {\n font-family: 'Source Code Pro', 'Menlo', Consolas, 'Liberation Mono', Menlo, Courier, monospace !important;\n}\n\n.tabnav--responsive .tabnav-tab,\n.page-responsive .previewable-comment-form .comment-form-head.tabnav .toolbar-commenting,\n.pagehead.repohead.readability-menu {\n background-color: var(--bg1) !important;\n border: 0px;\n}\n\n.SelectMenu-item,\n.SelectMenu-header {\n background-color: var(--bg1) !important;\n color: var(--selected) !important;\n}\n\n.SelectMenu-item:hover {\n background-color: var(--btn) !important;\n}\n\ntextarea:focus {\n background-color: var(--bg1) !important;\n}\nbody {\n background-color: var(--bg3) !important;\n}\n.markdown-body table tr,\n.blob-num-context,\n#user-content-toc td {\n background: var(--bg1) !important;\n}\n.highlight:not(.lines) tr:not(.inline-comments):hover td.selected-line.blob-num:not(.line-age),\n.highlight:not(.lines) tr:not(.inline-comments):hover td.blob-num,\n.blob-num[colspan],\n.blob-num-hunk {\n background: var(--bg3) !important;\n}\n.list-browser-item.closed,\n.content .verseblock-content,\n.content .verseblock-content,\n.simple-stacked-bar,\n.date_selector td.selectable_day:hover,\n.date_selector td.selectable_day.hover,\n.pagination a:hover,\n.pagination a:focus,\n.pagination span:hover,\n.pagination span:focus,\n.pagination em:not(.current):hover,\n.pagination em:not(.current):focus,\n.dropdown-divider,\n.js-current .standalone a,\n.sidebar-module .disable > a,\n.label-select-menu div.labelstyle-000000.selected,\n.ScreenshotCarousel-navitem.selected,\n.CircleBadge {\n background: var(--bg1) !important;\n}\n.header,\n.headers,\n#readme .markdown-body,\n.social-count,\n.file,\n.box-body,\n.markdown-body table tr:nth-child(2n),\n.steps li,\n.explore-section:nth-child(2n),\n.markdown-format table,\n.list-group-item,\n.chromed-list-browser .none p,\n.chromed-list-browser .error p,\n.list-browser-footer,\n.commandbar .choice:hover,\n#gollum-editor-help,\n.search-filter:hover,\n#wiki-history table tr:nth-child(2n) td,\n.display tr:hover,\n.octofication .message,\n.commandbar .loading:hover,\n.comment-content,\n.commandbar .message,\n.boxed-group-inner,\n#adv_code_search .search-page-label,\n.timeline-comment,\n#contributors-master svg.viz,\n.diff-table .line-comments,\n.menu,\nsvg.spark,\nsvg.capped-card-content,\nbody.api .content tbody,\n.markdown-format img:not(.emoji),\n.mini-repo-list,\n#common-issues,\n.setup-wrapper .oauth-permissions-details,\n.milestone-list,\n.setup-form .setup-plans,\n.prose-diff > .markdown-body,\n.revision .gu,\n.tree-browser td,\n.tree-browser .alt td,\n.branches .branch-summary,\n.branches .no-results-message,\n.simple-box-footer,\n.commit-group,\n.blankslate,\n.content table tr,\n#search-results,\ntable.files,\n.mergeable,\n.org-module,\n.org-add-footer,\n.branch-infobar,\ntable.capped-list tr:nth-child(2n),\n.team-org-group,\n#gollum-editor-help-wrapper,\n.integrations-quality,\n.showcase-featured .mo-info .featured-grid-outer,\n.render-shell,\n.list,\n.latest-commit .commit-author,\n.bubble,\n.tabs > a.selected,\n.comment-form-head .tabnav-tab.selected,\n.oauth-org-access-details .boxed-group-list > li.on,\n#fullscreen_overlay,\n.branch-action-body,\n.inline-comment-form,\n.file-history-tease .participation,\n.gist-quicksearch-result-header,\n.label-generic,\n.migrate-org-roles,\n.commit-tease .commit-meta,\n.manage-repo-access-icon,\n.table-list:not(.team-member-list),\n.repo-file-upload-progress,\n.gcr-ext-editor-dialog,\n.shade-gray,\n.exploregrid-item,\n.signed-commit-badge-small,\n.facebox-popup,\n.explore-signup-entice-wrapper,\n.billing-addon-items tr.total-row,\n.billing-addon-items tr.dark-row,\n.Box-body,\nli.pinned-repo-item,\n.js-contribution-graph h2 + div:last-child,\n.project-triage-pane,\n.user-profile-nav.is-stuck,\n[data-filterable-for='projects-filter'] .container-lg,\n.review-summary-form-wrapper,\n#projects-results,\n.listgroup,\n.protected-branch-orgs-and-repo-admins,\n.listgroup-overflow,\n.Header,\n.project-column,\n.btn.btn-outline,\n.js-notice > .border,\n.news .issues_labeled .border,\ntable.pricing-table,\n.two-factor-steps,\ndiv.border.rounded-1,\narticle.border.rounded-1,\n.border-right.border-bottom.border-left,\n.graph-before-activity-overview,\n.access-form-wrapper {\n background: var(--bg2) !important;\n}\n.table-list-header,\n.timeline-comment-header,\n.boxed-group > h3,\n.boxed-group .heading,\n.file-header,\n.capped-card h3,\n.select-menu-header,\n#gist-form .file .meta,\n.file .meta,\n.file-box .meta,\n.menu-heading,\n.audit-results-header,\n.branches .branch-group-heading,\n.auth-form-header,\n.commit-form,\n.migration-jumbotron,\n.migration-sub-header,\n.commit-tease,\n.manage-repo-access-title,\n.select-menu-divider,\n.signed-commit-header,\n.reorderable-task-lists .markdown-body .task-list-item.hovered,\n.next-charge-box,\n.credit-card,\n.branch-action-body .merge-message,\n.review-thread-reply,\na.card.bg-gray-light:hover,\n.add-member-team-list .team-row-header,\n.Box-header,\n.pagination .gap,\n.pagination .disabled,\n.pagination .gap:hover,\n.pagination .disabled:hover,\n.listgroup-header,\n.merge-status-item,\n.previewable-comment-form .comment-form-head.tabnav,\n.bg-gray:not(body):not(.team-discussions-container),\n.Header .header-search-wrapper,\n.Header .header-search-wrapper input,\n.user-key-email-unverified {\n background: var(--bg1) !important;\n}\n.calendar-graph .contrib-details div,\n.tabnav-tabs a,\n.time,\n.gist-item .metadata .datetime,\n.list-group-item-meta,\na.keyboard-shortcuts,\nbutton.keyboard-shortcuts,\n.simple-conversation-list,\n.simple-conversation-list > li .title .num,\n.drag-and-drop,\n.starred-repo .sort-info,\n.org-stats,\n.commandbar .choice,\n.commandbar .loading,\n.commandbar .description,\nul.summary-stats li a,\n.authorship,\n.sha-block,\n.gh-header-meta,\n#last-edit,\n.setup-header .lead a,\n.repository-meta .edit-link a,\n.api-status a,\n.meta li,\n.who_when a,\n.numbers-summary a,\n.mini-icon-remove-close:hover,\n.section-heading-title .separator,\n.blog-aside .rss,\n.hook-list a,\n.github-jobs-promotion a.jobs-logo,\n.org-teams-list .team-meta,\n.repo-list-item .repo-description,\n.branch-infobar .lightweight-actions > li a,\n.repo-leaderboard-list .repo-leaderboard-meta-item a,\n.changed .moved-up:before,\n.changed .moved-down:before,\n.comment-header .octicon,\na.section-heading-back,\n.list-group-item-meta .octicon,\n.repo-leaderboard-title .title-meta,\na.pagehead-nav-item,\n.wiki-wrapper .wiki-empty-box,\n.commits-list-item .commits-comments-link,\n.timeline-comment-header,\n.commits-list-item .commit-meta,\n.issues-listing .table-list-issues .issue-comments-link,\n.issues-listing .table-list-issues .issue-meta-section a,\na.issues-reset-query,\n.labels-list-action,\ntable.tag-list p a,\ntable.tag-list td.date a,\n.muted-link,\na.muted-link,\n.render-view-modes li,\n.site-footer,\n.site-footer .octicon-mark-github:hover,\n.repo-list-stats .repo-list-stat-item,\n.range-editor span.flag .octicon,\n.commit-info .commit-meta a,\n.notifications .issue-notification.read .type-icon,\n.notifications .read a,\n.auth-form-header .octicon,\n.releases-tag-list p a,\n.history-link a,\na.issue-nwo-link,\nul.filter-list .filter-item,\n.member-meta .teams-link,\n.member-meta .btn-link,\nul.comparison-list > li em,\nul.comparison-list > li.title,\n.diffstat-summary,\na.team-member-ellipsis,\na.discussion-item-toggle-open,\na.discussion-item-toggle-closed,\nbutton.discussion-item-toggle-open,\nbutton.discussion-item-toggle-closed,\n.dropdown-header,\n.participation a,\n.completeness-indicator-info,\n.type-icon-state-none,\n.pagehead-tabs-item,\na.pagehead-tabs-item,\n.commit-tease,\n.reponav-item,\na.reponav-item,\n.delete-owners-button,\n.stats-group-stat,\n.stats-group-stat.no-link:hover,\n.wiki-edit-link,\n.toolbar-item .menu-target,\n.member-meta .member-meta-link,\n.hidden-text-expander a,\n.ellipsis-expander,\n.text-muted,\n.listgroup-item,\n.discussion-item-header,\n.discussion-sidebar-heading,\n.org-header-meta .meta-item .meta-link,\n.underline-nav-item,\n.boxed-group-inner,\n.lead,\n.form-checkbox .note,\n.bot-identifier,\n.dashboard-notice .dismiss:hover,\n.text-gray,\ntd.icon .octicon-file-text,\ntd.icon .octicon-file-symlink-file,\n.UnderlineNav-item,\n.project-header-link,\nbutton.project-header-link,\ntd.icon,\n.project-pane-close,\n.facebox-close,\n.tree-browser-result mark {\n color: #a3aac1 !important;\n}\nimg,\n#browser table,\n#browser table th,\n#issues .menu ul li,\n.branches .more-branches,\n.issues td,\nul.main_nav li.selected,\n.browser_header,\n.issue-head,\n.bootcamp-help .image,\nul.hook-list,\n.clone-url-button,\n.list-tip li,\n.section-nav a,\n.search-menu-container,\n.repo_list li a,\n.graphs .axis,\n.switcher > span:after,\na.assignee-bit,\n.menu li,\n.notifications td,\n.filter-tab,\nul.hook-list li,\n.repo .border,\n.box-action,\nul.repo-stats li a,\n.footer_nav h4,\n.footer-divider,\n.chromed-list-browser,\n.js-activate-link,\n.chromed-list-browser div,\n.filter-bar,\n.columns.sidebar,\n.title,\n.lbl,\n#contributors .person,\n.tabnav,\n#commit-activity-master,\n#services,\n.top-rule,\n.blog-post,\n#services .service,\nul.stats,\n.select-menu-filters,\n.select-menu-item,\n.select-menu-tabs,\n.release-list > li,\n.context-body,\n.api li:before,\n.library-list .feature,\n.lower_footer,\n.cheatsheet,\n.pagehead.settings-area,\n.release-body,\n.suggester,\n.pull-state,\n.pull-number,\n.merge-pr,\n.gist-file,\n#graph-shots li,\n.sidebar,\n.release-timeline,\n.explore h2,\n#head,\n.leaderboard-list-item,\n.release-timeline-tags .main,\n.search-result-item,\n.details,\n.jobs-list,\n.content-header,\n.user-list-item,\n.markdown-body,\nul#categories li h5,\n.render-view-modes li,\n.gobutton.with-comments .sha,\n#gollum-editor-function-bar,\n.capped-box,\n.steps li,\n#common-issues,\n.steps,\n#graphs,\n.previewable-comment-form .comment,\n.org-module,\n.org-repo,\n.table-list,\n.org-add-footer,\n.auto-search-group .search-filter,\n#notification-center li,\n.branch-status,\n.comment + .comment,\n.discussion-bubble-inner,\n.member-row,\n.press-info,\n.timeline-comment,\n.timeline-comment-header,\n.timeline-commits .timeline-commits-header,\n.marketing-section,\n.featured-callout .screenshot,\n.page-new-repo .license-container,\n.sidebar-module,\n.collapsed,\n.expanded,\n.discussion-topic,\n.bubble-inner,\n.team-org-group,\ndiv.article div.helper div.content,\n.boxed-group-inner .help,\ndl.new-email-form,\n.file .meta-divider,\n.avatar-stack.multiple-avatars:before,\n.file-box,\n.file-actions .btn-group li,\n.gist .gist-file .gist-data,\n.calendar-graph .contrib-details div,\n.branch-action-body,\n.setup-form .tos-info,\n.setup-form .setup-organization-next,\n.collection-page .other-content,\n.bubble-wrap,\n.release-show,\n.file-wrap,\n.branches .branch-summary,\n.branches .no-results-message,\n.branch-a-b-count .count-half:last-child,\n.tabnav-tab.selected,\n.panel-nav,\n.file,\n.full-commit .sha-block > a,\n.theme-selector-thumbnail,\n.segmented-nav li,\n.overall-summary,\n.boxed-group-inner,\n.search-form button,\n.branches .branch-group-heading,\n.boxed-group > h3,\n.boxed-group .heading,\n.issues-list-actions,\np code,\ncode,\n.wiki-wrapper .wiki-empty-box,\n#adv_code_search .search-page-label,\npre.headers,\n.inline-comment-form,\n.history-link,\n.oauth-permissions-details,\n.setup-info-module .features-list .list-divider,\n.setup-wrapper .oauth-permissions,\n.swipe .swipe-frame .swipe-shell,\nul.search-results,\n.orgs-help-shelf-content .orgs-help-divider,\n.repository-lang-stats-graph,\n.gist-quicksearch-results,\n.gist-quicksearch-result,\n.gist-quicksearch-result-group,\n.listgroup,\n.listgroup-item + .listgroup-item,\n.user-key-badge,\n.newsfeed-placeholder,\n.progress-bar-inline .progress-bar,\n.menu-heading,\nbody .border-gray-dark,\n.discussion-item-review .blob-wrapper,\n.bot-identifier,\n.counter,\n.Counter,\ndiv.marketplace-product-callout,\n.CodeMirror-dialog-top,\n.project-card:hover {\n border-color: rgba(30, 32, 41, 1) !important;\n}\n.edit-repository-meta,\n.field label,\n.boxed-group-list li,\n.capped-box,\n.marketing-nav a,\n.repository-meta,\n.gist-item .description,\np.explain,\n.news .alert .simple .title,\n#network .graph-date,\n.tabnav-widget.text,\n.feature .intro,\nspan.diffstat,\nspan.diffstat a,\n.commit .commit-branches a,\n#readme .plain,\n.news blockquote,\n.news blockquote p,\n.collection-stat,\n.overall-summary .graphs .desc,\n.flash-global a,\n.calendar-graph .contrib-details div .lbl,\n.tag-info a,\na.browse-button,\n.ghead .dir,\n.repository-lang-stats .percent,\n.comment-header-action-text a,\n.comment-header-right a,\n.gist-item .creator,\n.dashboard-tabs a,\n#graph_data .tab a,\n.pull-info,\n.list-group-item .list-group-item-summary a,\n#contributors .capped-card .cmt,\n.boxed-group-list .access-level,\nh3.conversation-list-heading,\na.filter-tab,\n.starred-repo p.description,\n.commit-desc pre,\n.org-repo-stats a,\n.org-repo-updated a,\n.org-repo-description,\n.org-repo-forked a,\n.commandbar .display table td span,\n.clone-options,\n.pulse-section,\n.discussion-sidebar p,\n.discussion-topic-header .discussion-topic-author,\n.gist-description,\n.explain,\np.subtext,\n.team-grid .team-description,\n.orgs-nav .org-nav-item,\n.form-actions-protip .protip,\n.discussion-item .author,\n.inline-comments .comment-count,\n.sidebar-heading,\n.clear-issue-filters a,\n.render-view-modes li.active:before,\nul.comparison-list > li em,\n.marketing-benefits .column p,\n.sub-nav li a,\n.headlines a .date,\n.sidebar-module ul ul li span,\n.merge-branch-description,\n.gist-item ul.meta > li > a,\nul#categories li h5 a,\n.render-view-modes li.active,\n.user-leaderboard-list .repo-list-item .repo,\n.repo-stats li a,\n.about p,\ndl.form > dd p.note,\np.subdued,\n.team-header .team-description,\n.hfields dl.form > dt label,\n.boxed-group > h3 a.boxed-group-breadcrumb,\n.boxed-group .heading a.boxed-group-breadcrumb,\n.subscriptions-sidebar .note,\n.thread-subscription-status,\n.ellipsis-button,\n.follow-list .follow-list-info,\nform.btn .count,\n.blame .commitinfo .date,\n.gist .gist-file .gist-meta a,\n.merge-pr-more-commits,\n.hidden-text-expander a,\n.news div.message,\n.news li blockquote,\n.news .alert .pull-info,\n.news .alert .branch-link,\n.release .release-authorship a,\n.wiki-wrapper .wiki-empty-box:hover,\n.select-menu.is-showing-clear-item .select-menu-clear-item .octicon,\n.diffstat-summary a,\na.subnav-item,\n.branches .branch-group-heading .branch-group-name,\n.render-notice,\n.table-list-milestones .stat,\n.commits-listing .commit-group-title .octicon-git-commit,\n.select-menu-header .octicon:hover,\n.repo-list-description,\n.file .meta,\n.email-format .email-hidden-toggle a,\n.file-diffstat,\n.program-info-column .mega-octicon,\n.octofication .notice-dismiss:hover,\n.markdown-format .intro,\n.label-admin,\n.program-info-column p,\n.file-history-tease,\n.blob-num:hover,\n.gist-snippet-meta .gist-count-links > li > a,\n.commit-tease .message,\n.commit-author-section,\n.manage-repo-access-not-active,\n.milestone-name,\n.select-menu-modal,\n.select-menu-action,\n.feature-callout,\n.repo-file-upload-file-wrap .remove-file:hover,\n.rss-subscribe,\ntable.capped-list .octicon,\n.site-header-menu .nav-item,\n.exploregrid-item,\n.markdown-body blockquote,\n.link-gray,\n.tabnav-tabs button.tabnav-tab,\n.commits-list-item .commit-desc pre,\n.Label--outline.bg-yellow-light,\n.review-comment .pending-batched-suggestion-label {\n color: rgba(255, 255, 255, 0.6) !important;\n}\n\n.Label--outline.bg-yellow-light {\n background-color: var(--btn) !important;\n}\n#main,\n.capped-box,\n.unread_count,\n#browser table th,\n.markdown-format table th,\ntable.upgrades tr.current td,\n.definitions,\n.discussion-topic-header,\n.timeline-commits-minimal .commit-icon .octicon,\n.timeline-commits .commit-icon .octicon,\n.upload-progress,\n.search-results-listing em,\n.discussion-bubble-inner,\n#wiki-history table td,\n.gist .gist-file .gist-data,\n.logo-box,\n.markdown-example .rendered,\n.team-grid .team-members,\n.diagram-icon:not(.active),\ntable.capped-list th,\n.filter-bar,\n.audit-search-clear,\n.country-info,\n.tabnav-tab.selected,\n.file-diff-split .empty-cell,\n.composer-infobar,\n.completeness-indicator-blank,\n.leaflet-control-zoom,\n.pagehead-tabs-item.selected,\n.reponav-item.selected,\n.manage-repo-access-not-active,\n.header-search-scope,\n.reverse-progress-bar,\n.featurette.py-5,\n.payment-history .refunded,\n.payment-history .failed,\n.profile-timeline-month-heading.bg-white,\n.project-card,\n.gh-header .gh-header-sticky.is-stuck + .gh-header-shadow {\n background: var(--bg2) !important;\n}\n.btn,\npre,\nh1,\nh2,\nh3,\n.header,\ntable,\ntable tr,\ntable td,\ntable th,\nblockquote,\n.pulse-graph,\n.minibutton,\n.social-count,\n.discusion-topic-infobar,\n.box-body,\n.timeline-comment-label,\n.logo-box,\n.developer-program-badge,\n.vcard-details,\n.vcard-stats,\n.auth-form-header,\n.nav-bar-tabs .section-title,\n.pagination a:last-child,\n.pagination span:first-child,\n.boxed-group-list > li,\n.toolbar-bordered,\n.pagination span:last-child,\n.dashboard-tabs,\n.graphs,\n.graph,\n.sub-nav,\n.audit-search-clear,\n.repo-list-item,\n.email-signature-reply,\nfooter,\n.bubble .bubble-expand,\n.grid .col,\n.composer-infobar,\n.email-quoted-reply,\n.summary-stats li,\n.columns.equacols.bordered,\n.file-diffstat,\nul.filter-list,\n.news .alert,\ntable.files td,\n.explore-section,\n.repolist > li,\n.featured-grid-outer,\n.gh-header-meta,\n.theme-picker-thumbs,\n.team,\n.billing-section,\n.sidebar-module ul h3,\n.headlines li,\n.discussion-sidebar-item + .discussion-sidebar-item,\n.markdown-format img,\ndiv#common-issues ul li,\n.about-facts,\n.starred-repo,\n.markdown-example,\n.traffic-graph-stats,\n.discussion-item + .discussion-item,\n.bubble,\n.tree-browser,\n.simple-box-footer,\n.team-grid .team-members,\n.org-list .list-item,\n.stats-group .stat,\n.team-info-card .team-stats,\n.table-of-contents li,\n.commit-group,\n.table-list-bordered .table-list-cell:first-child,\n.table-list-bordered .table-list-cell:last-child,\n.table-list-cell,\n.table-list,\n.table-list-header,\n.blankslate,\n.labels-list-item,\n.subnav-divider-right,\n.subnav-bordered,\n.content table tr th,\n#search-results li,\n.subhead,\n#pages-composer,\n.render-bar,\n#gollum-editor-help,\n#gollum-editor-help-parent,\n#gollum-editor-help-list,\n.auth-section,\n.commit-sha,\n.comment-body,\n.mini-repo-list-item,\n.advanced-search-form fieldset,\n.contrib-column,\n.org-header .edit-org,\n.pulse-summary .summary-box,\n.pulse-summary .summary-box li:first-child,\n.list-item + .list-item,\n.list-item + .list-heading,\n.list-heading + .list-item,\n.issue-list-item,\n.collection-card,\n.setup-header,\nbody.api pre,\n.stats-group-stat:first-child,\n.build-statuses-list,\n#gollum-dialog-dialog-buttons,\n#gollum-dialog-dialog h4,\na.gollum-minibutton,\na.gollum-minibutton:visited,\n.two-factor-toggle .two-factor-status,\n.two-factor-settings-group,\n.member-badge,\nul.comparison-list > li,\n.release-downloads,\n.release-downloads li,\n.blob-interaction-bar,\ninput.subnav-search-input,\n.select-menu-header,\n.select-menu-modal,\n#gist-form .file .meta,\n.file .meta,\n.file-box .meta,\n.capped-card,\n.audit-results-header,\n.pagination a,\n.pagination span,\n.pagination em,\n.input_area,\n.output_area .rendered_html table,\n.render-info .message,\n.subnav .btn + .issues-search,\n.branch-action-body .branch-action-item + .branch-action-item,\n.discussion-item-merged.open .discussion-item-details-header,\n.discussion-item-merged.open .build-statuses-list,\n.build-status-item,\n.pagehead-tabs-item.selected,\n.org-header,\n.pagehead,\n.branch-action-item + .mergeability-details,\n.migration-section,\n.migrate-org-roles,\n.migrate-org-roles-header,\n.migration-footer,\n.migration-org-avatar,\n.org-migration-settings-section,\n.word-upload-callout .note,\n.commit-tease .commit-meta,\n.manage-user-info,\n.manage-repo-access-title,\n.org-settings-team-item:first-child,\n.label-generic,\n.plan-notice,\n.intgr-header,\n.code-list-item,\n.sort-bar,\n.repo-file-upload-outline,\n.comment-reactions.has-reactions,\n.reaction-summary-item,\n.select-menu-divider,\n.featurette.border-top,\n.tile-block,\n.tile-bordered:not(:last-child),\n.showcase-page-header,\n.showcase-page-repo-list,\n.header-search-scope,\n.result-group a,\n.signed-commit-badge,\n.signed-commit-header,\n.user-key-email,\n.border-top,\n.pricing-card-cta,\n.shelf,\n.access-token,\n.about-menu,\n.oauth-border,\n.reponav-item.selected,\n.file-header,\n.reorderable-task-lists .markdown-body .task-list-item.hovered,\n.next-charge-box,\n.setup-info-module h2,\n.radio-label,\n.border,\n.border-top,\n.border-right,\n.border-bottom,\n.border-left,\n.border-y,\n.pinned-repo-list-item,\n.pinned-repo-filters,\n.orghead,\n.orghead .edit-org,\n.Box-body-row,\n.discussion-item-deployed,\n.branch-action-body .merge-message,\n.new-project-column,\n.confirm-removal-list-container,\n.confirm-removal-list-item,\n.user-profile-nav,\n.review-thread-reply,\n.feature-callout-octicon,\n.feature-callout,\n.discussion-item + .discussion-item,\n.discussion-item-review + .discussion-item,\n.libraries-jumbotron,\n.last-review-thread,\n.menu-item,\n.review-comment.is-comment-editing,\n.Box,\n.team-list-footer,\n.Box-header,\n.profile-rollup-summarized + .profile-rollup-summarized,\n.Subhead,\n.dashboard-notice .coupon,\n.Box-body,\n.listgroup-header,\n.merge-status-item,\n.pending-team-invitations-link,\n.discussion-item + .discussion-item-review,\n.profile-timeline-card-wrapper,\n.profile-rollup-wrapper + .profile-rollup-wrapper,\n.email-preference-exceptions .exception,\n.user-key-email-unverified {\n border-color: rgba(255, 255, 255, 0.02) !important;\n}\n.btn:active,\noption:hover,\n.listings-layout .nav li a:hover,\n.state-merged,\n#fork-select .target:not(.disabled):hover,\n.flash-notice,\ntable.upgrades tr:hover td,\n.email-format .email-hidden-toggle:hover a,\n.dashboard-tabs a:hover,\n.documentation-results a:hover,\n.hidden-text-expander a:hover,\n.dropdown-item:hover,\n.dropdown-item.zeroclipboard-is-hover,\n.subnav-item.selected,\n.subnav-item.selected:hover,\n.subnav-item.selected:focus,\n.example-nav li a.selected,\n.issues-reset-query:hover .octicon-x,\n.segmented-nav li.active,\n.diff-expander:hover,\n.pagination .current,\n.owner-select-target:hover,\n.release-timeline-tags .expander-text:hover .expander-dots,\n.gollum-minibutton:hover,\n.gollum-minibutton:visited:hover,\n.search-result-item.navigation-focus,\n.gist-quicksearch-result.navigation-focus,\n.gist-snippet .link-overlay .link,\n.btn.btn-outline:hover,\n.btn.btn-outline:active,\n.btn.btn-outline.selected,\n.btn.btn-outline.zeroclipboard-is-hover,\n.btn.btn-outline.zeroclipboard-is-active,\n.pull-request-link:hover,\n.issues-reset-query:hover .issues-reset-query-block,\n.date-selector td.selected,\n.date-selector td.selectable-day:hover,\n.add-line-comment,\n.suggester .cur,\n.result.selected,\n.result:hover,\n.CommunityTemplate-highlight,\n.diff-table button.add-line-comment,\n.version-picker a:hover,\n.discussion-item-changes-marker.is-unread .discussion-item-icon {\n background: var(--bg2) !important;\n color: #fff !important;\n}\n.comment-reactions .user-has-reacted,\n.filter-item.selected {\n background: #373848 !important;\n}\n.markdown-format pre,\n.markdown-body pre,\n.markdown-format .highlight pre,\n.markdown-body .highlight pre,\n#facebox pre,\n.blob-expanded,\n.terminal,\n.copyable-terminal,\n#notebook .input_area,\n.blob-code-context,\n.markdown-format code,\n.api pre,\n.api code,\n.hook-delivery-details pre,\n.hook-delivery-container pre,\n.CodeMirror,\n.highlight {\n background: var(--bg4) !important;\n color: #ccc !important;\n border: none !important;\n}\n.blob-expanded .blob-num,\n.blob-expanded .blob-code {\n background: var(--bg3) !important;\n}\n\n#readme .plain,\n.readme .markdown-body,\n.readme .plain,\n.pull-request-composer,\n.drag-and-drop,\n.octofication .broadcast-icon-mask,\n.file .image,\n.merge-pr-more-commits,\n.coupons .coupon-form-body,\n.manage-repo-access-group,\n.saved-reply-form,\n.orghead .edit-org:hover,\n.octotree_views,\n.simple-box,\n.btn-link.timeline-progressive-disclosure-button,\na.border.rounded-1,\n.Box:not([style*='background']),\n.octotree_sidebar .octotree_bottom {\n background: var(--bg2) !important;\n border-color: var(--bg2) !important;\n}\n.Box-row,\n.Box-footer,\n.border-y,\n.border-top,\n.border-sm-top,\n.border-md-top,\n.border-lg-top,\n.commits-list-item + .commits-list-item,\n.diff-table .line-comments,\n.diff-table tr:not(:last-child) .line-comments,\n.timeline-comment .comment + .comment,\n.facebox-footer,\n.comment-reactions.has-reactions,\n.select-menu-divider,\n.branch-action-body .merge-branch-form,\n.branch-action-body .merge-message,\n.branch-action-item + .branch-action-item,\n.branch-action-item + .mergeability-details,\n.codesearch-results .repo-list-item + .repo-list-item,\n.dashboard-rollup-items > .dashboard-rollup-item,\n.topic-list .topic-list-item + .topic-list-item,\n.discussion-post .reply-comment:first-child,\n.issue-list-item + .issue-list-item,\n.last-review-thread,\n.review-thread-reply,\n.file-navigation .get-repo-btn,\n.user-list-item + .user-list-item,\n.wiki-list .wiki-list-item + .wiki-list-item {\n border-top: 1px solid var(--bg2) !important;\n}\n.Header {\n border-bottom: none !important;\n}\n.blame .blob-num,\n.blame-blob-num,\n.overall-summary,\n.repository-lang-stats,\n.collection-card,\n.team-grid .team,\n.code-list .divider .blob-num,\n.code-list .divider .blob-code,\n.expandable-line-num .diff-expander:hover,\n.select-menu-filters,\n.select-menu-modal,\n.pagination a,\n.build-status-item,\n.more-branches,\n.plan-choice.open,\n.uploaded-files > li.delete,\n.bg-gray-light,\n.more-repos,\n.billing-per-seat-callout:after,\n.code-list-item .blob-num,\n.blob-num.js-line-number,\n.bg-gray-light.disabled {\n background: var(--bg1) !important;\n}\n.UnderlineNav-item:focus .UnderlineNav-octicon,\n.UnderlineNav-item:hover .UnderlineNav-octicon,\n.UnderlineNav-item.selected .UnderlineNav-octicon,\n.text-gray-light,\n.markdown-body blockquote,\n.markdown-body h6,\n.table-list,\n.autocomplete-item .organization-member,\n.full-commit .branches-list li.loading,\n.full-commit .branches-list li.pull-request,\n.branches-tag-list li.loading,\n.commit-branches,\n.table-of-contents .octicon-diff-renamed,\n.toc-select .select-menu-item-icon.octicon-diff-renamed,\n.conversation-list-heading,\n.simple-conversation-list,\n.simple-conversation-list > li .num,\n.deployment-status-label,\n.list-group-item .list-group-item-summary a.quiet,\n.select-menu-tabs .select-menu-tab-nav,\n.select-menu-tabs a,\n.select-menu-item.disabled,\n.select-menu-item.disabled.selected,\n.select-menu-item.disabled .description,\n.select-menu-item.disabled.selected .description,\n.credit-card.amex .title,\n.billing-addon-items .addon-cost,\n.payment-history .refunded .status,\n.plan-choice-exp,\n.blame-commit-date[data-heat='10'],\n.blame-hunk:hover .reblame-link,\nul.comparison-list > li.title,\n.admin-options-block .disabled,\n.admin-options-block .disabled .note,\n.check-annotation-notice .annotation-title,\n.code-list .full-path a,\n.deployments-timeline-icon.is-inactive,\n.graphs .dir,\n.delete-topic-button,\n.topic-tag-action .add-topic-button,\n.topic-tag-action .remove-topic-button,\n.jump-to-suggestions-path .jump-to-octicon,\n.hook-item .description,\n.hook-item.inactive .icon-for-inactive,\n.hook-item.mute .icon-for-mute,\n.hook-item.pending .icon-for-pending,\n.hook-deliveries-list .item-status.pending,\n.hook-delivery-time,\n.repository-lang-stats ol.repository-lang-stats-numbers li > a,\n.repository-lang-stats ol.repository-lang-stats-numbers li > span,\n.page-new-repo .form-checkbox.disabled,\n.oauth-permissions-details.default:not(.delete) .access-details,\n.oauth-permissions-details.default:not(.delete) .permission-title,\n.oauth-permissions-details.none .access-details,\n.oauth-permissions-details.none .permission-title,\n.oauth-application-whitelist .edit-link,\n.oauth-application-info .app-info,\n.developer-app-item .developer-app-list-meta,\n.org-insights-cards [role='tab'][aria-selected='true'] .UnderlineNav-octicon,\n.export-actions a,\n.pinned-repo-name,\n.vcard-detail .octicon,\n.profile-timeline-card .issue-meta-section .octicon,\n.profile-rollup-toggle,\n.mini-repo-list-item .stars,\n.numbers-summary .octicon,\ntable.files td .simplified-path,\ntable.files td.message,\ntable.files td.message a,\ntable.files td.age,\n.settings-email .email-actions .settings-remove-email.settings-disabled-remove-email,\n.setup-creditcard-form .form-group select:invalid,\n.task-run.inactive .icon-for-inactive,\n.task-run.pending .icon-for-pending,\n.team-listing .expand-nested-team,\n.user-status-emoji-tab[role='tab'][aria-selected='true'] .UnderlineNav-octicon,\n.home-hero-signup .form-control-note,\n.gist-snippet-meta .gist-count-links > li .octicon,\n.gist-snippet-meta .extra-info,\n.gist-quicksearch-results .gist-quicksearch-result-header,\n.gist-quicksearch-results .select-menu-item h4,\n.gist-quicksearch-results .select-menu-item span,\n.markdown-body del {\n color: rgba(255, 255, 255, 0.4) !important;\n}\n.issues-list,\n.pulls-list-group,\n.commit-tease,\n.branch-infobar,\n.pagehead.repohead h1 .repo-label span,\n.coupons .coupon-form-body .coupon-icon,\n.menu,\n.merge-pr-more-commits,\n.api pre {\n border: 1px solid rgba(0, 0, 0, 0.03) !important;\n}\n.compare-pr-placeholder,\n.compare-cutoff,\n.diff-cutoff,\n.flash.flash-warn,\n.flash-global.flash-warn,\n.markdown-body li.added.moved,\n.repo-private-label,\n.gist-secret-label,\n.label-private,\n.stale-files-tab,\n.signed-out-comment,\n.warning,\n.commits-list-item em,\n.unsupported-browser,\n.prereceive-feedback,\n.zhc-banner {\n background: rgba(126, 81, 35, 0.4) !important;\n border: 1px solid #542 !important;\n}\n.btn,\ninput.btn,\nheader.nav-bar,\n.bubble .bubble-title,\nkbd,\na.feed,\n.list-browser-filterbar,\n.gobutton,\n.comment-header,\n.pagehead ul.tabs li a,\n.login_form input[type='submit'],\n.top-bar,\nul#bootcamp li a h4,\n#gists .context-menu-container,\nbody#com #header,\n.white-nav .selected span,\n.filter-tab,\n#header-wrapper,\n#header-wrapper .nav,\n.pagination span,\n.cheatsheet h2,\n.section a.section-head,\n.octotree_view_header,\n.list-heading,\n.dashboard-tabs li a,\na.function-button,\n.add-pill-form,\n.gist .gist-file .gist-meta,\n.octotree_toggle,\nul.comparison-list > li.title,\nbutton.button,\na.button,\nspan.button,\nbutton.minibutton,\na.minibutton,\nspan.minibutton,\n.clone-url-button > .clone-url-link {\n background: var(--bg2) !important;\n border-color: var(--bg2) !important;\n}\n.btn:hover,\n.btn:active,\n.btn.zeroclipboard-is-hover,\n.btn.zeroclipboard-is-active,\n.minibutton:hover,\n.minibutton:active,\n.minibutton.zeroclipboard-is-hover,\n.minibutton.zeroclipboard-is-active.kbd,\n.signup-button:hover,\na.signin:hover,\n.hero .textographic,\n.hero .screenographic,\n.pagination span.current,\n.box-action:active,\n.btn:active,\n.btn.selected,\n.btn.selected:hover,\n.btn.zeroclipboard-is-active,\n.minibutton:active,\n.minibutton.selected,\n.minibutton.selected:hover,\n.minibutton.zeroclipboard-is-active,\n.octotree_toggle:hover,\nbutton.button:hover,\na.button:hover,\nspan.button:hover,\nbutton.minibutton:hover,\na.minibutton:hover,\nspan.minibutton:hover,\n.clone-url-button.selected > .clone-url-link,\n.clone-url-button.selected > .clone-url-link:hover,\nul#bootcamp li a:hover h4 {\n background: var(--bg5) !important;\n border-color: var(--bg5) !important;\n}\n.commitinfo,\n.gc .diff-line-code,\n.gc .diff-line-num,\n.gc .diff-line-pre,\n.featured-commit-activity-graph,\n.featured-repo-logo,\n.outline-box,\n.gobutton > .sha .octicon,\n.markdown-body .csv-data .blob-num,\n#feedBody,\n.search-result-header,\n.accessibility-aid:focus,\n.file-data,\n.signup-plans th,\n.signup-plans td,\n.signup-plans-orgs th,\n.signup-plans-orgs td,\n.commits td,\n.featured-callout,\n.sidebar-module ul ul li,\n.native-download,\n.setup-info-module,\ndiv#common-issues ul,\n#gist-form .name,\n.subnav-item,\n.render-notice,\n.label-edit.edit-color-label-form .color-editor .color-editor-input,\n.date_selector td,\n.new-label,\n.range-editor .range,\n.range-editor .flag,\n.octotree_sidebar,\n.auth-form-body,\ndiv.border-wrap,\n.profile-header,\n.highlight .gc,\n.uploaded-files.is-populated,\n.range-editor,\n#gollum-editor-help-parent li a.selected,\n#gollum-editor-help-list li a.selected,\n#gollum-editor-help-parent li a:hover,\n#gollum-editor-help-list li a:hover,\n.github-access-banner,\n.protip-callout,\nul.comparison-list,\n.wiki-custom-sidebar,\n.invitation-container,\n.orgs-help-shelf,\n.orgs-help-item-octicon,\ntextarea,\n.thread-subscription-status,\n.branch-action-body .merge-branch-form,\n.pull-info,\n.branch-link,\n.discussion-item-merged.open .discussion-item-details,\n.word-upload-callout,\n.commit-tease-contributors,\n.session-authentication .create-account-callout,\n.intgrs-lstng-item,\n.intgr-install-callout,\n.is-failed .repo-file-upload-errors,\n.is-bad-file .repo-file-upload-errors,\n.is-too-big .repo-file-upload-errors,\n.is-too-many .repo-file-upload-errors,moz-extension://7d69bfd2-7bdf-41a4-8b4c-d5d025044fe0/edit.html?id=26#\n.is-empty .repo-file-upload-errors,\n.site-header,\n.site-subheader,\n.pricing-card,\n.explore-signup-entice,\n.price-box,\n.cvv-hint-tooltip,\n.plan-choice,\n.date-selector td,\n.user-profile-sticky-bar:after,\n.review-thread,\n.card,\n.tutorial,\n.overview .card > div[style*='background'],\n.Box-footer,\n.ScreenshotCarousel,\n.card-filter-autocomplete-dropdown .autocomplete-keyword-only,\n.inbox-zero,\n.tag-input .suggester,\n.review-comment:target .timeline-comment-label,\n.review-comment:target button.reaction-summary-item {\n background: var(--bg1) !important;\n border-color: var(--bg1) !important;\n}\n.pagehead ul.actions a.feed,\n.explore h2 .feed,\n#code_search_instructions h2,\ntd.inst,\n.metabox-loader,\n.pull-flag,\n.browser-content,\n.filterbar ul.filters li,\n.pagehead ul.tabs li.contextswitch,\n#wiki-header > div,\n.pagehead ul.tabs li.contextswitch:hover,\n.bigbutton a,\n#new_message,\n#issues_next ul.sorts li,\nul.sorts li.asc,\nul.sorts li.desc,\n.listings-layout .columns.main .content,\n.fieldswrap,\n.filterbar li.selected,\n#issues_next ul.filters li,\ntable.instruction tr:nth-child(2n),\n.email-hidden-toggle a,\n#commit-activity-master-head,\n.action-indicator,\n.pull-head .diffstat,\nul.suggestions,\n.discusion-topic-infobar,\n.commits-listing:before,\n.discussion-item-icon,\n.jstree-wholerow-hovered,\n.bubble-contents,\n.ellipsis-button,\n.filter-list li span.bar,\n.selectable_day.today,\n.billing-plans .current,\n.commits-listing:before,\n.billing-section .usage-bar,\n.issue-list em,\n.file-info-divider,\n.pagehead ul.tabs li a:hover,\n.repos .bottom-bar,\n#languages .popular,\n.tip-box h4,\ntable.upgrades td,\n.commit-preview .message,\n.commit-preview p.error,\n.pagehead ul.tabs li.contextswitch,\n#browser tr th,\n.status-box h4,\n.line_numbers,\n#files span.icon,\n#issues_list .actions,\n#repos .public,\n.inset-callout,\n#repo-message,\n.repo-private-label,\n.label-admin,\na.team-member-ellipsis,\n.code-list em,\n.user-list em,\n.credit-card.normal .signature,\n.credit-card.amex .gladiator,\n.subnav-item:hover,\n.subnav-item:focus,\n.wiki-list em,\n.progress-bar:not(.anim-grow-x),\n.header-search-scope:hover,\n.CommunityTemplate-highlight--focus,\n.related-issue-item.navigation-focus,\n.commit-sha {\n background: var(--bg5) !important;\n}\n.template-previews .discussion-sidebar-heading,\nbody,\n.Box-row-link,\n.btn,\n.social-count,\n.form-control,\n.form-select,\np.explain strong,\n.menu-item.selected,\n.menu-item .octicon,\n.tabnav-tab.selected,\n.tabnav-tab:focus,\n.tabnav-tab:hover,\n.UnderlineNav-item:focus,\n.UnderlineNav-item:hover,\n.UnderlineNav-item.selected,\n.text-gray-dark,\n.link-gray-dark,\n.text-emphasized,\n.Counter--gray-light,\n.markdown-body span.frame span span,\n.table-list-header-toggle .btn-link:hover,\n.table-list-header-toggle .btn-link.selected,\n.table-list-header-toggle .btn-link.selected:hover,\n.table-list-header-toggle .select-menu-button.selected,\n.table-list-header-toggle .select-menu-button.selected:hover,\n.table-list-header-toggle .select-menu-button:hover,\n.breadcrumb strong.final-path,\n.commit-author-section,\n.commits-list-item .commit-title,\n.signed-commit-signer-name .signer,\n.toc-select .select-menu-item-heading,\n.toc-select .select-menu-item-text,\n.blob-code-inner,\n.blob-code-addition .x,\n.blob-code-deletion .x,\n.tabnav-pr .tabnav-tab.selected,\n.discussion-item-entity,\n.discussion-item-ref-title .title-link,\n.pull-request-integrations-title,\n.discussion-item .renamed-is,\n.discussion-item .renamed-was,\n.dropdown-item,\n.keyboard-mappings th,\n.list-group-item-link,\n.team-mention,\n.user-mention,\n.pagehead-actions > li,\n.pagehead-tabs-item:hover,\n.pagehead-tabs-item.selected,\n.reponav-item:focus,\n.reponav-item:hover,\n.reponav-item.selected,\n.steps li.current,\n.prose-diff.collapsed .rich-diff-level-zero.expandable:hover .octicon,\n.prose-diff.collapsed .rich-diff-level-zero.expandable:only-child:hover:before,\n.radio-label,\n.select-menu-divider,\n.select-menu-header .select-menu-title,\n.select-menu-tabs .select-menu-tab-nav:hover,\n.select-menu-tabs a:hover,\n.select-menu-tabs .select-menu-tab-nav.selected,\n.select-menu-tabs .select-menu-tab-nav[aria-selected='true'],\n.select-menu-tabs a.selected,\n.select-menu-tabs a[aria-selected='true'],\n.select-menu-blankslate h3,\n.select-menu-item.selected,\ndetails-menu .select-menu-item[aria-checked='true'],\ndetails-menu .select-menu-item[aria-selected='true'],\n.select-menu-item.selected > .octicon,\ndetails-menu .select-menu-item[aria-checked='true'] > .octicon,\ndetails-menu .select-menu-item[aria-selected='true'] > .octicon,\n.select-menu-item-parent.navigation-focus,\n.select-menu-item-parent.navigation-focus.selected,\n.select-menu-item-parent[aria-selected='true'],\n.select-menu-item-parent[aria-selected='true'].selected,\n.select-menu-item-parent.navigation-focus .octicon-check,\n.select-menu-item-parent.navigation-focus.selected .octicon-check,\n.select-menu-item-parent[aria-selected='true'] .octicon-check,\n.select-menu-item-parent[aria-selected='true'].selected .octicon-check,\n.selected .checks-index-label,\n.code-list em,\n.search-autocomplete-dropdown .autocomplete-text,\n.CommunityTemplate-highlight,\n.dashboard-notice h2,\n.exploregrid-item-title,\n.getting-started .link-text,\n.jump-to-field-active,\n.page-responsive .HeaderMenu-link:hover,\n.page-responsive .HeaderMenu-details[open] .HeaderMenu-link,\n.header-nav-current-user .user-profile-link,\n.select-menu-item.navigation-focus > .octicon.label-options-icon,\n.select-menu-item[aria-selected='true'] > .octicon.label-options-icon,\n.repository-lang-stats ol.repository-lang-stats-numbers li .lang,\n.marketplace-plan-emphasis,\n.merge-branch-heading,\n.oauth-org-access-details .oauth-org-item.on strong,\n.oauth-application-whitelist .request-info strong,\n.oauth-application-info .application-title,\n.developer-app-item .developer-app-name,\n.org-insights-cards [role='tab'][aria-selected='true'],\n.manage-repo-access-not-active,\n.manage-memberships-tabs-item.selected,\n.pinned-repo-checkbox:checked + .pinned-repo-name,\n.access-token .token-description,\n.token-scope,\n.shelf-dismiss .close-button:hover,\n.team-listing .is-open .expand-nested-team,\n.user-status-emoji-tab[role='tab'][aria-selected='true'],\n.subheader-nav .nav-item.selected,\n.illflow-item.selected .illflow-item-heading,\n.MarketingBody-lead > p:first-child,\n.site-header-nav .dropdown-menu a.active,\n.flash {\n color: rgba(255, 255, 255, 0.7) !important;\n}\n.text-alpha,\n.text-beta,\n.text-delta,\n.text-gamma,\nh1,\nh2,\nh3,\nh4,\nh5,\n.link-muted:hover,\n.text-black,\n.menu-item.selected,\n.header-enterprise-version {\n color: rgba(255, 255, 255, 0.65) !important;\n}\n.subnav-bordered,\n.markdown-body h1,\n.markdown-body h2,\n.boxed-group-table th,\n.boxed-group-table td,\n.capped-card > p,\n.capped-card h3,\n.select-menu-item,\ntable.files tr.up-tree,\ntable.capped-list td,\n.pricing-table td {\n border-bottom: 1px solid rgba(255, 255, 255, 0.1) !important;\n}\n.list-browser-item.navigation-focus,\n.headlines li:hover,\n.js-details-container.navigation-focus,\n.js-details-container.navigation-focus:nth-child(2n),\n.team-grid .team-members,\n.tree-browser tr.navigation-focus td,\n.issues-listing .table-list-issues .selectable:hover,\n.issues-listing .table-list-issues .navigation-focus,\n.setup-plans tr.selected,\n.notifications .navigation-focus,\n.sidebar-module ul ul li a:hover,\n.typeahead-result,\n.no-results,\n.link-overlay .link,\n#gollum-editor-help-list,\n.owner-select-target,\n.divider .blob-code div.highlight,\n.oauth-org-access-details .boxed-group-list > li.on:hover,\npre div:hover,\n.summary-stats li a:hover,\n.pinned-repos-selection-list-item.selected,\n.Box-body-row--highlight.navigation-focus,\n.Box-body-row--highlight:hover,\n.js-current .standalone a,\n.menu-item:hover,\n.Box-row--focus-gray.navigation-focus,\n.team-listing .is-open.root-team,\n.Box-row--hover-gray:hover,\n.Box-row--hover-blue:hover,\ntable.files tr[aria-selected='true'] td,\n.label-select-menu .select-menu-item[aria-selected='true'],\n.label-select-menu .select-menu-item.navigation-focus,\n.user-profile-nav {\n background: var(--bg4) !important;\n}\n.ellipsis-expander,\n.hidden-text-expander a,\n.subnav-search-context .btn,\n.markdown-body kbd,\n.email-format .email-hidden-toggle a,\n.commit .commit-title,\n.commit .commit-title a,\n.commit-tease-sha,\n.timeline-commits .author,\n.timeline-commits .commit-message > code a,\n.full-commit .branches-list li,\n.full-commit .sha-block > .sha,\n.full-commit .sha-block > a,\n.branches-tag-list li:first-child,\n.keyboard-mappings,\nkbd,\n.pagehead-tabs-item .Counter,\n.reponav-item .Counter,\n.protip-callout,\n.render-notice,\n.select-menu-header .close-button:hover,\n.select-menu-header .octicon:hover,\n.select-menu-action,\n.page-responsive .HeaderMenu-link,\ntable.capped-list .octicon,\n.illflow-item .illflow-item-heading,\n.action-card-syntax,\n.markdown-format kbd,\n.repohead h1.private .octicon {\n color: rgba(255, 255, 255, 0.6) !important;\n}\nul.sidetabs li a:hover,\n.editbox h1,\n#issues .labels .admin,\n#issues .display .sortbar,\n#facebox .close,\n#issues_search .wrapper,\n.ranked-repositories .meta a,\n.actor,\nul.nav.logged_out,\n.tip-box a.next,\n#inbox .list .unread,\n.main .filterbar,\n.browser-content .footerbar,\nul.smalltabs,\n.snippet,\n.supportstaffer,\n.discussion-form,\n.chooser-box,\n.chooser-box h3,\n#forkqueue .instructions,\n.selector-item.clear:hover,\n#contributors-master svg,\n.inset-callout h2,\n.documentation ul.nav,\n.date_selector td.selected,\n#contributors-master,\n.context-title,\n.list-module h2,\n.bootcamp-help h1,\ntable.files tr.up-tree a:hover,\n.ellipsis-button:hover,\n.codesearch-results .repo-list-name em,\n.codesearch-results .repo-list-description em,\n.blog-search-results em,\n.codesearch-cols em,\nul.bignav li a:hover,\nul.smallnav li a:hover,\n.comments-wrapper,\n.rackspace,\n.subnav-bar > ul > li > ul > li > a:hover,\n.issue.active,\n.orgs-nav .count,\n.filter-item:not(.selected):hover,\n.task-progress .progress-bar .progress,\n.oauth-connection-illustration .oauth-image,\n.manage-repo-access-wrapper:before,\n.counter,\n.Counter,\n.block-diff-neutral {\n background: var(--bg6) !important;\n}\n.vcard-detail .octicon,\n.member-badge .octicon,\n.command-bar .octicon-question:before,\n.news .alert .time,\nul.color-label-list .color-label.zeroed,\nul.color-label-list .color-label.zeroed .count,\n.gh-header-title .issue-number,\na.leaderboard-list-rank,\n.bootcamp ul li a,\n.ssh-key-fingerprint,\n.tag-references > li a,\n.release .release-authorship,\n.branches .branch-summary,\n.branches .no-results-message,\nheader ul.links > li a,\n.team-info-card .stats-group .stat,\n.team-info-card .stats-group .stat.no-link:hover,\n.discussion-sidebar-item,\n.issues-listing .table-list-issues .issue-meta,\n.task-progress,\n.table-list-milestones .stat-label,\n.table-list,\n#blog-home,\n.blog-post-meta,\n.blog-post-meta a,\n.blog-post-meta .octicon,\n.diff-line-num,\n.file-data .line-numbers span,\n.discussion-item .timestamp,\n.branch-status .divider,\n.news .alert .octicon,\n.news .alert .mega-octicon,\n.blankslate > .mega-octicon,\n.repo-list-meta,\na.discussion-item-help,\n.page-new-repo .license-info,\n.notification-actions .btn-link,\n.commit-info .commit-meta,\n.notifications .read .type-icon,\n.notification-actions .age,\n.list-item .byline,\n.issue-list-meta,\n.blob-num-expandable .diff-expander,\n.file-type-icon,\n.uploaded-files .remove,\n.releases-tag-list td.date a,\n.collaborators .collab-remove .remove-link,\n.octofication .notice-dismiss,\nul.comparison-list > li .octicon,\ndiv.content-header h6,\n.fullscreen-overlay textarea,\n.blob-num.non-expandable:hover,\n.breadcrumb,\n.application-authorizations .oauth-app-list-meta,\n.application-authorizations .oauth-app-owner,\n.boxed-group-inner .help,\n.thread-subscription-status .reason,\n.toc-diff-stats .octicon,\n.blob-num,\n.recent-gists .description .blank,\n.recent-gists .metadata,\n.member-meta .access-link,\n.gist-quicksearch-no-results,\n#user-content-toc ul ul li:before,\n.btn-octicon,\nbutton.btn-octicon,\n.user-list li em,\n.reponav-item .octicon,\n.pagehead-tabs-item .octicon,\n.table-list-header-toggle .btn-link,\n#graph_data h2,\n#message-list .message .time,\n.tabnav .tabnav-extras,\n.discussion-item-integrations-callout .pull-request-integrations-dismiss,\n.oauth-application-info .meta-link,\n.oauth-application-info .app-info,\n.repo-file-upload-file-wrap .remove-file,\n.gcr-ext-editor-close svg,\n.commit-id,\n.orghead .edit-org,\n.signed-commit-badge,\n.manage-member-meta-item .btn-link,\n.note,\n.topic-tag-action .add-topic-button,\n.topic-tag-action .remove-topic-button,\n.text-gray-light,\n.js-notice .octicon-x,\na.footer-octicon:hover,\n.table-of-contents .toc-diff-stats .octicon {\n color: rgba(255, 255, 255, 0.3) !important;\n}\n.btn:disabled,\n.btn:disabled:hover,\n.btn.disabled,\n.btn.disabled:hover,\nbutton.button:disabled,\nbutton.button:disabled:hover,\nbutton.button.disabled,\nbutton.button.disabled:hover,\nbutton.minibutton:disabled,\nbutton.minibutton:disabled:hover,\nbutton.minibutton.disabled,\nspan.minibutton.disabled,\na.minibutton.disabled,\nbutton.minibutton.disabled:hover,\na.minibutton:disabled:hover,\na.minibutton.disabled:hover,\nspan.minibutton:disabled:hover,\nspan.minibutton.disabled:hover,\n.search-result-group,\n.gist-quicksearch-result-group {\n background: var(--bg2) !important;\n border-color: var(--bg2) !important;\n color: rgba(255, 255, 255, 0.2) !important;\n}\n.avatar.avatar-more,\n.AvatarStack--right .avatar.avatar-more:after,\n.markdown-body .csv-data th,\n.capped-card-content,\n.new-discussion-timeline .previewable-comment-form .comment-form-head.tabnav,\n.select-menu-divider,\n.select-menu-header,\n.payment-history .failed,\n.payment-history .refunded,\n.search-autocomplete-dropdown .autocomplete-keyword-only,\n.tint-box,\n.MarketplaceEdit-body .menu-item:hover,\ntable.files tr.navigation-focus td,\ntable.files tr[aria-selected='true'] td,\n.team-member-ellipsis:hover,\ntable.capped-list th,\n.action-card:after,\n.action-card:before,\n.action-card-header:before,\n.gistsearch-aside .filter-list li span.bar,\n.gist-quicksearch-results .gist-quicksearch-result-header {\n background: var(--bg1) !important;\n}\n.sidebar-module,\n.form-control,\n.form-select,\n.octotree_github_sidebar input[type='text'],\n.octotree_github_sidebar textarea,\ndiv.search-form input,\n#search > input[name='q'] {\n background-color: var(--bg2) !important;\n border-color: var(--bg2) !important;\n}\n.octofication .message,\n.panel-nav:not(.disabled):active,\n.diagram-icon:not(.active),\n.btn.btn-outline:hover:not(.ajax-pagination-btn),\n.btn.btn-outline.zeroclipboard-is-hover,\n:checked + .radio-label,\n.gist-snippet .file-box:hover .file,\n.octofication .message,\n.reaction-sort-item.selected,\n.pull-request-link,\ndiv.project-card:focus,\n.timeline-progressive-disclosure-button:hover,\n.release-timeline-tags .expander-text:hover .expander-dots,\n.review-comment[aria-selected='true'],\n.timeline-comment[aria-selected='true'] .review-summary .comment-body {\n border-color: var(--selected) !important;\n}\n.repo-file-upload-progress,\n.project-updated-message,\n.delete-topic-button,\n.topic-tag-action .add-topic-button,\n.topic-tag-action .remove-topic-button,\n.commit-desc + .commit-branches,\n.full-commit .btn-outline {\n border-color: var(--btn3) !important;\n}\n.template-previews .discussion-sidebar-heading:hover,\n.zeroclipboard-link,\na:not(.IssueLabel),\n.Box-row.navigation-focus .Box-row--drag-button,\n.Box-row-link:hover,\n.btn-blue .Counter,\n.btn-outline,\n.btn-outline.selected .Counter,\n.btn-outline:active .Counter,\n.btn-outline:hover .Counter,\n[open] > .btn-outline .Counter,\n.social-count:hover,\n.btn-link,\n.drag-and-drop-error-info a,\na.tabnav-extra:hover,\n.pagination a,\n.pagination em,\n.pagination span,\n.text-blue,\n.link-gray:hover,\n.link-gray-dark:hover,\n.link-hover-blue:hover,\n.muted-link:hover,\na.branch-name,\n.ajax-pagination-form .ajax-pagination-btn,\n.btn-invisible,\n.btn-invisible.selected,\n.btn-invisible.zeroclipboard-is-active,\n.btn-invisible.zeroclipboard-is-hover,\n.btn-invisible:active,\n.btn-invisible:focus,\n.btn-invisible:hover,\n.btn-octicon:hover,\n.commit .commit-title .issue-link,\n.commit-link,\n.timeline-commits .commit-message > code a:hover,\n.commit-id:hover,\n.discussion-sidebar-toggle:hover,\n.milestone-name:hover,\n.sidebar-assignee .assignee:hover,\n.participation a:hover,\n.timeline-comment-action:focus,\n.timeline-comment-action:hover,\n.discussion-item-link:hover,\n.discussion-item-entity:hover,\n.discussion-item-ref-title .title-link:hover,\n.discussion-item-help:hover,\n.steps li.current .octicon,\n.prose-diff .show-rich-diff,\n.select-menu-action:hover,\n.select-menu-new-item-form .octicon,\n.marketing-hero-octicon .octicon,\n.intgrs-lstng-item-link:hover .intgrs-lstng-item-header,\n.intgr-admin-link:hover .octicon,\n.listgroup-item:hover .link-small,\n.rule-type-conditions,\n.code-list .blob-num a:hover,\n.coupon-icon,\n.dashboard-notice .octicon-organization,\n.dashboards-overview-cards .summary-stats .metric-1,\n.repo-snipit:hover .repo-snipit-description,\n.repo-snipit:hover .repo-snipit-name,\n.exploregrid-item:hover .exploregrid-item-title,\n.getting-started .link-text strong,\n.scoped-search .form-control.focus .header-search-scope,\n.issues-reset-query:hover,\n.milestone-title-link a:hover,\n.milestone-description .expand-more,\na.task-progress:hover,\n.page-new-repo .license-info,\n.notifications .notifications-more > a,\n.notifications-sso-prompt em,\n.notification-actions .btn-link:hover,\n.oauth-application-whitelist .edit-link:hover,\n.developer-app-item .developer-app-name:hover,\n.org-insights-card-legend .metric-0,\n.orghead .edit-org:hover,\n.export-actions a:hover,\n.member-row a:hover,\n.invite-team-member-list .team-link,\n.stats-group-stat:hover,\n.stats-group-stat:hover .stat-number,\n.ldap-memberships-list .edit,\n.project-comment-body-hover .octicon-pencil:hover,\n.project-comment-title-hover .octicon-pencil:hover,\n.profile-rollup-toggle:hover,\n.pr-toolbar .subset-files-tab,\n.numbers-summary a:hover,\ntable.files td.message a:hover,\n.session-details:hover .octicon,\n.setup-header .lead a:hover,\n.shelf-dismiss:hover,\n.orgs-help-item-octicon .octicon,\n.orgs-help-dismiss:hover,\n.team-member-ellipsis:hover,\n.team-listing .team-name,\n.team-listing .team-show-more,\n.team-listing .expand-nested-team:hover,\n.tree-browser tr.navigation-focus td .octicon-chevron-right,\n.tree-browser tr[aria-selected='true'] td .octicon-chevron-right,\n.tree-browser-result mark,\n.toolbar-commenting .dropdown-item:hover,\n.toolbar-commenting .dropdown-item:focus,\n.toolbar-item .menu-target:hover,\n.toolbar-item:hover,\n.toolbar-item .menu-target:focus,\n.toolbar-item:focus,\n.link-mktg:hover,\n.btn-outline-mktg:hover,\n.illflow-blue .illflow-item .illflow-item-heading,\n.MarketingBody-lead a:hover {\n color: var(--selected) !important;\n}\n.HeaderNavlink:hover,\n.HeaderNavlink:focus,\ntable.files .octicon-file-directory,\ntable.files .octicon-file-symlink-directory,\ntable.files .octicon-file-submodule,\n.header-logo-invertocat:hover,\n.notification-indicator:hover,\n.btn.btn-outline,\n.full-commit .btn-outline:not(:disabled):hover,\n.markdown-body a strong,\n.markdown-format a strong,\n.notifications.list-group a:hover,\n.octotree_sidebar .octotree_bottom a:hover i:before {\n color: var(--selected) !important;\n}\n#com #header .top-nav .dropdown-button:hover .dropdown-caret,\n.header-nav-link:hover .dropdown-caret,\n.header-nav-link:focus .dropdown-caret,\n.header-navlink:hover .dropdown-caret,\n.header-navlink:focus .dropdown-caret,\n.HeaderNavlink:hover .dropdown-caret,\n.HeaderNavlink:focus .dropdown-caret {\n border-top-color: var(--selected) !important;\n}\n.btn-primary:not(.compare-button):not(.btn-outline):not([disabled]):not(.disabled),\n.button.primary,\n.btn-theme-green,\n.btn-primary-mktg {\n background: var(--btn) !important;\n border-color: var(--btn) !important;\n}\n.btn-primary:not(:disabled):not(.disabled):not(.compare-button):not(.btn-outline):hover,\n.button.primary:not(:disabled):hover,\n.btn-theme-green:hover,\n.btn-primary-mktg:hover {\n background: var(--btn) !important;\n border-color: #7686C3 !important;\n}\nimage-crop .handle:before,\n.pagination a,\n.pagination em,\n.pagination span,\n.AvatarStack-body,\n.blankslate code,\n.markdown-body .csv-data .blob-num,\n.ajax-pagination-form .ajax-pagination-btn,\n.autocomplete-results,\n.suggester,\n.boxed-group-inner,\n.commit-group-title .octicon-git-commit,\n.full-commit .commit-meta,\n.conversation-list-heading .inner,\n.details-overlay[open] > .dropdown-item:hover,\n.discussion-timeline.team-discussion-timeline .blankslate,\nul.comparison-list,\n.tint-box.transparent,\n.dashboard-notice .coupon,\n.getting-started .list-group-item,\n.topic-tag-outline,\n.MarketplaceEdit-body .menu-item.selected,\n.oauth-org-access-details .oauth-org-item.on,\n.oauth-org-access-details .oauth-org-item.revoked,\n.manage-repo-access-icon,\ntable.files,\n.qr-code-table .white,\n.action-card:after,\n.action-card-controls:before,\n.actions-bg-mask,\n.TenYearNav-year.selected .TenYearNav-digits,\n.TenYearNav-year:hover .TenYearNav-digits,\n.gist-snippet-meta .gist-count-links > li > a:hover,\n.gist-quicksearch-results,\ndiv#common-issues ul,\n.markdown-format img,\n.dropdown-menu,\n.btn-primary .counter,\n.bg-white,\n.card,\n.pagination > span,\n.rgh-reactions-near-limit,\n.select-menu-item {\n background: var(--bg2) !important;\n}\n.timeline-comment.current-user,\n.github-jobs-promotion p,\n.octotip,\n.markdown-format .alert:not(.warning),\n.full-commit.commit,\n.bootcamp .bootcamp-body,\n.bootcamp h1,\n.owners-notice,\n.new-user-avatar-cta,\n.full-commit .browse-button,\n.commit-ref,\n.branch-name,\n.timeline-comment.current-user .timeline-comment-header .timeline-comment-label,\n.file-history-tease,\n.flash,\n.flash-global,\n.feature-banner,\n.recently-touched-branches,\n.timeline-progressive-disclosure-items button,\n.pr-toolbar .subset-files-tab,\narticle.full .alert,\n.btn.btn-blue,\n.topic-tag,\n.RecentBranches,\n.js-tag-input-tag,\nul.search-results li .label,\n.topic-tag-action,\n.alert {\n border: 1px solid var(--btn2) !important;\n}\n.timeline-comment.current-user .timeline-comment-header,\n.blob-history,\n.recently-touched-branches li {\n border-bottom-color: var(--btn2) !important;\n}\n.timeline-comment.current-user .timeline-comment-header,\n.github-jobs-promotion p,\n.octotip,\n.markdown-format .alert:not(.warning),\n.full-commit.commit,\n.flash,\n.bootcamp h1,\n.bootcamp-body,\n.owners-notice,\n.full-commit .browse-button,\n.blob-history,\n.branch-name,\n.new-user-avatar-cta,\n.jstree-wholerow-clicked,\n.commit-ref,\n.api .alert,\n.file-history-tease,\n.flash,\n.flash-global,\n.feature-banner,\n.recently-touched-branches,\n.pr-toolbar .subset-files-tab,\narticle.full .alert,\n.btn.btn-blue,\n.hook-delivery-guid,\n.topic-tag,\n.topic-tag-action,\n.delete-topic-button,\n.topic-tag-action .add-topic-button,\n.topic-tag-action .remove-topic-button,\n.RecentBranches,\n.signup-prompt-bg,\nul.search-results li .label,\ndiv[style*='background-color: #044d6e'],\n.alert,\n.btn-mktg {\n background: var(--btn4) !important;\n}\n.timeline-comment.current-user:before {\n border-right-color: var(--btn2) !important;\n}\n.diff-table tr:hover > pre,\n.highlight:not(.lines) tr:not(.inline-comments):hover td.selected-line.blob-code:not(.line-age),\n.highlight:not(.lines) tr:not(.inline-comments):hover td.blob-code,\n.blob-code-hunk,\n.blob-code-expandable {\n background: var(--bg2) !important;\n}\n.pagination a:focus,\n.pagination a:hover,\n.pagination em:focus,\n.pagination em:hover,\n.pagination span:focus,\n.pagination span:hover,\n.select-menu-item + .semantic-toc-file:after,\n.semantic-toc-symbol:not(.last-visible):after,\n.tabnav-pr,\n.tabnav-pr .tabnav-tab.selected,\n.plans-card-btn {\n border-color: transparent !important;\n}\n::-webkit-scrollbar-track,\n::-webkit-scrollbar-corner {\n background: var(--bg3) !important;\n}\n::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1) !important;\n}\npath.js-diff-placeholder {\n fill: var(--bg5) !important;\n}\n.repohead.experiment-repo-nav,\n.discussion-timeline-actions,\n.gh-header {\n background-color: var(--bg3);\n}\n.timeline-comment-wrapper {\n border-bottom: 2px solid var(--bg5);\n border-top: 2px solid var(--bg5);\n}\n.discussion-timeline-actions {\n border-top: 2px solid var(--bg5);\n}\n.discussion-item-icon {\n border: 2px solid var(--bg5);\n}\n.discussion-timeline:before,\n.profile-timeline.discussion-timeline:before,\n.profile-timeline.discussion-timeline .profile-timeline-month-heading:after {\n background-color: var(--bg5);\n}\n.thread-subscription-status {\n background-color: var(--bg3) !important;\n}\n.Counter {\n color: rgba(255, 255, 255, 0.75);\n}\n.UnderlineNav-item.selected,\n.UnderlineNav-item:focus,\n.UnderlineNav-item:hover {\n border-bottom-color: var(--selected);\n}\n.profile-timeline-year-list {\n background: var(--bg3) !important;\n}\n.contribution-activity .filter-item.selected {\n color: rgba(0, 0, 0, 0.7) !important;\n}\n.markdown-body img {\n background-color: transparent;\n}\n.ellipsis-expander,\n.hidden-text-expander a {\n background: rgba(0, 0, 0, 0.2);\n}\n\n/* CODE */\n.pl-s .pl-s1,\n.pl-smi {\n color: #b2ccd6;\n}\n.pl-e,\n.pl-en {\n color: #50fa7b;\n}\n.pl-c1,\n.pl-s .pl-v {\n color: #ffb86c;\n}\n.pl-pds,\n.pl-s,\n.pl-s .pl-pse .pl-s1,\n.pl-sr,\n.pl-sr .pl-cce,\n.pl-sr .pl-sra,\n.pl-sr .pl-sre {\n color: #f1fa8c;\n}\n.pl-ent {\n color: #8be9fd;\n}\n.pl-mi1 {\n color: #8be9fd;\n background-color: var(--bg4);\n}\n.pl-k {\n color: #ff79c6;\n}\n.pl-smw,\n.pl-v {\n color: #bd93f9;\n}\n.pl-c {\n color: #6272a4;\n}\n.blob-code-inner.highlighted {\n background-color: var(--btn);\n}\n.blob-code-deletion {\n background-color: hsla(353, 25%, 30%, 1);\n}\n.blob-num-deletion {\n background-color: hsla(353, 25%, 25%, 1);\n border-color: hsla(353, 25%, 20%, 1);\n}\n.blob-code-addition {\n background-color: hsla(137, 25%, 30%, 1);\n}\n.blob-num-addition {\n background-color: hsla(137, 25%, 25%, 1);\n border-color: hsla(137, 25%, 20%, 1);\n}\n.blob-code-addition .x {\n background-color: hsla(135, 73%, 30%, 1);\n}\n.blob-code-deletion .x {\n background-color: hsla(353, 73%, 30%, 1);\n}\n.timeline-comment {\n color: inherit;\n}\n/* comments */\n.comment-body,\n.js-comment-body {\n color: #f8f8f2 !important;\n}\n/* timeline background lines, badges, etc */\n.TimelineItem-break {\n background-color: var(--bg3) !important;\n border-top: 4px solid var(--bg5) !important;\n}\n.TimelineItem:before {\n background-color: var(--bg5) !important;\n}\n.TimelineItem-badge {\n border: 2px solid var(--bg5) !important;\n}\n/* tabs on the comment box and such, Write, Preview, etc */\n.tabnav-tab.selected,\n.tabnav-tab[aria-selected='true'] {\n background-color: var(--bg5) !important;\n border-color: var(--bg4) !important;\n}\n/* badges, like bug, feature, etc, */\n.protip code {\n background-color: var(--bg5) !important;\n padding: 3px;\n}\n.menu-item.selected {\n background-color: var(--bg4);\n}\n.menu .menu-item:hover {\n background-color: var(--bg5) !important;\n}\n.timeline-comment--caret:after,\n.timeline-comment--caret:before {\n border-right-color: var(--bg1);\n}\n.Popover-message:after {\n border-bottom-color: var(--bg1);\n}\n.Popover-message--bottom-left:after,\n.Popover-message--bottom-right:after,\n.Popover-message--bottom:after {\n border-top-color: var(--bg1);\n}\n.Popover-message--right-bottom:after,\n.Popover-message--right-top:after,\n.Popover-message--right:after {\n border-left-color: var(--bg1);\n}\n.select-menu-tabs .select-menu-tab-nav.selected,\n.select-menu-tabs .select-menu-tab-nav[aria-selected='true'],\n.select-menu-tabs a.selected,\n.select-menu-tabs a[aria-selected='true'] {\n color: #24292e;\n background-color: var(--btn);\n border-color: var(--btn);\n}\n.TimelineItem-badge {\n background-color: var(--bg5);\n}\n.TimelineItem-badge .octicon {\n fill: hsla(0, 0%, 100%, 0.5);\n}\n.TimelineItem-body {\n color: hsla(0, 0%, 100%, 0.33);\n}\n.commit-ref,\n.branch-name {\n color: hsla(0, 0%, 100%, 0.4);\n}\n.diffbar,\n.pr-toolbar {\n background-color: var(--bg3);\n}\n.orghead {\n background-color: var(--bg1);\n}\n\n.comment-body a {\n color: var(--accents) !important;\n}\n", - "domains": [ - "github.com" - ] - } - ], - "name": "Dracula GitHub", - "originalDigest": "f68b01ff04b2cc0ddb61d0b91dfd2f3b87b1af73", - "id": 26, - "updateDate": 1581223257532 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/176998.json", - "md5Url": "https://update.userstyles.org/176998.md5", - "url": "http://userstyles.org/styles/176998", - "originalMd5": "1175f7014bcea33009b6ff8ed2603887", - "installDate": 1581128402636, - "sections": [ - { - "urls": [], - "urlPrefixes": [], - "domains": [ - "stackoverflow.com", - "superuser.com", - "serverfault.com", - "askubuntu.com", - "stackexchange.com" - ], - "regexps": [], - "code": "/* Conwy - Stack Exchange\r\n Version: 1.0.0\r\n Author: lineav\r\n Licence: https://creativecommons.org/licenses/by-sa/4.0/\r\n*/\r\n\r\n/* Invert the whole website */\r\nhtml {\r\n filter: invert(0.80) hue-rotate(180deg) contrast(1.2)!important;\r\n background: #ffffff !important;\r\n}\r\n\r\nimg {\r\n filter: invert(1) hue-rotate(180deg) brightness(1.1) contrast(1.05)!important;\r\n}\r\n\r\n/* invert logo */\r\nimg.h-auto.wmx100 {\r\n filter: invert(0)!important;\r\n}\r\n\r\n/* make scrollbars dark */\r\n::-webkit-scrollbar {\r\n background: #2f2f2f;\r\n width: 0.8em;\r\n}\r\n::-webkit-scrollbar-thumb {\r\n background-color: #555555;\r\n outline: 1px solid #111111;\r\n}" - } - ], - "name": "Conwy - Stack Exchange", - "originalDigest": "055ce9ac0041cad64b4c5245fb4bb1083a231dc2", - "id": 29 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/174814.json", - "md5Url": "https://update.userstyles.org/174814.md5", - "url": "http://userstyles.org/styles/174814", - "originalMd5": "fcfb3986795d61f47eb67338edb01330", - "installDate": 1581129281945, - "sections": [ - { - "code": "html, body {\n\tbackground-color: #282a36;\n\tcolor: #f3f3f3;\n}\n\n.style-name-link {\n color: #f3f3f3;\n}\n\n#header {\n\tborder-color: transparent;\n\tbox-shadow: 0 0 16px -3px #191A21;\n}\n\n#options input[type=\"number\"] {\n\tborder-width: 1px;\t\n}\n\ninput[type=\"number\"],\nselect,\ninput[type=\"checkbox\"],\nbutton,\ninput:not([type]) {\n\tbackground-color: #282a36;\n\tborder-color: #191A21 !important;\n\tcolor: #6272a4;\n\tbackground: none;\n\tborder-radius: .2rem;\n\ttransition: .12s all;\n}\n\ninput[type=\"number\"]:hover,\nselect:hover,\ninput[type=\"checkbox\"]:hover,\nbutton:not([disabled]):hover,\ninput:not([type]):hover {\n\tborder-color: #6272a4 !important;\n\tbackground-color: #282a36 !important;\n\tcolor: #f3f3f3;\n\tcursor: pointer;\n}\n\ninput:not([type]):hover {\n\tcursor: auto !important;\n}\n\ninput[type=\"checkbox\"] {\t\n\tborder-color: #191A21 !important;\n}\n\nsvg.svg-icon.checked,\nsvg.svg-icon.select-arrow {\n\tfill: #6272a4;\n}\n\n#enabled-label:hover svg {\n\tfill: #f3f3f3 !important;\n}\n\n.cm-s-dracula .CodeMirror-activeline-background {\n\tbackground: #2d2e3b;\t\n}\n\n.resize-grip {\n\tborder-color: transparent;\n\tbox-shadow: 0 0 15px -.5px #191A21;\n\tborder-radius: 2rem !important;\n}\n\n.resize-grip::after {\n\tborder: none;\n}\n\n.CodeMirror-focused,\n.codeMirror>div>textarea {\n\toutline: none !important;\n}", - "regexps": [ - "moz-extension://.*" - ] - } - ], - "name": "dracula: stylus", - "originalDigest": "52c36bb7712fdb6f67195019664f060f4838a4f6", - "id": 30, - "updateDate": 1581130211735 - }, - { - "enabled": true, - "updateUrl": "https://userstyles.org/styles/chrome/170121.json", - "md5Url": "https://update.userstyles.org/170121.md5", - "url": "http://userstyles.org/styles/170121", - "originalMd5": "25c77995809000a269e5275133b6a485", - "installDate": 1581129599953, - "sections": [ - { - "code": "body, td, tr, input, textarea, select {\n font-family: 'open sans', 'source sans pro', 'helvetica neue', sans-serif;\n}\n\n.gt {\n font-size: 90%;\n line-height: 1.5em;\n font-weight: 400;\n color: #222;\n}\n\n.LW-avf {\n font-size: 0.95em;\n line-height: 1.45em;\n}\n\n/* //////// GLOBAL NON-COLOR ///////// */\n\n.Bu.y3, .aKB, .aKl {\n display: none;\n}\n\n.aAy {\n width: auto;\n}\n\n/* opacity icons */\n\n.gbqfi, .gb_X .gb_Nb .gb_Pb, .aQS, .n4 .G-asx, .aii, .gb_Pb, .T-I-auR.ayk-axZ-aup-I .ayk-axZ-aup-auo, .aqN, .aos, .gb_Qb {\n opacity: .7;\n background-color: transparent;\n}\n\n.gb_Rb {\n opacity: 0.7;\n}\n\n.l6 {\n padding-top: 0;\n}\n\n.J-KU-Jg-K9 .J-KU .aAy, .aRy, .aKj {\n height: 46px;\n}\n\nbody, td, tr, input, textarea, select {\n font-family: \"Helvetica Neue\", arial;\n}\n\n.aKj {\n padding-top: 4px;\n}\n\n/* search text*/\n\n.gbqfif, .gbqfq {\n height: auto;\n font-family: \"Helvetica Neue\", arial;\n margin: 0;\n}\n\n/* tab icons, something, labels */\n\n.aKp, .aRx, .as {\n display: none;\n}\n\n/* //////// BACKGROUND COLOR ///////// */\n\n.wl {\n background: #171A21;\n /* background: linear-gradient(45deg, #042029 0%,#073642 146%); */\n}\n\n/* //////// TRANSLUSCENT WHITE ///////// */\n\n.aOd, .aJ6 {\n color: rgba(255,255,255,.7);\n}\n\n.aAy.aAy.aIf-aLe.J-KU-Je.J-KU-JW .aKo {\n background-color: rgba(255,255,255,.7);\n}\n\n.J-KU-Jg-K9.aAA .aAy, .J-KU-Jg-K9.aAA .J-KU-KO.aAy, .aKj, .yO, .xY, .aKz, .gbqfqw, #gbqfb, .UI .TB {\n border: none;\n background: transparent;\n color: rgba(255,255,255,.7);\n box-shadow: none;\n}\n\n/* search bar */\n\n.gbqfqw {\n border-bottom: 1px dashed rgba(255,255,255,.3);\n /*\n border-bottom: 1px dashed rgba(0,0,0,.3);\n */\n}\n\n/* //////// TRANSLUSCENT BLACK ///////// */\n\n.NQ {\n background-color: rgba(0,0,0,.3);\n}\n\n\n/* //////// SEARCH TEXT COLOR ///////// */\n\n.gbqfif {\n color: #F573C7;\n}\n\n/* //////// UNREAD HIGHLIGHT LINE ///////// */\n\n.zE {\n background: #292936;\n}\n\n/* //////// EMAIL FROM ///////// */\n\n.xY, .e, .x2, .CL .CK {\n color: #8DBBE0;\n}\n\n/* //////// EMAIL TITLE ///////// */\n\n.y6 span {\n color: #7A8CBE;\n}\n\n/* //////// GRAY VARIANT 1 ///////// */\n\n.TO .n0, .akh, .mj, .l8, .l9, .ma, .B .Di .Dj, .l6, .z .Di .Dj, .Wz .Wy {\n color: #878C91;\n}\n\n/* buttons */\n\n.T-I-KE, .G-atb .T-I-ax7, .TD, .aOd {\n color: #878C91;\n background-color: rgba(0,0,0,.35);\n background-image: none;\n border: none;\n}\n\n/* //////// GRAY VARIANT 2 ///////// */\n\n.y6 .y2, .h0, .C .Di .Dj {\n color: #878C91;\n}\n\n/* //////// SIDEBAR MORE LINK ///////// */\n\n.n4 {\n color: #F573C7;\n}\n\n/* active menu item tick */\n\n.ain {\n border-color: #F573C7;\n}\n\n/* //////// HOUHIN ///////// */\n\n.bX a, .Cz.J-J5-Ji.e {\n color: #B587DE;\n}\n\n/* contact header */\n\n.bX {\n color: #B587DE;\n background-color: rgba(0,0,0,.35);\n}\n\n/* //////// SENCHA ///////// */\n\n.T-I-auR {\n background-image: none;\n border: none;\n background-color: #B587DE;\n color: rgba(255,255,255,.8);\n}\n\n/* Promotions line */\n\n.aJi-aLe .aDG, .aAy.J-KU-JW.aAy.aJi-aLe .aKo, .aAy.J-KU-KO.aAy.aJi-aLe .aKo {\n background-color: #B587DE;\n}\n\n/* //////// SHENG ///////// */\n\n/* flash alerts */\n\n.b8 .vh, .cc .vh, .vX .vh {\n background-color: #FFBA66;\n border: none;\n color: rgba(0,0,0,.85);\n}\n\n/* Updates Line */\n\n.aH2-aLe .aDG, .aAy.J-KU-JW.aAy.aH2-aLe .aKo, .aAy.J-KU-KO.aAy.aH2-aLe .aKo {\n background-color: #DEF085;\n}\n\n/* //////// GAIWAN ///////// */\n\n/* tooltips */\n\n.T-ays, .T-ays-atD, .T-ays-atC {\n background-color: #878C91;\n border: none;\n color: rgba(0,0,0,.85);\n}\n\n/* //////// KYUSU ///////// */\n\n.aIf-aLe .aDG, .aAy.J-KU-JW.aAy.aIf-aLe .aKo, .aAy.J-KU-KO.aAy.aIf-aLe .aKo {\n background-color: #FFBA66;\n}\n\n/* did you mean */\n\n.Wz, .ya {\n color: #FFBA66;\n background-color: rgba(0,0,0,.35);\n padding: 11px;\n}\n\n/* email line cursor */\n\n.PF.xY.PE {\n background: #FFBA66;\n}\n\n/* tab text */\n\n.aKz {\n color: #FFBA66;\n}", - "domains": [ - "mail.google.com" - ] - } - ], - "name": "dracula: gmail", - "originalDigest": "e3be0bd4ec5291d6ce6a194524e36ff2d77f3bac", - "id": 31, - "updateDate": 1581130222031 - } -] \ No newline at end of file diff --git a/modules/themes/alucard/config/inkscape/default-template.svg b/modules/themes/alucard/config/inkscape/default-template.svg deleted file mode 100644 index ff14f948..00000000 --- a/modules/themes/alucard/config/inkscape/default-template.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - Default template - 2020-08-05 - - diff --git a/modules/themes/alucard/config/polybar/config b/modules/themes/alucard/config/polybar/config deleted file mode 100644 index 6d89840e..00000000 --- a/modules/themes/alucard/config/polybar/config +++ /dev/null @@ -1,385 +0,0 @@ -[colors] -black = ${xrdb:color0} -bblack = ${xrdb:color8} -red = ${xrdb:color1} -bred = ${xrdb:color9} -green = ${xrdb:color2} -bgreen = ${xrdb:color10} -yellow = ${xrdb:color3} -byellow = ${xrdb:color11} -blue = ${xrdb:color4} -bblue = ${xrdb:color12} -magenta = ${xrdb:color5} -bmagenta = ${xrdb:color13} -cyan = ${xrdb:color6} -bcyan = ${xrdb:color14} -white = ${xrdb:color7} -bwhite = ${xrdb:color15} - -bg = ${xrdb:background} -fg = ${colors.magenta} -bg-alt = #1E2029 -fg-alt = #373844 -bg-dark = #181a23 - -alert = ${colors.yellow} -accent = #604c7e - - -[global/wm] -margin-top = 0 -margin-bottom = 34 - -[bar/main] -monitor = ${env:MONITOR} -monitor-strict = true -enable-ipc = true -wm-restack = bspwm -# REQUIRED to move the window with hideit.sh -override-redirect = true -fixed-center = true - -background = ${colors.bg} -foreground = ${colors.fg} - -width = 100% -height = 34 -offset-x = 0 -offset-y = 0 -# bottom = true - -overline-size = 0 -overline-color = #f00 -underline-size = 0 -underline-color = #00f - -border-bottom-size = 0 -border-top-size = 1 -border-color = ${colors.bg-dark} - -padding-left = 2 -padding-right = 2 -module-margin-left = 0 -module-margin-right = 0 - -font-0 = "Fira Code:pixelsize=9;2" -font-1 = "Wuncon Siji:pixelsize=12;2" -font-2 = "Siji:pixelsize=10;2" - -; modules-left = volume pad cpu memory pad pkg mail -modules-left = pulseaudio pad cpu memory pad fs -modules-center = bspwm -modules-right = syncthing redshift wlan pad network-up pad network-down pad battery pad date - -;tray-position = center -;tray-padding = 2 -;tray-transparent = true -;tray-background = #0063ff - -[module/bspwm] -type = internal/bspwm -pin-workspaces = true -enable-click = true - -# ws-icon-0 = 1; -# ws-icon-1 = 2; -# ws-icon-2 = 3; -# ws-icon-3 = 4; -# ws-icon-4 = 5; -# ws-icon-5 = 6; -ws-icon-default =  - -format = -label-padding = 1 - -label-focused = %icon% -label-focused-background = ${colors.bg-dark} -label-focused-foreground = ${colors.fg} -# label-focused-underline = ${colors.magenta} -; label-focused-foreground = ${xrdb:color2} -label-focused-padding = 1 - -label-occupied = %icon% -label-occupied-foreground = ${colors.accent} -label-occupied-padding = 1 - -; label-urgent = %icon% -label-urgent-foreground = ${colors.alert} -; label-urgent-background = ${colors.alert} -label-urgent-padding = 1 - -label-empty = %icon% -label-empty-foreground = ${colors.fg-alt} -label-empty-padding = 1 - -[module/date] -type = internal/date -interval = 5 - -label = %date% %time% -date = %A, %h %d -date-alt = %Y-%m-%d -time = %I:%M %p -time-alt = %H:%M:%S -format-prefix = "" -format-prefix-padding = 1 -; format-prefix-background = ${colors.bg-alt} -format-prefix-foreground = ${colors.accent} -; format-underline = ${xrdb:color4} - -[module/fs] -type = internal/fs -mount-0 = / -mount-1 = /mnt/projects ; for desktops -mount-2 = /home ; for laptop -interval = 30 - -; Available tags: -; (default) -; -; -; -format-mounted = "" -format-mounted-foreground = ${colors.accent} -; Available tokens: -; %mountpoint% -; %type% -; %fsname% -; %percentage_free% -; %percentage_used% -; %total% -; %free% -; %used% -; Default: %mountpoint% %percentage_free%% - -; Available tags: -; (default) -format-unmounted = -label-unmounted = -label-unmounted-foreground = ${colors.fg-alt} - -bar-used-indicator = -bar-used-width = 8 -bar-used-foreground-0 = ${colors.fg} -bar-used-foreground-1 = ${colors.fg} -bar-used-foreground-2 = ${colors.yellow} -bar-used-foreground-3 = ${colors.alert} -bar-used-foreground-4 = ${colors.alert} -bar-used-fill = | -bar-used-empty = ¦ -bar-used-empty-foreground = ${colors.fg-alt} - -[module/xwindow] -type = internal/xwindow -label = %title:0:80:...% -label-padding-left = 2 - -; [module/mpd] -; type = internal/mpd -; host = /home/hlissner/.config/mpd/mpd.sock -; -; format-online = -; format-padding = 5 -; -; label-song-maxlen = 45 -; label-song-ellipsis = true -; -; icon-prev =  -; icon-seekb =  -; icon-stop =  -; icon-play =  -; icon-pause =  -; icon-next =  -; icon-seekf =  -; -; icon-random =  -; icon-repeat =  -; -; toggle-on-foreground = ${colors.fg} -; toggle-off-foreground = #66 - -[module/cpu] -type = internal/cpu -interval = 2 -format = -format-prefix = "" -format-foreground = ${colors.accent} -; format-underline = #f90000 -; label = %percentage%% -format-padding = 1 - -bar-load-indicator = -bar-load-width = 8 -bar-load-foreground-0 = ${colors.fg} -bar-load-foreground-1 = ${colors.fg} -bar-load-foreground-2 = ${colors.yellow} -bar-load-foreground-3 = ${colors.alert} -bar-load-foreground-4 = ${colors.alert} -bar-load-fill = | -bar-load-empty = ¦ -bar-load-empty-foreground = ${colors.fg-alt} - -[module/memory] -type = internal/memory -interval = 3 -format = -format-prefix = "" -format-prefix-foreground = ${colors.accent} -; format-underline = #4bffdc -; label = %percentage_used%% -format-padding-left = 1 - -; Only applies if is used -bar-used-indicator = -bar-used-width = 8 -bar-used-foreground-0 = ${colors.fg} -bar-used-foreground-1 = ${colors.fg} -bar-used-foreground-2 = ${colors.yellow} -bar-used-foreground-3 = ${colors.alert} -bar-used-foreground-4 = ${colors.alert} -bar-used-fill = | -bar-used-empty = ¦ -bar-used-empty-foreground = ${colors.fg-alt} - -[module/wlan] -type = internal/network -interface = ${env:WLP:wlp3s0} -interval = 3.0 - -format-connected = -format-disconnected = -format-disconnected-foreground = - -; label-connected = -; label-disconnected = ! -; label-disconnected-foreground = ${colors.red} - -ramp-signal-0 =  -ramp-signal-0-foreground = ${colors.yellow} -ramp-signal-1 =  -ramp-signal-1-foreground = ${colors.yellow} -ramp-signal-2 =  -ramp-signal-2-foreground = ${colors.yellow} -ramp-signal-3 =  -ramp-signal-3-foreground = ${colors.accent} -ramp-signal-4 =  -ramp-signal-4-foreground = ${colors.fg} - -[module/network-up] -type = internal/network -interface = ${env:LAN:eno1} -interval = 4.0 -label-connected = "%upspeed%" -format-connected-prefix = " " -format-connected-prefix-foreground = ${colors.accent} -format-connected-foreground = ${colors.fg} -format-connected-background = -format-connected-underline = -format-disconnected-prefix = " " -format-disconnected-prefix-foreground = ${colors.alert} -format-disconnected-foreground = ${colors.alert} - -[module/network-down] -type = internal/network -interface = ${env:LAN:eno1} -interval = 4.0 -label-connected = "%downspeed%" -format-connected-prefix = " " -format-connected-prefix-foreground = ${colors.accent} -format-connected-foreground = ${colors.fg} -format-connected-background = -format-connected-underline = -format-disconnected-prefix = " " -format-disconnected-prefix-foreground = ${colors.alert} -format-disconnected-foreground = ${colors.alert} - -[module/pulseaudio] -type = internal/pulseaudio - -; format-volume = -format-volume = -; label-volume = " " -label-volume-foreground = ${colors.accent} - -; format-muted-prefix = " " -format-muted-foreground = ${colors.alert} -label-muted =  - -bar-volume-width = 8 -# bar-volume-foreground-0 = ${colors.magenta} -# bar-volume-foreground-1 = ${colors.magenta} -# bar-volume-foreground-2 = ${colors.magenta} -# bar-volume-foreground-3 = ${colors.magenta} -# bar-volume-foreground-4 = ${colors.magenta} -# bar-volume-foreground-5 = ${colors.magenta} -# bar-volume-foreground-6 = ${colors.magenta} -bar-volume-gradient = false -bar-volume-indicator = | -bar-volume-indicator-font = 1 -bar-volume-indicator-foreground = #ff -bar-volume-fill = ─ -bar-volume-fill-font = 1 -bar-volume-empty = ─ -bar-volume-empty-font = 1 -bar-volume-empty-foreground = ${colors.fg-alt} - -; Only applies if is used -ramp-volume-0 =  -ramp-volume-1 =  -ramp-volume-2 =  - -[module/battery] -type = internal/battery -battery = BAT0 -adapter = ADP1 -full-at = 98 - -format-charging = -format-charging-underline = #ffb52a - -format-discharging = -format-discharging-underline = ${self.format-charging-underline} - -format-full-prefix = " " -format-full-prefix-foreground = ${colors.fg-alt} -format-full-underline = ${self.format-charging-underline} - -ramp-capacity-0 =  -ramp-capacity-1 =  -ramp-capacity-2 =  -ramp-capacity-0-foreground = ${colors.red} -ramp-capacity-1-foreground = #575864 -ramp-capacity-2-foreground = ${colors.fg-alt} - -animation-charging-0 =  -animation-charging-1 =  -animation-charging-2 =  -animation-charging-framerate = 1000 -animation-charging-foreground = ${colors.fg} - - -;===================================================== -; Custom scripts -;===================================================== - -[module/pad] -type = custom/text -content = " " -content-foreground = ${colors.fg-alt} - -[module/redshift] -type = custom/script -exec = ~/.config/polybar/modules/redshift -exec-if = pgrep -x redshift -interval = 60 -format-padding = 1 - -[module/syncthing] -type = custom/script -exec = echo 1 -exec-if = systemctl is-active syncthing -format = "" -format-foreground = ${colors.fg} -interval = 30 - -; vim:ft=dosini diff --git a/modules/themes/alucard/config/polybar/modules/redshift b/modules/themes/alucard/config/polybar/modules/redshift deleted file mode 100755 index 9a0b05f0..00000000 --- a/modules/themes/alucard/config/polybar/modules/redshift +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -# Specifying the icon(s) in the script -# This allows us to change its appearance conditionally -pgrep -x redshift &> /dev/null -if [[ $? -eq 0 ]]; then - temp=$(redshift -p 2>/dev/null | grep temp | cut -d' ' -f3) - temp=${temp//K/} -fi - -icon="" -# OPTIONAL: Append ' ${temp}K' after $icon -if [[ -z $temp ]]; then - echo "%{F#65737E}$icon" # Greyed out (not running) -elif [[ $temp -ge 5000 ]]; then - echo "%{F#8FA1B3}$icon" # Blue -elif [[ $temp -ge 4000 ]]; then - echo "%{F#EBCB8B}$icon" # Yellow -else - echo "%{F#D08770}$icon" # Orange -fi diff --git a/modules/themes/alucard/config/polybar/run.sh b/modules/themes/alucard/config/polybar/run.sh deleted file mode 100644 index 6b4536c9..00000000 --- a/modules/themes/alucard/config/polybar/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -pkill -u $UID -x polybar -while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done - -polybar main >$XDG_DATA_HOME/polybar.log 2>&1 & -echo 'Polybar launched...' diff --git a/modules/themes/alucard/config/qutebrowser/theme.py b/modules/themes/alucard/config/qutebrowser/theme.py deleted file mode 100644 index e454bd83..00000000 --- a/modules/themes/alucard/config/qutebrowser/theme.py +++ /dev/null @@ -1,221 +0,0 @@ -## Colors -palette = { - 'background': '#282a36', - 'background-alt': '#1E2029', - 'border': '#282a36', - 'current-line': '#44475a', - 'selection': '#44475a', - 'foreground': '#f8f8f2', - 'foreground-alt': '#e0e0e0', - 'foreground-attention': '#ffffff', - 'comment': '#6272a4', - 'cyan': '#8be9fd', - 'green': '#50fa7b', - 'orange': '#ffb86c', - 'pink': '#ff79c6', - 'purple': '#bd93f9', - 'red': '#ff5555', - 'yellow': '#f1fa8c' -} - -spacing = { - 'vertical': 6, - 'horizontal': 4 -} - -padding = { - 'top': spacing['vertical'], - 'right': spacing['horizontal'], - 'bottom': spacing['vertical'], - 'left': spacing['horizontal'] -} - -# HACK This is set to mitigate the blinding flash of white in between page -# loads. This can break sites with no explicit background, so I rely on the -# let-there-be-light.user.js greasemonkey script to "reset" the background. -c.colors.webpage.bg = palette['background'] - -## UI -# Scrollbar style; much less intrusive than the default -c.scrolling.bar = "overlay" -# Completion -c.completion.shrink = True - -## Fonts -c.fonts.default_family = "JetBrainsMono" -c.fonts.default_size = "10pt" - -# Background color of the completion widget category headers. -c.colors.completion.category.bg = palette['background-alt'] -# Bottom border color of the completion widget category headers. -c.colors.completion.category.border.bottom = palette['background-alt'] -# Top border color of the completion widget category headers. -c.colors.completion.category.border.top = palette['border'] -# Foreground color of completion widget category headers. -c.colors.completion.category.fg = palette['foreground'] -# Background color of the completion widget for even rows. -c.colors.completion.even.bg = palette['background-alt'] -# Background color of the completion widget for odd rows. -c.colors.completion.odd.bg = palette['background-alt'] -# Text color of the completion widget. -c.colors.completion.fg = palette['foreground'] -# Background color of the selected completion item. -c.colors.completion.item.selected.bg = palette['selection'] -# Bottom border color of the selected completion item. -c.colors.completion.item.selected.border.bottom = palette['selection'] -# Top border color of the completion widget category headers. -c.colors.completion.item.selected.border.top = palette['selection'] -# Foreground color of the selected completion item. -c.colors.completion.item.selected.fg = palette['foreground'] -# Foreground color of the matched text in the completion. -c.colors.completion.match.fg = palette['orange'] -# Color of the scrollbar in completion view -c.colors.completion.scrollbar.bg = palette['background'] -# Color of the scrollbar handle in completion view. -c.colors.completion.scrollbar.fg = palette['foreground'] -# Background color for the download bar. -c.colors.downloads.bar.bg = palette['background-alt'] -# Background color for downloads with errors. -c.colors.downloads.error.bg = palette['background-alt'] -# Foreground color for downloads with errors. -c.colors.downloads.error.fg = palette['red'] -# Color gradient stop for download backgrounds. -c.colors.downloads.stop.bg = palette['background-alt'] - -## Color gradient interpolation system for download backgrounds. -## Type: ColorSystem -## Valid values: -## - rgb: Interpolate in the RGB color system. -## - hsv: Interpolate in the HSV color system. -## - hsl: Interpolate in the HSL color system. -## - none: Don't show a gradient. -c.colors.downloads.system.bg = 'none' - -## Background color for hints. Note that you can use a `rgba(...)` value -# for transparency. -c.colors.hints.bg = palette['background-alt'] -# Font color for hints. -c.colors.hints.fg = palette['purple'] -# Hints -c.hints.border = '1px solid ' + palette['background'] -# Font color for the matched part of hints. -c.colors.hints.match.fg = palette['foreground-alt'] -# Background color of the keyhint widget. -c.colors.keyhint.bg = palette['background-alt'] -# Text color for the keyhint widget. -c.colors.keyhint.fg = palette['purple'] -# Highlight color for keys to complete the current keychain. -c.colors.keyhint.suffix.fg = palette['selection'] -# Background color of an error message. -c.colors.messages.error.bg = palette['background-alt'] -# Border color of an error message. -c.colors.messages.error.border = palette['background'] -# Foreground color of an error message. -c.colors.messages.error.fg = palette['red'] -# Background color of an info message. -c.colors.messages.info.bg = palette['background-alt'] -# Border color of an info message. -c.colors.messages.info.border = palette['background'] -# Foreground color an info message. -c.colors.messages.info.fg = palette['comment'] -# Background color of a warning message. -c.colors.messages.warning.bg = palette['background-alt'] -# Border color of a warning message. -c.colors.messages.warning.border = palette['border'] -# Foreground color a warning message. -c.colors.messages.warning.fg = palette['red'] -# Background color for prompts. -c.colors.prompts.bg = palette['background-alt'] -# Border used around UI elements in prompts. -c.colors.prompts.border = '1px solid ' + palette['background'] -# Foreground color for prompts. -c.colors.prompts.fg = palette['cyan'] -# Background color for the selected item in filename prompts. -c.colors.prompts.selected.bg = palette['selection'] -# Background color of the statusbar in caret mode. -c.colors.statusbar.caret.bg = palette['background-alt'] -# Foreground color of the statusbar in caret mode. -c.colors.statusbar.caret.fg = palette['orange'] -# Background color of the statusbar in caret mode with a selection. -c.colors.statusbar.caret.selection.bg = palette['background-alt'] -# Foreground color of the statusbar in caret mode with a selection. -c.colors.statusbar.caret.selection.fg = palette['orange'] -# Background color of the statusbar in command mode. -c.colors.statusbar.command.bg = palette['background-alt'] -# Foreground color of the statusbar in command mode. -c.colors.statusbar.command.fg = palette['pink'] -# Background color of the statusbar in private browsing + command mode. -c.colors.statusbar.command.private.bg = palette['background-alt'] -# Foreground color of the statusbar in private browsing + command mode. -c.colors.statusbar.command.private.fg = palette['foreground'] -# Background color of the statusbar in insert mode. -c.colors.statusbar.insert.bg = palette['background-alt'] -# Foreground color of the statusbar in insert mode. -c.colors.statusbar.insert.fg = palette['pink'] -# Background color of the statusbar. -c.colors.statusbar.normal.bg = palette['background-alt'] -# Foreground color of the statusbar. -c.colors.statusbar.normal.fg = palette['foreground-alt'] -# Background color of the statusbar in passthrough mode. -c.colors.statusbar.passthrough.bg = palette['background'] -# Foreground color of the statusbar in passthrough mode. -c.colors.statusbar.passthrough.fg = palette['orange'] -# Background color of the statusbar in private browsing mode. -c.colors.statusbar.private.bg = palette['background-alt'] -# Foreground color of the statusbar in private browsing mode. -c.colors.statusbar.private.fg = palette['foreground-alt'] -# Background color of the progress bar. -c.colors.statusbar.progress.bg = palette['background-alt'] -# Foreground color of the URL in the statusbar on error. -c.colors.statusbar.url.error.fg = palette['red'] -# Default foreground color of the URL in the statusbar. -c.colors.statusbar.url.fg = palette['foreground'] -# Foreground color of the URL in the statusbar for hovered links. -c.colors.statusbar.url.hover.fg = palette['cyan'] -# Foreground color of the URL in the statusbar on successful load -c.colors.statusbar.url.success.http.fg = palette['green'] -# Foreground color of the URL in the statusbar on successful load -c.colors.statusbar.url.success.https.fg = palette['green'] -# Foreground color of the URL in the statusbar when there's a warning. -c.colors.statusbar.url.warn.fg = palette['yellow'] -# Status bar padding -c.statusbar.padding = padding -# Background color of the tab bar. -c.colors.tabs.bar.bg = palette['background-alt'] -# Background color of unselected even tabs. -c.colors.tabs.even.bg = palette['background-alt'] -# Foreground color of unselected even tabs. -c.colors.tabs.even.fg = palette['comment'] -# Color for the tab indicator on errors. -c.colors.tabs.indicator.error = palette['red'] -# Color gradient start for the tab indicator. -c.colors.tabs.indicator.start = palette['orange'] -# Color gradient end for the tab indicator. -c.colors.tabs.indicator.stop = palette['green'] - -## Color gradient interpolation system for the tab indicator. -## Type: ColorSystem -## Valid values: -## - rgb: Interpolate in the RGB color system. -## - hsv: Interpolate in the HSV color system. -## - hsl: Interpolate in the HSL color system. -## - none: Don't show a gradient. -c.colors.tabs.indicator.system = 'none' - -# Background color of unselected odd tabs. -c.colors.tabs.odd.bg = palette['background-alt'] -# Foreground color of unselected odd tabs. -c.colors.tabs.odd.fg = palette['comment'] -# Background color of selected even tabs. -c.colors.tabs.selected.even.bg = palette['background'] -# Foreground color of selected even tabs. -c.colors.tabs.selected.even.fg = palette['foreground'] -# Background color of selected odd tabs. -c.colors.tabs.selected.odd.bg = palette['background'] -# Foreground color of selected odd tabs. -c.colors.tabs.selected.odd.fg = palette['foreground'] - -## Tab padding -c.tabs.padding = padding -c.tabs.indicator.width = 1 -c.tabs.favicons.scale = 1 diff --git a/modules/themes/alucard/config/qutebrowser/userstyles/monospace-textareas.scss b/modules/themes/alucard/config/qutebrowser/userstyles/monospace-textareas.scss deleted file mode 100644 index 5ba2ee79..00000000 --- a/modules/themes/alucard/config/qutebrowser/userstyles/monospace-textareas.scss +++ /dev/null @@ -1,3 +0,0 @@ -textarea { - font-family: monospace; -} diff --git a/modules/themes/alucard/config/qutebrowser/userstyles/stackoverflow.scss b/modules/themes/alucard/config/qutebrowser/userstyles/stackoverflow.scss deleted file mode 100644 index dc76477f..00000000 --- a/modules/themes/alucard/config/qutebrowser/userstyles/stackoverflow.scss +++ /dev/null @@ -1,1027 +0,0 @@ -[qb-domain="serverfault.com"], -[qb-domain="superuser.com"], -[qb-domain="stackapps.com"], -[qb-domain="mathoverflow.new"], -[qb-domain="askubuntu.com"], -[qb-domain$="stackoverflow.com"], -[qb-domain$="stackexchange.com"] -{ - /*************************************************************** - Stack Overflow Dark v2.11.20 (2018-08-09) - https://github.com/StylishThemes/StackOverflow-Dark - http://userstyles.org/styles/35345 - - ** Will apply to almost all Stack Exchange Sites ** - Except: - * Area 51 (area51.stackexchange.com) - * Gaming (gaming.stackexchange.com) - - ** Please open an issue to report sites where the style breaks ** - https://github.com/StylishThemes/StackOverflow-Dark/issues - - previous version information contained at the userstyles site - ****************************************************************/ - - * { - border-color: #444 !important; - text-shadow: none !important; - box-shadow: none !important; - } - - body { - background-color: #191919 !important; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAAAAABURb1YAAAFnklEQVR4AWWXCY4cwXbE6h4JMhCvMPc/ov+3Ox9QsLCGpKlFHILd+UQ559AGDkBSFXWmomonqkL/XuUcIPUcONjHCJyE36KaqNiaRnVCG9TGpgIU9hIfohCBVGj24ammo04lU3Fy0NZDAyZi5AElHjgEGlRbG1WjraIt7TmADQkAaoEHsOXAAaeqat9RVTqjosyEH5W+DQCQt8BzIJMfXJI3e5tGRefSlRn3NrO3scnvNl26FN5RITGNfjm3GM/+FhQgnlQeImC+dEm8rzHVTNGL9EADVsTAIfGJBziRy7RlmcZU1IYpHIj+4JrWym8/XSwzompmFNVOFdTOAAfs61KZ6eXcp57fykQUOxNBmTesz2HpCnCg3UV/bA7VRpWGNqKtrYLTs0ilCjgxiZxjeLC5dDPBFn4Pn2ja6BRUL10DTgET4Focq8rn8casxV4E5tIlZvytqtfivCOKZrqc38G7egnkXecyPZdzubc57VtUnbfL+a0u3b1N3d9Mci7cKocHoh3xihLQ6fXUlgTOOfVkXSUFINoWHhqxE23RTmCqtoEJaITkIrUCkU9fnqpqm+40VSXS3CLaSzfGBb4rPuOSfN0ylLve6/jpcrbL2dTlnOdv5AamKjLvLN1XruMNS/cul/hx8twKpKYRaE2DOp8+c+lW7uVXVQ7Vx0x1G3HXjNocsHCac7NbWc6egwJVHu2kRTVNC2pqv2U4XNsv5/yWJlV9+NJ1C7xluInlcr7rK+Kg+qy7onQqgnbi7UHcS3qXjdw3bO5tumycYlVssMI5EXXpRnatPK362KodtVU60cm+eQT10sVLFwJYlVaf7UGSoi5dQF3DvnTX3UvXTPO8quKH7jsXhm/PxfKWZXqBM5sS33kmKtC31Q05fI095i5IPpyzRXqSy1Sr17p1F7NE8vMtnNbLpVVtk8c0OrfF0sKxHnIpYgHW4puMomTz8mgmrSjpvrxhX97l7LqLpl7bW9BH9/MNzF8XwRqL8/m7c30eFYV5VX3QTquK06XbLt16F4ks+8Z9m6gPtpcuk3OvibCekng4lzMHi9MoqZmKj9tdbQCbc7bcEA+oEJduRNNL1waf1tuI9MDBUK8t3k9uFz3rrqadO9Ln9TL/ezlwDvky3TW7ZmXfpc77TN0yhOXnP939LvVDV9s+tgLTm0TqYd1lea3PRFuVjLa562HdPbCfascGrvO3DMeIATVqVRO8vfHrbupdfo1dzlXUdkVLZsS1mLPG3rWcl+4B1l1537h0VXzU1tyLG7cCu+LSrSqo06hocy3WCcil65qHDbuEYzQN2HpT3jFt9LEFvHTP1nxbXOEkbhkKmd+6BTfVZ/I143z/Fyz6Za92o0I7I6gzfeYAHPwy/Rb43L9TLtMt8CtwW1xvQvbR1g9n7qJRNN1kdxcdH7cM58Szxq679MdLOhE72t6VNEpHHkzwRyjBcGth+dE99pIkVbWaEWmvnQ8Yl7Mp59zpRWXdNo6odrO754Zzvxf/010nP7onb1TR+bgbVPB9PcADJvH/043Kvk0UzLRxQ6UiaeTAcyxYl2lyrrvZv8v2wE7U1uVcST0821jJeIDKWuyxiqnuko7q3+zJYXJ46nV3D67EyL+lQ9F2qkr+3kUafQpwYE8T329p6y7OX1TF97fQv/c+l87zj7Hsgpig4qRLd9fMPs74rLGyCzRbhmVqpy7nqvPmTD1gvKe7b2U8u1QzmtuDuEtbgT3c8QBJveo6cueFkUwv59nVmfFw1jl4/unuOT9qERV76ers8n23z/c8/Xy7a4lwwLplmGusbRp33Up13+ZDN3KPxNVMhY62vUQyRTse6+cKHtZYjIfDh260Cjbb3Vy6R8H8SMBzqSwrsB1UTacoknlnOb8V4JD9Njfpwz/fHjpBUeevcAtcl65sqXPX9D87RUTLc/dfOgAAAABJRU5ErkJggg==) !important; - background-clip: border-box !important; - background-origin: padding-box !important; - background-attachment: scroll !important; - background-repeat: repeat !important; -background-size: auto !important; -background-position: left top !important; - } - - /* custom code font */ - pre.prettyprint, code { - font-family: "Menlo", Monaco, Consolas, "Liberation Mono", Menlo, Courier, monospace !important; - } - - /* === custom color === */ - a:not([class*="comment-"]), .profile-popup a, .seWrapper a, .gs-title b, .spoiler:hover a, - .comment-up-on, .comment-up-off:hover { - color: #4183C4 !important; - } - - .nav .primarynav li a:hover, .message.message-config .actions .button, .btn-careers:hover, - .btn-careers:visited, .question-list-layout a:hover { - color: #fff !important; - background: #4183C4 !important; - } - - input[type="submit"].btn-clear, input[type="button"].btn-clear, button.btn-clear, .btn-clear { - color: #4183C4 !important; - } - - input[type="submit"].btn-clear:hover, input[type="button"].btn-clear:hover, button.btn-clear:hover, .btn-clear:hover, - input[type="submit"].btn-clear:focus, input[type="button"].btn-clear:focus, button.btn-clear:focus, .btn-clear:focus { - color: #4183C4 !important; - background: #273045 !important; - } - - a.post-tag:hover, .bounty-indicator, .bounty-indicator-tab, .bounty-award, - span.bounty-indicator-tab, #change-picture, .top-badge,.supernovabg, .hotbg, - .nav li.youarehere a, .nav a:hover, a.button:hover, .edit-count, .pager a:hover span, - .bounties-tab, .login-link, #sidebar a[href*="/questions/ask"], - #sidebar a[href*="/questions/ask"]:visited, .page-numbers:hover, .s-btn.s-btn__primary, - .s-btn.s-btn__primary:focus { - background-color: #4183C4 !important; - color: #eee !important; - } - - #tabs a.youarehere:before, .tabs a.youarehere:before, - .newnav .tabs-list-container .tabs-list .intellitab a.youarehere:before { - background-color: #4183C4 !important; - } - - .s-btn.s-btn__primary:hover { - filter: brightness(1.1) !important; - } - - /* === text selection === */ - ::selection { - background: #4183C4 !important; - color: #fff !important; - } - ::-moz-selection { - background: #4183C4 !important; - color: #fff !important; - } - - /* === input focus hightlight === */ - input:focus, textarea:focus, .chosen-container.chosen-container-active .chosen-choices, - .chosen-container .active-result.highlighted { - border-color: #4183C4 !important; - box-shadow: inset 0 1px 2px rgba(0,0,0,.075), 0 0 2px #4183C4 !important; - outline-color: transparent !important; - } - .tag-editor input:focus, .previous-button, .next-button, .btn-clear, - .chosen-container.chosen-container-active .chosen-choices input, - .gsc-webResult.gsc-result, .gsc-results .gsc-imageResult, .s-sidebarwidget:after { - border: 0 !important; - box-shadow: none !important; - } - .menu-switcher { - filter: none !important; - -webkit-filter: none !important; - } - - /* === hidden === */ - div.hireme, div#hireme, .next-answer-hook-container, .intellitab:after, .s-hero .-container { - display: none !important; - } - - /* === background color === */ - /* from darkest to lightest grey */ - .popup-badges .all-badge-progress .completed:before, .previous-button, .next-button, #footer, - /* === herobox when not logged in === */ #herobox.alternate, - .message-title { - background-color: rgba(0,0,0,.4) !important; - } - - header { - background-color: #080808 !important; - } - - #custom-header, .review-bar, .diff-choices a.selected, #header #topbar, td.owner, a.owner, .question-status, - .profile-popup, .profile-popup div, .profile-popup th, .profile-popup td, #global, .actual-edit-overlay, - input:not([type="submit"]), textarea, #search input, .tag-editor, .f-select > select, textarea#input, - .search-form .chosen-container .chosen-choices, .pac-container, select, #match-preferences-editor .close:hover, - .gsc-input-box, .gsc-option-menu, .subheader, .min-ds-wizard .min-ds-box.jobs { - background-color: #111 !important; - color: #ddd !important; - } - - .gsc-selected-option-container { - background: #111 !important; - } - - .onebox, .profile-ad, .message.message-config, - .so-header a:hover, .so-header a.topbar-icon-on, .topbar-dialog .header, .header-edit-section:hover, - .timeline-item, .sidebar-profile .-item, .btn-outlined.-white:hover, .btn-outlined:hover, .top-bar a:hover, .top-bar a:focus, - .top-bar .-item._active, .top-bar .-link.topbar-icon-on, .top-bar .-link.topbar-icon-on:hover, - .top-bar .-feature-notice:hover, .top-bar .-feature-notice.topbar-icon-on, .topbar-dialog .dialog-content, - .feature-notice-dialog:before, .-item.social, .salary-results-container .collection, .sidebar #post-job, - .sidebar .salary-survey-sidebar, .ui-dialog, .salary-calculator-calculator, .sticky-menu-wrapper._sticky, - .-summary, .field._toolbar .-toolbar, .timeline .feature-banner__background { - background: #151515 !important; - } - - html, blockquote, #post-preview, .nav .primarynav li a, #chat, #hsearch .textbox, .form-item, .grippie, - .welovestackoverflow, #wmd-button-bar, .wmd-button-bar, .qa-block, .content-block, .user-info-rep, .sidebar, - .popup, .full-diff, .val-success, .search-form .filter-pane nav, .s-card, .chosen-container .chosen-drop, - .pac-item.pac-item-selected, .pac-item:hover, .-item.social:hover, #add-tags-button, #filter-preview, - .salary-results { - background: #191919 !important; - } - - .authcomment, .seIntro, .seFooter, .title-banner, .salary-results-wrapper, .salary-skill-legend { - background-color: #191919 !important; - border: 2px solid #262626 !important; - } - - #tabs a { - border: 1px solid transparent !important; - } - - #tabs a.youarehere, .tabs a.youarehere, .tag-suggestions, .dropdown li, - .proposed-change .diff-buttons a:not(.selected), #logout-form, .snippet-holder, - .CodeMirror, .CodeMirror-gutters, .badge-progress.completed, - .timeline-item:before, .item-select-table .item, .title-box, .-list-item, - .bg-powder-050, .textarea-with-counter .-counter { - background-color: #191919 !important; - border-color: #444 !important; - } - - /* RSS Feed - issue #87 */ - body > pre:not(.prettyprint):not(.CodeMirror-line) { - background: #191919 !important; - color: #ddd; - } - - #tabs a.youarehere, .tabs a.youarehere { - border-bottom-color: transparent !important; - } - - .subtabs :not(.youarehere) { - border: 0 !important; - } - - #user-about-me, .user-about-me, .mine .messages, .avatar-card, .tag-container, .dropdown { - background: #191919 !important; - border: 0 !important; - color: #C1BEBA !important; - } - - #chat .mine .messages, .salary-share { - background-color: #292929 !important; - border: 1px solid #444 !important; - } - - #chat div.moderator { - color: #366fb3 !important; - } - - .topbar-dialog, .share-tip, .messages, - #tag-menu, #overlay-header, .action-list .action-selected, .switcher-nudge-lightbox, - .user-rep-chart-summary-tooltip:hover, .current-site-container, #or, .account-number, .topbar, - .wmd-prompt-dialog, .wb-popup-content, .wb-hat-details, .docs-review-page .history-table tr.even td, - kbd, kbd code, .switcher label, .timeline-item-actions, .cv-story .section-opener h2, - .cv-story .section-opener:after, .header-edit-section .ctas, - .item-select-table .item:hover, .visa-wrapper, .chosen-choices, .p-top-tags .-tag-group, - .chosen-results .active-result, .salary-results-wrapper .inline-survey-cta, - #messages-interface .callout, .tour-bubble .-body, .why-jobs-v2 .developers-first select option { - background-color: #222 !important; - color: #ddd !important; - } - - .profile-popup, .profile-popup tr, .profile-popup th, .profile-gravatar, .newuser, .roomcard, - .seWrapper, h2.index.header, .privilege-table-row:hover, .list-originals .item.hover, - .list-originals .body-summary, .review-instructions-reason, .room-mini, #formContainer, #switch, - .login-topbar, .newsletter-category, .newsletter-item, .blogcontainer, .usercard-xxl, .roomcard-xxl, - .docs-review-page .topic-draft-bar, .badge-progress, .avatar-wrapper, .timeline-line, - .s-progress-bar .-bar, .-job-badges .-badge, .search-form .job-alert-tooltip, .bg-white, - .s-sidebarwidget--header, .tag-popup .-container, .tag-popup .-arrow:before { - background-color: #222 !important; - border-color: #555 !important; - color: #ddd !important; - } - - #header #topbar, .revision-comment, .date-span, .form-submit input, .preferred-login, - .mdhelp, .wmd-help-button.active-help, .date_brick, .more-info, .review-stats-current-user, - .review-stats-count-current-user, .topbar-menu-links, .input-group .-fill { - background: #222 !important; - color: #ddd !important; - -webkit-border-radius: 3px !important; - border-radius: 3px !important; - } - .topbar.newheader, .network-items>a, .icon-help, .icon-help:hover { - background-color: #222 !important; - } - .calendar, .calendar-small, .mspark .mspbar, #promo-box, #input-area .input-hint, - .tour-page .feature-selection li a.triggered, .ob-docs, - .topbar.newheader .topbar-wrapper .topbar-links .search-container #search input[name="q"], - .mainbar.discussion .discussion-item, #input-area, .pager a span, .page-sizer a { - background: #222 !important; - color: #ddd !important; - } - - .tour-page .tour-content section:nth-child(n+1), .users-page .user-info:hover, - .nav-left-col a { - background: rgba(34,34,34,.5) !important; - } - - .ad502-room, .message.message-config .actions, .tag-container .col, .congrats, .task-stat-table td { - background-color: #232323 !important; - border: 1px solid #191919 !important; - } - - .rep-recent-row, .bounty, .diff-choices a:hover, div.meter, .narrow .votes, .ob-post-votes, .card, - .congrats, .-card { - background-color: #232323 !important; - color: #bbb !important; - } - - .answer, #system-message, .commentlist, .revision td, #hero-content, .mdhelp-tabs .selected, .tabs .selected, - .rep-card .rep-col, .sort select, .-job._highlighted, .MathJax_MenuDisabled, .gsc-option-menu-item-highlighted, - .secondary-job-results-identifier { - background: #232323 !important; - color: #999 !important; - } - - .container, .tour-page .headline, .tour-page .cta, .s-progress-bar._badge .-fill { - background-image: none !important; - } - - .tagged-interesting, .tagged-interesting .views, .highlight-row, .highlighted, .card.rep-card .graph, - .badge-progress:hover, #newsletter-ad, .search-form .icon-advanced-search, - .message.gray, .menu-popout li:hover, .menu-popout .is-selected, #job-detail .-sticky-tabs, - .nav-left-col a:hover, .deleted-answer footer .user-info, .util-bar, .user-info { - background-color: #242424 !important; - background-image: none !important; - } - - #newsletter-ad { - padding: 10px !important; - } - #newsletter-ad:before { - content: "Love this site?"; - font-size: 18px !important; - } - - .youarehere, .dropdown li.selected a, .dropdown li.selected a:hover, .ob-docs .example-metric, - .menu-popout, .version-row, .version-name, .post-tag, .post-tag:visited, - .switcher input[type="radio"]:checked+label, .double-input .separator, .geo-tag, - .MathJax_Menu, .MathJax_MenuLabel:focus, .salary-calc-inputs, .question-container.unread, - .comments-wrap { - background: #333 !important; - color: #ccc !important; - } - - .nav li, .seNav, .topbar a.topbar-icon-on, .topbar a.topbar-icon-on:hover, .owner, .nav a, - .module li.current, .seCurrent, .community-bulletin, .owner-revision td, .markdown-diff .skip, - #footer .container, .body-diffs .skip, .newsletter-anon, .tag-suggestions>div:hover, - .topbar-dialog .modal-content li:hover, .timestamp:hover+div.message .meta, div.message:hover .meta, - #side-menu ul li a:hover, .conversation-info, .message.reply-parent, .message.reply-child, - .sidebar-element .list li .rep-and-badges, .congrats .actions, .newsletters-toggle, - .tag-suggestions>div:focus, .current-site a.site-link:hover, #sub-navs>a:hover, - #sub-navs .menu-item:hover, .popup-close .-link:hover, .p-highlights .-reputation .-meta-rep, - .nav-left-col a.is-active, .comment__highlight:not([style*="background-color"]), - ul.comments-list .comment__highlight .comment-text, - ul.comments-list .comment__highlight .comment-actions { - background-color: #333 !important; - } - - .owner-answer, .question-status, .notification, #feed-ticker, #top-menu, .vote-revision td, - .topbar-dialog .unread-item, .privileges-wrapper .stroke, .progress-bar .bar { - background: #404040 !important; - } - - tr.comment:hover, .reply-parent, .timestamp, .usercard, - .comment-help, .answer-help-background, .mdhelp-tabs, .tabs li, .hi, .seNavLinks a:hover, - .seNavLinks a:focus, .itemBoxNew, .pagination a.current, .pagination a.selected, .pagination a:hover, - .wb-wearing, .impact-card hr, .MathJax_MenuActive { - background-color: #444 !important; - color: #ddd !important; - } - - .page-numbers.current { - background: #444 !important; - } - - .comment__highlight:not([style*="background-color"]), - ul.comments-list .comment__highlight .comment-text, - ul.comments-list .comment__highlight .comment-actions { - background: rgba(102, 102, 102, .8) !important; - } - #chat .messages .mention { - background: #666 !important; - } - - #post-text-container div span { - background: #c1beba !important; - } - .-logo img { - background: #fff !important; - } - - .sidebar-element .list li .rep-and-badges:before { - background: linear-gradient(270deg, #333, rgba(51,51,51,0)); - } - - /* === Brown(ish) === */ - .new-post-activity, #new-answer-activity, .val-info, .highlight, a.youarehere:before, - .message.regular, .filter-dashboard-edit .floating-help, .review-post-author-guidance { - background-color: rgba(51,34,17,.4) !important; - } - pre .spaces, .message.message-warning { - background-color: #321 !important; - color: #eee !important; - } - .message.message-warning .message-tip-left-top:before { - border-top-color: #321 !important; - } - - /* chat room buttons */ - a.button { - background: #840 !important; - color: #eee !important; - } - - /* === Green === */ - .accepted-answer, .suggested-edit .inserted, .markdown-diff .inserted, .rep-increase, .progress-bar .percent, - .recommended, .vote.accepted, .suggested-edit .inserted>div, .full-diff .inserted>div, - .message.success, .p-highlights .-rep-increase, .s-progress-bar .-fill, .answerBox.accepted { - background: #232 !important; - } - - span.diff-add { - background: #3F4E1D !important; - color: #92CC09 !important; - } - .topbar-dialog.achievements-dialog .rep-up, .-activity .-stat.answered { - color: #92CC09 !important; - } - - .answered, .answer-votes, .answered .vote-count-post { - background: #232323 !important; - color: #4b553c !important; - } - .user-show-new .user-rep .rep-amount .rep-up, .-stats.rep-up { - color: #4b553c !important; - border-color: #4b553c !important; - } - - .answered-accepted, .answered-accepted strong, .rep-up.bounty-indicator-tab, .user-rep-chart-summary-bar, - .special-rep, .s-progress__privilege .s-progress--bar { - background: #4b553c !important; - color: #fff !important; - } - - .answered strong, .user-show-new .user-rep-full .rep-up { - color: #4b553c !important; - } - - .vote-count-post [style="color:green"] { - color: green !important; - } - - /* === Red === */ - .deleted-answer, .suggested-edit .deleted, .markdown-diff .deleted, .suggested-edit .deleted>div, - .full-diff .deleted>div, .realtime-post-deleted-notification p, .message.incomplete, - .message.error, .deleted-answer .comments-wrap, .deleted-answer .user-info, - .deleted-answer .util-bar, .deleted-answer .comment { - background-color: #200 !important; - } - .post-timeline-v2 .post-timeline tr.deleted-event td, - .post-timeline-v2 .post-timeline tr.deleted-event-details td { - background-color: rgba(34, 0, 0, .4) !important; - } - /* Mobile */ - .-summary .-votes, .deleted-answer .votes { - background-color: rgba(214, 217, 220, .2) !important; - } - - span.diff-delete { - background-color: #400f00 !important; - color: #ff4a15 !important; - } - - .summary a.moderator-tag, .btn._google { - background-color: #400 !important; - } - - .summary a.moderator-tag:hover { - background-color: #600 !important; - } - - .vote-count-post [style="color:maroon"] { - color: maroon !important; - } - - /* === Transparent background === */ - div.message .meta, .spaces, .comment, span.feed-icon, a.role-switch, .nav.careers li, .nav.careers li:hover, - .switcher-nudge-content p, #content, #tabs a, .tabs a, #chat .username, #chat .messages, .tag-container, - .prettyprint code, .lv-info, .lv-stats-wrapper, .lv-stats-wrapper .number, .container, .bottom-notice, - #question-header, .question-form .form-item, .post-menu>a:hover, #main-content, - #mainbar, #mainbar-full, .mainbar-full, #logout-page, #sidebar, .footerwrap, #footer-menu, .module, - #sidebar #newsletter-ad, #sidebar .ad-container, #sidebar .everyonelovesstackoverflow, .mention, - .tag-suggestions>div .more-info, .user-tags .answer-votes, .expanded:hover, .sidebar-accordion, - .sidebar-accordion a:hover, .sidebar, .sidebar *:not(.post-tag), .tag-filter-isany, .col-section.expanded, - .timeline-mine header, .timeline-sidebar header, .sidebar-profile.is-visible, .cv-section, - .cv-story .avatar-wrapper, .btn-clear, .header-edit-section, .personal-statement, .link-text, - .match-preferences .seniority-selector, .field-with-bg, #tags .message.regular, - #profile-side #side-menu a, .sidebar-profile .-header, .sidebar-profile .-footer, - #popup-next-badge .-header, .popup-close .-link, .job-cover-image.-no-image, #job-detail, - .s-footer .-container, .p-top-tags .badge-tag, .gsc-webResult.gsc-result, .gsc-imageResult, - .gsc-cursor-page, .gsc-cursor-current-page, .metaInfo .owner, #content > .subheader, - header.job-details--header, .site-footer--container, .-activity .-stat.answered, - .deleted-answer .comment-actions, .min-ds-wizard .current, .input-group .-fill._clean, - .why-jobs-v2 .slanted-background:before { - background-color: transparent !important; - } - - #tabs a:hover, .tabs a:hover { - background-color: #191919 !important; - border: 1px solid #444 !important; - border-bottom-color: transparent !important; - } - - .highcharts-container rect[fill="#FFFFFF"], rect[fill="rgb(255, 255, 255)"] { - fill: transparent !important; - } - .spoiler, .spoiler * { - color: transparent !important; - } - .spoiler:hover, .spoiler:hover * { - color: inherit !important; - } - - /* === Dark border === */ - .body-diffs table * { - border-color: #111 !important; - } - - .s-progress-bar .-bar:before, .s-progress-bar .-bar:after { - border-top-color: #222 !important; - border-bottom-color: #222 !important; - } - .search-form .job-alert-tooltip:after { - border-top-color: #222 !important; - } - - .welovestackoverflow, .question-summary, .subheader, - .company-module .-details strong:before, .bc-black-1 { - border-color: #333 !important; - } - - a.required-tag, .topbar-dialog.feature-notice-dialog:before, - .site-footer .-link._expandable:after, .bc-black-2 { - border-color: #555 !important; - } - - .message .message-tip-top-right:before, .message .message-tip-top-left:before { - border-bottom-color: #191919 !important; - } - .search-form .filter-pane a._active, .search-form .filter-pane a:hover { - border-bottom-color: #4183C4 !important; - } - .left-arrow, .timeline-item:nth-child(odd):after { - border-right-color: rgba(119,119,119,.4) !important; - } - .previous-button:hover .left-arrow { - border-right-color: #c0c0c0 !important; - } - .right-arrow, .timeline-item:nth-child(even):after { - border-left-color: rgba(119,119,119,.4) !important; - } - .next-button:hover .right-arrow { - border-left-color: #c0c0c0 !important; - } - #input-area .input-hint:after { - border-left-color: #222 !important; - } - .s-progress-bar .-fill { - border-top: #444 1px solid !important; - border-bottom: #444 1px solid !important; - } - #sub-navs .youarehere { - border-top-color: #4183C4 !important; - } - .nav-left-col .is-active, .nav-links .youarehere .nav-links--link { - border-right-color: #4183C4 !important; - } - - /* === No/hide border === */ - div.list > div { - border-right: 0 !important; - } - .module, .tabs a, div.message, .full-diff td, .wb-outer:not(.wb-selected), - .page-numbers.dots, .p-top-tags .badge-tag, .page-numbers.desc, .intellitab:not(.selected) a, - #sub-navs .menu-item .menu-switcher, .input-group .-fill._clean { - border-color: transparent !important; - } - .left-arrow, .right-arrow { - border-bottom-color: transparent !important; - border-top-color: transparent !important; - } - div.message:hover, .timestamp:hover + div.message { - visibility: inherit; - border: 1px dotted #333; - } - - /* blue label count */ - .bounty-indicator-tab, .hero.profile, .jobs-banner.-blue, #reg-alert-modal:hover, - .-popout .btn-secondary:hover, .search-btn, .tags .jobs a, .btn-secondary, #job-board-save { - background: #046 !important; - color: #ccc !important; - border: 1px solid #135 !important; - } - .hero-box, .filter-show-more { - background: #182030 !important; - } - .review-actions input, .btn, .chosen-choices .search-choice, .topbar-dialog a.btn-secondary, - .filter-dashboard, input[type=submit], .bg-blue-500, .s-btn.s-btn__filled { - background: #182030 !important; - color: #ccc !important; - border: 1px solid #135 !important; - } - .review-actions input:hover, .btn:hover, .btn-secondary:hover, #job-board-save:hover, - .topbar-dialog a.btn-secondary:hover, input[type=submit]:hover, .s-btn.s-btn__filled:hover { - background: #273045 !important; - } - .s-hero { - background-image: url(https://cdn.sstatic.net/img/hero/pattern.svg),linear-gradient(to right, #121723 0, #182030 100%) !important; - } - .s-hero:after { - background: #182030 !important; - } - - /* === Text Color === */ - div, input, .accepted-answer .post-text, .accepted-answer .user-action-time, #question-header a, - .post-text, .user-info, .topbar-dialog .header h3, .topbar-dialog .header h3 a, .topbar-dialog span, - .search-result .answered .vote-count-post strong, .votes-cast-stats th, .subheader h1, .vote.accepted, - .message.message-config h1, .message.message-config h2, .message.message-config h3, .message.message-config h4, - .spoiler:hover, .company-module a:hover *, .search-form .label, .search-form label, .list.companies p, - #snpte-button-run, .comment-link, .timeline .header h4, .-title, #profile-side #side-menu a:hover, - .-rep, .-total, .-list-item .-description, .message.message-error a, .chosen-container .chosen-results li, - .salary-calc-inputs span, .salary-survey-dialog .header h3, .title-banner h1, .salary-results-container h1, - .topbar-dialog h4, .label-key > b, .heading, .module h3, .badge-tag, .s-label, - .-link__with-icon:hover .svg-icon, .youarehere a, .youarehere .svg-icon, h1, h2, h3, h4, h5, h6, - .h1, .h2, .h3, .h4, .h5, .h6, .tour-bubble p { - color: #ddd !important; - } - /* patch for hint text of SurfingKeys browser extension */ - #sk_hints div { - color: #000 !important; - } - - /* placeholder */ - ::-webkit-input-placeholder { - color: #ddd !important; - } - ::-moz-placeholder { - color: #ddd !important; - } - - .user-details td, .content-page, h2:not([style]), h2 a, .profile-popup a:hover, .module h4, .page-description, - #openid_identifier, .form-item label, .subheader h2, .nav-links a.nav-links--link:hover { - color: #c1beba !important; - } - .comment, #top-menu a, .subheader a, .reputation a, .reputation-score, .relativetime.old, - .votes-cast-stats td, .mini-counts span, #chat .system-message, .card .rep, a.badge, a.badge-tag, - .user-card .user-stats .number, .user-card .user-card-name, a.question-hyperlink:hover, - a.answer-hyperlink:hover, .cv-story .time-frame, .-list-item.is-completed .-description, - .s-footer .-toc th, .event-count, .post-timeline td, .post-timeline th, #side-menu ul .category { - color: #aaa !important; - } - .ob-post-tag, .ob-user-tag, .deleted-answer .util-bar a, .nav-links--link { - color: #999 !important; - } - - .nav-links .youarehere .nav-links--link .svg-icon, .nav-links .fc-medium { - color: #666 !important; - } - - .comment-up-off, .comment-flag, .comment-flag-off { - color: #444 !important; - } - - .answered-accepted strong, .youarehere, .nav .primarynav li a, .nav a, a:hover, .rep-up.special-rep, - .pac-item-query, #content .salary-subheader, .salary-skill-legend-li .-score, - header.job-details--header a { - color: #fff !important; - } - - input, .actual-edit-overlay { - -webkit-text-fill-color: #fff !important; - } - - .post-text a:visited, .comment-text a:not(.comment-user):visited, #chat-body .content a:visited, - .question-hyperlink:visited, .answer-hyperlink:visited, #hot-network-questions ul a:visited { - color: #4183C4 !important; - } - - .rep-up { - color: #4b553c !important; - filter: brightness(140%) !important; - } - - .rep-down, .user-show-new .user-rep .rep-down { - color: #d65 !important; - filter: brightness(140%) !important; - } - - .comment-flag-on, .comment-flag:hover, .flag-on { - color: #622 !important; - } - - /* dark blue */ - .result-highlight { - color: #aa0 !important; - } - - /* brown/dark orange */ - .warm { - color: #840 !important; - } - #profile-summary>.-popout._incomplete { - border-color: #840 !important; - } - - /* orange */ - .hot { - color: #a20 !important; - } - - /* light brown */ - .unanswered { - color: #9a4444 !important; - } - - /* === Style adjustments === */ - .nav a, .post-tag, .comment-link, .tag-synonym-link, a.post-tag:hover, .topbar a, - .search-form .filter-pane a:hover, .comment-link:hover, .tag-synonym-link:hover { - text-decoration: none !important; - } - - .form-item { - padding-left: 20px !important; - } - - .tag-container .col { - margin: 0 !important; - border: #333 1px solid !important; - } - .tag-container.row { - margin: 2px !important; - } - .stats { - margin-top: 5px !important; - margin-bottom: 4px !important; - } - #hsearch, .statscontainer { - margin-right: 5px !important; - } - - .nav .primarynav li a, .list-originals .stats { - display: block !important; - float: left !important; - } - - .nav-links--link .svg-icon { - fill: currentColor !important; - } - - /* scroll bar */ - ::-webkit-scrollbar { - max-width: 10px !important; - max-height: 10px !important; - background: #1d1d1d !important; - } - ::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { - background: #1d1d1d !important; - } - ::-webkit-scrollbar-thumb { - background: rgba(175, 175, 175, .5) !important; - } - ::-webkit-scrollbar-thumb:hover { - background: rgba(65, 131, 196, .8) !important; - background: rgba(65, 131, 196, .8) !important; - } - - /* === badges === */ - a.badge[title^="bronze"], a.badge-tag[title^="bronze"], .badge3 + .badgecount { - color: #c96 !important; - } - a.badge[title^="silver"], a.badge-tag[title^="silver"], .badge2 + .badgecount { - color: #c5c5c5 !important; - } - a.badge[title^="gold"], a.badge-tag[title^="gold"], .badge1 + .badgecount { - color: #ffcc46 !important; - } - .badge-tag, a.tag, .ob-post-tag, .ob-user-tag, .events-tooltip { - background-color: #191919 !important; - border-color: #111 !important; - } - .badge3-alternate, .progress-bar.badge-3 .bar .percent, - .s-progress-bar._badge._badge3 .-fill, .badge-wrapper._badge3 { - background-color: #7C4318 !important; /* bronze */ - } - .badge2-alternate, .progress-bar.badge-2 .bar .percent, - .s-progress-bar._badge._badge2 .-fill, .badge-wrapper._badge2 { - background-color: #464a4f !important; /* silver */ - } - .badge1-alternate, .progress-bar.badge-1 .bar .percent, - .s-progress-bar._badge._badge1 .-fill, .badge-wrapper._badge1 { - background-color: #957000 !important; /* gold */ - } - - /* === Images === */ - .wmd-button>span { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyODMgNjAiIHdpZHRoPSIyODMiIGhlaWdodD0iNjAiPgogIDxnIGZpbGw9IiNjNmM2YzYiPgogICAgPHBhdGggZD0iTTEyOCAxNC40aDguNlYxNkgxMjh2LTEuNnptMC01LjNoOC42djJIMTI4Vjl6bTAtNWg4LjZ2MS43SDEyOFY0em0tMi42LTF2My42aC0xVjRoLS44VjNoMS44em0tMSA3djFoMS44djFoLTIuNnYtMmwxLjctMXYtLjdoLTEuN3YtLjhoMi42djJsLTEuNy43em0xLjggMi43VjE3aC0yLjZ2LTFoMS43di0uN2gtMS43di0xaDEuN3YtLjhoLTEuN3YtMWgyLjZ6bTc4LTUuM0wyMDkgMTJWOS4zYzEuMyAwIDQuNyAwIDQuNyAzLjcgMCAyLTEuMyAzLjYtMyA0IDIuNi0uNCA0LjgtMyA0LjgtNiAwLTUuNi01LjgtNS42LTYuNi01LjZWM2wtNC40IDQuNHptMzEgMEwyMzEgMTJWOS4zYy0xLjMgMC00LjcgMC00LjcgMy43IDAgMiAxLjUgMy42IDMuMyA0LTIuNy0uNC01LTMtNS02IDAtNS42IDYtNS42IDYuNy01LjZWM2w0LjMgNC40ek01Ny43IDRDNTYuMyAyLjcgNTQgMi43IDUzIDRsLTMgM2MtMS40IDEuMy0xLjQgMy40IDAgNC43IDAgMCAwIC4yLjMuM2wxLTFjMC0uMi0uMi0uMy0uMy0uNC0uNy0uNy0uNy0xLjggMC0yLjVsMy0zYy43LS41IDEuOC0uNSAyLjUgMCAuNyAxIC43IDIgMCAyLjdMNTUgOWMuMy42LjUgMS4yLjUgMS44bDItMkM1OSA3LjMgNTkgNS4yIDU3LjUgNHptLTQuNCA0LjNMNTMgOGwtMS4yIDFjMCAuMi4zLjMuNC40LjcuNy43IDEuOCAwIDIuNWwtMyAzYy0uNy41LTEuOC41LTIuNSAwLS43LTEtLjctMiAwLTIuN0w0OCAxMWMtLjItLjYtLjQtMS4yLS40LTEuOGwtMiAyYy0xLjQgMS40LTEuNCAzLjUgMCA0LjggMS4yIDEuMyAzLjMgMS4zIDQuNiAwbDMtM2MxLjItMS4yIDEuMi0zLjQgMC00Ljd6TTE0OSA0aDguNnYxLjdIMTQ5VjR6bTAgNWg4LjZ2MkgxNDlWOXptMCA1LjRoOC42djEuOEgxNDl2LTEuOHptLTUuNC05LjZjMC0xIC44LTEuOCAxLjgtMS44czEuOC44IDEuOCAxLjgtLjggMS44LTEuOCAxLjgtMS44LTEtMS44LTEuOHptMCA1LjJjMC0xIC44LTEuOCAxLjgtMS44czEuOC44IDEuOCAxLjgtLjggMS44LTEuOCAxLjgtMS44LS44LTEuOC0xLjh6bTAgNS4yYzAtMSAuOC0xLjggMS44LTEuOHMxLjguOCAxLjggMS44LS44IDEuOC0xLjggMS44LTEuOC0uOC0xLjgtMS44em0tNzgtNi43YzIgMCAzLjUgMS41IDMuNSAzLjVzLTEuMyAzLjUtMy4zIDMuNVM2MiAxNCA2MiAxMnYtLjVjMC0zLjggMy4yLTcgNy03djJjLTEuMiAwLTIuNS41LTMuNCAxLjVsLS41LjZoLjd6bTkgMGMyIDAgMy41IDEuNSAzLjUgMy41cy0xLjMgMy41LTMuMyAzLjVTNzEgMTQgNzEgMTJ2LS41YzAtMy44IDMuMy03IDctN3YyYy0xLjIgMC0yLjUuNS0zLjQgMS41bC0uNS42aC43ek0yNTAgM2MtMy44IDAtNyAzLTcgN3MzLjIgNyA3IDcgNy0zIDctNy0zLjItNy03LTd6bTEgMTEuNGgtMnYtMS44aDJ2MS44em0yLjUtNC40bC0yLjYgMS44aC0ydi0xbDIuNi0xLjd2LS43aC00LjRWNi41aDUuMmMuNSAwIDEgLjQgMSAxVjEwek0xMyA5LjZDMTMuNyA5IDE0IDggMTQgN2MwLTIuMi0xLjgtNC00LTRINXYxNGg2YzIuMiAwIDQtMS44IDQtNCAwLTEuNS0uOC0yLjctMi0zLjR6TTggNWgxLjZjMSAwIDEuNiAxIDEuNiAycy0uNyAyLTEuNiAySDhWNXptMi41IDEwSDh2LTRoMi41YzEgMCAxLjcgMSAxLjcgMnMtLjggMi0xLjcgMnptMjktMTJ2MWgtMmwtNSAxMmgydjFoLTd2LTFoMmw1LTEyaC0yVjNoN3ptNDcuMiA2LjJ2LTNjMC0uNS4yLTEgLjUtMS4yLjMtLjMuOC0uNCAxLS40VjNDODYuNiAzIDg1IDQuNCA4NSA2djIuNGMwIC40LS4zLjgtLjguOGgtLjh2MS42aC44Yy41IDAgLjguMy44LjhWMTRjMCAxLjYgMS41IDMgMy4zIDN2LTEuNmMtLjQgMC0uOC0uMi0xLS40LS40LS4zLS42LS43LS42LTF2LTMuMmMwLS40LS4zLS44LS44LS44LjIgMCAuNi0uMy42LS44eiIvPgogICAgPHBhdGggZD0iTTE2NSAxMmgxMHYyaC0xMHYtMnptLTMtM2gxNnYyaC0xNlY5em0wIDZoMTZ2MmgtMTZ2LTJ6IiBvcGFjaXR5PSIuNCIvPgogICAgPHBhdGggZD0iTTE2MiAzaDE2djJoLTE2em0zIDNoMTB2MmgtMTB6bTE4LjYgM2gyLjN2MmgtMi41em0zLjQgMGgyLjN2MkgxODd6Ii8+CiAgICA8cGF0aCBkPSJNMTg2LjYgMTJoMTB2MmgtMTB2LTJ6bS0zIDNoMTZ2MmgtMTZ2LTJ6bTAtMTJoMTZ2MmgtMTZ6bTMgM2gxMHYyaC0xMHoiIG9wYWNpdHk9Ii40Ii8+CiAgICA8cGF0aCBkPSJNMTkwLjQgOWgyLjN2MmgtMi4zem0zLjQgMGgyLjN2MmgtMnptMy40IDBoMi4zdjJoLTIuM3pNOTMuNiAxMC44djNjMCAuNS0uMiAxLS41IDEuMiAwIC4zLS41LjQtMSAuNFYxN2MyIDAgMy4zLTEuNCAzLjMtM3YtMi40YzAtLjQuMy0uOC44LS44aDFWOS4yaC0xYy0uNSAwLS44LS4zLS44LS44VjZjMC0xLjYtMS41LTMtMy4zLTN2MS42bDEgLjRjLjIuMy40LjcuNCAxdjMuMmMwIC40LjMuOC44LjgtLjMgMC0uNy4zLS43Ljh6TTExOC4yIDR2MTJoLTE1VjRoMTVtMS0xaC0xN3YxNGgxN1YzeiIvPgogICAgPHBhdGggZD0iTTExNCA2LjhjMC0xIC42LTEuNiAxLjUtMS42IDEgMCAxLjYuNyAxLjYgMS42cy0uNSAxLjYtMS40IDEuNmMtLjggMC0xLjYtLjctMS42LTEuNnptMyA4aC0xMi42bDMtOC42IDQuNCA1LjQgMi0xLjZNMjY4LjUgOS44bC0uOC0uOC0yLjcgMi41IDIuNyAyLjUuOC0uOC0xLjgtMS43bTMuNyAxLjdsLjguOCAyLjgtMi41LTIuOC0yLjUtLjguOCAxLjggMS43TTI3MS4zIDN2NC43aDQuNyIvPgogICAgPHBhdGggZD0iTTI3NSA2LjdWMTZoLTExVjRoOC4zbC0xLTFIMjY0Yy0uNiAwLTEgLjUtMSAxdjEyYzAgLjUuNCAxIDEgMWgxMWMuNSAwIDEtLjUgMS0xVjcuN2wtMS0xeiIvPgogIDwvZz4KICA8ZyBmaWxsPSIjZjkwIj4KICAgIDxwYXRoIGQ9Ik0xMjggNTQuNGg4LjZWNTZIMTI4em0wLTUuM2g4LjZ2MkgxMjh2LTJ6bTAtNWg4LjZ2MS43SDEyOFY0NHptLTIuNi0xdjMuNmgtMVY0NGgtLjh2LTFoMS44em0tMSA3djFoMS44djFoLTIuNnYtMmwxLjctMXYtLjdoLTEuN3YtLjhoMi42djJsLTEuNy43em0xLjggMi43VjU3aC0yLjZ2LTFoMS43di0uN2gtMS43di0xaDEuN3YtLjhoLTEuN3YtMWgyLjZ6bTc4LTUuM0wyMDkgNTJ2LTIuN2MxLjMgMCA0LjcgMCA0LjcgMy43IDAgMi0xLjMgMy42LTMgNCAyLjYtLjQgNC44LTMgNC44LTYgMC01LjYtNS44LTUuNi02LjYtNS42VjQzem0zMSAwTDIzMSA1MnYtMi43Yy0xLjMgMC00LjcgMC00LjcgMy43IDAgMiAxLjUgMy42IDMuMyA0LTIuNy0uNC01LTMtNS02IDAtNS42IDYtNS42IDYuNy01LjZWNDN6TTU3LjcgNDRjLTEuMy0xLjMtMy41LTEuMy00LjcgMGwtMyAzYy0xLjUgMS4zLTEuNSAzLjQgMCA0LjcgMCAwIDAgLjIuMi4zbDEtMWMwLS4yLS4yLS4zLS4zLS40LS44LS43LS44LTEuOCAwLTIuNWwzLTNjLjYtLjUgMS43LS41IDIuNCAwIC43IDEgLjcgMiAwIDIuN0w1NSA0OWMuMy42LjUgMS4yLjUgMS44bDItMmMxLjMtMS40IDEuMy0zLjUgMC00Ljh6bS00LjQgNC4zTDUzIDQ4bC0xLjIgMWMwIC4yLjMuMy40LjQuNy43LjcgMS44IDAgMi41bC0zIDNjLS43LjUtMS44LjUtMi41IDAtLjctMS0uNy0yIDAtMi43TDQ4IDUxYy0uMi0uNi0uNC0xLjItLjQtMS44bC0yIDJjLTEuNCAxLjQtMS40IDMuNSAwIDQuOCAxLjIgMS4zIDMuMyAxLjMgNC42IDBsMy0zYzEuMi0xLjIgMS4yLTMuNCAwLTQuN3pNMTQ5IDQ0aDguNnYxLjdIMTQ5em0wIDVoOC42djJIMTQ5em0wIDUuNGg4LjZ2MS44SDE0OXptLTUuNC05LjZjMC0xIC44LTEuOCAxLjgtMS44czEuOC44IDEuOCAxLjgtLjggMS44LTEuOCAxLjgtMS44LTEtMS44LTEuOHptMCA1LjJjMC0xIC44LTEuOCAxLjgtMS44czEuOC44IDEuOCAxLjgtLjggMS44LTEuOCAxLjgtMS44LS44LTEuOC0xLjh6bTAgNS4yYzAtMSAuOC0xLjggMS44LTEuOHMxLjguOCAxLjggMS44LS44IDEuOC0xLjggMS44LTEuOC0uOC0xLjgtMS44em0tNzgtNi43YzIgMCAzLjUgMS41IDMuNSAzLjVzLTEuMyAzLjUtMy4zIDMuNWMtMiAwLTMuNy0xLjUtMy43LTMuNXYtLjVjMC0zLjggMy4yLTcgNy03djJjLTEuMiAwLTIuNS41LTMuNCAxLjVsLS41LjZoLjd6bTkgMGMyIDAgMy41IDEuNSAzLjUgMy41cy0xLjMgMy41LTMuMyAzLjVjLTIgMC0zLjctMS41LTMuNy0zLjV2LS41YzAtMy44IDMuMy03IDctN3YyYy0xLjIgMC0yLjUuNS0zLjQgMS41bC0uNS42aC43ek0yNTAgNDNjLTMuOCAwLTcgMy03IDdzMy4yIDcgNyA3IDctMyA3LTctMy4yLTctNy03em0xIDExLjRoLTJ2LTEuOGgyem0yLjUtNC40bC0yLjYgMS44aC0ydi0xbDIuNi0xLjd2LS43aC00LjR2LTEuN2g1LjJjLjUgMCAxIC40IDEgMVY1MHpNMTMgNDkuNmMuNi0uNyAxLTEuNiAxLTIuNiAwLTIuMi0xLjgtNC00LTRINXYxNGg2YzIuMiAwIDQtMS44IDQtNCAwLTEuNS0uOC0yLjctMi0zLjR6TTggNDVoMS42YzEgMCAxLjYgMSAxLjYgMnMtLjcgMi0xLjYgMkg4em0yLjUgMTBIOHYtNGgyLjVjMSAwIDEuNyAxIDEuNyAycy0uOCAyLTEuNyAyem0yOS0xMnYxaC0ybC01IDEyaDJ2MWgtN3YtMWgybDUtMTJoLTJ2LTF6bTQ3LjIgNi4ydi0zYzAtLjUuMi0xIC41LTEuMmwxLS40VjQzYy0xLjcgMC0zLjIgMS40LTMuMiAzdjIuNGMwIC40LS4zLjgtLjguOGgtLjh2MS42aC44Yy41IDAgLjguMy44LjhWNTRjMCAxLjYgMS41IDMgMy4zIDN2LTEuNmMtLjQgMC0uOC0uMi0xLS40LS40LS4zLS42LS43LS42LTF2LTMuMmMwLS40LS4zLS44LS44LS44LjIgMCAuNi0uMy42LS44eiIvPgogICAgPHBhdGggZD0iTTE2NSA1MmgxMHYyaC0xMHptLTMtM2gxNnYyaC0xNnptMCA2aDE2djJoLTE2ek0xODYuNiA1MmgxMHYyaC0xMHptLTMgM2gxNnYyaC0xNnptMC0xMmgxNnYyaC0xNnptMyAzaDEwdjJoLTEweiIgb3BhY2l0eT0iLjQiLz4KICAgIDxwYXRoIGQ9Ik05My42IDUwLjh2M2MwIC41LS4yIDEtLjUgMS4yIDAgLjMtLjUuNC0xIC40VjU3YzIgMCAzLjMtMS40IDMuMy0zdi0yLjRjMC0uNC4zLS44LjgtLjhoMXYtMS42aC0xYy0uNSAwLS44LS4zLS44LS44VjQ2YzAtMS42LTEuNi0zLTMuMy0zdjEuNmwxIC40Yy4yLjMuNC43LjQgMXYzLjJjMCAuNC4zLjguOC44LS4zIDAtLjcuMy0uNy44em0yNC42LTYuOHYxMmgtMTVWNDRoMTVtMS0xaC0xN3YxNGgxN3oiLz4KICAgIDxwYXRoIGQ9Ik0xMTQgNDYuOGMwLTEgLjYtMS42IDEuNS0xLjYgMSAwIDEuNi43IDEuNiAxLjYgMCAxLS41IDEuNi0xLjQgMS42LS44IDAtMS42LS43LTEuNi0xLjZ6bTMgOGgtMTIuNmwzLTguNiA0LjQgNS40IDItMS42TTI2OC41IDQ5LjhsLS44LS44LTIuNyAyLjUgMi43IDIuNS44LS44LTEuOC0xLjdtMy43IDEuN2wuOC44IDIuOC0yLjUtMi44LTIuNS0uOC44IDEuOCAxLjdNMjcxLjMgNDN2NC43aDQuNyIvPgogICAgPHBhdGggZD0iTTI3NSA0Ni43VjU2aC0xMVY0NGg4LjNsLTEtMUgyNjRjLS42IDAtMSAuNS0xIDF2MTJjMCAuNS40IDEgMSAxaDExYy41IDAgMS0uNSAxLTF2LTguM3pNMTgzLjYgNDguOGgyLjN2MmgtMi41em0zLjQgMGgyLjN2MkgxODd6TTE5MC40IDQ4LjhoMi4zdjJoLTIuNHptMy40IDBoMi4zdjJIMTk0ek0xOTcuMiA0OC44aDIuM3YySDE5N3pNMTYyIDQzaDE2djJoLTE2em0zIDNoMTB2MmgtMTB6Ii8+CiAgPC9nPgo8L3N2Zz4=) !important; - } - - #hlogo img, .everyonelovesstackoverflow, button[disabled], input[disabled] { - opacity: .3 !important; - } - .everyonelovesstackoverflow:empty { display: none !important; } - - #hlogo a, #footer-logo { - background-repeat: no-repeat !important; - } - - #footer-logo { - background-size: contain !important; - } - - #header-logo img, #footer-logo img { - visibility: hidden !important; - } - - #sound, .vote-count-container.stars .img, #sub-navs>a:hover .messages-icon, - .industries:before, .js-reputation-graph, .js-reputation-graph *, - #sub-navs .messages-icon, .topbar-dialog .header .icon-close { - -webkit-filter: invert(100%) !important; - filter: invert(100%) !important; - } - .collection img, .salary-survey-sidebar .header-img, #post-job .header-img { - filter: invert(80%) hue-rotate(180deg); - } - - .axis .tick, .pie text { - fill: #ccc !important; - } - .axis line, .axis path { - stroke: #999 !important; - } - - /*New navigation tabs*/ - .intellitab a { - background: transparent !important; - } - .intellitab.selected a { - background-color: rgba(51, 51, 51, .5) !important; - } - .intellitab a.youarehere { - border-bottom-color: #242729 !important; - } - .intellitab .menu-switcher { - background-color: #333 !important; - } - .intellitab .menu-switcher:hover{ - background-color: #222 !important; - } - .intellitab.dropdown-enabled:hover .menu-switcher, .intellitab .dropdown a:hover, - .post-timeline-v2 .post-timeline tr.separator > td > div { - background-color: #444 !important; - } - .dropdown:before { - filter: invert(76%) !important; - -webkit-filter: invert(76%) !important; - } - /* documentation editing icons */ - .docs-menu a { - -webkit-filter: brightness(200%) !important; - filter: brightness(200%) !important; - } - .docs-menu:hover a { - -webkit-filter: none !important; - filter: none !important; - } - - /* override prettyprint bright border styles */ - .prettyprint { - border-color: transparent !important; - color: #ddd !important; - } - /* style non-prettyprint code */ - code, pre:not(.prettyprint):not(.CodeMirror-line) { - background: #333 !important; - } - .prettyprint code { - background: transparent !important; - } - /* accepted answer code blocks */ - .accepted-answer pre, .accepted-answer code, .accepted-answer pre.prettyprint, - .accepted-answer .prettyprint .pln, .accepted-answer .youarehere, .accepted-answer pre:not(.prettyprint) { - background: #202A20 !important; - } - - /*! Desert */pre.prettyprint{display:block;background-color:#333!important;line-height:1.4em!important}pre .nocode{background-color:none!important;color:#000!important}code .str,pre .str{color:#ffa0a0!important}code .kwd,pre .kwd{color:khaki!important;font-weight:700!important}code .com,pre .com{color:#87ceeb!important}code .typ,pre .typ{color:#98fb98!important}code .lit,pre .lit{color:#cd5c5c!important}code .pun,pre .pun{color:#fff!important}code .pln,pre .pln{color:#fff!important}code .tag,pre .tag{color:khaki!important;font-weight:700!important}code .atn,pre .atn{color:#bdb76b!important;font-weight:700!important}code .atv,pre .atv{color:#ffa0a0!important}code .dec,pre .dec{color:#98fb98!important}ol.linenums{margin-top:0;margin-bottom:0;color:#aeaeae}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none!important}@media print{pre.prettyprint{background-color:none!important}code .str,pre .str{color:#060!important}code .kwd,pre .kwd{color:#006!important;font-weight:700!important}code .com,pre .com{color:#600!important;font-style:italic!important}code .typ,pre .typ{color:#404!important;font-weight:700!important}code .lit,pre .lit{color:#044!important}code .pun,pre .pun{color:#440!important}code .pln,pre .pln{color:#000!important}code .tag,pre .tag{color:#006!important;font-weight:700!important}code .atn,pre .atn{color:#404!important}code .atv,pre .atv{color:#060!important}} -} - -[qb-domain="stackexchange.com"] -{ - /* login screen StackExchange logo replacement */ - .login-page .se-logo { - -moz-box-sizing: border-box !important; - box-sizing: border-box !important; - background: url(https://StylishThemes.github.io/StackOverflow-Dark/images/stackexchange-logo.svg) no-repeat !important; - background-size: cover !important; - background-position: center center !important; - width: 200px !important; /* Width of new image */ - height: 48px !important; /* Height of new image */ - padding-left: 200px !important; /* Equal to width of new image */ - } - /* login button (input type=button")*/ - .login-page input.fr { - background-color: #4183C4 !important; - } - /* remove content border */ - #content { - border: 0 !important; - } - #sidebar #newsletter-ad, #sidebar .ad-container, #sidebar .everyonelovesstackoverflow { - border-width: 2px !important; - } - /* start blog.stackexchange.com */ - .cse .gsc-control-cse, .gsc-control-cse, div.pagination { - background-color: #181818 !important; - } - .sidebar p { - color: #ddd !important; - } - .job { - color: #888 !important; - } - .gsc-control-wrapper-cse { - padding-top: 10px !important; - } - /* hide google custom search placeholder */ - .gsc-input input:not(.gse-input-focus) { - background-image: none !important; - } - .podcast-container { - -webkit-filter: invert(100%) !important; - filter: invert(100%) !important; - } - .filters-sidebar .filters ul li.current, - .filters-sidebar .filters ul li.current .filter-unread-count { - background: #182030 !important; - } - /* end blog.stackexchange.com */ - /* chat.stackexchange.com */ - .event-banner { - background-color: #222 !important; - border-color: #555 !important; - } - /* end chat.stackexchange.com */ - /* http://stackexchange.com/newsletters/newsletter (see #36) */ - .promotion-banner-container, .promotion-banner { - background: #222 !important; - } - table[style*="background-color"], table[style*="background-image"] { - background: transparent !important; - border: none !important; - } - table h2[style*="color: "][style*="!important"], - table a[style*="color: #000!important"]:not([href*="questions/tagged"]) { - /* can't use color here because they added an inline !important */ - filter: invert(100%); - } - table tr, table td, table td p { - background: transparent !important; - color: #ddd !important; - } - table td a[href*="questions/tagged"] { - background: #222 !important; - color: #ddd !important; - border: none !important; - text-decoration: none !important; - } - table td hr { - border-style: solid !important; - } - footer .iconLogoSE path:first-child { - fill: #ededed !important; - } - div[class^="gv-"], table.gv-stats tr, table.gv-stats td { - color: initial !important; - } - - /* target sites to *NOT* hide the header background */ - #header, #hmenus { - background-color: transparent !important; - } - #header { - background-image: none !important; - } -} - -[qb-domain="tex.stackexchange.com"] -{ - /* target sites that need an inverted header */ - #header, #header > * { - -webkit-filter: invert(100%) !important; - filter: invert(100%) !important; - } -} - -[qb-domain="stackoverflow.com"] -{ - #hlogo a { - background-image: url(https://StylishThemes.github.io/StackOverflow-Dark/images/stackoverflow-logo.svg) !important; - } - .-logo > .-img { - background-image: url(https://StylishThemes.github.io/StackOverflow-Dark/images/stackoverflow-logo.svg) !important; - background-size: cover !important; - background-position: 0 0 !important; - background-repeat: no-repeat !important; - } -} - -[qb-domain="chat.stackoverflow.com"] -{ - /* chat.stackoverflow.com */ - #hlogo a { - background-image: none !important; - } - #header-logo, #footer-logo { - background-image: url(https://StylishThemes.github.io/StackOverflow-Dark/images/stackoverflow-logo.svg) !important; - } - #header-logo { - background-size: contain !important; - } -} - -[qb-domain="askubuntu.com"] -{ - #header { - background-image: none !important; - } - .narrow div.votes, .answered-accepted .mini-counts { - background-color: transparent !important; - } - #custom-header .nav-global, #custom-header .nav-global ul, .topbar { - background-color: #000 !important; - } - #custom-header .more.open, .topbar .profile-me:hover, .topbar a:hover, .topbar-icon:hover, #hmenus, .nav li, .nav a { - background-color: #111 !important; - } - #custom-header .nav-global a { - border-top-color: transparent !important; - } - #custom-header .nav-global a.active { - color: #eee !important; - border-top-color: #eee !important; - } - .nav li.youarehere, .nav li:hover { - background-color: #4183C4 !important; - } -} - -[qb-domain="english.stackexchange.com"] -{ - /* english language & usage */ - .post-signature.owner { - background-image: none !important; - } -} diff --git a/modules/themes/alucard/config/qutebrowser/userstyles/xkcd.scss b/modules/themes/alucard/config/qutebrowser/userstyles/xkcd.scss deleted file mode 100644 index 0888daa1..00000000 --- a/modules/themes/alucard/config/qutebrowser/userstyles/xkcd.scss +++ /dev/null @@ -1,86 +0,0 @@ -[qb-domain$="xkcd.com"] { - body { - background: #282a36 !important; - color: #f8f8f2 !important; - } - - img, div[class="self"] { - filter: hue-rotate(180deg) invert(100%) !important; - -webkit-filter: hue-rotate(180deg) invert(100%) !important; - } - - /*Exceptions*/ - img[alt="Stargazing"], img[alt="Flashlights"], img[alt="Google Maps"], img[alt="Alternative Energy Revolution"], img[alt="Man Page"] { - filter: invert(0%) !important; - -webkit-filter: invert(0%) !important; - } - - .box { - background: #1E2029 !important; - } - - #topLeft a { - color: #e0e0e0 !important; - } - - ul.comicNav li a { - background: transparent linear-gradient(#3C3C3C, #2E2E2E) repeat scroll 0% 0% !important; - } -} - - -[qb-domain="imgs.xkcd.com"] { - img { - filter: hue-rotate(180deg) invert(100%) !important; - -webkit-filter: hue-rotate(180deg) invert(100%) !important; - } - - /*Exceptions*/ - img[alt="https://imgs.xkcd.com/comics/stargazing.png"], - img[alt="https://imgs.xkcd.com/comics/flashlights.png"], - img[alt="https://imgs.xkcd.com/comics/google_maps.png"], - img[alt="https://imgs.xkcd.com/comics/alternative_energy_revolution.jpg"], - img[alt="https://imgs.xkcd.com/comics/man_page.png"] { - filter: invert(0%) !important; - -webkit-filter: invert(0%) !important; - } -} - - -[qb-domain="m-xkcd.com"] { - body { - background: #282a36 !important; - } - - #title { - color: #FAFAFA !important; - } - - #altTextLink { - color: #CCCCCC !important; - } - - #news { - color: #FAFAFA !important; - } - - ul#footerLinks li a { - background: transparent linear-gradient(#3C3C3C, #2E2E2E) repeat scroll 0% 0% !important; - } - - #altText { - background: #131313 !important; - color: #FAFAFA !important; - } - - img { - filter: hue-rotate(180deg) invert(100%) !important; - -webkit-filter: hue-rotate(180deg) invert(100%) !important; - } - - /*Exceptions*/ - img[alt="Stargazing"], img[alt="Flashlights"], img[alt="Google Maps"], img[alt="Alternative Energy Revolution"], img[alt="Man Page"] { - filter: invert(0%) !important; - -webkit-filter: invert(0%) !important; - } -} diff --git a/modules/themes/alucard/config/rofi/appmenu.rasi b/modules/themes/alucard/config/rofi/appmenu.rasi deleted file mode 100644 index a4d62c5c..00000000 --- a/modules/themes/alucard/config/rofi/appmenu.rasi +++ /dev/null @@ -1,10 +0,0 @@ -/* -*- mode: css; -*- */ -@import "config.rasi" - -textbox-icon { - str: "  "; -} - -prompt { - enabled: false; -} diff --git a/modules/themes/alucard/config/rofi/base.cyclemenu.rasi b/modules/themes/alucard/config/rofi/base.cyclemenu.rasi deleted file mode 100644 index 3de4010b..00000000 --- a/modules/themes/alucard/config/rofi/base.cyclemenu.rasi +++ /dev/null @@ -1,21 +0,0 @@ -/* -*- mode: css; -*- */ -@import "config.rasi" - -window { - y-offset: 0; - children: [ listview ]; - width: 500px; -} - -listview { - scrollbar: false; -} - -element { - padding: 30px; - background-color: @bg-light; -} -element.selected { - background-color: @accent; - text-color: @bg; -} diff --git a/modules/themes/alucard/config/rofi/bookmarkmenu.rasi b/modules/themes/alucard/config/rofi/bookmarkmenu.rasi deleted file mode 100644 index 0cb69f97..00000000 --- a/modules/themes/alucard/config/rofi/bookmarkmenu.rasi +++ /dev/null @@ -1,14 +0,0 @@ -/* -*- mode: css; -*- */ -@import "config.rasi" - -listview { - columns: 1; -} - -textbox-icon { - str: "  "; -} - -prompt { - enabled: false; -} diff --git a/modules/themes/alucard/config/rofi/config.rasi b/modules/themes/alucard/config/rofi/config.rasi deleted file mode 100644 index 57f4d5c0..00000000 --- a/modules/themes/alucard/config/rofi/config.rasi +++ /dev/null @@ -1,137 +0,0 @@ -/* -*- mode: css; -*- */ -configuration { - icon-theme: "Paper"; - cycle: true; - disable-history: false; - monitor: "-4"; - - /* Vim-esque C-j/C-k as up/down in rofi */ - kb-accept-entry: "Return,Control+m,KP_Enter"; - kb-row-down: "Down,Control+n,Control+j"; - kb-remove-to-eol: ""; - kb-row-up: "Up,Control+p,Control+k"; -} - -* { - accent: #bd93f9; - bg: #1E2029FA; - bg-light: #1c1c1c; - bg-focus: #282a36; - bg-dark: #181a23; - fg: #bbc2cf; - fg-list: #bbc2cf; - on: #8BD49C; - off: #cc6666; - - magenta: #bd93f9; - blue: #61bfff; - - text-font: "Fira Sans 15"; - text-mono-font: "Fira Code 13"; - /* icon-font: "Hurmit Nerd Font Mono 26"; */ - icon-font: "FontAwesome 20"; - - background-color: transparent; - text-color: @fg-list; - font: @text-font; - border-color: @bg-dark; -} - - -/**** Layout ****/ -window { - width: 1000px; - y-offset: -50px; - anchor: north; - location: center; - border: 1px; - border-radius: 6px 6px 0 0; - children: [ inputbar, listview ]; - -} - -listview { - lines: 12; - fixed-height: false; - /* reverse: true; */ - columns: 2; - scrollbar: true; - spacing: 1px; - /* Remove strange gap between listview and inputbar */ - margin: -2px 0 0; -} - -/* - TODO Not supported in stable branch of rofi - @media only (max-height: 1080px) { - window { - y-offset: -30%; - } - listview { - lines: 14; - } - } -*/ - -scrollbar { - handle-width: 1px; -} -inputbar { - children: [ textbox-icon, prompt, entry ]; - border: 0 0 0; -} -textbox-icon, prompt { - padding: 11px; - expand: false; - border: 0 1px 0 0; - margin: 0 -2px 0 0; -} -textbox-icon { - padding: 7px 4px 0; -} -entry, element { - padding: 10px 13px; -} -textbox { - padding: 24px; - margin: 20px; -} - - -/**** Looks ****/ -scrollbar { - background-color: @bg-dark; - handle-color: @accent; - border-color: @bg-dark; -} -listview, inputbar { - background-color: @bg-dark; -} -textbox-icon, prompt, entry { - text-color: @accent; -} -prompt, entry { - background-color: @bg-focus; -} -textbox-icon, prompt { - background-color: #2f313d; -} -prompt { - background-color: @bg-focus; -} -textbox-icon { - font: @icon-font; -} -entry { - font: @text-font-mono; - text-color: @fg; -} - -element { - background-color: @bg; - text-color: @fg; -} -element selected { - background-color: @bg-dark; - text-color: @accent; -} diff --git a/modules/themes/alucard/config/rofi/filemenu.rasi b/modules/themes/alucard/config/rofi/filemenu.rasi deleted file mode 100644 index 7f2d3209..00000000 --- a/modules/themes/alucard/config/rofi/filemenu.rasi +++ /dev/null @@ -1,11 +0,0 @@ -/* -*- mode: css; -*- */ - -@import "config.rasi" - -textbox-icon { - str: "  "; -} - -prompt { - enabled: true; -} diff --git a/modules/themes/alucard/config/rofi/passmenu.rasi b/modules/themes/alucard/config/rofi/passmenu.rasi deleted file mode 100644 index 901a8c31..00000000 --- a/modules/themes/alucard/config/rofi/passmenu.rasi +++ /dev/null @@ -1,10 +0,0 @@ -/* -*- mode: css; -*- */ -@import "config.rasi" - -listview { - columns: 1; -} - -textbox-icon { - str: "  "; -} diff --git a/modules/themes/alucard/config/rofi/powermenu.rasi b/modules/themes/alucard/config/rofi/powermenu.rasi deleted file mode 100644 index 83681185..00000000 --- a/modules/themes/alucard/config/rofi/powermenu.rasi +++ /dev/null @@ -1,23 +0,0 @@ -/** -*- mode: css; -*- - * This theme is intended for a 5 items wide menu on a 1920x1080 pixels resolution. - * You may have to tweak values such as the window padding if you have a different resolution. - */ -@import "appmenu.rasi" - -window { - children: [ listview ]; - width: 500px; -} - -listview { - scrollbar: false; -} - -element { - padding: 30px; - background-color: @bg-light; -} -element.selected { - background-color: @accent; - text-color: @bg; -} diff --git a/modules/themes/alucard/config/rofi/windowmenu.rasi b/modules/themes/alucard/config/rofi/windowmenu.rasi deleted file mode 100644 index 3003bfb2..00000000 --- a/modules/themes/alucard/config/rofi/windowmenu.rasi +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- mode: css; -*- */ - -@import "config.rasi" - -listview { - columns: 1; -} - -inputbar { - width: 1100px; -} - -textbox-icon { - str: "  "; -} - -prompt { - enabled: false; -} - -/** - * Elements are tab-delimited, which look weird in the default variable-pitch - * font, so use a monospace one. - */ -element { - font: "Fira Code 12"; -} diff --git a/modules/themes/alucard/config/tmux.conf b/modules/themes/alucard/config/tmux.conf deleted file mode 100644 index 2dc3ebb6..00000000 --- a/modules/themes/alucard/config/tmux.conf +++ /dev/null @@ -1,64 +0,0 @@ -# -- THEME ------------------------------- - -# The statusbar -set -g status-position bottom -set -g status-justify centre -set -g status-bg default -set -g status-fg colour15 -set -g status-interval 10 -# set -g status-attr dim -# set -g status-left '#[fg=colour236]_________________________' -set -g status-left '#{prefix_highlight}#[fg=colour236]|―――――――――――――――――――|' -# set -g status-left "#[fg=colour236]#{prefix_highlight} #[fg=colour5] #S #[fg=colour236]──" -# set -g status-right '#[fg=colour236]_________________________' -set -g status-right '#[fg=colour236]|―――――――――――――――――――――――――|' -set -g status-right-length 30 -set -g status-left-length 30 - -# The messages -set -g message-style fg=magenta,bg=colour236 -set -g message-command-style fg=blue,bg=black - -# loud or quiet? -set-option -g visual-activity off -set-option -g visual-bell off -set-option -g visual-silence off -set-window-option -g monitor-activity on -set-option -g bell-action none - -# The modes -setw -g clock-mode-colour colour135 -# setw -g mode-attr bold -# setw -g mode-fg colour196 -# setw -g mode-bg colour238 - -# The panes -set -g pane-border-style fg=colour235 -set -g pane-active-border-style fg=colour5 - -# setw -g window-status-current-fg colour2 -# setw -g window-status-current-bg default -# setw -g window-status-current-attr none -# setw -g window-status-current-format ' #W ' - -# setw -g window-status-fg colour236 -# setw -g window-status-bg default -# setw -g window-status-attr none -# setw -g window-status-format '#[fg=colour8] #I #[fg=default]#W ' -setw -g window-status-format ' #W ' - -# setw -g window-status-activity-bg default -# setw -g window-status-activity-fg colour240 -# setw -g window-status-activity-attr none - -# setw -g window-status-bell-attr bold -# setw -g window-status-bell-fg colour255 -# setw -g window-status-bell-bg colour1 - - -# -- PLUGINS ----------------------------- - -# tmux-prefix-highlight -set -g @prefix_highlight_empty_prompt '-----' -set -g @prefix_highlight_prefix_prompt ' C^c #[bg=colour8]' -set -g @prefix_highlight_show_copy_mode 'on' diff --git a/modules/themes/alucard/config/wallpaper.png b/modules/themes/alucard/config/wallpaper.png deleted file mode 100644 index d558bca2..00000000 Binary files a/modules/themes/alucard/config/wallpaper.png and /dev/null differ diff --git a/modules/themes/alucard/config/zsh/prompt.zsh b/modules/themes/alucard/config/zsh/prompt.zsh deleted file mode 100644 index 9dc648ee..00000000 --- a/modules/themes/alucard/config/zsh/prompt.zsh +++ /dev/null @@ -1,71 +0,0 @@ -# Loosely based off Pure - -_strlen() { echo ${#${(S%%)1//$~%([BSUbfksu]|([FB]|){*})/}}; } - -# fastest possible way to check if repo is dirty -prompt_git_dirty() { - command -v git >/dev/null || return - - # check if we're in a git repo - [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] || return - # check if it's dirty - command test -n "$(git status --porcelain --ignore-submodules -unormal)" || return - - local r=$(command git rev-list --right-only --count HEAD...@'{u}' 2>/dev/null) - local l=$(command git rev-list --left-only --count HEAD...@'{u}' 2>/dev/null) - - (( ${r:-0} > 0 )) && echo -n " %F{red}${r}-" - (( ${l:-0} > 0 )) && echo -n " %F{green}${l}+" - echo -n '%f' -} - -## Hooks ############################### -prompt_hook_precmd() { - vcs_info # get git info - # Newline before prompt, except on init - [[ -n $PROMPT_DONE ]] && print ""; PROMPT_DONE=1 -} - -## Initialization ###################### -prompt_init() { - # prevent percentage showing up - # if output doesn't end with a newline - export PROMPT_EOL_MARK= - - # prompt_opts=(cr subst percent) - setopt promptsubst - autoload -Uz add-zsh-hook - autoload -Uz vcs_info - - add-zsh-hook precmd prompt_hook_precmd - # Updates cursor shape and prompt symbol based on vim mode - zle-keymap-select() { - case $KEYMAP in - vicmd) PROMPT_SYMBOL="%F{green}« " ;; - main|viins) PROMPT_SYMBOL="%(?.%F{magenta}.%F{yellow})λ " ;; - esac - zle reset-prompt - zle -R - } - zle -N zle-keymap-select - zle -A zle-keymap-select zle-line-init - - zstyle ':vcs_info:*' enable git - zstyle ':vcs_info:*' use-simple true - zstyle ':vcs_info:*' max-exports 2 - zstyle ':vcs_info:git*' formats ' %b' - zstyle ':vcs_info:git*' actionformats ' %b (%a)' - - # show username@host if logged in through SSH - if [[ -n $SSH_CONNECTION ]]; then - prompt_username='%m ' - if [[ $(whoami) != hlissner ]]; then - prompt_username="%n.$prompt_username" - fi - fi - - RPROMPT='%F{blue}%~%F{magenta}${vcs_info_msg_0_}$(prompt_git_dirty)%f' - PROMPT='%F{magenta}${prompt_username}%f${PROMPT_SYMBOL:-$ }%f' -} - -prompt_init "$@" diff --git a/modules/themes/alucard/default.nix b/modules/themes/alucard/default.nix deleted file mode 100644 index 671bc5a3..00000000 --- a/modules/themes/alucard/default.nix +++ /dev/null @@ -1,112 +0,0 @@ -# modules/themes/alucard/default.nix --- a regal dracula-inspired theme - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.theme; -in { - config = mkIf (cfg.active == "alucard") (mkMerge [ - # Desktop-agnostic configuration - { - modules = { - theme = { - wallpaper = mkDefault ./config/wallpaper.png; - gtk = { - theme = "Dracula"; - iconTheme = "Paper"; - cursorTheme = "Paper"; - }; - }; - - shell.zsh.rcFiles = [ ./config/zsh/prompt.zsh ]; - shell.tmux.rcFiles = [ ./config/tmux.conf ]; - desktop.browsers = { - firefox.userChrome = concatMapStringsSep "\n" readFile [ - ./config/firefox/userChrome.css - ]; - qutebrowser.userStyles = concatMapStringsSep "\n" readFile - (map toCSSFile [ - ./config/qutebrowser/userstyles/monospace-textareas.scss - ./config/qutebrowser/userstyles/stackoverflow.scss - ./config/qutebrowser/userstyles/xkcd.scss - ]); - }; - }; - } - - # Desktop (X11) theming - (mkIf config.services.xserver.enable { - user.packages = with pkgs; [ - unstable.dracula-theme - paper-icon-theme # for rofi - ]; - fonts = { - fonts = with pkgs; [ - fira-code - fira-code-symbols - jetbrains-mono - siji - font-awesome-ttf - ]; - fontconfig.defaultFonts = { - sansSerif = ["Fira Sans"]; - monospace = ["Fira Code"]; - }; - }; - - # Compositor - services.picom = { - fade = true; - fadeDelta = 1; - fadeSteps = [ 0.01 0.012 ]; - shadow = true; - shadowOffsets = [ (-10) (-10) ]; - shadowOpacity = 0.22; - # activeOpacity = "1.00"; - # inactiveOpacity = "0.92"; - settings = { - shadow-radius = 12; - # blur-background = true; - # blur-background-frame = true; - # blur-background-fixed = true; - blur-kern = "7x7box"; - blur-strength = 320; - }; - }; - - # Login screen theme - services.xserver.displayManager.lightdm.greeters.mini.extraConfig = '' - text-color = "#ff79c6" - password-background-color = "#1E2029" - window-color = "#181a23" - border-color = "#181a23" - ''; - - # Other dotfiles - home.configFile = with config.modules; mkMerge [ - { - # Sourced from sessionCommands in modules/themes/default.nix - "xtheme/90-theme".source = ./config/Xresources; - } - (mkIf desktop.bspwm.enable { - "bspwm/rc.d/polybar".source = ./config/polybar/run.sh; - "bspwm/rc.d/theme".source = ./config/bspwmrc; - }) - (mkIf desktop.apps.rofi.enable { - "rofi/theme" = { source = ./config/rofi; recursive = true; }; - }) - (mkIf (desktop.bspwm.enable || desktop.stumpwm.enable) { - "polybar" = { source = ./config/polybar; recursive = true; }; - "dunst/dunstrc".source = ./config/dunstrc; - }) - (mkIf desktop.media.graphics.vector.enable { - "inkscape/templates/default.svg".source = ./config/inkscape/default-template.svg; - }) - (mkIf desktop.browsers.qutebrowser.enable { - "qutebrowser/extra/theme.py".source = ./config/qutebrowser/theme.py; - }) - ]; - }) - ]); -} diff --git a/modules/themes/default.nix b/modules/themes/default.nix deleted file mode 100644 index 6bb73fb6..00000000 --- a/modules/themes/default.nix +++ /dev/null @@ -1,125 +0,0 @@ -# Theme modules are a special beast. They're the only modules that are deeply -# intertwined with others, and are solely responsible for aesthetics. Disabling -# a theme module should never leave a system non-functional. - -{ options, config, lib, pkgs, ... }: - -with lib; -with lib.my; -let cfg = config.modules.theme; -in { - options.modules.theme = with types; { - active = mkOption { - type = nullOr str; - default = null; - apply = v: let theme = builtins.getEnv "THEME"; in - if theme != "" then theme else v; - description = '' - Name of the theme to enable. Can be overridden by the THEME environment - variable. Themes can also be hot-swapped with 'hey theme $THEME'. - ''; - }; - - wallpaper = mkOpt (either path null) null; - - loginWallpaper = mkOpt (either path null) - (if cfg.wallpaper != null - then toFilteredImage cfg.wallpaper "-gaussian-blur 0x2 -modulate 70 -level 5%" - else null); - - gtk = { - theme = mkOpt str ""; - iconTheme = mkOpt str ""; - cursorTheme = mkOpt str ""; - }; - - onReload = mkOpt (attrsOf lines) {}; - }; - - config = mkIf (cfg.active != null) (mkMerge [ - # Read xresources files in ~/.config/xtheme/* to allow modular - # configuration of Xresources. - (let xrdb = ''${pkgs.xorg.xrdb}/bin/xrdb -merge "$XDG_CONFIG_HOME"/xtheme/*''; - in { - services.xserver.displayManager.sessionCommands = xrdb; - modules.theme.onReload.xtheme = xrdb; - }) - - { - home.configFile = { - # GTK - "gtk-3.0/settings.ini".text = '' - [Settings] - ${optionalString (cfg.gtk.theme != "") - ''gtk-theme-name=${cfg.gtk.theme}''} - ${optionalString (cfg.gtk.iconTheme != "") - ''gtk-icon-theme-name=${cfg.gtk.iconTheme}''} - ${optionalString (cfg.gtk.cursorTheme != "") - ''gtk-cursor-theme-name=${cfg.gtk.cursorTheme}''} - gtk-fallback-icon-theme=gnome - gtk-application-prefer-dark-theme=true - gtk-xft-hinting=1 - gtk-xft-hintstyle=hintfull - gtk-xft-rgba=none - ''; - # GTK2 global theme (widget and icon theme) - "gtk-2.0/gtkrc".text = '' - ${optionalString (cfg.gtk.theme != "") - ''gtk-theme-name="${cfg.gtk.theme}"''} - ${optionalString (cfg.gtk.iconTheme != "") - ''gtk-icon-theme-name="${cfg.gtk.iconTheme}"''} - gtk-font-name="Sans 10" - ''; - # QT4/5 global theme - "Trolltech.conf".text = '' - [Qt] - ${optionalString (cfg.gtk.theme != "") - ''style=${cfg.gtk.theme}''} - ''; - }; - } - - (mkIf (cfg.wallpaper != null) - (let wCfg = config.services.xserver.desktopManager.wallpaper; - command = '' - if [ -e "$XDG_DATA_HOME/wallpaper" ]; then - ${pkgs.feh}/bin/feh --bg-${wCfg.mode} \ - ${optionalString wCfg.combineScreens "--no-xinerama"} \ - --no-fehbg \ - $XDG_DATA_HOME/wallpaper - fi - ''; - in { - # Set the wallpaper ourselves so we don't need .background-image and/or - # .fehbg polluting $HOME - services.xserver.displayManager.sessionCommands = command; - modules.theme.onReload.wallpaper = command; - - home.dataFile = mkIf (cfg.wallpaper != null) { - "wallpaper".source = cfg.wallpaper; - }; - })) - - (mkIf (cfg.loginWallpaper != null) { - services.xserver.displayManager.lightdm.background = cfg.loginWallpaper; - }) - - (mkIf (cfg.onReload != {}) - (let reloadTheme = - with pkgs; (writeScriptBin "reloadTheme" '' - #!${stdenv.shell} - echo "Reloading current theme: ${cfg.active}" - ${concatStringsSep "\n" - (mapAttrsToList (name: script: '' - echo "[${name}]" - ${script} - '') cfg.onReload)} - ''); - in { - user.packages = [ reloadTheme ]; - system.userActivationScripts.reloadTheme = '' - [ -z "$NORELOAD" ] && ${reloadTheme}/bin/reloadTheme - ''; - })) - ]); -} diff --git a/modules/xdg.nix b/modules/xdg.nix deleted file mode 100644 index e8258d54..00000000 --- a/modules/xdg.nix +++ /dev/null @@ -1,50 +0,0 @@ -# xdg.nix -# -# Set up and enforce XDG compliance. Other modules will take care of their own, -# but this takes care of the general cases. - -{ config, home-manager, ... }: -{ - ### A tidy $HOME is a tidy mind - home-manager.users.${config.user.name}.xdg.enable = true; - - environment = { - sessionVariables = { - # These are the defaults, and xdg.enable does set them, but due to load - # order, they're not set before environment.variables are set, which could - # cause race conditions. - XDG_CACHE_HOME = "$HOME/.cache"; - XDG_CONFIG_HOME = "$HOME/.config"; - XDG_DATA_HOME = "$HOME/.local/share"; - XDG_BIN_HOME = "$HOME/.local/bin"; - }; - variables = { - # Conform more programs to XDG conventions. The rest are handled by their - # respective modules. - __GL_SHADER_DISK_CACHE_PATH = "$XDG_CACHE_HOME/nv"; - ASPELL_CONF = '' - per-conf $XDG_CONFIG_HOME/aspell/aspell.conf; - personal $XDG_CONFIG_HOME/aspell/en_US.pws; - repl $XDG_CONFIG_HOME/aspell/en.prepl; - ''; - CUDA_CACHE_PATH = "$XDG_CACHE_HOME/nv"; - HISTFILE = "$XDG_DATA_HOME/bash/history"; - INPUTRC = "$XDG_CONFIG_HOME/readline/inputrc"; - LESSHISTFILE = "$XDG_CACHE_HOME/lesshst"; - WGETRC = "$XDG_CONFIG_HOME/wgetrc"; - - # Tools I don't use - # SUBVERSION_HOME = "$XDG_CONFIG_HOME/subversion"; - # BZRPATH = "$XDG_CONFIG_HOME/bazaar"; - # BZR_PLUGIN_PATH = "$XDG_DATA_HOME/bazaar"; - # BZR_HOME = "$XDG_CACHE_HOME/bazaar"; - # ICEAUTHORITY = "$XDG_CACHE_HOME/ICEauthority"; - }; - - # Move ~/.Xauthority out of $HOME (setting XAUTHORITY early isn't enough) - extraInit = '' - export XAUTHORITY=/tmp/Xauthority - [ -e ~/.Xauthority ] && mv -f ~/.Xauthority "$XAUTHORITY" - ''; - }; -} diff --git a/monitoring.nix b/monitoring.nix new file mode 100644 index 00000000..793ac393 --- /dev/null +++ b/monitoring.nix @@ -0,0 +1,59 @@ +{ config, pkgs, ... }: { + # grafana configuration + services.grafana = { + enable = true; + domain = "stats.mossnet.lan"; + port = 2342; + addr = "127.0.0.1"; + }; + + # nginx reverse proxy + services.nginx.virtualHosts.${config.services.grafana.domain} = { + locations."/" = { + proxyPass = "http://127.0.0.1:${toString config.services.grafana.port}"; + proxyWebsockets = true; + }; + }; + + services.prometheus = { + enable = true; + port = 9001; + exporters = { + node = { + enable = true; + enabledCollectors = [ "systemd" ]; + port = 9002; + }; + dnsmasq = { + enable = true; + port = 9153; + }; + }; + scrapeConfigs = [ + { + job_name = "box"; + static_configs = [{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }]; + } + { + job_name = "dns"; + static_configs = [{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.dnsmasq.port}" ]; }]; + } + ]; + }; + + services.loki = { + #enable = true; + #configFile = /var/loki-config.yaml; + }; + + #systemd.services.promtail = { + # description = "Promtail service for Loki"; + # wantedBy = [ "multi-user.target" ]; + + # serviceConfig = { + # ExecStart = '' + # ${pkgs.grafana-loki}/bin/promtail --config.file ${/var/promtail.yaml} + # ''; + # }; + #}; +} diff --git a/mossnet.nix b/mossnet.nix new file mode 100644 index 00000000..3cb80308 --- /dev/null +++ b/mossnet.nix @@ -0,0 +1,28 @@ +{config, pkgs, ...}: + +{ + imports = [ + ./taskd.nix + ./nextcloud.nix + ./networking.nix + ./wireguard.nix + ./shaarli.nix +## ./navidrome.nix +## ./pkg-navidrome.nix + ./mod-wallabag.nix + ./wallabag.nix + ./headphones.nix + ./dns.nix + ./backup.nix + ./monitoring.nix + ./dev.nix + ./gonic.nix + ./module-gonic.nix +# ./rss-bridge.nix +# ./pkg-grasp.nix +# ./mod-grasp.nix + ./cron.nix + ./ftp.nix + ./nfs.nix + ]; +} diff --git a/musician.nix b/musician.nix new file mode 100644 index 00000000..0dc95059 --- /dev/null +++ b/musician.nix @@ -0,0 +1,24 @@ +{pkgs, config, ... }: +{ + imports = [ + /home/anish/usr/musnix + ]; + + musnix.enable = true; + users.users.anish.extraGroups = [ "audio" ]; + + environment.systemPackages = with pkgs; [ ardour patchage helm ]; + #services.jack = { + # jackd.enable = true; + # # support ALSA only programs via ALSA JACK PCM plugin + # alsa.enable = false; + # # support ALSA only programs via loopback device (supports programs like Steam) + # loopback = { + # enable = true; + # # buffering parameters for dmix device to work with ALSA only semi-professional sound programs + # #dmixConfig = '' + # # period_size 2048 + # #''; + # }; + #}; +} diff --git a/musnix.nix b/musnix.nix new file mode 100644 index 00000000..b924f30f --- /dev/null +++ b/musnix.nix @@ -0,0 +1,6 @@ +{ + imports = [ ]; + musnix.enable = true; + + users.users."anish".extraGroups = [ "audio" ]; +} diff --git a/navidrome.nix b/navidrome.nix new file mode 100644 index 00000000..be4fe9c5 --- /dev/null +++ b/navidrome.nix @@ -0,0 +1,101 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.navidrome; + configFile = "/etc/navidrome/settings.json"; + dataFolder = "/var/lib/navidrome"; +in { + options = { + + services.navidrome = { + enable = mkEnableOption "Navidrome music server and streamer"; + + settings = lib.mkOption { + type = with types; attrsOf (oneOf [ int str ]); + default = {}; + example = literalExample '' + { + LogLevel = "INFO"; + BaseURL = "/music"; + ScanInterval = "10s"; + TranscodingCacheSize = "15MB"; + MusicFolder = "/data/music"; + }; + ''; + description = '' + Configuration for Navidrome, see for supported values. + ''; + }; + + user = mkOption { + type = types.str; + default = "navidrome"; + description = "User account under which Navidrome runs."; + }; + + group = mkOption { + type = types.str; + default = "navidrome"; + description = "Group account under which Navidrome runs."; + }; + + }; + }; + + config = mkIf cfg.enable { + + environment.etc."navidrome/settings.json".text = builtins.toJSON cfg.settings; + + services.navidrome.settings = { + DataFolder = dataFolder; + ConfigFile = configFile; + }; + + systemd.services.navidrome = { + description = "Navidrome Music Server and Streamer compatible with Subsonic/Airsonic"; + after = [ "remote-fs.target" "network.target" ]; + wantedBy = [ "multi-user.target" ]; + environment = { + ND_CONFIGFILE = configFile; + }; + serviceConfig = { + ExecStart = "${pkgs.navidrome}/bin/navidrome"; + WorkingDirectory = dataFolder; + TimeoutStopSec = "20"; + KillMode = "process"; + Restart = "on-failure"; + User = cfg.user; + Group = cfg.group; + DevicePolicy = "closed"; + NoNewPrivileges= " yes"; + PrivateTmp = "yes"; + PrivateUsers = "yes"; + ProtectControlGroups = "yes"; + ProtectKernelModules = "yes"; + ProtectKernelTunables = "yes"; + RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6"; + RestrictNamespaces = "yes"; + RestrictRealtime = "yes"; + SystemCallFilter = "~@clock @debug @module @mount @obsolete @privileged @reboot @setuid @swap"; + ReadWritePaths = dataFolder; + StateDirectory = baseNameOf dataFolder; + }; + }; + + users.users = optionalAttrs (cfg.user == "navidrome") ({ + navidrome = { + description = "Navidrome service user"; + name = cfg.user; + group = cfg.group; + isSystemUser = true; + }; + }); + + users.groups = optionalAttrs (cfg.group == "navidrome") ({ + navidrome = {}; + }); + + }; +} diff --git a/networking.nix b/networking.nix new file mode 100644 index 00000000..450103bb --- /dev/null +++ b/networking.nix @@ -0,0 +1,25 @@ +{ config, pkgs, ... }: +{ + networking.interfaces.enp2s0 = { + ipv4.addresses = [{ + address = "192.168.1.240"; + prefixLength = 24; + } ]; + ipv4.routes = [ { address = "192.168.1.0"; prefixLength = 24; via = "192.168.1.1"; }]; + useDHCP = false; + }; + #networking.nameservers = [ "172.16.11.240" ]; + networking.nameservers = [ "192.168.1.1" ]; + networking.defaultGateway = { + address = "192.168.1.1"; + interface = "enp2s0"; + }; + environment.systemPackages = [ pkgs.mosh ]; + programs.mosh.enable = true; + networking.wireless.networks = { + "TP-LINK_1D79" = { + psk = "welcomeyouare"; + }; + }; + #config.nssDatabase.hosts = [ "mdns_minimal" "[NOTFOUND=return]" ]; +} diff --git a/nextcloud.nix b/nextcloud.nix new file mode 100644 index 00000000..f378579f --- /dev/null +++ b/nextcloud.nix @@ -0,0 +1,55 @@ +{ pkgs, config, ... }: +{ + services.nextcloud = { + enable = true; + hostName = "mossnet.lan"; + home = "/data/nextcloud"; + package = pkgs.nextcloud21; + + # Use HTTPS for links + https = false; + + # Auto-update Nextcloud Apps + autoUpdateApps.enable = true; + # Set what time makes sense for you + autoUpdateApps.startAt = "05:00:00"; + + config = { + # Further forces Nextcloud to use HTTPS + # overwriteProtocol = "https"; + + # Nextcloud PostegreSQL database configuration, recommended over using SQLite + dbtype = "pgsql"; + dbuser = "nextcloud"; + dbhost = "/run/postgresql"; # nextcloud will add /.s.PGSQL.5432 by itself + dbname = "nextcloud"; + dbpassFile = "/var/nextcloud-db-pass"; + + adminpassFile = "/var/nextcloud-admin-pass"; + adminuser = "admin"; + }; + }; + + # Enable PostgreSQL + services.postgresql = { + enable = true; + + # Ensure the database, user, and permissions always exist + ensureDatabases = [ "nextcloud" ]; + ensureUsers = [ + { name = "nextcloud"; + ensurePermissions."DATABASE nextcloud" = "ALL PRIVILEGES"; + } + ]; + }; + + # Ensure that postgres is running before running the setup + systemd.services."nextcloud-setup" = { + requires = ["postgresql.service"]; + after = ["postgresql.service"]; + }; + + networking.firewall.allowedTCPPorts = [ 80 443 ]; + + #nixpkgs.config.permittedInsecurePackages = [ "nextcloud-19.0.6"]; +} diff --git a/nfs.nix b/nfs.nix new file mode 100644 index 00000000..ba9e9970 --- /dev/null +++ b/nfs.nix @@ -0,0 +1,32 @@ +{ + #fileSystems."/export/" = { + # device = "/mnt/mafuyu"; + # options = [ "bind" ]; + #}; + + services.nfs.server = { + enable = true; + # fixed rpc.statd port; for firewall + lockdPort = 4001; + mountdPort = 4002; + statdPort = 4000; + extraNfsdConfig = ''''; + exports = '' + /home/ftp 192.168.1.0/24(rw) + ''; + }; + + networking.firewall = { + allowedTCPPorts = [ 111 2049 4000 4001 4002 20048 ]; + allowedUDPPorts = [ 111 2049 4000 4001 4002 20048 ]; + }; + + #systemd.services.create-mount-dir = { + # serviceConfig = { + # ExecStart = "mkdir /export"; + # }; + # wantedBy = [ "multi-user.target" ]; + # after = [ "remote-fs.target" ]; + # description = "Create a directory we can mount on fs"; + #}; +} diff --git a/modules/nvim.nix b/nvim.nix similarity index 71% rename from modules/nvim.nix rename to nvim.nix index 6aef29a1..fc060a71 100644 --- a/modules/nvim.nix +++ b/nvim.nix @@ -1,63 +1,17 @@ { pkgs, ... }: -let - customPlugins = { - vim-zettel = pkgs.vimUtils.buildVimPlugin { - name = "vim-zettel"; - src = pkgs.fetchFromGitHub { - owner = "michal-h21"; - repo = "vim-zettel"; - rev = "929d90eec62e6f693c2702d2b6f76a93f2f1689d"; - sha256 = "1fzKmknfVlEYwqeXgbKITbb2/PJ023iJyMz6vak3qh4="; - }; - }; - vimwiki-dev = pkgs.vimUtils.buildVimPlugin { - name = "vimwiki-dev"; - src = pkgs.fetchFromGitHub { - owner = "vimwiki"; - repo = "vimwiki"; - rev = "d035a3428c6343b4f218e51340ddf690ad8c57ee"; - sha256 = "000000000000000000000000PJ023iJyMz6vak3qh4="; - }; - }; - taskwiki-t = pkgs.vimUtils.buildVimPluginFrom2Nix { - pname = "taskwiki"; - version = "2021-09-22"; - src = pkgs.fetchFromGitHub { - owner = "tools-life"; - repo = "taskwiki"; - rev = "c4392c36c01cfffcb06f460d722990b98bc53bdb"; - sha256 = "QrxFqu/Y6FykXGqIlK52+nDwmnBhubURl6v2Zc/KwPw="; - }; - meta.homepage = "https://github.com/tools-life/taskwiki/"; - }; - }; - my-python-packages = python-packages: with python-packages; [ - tasklib - pynvim - six - # other python packages you want - ]; - python-with-my-packages = pkgs.python3.withPackages my-python-packages; -in + #nvim { environment.variables.EDITOR = "nvim"; environment.shellAliases = { k = "vim -c :VimwikiIndex"; kz = "vim -c :VimwikiIndex -c :ZettelNew"; }; - environment.systemPackages = with pkgs // customPlugins; [ + environment.systemPackages = with pkgs; [ nodejs - python-with-my-packages - #python3Packages.pynvim - #python3Packages.six - #python3Packages.tasklib - #python3 ( neovim.override { vimAlias = true; - withPython3 = true; - extraPython3Packages = pkgs: with pkgs; [ tasklib six ]; configure = { packages.myPlugins = with pkgs.vimPlugins; { start = [ @@ -70,58 +24,57 @@ in vim-sneak lightline-vim csv-vim - vimwiki - coc-nvim + vimwiki + coc-nvim coc-json - coc-python - coc-pairs - coc-emmet - LanguageClient-neovim - ayu-vim - rainbow_parentheses-vim - vim-surround - vim-fugitive - #nvim-colorizer - vim-devicons - # testing - #vim-processing - #vim-tidal - taskwiki - vim-zettel - #vimwiki-sync - telescope-nvim - # Clojure stuff - conjure - vim-sexp - vim-sexp-mappings-for-regular-people + coc-python + coc-pairs + coc-emmet + emmet-vim + LanguageClient-neovim + ayu-vim + rainbow_parentheses-vim + vim-surround + vim-fugitive + #iron-nvim + #nvim-colorizer + vim-devicons + + # testing + #vim-processing + #vim-tidal + + #taskwiki + #vim-zettel + #vimwiki-sync ]; }; customRC = '' - set tabstop=2 - set showmatch - set shiftwidth=2 - set noexpandtab - set autoindent + set tabstop=2 + set showmatch + set shiftwidth=2 + set noexpandtab + set autoindent - set foldmethod=indent " fold based on indent - set number - set nocompatible - set relativenumber - set showtabline=2 - set autowriteall + set foldmethod=indent " fold based on indent + set number + set nocompatible + set relativenumber + set showtabline=2 + set autowriteall syntax on - set list lcs=tab:\|\ - filetype plugin on + set list lcs=tab:\|\ + filetype plugin on + + set termguicolors + let ayucolor="dark" + colorscheme ayu - set termguicolors - let ayucolor="dark" - colorscheme ayu - - " window - nmap wh :topleft vnew - nmap wl :botright vnew - nmap wk :topleft new - nmap wj :botright new + " window + nmap wh :topleft vnew + nmap wl :botright vnew + nmap wk :topleft new + nmap wj :botright new let mapleader = "\" @@ -154,9 +107,6 @@ in let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 - " Sexp in Conjure (since it's fennel) - " let g:sexp_filetypes = [ "fennel" ] - let g:rainbow_active = 0 autocmd BufReadPost,BufNewFile c,py,nix RainbowParenthesesToggleAll diff --git a/overlays/.git-keep b/overlays/.git-keep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/.git-keep b/packages/.git-keep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/adl.nix b/packages/adl.nix deleted file mode 100644 index 3d3cb525..00000000 --- a/packages/adl.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ lib, stdenv, fetchFromGitHub, my, ... }: - -stdenv.mkDerivation { - name = "adl"; - - src = fetchFromGitHub { - owner = "RaitaroH"; - repo = "adl"; - rev = "7752e36f92cd6d6f00d4a7eccdde9cf141abb06e"; - sha256 = "MmVPh8edSw/h+3uvYbYHQLX/66pY5Yk0v/OCL7RayBE="; - }; - - buildInputs = with my; [ - trackma - anime-downloader - ]; - - phases = "installPhase"; - installPhase = '' - mkdir -p $out/bin - cp $src/adl $out/bin/adl - cp ${my.trackma}/bin/trackma $out/bin/trackma - cp ${my.anime-downloader}/bin/anime $out/bin/anime - ''; - - meta = { - homepage = "https://github.com/RaitaroH/adl"; - description = "popcorn anime-downloader + trackma wrapper"; - license = lib.licenses.gpl3; - platforms = [ "x86_64-linux" ]; - maintainers = []; - }; -} diff --git a/packages/anime-downloader.nix b/packages/anime-downloader.nix deleted file mode 100644 index 1d640d2a..00000000 --- a/packages/anime-downloader.nix +++ /dev/null @@ -1,58 +0,0 @@ -{ lib, python3, nodejs, aria2, coloredlogs }: - -with python3.pkgs; -let - pySmartDL = buildPythonPackage rec { - pname = "pySmartDL"; - version = "1.3.4"; - src = fetchPypi { - inherit pname version; - sha256 = "NSddFpTzR00zvcqTsn02CCZf/UL1rrKOVvOLkGwMNfQ="; - }; - doCheck = false; - }; - cfscrape = buildPythonPackage rec { - pname = "cfscrape"; - version = "2.0.5"; - src = fetchPypi { - inherit pname version; - sha256 = "2VwWsGdxJ9+uPqUp82AdFHTK5+MlJ44dnYmipz7yH6k="; - }; - buildInputs = [ requests ]; - doCheck = false; - }; -in buildPythonApplication rec { - pname = "anime-downloader"; - version = "5.0.7"; - - src = fetchPypi { - inherit pname version; - sha256 = "BP4Wf2efU1RUk6I+82rFcvEdxDSKonTOIZjm3B0x7Eg="; - }; - - propagatedBuildInputs = [ - aria2 - nodejs - beautifulsoup4 - cfscrape - click - coloredlogs - fuzzywuzzy - pySmartDL - pycryptodome - requests - requests-cache - setuptools - tabulate - ]; - - doCheck = false; - - meta = { - homepage = "https://github.com/anime-dl/anime-downloader"; - description = "A simple but powerful anime downloader and streamer."; - license = lib.licenses.unlicense; - platforms = [ "x86_64-linux" ]; - maintainers = []; - }; -} diff --git a/packages/fennel.nix b/packages/fennel.nix deleted file mode 100644 index ac88e718..00000000 --- a/packages/fennel.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ lib, stdenv, luajit, my, ... }: - -let name = "fennel"; - version = "0.9.2"; -in stdenv.mkDerivation { - inherit name version; - - src = fetchTarball { - url = "https://fennel-lang.org/downloads/${name}-${version}.tar.gz"; - sha256 = "0p9zr2vb9gq877advb5jvybx6dmqzmxqh4i7yzdr7fwvz7xzd2jv"; - }; - - buildInputs = [ - luajit - ]; - - phases = "installPhase"; - installPhase = '' - mkdir -p $out $out/bin - cp $src/fennel $out/bin/fennel - cp $src/fennel.lua $out/fennel.lua - chmod +x $out/bin/fennel - sed -i 's%^#!/usr/bin/env lua$%#!${luajit}/bin/luajit%' $out/bin/fennel - ''; - - meta = { - homepage = "https://github.com/bakpakin/Fennel"; - description = "Lua Lisp Language"; - license = lib.licenses.mit; - platforms = [ "x86_64-linux" ]; - maintainers = []; - }; -} diff --git a/packages/trackma.nix b/packages/trackma.nix deleted file mode 100644 index f2f33bfe..00000000 --- a/packages/trackma.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ lib, python3 }: - -with python3.pkgs; -buildPythonApplication rec { - pname = "Trackma"; - version = "0.8.4"; - - src = fetchPypi { - inherit pname version; - sha256 = "9UHhxpbDcjW42JlefDHkTor1TdKmCQ1a1u0JS0Rt79k="; - }; - - # No tests included - doCheck = false; - pythonImportsCheck = [ "trackma" ]; - - meta = with lib; { - homepage = "https://github.com/z411/trackma"; - description = "Open multi-site list manager for Unix-like systems. (ex-wMAL)"; - license = licenses.gpl3; - platforms = [ "x86_64-linux" ]; - maintainers = []; - }; -} diff --git a/pkg-grasp.nix b/pkg-grasp.nix new file mode 100644 index 00000000..4beffb36 --- /dev/null +++ b/pkg-grasp.nix @@ -0,0 +1,22 @@ +{ python3, fetchFromGitHub, lib }: + +python3.pkgs.buildPythonApplication rec { + pname = "grasp"; + version = "0.6.6"; + + src = fetchFromGitHub { + owner = "karlicoss"; + repo = pname; + rev = "grasp-${version}"; + sha256 = "0000000000000000000000000000000000000000000000000000"; + }; + + meta = with lib; { + description = "grasp server"; + # License is complicated... + #license = licenses.agpl3; + homepage = "https://github.com/karlicoss/grasp"; + platforms = platforms.all; + maintainers = with stdenv.lib.maintainers; [ chickensoupwithrice ]; + }; +} diff --git a/pkg-navidrome.nix b/pkg-navidrome.nix new file mode 100644 index 00000000..5bcd3789 --- /dev/null +++ b/pkg-navidrome.nix @@ -0,0 +1,9 @@ +{ config, lib, pkgs, ... }: +{ + services.navidrome.enable = true; + services.navidrome.settings = { + MusicFolder = "/data/music"; + Port = 4433; + }; + networking.firewall.allowedTCPPorts = [ 4433 ]; +} diff --git a/pkg-wallabag.nix b/pkg-wallabag.nix new file mode 100644 index 00000000..e82c6c39 --- /dev/null +++ b/pkg-wallabag.nix @@ -0,0 +1,39 @@ +{ stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "wallabag"; + version = "2.4.0"; + + # remember to rm -r var/cache/* after a rebuild or unexpected errors will occur + + src = fetchurl { + url = "https://static.wallabag.org/releases/wallabag-release-${version}.tar.gz"; + sha256 = "11vda7aqq82kpr88v4hr7zg19zfq970n3z4qp25my8b1fvlgdjhi"; + }; + + outputs = [ "out" ]; + + patches = [ + ./wallabag-data.patch # exposes $WALLABAG_DATA + ]; + + dontBuild = true; + + installPhase = '' + mkdir $out/ + cp -R * $out/ + ''; + + meta = with stdenv.lib; { + description = "Web page archiver"; + longDescription = '' + wallabag is a self hostable application for saving web pages. + Point the environment variable $WALLABAG_DATA to a data directory that contains the folder `app/config` which must be a clone of wallabag's configuration files with your customized `parameters.yml`. These need to be updated every package upgrade. + After a package upgrade, empty the `var/cache` folder. + ''; + license = licenses.mit; + homepage = "http://wallabag.org"; + maintainers = with maintainers; [ schneefux ]; + platforms = platforms.all; + }; +} diff --git a/bin/rofi/networkmenu b/priv similarity index 100% rename from bin/rofi/networkmenu rename to priv diff --git a/result b/result deleted file mode 120000 index 1d33f7e0..00000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/wspdn6hk1104zpry75swll0qvs4jdyip-nixos-system-curve-21.11.20210724.dd14e5d \ No newline at end of file diff --git a/rss-bridge.nix b/rss-bridge.nix new file mode 100644 index 00000000..796dfd02 --- /dev/null +++ b/rss-bridge.nix @@ -0,0 +1,8 @@ +{pkgs, lib, config, ...}: +{ + services.rss-bridge = { + enable = true; + virtualHost = "rss.moss"; + whitelist = [ "Facebook" "Bandcamp" "Twitter" "Telegram"]; + }; +} diff --git a/shaarli.nix b/shaarli.nix new file mode 100644 index 00000000..56a9055a --- /dev/null +++ b/shaarli.nix @@ -0,0 +1,114 @@ +{ pkgs, config, ... }: +let + dataDir = "/var/www/shaarli-config"; + name = "shaarli"; +in +{ + services.nginx = { + enable = true; + virtualHosts = { + "links.mossnet.lan" = { + forceSSL = false; + enableACME = false; + root = "${dataDir}"; + extraConfig = '' + index index.php; + ''; + locations = { + "/".extraConfig = '' + try_files $uri $uri/ index.php$is_args$args; + ''; + + "~ (index)\\.php$".extraConfig = '' + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + + fastcgi_pass unix:${config.services.phpfpm.pools."${name}".socket}; + fastcgi_index index.php; + + fastcgi_param QUERY_STRING $query_string; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param SCRIPT_NAME $fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; + fastcgi_param REQUEST_URI $request_uri; + fastcgi_param DOCUMENT_URI $document_uri; + fastcgi_param DOCUMENT_ROOT $document_root; + fastcgi_param SERVER_PROTOCOL $server_protocol; + + fastcgi_param GATEWAY_INTERFACE CGI/1.1; + fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + + fastcgi_param REMOTE_ADDR $remote_addr; + fastcgi_param REMOTE_PORT $remote_port; + fastcgi_param SERVER_ADDR $server_addr; + fastcgi_param SERVER_PORT $server_port; + fastcgi_param SERVER_NAME $server_name; + ''; + + "~ \\.php$".extraConfig = '' + deny all; + ''; + + "^~ /tpl/".extraConfig = "alias ${pkgs.shaarli}/tpl/;"; + + "^~ /plugins/".extraConfig = "alias ${pkgs.shaarli}/plugins/;"; + + "~* \\.(?:ico|css|js|gif|jpe?g|png)$".extraConfig = '' + expires max; + add_header Pragma public; + add_header Cache-Control "public, must-revalidate, proxy-revalidate"; + ''; + }; + }; + }; + }; + + services.phpfpm = { + pools = { + "${name}" = { + user = "nginx"; + group = "nginx"; + #listen = "/run/phpfpm/php.sock"; + settings = { + "listen.owner" = "nginx"; + "listen.group" = "nginx"; + "user" = "nginx"; + "pm" = "dynamic"; + "pm.max_children" = "4"; + "pm.min_spare_servers" = "1"; + "pm.max_spare_servers" = "4"; + "pm.max_requests" = "32"; + "catch_workers_output" = "1"; + "php_admin_value[error_log]" = "/var/log/nginx/${name}-phpfpm-error.log"; + }; + }; + }; + }; + users.extraUsers."${name}" = { group = "${name}"; }; + users.extraGroups."${name}" = { }; + users.users.shaarli.isSystemUser = true; + systemd.services.shaarli-install = { + serviceConfig.Type = "oneshot"; + wantedBy = [ "multi-user.target" ]; + script = '' + if [ ! -d "${dataDir}" ]; then + #cp -R ${pkgs.shaarli}/data.orig/.htaccess ${dataDir}/cache/ + #cp -R ${pkgs.shaarli}/data.orig/.htaccess ${dataDir}/data/ + #cp -R ${pkgs.shaarli}/data.orig/.htaccess ${dataDir}/pagecache/ + #cp -R ${pkgs.shaarli}/data.orig/.htaccess ${dataDir}/tmp/ + mkdir -p ${dataDir}/{cache,data,pagecache,tmp} + ln -s ${pkgs.shaarli}/* ${dataDir} + fi + chown -Rc nginx:nginx ${dataDir} + find ${dataDir} -type d ! -perm 0700 -exec chmod 0700 {} \; -exec chmod g-s {} \; + find ${dataDir} -type f ! -perm 0600 -exec chmod 0600 {} \; + ''; + }; + # TODO: Write the configuration file here? + #networking.firewall.allowedTCPPorts = [ 80 ]; +} diff --git a/shell.nix b/shell.nix deleted file mode 100644 index db3ad17e..00000000 --- a/shell.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ pkgs ? import {} }: - -with pkgs; -let nixBin = - writeShellScriptBin "nix" '' - ${nixFlakes}/bin/nix --option experimental-features "nix-command flakes" "$@" - ''; -in mkShell { - buildInputs = [ - git - nix-zsh-completions - ]; - shellHook = '' - export FLAKE="$(pwd)" - export PATH="$FLAKE/bin:${nixBin}/bin:$PATH" - ''; -} diff --git a/taskd.nix b/taskd.nix new file mode 100644 index 00000000..64a914f6 --- /dev/null +++ b/taskd.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + services.taskserver.enable = true; + services.taskserver.fqdn = "task.moss"; + services.taskserver.listenHost = "0.0.0.0"; + services.taskserver.listenPort = 53589; + services.taskserver.organisations.mossnet.users = [ "anish" ]; +} diff --git a/templates/minimal/flake.nix b/templates/minimal/flake.nix deleted file mode 100644 index 51128489..00000000 --- a/templates/minimal/flake.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - description = "A grossly incandescent nixos config."; - - inputs = { - dotfiles.url = "github:hlissner/dotfiles"; - }; - - outputs = inputs @ { dotfiles, ... }: { - nixosConfigurations = dotfiles.lib.mapHosts ./hosts { - imports = [ - # If this is a linode machine - # "${dotfiles}/hosts/linode.nix" - ]; - }; - }; -} diff --git a/templates/minimal/hosts/.git-keep b/templates/minimal/hosts/.git-keep deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/minimal/hosts/main/default.nix b/templates/minimal/hosts/main/default.nix deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/minimal/hosts/main/hardware-configuration.nix b/templates/minimal/hosts/main/hardware-configuration.nix deleted file mode 100644 index e69de29b..00000000 diff --git a/unstable.nix b/unstable.nix new file mode 100644 index 00000000..983a4ed8 --- /dev/null +++ b/unstable.nix @@ -0,0 +1,13 @@ +{ config, pkgs, ... }: + + +let + unstable = import {}; +in { + nix.nixPath = [ + "nixos-unstable=https://nixos.org/channels/nixos-unstable/nixexprs.tar.xz" + ]; + + #currently installed this software through nix-env -f https://nixos.org/channels/nixos-unstable -iA [ packages ] + environment.systemPackages = [ unstable.ripcord ]; +} diff --git a/wallabag-data.patch b/wallabag-data.patch new file mode 100644 index 00000000..243569b4 --- /dev/null +++ b/wallabag-data.patch @@ -0,0 +1,31 @@ +diff --git a/app/AppKernel.php b/app/AppKernel.php +index 347197e..902b558 100644 +--- a/app/AppKernel.php ++++ b/app/AppKernel.php +@@ -69,19 +69,24 @@ class AppKernel extends Kernel + return __DIR__; + } + ++ public function getProjectDir() ++ { ++ return getenv('WALLABAG_DATA') ?: dirname(__DIR__); ++ } ++ + public function getCacheDir() + { +- return dirname(__DIR__) . '/var/cache/' . $this->getEnvironment(); ++ return $this->getProjectDir() . '/var/cache/' . $this->getEnvironment(); + } + + public function getLogDir() + { +- return dirname(__DIR__) . '/var/logs'; ++ return $this->getProjectDir() . '/var/logs'; + } + + public function registerContainerConfiguration(LoaderInterface $loader) + { +- $loader->load($this->getRootDir() . '/config/config_' . $this->getEnvironment() . '.yml'); ++ $loader->load($this->getProjectDir() . '/app/config/config_' . $this->getEnvironment() . '.yml'); + + $loader->load(function ($container) { diff --git a/wallabag.nix b/wallabag.nix new file mode 100644 index 00000000..6adfca0d --- /dev/null +++ b/wallabag.nix @@ -0,0 +1,98 @@ +{ pkgs, config, lib, ... }: + +{ + services.postgresql = { + enable = true; + + # Ensure the database, user, and permissions always exist + ensureDatabases = [ "wallabag" ]; + ensureUsers = [ + { name = "wallabag"; + ensurePermissions."DATABASE wallabag" = "ALL PRIVILEGES"; + } + ]; + }; + + services.wallabag = { + enable = true; + hostName = "read.mossnet.lan"; + package = pkgs.callPackage ./pkg-wallabag.nix {}; + conf = '' +# This file is a "template" of what your parameters.yml file should look like +parameters: + # Uncomment these settings or manually update your parameters.yml + # to use docker-compose + # + # database_driver: %env.database_driver% + # database_host: %env.database_host% + # database_port: %env.database_port% + # database_name: %env.database_name% + # database_user: %env.database_user% + # database_password: %env.database_password% + + database_driver: pdo_pgsql + database_host: localhost + database_port: ~ + database_name: wallabag + database_user: wallabag + database_password: wallabag + # For SQLite, database_path should be "%kernel.project_dir%/data/db/wallabag.sqlite" + database_path: ~ + database_table_prefix: wallabag_ + database_socket: null + # with PostgreSQL and SQLite, you must set "utf8" + database_charset: utf8 + + domain_name: http://read.mossnet.lan + server_name: "mossnet wallabag instance" + + mailer_transport: smtp + mailer_user: ~ + mailer_password: ~ + mailer_host: 127.0.0.1 + mailer_port: false + mailer_encryption: ~ + mailer_auth_mode: ~ + + locale: en + + # A secret key that's used to generate certain security-related tokens + secret: SAFGOECRIlfal89oe6u0(*^dsaaih961 + + # two factor stuff + twofactor_auth: true + twofactor_sender: no-reply@wallabag.org + + # fosuser stuff + fosuser_registration: true + fosuser_confirmation: true + + # how long the access token should live in seconds for the API + fos_oauth_server_access_token_lifetime: 3600 + # how long the refresh token should life in seconds for the API + fos_oauth_server_refresh_token_lifetime: 1209600 + + from_email: no-reply@wallabag.org + + rss_limit: 50 + + # RabbitMQ processing + rabbitmq_host: localhost + rabbitmq_port: 5672 + rabbitmq_user: guest + rabbitmq_password: guest + rabbitmq_prefetch_count: 10 + + # Redis processing + redis_scheme: tcp + redis_host: localhost + redis_port: 6379 + redis_path: null + redis_password: null + + # sentry logging + sentry_dsn: ~ +''; + }; + # networking.firewall.allowedTCPPorts = [ 8080 ]; +} diff --git a/wireguard.nix b/wireguard.nix new file mode 100644 index 00000000..55e179aa --- /dev/null +++ b/wireguard.nix @@ -0,0 +1,61 @@ +{ config, pkgs, lib, ... }: + +{ + services.tailscale.enable = true; + networking.firewall.allowedUDPPorts = [ 60990 ]; + + # Enable WireGuard + networking.wireguard.interfaces = { + # "wg0" is the network interface name. You can name the interface arbitrarily. + wg0 = { + # Determines the IP address and subnet of the client's end of the tunnel interface. + ips = [ "10.0.69.4/24" ]; + listenPort = 60990; # to match firewall allowedUDPPorts (without this wg uses random port numbers) + + # Path to the private key file. + # + # Note: The private key can also be included inline via the privateKey option, + # but this makes the private key world-readable; thus, using privateKeyFile is + # recommended. + privateKeyFile = "/home/anish/wg/privkey"; + + peers = [ + # For a client configuration, one peer entry for the server will suffice. + { + # Public key of the server (not a file path). + publicKey = "c1J4p63rD3IlszugMZiki7UBV3YmDdqa3DU4UejXzAI="; + + # Forward all the traffic via VPN. + allowedIPs = [ "10.0.69.0/24" ]; + # Or forward only particular subnets + #allowedIPs = [ "10.100.0.1" "91.108.12.0/22" ]; + + # Set this to the server IP and port. + endpoint = "sealight.xyz:60990"; # ToDo: route to endpoint not automatically configured https://wiki.archlinux.org/index.php/WireGuard#Loop_routing https://discourse.nixos.org/t/solved-minimal-firewall-setup-for-wireguard-client/7577 + + # Send keepalives every 25 seconds. Important to keep NAT tables alive. + persistentKeepalive = 25; + } + ]; + }; + }; + +# boot.extraModulePackages = with config.boot.kernelPackages; [ wireguard ]; +# environment.systemPackages = [ pkgs.wireguard ]; +# networking.wireguard.enable = true; +# networking.wireguard.interfaces = { +# wg0 = { +# ips = [ "10.0.69.4/32" ]; +# privateKeyFile = "/home/anish/wg/privkey"; +# listenPort = 60990; +# +# peers = [ +# { # helix - server +# publicKey = "{c1J4p63rD3IlszugMZiki7UBV3YmDdqa3DU4UejXzAI=}"; +# allowedIPs = [ "10.0.69.1/24" ]; +# endpoint = "sealight.xyz:60990"; +# persistentKeepalive = 25; +# } ]; +# }; +# }; +}