From a00ce7d81a8f9b6c613057137679c83efee7f8b8 Mon Sep 17 00:00:00 2001 From: Joey Hafner Date: Mon, 14 Oct 2024 14:14:31 -0700 Subject: [PATCH] Init comfortable hyprland configuration --- nix/home-manager/wm/hyprland/hyprland.nix | 122 +++++++ nix/home-manager/wm/hyprland/waybar-ml4w.css | 355 +++++++++++++++++++ nix/home-manager/wm/hyprland/waybar.css | 355 +++++++++++++++++++ nix/home-manager/wm/hyprland/waybar.nix | 150 ++++++++ nix/home-manager/wm/hyprland/wm.nix | 18 + nix/home-manager/wm/hyprland/wofi.nix | 11 + 6 files changed, 1011 insertions(+) create mode 100644 nix/home-manager/wm/hyprland/hyprland.nix create mode 100644 nix/home-manager/wm/hyprland/waybar-ml4w.css create mode 100644 nix/home-manager/wm/hyprland/waybar.css create mode 100644 nix/home-manager/wm/hyprland/waybar.nix create mode 100644 nix/home-manager/wm/hyprland/wm.nix create mode 100644 nix/home-manager/wm/hyprland/wofi.nix diff --git a/nix/home-manager/wm/hyprland/hyprland.nix b/nix/home-manager/wm/hyprland/hyprland.nix new file mode 100644 index 00000000..95bf99dd --- /dev/null +++ b/nix/home-manager/wm/hyprland/hyprland.nix @@ -0,0 +1,122 @@ +{ pkgs, ... }: +{ + + wayland.windowManager.hyprland = { + enable = true; + plugins = []; + settings = { + monitor = ",1920x1080@60,0x0,1"; + + "$terminal" = "kitty"; + "$fileManager" = "dolphin"; + "$bar" = "killall .waybar-wrapped; waybar --style ~/.config/waybar/waybar.css"; + "$menu" = "wofi --show drun"; + "$notifd" = "mako"; + "$wallpaperd" = "swww-daemon"; + + exec-once = [ + "$terminal" + "$bar" + "$notifd" + "$wallpaperd" + ]; + + env = [ + "XCURSOR_SIZE,24" + "HYPRCURSOR_SIZE,24" + ]; + + general = { + gaps_in = "5"; + gaps_out = "20"; + border_size = "2"; + allow_tearing = false; + resize_on_border = false; + layout = "dwindle"; + }; + + decoration = { + rounding = "10"; + active_opacity = "1.0"; + inactive_opacity = "0.9"; + drop_shadow = true; + shadow_range = "4"; + shadow_render_power = "3"; + blur = { + enabled = true; + size = "3"; + passes = "1"; + vibrancy = "0.1696"; + }; + }; + + animations = { + enabled = true; + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + }; + + master = { + new_status = "master"; + }; + + misc = { + force_default_wallpaper = "0"; + disable_hyprland_logo = true; + }; + + input = { + kb_layout = "us"; + follow_mouse = "1"; + sensitivity = "0"; + touchpad = { + natural_scroll = false; + }; + }; + + gestures = { + workspace_swipe = false; + }; + + device = { + name = "epic-mouse-v1"; + sensitivity = "-0.5"; + }; + + "$mainMod" = "SUPER"; + bind = [ + "$mainMod, T, exec, $terminal" + "$mainMod, Q, killactive," + "$mainMod, M, exit," + "$mainMod, E, exec, $fileManager" + "$mainMod, V, togglefloating," + "$mainMod, R, exec, $menu" + "$mainMod, P, pseudo," + "$mainMod, J, togglesplit," + "$mainMod, left, movefocus, l" + "$mainMod, right, movefocus, r" + "$mainMod, up, movefocus, u" + "$mainMod, down, movefocus, d" + "$mainMod CTRL, right, workspace, +1" + "$mainMod CTRL, left, workspace, -1" + "$mainMod CTRL SHIFT, right, movetoworkspace, +1" + "$mainMod CTRL SHIFT, left, movetoworkspace, -1" + "$mainMod CTRL, B, exec, $bar" + ]; + + windowrulev2 = "suppressevent maximize, class:.*"; + }; + }; +} diff --git a/nix/home-manager/wm/hyprland/waybar-ml4w.css b/nix/home-manager/wm/hyprland/waybar-ml4w.css new file mode 100644 index 00000000..b83cb75f --- /dev/null +++ b/nix/home-manager/wm/hyprland/waybar-ml4w.css @@ -0,0 +1,355 @@ +/* + * __ __ _ ____ _ _ + * \ \ / /_ _ _ _| |__ __ _ _ __ / ___|| |_ _ _| | ___ + * \ \ /\ / / _` | | | | '_ \ / _` | '__| \___ \| __| | | | |/ _ \ + * \ V V / (_| | |_| | |_) | (_| | | ___) | |_| |_| | | __/ + * \_/\_/ \__,_|\__, |_.__/ \__,_|_| |____/ \__|\__, |_|\___| + * |___/ |___/ + * + * by Stephan Raabe (2024) + * ----------------------------------------------------- +*/ + +@define-color backgroundlight #FFFFFF; +@define-color backgrounddark #FFFFFF; +@define-color workspacesbackground1 #FFFFFF; +@define-color workspacesbackground2 #CCCCCC; +@define-color bordercolor #FFFFFF; +@define-color textcolor1 #000000; +@define-color textcolor2 #000000; +@define-color textcolor3 #FFFFFF; +@define-color iconcolor #FFFFFF; + +/* ----------------------------------------------------- + * General + * ----------------------------------------------------- */ + +* { + font-family: "Fira Sans Semibold", FontAwesome, Roboto, Helvetica, Arial, sans-serif; + border: none; + border-radius: 0px; +} + +window#waybar { + background-color: rgba(0,0,0,0.2); + border-bottom: 0px solid #ffffff; + /* color: #FFFFFF; */ + transition-property: background-color; + transition-duration: .5s; +} + +/* ----------------------------------------------------- + * Workspaces + * ----------------------------------------------------- */ + +#workspaces { + margin: 5px 1px 6px 1px; + padding: 0px 1px; + border-radius: 15px; + border: 0px; + font-weight: bold; + font-style: normal; + font-size: 16px; + color: @textcolor1; +} + +#workspaces button { + padding: 0px 5px; + margin: 4px 3px; + border-radius: 15px; + border: 0px; + color: @textcolor3; + transition: all 0.3s ease-in-out; +} + +#workspaces button.active { + color: @textcolor1; + background: @workspacesbackground2; + border-radius: 15px; + min-width: 40px; + transition: all 0.3s ease-in-out; +} + +#workspaces button:hover { + color: @textcolor1; + background: @workspacesbackground2; + border-radius: 15px; +} + +/* ----------------------------------------------------- + * Tooltips + * ----------------------------------------------------- */ + +tooltip { + border-radius: 10px; + background-color: @backgroundlight; + opacity:0.8; + padding:20px; + margin:0px; +} + +tooltip label { + color: @textcolor2; +} + +/* ----------------------------------------------------- + * Window + * ----------------------------------------------------- */ + +#window { + background: @backgroundlight; + margin: 10px 15px 10px 0px; + padding: 2px 10px 0px 10px; + border-radius: 12px; + color:@textcolor2; + font-size:16px; + font-weight:normal; +} + +window#waybar.empty #window { + background-color:transparent; +} + +/* ----------------------------------------------------- + * Taskbar + * ----------------------------------------------------- */ + +#taskbar { + background: @backgroundlight; + margin: 6px 15px 6px 0px; + padding:0px; + border-radius: 15px; + font-weight: normal; + font-style: normal; + border: 3px solid @backgroundlight; +} + +#taskbar button { + margin:0; + border-radius: 15px; + padding: 0px 5px 0px 5px; +} + +/* ----------------------------------------------------- + * Modules + * ----------------------------------------------------- */ + +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} + +.modules-right > widget:last-child > #workspaces { + margin-right: 0; +} + +/* ----------------------------------------------------- + * Custom Quicklinks + * ----------------------------------------------------- */ + +#custom-browser, +#custom-filemanager, +#network, +#pulseaudio, +#battery, +#custom-appmenu, +#clock { + margin-right: 20px; + font-size: 20px; + font-weight: bold; + color: @iconcolor; + padding: 4px 10px 2px 10px; + font-size: 16px; +} + +#custom-quicklink1, +#custom-quicklink2, +#custom-quicklink3, +#custom-quicklink4, +#custom-quicklink5, +#custom-quicklink6, +#custom-quicklink7, +#custom-quicklink8, +#custom-quicklink9, +#custom-quicklink10 { + padding:0px; + margin-right: 7px; + font-size:20px; + color: @iconcolor; +} + +/* ----------------------------------------------------- + * Custom Modules + * ----------------------------------------------------- */ + +#custom-appmenu { + background-color: @backgrounddark; + color: @textcolor1; + border-radius: 15px; + margin: 10px 10px 10px 10px; +} + +/* ----------------------------------------------------- + * Custom Exit + * ----------------------------------------------------- */ + +#custom-exit { + margin: 2px 20px 0px 0px; + padding:0px; + font-size:20px; + color: @iconcolor; +} + +/* ----------------------------------------------------- + * Hardware Group + * ----------------------------------------------------- */ + + #disk,#memory,#cpu,#language { + margin:0px; + padding:0px; + font-size:16px; + color:@iconcolor; +} + +#language { + margin-right:10px; +} + +/* ----------------------------------------------------- + * Clock + * ----------------------------------------------------- */ + +#clock { + background-color: @backgrounddark; + font-size: 16px; + color: @textcolor1; + border-radius: 15px; + margin: 10px 7px 10px 0px; +} + +/* ----------------------------------------------------- + * Pulseaudio + * ----------------------------------------------------- */ + +#pulseaudio { + background-color: @backgroundlight; + font-size: 16px; + color: @textcolor2; + border-radius: 15px; + margin: 10px 10px 10px 0px; +} + +#pulseaudio.muted { + background-color: @backgrounddark; + color: @textcolor1; +} + +/* ----------------------------------------------------- + * Network + * ----------------------------------------------------- */ + +#network { + background-color: @backgroundlight; + font-size: 16px; + color: @textcolor2; + border-radius: 15px; + margin: 10px 10px 10px 0px; +} + +#network.ethernet { + background-color: @backgroundlight; + color: @textcolor2; +} + +#network.wifi { + background-color: @backgroundlight; + color: @textcolor2; +} + +/* ----------------------------------------------------- + * Bluetooth + * ----------------------------------------------------- */ + + #bluetooth, #bluetooth.on, #bluetooth.connected { + background-color: @backgroundlight; + font-size: 16px; + color: @textcolor2; + border-radius: 15px; + margin: 10px 15px 10px 0px; +} + +#bluetooth.off { + background-color: transparent; + padding: 0px; + margin: 0px; +} + +/* ----------------------------------------------------- + * Battery + * ----------------------------------------------------- */ + +#battery { + background-color: @backgroundlight; + font-size: 16px; + color: @textcolor2; + border-radius: 15px; + margin: 10px 15px 10px 0px; +} + +#battery.charging, #battery.plugged { + color: @textcolor2; + background-color: @backgroundlight; +} + +@keyframes blink { + to { + background-color: @backgroundlight; + color: @textcolor2; + } +} + +#battery.critical:not(.charging) { + background-color: #f53c3c; + color: @textcolor3; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +/* ----------------------------------------------------- + * Tray + * ----------------------------------------------------- */ + +#tray { + margin:0px 10px 0px 0px; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; +} + +/* ----------------------------------------------------- + * Other + * ----------------------------------------------------- */ + +label:focus { + background-color: #000000; +} + +#backlight { + background-color: #90b1b1; +} + +#network { + background-color: #2980b9; +} + +#network.disconnected { + background-color: #f53c3c; +} diff --git a/nix/home-manager/wm/hyprland/waybar.css b/nix/home-manager/wm/hyprland/waybar.css new file mode 100644 index 00000000..76ef425b --- /dev/null +++ b/nix/home-manager/wm/hyprland/waybar.css @@ -0,0 +1,355 @@ +@import "style.css"; + +waybar#window { + background-color: @base0B; +} + +@define-color base00 #111349; +@define-color base01 #332330; +@define-color base02 #156eb2; +@define-color base03 #66a3da; +@define-color base04 #95bede; +@define-color base05 #e2e1ef; +@define-color base06 #e0e3f4; +@define-color base07 #cce8f6; +@define-color base08 #5196d1; +@define-color base09 #5196cf; +@define-color base0A #5796cc; +@define-color base0B #5595d3; +@define-color base0C #5896c9; +@define-color base0D #5795d0; +@define-color base0E #4f96d8; +@define-color base0F #5894d3; + +* { + font-family: "DejaVu Sans"; + font-size: 12pt; +} + +window#waybar, tooltip { + background: alpha(@base00, 1.000000); + color: @base05; +} + +tooltip { + border-color: @base0D; +} +#wireplumber, +#pulseaudio, +#sndio { + padding: 0 5px; +} +#wireplumber.muted, +#pulseaudio.muted, +#sndio.muted { + padding: 0 5px; +} +#upower, +#battery { + padding: 0 5px; +} +#upower.charging, +#battery.Charging { + padding: 0 5px; +} +#network { + padding: 0 5px; +} +#network.disconnected { + padding: 0 5px; +} +#user { + padding: 0 5px; +} +#clock { + padding: 0 5px; +} +#backlight { + padding: 0 5px; +} +#cpu { + padding: 0 5px; +} +#disk { + padding: 0 5px; +} +#idle_inhibitor { + padding: 0 5px; +} +#temperature { + padding: 0 5px; +} +#mpd { + padding: 0 5px; +} +#language { + padding: 0 5px; +} +#keyboard-state { + padding: 0 5px; +} +#memory { + padding: 0 5px; +} +#window { + padding: 0 5px; +} +window .modules-left #workspaces button { + background-color: @base07; + color: @base00; +} +.modules-left #wireplumber, +.modules-left #pulseaudio, +.modules-left #sndio { + background-color: @base09; + color: @base00; +} +.modules-left #workspaces button.focused, +.modules-left #workspaces button.active { + background: @base03; +} +.modules-left #workspaces button.urgent { + background-color: @base08; +} +.modules-left #wireplumber.muted, +.modules-left #pulseaudio.muted, +.modules-left #sndio.muted { + background-color: @base0C; +} +.modules-left #upower, +.modules-left #battery { + background-color: @base0D; + color: @base00; +} +.modules-left #upower.charging, +.modules-left #battery.Charging { + background-color: @base0E; +} +.modules-left #network { + background-color: @base0B; + color: @base00; +} +.modules-left #network.disconnected { + background-color: @base0C; +} +.modules-left #user { + background-color: @base0F; + color: @base00; +} +.modules-left #clock { + background-color: @base03; + color: @base00; +} +.modules-left #backlight { + background-color: @base0E; + color: @base00; +} +.modules-left #cpu { + background-color: @base0B; + color: @base00; +} +.modules-left #disk { + background-color: @base02; + color: @base00; +} +.modules-left #idle_inhibitor { + background-color: @base06; + color: @base00; +} +.modules-left #temperature { + background-color: @base07; + color: @base00; +} +.modules-left #mpd { + background-color: @base02; + color: @base00; +} +.modules-left #language { + background-color: @base02; + color: @base00; +} +.modules-left #keyboard-state { + background-color: @base03; + color: @base00; +} +.modules-left #memory { + background-color: @base09; + color: @base00; +} +.modules-left #window { + background-color: @base0C; + color: @base00; +} +window .modules-center #workspaces button { + background-color: @base07; + color: @base00; +} +.modules-center #wireplumber, +.modules-center #pulseaudio, +.modules-center #sndio { + background-color: @base09; + color: @base00; +} +.modules-center #workspaces button.focused, +.modules-center #workspaces button.active { + background: @base03; +} +.modules-center #workspaces button.urgent { + background-color: @base08; +} +.modules-center #wireplumber.muted, +.modules-center #pulseaudio.muted, +.modules-center #sndio.muted { + background-color: @base0C; +} +.modules-center #upower, +.modules-center #battery { + background-color: @base0D; + color: @base00; +} +.modules-center #upower.charging, +.modules-center #battery.Charging { + background-color: @base0E; +} +.modules-center #network { + background-color: @base0B; + color: @base00; +} +.modules-center #network.disconnected { + background-color: @base0C; +} +.modules-center #user { + background-color: @base0F; + color: @base00; +} +.modules-center #clock { + background-color: @base03; + color: @base00; +} +.modules-center #backlight { + background-color: @base0E; + color: @base00; +} +.modules-center #cpu { + background-color: @base0B; + color: @base00; +} +.modules-center #disk { + background-color: @base02; + color: @base00; +} +.modules-center #idle_inhibitor { + background-color: @base06; + color: @base00; +} +.modules-center #temperature { + background-color: @base07; + color: @base00; +} +.modules-center #mpd { + background-color: @base02; + color: @base00; +} +.modules-center #language { + background-color: @base02; + color: @base00; +} +.modules-center #keyboard-state { + background-color: @base03; + color: @base00; +} +.modules-center #memory { + background-color: @base09; + color: @base00; +} +.modules-center #window { + background-color: @base0C; + color: @base00; +} +window .modules-right #workspaces button { + background-color: @base07; + color: @base00; +} +.modules-right #wireplumber, +.modules-right #pulseaudio, +.modules-right #sndio { + background-color: @base09; + color: @base00; +} +.modules-right #workspaces button.focused, +.modules-right #workspaces button.active { + background: @base03; +} +.modules-right #workspaces button.urgent { + background-color: @base08; +} +.modules-right #wireplumber.muted, +.modules-right #pulseaudio.muted, +.modules-right #sndio.muted { + background-color: @base0C; +} +.modules-right #upower, +.modules-right #battery { + background-color: @base0D; + color: @base00; +} +.modules-right #upower.charging, +.modules-right #battery.Charging { + background-color: @base0E; +} +.modules-right #network { + background-color: @base0B; + color: @base00; +} +.modules-right #network.disconnected { + background-color: @base0C; +} +.modules-right #user { + background-color: @base0F; + color: @base00; +} +.modules-right #clock { + background-color: @base03; + color: @base00; +} +.modules-right #backlight { + background-color: @base0E; + color: @base00; +} +.modules-right #cpu { + background-color: @base0B; + color: @base00; +} +.modules-right #disk { + background-color: @base02; + color: @base00; +} +.modules-right #idle_inhibitor { + background-color: @base06; + color: @base00; +} +.modules-right #temperature { + background-color: @base07; + color: @base00; +} +.modules-right #mpd { + background-color: @base02; + color: @base00; +} +.modules-right #language { + background-color: @base02; + color: @base00; +} +.modules-right #keyboard-state { + background-color: @base03; + color: @base00; +} +.modules-right #memory { + background-color: @base09; + color: @base00; +} +.modules-right #window { + background-color: @base0C; + color: @base00; +} + diff --git a/nix/home-manager/wm/hyprland/waybar.nix b/nix/home-manager/wm/hyprland/waybar.nix new file mode 100644 index 00000000..0ee891b4 --- /dev/null +++ b/nix/home-manager/wm/hyprland/waybar.nix @@ -0,0 +1,150 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ waybar ]; + programs.waybar = { + enable = true; + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 30; + spacing = 30; + margin-left = 40; + margin-right = 40; + modules-left = [ "custom/appmenu" "wlr/taskbar" "hyprland/window" "tray" ]; + modules-center = [ "hyprland/workspaces" ]; + modules-right = [ + "pulseaudio" + "network" + "battery" + "clock" + "custom/power" + ]; + "hyprland/workspaces" = { + active-only = false; + on-click = "activate"; + format = "{}"; + format-icons = { + urgent = ""; + active = ""; + default = ""; + }; + persistent-workspaces = { + "*" = 3; + }; + }; + "wlr/taskbar" = { + format = "{icon}"; + icon-size = 18; + tooltip-format = "{title}"; + on-click = "activate"; + on-click-middle = "close"; + ignore-list = [ + "kitty" + ]; + app_ids-mapping = {}; + rewrite = {}; + }; + "hyprland/window" = { + rewrite = {}; + separate-outputs = true; + }; + "custom/appmenu" = { + format = " "; + on-click = "wofi --show drun"; + }; + "custom/exit" = { + format = " "; + on-click = "wlogout"; + tooltip-format = "Power Menu"; + }; + keyboard-state = { + numlock = true; + capslock = true; + format = "{name} {icon}"; + format-icons = { + locked = " "; + unlocked = " "; + }; + }; + tray = { + icon-size = 21; + spacing = 10; + }; + clock = { + tooltip-format = "{:%Y %B}\n{calendar}"; + format-alt = ''{:%Y-%m-%d}''; + }; + battery = { + states = { + warning = 30; + critical = 15; + }; + format = ''{capacity}% {icon}''; + format-full = ''{capacity}% {icon}''; + format-charging = ''{capacity}%  ''; + format-plugged = ''{capacity}%  ''; + format-alt = ''{time} {icon}''; + format-icons = [ " " " " " " " " " " ]; + }; + power-profiles-daemon = { + format = ''{icon}''; + tooltip-format = "Power profile: {profile}\nDriver: {driver}"; + tooltip = true; + format-icons = { + default = '' ''; + performance = '' ''; + balanced = '' ''; + power-saver = '' ''; + }; + }; + network = { + format-wifi = ''{essid} ({signalStrength}%)  ''; + format-ethernet = ''{ipaddr}/{cidr}  ''; + tooltip-format = ''{ifname} via {gwaddr}  ''; + format-linked = ''{ifname} (No IP)  ''; + format-disconnected = ''Disconnected ⚠ ''; + format-alt = ''{ifname}: {ipaddr}/{cidr}''; + }; + pulseaudio = { + format = ''{volume}% {icon} {format_source}''; + format-bluetooth = ''{volume}% {icon} {format_source}''; + format-bluetooth-muted = ''{icon} {format_source}''; + format-muted = '' {format_source}''; + format-source = ''{volume}% ''; + format-source-muted = '' ''; + format-icons = { + headphone = '' ''; + hands-free = '' ''; + headset = '' ''; + phone = '' ''; + portable = '' ''; + car = '' ''; + default = [ "" " " " " ]; + }; + on-click = ''pavucontrol''; + }; + "custom/power" = { + format = ''⏻ ''; + tooltip = false; + menu = "on-click"; + menu-file = ''$HOME/.config/waybar/power_menu.xml''; + menu-actions = { + shutdown = "shutdown"; + reboot = "reboot"; + suspend = "systemctl suspend"; + hibernate = "systemctl hibernate"; + }; + }; + }; + }; + }; + # We want Stylix to do most of the heavy lifting for our styling, + # but we want to add a few snippets. So we're going to run waybar + # with '-c ~/.config/waybar/waybar.css', which will add our snippets + # and then source the original, default '~/.config/waybar/style.css' + # created by Stylix. + home.file."waybar.css" = { + target = ".config/waybar/waybar.css"; + source = ./waybar.css; + }; +} diff --git a/nix/home-manager/wm/hyprland/wm.nix b/nix/home-manager/wm/hyprland/wm.nix new file mode 100644 index 00000000..e4639c6e --- /dev/null +++ b/nix/home-manager/wm/hyprland/wm.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: { + imports = [ + ./hyprland.nix + ./waybar.nix + ./wofi.nix + ]; + home.packages = with pkgs; [ + mako + libnotify + swww + polkit-kde-agent + dolphin + power-profiles-daemon + pavucontrol + grim slurp + ]; + +} diff --git a/nix/home-manager/wm/hyprland/wofi.nix b/nix/home-manager/wm/hyprland/wofi.nix new file mode 100644 index 00000000..34e3f04a --- /dev/null +++ b/nix/home-manager/wm/hyprland/wofi.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: { + programs.wofi = { + enable = true; + settings = { + show = "drun"; + width = "40%"; + height = "20%"; + allow_markup = true; + }; + }; +}