From da35923df94a788edd74184f4718350f147196a4 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:13:16 +0200 Subject: [PATCH 01/99] feat: package winapps & the winapps launcher using nix doc: document installation using Nix fix: explicitely specify path to inquirer fix: libvirt group is called libvirtd on nix fix: set libvirturl for winapps-launcher fix: refine group change sed expr feat: add desktop file fix: do not use source derivation fix: use install instead of cp fix: ensure exists --- README.md | 64 ++++++++++++++++++++++++ flake.lock | 61 +++++++++++++++++++++++ flake.nix | 24 +++++++++ packages/winapps-launcher/default.nix | 66 ++++++++++++++++++++++++ packages/winapps/default.nix | 72 +++++++++++++++++++++++++++ 5 files changed, 287 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 packages/winapps-launcher/default.nix create mode 100644 packages/winapps/default.nix diff --git a/README.md b/README.md index da62a1f..ae985ac 100644 --- a/README.md +++ b/README.md @@ -471,6 +471,70 @@ The installer can be run multiple times. To update your installation of WinApps: 2. Pull the latest changes from the WinApps GitHub repository. 3. Re-install WinApps using the WinApps installer. +## Installation using Nix + +First, follow Step 1 of the normal installation guide to create your VM. +Then, install WinApps according to the following instructions. + +After installation, it will be available under `winapps`, with the installer being available under `winapps-setup` +and the optional launcher being available under `winapps-launcher.` + +### Using standalone Nix + +First, make sure Flakes and the `nix` command are enabled. +In your `~/.config/nix/nix.conf`: +``` +experimental-features = nix-command flakes +``` + +```bash +nix profile install github:winapps-org/winapps#winapps +nix profile install github:winapps-org/winapps#winapps-launcher # optional +``` + +### On NixOS using Flakes + +```nix +{ + description = "My configuration"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + winapps = { + url = ""github:winapps-org/winapps; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { + nixpkgs, + winapps, + ... + }: { + nixosConfigurations.hostname = nixpkgs.lib.nixosSystem rec { + system = "x86_64-linux"; + + modules = [ + ./configuration.nix + ({pkgs, ...}: { + environment.systemPackages = [ + winapps.packages.${system}.winapps + winapps.packages.${system}.winapps-launcher # optional + ]; + }) + ]; + }; + }; +} +``` + +### On NixOS without Flakes + +[Flakes aren't real and they can't hurt you.](https://jade.fyi/blog/flakes-arent-real/). +See https://wiki.nixos.org/wiki/Flakes#Using_nix_flakes_with_NixOS on how to enable Flakes on your system. + + ## Star History diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b07995a --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1724819573, + "narHash": "sha256-GnR7/ibgIH1vhoy8cYdmXE6iyZqKqFxQSVkFgosBh6w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "71e91c409d1e654808b2621f28a327acfdad8dc2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..596e431 --- /dev/null +++ b/flake.nix @@ -0,0 +1,24 @@ +{ + description = "WinApps Nix packages & NixOS module"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + nixpkgs, + flake-utils, + ... + }: + flake-utils.lib.eachDefaultSystem ( + system: let + pkgs = import nixpkgs {inherit system;}; + in { + formatter = pkgs.alejandra; + + packages.winapps = pkgs.callPackage ./packages/winapps {}; + packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher {}; + } + ); +} diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix new file mode 100644 index 0000000..0b1cece --- /dev/null +++ b/packages/winapps-launcher/default.nix @@ -0,0 +1,66 @@ +{ + stdenv, + lib, + fetchFromGitHub, + makeWrapper, + makeDesktopItem, + callPackage, + yad, + ... +}: let + rev = "eaa660d39bf3f49b136c98c87c35e3e12f118f8f"; + hash = "sha256-7lkx/O4dOdVqAPX6s2IkkM6Ggbzmz9sm++20BBeoUQ4="; +in + stdenv.mkDerivation rec { + pname = "winapps-launcher"; + version = "git+${rev}"; + + src = fetchFromGitHub { + owner = "winapps-org"; + repo = "WinApps-Launcher"; + + inherit rev hash; + }; + + nativeBuildInputs = [makeWrapper]; + buildInputs = [yad (callPackage ../winapps {})]; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -r ./Icons $out/Icons + + sed -E -i \ + -e "$(printf "%s$out%s" 's|^declare -rx ICONS_PATH="./Icons"|declare -rx ICONS_PATH="' '/Icons"|')" \ + WinAppsLauncher.sh + + install -m755 -D WinAppsLauncher.sh $out/bin/winapps-launcher + install -Dm444 -T Icons/AppIcon.svg $out/share/pixmaps/winapps.svg + + wrapProgram $out/bin/winapps-launcher \ + --set LIBVIRT_DEFAULT_URI "qemu:///system" \ + --prefix PATH : "${lib.makeBinPath buildInputs}" + + runHook postInstall + ''; + + desktopItems = [ + (makeDesktopItem { + name = "winapps"; + exec = "winapps-launcher"; + icon = "winapps"; + comment = meta.description; + desktopName = "WinApps"; + categories = ["Utility"]; + }) + ]; + + meta = with lib; { + homepage = "https://github.com/winapps-org/WinApps-Launcher"; + description = "Graphical launcher for WinApps. Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; + mainProgram = "winapps-launcher"; + platforms = platforms.linux; + license = licenses.gpl3; + }; + } diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix new file mode 100644 index 0000000..3f47542 --- /dev/null +++ b/packages/winapps/default.nix @@ -0,0 +1,72 @@ +{ + stdenv, + lib, + fetchFromGitHub, + makeWrapper, + freerdp3, + dialog, + libnotify, + netcat-gnu, + iproute2, + ... +}: let + rev = "feat-install-script"; # "9417382ae73d2ae5ad69d1c5c407e8b1e5f001dc"; + hash = "sha256-iasuufBu+DhulH/hj2uUaM/KzGO7241+PZXuujsT/qI="; +in + stdenv.mkDerivation rec { + pname = "winapps"; + version = "git+${rev}"; + + src = fetchFromGitHub { + owner = "winapps-org"; + repo = "winapps"; + + inherit rev hash; + }; + + nativeBuildInputs = [makeWrapper]; + buildInputs = [freerdp3 libnotify dialog netcat-gnu iproute2]; + + installPhase = '' + runHook preInstall + + patchShebangs install/inquirer.sh + + mkdir -p $out + mkdir -p $out/src + + cp -r ./ $out/src/ + + install -m755 -D bin/winapps $out/bin/winapps + install -m755 -D setup.sh $out/bin/winapps-setup + + sed -E -i \ + -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + $out/bin/winapps + + sed -E -i \ + -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + -e "$(printf "%s$out%s" 's|^readonly INQUIRER_PATH="./install/inquirer.sh"|readonly INQUIRER_PATH="' '/src/install/inquirer.sh"|')" \ + -e "$(printf "%s$out%s" 's|^readonly SYS_SOURCE_PATH="(.*?)"|readonly SYS_SOURCE_PATH="' '/src"|')" \ + -e "$(printf "%s$out%s" 's|^readonly USER_SOURCE_PATH="(.*?)"|readonly USER_SOURCE_PATH="' '/src"|')" \ + -e 's/\$SUDO git -C "\$SOURCE_PATH" pull --no-rebase//g' \ + -e 's|./setup.sh|winapps-setup|g' \ + $out/bin/winapps-setup + + for f in winapps-setup winapps; do + wrapProgram $out/bin/$f \ + --set LIBVIRT_DEFAULT_URI "qemu:///system" \ + --prefix PATH : "${lib.makeBinPath buildInputs}" + done + + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://github.com/winapps-org/winapps"; + description = "Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; + mainProgram = "winapps"; + platforms = platforms.linux; + license = licenses.gpl3; + }; + } From 00141f1d54e9b7d206eb2bf45dc56f7cec7d3284 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sat, 7 Sep 2024 13:05:09 +0200 Subject: [PATCH 02/99] fix: do not symlink binaries on nix --- packages/winapps/default.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 3f47542..46b869d 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -42,6 +42,8 @@ in sed -E -i \ -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + -e 's|$SUDO ln -s "./bin/winapps"(.*)||' \ + -e 's|$SUDO ln -s "./setup.sh"(.*)||' \ $out/bin/winapps sed -E -i \ From 26a2f13815b555752b5f2cae6007a85e46d98880 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sat, 7 Sep 2024 13:30:35 +0200 Subject: [PATCH 03/99] feat: bump version --- packages/winapps/default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 46b869d..e2d4f44 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -10,8 +10,8 @@ iproute2, ... }: let - rev = "feat-install-script"; # "9417382ae73d2ae5ad69d1c5c407e8b1e5f001dc"; - hash = "sha256-iasuufBu+DhulH/hj2uUaM/KzGO7241+PZXuujsT/qI="; + rev = "4e3d5bd4581250a49974a19b37f55fc76165051a"; + hash = "sha256-meM9U6MLVqN0SjzorL8TeYKEkFXykCJI7BTady5CWMA="; in stdenv.mkDerivation rec { pname = "winapps"; @@ -42,8 +42,8 @@ in sed -E -i \ -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ - -e 's|$SUDO ln -s "./bin/winapps"(.*)||' \ - -e 's|$SUDO ln -s "./setup.sh"(.*)||' \ + -e 's|\$SUDO ln -s "./bin/winapps"(.*)||' \ + -e 's|\$SUDO ln -s "./setup.sh"(.*)||' \ $out/bin/winapps sed -E -i \ From f4c0a454b7757a03ff59eefe39e7ca11f22a0b9d Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sun, 8 Sep 2024 11:46:48 +0200 Subject: [PATCH 04/99] fix: properly escape ${} --- packages/winapps/default.nix | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index e2d4f44..c3a8300 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -10,8 +10,8 @@ iproute2, ... }: let - rev = "4e3d5bd4581250a49974a19b37f55fc76165051a"; - hash = "sha256-meM9U6MLVqN0SjzorL8TeYKEkFXykCJI7BTady5CWMA="; + rev = "350f003d817765ed9e6f4791e86c3d69019f230a"; + hash = "sha256-MqQ9KFyo6bZDxfWCe62z1zDSvHJJjvWqZLO4UxwELow="; in stdenv.mkDerivation rec { pname = "winapps"; @@ -42,8 +42,6 @@ in sed -E -i \ -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ - -e 's|\$SUDO ln -s "./bin/winapps"(.*)||' \ - -e 's|\$SUDO ln -s "./setup.sh"(.*)||' \ $out/bin/winapps sed -E -i \ @@ -53,6 +51,9 @@ in -e "$(printf "%s$out%s" 's|^readonly USER_SOURCE_PATH="(.*?)"|readonly USER_SOURCE_PATH="' '/src"|')" \ -e 's/\$SUDO git -C "\$SOURCE_PATH" pull --no-rebase//g' \ -e 's|./setup.sh|winapps-setup|g' \ + -e 's|\$SUDO ln -s "./bin/winapps" "\$\{BIN_PATH\}/winapps"||' \ + -e 's|\$SUDO ln -s "./setup.sh" "\$\{BIN_PATH\}/winapps-setup"||' \ + -e "s|\$\{BIN_PATH\}/winapps|$out/bin/winapps|" \ $out/bin/winapps-setup for f in winapps-setup winapps; do From b0f2830224003a0a368e1a36b25ba65848b642f1 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:27:36 +0200 Subject: [PATCH 05/99] feat: bump version --- packages/winapps/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index c3a8300..986c6dc 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -10,8 +10,8 @@ iproute2, ... }: let - rev = "350f003d817765ed9e6f4791e86c3d69019f230a"; - hash = "sha256-MqQ9KFyo6bZDxfWCe62z1zDSvHJJjvWqZLO4UxwELow="; + rev = "7bae17e3a3607e6b93c7cfc4155dfbdca7bba005"; + hash = "sha256-PP4POMwHCsAdiCxZkjXlON84F0Mg3Pd5bHEI6tC+Sds="; in stdenv.mkDerivation rec { pname = "winapps"; From 7d5cce374c3402b6bcc8169d325fd342c2f8d506 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Mon, 9 Sep 2024 10:31:41 +0200 Subject: [PATCH 06/99] feat: use nixfmt --- .pre-commit-config.yaml | 6 ++ flake.nix | 25 ++++--- packages/winapps-launcher/default.nix | 90 +++++++++++----------- packages/winapps/default.nix | 103 ++++++++++++++------------ 4 files changed, 122 insertions(+), 102 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b5f2edb..76a6cd0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,6 @@ ci: autoupdate_branch: "rewrite" + skip: [nixfmt] repos: - repo: https://github.com/Lucas-C/pre-commit-hooks @@ -48,3 +49,8 @@ repos: rev: v0.10.0.1 hooks: - id: shellcheck + + - repo: https://github.com/NixOS/nixfmt + rev: d0c0cda4fe6b7ae2b9aa37f3ee15e6412573eb01 + hooks: + - id: nixfmt diff --git a/flake.nix b/flake.nix index 596e431..5bf6d8f 100644 --- a/flake.nix +++ b/flake.nix @@ -6,19 +6,22 @@ flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { - nixpkgs, - flake-utils, - ... - }: + outputs = + { + nixpkgs, + flake-utils, + ... + }: flake-utils.lib.eachDefaultSystem ( - system: let - pkgs = import nixpkgs {inherit system;}; - in { - formatter = pkgs.alejandra; + system: + let + pkgs = import nixpkgs { inherit system; }; + in + { + formatter = pkgs.nixfmt-rfc-style; - packages.winapps = pkgs.callPackage ./packages/winapps {}; - packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher {}; + packages.winapps = pkgs.callPackage ./packages/winapps { }; + packages.winapps-launcher = pkgs.callPackage ./packages/winapps-launcher { }; } ); } diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index 0b1cece..362f428 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -7,60 +7,64 @@ callPackage, yad, ... -}: let +}: +let rev = "eaa660d39bf3f49b136c98c87c35e3e12f118f8f"; hash = "sha256-7lkx/O4dOdVqAPX6s2IkkM6Ggbzmz9sm++20BBeoUQ4="; in - stdenv.mkDerivation rec { - pname = "winapps-launcher"; - version = "git+${rev}"; +stdenv.mkDerivation rec { + pname = "winapps-launcher"; + version = "git+${rev}"; - src = fetchFromGitHub { - owner = "winapps-org"; - repo = "WinApps-Launcher"; + src = fetchFromGitHub { + owner = "winapps-org"; + repo = "WinApps-Launcher"; - inherit rev hash; - }; + inherit rev hash; + }; - nativeBuildInputs = [makeWrapper]; - buildInputs = [yad (callPackage ../winapps {})]; + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ + yad + (callPackage ../winapps { }) + ]; - installPhase = '' - runHook preInstall + installPhase = '' + runHook preInstall - mkdir -p $out - cp -r ./Icons $out/Icons + mkdir -p $out + cp -r ./Icons $out/Icons - sed -E -i \ - -e "$(printf "%s$out%s" 's|^declare -rx ICONS_PATH="./Icons"|declare -rx ICONS_PATH="' '/Icons"|')" \ - WinAppsLauncher.sh + sed -E -i \ + -e "$(printf "%s$out%s" 's|^declare -rx ICONS_PATH="./Icons"|declare -rx ICONS_PATH="' '/Icons"|')" \ + WinAppsLauncher.sh - install -m755 -D WinAppsLauncher.sh $out/bin/winapps-launcher - install -Dm444 -T Icons/AppIcon.svg $out/share/pixmaps/winapps.svg + install -m755 -D WinAppsLauncher.sh $out/bin/winapps-launcher + install -Dm444 -T Icons/AppIcon.svg $out/share/pixmaps/winapps.svg - wrapProgram $out/bin/winapps-launcher \ - --set LIBVIRT_DEFAULT_URI "qemu:///system" \ - --prefix PATH : "${lib.makeBinPath buildInputs}" + wrapProgram $out/bin/winapps-launcher \ + --set LIBVIRT_DEFAULT_URI "qemu:///system" \ + --prefix PATH : "${lib.makeBinPath buildInputs}" - runHook postInstall - ''; + runHook postInstall + ''; - desktopItems = [ - (makeDesktopItem { - name = "winapps"; - exec = "winapps-launcher"; - icon = "winapps"; - comment = meta.description; - desktopName = "WinApps"; - categories = ["Utility"]; - }) - ]; + desktopItems = [ + (makeDesktopItem { + name = "winapps"; + exec = "winapps-launcher"; + icon = "winapps"; + comment = meta.description; + desktopName = "WinApps"; + categories = [ "Utility" ]; + }) + ]; - meta = with lib; { - homepage = "https://github.com/winapps-org/WinApps-Launcher"; - description = "Graphical launcher for WinApps. Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; - mainProgram = "winapps-launcher"; - platforms = platforms.linux; - license = licenses.gpl3; - }; - } + meta = with lib; { + homepage = "https://github.com/winapps-org/WinApps-Launcher"; + description = "Graphical launcher for WinApps. Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; + mainProgram = "winapps-launcher"; + platforms = platforms.linux; + license = licenses.gpl3; + }; +} diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 986c6dc..9730c67 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -9,67 +9,74 @@ netcat-gnu, iproute2, ... -}: let +}: +let rev = "7bae17e3a3607e6b93c7cfc4155dfbdca7bba005"; hash = "sha256-PP4POMwHCsAdiCxZkjXlON84F0Mg3Pd5bHEI6tC+Sds="; in - stdenv.mkDerivation rec { - pname = "winapps"; - version = "git+${rev}"; +stdenv.mkDerivation rec { + pname = "winapps"; + version = "git+${rev}"; - src = fetchFromGitHub { - owner = "winapps-org"; - repo = "winapps"; + src = fetchFromGitHub { + owner = "winapps-org"; + repo = "winapps"; - inherit rev hash; - }; + inherit rev hash; + }; - nativeBuildInputs = [makeWrapper]; - buildInputs = [freerdp3 libnotify dialog netcat-gnu iproute2]; + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ + freerdp3 + libnotify + dialog + netcat-gnu + iproute2 + ]; - installPhase = '' - runHook preInstall + installPhase = '' + runHook preInstall - patchShebangs install/inquirer.sh + mkdir -p $out + mkdir -p $out/src - mkdir -p $out - mkdir -p $out/src + patchShebangs install/inquirer.sh - cp -r ./ $out/src/ + sed -E -i \ + -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + bin/winapps - install -m755 -D bin/winapps $out/bin/winapps - install -m755 -D setup.sh $out/bin/winapps-setup + sed -E -i \ + -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ + -e "$(printf "%s$out%s" 's|^readonly INQUIRER_PATH="./install/inquirer.sh"|readonly INQUIRER_PATH="' '/src/install/inquirer.sh"|')" \ + -e "$(printf "%s$out%s" 's|^readonly SYS_SOURCE_PATH="(.*?)"|readonly SYS_SOURCE_PATH="' '/src"|')" \ + -e "$(printf "%s$out%s" 's|^readonly USER_SOURCE_PATH="(.*?)"|readonly USER_SOURCE_PATH="' '/src"|')" \ + -e 's/\$SUDO git -C "\$SOURCE_PATH" pull --no-rebase//g' \ + -e 's|./setup.sh|winapps-setup|g' \ + -e 's|\$SUDO ln -s "./bin/winapps" "\$\{BIN_PATH\}/winapps"||' \ + -e 's|\$SUDO ln -s "./setup.sh" "\$\{BIN_PATH\}/winapps-setup"||' \ + -e "s|\$\{BIN_PATH\}/winapps|$out/bin/winapps|" \ + ./setup.sh - sed -E -i \ - -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ - $out/bin/winapps + cp -r ./ $out/src/ - sed -E -i \ - -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ - -e "$(printf "%s$out%s" 's|^readonly INQUIRER_PATH="./install/inquirer.sh"|readonly INQUIRER_PATH="' '/src/install/inquirer.sh"|')" \ - -e "$(printf "%s$out%s" 's|^readonly SYS_SOURCE_PATH="(.*?)"|readonly SYS_SOURCE_PATH="' '/src"|')" \ - -e "$(printf "%s$out%s" 's|^readonly USER_SOURCE_PATH="(.*?)"|readonly USER_SOURCE_PATH="' '/src"|')" \ - -e 's/\$SUDO git -C "\$SOURCE_PATH" pull --no-rebase//g' \ - -e 's|./setup.sh|winapps-setup|g' \ - -e 's|\$SUDO ln -s "./bin/winapps" "\$\{BIN_PATH\}/winapps"||' \ - -e 's|\$SUDO ln -s "./setup.sh" "\$\{BIN_PATH\}/winapps-setup"||' \ - -e "s|\$\{BIN_PATH\}/winapps|$out/bin/winapps|" \ - $out/bin/winapps-setup + install -m755 -D bin/winapps $out/bin/winapps + install -m755 -D setup.sh $out/bin/winapps-setup - for f in winapps-setup winapps; do - wrapProgram $out/bin/$f \ - --set LIBVIRT_DEFAULT_URI "qemu:///system" \ - --prefix PATH : "${lib.makeBinPath buildInputs}" - done + for f in winapps-setup winapps; do + wrapProgram $out/bin/$f \ + --set LIBVIRT_DEFAULT_URI "qemu:///system" \ + --prefix PATH : "${lib.makeBinPath buildInputs}" + done - runHook postInstall - ''; + runHook postInstall + ''; - meta = with lib; { - homepage = "https://github.com/winapps-org/winapps"; - description = "Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; - mainProgram = "winapps"; - platforms = platforms.linux; - license = licenses.gpl3; - }; - } + meta = with lib; { + homepage = "https://github.com/winapps-org/winapps"; + description = "Run Windows applications (including Microsoft 365 and Adobe Creative Cloud) on GNU/Linux with KDE, GNOME or XFCE, integrated seamlessly as if they were native to the OS. Wayland is currently unsupported."; + mainProgram = "winapps"; + platforms = platforms.linux; + license = licenses.agpl3Plus; + }; +} From 28e958e60006df1a1a10f0b8946ad7f8b6c8627c Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:09:42 +0200 Subject: [PATCH 07/99] feat: use patches --- .../winapps-launcher/WinAppsLauncher.diff | 11 +++ packages/winapps-launcher/default.nix | 10 ++- packages/winapps/default.nix | 29 +++--- packages/winapps/setup.diff | 88 +++++++++++++++++++ packages/winapps/winapps.patch | 11 +++ 5 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 packages/winapps-launcher/WinAppsLauncher.diff create mode 100644 packages/winapps/setup.diff create mode 100644 packages/winapps/winapps.patch diff --git a/packages/winapps-launcher/WinAppsLauncher.diff b/packages/winapps-launcher/WinAppsLauncher.diff new file mode 100644 index 0000000..962b1bf --- /dev/null +++ b/packages/winapps-launcher/WinAppsLauncher.diff @@ -0,0 +1,11 @@ +--- a/WinAppsLauncher.sh ++++ b/WinAppsLauncher.sh +@@ -19,7 +19,7 @@ declare -rx EC_WIN_NOT_SPEC=6 + declare -rx EC_NO_WIN_FOUND=7 + + # Paths +-declare -rx ICONS_PATH="./Icons" ++declare -rx ICONS_PATH="@out@/Icons" + declare -rx APPDATA_PATH="${HOME}/.local/share/winapps" + declare -rx CONFIG_PATH="${HOME}/.config/winapps" + declare -rx CONFIG_FILE="${CONFIG_PATH}/winapps.conf" diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index 362f428..cbe0b76 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -29,16 +29,18 @@ stdenv.mkDerivation rec { (callPackage ../winapps { }) ]; + patches = [ ./WinAppsLauncher.diff ]; + + postPatch = '' + substituteAllInPlace WinAppsLauncher.sh + ''; + installPhase = '' runHook preInstall mkdir -p $out cp -r ./Icons $out/Icons - sed -E -i \ - -e "$(printf "%s$out%s" 's|^declare -rx ICONS_PATH="./Icons"|declare -rx ICONS_PATH="' '/Icons"|')" \ - WinAppsLauncher.sh - install -m755 -D WinAppsLauncher.sh $out/bin/winapps-launcher install -Dm444 -T Icons/AppIcon.svg $out/share/pixmaps/winapps.svg diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 9730c67..ea8ea8b 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -34,30 +34,23 @@ stdenv.mkDerivation rec { iproute2 ]; + patches = [ + ./winapps.patch + ./setup.patch + ]; + + postPatch = '' + substituteAllInPlace bin/winapps + substituteAllInPlace setup.sh + patchShebangs install/inquirer.sh + ''; + installPhase = '' runHook preInstall mkdir -p $out mkdir -p $out/src - patchShebangs install/inquirer.sh - - sed -E -i \ - -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ - bin/winapps - - sed -E -i \ - -e 's/grep -q -E "\\blibvirt\\b"/grep -q -E "\\blibvirtd\\b"/' \ - -e "$(printf "%s$out%s" 's|^readonly INQUIRER_PATH="./install/inquirer.sh"|readonly INQUIRER_PATH="' '/src/install/inquirer.sh"|')" \ - -e "$(printf "%s$out%s" 's|^readonly SYS_SOURCE_PATH="(.*?)"|readonly SYS_SOURCE_PATH="' '/src"|')" \ - -e "$(printf "%s$out%s" 's|^readonly USER_SOURCE_PATH="(.*?)"|readonly USER_SOURCE_PATH="' '/src"|')" \ - -e 's/\$SUDO git -C "\$SOURCE_PATH" pull --no-rebase//g' \ - -e 's|./setup.sh|winapps-setup|g' \ - -e 's|\$SUDO ln -s "./bin/winapps" "\$\{BIN_PATH\}/winapps"||' \ - -e 's|\$SUDO ln -s "./setup.sh" "\$\{BIN_PATH\}/winapps-setup"||' \ - -e "s|\$\{BIN_PATH\}/winapps|$out/bin/winapps|" \ - ./setup.sh - cp -r ./ $out/src/ install -m755 -D bin/winapps $out/bin/winapps diff --git a/packages/winapps/setup.diff b/packages/winapps/setup.diff new file mode 100644 index 0000000..98aaece --- /dev/null +++ b/packages/winapps/setup.diff @@ -0,0 +1,88 @@ +--- a/setup.sh ++++ b/setup.sh +@@ -38,8 +38,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir + readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation. + readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation. + # 'SOURCE' +-readonly SYS_SOURCE_PATH="${SYS_BIN_PATH}/winapps" # UNIX path to WinApps source directory for a '--system' WinApps installation. +-readonly USER_SOURCE_PATH="${USER_BIN_PATH}/winapps" # UNIX path to WinApps source directory for a '--system' WinApps installation. ++readonly SYS_SOURCE_PATH="@out@/src" # UNIX path to WinApps source directory for a '--system' WinApps installation. ++readonly USER_SOURCE_PATH="@out@/src" # UNIX path to WinApps source directory for a '--system' WinApps installation. + # 'APP' + readonly SYS_APP_PATH="/usr/share/applications" # UNIX path to 'applications' directory for a '--system' WinApps installation. + readonly USER_APP_PATH="${HOME}/.local/share/applications" # UNIX path to 'applications' directory for a '--user' WinApps installation. +@@ -69,7 +69,7 @@ readonly TEST_PATH_WIN="${USER_APPDATA_PATH_WIN}\\FreeRDP_Connection_Test" # WIN + # 'WinApps Configuration File' + readonly CONFIG_PATH="${HOME}/.config/winapps/winapps.conf" # UNIX path to the WinApps configuration file. + # 'Inquirer Bash Script' +-readonly INQUIRER_PATH="./install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus. ++readonly INQUIRER_PATH="@out@/src/install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus. + + # REMOTE DESKTOP CONFIGURATION + readonly VM_NAME="RDPWindows" # Name of the Windows VM (FOR 'libvirt' ONLY). +@@ -129,13 +129,13 @@ function waTerminateScript() { + # Role: Displays usage information for the script. + function waUsage() { + echo -e "Usage: +- ${COMMAND_TEXT}./setup.sh --user${CLEAR_TEXT} # Install WinApps and selected applications in ${HOME} +- ${COMMAND_TEXT}./setup.sh --system${CLEAR_TEXT} # Install WinApps and selected applications in /usr +- ${COMMAND_TEXT}./setup.sh --user --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in ${HOME} +- ${COMMAND_TEXT}./setup.sh --system --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in /usr +- ${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT} # Uninstall everything in ${HOME} +- ${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr +- ${COMMAND_TEXT}./setup.sh --help${CLEAR_TEXT} # Display this usage message." ++ ${COMMAND_TEXT}winapps-setup --user${CLEAR_TEXT} # Install WinApps and selected applications in ${HOME} ++ ${COMMAND_TEXT}winapps-setup --system${CLEAR_TEXT} # Install WinApps and selected applications in /usr ++ ${COMMAND_TEXT}winapps-setup --user --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in ${HOME} ++ ${COMMAND_TEXT}winapps-setup --system --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in /usr ++ ${COMMAND_TEXT}winapps-setup --user --uninstall${CLEAR_TEXT} # Uninstall everything in ${HOME} ++ ${COMMAND_TEXT}winapps-setup --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr ++ ${COMMAND_TEXT}winapps-setup --help${CLEAR_TEXT} # Display this usage message." + } + + # Name: 'waGetSourceCode' +@@ -158,7 +158,7 @@ function waGetSourceCode() { + $SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH" + else + echo -e "${INFO_TEXT}WinApps installation already present at ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}. Updating...${CLEAR_TEXT}" +- $SUDO git -C "$SOURCE_PATH" pull --no-rebase ++ + fi + + # Silently change the working directory. +@@ -385,7 +385,7 @@ function waCheckExistingInstall() { + + # Display the suggested action(s). + echo "--------------------------------------------------------------------------------" +- echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT}." ++ echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --user --uninstall${CLEAR_TEXT}." + echo "--------------------------------------------------------------------------------" + + # Terminate the script. +@@ -405,7 +405,7 @@ function waCheckExistingInstall() { + + # Display the suggested action(s). + echo "--------------------------------------------------------------------------------" +- echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT}." ++ echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --system --uninstall${CLEAR_TEXT}." + echo "--------------------------------------------------------------------------------" + + # Terminate the script. +@@ -800,7 +800,7 @@ function waCheckGroupMembership() { + # Identify groups the current user belongs to. + USER_GROUPS=$(groups "$(whoami)") + +- if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirt\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then ++ if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirtd\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then + # Complete the previous line. + echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n" + +@@ -1621,8 +1621,8 @@ function waInstall() { + waFindInstalled + + # Install the WinApps bash scripts. +- $SUDO ln -s "./bin/winapps" "${BIN_PATH}/winapps" +- $SUDO ln -s "./setup.sh" "${BIN_PATH}/winapps-setup" + + # Configure the Windows RDP session application launcher. + waConfigureWindows diff --git a/packages/winapps/winapps.patch b/packages/winapps/winapps.patch new file mode 100644 index 0000000..478d0ac --- /dev/null +++ b/packages/winapps/winapps.patch @@ -0,0 +1,11 @@ +--- a/bin/winapps ++++ b/bin/winapps +@@ -295,7 +295,7 @@ function waCheckGroupMembership() { + # shellcheck disable=SC2155 # Silence warnings regarding masking return values through simultaneous declaration and assignment. + local USER_GROUPS=$(groups "$(whoami)") + +- if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirt\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then ++ if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirtd\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then + waThrowExit "$EC_NOT_IN_GROUP" + fi + } From b044cb41c7eb1b6d6240d00007eee9acb82cf57f Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:12:22 +0200 Subject: [PATCH 08/99] fix: properly name patches & remove nixfmt pre-commit hook since it requires GHC & hackage --- .pre-commit-config.yaml | 6 ------ .../{WinAppsLauncher.diff => WinAppsLauncher.patch} | 0 packages/winapps-launcher/default.nix | 2 +- packages/winapps/{setup.diff => setup.patch} | 0 4 files changed, 1 insertion(+), 7 deletions(-) rename packages/winapps-launcher/{WinAppsLauncher.diff => WinAppsLauncher.patch} (100%) rename packages/winapps/{setup.diff => setup.patch} (100%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 76a6cd0..b5f2edb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,5 @@ ci: autoupdate_branch: "rewrite" - skip: [nixfmt] repos: - repo: https://github.com/Lucas-C/pre-commit-hooks @@ -49,8 +48,3 @@ repos: rev: v0.10.0.1 hooks: - id: shellcheck - - - repo: https://github.com/NixOS/nixfmt - rev: d0c0cda4fe6b7ae2b9aa37f3ee15e6412573eb01 - hooks: - - id: nixfmt diff --git a/packages/winapps-launcher/WinAppsLauncher.diff b/packages/winapps-launcher/WinAppsLauncher.patch similarity index 100% rename from packages/winapps-launcher/WinAppsLauncher.diff rename to packages/winapps-launcher/WinAppsLauncher.patch diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index cbe0b76..6e1b263 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -29,7 +29,7 @@ stdenv.mkDerivation rec { (callPackage ../winapps { }) ]; - patches = [ ./WinAppsLauncher.diff ]; + patches = [ ./WinAppsLauncher.patch ]; postPatch = '' substituteAllInPlace WinAppsLauncher.sh diff --git a/packages/winapps/setup.diff b/packages/winapps/setup.patch similarity index 100% rename from packages/winapps/setup.diff rename to packages/winapps/setup.patch From 7f3cdcee4d209e2187d006fa6846f3d332f6fc77 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Mon, 9 Sep 2024 17:50:55 +0200 Subject: [PATCH 09/99] fix: fix malformed patch --- .pre-commit-config.yaml | 2 ++ packages/winapps/default.nix | 4 ++-- packages/winapps/setup.patch | 34 ++++++++++++++++++---------------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b5f2edb..04d95f8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,8 @@ ci: autoupdate_branch: "rewrite" +exclude: ^(.+)\.patch$ + repos: - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.5.5 diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index ea8ea8b..3f50ce9 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,8 +11,8 @@ ... }: let - rev = "7bae17e3a3607e6b93c7cfc4155dfbdca7bba005"; - hash = "sha256-PP4POMwHCsAdiCxZkjXlON84F0Mg3Pd5bHEI6tC+Sds="; + rev = "07817afe0c2cad15c4eb90b5c94261a2b4d365d4"; + hash = "sha256-4KxssnSw1Xk6huKRpbRFw6NXIhjCoZYBzu/HYA1ngDM="; in stdenv.mkDerivation rec { pname = "winapps"; diff --git a/packages/winapps/setup.patch b/packages/winapps/setup.patch index 98aaece..cb2c22b 100644 --- a/packages/winapps/setup.patch +++ b/packages/winapps/setup.patch @@ -4,8 +4,8 @@ readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation. readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation. # 'SOURCE' --readonly SYS_SOURCE_PATH="${SYS_BIN_PATH}/winapps" # UNIX path to WinApps source directory for a '--system' WinApps installation. --readonly USER_SOURCE_PATH="${USER_BIN_PATH}/winapps" # UNIX path to WinApps source directory for a '--system' WinApps installation. +-readonly SYS_SOURCE_PATH="${SYS_BIN_PATH}/winapps-src" # UNIX path to WinApps source directory for a '--system' WinApps installation. +-readonly USER_SOURCE_PATH="${USER_BIN_PATH}/winapps-src" # UNIX path to WinApps source directory for a '--system' WinApps installation. +readonly SYS_SOURCE_PATH="@out@/src" # UNIX path to WinApps source directory for a '--system' WinApps installation. +readonly USER_SOURCE_PATH="@out@/src" # UNIX path to WinApps source directory for a '--system' WinApps installation. # 'APP' @@ -17,7 +17,7 @@ # 'Inquirer Bash Script' -readonly INQUIRER_PATH="./install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus. +readonly INQUIRER_PATH="@out@/src/install/inquirer.sh" # UNIX path to the 'inquirer' script, which is used to produce selection menus. - + # REMOTE DESKTOP CONFIGURATION readonly VM_NAME="RDPWindows" # Name of the Windows VM (FOR 'libvirt' ONLY). @@ -129,13 +129,13 @@ function waTerminateScript() { @@ -39,50 +39,52 @@ + ${COMMAND_TEXT}winapps-setup --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr + ${COMMAND_TEXT}winapps-setup --help${CLEAR_TEXT} # Display this usage message." } - + # Name: 'waGetSourceCode' @@ -158,7 +158,7 @@ function waGetSourceCode() { $SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH" else echo -e "${INFO_TEXT}WinApps installation already present at ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}. Updating...${CLEAR_TEXT}" - $SUDO git -C "$SOURCE_PATH" pull --no-rebase -+ ++ fi - + # Silently change the working directory. @@ -385,7 +385,7 @@ function waCheckExistingInstall() { - + # Display the suggested action(s). echo "--------------------------------------------------------------------------------" - echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT}." + echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --user --uninstall${CLEAR_TEXT}." echo "--------------------------------------------------------------------------------" - + # Terminate the script. @@ -405,7 +405,7 @@ function waCheckExistingInstall() { - + # Display the suggested action(s). echo "--------------------------------------------------------------------------------" - echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT}." + echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --system --uninstall${CLEAR_TEXT}." echo "--------------------------------------------------------------------------------" - + # Terminate the script. @@ -800,7 +800,7 @@ function waCheckGroupMembership() { # Identify groups the current user belongs to. USER_GROUPS=$(groups "$(whoami)") - + - if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirt\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then + if ! (echo "$USER_GROUPS" | grep -q -E "\blibvirtd\b") || ! (echo "$USER_GROUPS" | grep -q -E "\bkvm\b"); then # Complete the previous line. echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n" - + @@ -1621,8 +1621,8 @@ function waInstall() { waFindInstalled - + # Install the WinApps bash scripts. -- $SUDO ln -s "./bin/winapps" "${BIN_PATH}/winapps" -- $SUDO ln -s "./setup.sh" "${BIN_PATH}/winapps-setup" - +- $SUDO ln -sf "${SOURCE_PATH}/bin/winapps" "${BIN_PATH}/winapps" +- $SUDO ln -sf "${SOURCE_PATH}/setup.sh" "${BIN_PATH}/winapps-setup" ++ ++ + # Configure the Windows RDP session application launcher. waConfigureWindows From 1496041b48c9c28aa7d75cb12e6c14c4a26fbfcf Mon Sep 17 00:00:00 2001 From: itiligent <94789708+itiligent@users.noreply.github.com> Date: Wed, 18 Sep 2024 14:50:48 +1000 Subject: [PATCH 10/99] Clean up old network profiles Keep Windows networking tidy. At boot a Powershell script will run that clears out old network profile names automatically created at previous system reboots. A regist change disables the "Do you want your PC to be discoverable" nag screen after eachc reboot --- oem/RDPApps.reg | 8 +++++++- oem/install.bat | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/oem/RDPApps.reg b/oem/RDPApps.reg index acb5aac..9c79620 100644 --- a/oem/RDPApps.reg +++ b/oem/RDPApps.reg @@ -1,10 +1,16 @@ Windows Registry Editor Version 5.00 - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] + ; Disable RemoteApp allowlist so all applications can be used in a Remote Desktop session + [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] "fDisabledAllowList"=dword:00000001 + ; Allow unlisted programs to be run in Remote Desktop sessions [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services] "fAllowUnlistedRemotePrograms"=dword:00000001 + ; Disable automatic administrator logon at startup [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "AutoAdminLogon"="0" + + ; Disable "Do you want your PC to be discoverable" prompt after each host system reboot + [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff] diff --git a/oem/install.bat b/oem/install.bat index 182423c..6d3b0dd 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -1,3 +1,54 @@ @echo off REG IMPORT C:\OEM\RDPApps.reg + +:: Write the Powershell network profile cleanup script +( +echo # Get the current network profile name +echo $currentProfile = ^(Get-NetConnectionProfile^).Name +echo. +echo # Get all profiles from the registry +echo $profilesKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" +echo $profiles = Get-ChildItem -Path $profilesKey +echo. +echo foreach ^($profile in $profiles^) { +echo $profilePath = "$profilesKey\$($profile.PSChildName)" +echo $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName +echo. +echo # Remove profiles that don't match the current one +echo if ^($profileName -ne $currentProfile^) { +echo Remove-Item -Path $profilePath -Recurse +echo Write-Host "Deleted profile: $profileName" +echo } +echo } +echo. +echo # Change the current profile name to "WinApps" +echo $profiles = Get-ChildItem -Path $profilesKey +echo foreach ^($profile in $profiles^) { +echo $profilePath = "$profilesKey\$($profile.PSChildName)" +echo $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName +echo. +echo if ^($profileName -eq $currentProfile^) { +echo # Update the profile name +echo Set-ItemProperty -Path $profilePath -Name "ProfileName" -Value "WinApps" +echo Write-Host "Renamed profile to: WinApps" +echo } +echo } +) > C:\Windows\NetProfileCleanup.ps1 + +:: Create network profile cleanup scheduled task +set "taskname=NetworkProfileCleanup" +set "command=powershell.exe -ExecutionPolicy Bypass -File "C:\Windows\NetProfileCleanup.ps1^"" + +schtasks /query /tn "%taskname%" >nul 2>&1 +if %ERRORLEVEL% equ 0 ( + echo Task "%taskname%" already exists, deleting it first... + schtasks /delete /tn "%taskname%" /f +) + +schtasks /create /tn "%taskname%" /tr "%command%" /sc onstart /ru "SYSTEM" /rl HIGHEST /f +if %ERRORLEVEL% equ 0 ( + echo Scheduled task "%taskname%" created successfully. +) else ( + echo Failed to create scheduled task. +) \ No newline at end of file From 90b342270948e2c9ceee27d453524fd4e3b57e63 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:58:40 +0000 Subject: [PATCH 11/99] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- oem/RDPApps.reg | 6 +++--- oem/install.bat | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/oem/RDPApps.reg b/oem/RDPApps.reg index 9c79620..e2dfdc4 100644 --- a/oem/RDPApps.reg +++ b/oem/RDPApps.reg @@ -1,14 +1,14 @@ Windows Registry Editor Version 5.00 ; Disable RemoteApp allowlist so all applications can be used in a Remote Desktop session - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] + [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] "fDisabledAllowList"=dword:00000001 - ; Allow unlisted programs to be run in Remote Desktop sessions + ; Allow unlisted programs to be run in Remote Desktop sessions [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services] "fAllowUnlistedRemotePrograms"=dword:00000001 - ; Disable automatic administrator logon at startup + ; Disable automatic administrator logon at startup [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "AutoAdminLogon"="0" diff --git a/oem/install.bat b/oem/install.bat index 6d3b0dd..9aae31d 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -51,4 +51,4 @@ if %ERRORLEVEL% equ 0 ( echo Scheduled task "%taskname%" created successfully. ) else ( echo Failed to create scheduled task. -) \ No newline at end of file +) From e839d1fdcdcbbd587bfc40f393fc2b03ce5fcd28 Mon Sep 17 00:00:00 2001 From: itiligent <94789708+itiligent@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:26:41 +1000 Subject: [PATCH 12/99] change script path to %windir% --- oem/install.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oem/install.bat b/oem/install.bat index 9aae31d..8ff1dbe 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -34,11 +34,11 @@ echo Set-ItemProperty -Path $profilePath -Name "ProfileName" -Value "Win echo Write-Host "Renamed profile to: WinApps" echo } echo } -) > C:\Windows\NetProfileCleanup.ps1 +) > %windir%\NetProfileCleanup.ps1 :: Create network profile cleanup scheduled task set "taskname=NetworkProfileCleanup" -set "command=powershell.exe -ExecutionPolicy Bypass -File "C:\Windows\NetProfileCleanup.ps1^"" +set "command=powershell.exe -ExecutionPolicy Bypass -File "%windir%\NetProfileCleanup.ps1^"" schtasks /query /tn "%taskname%" >nul 2>&1 if %ERRORLEVEL% equ 0 ( @@ -51,4 +51,4 @@ if %ERRORLEVEL% equ 0 ( echo Scheduled task "%taskname%" created successfully. ) else ( echo Failed to create scheduled task. -) +) \ No newline at end of file From 6d67815c9c04d4eeab06916f40b5db6e82555ca0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 05:26:52 +0000 Subject: [PATCH 13/99] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- oem/install.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oem/install.bat b/oem/install.bat index 8ff1dbe..25f69d4 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -51,4 +51,4 @@ if %ERRORLEVEL% equ 0 ( echo Scheduled task "%taskname%" created successfully. ) else ( echo Failed to create scheduled task. -) \ No newline at end of file +) From cd2a73ff30fe1642b2ba6cfafb7df8decc834dbb Mon Sep 17 00:00:00 2001 From: itiligent <94789708+itiligent@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:11:49 +1000 Subject: [PATCH 14/99] Cleanup network profiles --- oem/RDPApps.reg | 2 +- oem/install.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oem/RDPApps.reg b/oem/RDPApps.reg index b1561ae..f1434ab 100644 --- a/oem/RDPApps.reg +++ b/oem/RDPApps.reg @@ -4,7 +4,7 @@ ; SPDX-License-Identifier: Proprietary Windows Registry Editor Version 5.00 - ; Disable RemoteApp allowlist so all applications can be used in a Remote Desktop session + ; Disable RemoteApp allowlist so all applications can be used in Remote Desktop sessions [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] "fDisabledAllowList"=dword:00000001 diff --git a/oem/install.bat b/oem/install.bat index 711c814..87e0c67 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -6,7 +6,7 @@ REM SPDX-License-Identifier: AGPL-3.0-or-later REG IMPORT C:\OEM\RDPApps.reg -:: Write the Powershell network profile cleanup script +:: Create Powershell network profile cleanup script ( echo # Get the current network profile name echo $currentProfile = ^(Get-NetConnectionProfile^).Name From b854224ceff3a5d531795ccc013f23cb7004b85a Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:37:06 +0200 Subject: [PATCH 15/99] fix(ci): run lictool without pre-commit --- .github/workflows/lictool.yaml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml index 6f09545..5a6b0d8 100644 --- a/.github/workflows/lictool.yaml +++ b/.github/workflows/lictool.yaml @@ -1,3 +1,4 @@ + on: pull_request: push: @@ -7,15 +8,24 @@ jobs: lictool: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - name: Set up Python 3 + uses: actions/setup-python@v4 with: python-version: 3.x - - uses: pre-commit/action@v3.0.1 - with: - extra_args: license-tools + - name: Install lictool + run: pip install git+https://github.com/emzeat/mz-lictools@v2.7.0 - - uses: pre-commit-ci/lite-action@v1.0.2 - if: always() + - name: Run lictool + run: lictool + + - name: Commit and push + uses: EndBug/add-and-commit@v9 + with: + default_author: github_actions + message: "[ci] update license header" + push: true + fetch: true From e6e1e26c1439f916685fe7012d7269be15650816 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:40:58 +0200 Subject: [PATCH 16/99] Update lictool.yaml --- .github/workflows/lictool.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml index 5a6b0d8..aa64f82 100644 --- a/.github/workflows/lictool.yaml +++ b/.github/workflows/lictool.yaml @@ -16,9 +16,12 @@ jobs: with: python-version: 3.x + - name: Set git author to @actions + uses: fregante/setup-git-user@v2 + - name: Install lictool run: pip install git+https://github.com/emzeat/mz-lictools@v2.7.0 - + - name: Run lictool run: lictool From fd90dd837d52457046c4cc0716a760566145a42b Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:51:08 +0200 Subject: [PATCH 17/99] fuck this honestly --- .github/workflows/lictool.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml index aa64f82..0b03f23 100644 --- a/.github/workflows/lictool.yaml +++ b/.github/workflows/lictool.yaml @@ -31,4 +31,4 @@ jobs: default_author: github_actions message: "[ci] update license header" push: true - fetch: true + fetch: false From 2a70f7f3a257bae11830567015100f9dd74af68c Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:56:49 +0200 Subject: [PATCH 18/99] fucking WORK --- .github/workflows/lictool.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml index 0b03f23..ecaf7b2 100644 --- a/.github/workflows/lictool.yaml +++ b/.github/workflows/lictool.yaml @@ -10,6 +10,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + if: ${{ github.event_name != 'pull_request' }} + + - name: Checkout pull request + uses: actions/checkout@v3 + if: ${{ github.event_name == 'pull_request' }} + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} - name: Set up Python 3 uses: actions/setup-python@v4 From 86bfd8bdf121c658166ec03ab6da5a6fcefe3e64 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:59:58 +0200 Subject: [PATCH 19/99] fix: remove trailing spaces --- .github/workflows/lictool.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml index ecaf7b2..0b64f8d 100644 --- a/.github/workflows/lictool.yaml +++ b/.github/workflows/lictool.yaml @@ -29,7 +29,7 @@ jobs: - name: Install lictool run: pip install git+https://github.com/emzeat/mz-lictools@v2.7.0 - + - name: Run lictool run: lictool From 2211d9f78e84a947d1b5a248c42a8ed49cc9a4de Mon Sep 17 00:00:00 2001 From: Rainhard <79083189+tristanRW@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:19:22 +0800 Subject: [PATCH 20/99] Fix keyboard-layout being changed to US on RDP connection Added the IgnoreRemoteKeyboardLayout Registry Key to prevent automatic changes to the keyboard layout. As mentioned in (this article)[https://poweradm.com/ignoreremotekeyboardlayout-windows-rdp/] the rdp server adds and activates the US keyboard-layout if the keyboard-layout of the client does not match the servers. Since our client is on linux there are many cases where this is not given, so it is better to let the user choose a layout on windows. --- oem/RDPApps.reg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/oem/RDPApps.reg b/oem/RDPApps.reg index acb5aac..9d3f423 100644 --- a/oem/RDPApps.reg +++ b/oem/RDPApps.reg @@ -8,3 +8,6 @@ Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] "AutoAdminLogon"="0" + + [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] + "IgnoreRemoteKeyboardLayout"=dword:00000001 From 64478a87a49d6093f4d4f3a281bf0eecd2e6f977 Mon Sep 17 00:00:00 2001 From: chn Date: Sat, 5 Oct 2024 14:08:39 +0800 Subject: [PATCH 21/99] use netcat instead of netcat-gnu --- packages/winapps/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 3f50ce9..17a5435 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -6,7 +6,7 @@ freerdp3, dialog, libnotify, - netcat-gnu, + netcat, iproute2, ... }: @@ -30,7 +30,7 @@ stdenv.mkDerivation rec { freerdp3 libnotify dialog - netcat-gnu + netcat iproute2 ]; From e8dc55a83abd3eb6b275990fb19bdb589b6ce13d Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sat, 5 Oct 2024 09:55:56 +0200 Subject: [PATCH 22/99] fix: typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cf336b..1c98086 100644 --- a/README.md +++ b/README.md @@ -494,7 +494,7 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; winapps = { - url = ""github:winapps-org/winapps; + url = "github:winapps-org/winapps"; inputs.nixpkgs.follows = "nixpkgs"; }; }; From 9d455ba753806fb3c42835dd5632306ad81ddbbd Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Tue, 22 Oct 2024 20:49:32 +0200 Subject: [PATCH 23/99] feat: flake-compat --- .license-tools-config.json | 2 ++ README.md | 61 ++++++++++++++++++++++++++------------ default.nix | 16 ++++++++++ flake.lock | 15 ++++++++++ flake.nix | 7 +++++ 5 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 default.nix diff --git a/.license-tools-config.json b/.license-tools-config.json index c361afa..a7c368a 100644 --- a/.license-tools-config.json +++ b/.license-tools-config.json @@ -7,10 +7,12 @@ "style_override_for_suffix": { ".yaml": "POUND_STYLE", ".ps1": "POUND_STYLE", + ".nix": "POUND_STYLE", ".bat": "BATCH_STYLE", "": "POUND_STYLE" }, "exclude": [ + "flake.lock", "^\\.[^/]+", "/\\.[^/]+", "^(.+)\\.(md|svg|png|reg|gif)", diff --git a/README.md b/README.md index bc2a160..6783278 100644 --- a/README.md +++ b/README.md @@ -487,6 +487,7 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional ### On NixOS using Flakes ```nix +# flake.nix { description = "My configuration"; @@ -494,38 +495,60 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; winapps = { - url = ""github:winapps-org/winapps; + url = "" "github:winapps-org/winapps"; inputs.nixpkgs.follows = "nixpkgs"; }; }; - outputs = { - nixpkgs, - winapps, - ... - }: { - nixosConfigurations.hostname = nixpkgs.lib.nixosSystem rec { - system = "x86_64-linux"; + outputs = + { + nixpkgs, + winapps, + ... + }: + { + nixosConfigurations.hostname = nixpkgs.lib.nixosSystem rec { + system = "x86_64-linux"; - modules = [ - ./configuration.nix - ({pkgs, ...}: { - environment.systemPackages = [ - winapps.packages.${system}.winapps - winapps.packages.${system}.winapps-launcher # optional - ]; - }) - ]; + modules = [ + ./configuration.nix + ( + { pkgs, ... }: + { + environment.systemPackages = [ + winapps.packages.${system}.winapps + winapps.packages.${system}.winapps-launcher # optional + ]; + } + ) + ]; + }; }; - }; } ``` ### On NixOS without Flakes [Flakes aren't real and they can't hurt you.](https://jade.fyi/blog/flakes-arent-real/). -See https://wiki.nixos.org/wiki/Flakes#Using_nix_flakes_with_NixOS on how to enable Flakes on your system. +However, if you still don't want to use flakes, you can use WinApps with flake-compat like: +```nix +# configuration.nix +{ ... }: +{ + + environment.systemPackages = + let + winapps = + (import (builtins.fetchTarball "https://github.com/winapps-org/winapps/archive/main.tar.gz")) + .packages."${system}"; + in + [ + winapps.winapps + winapps.winapps-launcher # optional + ]; +} +``` ## Star History diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..0cd5241 --- /dev/null +++ b/default.nix @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Oskar Manhart +# All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +(import ( + let + lock = builtins.fromJSON (builtins.readFile ./flake.lock); + in + fetchTarball { + url = + lock.nodes.flake-compat.locked.url + or "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; + sha256 = lock.nodes.flake-compat.locked.narHash; + } +) { src = ./.; }).defaultNix diff --git a/flake.lock b/flake.lock index b07995a..dc621f0 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,19 @@ { "nodes": { + "flake-compat": { + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "revCount": 57, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -36,6 +50,7 @@ }, "root": { "inputs": { + "flake-compat": "flake-compat", "flake-utils": "flake-utils", "nixpkgs": "nixpkgs" } diff --git a/flake.nix b/flake.nix index 5bf6d8f..22c8b5c 100644 --- a/flake.nix +++ b/flake.nix @@ -1,8 +1,15 @@ +# Copyright (c) 2024 Oskar Manhart +# All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0-or-later + { description = "WinApps Nix packages & NixOS module"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"; flake-utils.url = "github:numtide/flake-utils"; }; From e630b5a89843a0fdae4beee6b694888e4f890bc4 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:03:55 +0200 Subject: [PATCH 24/99] feat: update packages --- packages/winapps-launcher/default.nix | 11 ++++++++--- packages/winapps/default.nix | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index 6e1b263..30982ff 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -1,3 +1,8 @@ +# Copyright (c) 2024 Oskar Manhart +# All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0-or-later + { stdenv, lib, @@ -9,12 +14,12 @@ ... }: let - rev = "eaa660d39bf3f49b136c98c87c35e3e12f118f8f"; - hash = "sha256-7lkx/O4dOdVqAPX6s2IkkM6Ggbzmz9sm++20BBeoUQ4="; + rev = "9f5fbcb57f2932b260202fb582f9adcf28df5f1c"; + hash = "sha256-cShXlcFHTryxKLKxdoqZSge2oyGgeuFPW9Nxg+gSjB4="; in stdenv.mkDerivation rec { pname = "winapps-launcher"; - version = "git+${rev}"; + version = "0-unstable-${rev}"; src = fetchFromGitHub { owner = "winapps-org"; diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 17a5435..4f769b9 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -1,3 +1,8 @@ +# Copyright (c) 2024 Oskar Manhart +# All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0-or-later + { stdenv, lib, @@ -11,12 +16,12 @@ ... }: let - rev = "07817afe0c2cad15c4eb90b5c94261a2b4d365d4"; - hash = "sha256-4KxssnSw1Xk6huKRpbRFw6NXIhjCoZYBzu/HYA1ngDM="; + rev = "c8dcccad08b3e5489d78f2aad034189d8654745c"; + hash = "sha256-RM9jv8oS8wKcSJpvkFFG9uyiRv9EaLQWANymGTXdl4o="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "git+${rev}"; + version = "0-unstable-${rev}"; src = fetchFromGitHub { owner = "winapps-org"; From 7277f71b9c3806a4aee3b9ad65815a7ea619c0b1 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:04:17 +0200 Subject: [PATCH 25/99] feat: auto-update flake weekly --- .github/workflows/update-nix.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/update-nix.yaml diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml new file mode 100644 index 0000000..8203da5 --- /dev/null +++ b/.github/workflows/update-nix.yaml @@ -0,0 +1,19 @@ +name: "Update Flake Packages" + +on: + workflow_dispatch: + schedule: + - cron: "0 10 * * 0" # https://crontab.guru/#0_10_*_*_0 + +jobs: + updateFlakePackages: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install Nix + uses: cachix/install-nix-action@v20 + + - name: Update flake packages + uses: selfuryon/nix-update-action@v1 From df54d0895542ee480218fb27b32b3bb094b62525 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:07:29 +0200 Subject: [PATCH 26/99] feat: properly set versions --- packages/winapps-launcher/default.nix | 2 +- packages/winapps/default.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index 30982ff..2af26ac 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -19,7 +19,7 @@ let in stdenv.mkDerivation rec { pname = "winapps-launcher"; - version = "0-unstable-${rev}"; + version = "0-unstable-2024-10-01"; src = fetchFromGitHub { owner = "winapps-org"; diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 4f769b9..27bc193 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -21,7 +21,7 @@ let in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-${rev}"; + version = "0-unstable-2024-10-09"; src = fetchFromGitHub { owner = "winapps-org"; From 2dafe2d7a1b3ebdaf44db411f50bf33ce07c77fb Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 30 Oct 2024 09:22:18 +0100 Subject: [PATCH 27/99] fix: iron out some more issues This addresses the issues in https://github.com/winapps-org/winapps/pull/234#discussion_r1813582112 and closes #299. --- packages/winapps/setup.patch | 56 ++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/packages/winapps/setup.patch b/packages/winapps/setup.patch index cb2c22b..b4c90e8 100644 --- a/packages/winapps/setup.patch +++ b/packages/winapps/setup.patch @@ -1,6 +1,8 @@ +diff --git a/setup.sh b/setup.sh +index 6aa9b574..66b2e920 100755 --- a/setup.sh +++ b/setup.sh -@@ -38,8 +38,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir +@@ -48,8 +48,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation. readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation. # 'SOURCE' @@ -11,7 +13,7 @@ # 'APP' readonly SYS_APP_PATH="/usr/share/applications" # UNIX path to 'applications' directory for a '--system' WinApps installation. readonly USER_APP_PATH="${HOME}/.local/share/applications" # UNIX path to 'applications' directory for a '--user' WinApps installation. -@@ -69,7 +69,7 @@ readonly TEST_PATH_WIN="${USER_APPDATA_PATH_WIN}\\FreeRDP_Connection_Test" # WIN +@@ -79,7 +79,7 @@ readonly TEST_PATH_WIN="${USER_APPDATA_PATH_WIN}\\FreeRDP_Connection_Test" # WIN # 'WinApps Configuration File' readonly CONFIG_PATH="${HOME}/.config/winapps/winapps.conf" # UNIX path to the WinApps configuration file. # 'Inquirer Bash Script' @@ -20,7 +22,7 @@ # REMOTE DESKTOP CONFIGURATION readonly VM_NAME="RDPWindows" # Name of the Windows VM (FOR 'libvirt' ONLY). -@@ -129,13 +129,13 @@ function waTerminateScript() { +@@ -139,13 +139,13 @@ function waTerminateScript() { # Role: Displays usage information for the script. function waUsage() { echo -e "Usage: @@ -41,7 +43,7 @@ } # Name: 'waGetSourceCode' -@@ -158,7 +158,7 @@ function waGetSourceCode() { +@@ -168,7 +168,7 @@ function waGetSourceCode() { $SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH" else echo -e "${INFO_TEXT}WinApps installation already present at ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}. Updating...${CLEAR_TEXT}" @@ -50,7 +52,7 @@ fi # Silently change the working directory. -@@ -385,7 +385,7 @@ function waCheckExistingInstall() { +@@ -395,7 +395,7 @@ function waCheckExistingInstall() { # Display the suggested action(s). echo "--------------------------------------------------------------------------------" @@ -59,7 +61,7 @@ echo "--------------------------------------------------------------------------------" # Terminate the script. -@@ -405,7 +405,7 @@ function waCheckExistingInstall() { +@@ -415,7 +415,7 @@ function waCheckExistingInstall() { # Display the suggested action(s). echo "--------------------------------------------------------------------------------" @@ -68,7 +70,7 @@ echo "--------------------------------------------------------------------------------" # Terminate the script. -@@ -800,7 +800,7 @@ function waCheckGroupMembership() { +@@ -810,7 +810,7 @@ function waCheckGroupMembership() { # Identify groups the current user belongs to. USER_GROUPS=$(groups "$(whoami)") @@ -77,7 +79,37 @@ # Complete the previous line. echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n" -@@ -1621,8 +1621,8 @@ function waInstall() { +@@ -1244,11 +1244,11 @@ function waConfigureWindows() { + # Populate variables. + WIN_BASH="\ + #!/usr/bin/env bash +-${BIN_PATH}/winapps windows" ++@out@/bin/winapps windows" + WIN_DESKTOP="\ + [Desktop Entry] + Name=Windows +-Exec=${BIN_PATH}/winapps windows %F ++Exec=@out/bin/winapps windows %F + Terminal=false + Type=Application + Icon=${APPDATA_PATH}/icons/windows.svg +@@ -1295,13 +1295,13 @@ function waConfigureApp() { + # Determine the content of the bash script for the application. + APP_BASH="\ + #!/usr/bin/env bash +-${BIN_PATH}/winapps ${1}" ++@out@/bin/winapps ${1}" + + # Determine the content of the '.desktop' file for the application. + APP_DESKTOP_FILE="\ + [Desktop Entry] + Name=${NAME} +-Exec=${BIN_PATH}/winapps ${1} %F ++Exec=@out@/bin/winapps ${1} %F + Terminal=false + Type=Application + Icon=${APP_ICON} +@@ -1631,8 +1631,8 @@ function waInstall() { waFindInstalled # Install the WinApps bash scripts. @@ -88,3 +120,11 @@ # Configure the Windows RDP session application launcher. waConfigureWindows +@@ -1687,6 +1687,7 @@ function waUninstall() { + $SUDO rm -f "${BIN_PATH}/winapps-setup" + + # Remove WinApps configuration data, temporary files and logs. ++ chmod -R o+rw "$USER_APPDATA_PATH" + rm -rf "$USER_APPDATA_PATH" + + # Remove application icons and shortcuts. From b18efc4497c0994182bbe482808583c11cc51a2e Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 1 Nov 2024 12:23:11 +0100 Subject: [PATCH 28/99] fix: don't change mode for owner but for current user --- packages/winapps/setup.patch | 43 ++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/winapps/setup.patch b/packages/winapps/setup.patch index b4c90e8..18124b6 100644 --- a/packages/winapps/setup.patch +++ b/packages/winapps/setup.patch @@ -1,5 +1,5 @@ diff --git a/setup.sh b/setup.sh -index 6aa9b574..66b2e920 100755 +index 6aa9b574..9fbefe65 100755 --- a/setup.sh +++ b/setup.sh @@ -48,8 +48,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir @@ -120,11 +120,46 @@ index 6aa9b574..66b2e920 100755 # Configure the Windows RDP session application launcher. waConfigureWindows -@@ -1687,6 +1687,7 @@ function waUninstall() { - $SUDO rm -f "${BIN_PATH}/winapps-setup" +@@ -1682,18 +1682,15 @@ function waUninstall() { + local DESKTOP_FILE_NAME="" # Stores the name of the '.desktop' file for the application. + local BASH_SCRIPT_NAME="" # Stores the name of the application. +- # Remove the 'WinApps' bash scripts. +- $SUDO rm -f "${BIN_PATH}/winapps" +- $SUDO rm -f "${BIN_PATH}/winapps-setup" +- # Remove WinApps configuration data, temporary files and logs. -+ chmod -R o+rw "$USER_APPDATA_PATH" ++ chmod -R +rw "$USER_APPDATA_PATH" rm -rf "$USER_APPDATA_PATH" # Remove application icons and shortcuts. + $SUDO rm -rf "$APPDATA_PATH" + + # Store '.desktop' files containing "${BIN_PATH}/winapps" in an array, returning an empty array if no such files exist. +- readarray -t WINAPPS_DESKTOP_FILES < <(grep -l -d skip "${BIN_PATH}/winapps" "${APP_PATH}/"* 2>/dev/null || true) ++ readarray -t WINAPPS_DESKTOP_FILES < <(grep -l -d skip "@out@/bin/winapps" "${APP_PATH}/"* 2>/dev/null || true) + + # Remove each '.desktop' file. + for DESKTOP_FILE_PATH in "${WINAPPS_DESKTOP_FILES[@]}"; do +@@ -1714,7 +1711,7 @@ function waUninstall() { + done + + # Store the paths of bash scripts calling 'WinApps' to launch specific applications in an array, returning an empty array if no such files exist. +- readarray -t WINAPPS_APP_BASH_SCRIPTS < <(grep -l -d skip "${BIN_PATH}/winapps" "${BIN_PATH}/"* 2>/dev/null || true) ++ readarray -t WINAPPS_APP_BASH_SCRIPTS < <(grep -l -d skip "@out@/bin/winapps" "${BIN_PATH}/"* 2>/dev/null || true) + + # Remove each bash script. + for BASH_SCRIPT_PATH in "${WINAPPS_APP_BASH_SCRIPTS[@]}"; do +@@ -1735,10 +1732,9 @@ function waUninstall() { + done + + # Print caveats. +- echo -e "\n${INFO_TEXT}Please note that your WinApps configuration and the WinApps source code were not removed.${CLEAR_TEXT}" +- echo -e "${INFO_TEXT}You can remove these manually by running:${CLEAR_TEXT}" ++ echo -e "\n${INFO_TEXT}Please note that your WinApps configuration and the WinApps package were not removed.${CLEAR_TEXT}" ++ echo -e "${INFO_TEXT}You can remove your config manually by running:${CLEAR_TEXT}" + echo -e "${COMMAND_TEXT}rm -r $(dirname "$CONFIG_PATH")${CLEAR_TEXT}" +- echo -e "${COMMAND_TEXT}rm -r ${SOURCE_PATH}${CLEAR_TEXT}\n" + + # Print feedback. + echo -e "${SUCCESS_TEXT}UNINSTALLATION COMPLETE.${CLEAR_TEXT}" From be5d020a041610d078858d73a7b3d76fef58c966 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:26:29 +0100 Subject: [PATCH 29/99] fix(ci): ignore patches --- .license-tools-config.json | 5 ++--- oem/install.bat | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.license-tools-config.json b/.license-tools-config.json index a7c368a..20e36f6 100644 --- a/.license-tools-config.json +++ b/.license-tools-config.json @@ -15,7 +15,7 @@ "flake.lock", "^\\.[^/]+", "/\\.[^/]+", - "^(.+)\\.(md|svg|png|reg|gif)", + "^(.+)\\.(md|svg|png|reg|gif|patch)", "^(fonts|WinApps-Launcher)(/.*)?", "apps/access/info", "apps/access-o365-x86/info", @@ -62,8 +62,7 @@ "apps/powerpoint-o365/info", "apps/publisher-o365/info", "apps/word-o365/info", - "install/inquirer.sh", - "oem/RDPApps.reg" + "install/inquirer.sh" ], "license": false, "force_author": false, diff --git a/oem/install.bat b/oem/install.bat index 87e0c67..3826f6f 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -1,5 +1,6 @@ @echo off REM Copyright (c) 2024 Oskar Manhart +REM Copyright (c) 2024 itiligent REM All rights reserved. REM REM SPDX-License-Identifier: AGPL-3.0-or-later From 3865e2abe7dfaf5fc540539e0c434dbeabe47ad8 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:29:56 +0100 Subject: [PATCH 30/99] fix(ci): update actions --- .github/workflows/lictool.yaml | 4 ++-- .github/workflows/update-nix.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml index 0b64f8d..6cda435 100644 --- a/.github/workflows/lictool.yaml +++ b/.github/workflows/lictool.yaml @@ -9,11 +9,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 if: ${{ github.event_name != 'pull_request' }} - name: Checkout pull request - uses: actions/checkout@v3 + uses: actions/checkout@v4 if: ${{ github.event_name == 'pull_request' }} with: repository: ${{ github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index 8203da5..b04be83 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -10,10 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Nix uses: cachix/install-nix-action@v20 - name: Update flake packages - uses: selfuryon/nix-update-action@v1 + uses: selfuryon/nix-update-action@v1.1.0 From c330e29f270707de26e3bb538521b2655f13d300 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:46:45 +0100 Subject: [PATCH 31/99] fix(ci): allow passing extra args to nix-update --- .github/workflows/update-nix.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index b04be83..53449fc 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -16,4 +16,6 @@ jobs: uses: cachix/install-nix-action@v20 - name: Update flake packages - uses: selfuryon/nix-update-action@v1.1.0 + uses: winapps-org/nix-update-action@v1.2.0 + with: + extra-args: --version=branch From 6fb023a1c6dc780d9c578f1c0553e8dcc2444977 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:46:45 +0100 Subject: [PATCH 32/99] fix(ci): allow passing extra args to nix-update --- .github/workflows/update-nix.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index b04be83..b5f725b 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -1,5 +1,9 @@ name: "Update Flake Packages" +permissions: + contents: write + pull-requests: write + on: workflow_dispatch: schedule: @@ -16,4 +20,6 @@ jobs: uses: cachix/install-nix-action@v20 - name: Update flake packages - uses: selfuryon/nix-update-action@v1.1.0 + uses: winapps-org/nix-update-action@v1.2.0 + with: + extra-args: --version=branch From fca2618deec92af4a079758c346e937a7ed8a362 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 1 Nov 2024 12:57:56 +0000 Subject: [PATCH 33/99] winapps: 0-unstable-2024-10-09 -> 0-unstable-2024-11-01 Diff: https://github.com/winapps-org/winapps/compare/c8dcccad08b3e5489d78f2aad034189d8654745c...dd89b2748a142f27854330a193f1ab9409892769 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 27bc193..2e407b3 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -16,12 +16,12 @@ ... }: let - rev = "c8dcccad08b3e5489d78f2aad034189d8654745c"; - hash = "sha256-RM9jv8oS8wKcSJpvkFFG9uyiRv9EaLQWANymGTXdl4o="; + rev = "dd89b2748a142f27854330a193f1ab9409892769"; + hash = "sha256-qDalJSit/5AC7C7DiPI4NMiX+5/g43W1fITkeHGTeV0="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-10-09"; + version = "0-unstable-2024-11-01"; src = fetchFromGitHub { owner = "winapps-org"; From 3779f507c97d4b40c0f5d438f71bbceb62806429 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 10 Nov 2024 10:11:35 +0000 Subject: [PATCH 34/99] winapps: 0-unstable-2024-11-01 -> 0-unstable-2024-11-04 Diff: https://github.com/winapps-org/winapps/compare/dd89b2748a142f27854330a193f1ab9409892769...5fb2c7b0fd516a957948b019ab6ae971cf2f5bf0 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 2e407b3..5065682 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -16,12 +16,12 @@ ... }: let - rev = "dd89b2748a142f27854330a193f1ab9409892769"; - hash = "sha256-qDalJSit/5AC7C7DiPI4NMiX+5/g43W1fITkeHGTeV0="; + rev = "5fb2c7b0fd516a957948b019ab6ae971cf2f5bf0"; + hash = "sha256-pRmA9eYBNjZsxXLlq1aPoIviFrMTQcbBGcJMRJmOiOQ="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-11-01"; + version = "0-unstable-2024-11-04"; src = fetchFromGitHub { owner = "winapps-org"; From 68b13b2da16c2a7f0005ed3c6cfa251a1c8fde8a Mon Sep 17 00:00:00 2001 From: eylenburg <84839316+eylenburg@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:49:08 +0000 Subject: [PATCH 35/99] Update docker.md --- docs/docker.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/docker.md b/docs/docker.md index afeccaa..ff13f00 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -112,9 +112,6 @@ podman-compose --file ./compose.yaml down podman-compose --file ~/.config/winapps/compose.yaml up ``` -### Installing WinApps -Please follow the [`docker` instructions](#installing-winapps). - ### Changing `compose.yaml` Changes to `compose.yaml` require the Windows virtual machine to be removed and re-created. This should __NOT__ affect your data. From 122053a0783a6e719d12fc51bb933b1b29d4d123 Mon Sep 17 00:00:00 2001 From: eylenburg <84839316+eylenburg@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:13:25 +0000 Subject: [PATCH 36/99] Add OpenSUSE dependencies --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 918a391..c3beb9d 100644 --- a/README.md +++ b/README.md @@ -298,6 +298,10 @@ Install the required dependencies. ```bash sudo pacman -Syu --needed -y dialog freerdp iproute2 libnotify gnu-netcat ``` + - OpenSUSE: + ```bash + sudo zypper install -y dialog freerdp iproute2 libnotify netcat-openbsd + ``` - Gentoo Linux: ```bash sudo emerge --ask=n dev-util/dialog net-misc/freerdp:3 sys-apps/iproute2 x11-libs/libnotify net-analyzer/openbsd-netcat From 8c3a8f86115bb0f9ccb1c13345713253be601c49 Mon Sep 17 00:00:00 2001 From: mindset-tk <53205683+mindset-tk@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:29:14 -0800 Subject: [PATCH 37/99] Fix logging Logging was misleading and the date/times logged to file were always the time that the app was initialized, instead of the time of the actual log entry. Issue was noted in https://github.com/winapps-org/winapps/issues/334. --- bin/winapps | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/winapps b/bin/winapps index 3030aff..da59492 100755 --- a/bin/winapps +++ b/bin/winapps @@ -42,7 +42,7 @@ readonly CONTAINER_NAME="WinApps" # FOR 'docker' AND 'podman' ONLY readonly RDP_PORT=3389 readonly DOCKER_IP="127.0.0.1" # shellcheck disable=SC2155 # Silence warnings regarding masking return values through simultaneous declaration and assignment. -readonly RUN="$(date)-${RANDOM}" +readonly RUNID="${RANDOM}" #Set a random int for the run ID to assist with logging ### GLOBAL VARIABLES ### # WINAPPS CONFIGURATION FILE @@ -162,7 +162,7 @@ Please run: # Name: 'dprint' # Role: Conditionally print debug messages to a log file, creating it if it does not exist. function dprint() { - [ "$DEBUG" = "true" ] && echo "[$RUN] $1" >>"$LOG_PATH" + [ "$DEBUG" = "true" ] && echo "[$(date)-$RUNID] $1" >>"$LOG_PATH" } # Name: 'waFixScale' From a061cf1ba2fd90a17884c132280c86c081c47b25 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:02:24 +0100 Subject: [PATCH 38/99] doc: workaround for setting LIBVIRT_DEFAULT_URI See #310 --- docs/libvirt.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/libvirt.md b/docs/libvirt.md index 6586913..4b88250 100644 --- a/docs/libvirt.md +++ b/docs/libvirt.md @@ -28,9 +28,17 @@ Together, these components form a powerful and flexible virtualization stack, wi 3. Configure `libvirt` to use the 'system' URI by adding the line `LIBVIRT_DEFAULT_URI="qemu:///system"` to your preferred shell profile file (e.g., `.bashrc`, `.zshrc`, etc.). ```bash - echo "export LIBVIRT_DEFAULT_URI=\"qemu:///system\"" >> ~/.bashrc + echo 'export LIBVIRT_DEFAULT_URI="qemu:///system"' >> ~/.bashrc ``` +> [!NOTE] +> WinApps may not read your shell's configuration. If you're having issues getting the installer to detect your VM, try adding +> `LIBVIRT_DEFAULT_URI="qemu:///system"` to your `/etc/environment` like: +> ```bash +> echo 'LIBVIRT_DEFAULT_URI="qemu:///system"' | sudo tee -a /etc/environment +> ``` +> Thanks to imoize for pointing this out: https://github.com/winapps-org/winapps/issues/310#issuecomment-2505348088 + 4. Install `QEMU Guest Agent`. ```bash sudo apt install qemu-guest-agent # Debian/Ubuntu From 1594b388c75006c13fc739337d613bf8a4476225 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 29 Nov 2024 11:29:52 +0100 Subject: [PATCH 39/99] fix: use ghcr image for podman compat Closes #337 --- compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index d3758d3..8d35cdb 100644 --- a/compose.yaml +++ b/compose.yaml @@ -14,7 +14,7 @@ volumes: data: services: windows: - image: dockurr/windows # https://hub.docker.com/r/dockurr/windows + image: ghcr.io/dockur/windows:latest container_name: WinApps # Created Docker VM Name. environment: # Version of Windows to configure. For valid options, visit: From 43dc3c29f4de3566d971937b2a903dd5fef150bc Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sun, 1 Dec 2024 11:54:28 +0100 Subject: [PATCH 40/99] fix: update nix-update action --- .github/workflows/update-nix.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index b5f725b..0878b8c 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -20,6 +20,6 @@ jobs: uses: cachix/install-nix-action@v20 - name: Update flake packages - uses: winapps-org/nix-update-action@v1.2.0 + uses: winapps-org/nix-update-action@v1.3.0 with: extra-args: --version=branch From a2fb11150667f6ab6abbbc1e0b43d77b0619ee2f Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sun, 1 Dec 2024 12:07:49 +0100 Subject: [PATCH 41/99] feat: cache action runs --- .github/workflows/update-nix.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index 0878b8c..1f9f76f 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -17,7 +17,10 @@ jobs: uses: actions/checkout@v4 - name: Install Nix - uses: cachix/install-nix-action@v20 + uses: DeterminateSystems/nix-installer-action@main + + - name: Set up Nix cache + uses: DeterminateSystems/magic-nix-cache-action@main - name: Update flake packages uses: winapps-org/nix-update-action@v1.3.0 From f3261267056f879f2285204191d534adf951b0bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 1 Dec 2024 11:09:29 +0000 Subject: [PATCH 42/99] winapps: 0-unstable-2024-11-04 -> 0-unstable-2024-12-01 Diff: https://github.com/winapps-org/winapps/compare/5fb2c7b0fd516a957948b019ab6ae971cf2f5bf0...a2fb11150667f6ab6abbbc1e0b43d77b0619ee2f --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 5065682..993a276 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -16,12 +16,12 @@ ... }: let - rev = "5fb2c7b0fd516a957948b019ab6ae971cf2f5bf0"; - hash = "sha256-pRmA9eYBNjZsxXLlq1aPoIviFrMTQcbBGcJMRJmOiOQ="; + rev = "a2fb11150667f6ab6abbbc1e0b43d77b0619ee2f"; + hash = "sha256-cNCnVjpAa/39GvWpT8Ah2p4oaQeAvkrN6P1yFUZENOo="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-11-04"; + version = "0-unstable-2024-12-01"; src = fetchFromGitHub { owner = "winapps-org"; From 6be98c5224c418fac6d2c535a213aa8a06737a35 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sat, 7 Dec 2024 09:42:44 +0100 Subject: [PATCH 43/99] feat: add /network:lan to default freerdp flags for increased perf Closes #339 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c3beb9d..361be50 100644 --- a/README.md +++ b/README.md @@ -368,9 +368,9 @@ WAFLAVOR="docker" RDP_SCALE="100" # [ADDITIONAL FREERDP FLAGS & ARGUMENTS] -# DEFAULT VALUE: '/cert:tofu /sound /microphone' +# DEFAULT VALUE: '/cert:tofu /sound /microphone /network:lan' # VALID VALUES: See https://github.com/awakecoding/FreeRDP-Manuals/blob/master/User/FreeRDP-User-Manual.markdown -RDP_FLAGS="/cert:tofu /sound /microphone" +RDP_FLAGS="/cert:tofu /sound /microphone /network:lan" # [MULTIPLE MONITORS] # NOTES: From 3f44fc3b0fbe1437f2fb39b178fee63f81e34bbb Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:05:23 +0100 Subject: [PATCH 44/99] doc: need to set a password on freerdp3.9+ Closes #305 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 361be50..b0b9f61 100644 --- a/README.md +++ b/README.md @@ -332,6 +332,8 @@ Create a configuration file at `~/.config/winapps/winapps.conf` containing the f RDP_USER="MyWindowsUser" # [WINDOWS PASSWORD] +# NOTES: +# - If using FreeRDP v3.9.0 or greater, you *have* to set a password RDP_PASS="MyWindowsPassword" # [WINDOWS DOMAIN] From c065c0decbeb732dc8d6542a119b7075fac300f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 8 Dec 2024 10:13:27 +0000 Subject: [PATCH 45/99] winapps: 0-unstable-2024-12-01 -> 0-unstable-2024-12-07 Diff: https://github.com/winapps-org/winapps/compare/a2fb11150667f6ab6abbbc1e0b43d77b0619ee2f...3f44fc3b0fbe1437f2fb39b178fee63f81e34bbb --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 993a276..a89e092 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -16,12 +16,12 @@ ... }: let - rev = "a2fb11150667f6ab6abbbc1e0b43d77b0619ee2f"; - hash = "sha256-cNCnVjpAa/39GvWpT8Ah2p4oaQeAvkrN6P1yFUZENOo="; + rev = "3f44fc3b0fbe1437f2fb39b178fee63f81e34bbb"; + hash = "sha256-5YOzr/Q7qfokQolTu285OPi+7cMvAiAsOP1o9nvyqPE="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-12-01"; + version = "0-unstable-2024-12-07"; src = fetchFromGitHub { owner = "winapps-org"; From 275d0cb975092189b501a3f1911529bbc1173924 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Sun, 8 Dec 2024 11:52:31 +0100 Subject: [PATCH 46/99] doc: freerdp3-x11 on debian needs backports Closes #243 --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index b0b9f61..50993d5 100644 --- a/README.md +++ b/README.md @@ -290,6 +290,11 @@ Install the required dependencies. ```bash sudo apt install -y dialog freerdp3-x11 iproute2 libnotify-bin netcat-openbsd ``` + +> [!NOTE] +> On Debian you need to enable the `backports` repository for the `freerdp3-x11` package to become available. +> For instructions, see https://backports.debian.org/Instructions. + - Fedora/RHEL: ```bash sudo dnf install -y dialog freerdp iproute libnotify nmap-ncat From a06a28b8adff63dff837a7d04664553807728629 Mon Sep 17 00:00:00 2001 From: Victor Molostov <86685532+ConcreteEcho@users.noreply.github.com> Date: Fri, 13 Dec 2024 10:43:04 +0300 Subject: [PATCH 47/99] feat: add linqpad8 and ssms20 --- apps/linqpad8/icon.svg | 1 + apps/linqpad8/info | 20 ++++++++++++++ apps/ssms20/icon.svg | 61 ++++++++++++++++++++++++++++++++++++++++++ apps/ssms20/info | 20 ++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 apps/linqpad8/icon.svg create mode 100644 apps/linqpad8/info create mode 100644 apps/ssms20/icon.svg create mode 100644 apps/ssms20/info diff --git a/apps/linqpad8/icon.svg b/apps/linqpad8/icon.svg new file mode 100644 index 0000000..cd0f324 --- /dev/null +++ b/apps/linqpad8/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/linqpad8/info b/apps/linqpad8/info new file mode 100644 index 0000000..99dab78 --- /dev/null +++ b/apps/linqpad8/info @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Adam +# Copyright (c) 2024 Oskar Manhart +# All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +# GNOME shortcut name +NAME="LINQPad8" + +# Used for descriptions and window class +FULL_NAME="LINQPad 8" + +# The executable inside windows +WIN_EXECUTABLE="C:\Program Files\LINQPad8\LINQPad8.exe" + +# GNOME categories +CATEGORIES="WinApps;Development" + +# GNOME mimetypes +MIME_TYPES="text/cs" diff --git a/apps/ssms20/icon.svg b/apps/ssms20/icon.svg new file mode 100644 index 0000000..656911f --- /dev/null +++ b/apps/ssms20/icon.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/ssms20/info b/apps/ssms20/info new file mode 100644 index 0000000..dd37fcb --- /dev/null +++ b/apps/ssms20/info @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Adam +# Copyright (c) 2024 Oskar Manhart +# All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0-or-later +# +# GNOME shortcut name +NAME="SQL Server Management Studio" + +# Used for descriptions and window class +FULL_NAME="SQL Server Management Studio" + +# The executable inside windows +WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft SQL Server Management Studio 20\Common7\IDE\Ssms.exe" + +# GNOME categories +CATEGORIES="Development" + +# GNOME mimetypes +MIME_TYPES="text/sql" From 152cd3e29275d5d5920281242826895e63f3e0c3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 07:46:01 +0000 Subject: [PATCH 48/99] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- README.md | 2 +- apps/linqpad8/icon.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 50993d5..f41d70a 100644 --- a/README.md +++ b/README.md @@ -292,7 +292,7 @@ Install the required dependencies. ``` > [!NOTE] -> On Debian you need to enable the `backports` repository for the `freerdp3-x11` package to become available. +> On Debian you need to enable the `backports` repository for the `freerdp3-x11` package to become available. > For instructions, see https://backports.debian.org/Instructions. - Fedora/RHEL: diff --git a/apps/linqpad8/icon.svg b/apps/linqpad8/icon.svg index cd0f324..79b88c0 100644 --- a/apps/linqpad8/icon.svg +++ b/apps/linqpad8/icon.svg @@ -1 +1 @@ - \ No newline at end of file + From 564d28bb7f3301d0d260513a40de62151ed3fafe Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 13 Dec 2024 10:35:43 +0100 Subject: [PATCH 49/99] doc: remove /network:lan for troubleshooting As mentioned in #354 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f41d70a..907d06b 100644 --- a/README.md +++ b/README.md @@ -375,6 +375,8 @@ WAFLAVOR="docker" RDP_SCALE="100" # [ADDITIONAL FREERDP FLAGS & ARGUMENTS] +# NOTES: +# - If you're facing issues, try removing the /network:lan flag. # DEFAULT VALUE: '/cert:tofu /sound /microphone /network:lan' # VALID VALUES: See https://github.com/awakecoding/FreeRDP-Manuals/blob/master/User/FreeRDP-User-Manual.markdown RDP_FLAGS="/cert:tofu /sound /microphone /network:lan" From 8e3a3bfc9c79b374a352d903650c89642f5138ac Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:06:30 +0100 Subject: [PATCH 50/99] doc: run install.bat on libvirt --- .github/workflows/lictool.yaml | 42 --------------- .license-tools-config.json | 71 -------------------------- .pre-commit-config.yaml | 6 --- CONTRIBUTING.md | 5 +- COPYRIGHT.md | 8 +++ LICENSE.md | 2 + README.md | 8 +-- apps/access-o365-x86/info | 5 -- apps/access-x86/info | 5 -- apps/acrobat9/info | 6 --- apps/excel-x86-2010/info | 6 --- apps/linqpad8/info | 6 --- apps/mspaint/info | 6 --- apps/powershell-ide/info | 6 --- apps/project-x86/info | 6 --- apps/project/info | 6 --- apps/ssms20/info | 6 --- apps/visio-x86/info | 6 --- apps/visio/info | 6 --- apps/visual-studio-comm/info | 6 --- apps/visual-studio-ent/info | 6 --- apps/visual-studio-pro/info | 6 --- apps/word-x86-2010/info | 6 --- bin/winapps | 10 +--- compose.yaml | 6 --- default.nix | 5 -- docs/docker.md | 2 +- docs/libvirt.md | 4 +- docs/libvirt_images/27.png | Bin 172329 -> 57719 bytes flake.nix | 5 -- install/ExtractPrograms.ps1 | 6 --- oem/Container.reg | 4 ++ oem/NetProfileCleanup.ps1 | 30 +++++++++++ oem/install.bat | 46 +++-------------- packages/winapps-launcher/default.nix | 5 -- packages/winapps/default.nix | 5 -- setup.sh | 9 ---- 37 files changed, 59 insertions(+), 314 deletions(-) delete mode 100644 .github/workflows/lictool.yaml delete mode 100644 .license-tools-config.json create mode 100644 COPYRIGHT.md create mode 100644 oem/Container.reg create mode 100644 oem/NetProfileCleanup.ps1 diff --git a/.github/workflows/lictool.yaml b/.github/workflows/lictool.yaml deleted file mode 100644 index 6cda435..0000000 --- a/.github/workflows/lictool.yaml +++ /dev/null @@ -1,42 +0,0 @@ - -on: - pull_request: - push: - branches: [main] - -jobs: - lictool: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - if: ${{ github.event_name != 'pull_request' }} - - - name: Checkout pull request - uses: actions/checkout@v4 - if: ${{ github.event_name == 'pull_request' }} - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.ref }} - - - name: Set up Python 3 - uses: actions/setup-python@v4 - with: - python-version: 3.x - - - name: Set git author to @actions - uses: fregante/setup-git-user@v2 - - - name: Install lictool - run: pip install git+https://github.com/emzeat/mz-lictools@v2.7.0 - - - name: Run lictool - run: lictool - - - name: Commit and push - uses: EndBug/add-and-commit@v9 - with: - default_author: github_actions - message: "[ci] update license header" - push: true - fetch: false diff --git a/.license-tools-config.json b/.license-tools-config.json deleted file mode 100644 index 20e36f6..0000000 --- a/.license-tools-config.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "author": { - "from_git": true, - "latest_year_only": true - }, - "title": false, - "style_override_for_suffix": { - ".yaml": "POUND_STYLE", - ".ps1": "POUND_STYLE", - ".nix": "POUND_STYLE", - ".bat": "BATCH_STYLE", - "": "POUND_STYLE" - }, - "exclude": [ - "flake.lock", - "^\\.[^/]+", - "/\\.[^/]+", - "^(.+)\\.(md|svg|png|reg|gif|patch)", - "^(fonts|WinApps-Launcher)(/.*)?", - "apps/access/info", - "apps/access-o365-x86/info", - "apps/access-x86/info", - "apps/acrobat-x-pro/info", - "apps/adobe-cc/info", - "apps/aftereffects-cc/info", - "apps/audition-cc/info", - "apps/bridge-cc/info", - "apps/bridge-cs6/info", - "apps/bridge-cs6-x86/info", - "apps/cmd/info", - "apps/excel/info", - "apps/excel-o365-x86/info", - "apps/excel-x86/info", - "apps/explorer/info", - "apps/iexplorer/info", - "apps/illustrator-cc/info", - "apps/indesign-cc/info", - "apps/lightroom-cc/info", - "apps/onenote/info", - "apps/onenote-o365-x86/info", - "apps/onenote-x86/info", - "apps/outlook/info", - "apps/outlook-o365-x86/info", - "apps/outlook-x86/info", - "apps/photoshop-cc/info", - "apps/photoshop-cs6/info", - "apps/photoshop-cs6-x86/info", - "apps/powerpoint/info", - "apps/powerpoint-o365-x86/info", - "apps/powerpoint-x86/info", - "apps/powershell/info", - "apps/publisher/info", - "apps/publisher-o365-x86/info", - "apps/publisher-x86/info", - "apps/word/info", - "apps/word-o365-x86/info", - "apps/word-x86/info", - "apps/access-o365/info", - "apps/excel-o365/info", - "apps/onenote-o365/info", - "apps/outlook-o365/info", - "apps/powerpoint-o365/info", - "apps/publisher-o365/info", - "apps/word-o365/info", - "install/inquirer.sh" - ], - "license": false, - "force_author": false, - "force_license": true, - "custom_license": "SPDX-License-Identifier: AGPL-3.0-or-later" -} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5be5a5a..04d95f8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,5 @@ ci: autoupdate_branch: "rewrite" - skip: [license-tools] exclude: ^(.+)\.patch$ @@ -51,8 +50,3 @@ repos: rev: v0.10.0.1 hooks: - id: shellcheck - - - repo: https://github.com/emzeat/mz-lictools - rev: v2.7.0 - hooks: - - id: license-tools diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 09c30ec..dd2bfb1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,9 +3,6 @@ Thank you for contributing to winapps! Before you can contribute, we ask some things of you: - Please follow our Code of Conduct, the Contributor Covenant. You can find a copy in this repository or under https://www.contributor-covenant.org/ -- All Contributors have to sign [a CLA](https://gist.github.com/oskardotglobal/35f0a72eb45fcc7087e535561383dbc5) for legal reasons. When opening a PR, @cla-assitant will prompt you and guide you through the process. However, if you contribute on behalf of a legal entity, we ask of you to sign [a different CLA](https://gist.github.com/oskardotglobal/75a8cc056e56a439fa6a1551129ae47f). In that case, please contact us. +- All Contributors have to sign [a CLA](https://gist.github.com/oskardotglobal/35f0a72eb45fcc7087e535561383dbc5) for legal reasons. When opening a PR, @cla-assistant will prompt you and guide you through the process. However, if you contribute on behalf of a legal entity, we ask of you to sign [a different CLA](https://gist.github.com/oskardotglobal/75a8cc056e56a439fa6a1551129ae47f). In that case, please contact us. - Please follow code conventions enforced by `pre-commit`. To keep down CI usage, please run it locally before committing too. See for installation, then run `pre-commit install` inside the `winapps` repository you cloned. - -All source code files shall have a valid SPDX-Identifier. For more information, see . -This identifier will be generated by a pre-commit hook most of the time. diff --git a/COPYRIGHT.md b/COPYRIGHT.md new file mode 100644 index 0000000..a7f4b5c --- /dev/null +++ b/COPYRIGHT.md @@ -0,0 +1,8 @@ +Some of the files are + + Copyright (c) 2024 fmstrat + +Many files also contain contributions from third parties. +In this case the original copyright of the contributions can be traced through the history of the source version control system. + +When that is not the case, the files contain a prominent notice stating the original copyright and applicable license, or come with their own dedicated COPYRIGHT and/or LICENSE file. diff --git a/LICENSE.md b/LICENSE.md index 42b6cbc..cab3299 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,3 +1,5 @@ +For copyright information, please see the [COPYRIGHT.md](./COPYRIGHT.md) file. + This project has files licensed under different licenses. The original project by Fmstrat is not free software. diff --git a/README.md b/README.md index 907d06b..52e93f7 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,7 @@ The following guides are available: - [Creating a Windows VM with `Docker` or `Podman`](docs/docker.md) - [Creating a Windows VM with `libvirt`](docs/libvirt.md) -If you already have a Windows VM or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the Windows Registry manually. +If you already have a Windows VM or server you wish to use with WinApps, you will still have to follow the [final steps described in the `libvirt` documentation](docs/libvirt.md#final-configuration-steps). ### Step 2: Install Dependencies Install the required dependencies. @@ -376,10 +376,10 @@ RDP_SCALE="100" # [ADDITIONAL FREERDP FLAGS & ARGUMENTS] # NOTES: -# - If you're facing issues, try removing the /network:lan flag. -# DEFAULT VALUE: '/cert:tofu /sound /microphone /network:lan' +# - You can try adding /network:lan to these flags in order to increase performance, however, some users have faced issues with this. +# DEFAULT VALUE: '/cert:tofu /sound /microphone' # VALID VALUES: See https://github.com/awakecoding/FreeRDP-Manuals/blob/master/User/FreeRDP-User-Manual.markdown -RDP_FLAGS="/cert:tofu /sound /microphone /network:lan" +RDP_FLAGS="/cert:tofu /sound /microphone" # [MULTIPLE MONITORS] # NOTES: diff --git a/apps/access-o365-x86/info b/apps/access-o365-x86/info index 13de9d5..3c6739f 100644 --- a/apps/access-o365-x86/info +++ b/apps/access-o365-x86/info @@ -1,8 +1,3 @@ -# Copyright (c) 2024 winapps-org -# All rights reserved. -# -# SPDX-License-Identifier: Unlicense - # GNOME shortcut name NAME="Access" diff --git a/apps/access-x86/info b/apps/access-x86/info index 9bf0bf7..d37673c 100644 --- a/apps/access-x86/info +++ b/apps/access-x86/info @@ -1,8 +1,3 @@ -# Copyright (c) 2024 winapps-org -# All rights reserved. -# -# SPDX-License-Identifier: Unlicense - # GNOME shortcut name NAME="Access" diff --git a/apps/acrobat9/info b/apps/acrobat9/info index 05d285a..76e8261 100644 --- a/apps/acrobat9/info +++ b/apps/acrobat9/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Acrobat 9" diff --git a/apps/excel-x86-2010/info b/apps/excel-x86-2010/info index 29df3dc..e027032 100644 --- a/apps/excel-x86-2010/info +++ b/apps/excel-x86-2010/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Excel" diff --git a/apps/linqpad8/info b/apps/linqpad8/info index 99dab78..c24dfd7 100644 --- a/apps/linqpad8/info +++ b/apps/linqpad8/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="LINQPad8" diff --git a/apps/mspaint/info b/apps/mspaint/info index 54e44e5..f9c91ad 100644 --- a/apps/mspaint/info +++ b/apps/mspaint/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Paint" diff --git a/apps/powershell-ide/info b/apps/powershell-ide/info index 6ef8e4e..4eca7c5 100644 --- a/apps/powershell-ide/info +++ b/apps/powershell-ide/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Powershell" diff --git a/apps/project-x86/info b/apps/project-x86/info index c20250d..5ebb988 100644 --- a/apps/project-x86/info +++ b/apps/project-x86/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - -# GNOME shortcut name NAME="Project" # Used for descriptions and window class diff --git a/apps/project/info b/apps/project/info index 0ac47a2..d5d904b 100644 --- a/apps/project/info +++ b/apps/project/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Gordon Cheong -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Project" diff --git a/apps/ssms20/info b/apps/ssms20/info index dd37fcb..f24d12b 100644 --- a/apps/ssms20/info +++ b/apps/ssms20/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later -# # GNOME shortcut name NAME="SQL Server Management Studio" diff --git a/apps/visio-x86/info b/apps/visio-x86/info index 8adeb7d..dc8a193 100644 --- a/apps/visio-x86/info +++ b/apps/visio-x86/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Gordon Cheong -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Visio" diff --git a/apps/visio/info b/apps/visio/info index a0677fc..a7ad0be 100644 --- a/apps/visio/info +++ b/apps/visio/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Gordon Cheong -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Visio" diff --git a/apps/visual-studio-comm/info b/apps/visual-studio-comm/info index 93f2f91..c99a038 100644 --- a/apps/visual-studio-comm/info +++ b/apps/visual-studio-comm/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Gordon Cheong -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Visual Studio Community" diff --git a/apps/visual-studio-ent/info b/apps/visual-studio-ent/info index 4c598c6..81cc124 100644 --- a/apps/visual-studio-ent/info +++ b/apps/visual-studio-ent/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Gordon Cheong -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Visual Studio Enterprise" diff --git a/apps/visual-studio-pro/info b/apps/visual-studio-pro/info index 30cf6e7..0c08861 100644 --- a/apps/visual-studio-pro/info +++ b/apps/visual-studio-pro/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Gordon Cheong -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Visual Studio Professional" diff --git a/apps/word-x86-2010/info b/apps/word-x86-2010/info index 5aa5e9e..70f3881 100644 --- a/apps/word-x86-2010/info +++ b/apps/word-x86-2010/info @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Adam -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # GNOME shortcut name NAME="Word" diff --git a/bin/winapps b/bin/winapps index da59492..92280e0 100755 --- a/bin/winapps +++ b/bin/winapps @@ -1,12 +1,4 @@ #!/usr/bin/env bash -# Copyright (c) 2024 Felix Bartels -# Copyright (c) 2024 Rhea Barar -# Copyright (c) 2024 Rohan Barar -# Copyright (c) 2024 Oskar Manhart -# Copyright (c) 2024 escapefreeg -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later ### GLOBAL CONSTANTS ### # ERROR CODES @@ -42,7 +34,7 @@ readonly CONTAINER_NAME="WinApps" # FOR 'docker' AND 'podman' ONLY readonly RDP_PORT=3389 readonly DOCKER_IP="127.0.0.1" # shellcheck disable=SC2155 # Silence warnings regarding masking return values through simultaneous declaration and assignment. -readonly RUNID="${RANDOM}" #Set a random int for the run ID to assist with logging +readonly RUNID="${RANDOM}" ### GLOBAL VARIABLES ### # WINAPPS CONFIGURATION FILE diff --git a/compose.yaml b/compose.yaml index 8d35cdb..e9570d9 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Oskar Manhart -# Copyright (c) 2024 Rohan Barar -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # For documentation, FAQ, additional configuration options and technical help, visit: https://github.com/dockur/windows name: "winapps" # Docker Compose Project Name. diff --git a/default.nix b/default.nix index 0cd5241..1d976a3 100644 --- a/default.nix +++ b/default.nix @@ -1,8 +1,3 @@ -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - (import ( let lock = builtins.fromJSON (builtins.readFile ./flake.lock); diff --git a/docs/docker.md b/docs/docker.md index ff13f00..ec03a39 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -12,7 +12,7 @@ Although WinApps supports using `QEMU+KVM+libvirt` as a backend for running Wind You can find a guide for installing `Docker Engine` [here](https://docs.docker.com/engine/install/). ### Setup `Docker` Container -WinApps utilises `docker compose` to configure Windows VMs. A template [`compose.yaml`](https://github.com/winapps-org/winapps/blob/main/compose.yaml) is provided. +WinApps utilises `docker compose` to configure Windows VMs. A template [`compose.yaml`](../compose.yaml) is provided. Prior to installing Windows, you can modify the RAM and number of CPU cores available to the Windows VM by changing `RAM_SIZE` and `CPU_CORES` within `compose.yaml`. diff --git a/docs/libvirt.md b/docs/libvirt.md index 4b88250..568ad79 100644 --- a/docs/libvirt.md +++ b/docs/libvirt.md @@ -650,13 +650,13 @@ You can then test whether the host GNU/Linux system can communicate with Windows {"return":{"version":"107.0.1","supported_commands":[{"enabled":true,"name":"guest-get-cpustats","success-response":true},{"enabled":true,"name":"guest-get-diskstats","success-response":true},{"enabled":true,"name":"guest-get-devices","success-response":true},{"enabled":true,"name":"guest-get-osinfo","success-response":true},{"enabled":true,"name":"guest-get-timezone","success-response":true},{"enabled":true,"name":"guest-get-users","success-response":true},{"enabled":true,"name":"guest-get-host-name","success-response":true},{"enabled":true,"name":"guest-exec","success-response":true},{"enabled":true,"name":"guest-exec-status","success-response":true},{"enabled":false,"name":"guest-get-memory-block-info","success-response":true},{"enabled":false,"name":"guest-set-memory-blocks","success-response":true},{"enabled":false,"name":"guest-get-memory-blocks","success-response":true},{"enabled":true,"name":"guest-set-user-password","success-response":true},{"enabled":true,"name":"guest-get-fsinfo","success-response":true},{"enabled":true,"name":"guest-get-disks","success-response":true},{"enabled":false,"name":"guest-set-vcpus","success-response":true},{"enabled":true,"name":"guest-get-vcpus","success-response":true},{"enabled":true,"name":"guest-network-get-interfaces","success-response":true},{"enabled":false,"name":"guest-suspend-hybrid","success-response":false},{"enabled":true,"name":"guest-suspend-ram","success-response":false},{"enabled":true,"name":"guest-suspend-disk","success-response":false},{"enabled":true,"name":"guest-fstrim","success-response":true},{"enabled":true,"name":"guest-fsfreeze-thaw","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze-list","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze","success-response":true},{"enabled":true,"name":"guest-fsfreeze-status","success-response":true},{"enabled":true,"name":"guest-file-flush","success-response":true},{"enabled":true,"name":"guest-file-seek","success-response":true},{"enabled":true,"name":"guest-file-write","success-response":true},{"enabled":true,"name":"guest-file-read","success-response":true},{"enabled":true,"name":"guest-file-close","success-response":true},{"enabled":true,"name":"guest-file-open","success-response":true},{"enabled":true,"name":"guest-shutdown","success-response":false},{"enabled":true,"name":"guest-info","success-response":true},{"enabled":true,"name":"guest-set-time","success-response":true},{"enabled":true,"name":"guest-get-time","success-response":true},{"enabled":true,"name":"guest-ping","success-response":true},{"enabled":true,"name":"guest-sync","success-response":true},{"enabled":true,"name":"guest-sync-delimited","success-response":true}]}} ``` -Next, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the [RDPApps.reg](https://github.com/winapps-org/winapps/blob/main/oem/RDPApps.reg) file, right-clicking on the `Raw` button, and clicking on `Save target as`. +Next, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the [RDPApps.reg](../oem/RDPApps.reg) file, right-clicking on the `Raw` button, and clicking on `Save target as`. Repeat the same thing for the [install.bat](../oem/install.bat) and the [NetProfileCleanup.ps1](../oem/NetProfileCleanup.ps1). **Do not download the Container.reg.**

-Once you have downloaded the registry file, right-click on it, and choose `Merge`. +Once you have downloaded all three files, right-click the install.bat and select "Run as administrator".

diff --git a/docs/libvirt_images/27.png b/docs/libvirt_images/27.png index 5e9a2fbf0e598c5e51d16a900e9171eae2bcd04d..1da95dbab68dc71572802af14e6b55ffacbb757a 100644 GIT binary patch literal 57719 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 CPVZ#^ literal 172329 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%0Ds4$OK2BZ4MqTKy85gB>}`m>oRMGT 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 z z78e;gksW2I3H-?FvPYUi+hw73?(ipC8@;M7@wC`l-Fh^BQYm*--Nevh`@0!Ogesw{ znGurUKH=O3%qVDOMk6d44Mt)|wwm6>MawlR29ZY$SX=tR9&0rfX720+qqYNzCQ#&l zWiE?u;18lvA-pE3p6$YNciQK)UZ1}Kx^LR{2@%duDuRf|!6<)d@ut>?gHfF3 z8}UCf6DkBHiBzF)g4Bfw`;PaS%8H3`5krfM5lNHErS!~^&^01H{S+u`d-Bb$foHkF z!yEneDDhs&G8@&2f>bWO2$gUu@l#% zuRk6;Zmmw9FgYEJ2X(?YjXJegsyTVu?6vEIYw)w+^!A7GOGFNk@q0f3@T_V%AU`fJiW{ow< z-8GQ=+myX>=xwsx(MxUHWFvtAQIPRz2rsm?W~AvnbKzuyX#3+SYk)z0?_K*<=JzH; zL$0)$wL9HEdU@**Px!0DW5JBp1Nm0J%OmGEJvo$y^#1}(Jc#UO1l;ojE^`DzY~L$B z?}X*TF}S|lulhkQYBIXn6&02)>qbBiRV}`98;e61ahCUN&-O^R(@HDANx>=E3_-)c zJn}Z4Z5+=ll&(pd{p)>o8l^1jLtAjd?|OIUeWtW{|4fDj(t|n|U(ThCYj6?zdkjn8r|057 z4}qyv9=?h8(f&`a655!OJZk1m+6fU?)!_D6Rw6W^F`Khvjgt*!>RU1Fl~uqE{bU~Q z`J*rJh)7AJ06&2N^xo(Jzec`XR$2%TCbG{C^omt71I70Em! zc>?APd*vuON>I*A?m~L;`nc%Pd08mp<=87TWBjcqGr&>}oV}jCtq;Ol`<5ixH)+#G zyOSx7qT%EIM-fbsz(kyFFDU%)SLb$6lidpZK){5aXb=Zg{-PQT`CyH@CtmNET!-A` zo9r4)y{#B$5yXK>x8pT_X4&28%*d6wK)3EiAV*8tW`e~*GZQ&s#z z8+ZYCdVT+g3+w1sjE;|x#&u!O0e`*{KLO&teGlWjg+k8%G1w$ zp7XRUUyS)mN*GYO7p--h%}@+)2HPGcRLd5)5jLSY=2wSm-1aVeFhpf`sp>K7e=#Z7 z(W&xdtKqM%u;G?WRdx9?u?D=&*B_)e<>=s_rlGs&%q8%#&7RXIL5IWpN(0igqF~pv z0$M4Sgii@HUnW1H9K;gRCHM|jIwWHN?hbHDU&uN`Qagcp*B0m!BeqgE&!&ixukVcb1kS zipNNl4M90sQ}}uDIo&FR1wVMd0BwBedgh%7x`pmnN5yo@LNaE*`cbb(570oC+H{%M7FxRik6*BRWzz;$IDB) z8Fm{VR2#(ioDOc`l9r*OhLU%$^m*7_Xh3QbaM8{O`S| zR)nUFD0ygFj-$dcj@MrR$q@L;2)~#QmZD)Vt~AHQgIBmH9uU)7e#cZh-BZgN$iYFr zDCRo8pLHUdK(cW~*j|KcM(o?90?VxGLGZq zuHz`sU|o|^+-lO*(71t-s`#TM`J$Evl92HN$OHR`7sYN^IM+bxoE{)vv|cXiOTbCH zk^w9~_usxn$|*tr|GVY~+jnhA|H1*zFlmwouVG0D)BEVvpN~%SzmDl2DRu7Bfnpsn z5$E=&?H7o~VEAaUfR~*kVuH87LCLtHyxXL_%1&5Wyj{EoDO%r6#;L&s9GOEalM81P5w#)?|{d6X^H>uLYYv>4#2IGM!k;Xwl ziV1uXZD3%nARLoZS~{%chST5Pn3R;XO{SLg+c>pQ>swa?Zj5|eb#Gf$Dq4V{Kefhg zA6MFb2}g*}2R0d+!8M#jxUXB|vk#1GZ}@?9)f^n-u@p`=E4qv8t;KcC*|zO|fH~oC zT0+9#v{1V%|yLU^JgU#Eu{>jq=YbK$|bW$=+1Ik z{=9m_nbU&mN}tcQ4RT?OphE3=NdGCEW~*rF=R#jBb~eIWC5+-Bo~TOs?XN+t@WA(? z^q^)j=g z%hSkmwqwOY<)@%6=F2bMi&N+A%8=jw8le<9o}LgX_Ots7&-|pCx*O#NR2P70gl4^2 zyp*4)@$;7X`$;_b;55Z8#X4HTqPNCeF~3*@9iiF`XYdD`3prjHLu2lthf78?_)!qtGf^w+^dZzbHPcMa7dy=4qpf*~a_+)n;(_wbQh{ly zr3Hh#+1$$+6R`(g{4lrXxp&D~akw2gy`1UZ@3Bnw2aM=!-bFMED+6QPcpQWQm`^&_ zA3e|P^Rq*f&hz<@xY9LuCH*TB-XKjiZOfp}6 zO2>JR4!<_2_`@fUmFPQuy!HjX>rrV7+L7{L(|RXtb?}1JMcltRoIGc|<@hnkY1QND zfj@Kk5ec-qrxPpHxbUo%!Y3%We#Y6M$n&1J{SKMbf{y zN93kHvBql*H-R|F1r_rV+m_0c?0~oJAftO?d-suXp*W$u(kkJKA-7^BvQpE|>KU{m z6AEqzhl~${A?c#T5rNS-e8Mi>-IA@&sB|b~%)-7nnH@g#AmgDg9la|{_gBT=zawGe zNS~f8I)}S ztgI^Mn+~c@d<@lrczgkg+g1#n4i`k=L!i^)MG$2qj^3GtO%VHkP}5H7A!7I1{~K!( z^IL*{g0(sE4Yr&}GY~%beksBTd6_2Bg-1p7!z3618G#qG(>S2ZI9PPHB}Go)quTuT zcVYamy@`h$Kxj$NrJHR~BRpL!Ic9I1OV4?(zXOJc3m6{68AHa{H4qLDk91BI{I`M& zUA9&<0E$Wwi+s!u#hUu|{c36lbklOzBrIUz#yhT|Q>a#ZJZkV)L}-zFujHG=Xt4!` z#^<+FMBIYSGC$fMhXF+HA3%kD)Ed5Rh*M*UQuT@Fg^27WhTPIV1MYXMg%x1L5z zF5chtys9QrI~v)ApYBeEsC+uXFIuTa`AgMfEwqXGb89m43UH*L{6F_Z)D72TPaa*I z+JDYk5<0@qp^sQOO2;e|H8i5N7Krs+joPUVC!@%{c^Tu zl2`qG2aY-K?+ML>J&`-2B22PRH|Eeknk2VDbkbbj$`v~QHY~(=1Mn{p7@s^g-gZGi zc{XKrR^92cDkDbr=}@fmkNYLQNot{)kCFz~DOP(?(Q0f#RGi|qau_aCD|1qTT*Qu5 zJzi*~TwWm`J!r*ePbf%RNvu%mH!LI*&ux%VCM>K^<68)wIX zLCe7@QX|x!vLB2haYHVIi}d!f{@ZfP&RjtMj43-OVjPsFhn4T-&G7(Xeq5=#ZZMJI zdZ9*LZb_us8%Zq9XOQaB|CGet_29DNn{w7~CUP|CgT?FUBwGl^Lv5R_z&1o|gCPB3 zTj$SI{J*X1dAkb1UZ{c71@RguGlJ>h9iUtYhKOQ6C<@^E!E&?~BgfmY4(|{sjfH;8 z3c}WTIu_dD@PpfBrX6R=E;5r^CZZWQUa?m)GwpR(LCseY%RuvY&Oo_2ud{|-PTw;8 zpsvcE49Nc)xYGL#>=>T$5tUg|<%v0k+W9iSfhy4;gMf$MyuSMl{4T44a~Ih)E4sdx zyF?fk$u2>I^1A@;#2IxgP^gwh^!qY?3u6r-V&S0 zTmOSRQL{Z??7@{OUq~-Ctq-VWbf*&4<$;Im)-WEzDJWX1^UMUFaXcvVxw#$8d8vNZ zYo+PRAM5|N$|s*%w3oy$=)>XvW%D-l!!TUYKu{NQd$g9wq*Dgwm$Oc`f#mru>zW<& zC5v)$T;TNLp71_j9O4{L_*mWhE?;r*FS(^0yQvK1p*udVI5k+mLetHZ{=Je&z7Z+U z%P-&h6<_lRkA6@nJioZnk^oUh?T_*N34ff{F}%cr1saL@QDu5RaxY#*Eu2hsNbc2P zUPSd1vVQK^S;NmT4eC0AKg%hF<*E=K_6J5D8f#LS&mUrN#6#^xmq(R2 zTNXV4C5No=Tkjs#+u;)OQlWtoIh952z^}JSl`g%wNTnN>E}7C_j^Ln7ds^+Ef|bs0 zW+p!4#)epjS|T`UQnquugH_1{_y*X9!AFwx`d2L@H;?DP)DS?l!N?b@KmR)@G^4-@ z>Qp`Q61b6>cxlf@RmYC88ac_4B`6Svc8L0$xjM}evY=R^Hr6p8GbSqV^#~qZRdM-C zWUeHDg47oA1h%smM$R93^4l2RK!~oBpqt5hX(hd#N8dLcFZ;;HvCoMHWFF;}qIdzi zkgRP*bwq_E_8TQ95bm$uJU~`0C_eS1wi@FkeesGUR&;Cs=-WM1G_#BqyrcI?Z^f>w zKEd>_o`YGjH2&j9e@UWE>InVXS~yJG08bB&o)E6tzBX*wKusUR+>cA5*7l_)vAr*% z)x~zvQ~pZ#7wpmTm+5GkFPugi{aDHd%*X_m?v#4>Ud9aE_za}baG_#cl^mIsQk09dA9EceeC_yerNkBZCeWlt;&JE+NHzi#zmmo~yuol`#PP*T zgE~3sJ8ym)TChk~dx_H&)Pg!utfR3BYvsLBa4pE#k;3mnnlRBA>CxV?X>3Re zM^4}xaUrvjSWhi0W+xJSn7HueN>Adv=g?UAKb}F&j*NwW&Z-Y68p8l|UF3nq-;we`oP9MK(XztlNPKE$@yk8~j@)ObuDur^ zSRc0Exzf>ZJxPO*pG<~5r>AFJe-HVs?z?klZ!8j)E_3`zKIgv9I z-3G{mu`PNbsIBrs9wSMC2EEnEq|Em_k;)OmBmfi|#ya>L6`jZ;`EP;38 zS+$^3%pZf2Bj%o|PZFpIXO|K^han3MfAb*_Kd9u}N$yAs!!P3xACQ{>EK4DXLq+Dr zUuFz}pYRd4lW_v+mEdS$25yR$w{wn<{qe}&CE>r*EepR5lDU_HW|@qxk2$09oW5K9pz4V~cVcO>h_Ym$>!Iiw>1mhy8nU%r@mbyuJ@w)eUC)U5pP9I4p%rZT*qz*PFK2 zs}&uHarctZQf!p15o^+*YeW3UMhS7>V9Dvq2w~bwhfcQQUhxD_Hhhv<3UT%7=#4tV zgXrvUGkqk-UGzl^A)aRTt&B>~VRx}(_^u; zL)Vrd2qf$94iofopNcr=6zEL)A(_1008W@$-=oaN5=74DD*nrq^+G}^7F9dv(2VI; zDqlz_9yRoOhIW@Yu;}ZP!-iyY8{mV;gv>?UE z3_W0q*$B;k&eJT3(rr}O3-l{C`9k>2GHb!Zi%ZMBuuok38knj%NjPTReL8Cy+lKuU zP@>hHtqX|ol}Yq5Nk!iL;~0kV)(z}}x1#&Uk_YRg z_#b9SxW(jjB zer4{ui+*B>8)MvD4xSbMa*sKv3eMn=t-08l8C`k`Ex;DRzvYQ^2M-xDp~`$FO`(R> zwsZfCQUrPUT`&?$`K{FLWIzJi+BV1OH zGEGE9+wlf-KFfaou>(UA`t3qRdbmWz5%L6N%x$y}&HjuJ$fGTCulA0Ljp%YQ0YgDp z#<*V(PHf1A7rIH+TB4nH9YQkW7iz-B;^Tl`LP8LRpMhu-<{2w&=u&K(NbZv#kB$PZ zr6R2gy0hBXun|NT#&e=CUj2jfQaA{N{5)NvErU-q5J`9T--dRmY-WLNcNl!y(MmWBO>zw4aE2>2)MzB?#P;5YeWNa#${iPblcfWJ8@r{ z#P9O%T|&{nIow-*tSt!!yz&=Co|}(*f5(MbEJlG8;bV~P)>_#k)1xAXs`s>uZvC1{hW(-omg}v{8@*^=NgR(Ja=7TR8l@crp2f=N zA%pLcOF*U&xIr%Z(uQo_>tI&lVzV$$AJ23-4ZLQ*(|M{jsd%&ynN{p>#BY1^$Nu1* zVY!&&$Q|lxa+8hO<7~fJo_}Q<;n-mnKU2qq8l;#4=-uA5Q;B~B&9x(8E||@d=QJbf z*44pbUWvdDB_v54e0{SR|NQn9IZ`%!B0!bJdM*RX0Fy+3%x}xgW}p-2Zfq`gw4v`) zb`WDaHvX{uclI_uoSe7Pg<@QG;u@z%|5y({EnpkzZxtN?L4sfL`bW+(Ovq4e>qnjm zE=AQ}RiMCRK9Pf2F1X8)HofrO z3b2PuMACh(R$ND}uhwr{T!RrOL_P29MIUuC`%De2=zSC}V zg;^W%n*KiMWfm;|BA&;5$ePn8(VVd>eLY1Lq1l{kwvIU{M%rOcA{!ln5KX z`z%g$*j%TeL=+2oV@P4b#3UQvn2&bkd$IBSvTqL; z4mTJ8snJN0(YU%JNY-h8b_rsCzL+Qwo@*!|d_@2Qzv0ufPg6$Lm3Oc`Bltrh{qk#?)_>Q ziy+>(2A`^@>R%zCdL%?_1XbE;sJZ@AtdZAjCX6Tz1_6@i2fmMc!<@$Q0L2Iu{0rP> zt9b6#pS@8SuJL8x9OnTZD*)garKB~jh7fXD2z>_|S2gMN1qidu7p5Vbc=y-X9yeRV z*POfnTizT`lG`25zOG`QYlu;#w?N;2&GvKs=PqV0=Ir^mg`ESVoHbBq(GvA%Ha^Nz zhbLY`p8jg zZq`F~TKcQJ4VLa3)@+ElI!vgTREv|}3<-4gNLsccP#1U0B|k2iKbiA5d=|!cy%4`g zcJmjEeX||-c83{|&e=(45H3|kmrF8jN3+*Q#Ahas(I{BFX#E+&?w5QYw7lXKOKT!Y#yX1uxsB}=|>4lxcbrJ8|v8F`X4J#ZuT?a4L zda6q%2gOTXA}F=%)VCa~cNDDeZPaz20mFoRN8XZo^bzWC*~$$7qCWzS?^B@bNeq=e ztsbxkQ=@j9Dc!+E3sDI5{2Yj=R4_hfanR-gidv`^pCi#|`ZW<&QNcX%vqxV;K7?Vy zG8&|<;iXy?^U7E@>v>Jz{PjtN?GK9L5JMV@S;+nV2 z>qZX}-%(cF5Oy|{QY#PH!H%Yci>5@5rW$oRhYYj_&y%%OSqPWd=orf?U<#w$3IWB8 zb$}^))_$}zhnamPLI8;6CI7DC_avhg?~h^Y{art13`>_ByU;|6Ai%_> z<;SYFyUYoB>EQ$BjTTl4A(9Ih#bj)1nPI)!R8az8{ z-na)J_I*7Nc%lm7p_W`DS$*m}+zBbE8lwQ1Pt)#^UBOOd^Ja-%lm5MiUT)!miE{F=M#ia%h}UOT#x@fcbC%0_>ubxP z?EU;St~-ylOuMw962Li1ld`$;se$D0YAcQuZ%GuX#yo676E(Yu6eylCXL(85M5T4= z{nUDYC$$~L`8fxmTi0J9{~x*3r^IPoi(JGNwbo*^I}ibd%W+xkSz){=-31-A3JBkK z?oF3+`&>KOEw_>|F!;)H`mC3dIqjMgUeC9AXoUPja6>|%I##&)Q#OdkjS|RfR$Pm< zXO1540yNq=`Z4mXsjn_3A=(O|rWT&=w*8DHu*+Z8$a@E3Y!bP&(%&Ln72gW*fOF{Z zU6<44E_k&lJdBNtJQ=kw4{kvAEsyyAK2Q90?GHSe23JBN5{sY4I)nl*C4B?U22`{6 z<%m_IK(eyJkBfuw{p#9!(S?bmy?1#3)h>8pzRWMpLq+8WIO<+OYeO%rd^;$ZQv)Y& zLz$yO1#xJE?B~?&(Gi64T*eY#=mDbJSe?#10P{jg*ihrv&c_Ym2O|OB zP}M+k3TjtGZA^q7u0Mz08;SviLUy3sY^43|FhY(Nc(@ES-f1Lqlg7}J##r2slsM%> zjL3(K-d7p>H~igpm{nFZw5L8nVDQzaTnwUv=42_)W}TdQd$Q3Y_PI!gi+3kXViQAc zT7zomEU%iyY#pIj^(* zbTr{#6BBdm>j|GNEC3&tXKCX*0{`u0;gSjcV7B-ytr+X;DL?Qfx8<;inr||H-zdm`E_Xi}^a~heOFv$ey$pNvk|KcV8Rp*waz+XtcOZNM> z+{#aK3OsfTmn5gB9XjA1MZYXPXZsH!L?IC$aV98op8%5y=hKZ>oUdiA1U5D|0d9#j zOWQED*GNj-Ps&yYHHmpDi$ec7@uiL;EzvLSbiI||s&zkNsr7uH$N-ayPzHy^_OKMi z46K@%Il(p$PyF%!D0d*F0b;(- z76Tsv(}Uxcr-v2Y4nJ{5)%2ZRCXni0&o>>zNCu_E0BEeoiZ8KVgI(8WzjM0E(c`tA z6F`j0^y%^85*9B^u*{vD}}6W^cXjs1P@ zyZBquFA+@2L$Ugu!bfh_n5>l&ReVu--^>WHf6}NQ0sn667Bsx?>(aU52pA@A{hZo_ zZady>`)BLof=Pyk9F3OMoPkT7HnV>Ma0Dl%S`%~ zgb5`%X=@p&rp^<4=NjT;QWNQJ_Ki1P|dEON{VBXg=1--{Z4e7h@o z8~D_&KdI?X9`O~)U?bEj5C5aKmaKW;uxrj>2qmMPt_p`q^u_PjUuO+G3@VaP)I%I5v%#|+k0@PaGo2A zJ!#aDOKQ+z`}-SO4cAbPZ?dRd$OTr#vFO&DIa%DUb_kX!6e(ZI_{<9n*t~1}IdXCS z3n3^=W$`SN1aN{}c-QRu{fJ#lQ!{8ZO>iAZjLgi;ATw|jF((%JK9l4P+Ou8DqSt=8 z(8ZLNGhnY#H}I2)P97k~bi7j`{g*f6adNQZ$mi`|e~@LEEXJ^u+8-DRE6j8-kp52G zd?zxBD2yZ{$5uQ>BF`)Br?$7vrT#&NGh5Jx>Ac|r_z72l{RH3T(aMo;WpVNGgM;VZ z_o8EfY3RA4^!l~a`Hse4-R6Clr*KLy)bjH3oc=x4{%BzeHSs2N!A0Gem`aD8lbe4< z#t4$72783`I{}rRPh5;@W{QhO6&0zqQj7n`1;`eS(hkYKv+=)an$kuR{w-Z6>39Ee z(d!Lnm|wzH+#<$g8v`EigUPF~ijMTV$puZSbbZE%FIY{6SitF(Ivk6l8!$);0BopC z9`A3&1&*rC2Dn{|wY)AThgrSs44*F#JGM?v5U_C=94wg(&K?24_rd!8pdMqV{I$Lu z&YNQ1xVC+EiPut)nQllDrbiQLkVvMFfC{gwhg2*S$+8GQ~A<^ zV>Fp+Wm=S4WwMz%nF@x%jueMa-IKQIXb70UZ=R8dEZJ}@6TnVP$Y~V>GG1==1dND+ zD;Ga_xE#zm15R;hV~>}DjU|6Hx%$z~ z%Xy>r$8jvoQk*V~`6XfVD}z%_I1d`QNkfhjn-{>%q)9_sZ_oNQ;{XeS0>&1Rcym;?-TB=Fi+4zmKFIn=M4*}f)6 z10DM(KGBtw_@ROtpNx+BPB+{{^W14(GZ zF26O_b6T88n|NdS@23|y@km@7GZm^yq5x+DVO^4EBEh*!$PR5(%24`Qr@p%|Pbc@6 z^-%Q9+C@$QbJI~o&Yv`^%_i3rNG^49>I5P8^IZ4c5z@BmYajn~m8l3XEpgG6=P&cm=+yxysTSkq%`-4G1yu z9w7gm%;;5ady)Jbk{_$&bL*&@T+usT9sLGWhe5Xx;-Y_-81wLxW zksz22iuULasSWTB>!6F$@TWGH)8rPFi-vI&#>tg^f-10K=#p|oSc$-w& z&pJ?b3dH7GEuLQg3~HG!<*9nNO)tXdae00amZ|DC14-73*2 zXS-rHO2|O6Aq0?hY5P1FVF>AbHVnU^<2KsmQ&_Y^rt^#qEf$RyQXk(xpE~r^0VVGL-U|qXN>r{7wM|3p?wg?}oH~-~G4=)}0i;9O zP;z=aEA0&8d4a7y-tS`!Si)X19QG`ed{g{I^@M%Fsg{CD7WveE8tw^JuuAKQD!e_2_v^#X{T8D;Wz*o zs8#viU6Pk2KPSnEOh9{rTdx>~_>0fi8l(9q_>@0`S7uu|j*dvXNS4+WE7J9@G#2|E zmH0%fiC)l(%T)9rOg zH{QT~*R%taUWQiRR)HyfZWM-16$@;{d9}6p85tS6RmRfYm%Ns+Uhku}aKNVJHvK<~ z?sGc$Tu`%P^J+1Iv+CPRZe|K;;tXm9_+r&Cy8;NR3SvfLuyv{-V$glrA4A&F5bc>6 zGZ^9pL*ZW25CM!wlqXZNCm3~XP`Y!B6U2!5c{Ky3y=*8+kCK&eNSFHcTMLlQ;*cXP$i z)H`_QsudAH_3HG1N-Gg!_G!jB}_9On2!E>c-8w>hU~4Nk#gI>CH=b z3OXiu$|ZQ4jTbXFt{+Zl&*rSh8jldlZ?#5_sVmO{MqE3++0I)36U8a-=O^*(j94Jb zZqQ7iCU$}dEWP-wtk0h%ALnKrr;0VKtgWRrG;jqRm!lP^eEAgA{vAu@JXVuK$@OcM zI5AL>NtR4#S9<1>A`jGY`>4tBA1?-y^p!WP)a^~`L-NIR=9(8{W$d_3w%BjAV7D;qomEL5zqoVS~?PFM9KMTauib&n;D>l%@ z(0*%`i}#5uua5BOM~hL~Y_1_iP9f4?Hl>LMrAT$=GAVOw@we(3il!hMTSgzC>uhjr zY~UGE0j`N78KT4>C%`z&_+YMD*pTJlT!=@S5!W`VD0%XV;ELeNE#;8u2+>VdZ#3Ar zAqv|_`4DHllnbzF^k9-6ORWHziKN}ee|^uCy#iT3g*s){D~2k&5$nbpaUO;K#8gm) zmwcowYSyh~s2X21^nCQ4D4s&$=)h!C3jF@tHAH5Ly%Jt;ken$VppxaK&$ z(9Ve@hPS%9vbXNOD?=@tv7eS}{-2~nZ)b3zCsCN0lFQh+OSC6$AhprDb5@@RMLJY1 zKy`UKsZ`iW&uBTm1s5hFs*^9h<4V*D&A$2C7U7t2o##Y9xJgxCs-BLb%I9yx!u$@( zcrMyY6@7&=b=7@;$LrmJ2wPbdB5+Ml!nS)TjTbsPZ^e1OdL_NMm6@t5LvJ@~M^9I} z>Kl;RY<53zDf>fi!xjWl1Wfs`o^Mu#Drr^5UGQRe2er=s9S)?yi0LnsD9>0yVq5HS zV?o)rdyG}Eab(k7Bp22|7)d9;Dyk>@FTVA2%ner*(bTzQ?5O*)64ZRvD;m2H>D3k$ z6MOp36uyw2=le)OlFxnE_E>g$SC_S9aBccd_&%R0gh>^T`vfp)`Toj=P78oC2wDhqxHIy`np?qMW^uS%+_&WKtxsKbsXdQWL|A z7G9Xd?5IL2T8b=Ih~X%ZME5swK|M=sdC(^E=eKx%Gy@g{j2n5PM`FkW z*y09-Y2*JtY`t|TO9FzqSKT8 z;5}6cJ9^$gVK%(?N(l>FrIWZT<%_S8yd-JSI6J9VZwa>^&8;#gOd*-BFbZ7162 zB77f#nZ~zb{hXg-J)e7&D*W{S3tb3mWh!U9TDmIA<>bpGAsxjcJsxjZlb|yd>2SOy z6BTkt-@!?UiA4?dhcEP9B6-H`uO7~D#k+==B1$MO5zpn`z z9LZRs3L$5R)!=aKp5+f0ymkWzf_squBiW%)=m?ogHzs{CJdzi;UFAKeIfGj&gGI68 zBoL|+VyDXuh0Y_3{x^|=H;Ox`KOc;tF7Bp@4~06dcz5v~2H@KYU{J31dSi$(SH392 zj)*R=Q*?Y#$YLeuxlD}Odrc?wZ$L+&P!ZhSCy$H+^WQ-li&rIS;x^`2|9S4vy-nG( z@+t79cf^M4Y_0bzBq(JX{G6%zohnBVQdm$GRN@{@Qvz(H+)Xv zOIxng~ zQ@C;;my^T+pLlA>C(tcUYv&D@(bl%|zww~LaH~DF2`tu?CnSiH83>I{DS&vVWr<=y z$TJiTbg?v1J~qc>3A9ma5j|}ZU&B5u$7Fn_C$sOdieg87T=zn;Y9ee7REiaoKG4%; zAC1O;zNunkwBs`g+YiFd8gK9Vt=U%`R9LcM`_$s#G6`_Y#K24cQkZbf?3_phV# z6P!U?WAnibL6Pe}-Ne^Trx}Dm zsUo+^RDrs`@+*3MgY7WIVcR+JCUoOXnOzHe&&s`@j{DTVmpDBtsKVB!AQm5ADlk(l zy{*K-&ofA(L8)tx5iq%s^21qz@f?O<#Bb6GEhX#UU?$J|Be$nD+Y=0q;Q$U~OYzf| zWllcci!z)o`)`D$D0_sc->0UcKr2s1X=ysJ?WT!1GgLb+l-t+)U3v^;2y*O8-OZ3| zd^|jdnMEBYq!q|FyX+-SVmC>L?{^ghL#Tg-CUCDBm!q3zYl?vBX%TLY)-BNjjV5LRQuu<_Fwzln^A z@%)$0qKHZZL_x}~7gq4bEe@R&?5(h)l9d&U|HaSj<#_Sk7Jvk=Ob=#?67Myh(pnB> zraLu&b7CN!KO*yQe!Ol1P?dIpMiR7j7tVj++GxnfSvDDY+XitFVXPm3fd2&WBl+eXM9({^RgWLKa7>ympPs_v)bgY`-1fwUOj* zqjynDd>mL}MqqIkE*KfMRE|Yx>1rkQ`)Z3Sl)yr(R3U90du3m1rijmh4Ch{`( zpIhYP%90QsC`M~`;~|#P)simBZTGg<>Bm;qOuXOHW~RN%ng<`Q7mliM3;tJ&G-#`B zTtyMjE&JdF!ZGLaVNRLDn*i7*t@#-5dgz{*y!&tTtv){kTv9^Uz#! zMP>?0n8G(kTZRq1cT&L`%DD+}7%I8pkND146-$mywX}3`Hf@@>t_){-b2VuL9odYcrvKAAWT*WyS09`w8fthX&b4MBlTn!=0cLe4uu|()qOi&G|a$ z`Xme<{^0kQ;pHS{S|rHVuU~UYK$;`$*p;6kHN7(YH}v+<`aq4kGa0k}vQH-MU`z#d zuH4TvS4jp{5%*}7s*)x(>BYkZJP~41<@}_PWK*drB@rl>;epW2OIHrAIg-{UTw~LX zy{4AXC@b@gdZV;+x(Hu;Vr}39BH$o{A@=FRM-u*MfjBXb+>dVe99-jW5H>mg?B$YH zDej6JJ=xpfaRZe{1u0Q&RGbwr0g2=ElY^`)Mw&=Ldiiizy1SFyI2Occ5`TIay#Q3o zW6?tZiO*_7H0rc(2HoXXKr4582%=4L3qWz47h8g84TSHO{8anQQ%}z^-1bmYm3XAn zrdAw#z2KqrL^XcdacZqSE5Bw{wT>2f$4|NHy^-%u#&Ctt~tBQqu`%dHr&rQpQOH2Kl z%0yuI)WK(GjZUQ<75){K{KH6xek-}j$Y+j{&m6l?LgMTAc*dhknWHt}7j&R~dUuAP z?LSx?M2MK-d-KvP8@7!z_JB#`Dz1{iOY!f}0U7-_XqHZ^>4a{I`8Ea*GvbRU`G(sEbyj7MZi!M%ywc(vSn>(72~ zkXz5`;@pt7EBaJ)CS5BZJWnw-?M>JZAe7>}1MERmADJb~Lb739SG$gLnn6stIweCU zo5CycvCfH8Mx{w*KAPR?*HnLKfAfT zMz*?{a>@+Y+4HskTc8DoiH50^{Y{V7_@jFxJG&A0>C(BPPziJ?g{dEr1$Qv$+Tcf$ zMC@x|MFR&IrZ(CA(dPL@qe}>c2TSw%k`*E}F6_5z`)}JF0);)90u-mA#yO8J3KIyY zLbOaKW6*X5KV0epDSdCC-z>>xs_WCrR_wK1%)L^%lqo8GnIY7?VfsvzRi=Mq^T?(s zo+fqXN6(x_$>(~4JFb6ipd``Km-BZ?(96DKq^I7*mtBtee3>3c_q9t;pG%yi(rA$W z+Yl;|5rPZ2`%q{(>ElS5DYY2JA+-Z#8SZ5PE>CzvL+dBeh@H*uOEhu-L)eSUMY*`4 zm=6%=ke|NDpWa^+kcdNfHjd;~`k3szeL}giJIg@TDxjW*m<}+OC`!Y59WqIhg)uA= zfY8sMLCo5|>6||pd$35HBY-nmy~AP5<_16}m7Fzsb}fs)m4J6!nY~C7a_a(3`-0=B zQogp;VY+A+5C7E|Fg*SfS1g8af=b=%LK2iq@$>mDQ_m32lqeiV(^N%oh!rwBj!+E9 zN^mESm;a0=Sm((giE^WBlR=LCch>+x`!^yFj7;Yih^yzB`FE&Ugi$PGtk-!HT%}${ z==Io5B|TkNE_|3p8MP<8fxW!sVJ$)SSoNQaj*L}X+2I#=Zh-S|wmK4N;Jsa{=!(pD zA^5@Vl+W#AY5C#&W&OBR8y{XnUs%_8sKy1c7#(A9&+J9T4vykj@~VcTCNuyO1b8`a}Z&rIu@N%g=ZE<{mx z9o2#w+wJ7p9-U8x-}rN@9oLiZ!;G8f1HVPB_8R?n?nf=X8b9=+kJM zs5&zbGCeG*iD`sd631sErPdLEDxn`DR5M?^~RuIk|!KjARr5QDx8wqE*ovQGF|^hTCDZ;e9qp5 zt3!g^r*|_>FcuQ}-0^i-mpul_>9s zL=6{BmrfQ+s22?(xNs;}t`dHSwPmR2zA=G>`b%I%E(tMgu4(UZ9~k-wc9)jA*gZK2 z8fgss1$!IdNiTG}D<^T>SATXs0_AGp{#48@ss7KLpb#s6z?DApq=kQr=C5XiMylD|cc&q4`W7hwn`Sk$<&(kUdj*FbeNygvV< zOdmR*d~&rW$@YQ(H>X%^l7aD$BJ1Q4MfAs22nlg|%U6^iE|V9Zu9PuNOC91*duWV< zc`><9EteB|DUGk~R#KJep=N6b!ryMmZmxb#{1PEj6Dm7{Aigg-I^2HD>)PAdQRGWk z;7jiSs8o`MW(6Zds_IhFTL(Gz)V|s`8pQ~;#Y-LPE!6Gg7I65SthVi`T{@&GC4^Fz_D2Tl<6i&}C~oW3g+H@hH*~6Xj%T zxC(k?qH*9xGIgLy;<|)SV9*12GG$l_awb0$5gtrglz^!KN10IJk;@1p%YaJQt0>ey z7zXCh5)XO=FVk1|G*apmbH;iH%x+VYfq;M?xW7Bq*04khj!hIN{ZrNub65@Qy&l%- zLVz?nI(i~_?z8yzmJcH zgM3W_s03=`PX#s!>(&LZM!utC9Y@R*hA|)k#Qfcwv`}IG)OhB?6OU$A{63a@t4MV)USy`Sv zEtMsMj~Q!04h`ERy6H081%(Q$uN?>C*{OCQ$$iwJ;=KpRJArAqZ&LV(42Wy4-_=16e3U%qIv9S>n2qqWm#Atj? zH2iGHvng5l%D+3Frd7mpRF*xp&F^%M-0-$n(?2*o9R29@6oE7&KHZ&5 z8ipyly9=^&Z~!4zZ{{n+6mM;99ZB2rOW*mi>DHQU4qOHuC9WF@!C>%1$yP@&*!FQa zznTxFc@C1O#F}$%e@6>!x-3_g3eCrJV^K;uaJ02j;!3m4jO__En^$ZSb;+bxj1>l& z1>%p+JTqzA! z;_*FCabtU1-roK`ShC@O(L+0wIOrhu0=9XK>)*Sdd^S@wu?8RrGDPa+bHdY^b)Vg( zB~t{Sbk@o3j|7>lab~1_wMtm<(*`E)fn$8VrJtl)xPNsxY`*!UF!yHDZF<_@+M4w! zw%%i>Qp(lv$EHBF-Bj@It^@cdU%!1@0euH^dB54uSlUlaO{Jf%TT97Pt z$Sqk!OAz=bMT!m#-)<{AyN*2)otT=qCH-U2oa}nN9NAKJyQ22{pufNW07z))Q&n?o zYbg^X{y<-IJ`Dy+qx{0cd&Pc^j*d=#t-)xm$I;PPAW@ctG(<*#uQ<54VK_ZNy|&mE zhD||9*$OU2+&8EO*4fzEm$U0mS7*+?*W1S2HS^%N5sD_To)a>a*Ry62rN=AZ1INZkUz_B>(t&WZFYSC==(3VJqy&49bfkmUDGQOHrM^BnmthS7 zMSHTMkr55(IfV;>D*C9Ag@lA`?Cs%a5~Zf52IW|ay^D`^h@9c#B9^2D*)H!jw7J1t zsEU3fM?bcc;#;bPz(e{i8=RBMq}mM30d6(xpUR&$S<_DQ-3aUyMA`DJ$EoXE<)Vm_G!8ws`z8cfs$6^u3X&;Fy5IyrJX7!20& zkh_uOR(4TQc64IG9Bc_ss$PcsZs{A|t?g}=!afALUGOC|{Y<(=H zT`|2Vf=3jkP=jg_^b)W0vE!%IaL$|57nhsEW<$j5*OTwy89bIaUF&LE4(TQ4hVtaa zuM&sl84E)#C?P-#L zau@A4@P?^{9T0KAa%aqEaE#dj@$0W&zd$)=a{@TR!ckGi%5T6m#A!D@J)M`W7OHxiJ$v@2n)@Uj>~Ehf2dS8nANVd4XSaagM=`<>90nrBG{%2y3<7dJEVEBe zP8MH*U0I9JoO1=SAs1p;N$|AI#coq?&(}H`K_|kFbn#%_2cCmpl8{SB^Hq5xEA!nh zRgQJhzfnr&>{{_r#>U5ocL`r^{$d)tIO5eahG(sX43Y`t zi_*0?KM$+|CF9M-xgUUg4ETjwfcQMJG_+>0fdJK`2l;PjzQUc;1tSBsW&F0lC^dDZVFf4(%r!N8~O0P0BdD)pOR%@_;KXT4#Qu9p#? zKg|x`@(U2(WVg$owGMNIUliZYM6j52qROW50g6hc_$NZIia5*)AHG=zWM)oENAN+W`Mp zhMUEfsZ3~C3?p*(*-Svc^PR{IRW=rFP5HCynj&+F0J^(o0w=40MpHgP^}!(T02DgB zkFF4_7gz%Io^k(@u+B+H4-RdAIbcd!F5kR1_{gaTc-Rr#>koTK>AO|&yyei!1#Mye z?D+C*)VPUYA$Q~_*0?W~&&3#>y|fTb={rb-T%(Ys@Z;SwG~1oe!XItqvwzDQ42l#p zMLt+wmuIY5YL$iges_hzd=D5LyqpN6>8R4zQW4V^mG@^9&U<_qW^L}RPFux^iSSkG zXUCT`9S`_Fy-~Ety)h>g)Vs#AVO^!xS4~eAGnKMpPL5Iwa=I!(f6Lff&3yQ-I}8vM zy$7otdyC;1#+`YNH^|b>UZi9JXU`0cUQ=tla_;ENcI$foN;>dl4&zgmf$*yBh=&vY zr$c&Blx3cSNptO^6|mTg2}_0-y~bt)s*>gg9Y5nMV|hiJe}{7t$b>bJHj53h+2GeG zTIrLuW)a#OJENw=_hQ?azgou=l8O=(j%nds%tp%%(+R&|&>#uf4IK$%k2zpwGW*69 z$+p<5Ki_(LefD%O)Vb%C{)#%eOsB8jlH}Fa#FWQ#-6Rb z`fM%KEHiNp3A_$j0$n8YeK-69$l@D#3OiLRxtW5N>vw+NbO*?n5w1F1-G!V)v7G5f zE15-KXcS%LC-h*^ijh2gEXqA0mcaX|^3oGkHZEDXrh};NMv@T($nnX|-l0YXyv0wS zv+@P8vUx~dzrIFap)kX4kvcQ=t=W3!yC2@kdb>kqc%?;3>%D}0^AmqT?sTzmBWPQ{ zr5rl|R&iw2yyyE1Zx6rHha(7B4q1IZGYXF9XkHhP50r@{4R}?p>JEDkq81V-LB3PAW zXSXnlgo56uYO(%l9p&elnHo1WaFqg&k!AF-wHpicBgrf9T9NDW_A{-7O-yjg4YIt> z$=fx5QnM;%_=wEm%eHlSwOq@A{)l6vb^>YD)Sl1ovHDGs_$Sh0XG=&+3uR`P^Y60b z+fQ%t7tc6OzT25QT$Cv?3X*=0GeZyEU0rm>tBS59=0Ul zgt8(uU-Jrvr{<-Mny!YPuEsoaPiyHWN&z`afuY)z&dUB=RYpmac)$(Y-T0$+YWe6w zY8_qia{T>9`BJB(G?MH!ExX_C6usw2r0hE)z1#o1@+bUA(a(0a{n+GsWoNIGly|4T zZiq9&L-P6Y$b(jA3Nk-yDKh4MZ6WR}j3vW&Eg0o4PIJF-hKw4JAzp_x^^6Re-Z@5e zUg#0=6&>YIf+MTlP-6Jxe)GO{+RK`ooRtcE_Pc9S9V2N+?mh0`x6olH*A~R5jB3cc zMLkFq`#@z=u7-;VRm4+kO@x38BgAo^548}E(mp+4X|k1d`aTcV(%w}cNVhzEt%4d5 zV8s2ahXO_Sq{QLPg$*I3VFPPbj3SsX=9!JMK}YCrP7hu-4P)!0F=%67@VbPP5y*X; zr6rBzQ1^Ocb+q;#zO==gv%<;z(&kYN;H?4D)gw`~Xw&v+w6xoxS0!~#$W_9A(1}OS zlUG!Y>UGz$EzRh11ky9;rg)#K&R-D9az46bYu~ zg>7ZopBnGk&L>2ZjZ75eGeC~yD~fV@-nj5Qx68mg*O9OrgSBBia)n#+4AL2gZrhf3 zwpqOTE%o9M_6hCR6NAejfG^V|&dInglG>ryy?AWG%l$kR{dd`*H)+V9glDSAGjXKX z86{@)FQsDCMFLSc_C_-C&)5EK2?GM=XedF?VE?yNmVx;%w)iC{P3>_&bdiL4VO z-uNyZth{93*#1JfRO*&b&bAo-gUGEr{C#SUGHxtLaN!kjrv6>-x7%#1DpA3uq6GIk z$KR6YT-3cf%PyV=1{wzsf7sXL!fyBW)|{CkS-@CZVNM~!E?TMroDz2Zn`89%@{~A5 zm|u>Jvn27q>@Y;-rGZI!5qQqOV(IH&5kLEjz6fjH;usC?_ToDqDv2Ugcg9Vl2tu9q6G1g#*QJ z48t_JYhTuZ@<-G_5VkJT-5$^# z57-)(T|=|P>JWWoZ5PPNA&UTDsyQ4I4{^N%s3SkORpw$sAae~?P-QZON3x%)cxQg$ zo(~f*I~K7%nRsr36NSoYH*rvY;5e}QUqOB<%|CP_nLlK zAml##DSfRw>oH?*?!tO>a>9_V20muze|~{r2z+XQJ3B~VnK#+)hLly%u6|={Rt*<; zUTz&%2c6}$BRR0yZzSXoshdlcmIm8@^rkzU9aZ7Mf2)DapU2r1W544JBP;Uncyi37 z$~<_7xjd6Pey_O%ct#N9Ljqe{WoLm>)!N#+b z2=bR^^t~3e$LngC#Q23XGBcA&E>=V=qv@)3DsR0>Ds&xsKyJH&Vu7NQt&+ zD81zYv8iE+aUFC|cga{aRi7zN{t2FqZ*exB?0^SI*ByXgGDy@h;!%TI|U3D z`-=dPm;ykAH{iw>0=+2sxfx|3a<`KCk)!P9WV;}25>`m&FtsSSDv}C%7o_{anHcsI z7J-f`bmF*sG54KYVg6mtg4$7HJSF?^-3TKENMN*5Tgjq$w&K_H5+aFo1;XeGQ)FM) z`VVKa5M+E+u&-%#T@%AiVU$;mQe!55mTg}?@`dscLz-^0(MmgX9HmecagJ^L{@tP9 z^e43?2@L2yg3O+>%I+K)A<%hG0y2q_sVPeFN|WQQF%j1_99q94?d|Ko01?1h5XEP$ z#|Vt+J)yYAZ%80q5R^s=s=OJw{9ya{Ezo8W_P2-(@A})0!R*4T^}V%M4Lw0Y#){W_ zJoaC*{CP$biXZ|TaP_~0NR04DCai^#IBPZtubvRq&v)~R}kI7?V71FgwSYXaXE_C0Koc;bv< ziM~uPjo1>sm=e9S64ubq)}nv$$rc3pDt-Ayx}WfISxE`S7e?9Qf02)ov9YkR5Bkd0 zKNYFhhqDv7{Wc#a*>eEoaBK9vjLcnkv&bJE{GS@Ja56<9u2@tvLC(~lbscsa-YN-s zdI>SeQR{Y)vW~h@1>26qxqA_kWpuy}FVz*0RDRZcQ{?T~ag;(KAWIw&6RgznbIw6n zghz^M0QAITXZpp*5db*h=K#J)B_r6)-2paPb_MR1exOZ~j53#Sjy}@}ygTIjqz;g*o_@`d+>= zY*JN1sgOw_iY|k75Y+%HoG2oeMEmOoJZ;C`8@eX4c3NYrpU7`IWb$D;agXPNBuHTN z&%1=1c$ux_z-W9q9BEDxl zphZI~?6cC{IiQODONO94a2u|WFWSXCW6S`2l zE>A(vGXCU$eUaC# z$($VYB=6OA82R%^i2xuQDO=gJhYUYG=%RKcY2>=Qi6XKgQHz|UMe6n+!x$z_2OlP}_;xjA2+zR=R{hV*yHhKz3Q8WYi{3>8!87a? zbX8DP6c1W~Ktcxsc`+anBw6;$qW64vLg0S_eY|l7z8DmcBodhn9E4FE&v{_>LNKFZ z6BlQLRzAT6mbt$j4 z>oB~jLf`x4ES&z}cCr7!YQPbHBh%#3X=3p0#*abRr@QXC3v)-9$J&1sJUlx5{5vF( z9Zxoxe`)54hC+5^&+o`je(uJUU9Da9P+JCz8DvO^#el(E_Ws503v%|i)<5-G3k<;i zOOi}ON&8f&655UYx1{cGfWg+9BROHYGlv@TN>Q#X`mgxy-?XhQljHc7|f zu_sT3@^O^wpl?%+-?ABTj75fnA`EENlt10@Jw(kCR?Ya!rGw40(li#y_jmoSPV}>wVynNXJLn?a5W~6PPv55Ct{o;0 zFl5Jl@NYf_xF$-WxF9(~h-Co(J2=dA5tDuE7yV#u3M6+>CgDRI!PxxcXg)e;RZ*p? zx2#=!C!CRLX{+paV!*q@xMLEt0}m~&@MRD#cK}^d5)xO#ODLYpPaHY)niqy__rQs} zkuk_-YLxsL&*$j_)N{&el1Qz3iL_KW^TW_=R0@`KIcdAn@;liV;`B?xU~BvnA{W{x z$ez5wzctA9J>2gozNz|4#hh*uR*|#gV~r6;^1SgJ>eI){T_QX3Rd{c^LNcrxRtzfC z!yx8*=P@O8C26Z=S907x%f3@yp=zW*Ycx*ank_2ckSByux}>MH6F?w@%t8%p>vbR}Ip-l`rGsY_I3 zJ<;Fh!BSnKPF`8r0QEzQ9dWjMp#)i9+LjV^Rw%upJksGL0&`!aNh$;iqb#y6km6nk$hn)Fz*%|u_Qth6@;?sD#9MS%oPR{_sRSma z9bDbe1rW}9uGJFtsK6N;hP9Xc=#DGmYFd0KE9MIGrPFo`|LwYmYT9yztJ>w2SU_7S zov5xo68D_jyLA*V(Z5fDmz0Pker5G*e{nj`YZVA-5MeZ5WTYj}L^+Jmd&X(=Vb)K5 zN8^%P1s-fv3elovUbl*b9SXwrf-4OA6@ z-WbzeElhC5h?B%rDb2nnU`s+?JgKvXROCG}QQ|S6jFoTj&$0b0v-CNNr`S76~ zRP@Ex)rq;#BJQ_?gwc=EoxiQ+D!@-KTBa#w-!}vG;<|>q<@|``&vEY?yrjK4Rilwk z^3?oJ_qm2WIYs#DwlpDV+RD5VC&4)EAV+ zh{nIG4+_zd^Kk4uc!y8ltv_-|;8Fe???y%(O9UN#+H*zbn%Vbpp~`55%ud?45&{3) zq$EP$)B1%@#srCAaF-AStwQUyh=fRbH{HB5^zT~Ybm+B+Dz`ld*uS(?-d?OkRvc7!IDu!!hPPTE!uz-AWH=SXx(>y_ znaWD-MaML0iS$UB;{8dH_;*$FbT&IfsT;e8-Kc>p6*&Q%4;dpVhZYy%L)p>^AR>$? z*Vot2udXHo6rZd>ORjvxC%dW2Oo2!}c2Yy*CSOs&Sd6TTFPv-4k4Ay?Bj?*Uav6s{ zpsx7;<+MQ+aD+Q87anHUc)5)>;=rY(sI$V%-99YsJen_}X0l++#EF$c^*=7fc?LbC^ic@@ zAWF`>!=eioH=8rT+rt7;3p9$t-!cRZT8B^VN~Hr?9@r(N<&Tb!n*o;q(TRmu>ol3- zo_G)*35i&iEH7k)6Aglr1|7R7Kn@Jn7byCY_4E`58R_)Q43O_r9=+PBnn0*3fRrEb zPHPHcWya04fY*QoCbMXo0cu;s`-l~?xbZ#ztVdaj=&R9JYr>0*3oQeK81wFU(}gBK zQQMe|2*kl1c~!H^%9qaJG=~F66TvWC3Y+F9E4NrQGB+fLI}pe+cEru@oATPSuFfkyBYblD=-~&-!QoOUc*0F2NS!kYDB+u92GR z26PwS0|%|p1B+^2(7qh0w&i%jkK#ty73A^tG#Sdsd%3x{*A3VnEudhoYXSvyoKGuJ zAzIqnK^U}N5J2OB%|YJW++aauxFQc~In47n)~`)q7&wXI8?io$?Tq4Dj-1a`TxvB4;Uzz5o|2&?VYZ^a_( zqUsXV0}FbOZqN0p`@2|@*DNdfZW>+b4Hx$HN$*weq?*2aN1VIoY*!_R9JSRH4bxiT zSXZF`qo}oEgSR$4c2#{D%lnBTkIb@wKPasccAae;+i?2x%?&AJ-$(d%h~#5eaWQGx zd0;>#=^UR&qe?;%Ue67wb;($8?bc~dvm^3^3c)><|0y~i0PQPRjg*K;h zwHRq4MbJuv3sNVVq7xboDPvq`6~;A4{$=---U*)G_M!Cxp7t~@J2V1pcHA5nP^ z*|@p8fd~XaxHdIO0d5p%E9_=#2#wGC^n(w9U;`%UO#)yfQ88?Q5+J}4pd#oJ2=Mch z^w^t^JKml!2df3aX!~ES(B(HZ(SnI!?!gTHjDVov642l%K6;dTTu=1wPBY37lTs<8 zCRg)uT`kaZgWOnK_P8pFiLCDRo_B85HX(+0Kq{B1tCyM{s&DR}41m0+h~-|8B#TQ~ zWnzBOHa6kX%KQ=tkJK@rt8+&n0P5;OdBtD8@RPhp%)>X&z1bqAz)j*b(MkDI3=R%X zR@st6xCfWsE?imuKBuOpJ^-a9`JX@Yy4@6V`>_?<1C-?cx7lD|v_m3^f43hNhV4r5 z*thx)g)QDNRcKDI@;o%}8tdkNM_8?b=5FLzY)p;+S*hmcVtYZX{`7d(YjpC`-CwTXwGU~WdG)KJ3tw`lSi2~KAPngl!Geg`xK5euD; zTum`*0~f`Z-K}|HbTXC8C@NfrJiQ!DmWpEmnwAP=FXY%^ z6ffkg6C{i$ZJIVtzD5F?9Sci`Kyl6Nr`z={B5e=qg!>T{1*7&o=0!1)_NY72s3bk= znaCU_k%vL}WxpUA{@|W72baQh9K%GCS-fMBhsa(to}pOGLf!u4$kZ1ra`Fsue+xOn z^ZTg0k8f_?=dWyOCjG6Z2jYWgJUk2J1Pd~!vCi=_PT%)F2#^%~xvy}XFi9cA2+1qw zsQOa!CuLQEB&9fpB`{Dve+(mIdT4_IV6k|@gGU=wQQu|nB+ zJ_EF+HTM=4Jehf32dqo=Jtc@;S<~f`HM6tR@5tn>wOS9S~3DGmAhfT z&5auvFM`efL8$YtzU4kN6UkB#4H7HruZYCY2d9oUaV1LoMM{jDvNMe9Ks2$(Qhz68gFy9PZ7h>R39n!w!|MS*shhY^S( zM-&k-^yly86w6PR@}}A6t&LQ$<-ur(*nO)7G%deDhWe{&DBw~k}zAJF}R`IX(MaPg;(o&=wj2SwUejl*`VvDj!S)i zL5~EsHeUK2^#2B-3wdSsp?x6HML((Xs#1BAJ{KSC)uIhy$Crl#JxD(TA8(>t+VseL zgNMr$JoEYV-2Qnvrb2iJjVQh-RT*9cX1rP&r$PMxtynH-^(}^kaJRAEqZn4A->5$! z@;?drVIZIb(=&(=_fH9tv=6i;CDx;xaF^EzpLMVN?Ty0{)b@C()$r{{d%b5NaZx-s zD|(p}+`3N&=>s@D9K z`r@xE-|HiK!RktM_Un>T;-=s9%4vg0N+^KVU;34xl(u#_{_E873(PzcxcS{^MZOPe z#}-@+v>>3AX+c}T6Vdc~M2Q+=5!l|Z^>_`wVhJg_c;UHQcr-+;!7%yjG;c!`juwg< z>VzcxK{tnihzPS{7%V_!j1XGFoNYQ4<`&rAGo@JX2~iXbcwvl;uFl7xF#Br0T}QiU zyL;Fb;fi0wLo}W~eYzM(Ah$ZZo*9wJctMfrs-m5FtvUuPg3jPKr?4I$$3>Lq8ZQ?& z*G9TB=BtS4(0=g_NwNgFo#^4`IJyd%oMzO z^FE1ut`xB;_t0-A6tkhEq!x*xC8v0`Sm{zvuEvBnH}=qg>)GbzTkoyo$j2zwjwZ5M zTDA#w^C6F4Hx5zA%U{aeVEQ~e{JJO0VH@Zk8RQ|LF!ygQbtGk6;5r4tb2eq>mb3sa z{zRunTSH_u8PxhMvsmSthWx=6;l1~lVX>a?vpN#UBB^vA*+q(BHSy+8E3nB8p_(Zj zB%L2R`@A4+`t$uojcad&_F>Su3KPuYtI%Gfbg*%QJFRA;MBvb<=+Qg6&H#&YWCjL` zK>yjA{@aNB0DKMMZw&h^IkZ6HBF#Scr1lFL=e9lcCqnk}%yuC`J>n&{I2@8wgzHy{ zZ!h@SI84ghqQkJ9ZdH%6HfRI!aa3C!xV zZC_C3U#$CN`D!3t*J6pWGUQPl`FDyj79oRX@eItD7|;7?KlGaQHoU62DRmKvUC}RZ z`JiujH8*VBjn_#5-Q45!N2WKpgp0_EB3a-E-Y|Y*IQ%Uw^lh z)^M`Or{j3*_U5%OlX?LV&5Tw|l;OpZgO4@szn|P?M{)e#qcQ>FR4zZ@u^YibcGO)* zDwzED@-aS^QDQj3#BI~*1PN2C|Ghy1UHlN!Nj~&0Q3@*)PHM`hy4Vdp=qy&s(h`y(+jY5mXkP-#*85h{M!I#s<6qQHjd!e-umW$0^c6LeLiZjb zab`ciQ82Dkuzt_lJjao!-yK!F^gPX+ z1-I#AYKd8v!AD>5B&bD&k6XikaIuQGD`bSI)8#%^aGODHa@DJlzTCuk9N6o_qZJn-2j|{jXW+u#sTZKlwlFcR_&wXFycS0|IRDfh| zGKk@Hm3jleFx96w4ZF+QVVWQAxY^W(o5q=amSK%kb`TllCF#gne@9d0ke!fCgASs) zYJ}Zal{psf=b7f2*bcwsw}u%V-*nRBU%O(^8rg zaWD}@!5_&|{^>)??UU;&oi(Yg5a$~;jTYJ3B-h@=VpnHmA8ac_&pjP`_;d@8bW9ma z*bq`uN>t=ZZ{gV;ikP6Sj)p-^58njk8YAVSk&?F`9a(3fN_zc~QCLOt9(h(z%u#P| z7Am)mkMtv~ zC@^_Whp!zUX;%6G0zKB=Ud~+UOXcXX;A?gNWv9YKq{75pgx3zn-*Q^xR?YmM1=IJd zzcvc^DPfIgT(sWX_OrKZGhSEH^GNZhNW*k!&qZ+!y{LN(*(9`fD1YNMxDCpDd!DEL zP}rpYbDnepx~wjSh42WB>R}#t%4@BJ)Cw;`6wV*KOON7OhNjC-KUHDK;7(s${Yg;HpaQ|3*Zv|itaHNz*_YS(uQ%HI`oeSl znNEl+jmM8&QV4$Hh>}2qS#b;WurP>B*tee6uT@nV_KTMYwnV3>IGec$YY%TI8!O{T9dYpg-p=!HO+{bf`q6C$hHFBP=tV!XU}K zCl>wGL>HqVcI$g6-exVHSeg1)w@8MG(NX%OchzjeR8X@mgzOy@T0}J8Y&YYH;sD}N zFzy3GWNrAm*4e!Mw?Q-} z=jRun14Tb8ja=aaPU9xnrkj{m8G_`uAps;mv^*g;)}%cgw^dS5dDMNzu)13NddyW& zKp>~Nna*~+40GJP$Y;Y3YUYv)MGJ-(kw<-|SbF{cu=N#CRkdBWhd%V7LmDKdy95qM zcPJt$NOwp`bLdu(l#m7~1r($~K&3%CMLL!4`yBng|NeK3JH~M+`o8<@{p=^!nrqIv zUV42=sm_A*=tbwJi+lEu$CP#z*PAOcq}vfBtS|s&<2zvJI$_#5L8had5*74Q%OMEM zr0w*D&y}}J&zsb?@NX4wZ(+`cM<_dvh6#F=+XojXGTn<;9sBCbs+I!7379?YnOZg# zQn2oOZvk=$o(u~Dddbs+#RRYx-0)jq*{5g1Arxur`1Q zM9?M&=sJKP1W77k)6A9yfFfYo>@^>1B6%=!F<+XzwwbC+#_YC@hh%Q0Uh|kx+dF(N z24t20D-9uk=d{uj@AE5J2`PBmnd0|9t}rVSf2S_f$BNL*Np0IV(5b0V2v8Fi#npEPx)sd=H4zXqy;M4)mHk&>6lP+tQrH&|=kR(cq= z%zu;{0IdlYME@UXm23&N-#Jhorlh272Na3l04=fWcSy+Gju%~kGI0T;hg#=(iEZIf zb`8_sQ|C(o)0Q+LU^SXfCxw>wf(jZ!(s5FjjklEvSvt#=@*Ffo)op^L-+t{#M_<}M zS$BKbExdG?`kaPWL<4=kotNcLx-tt~6IFUOgg-*3t@90?PJY_UZ0K$zePvj0)VNXC75Op-~6K*0eJ0fQ!9vC0Uuy; zfTu8(Ig|IlSVurO^Rp<;6cwTmaP{}^1xj4TkKrCjEAG$U`+)KyyWk))K80+Zx+E@( zq`#E0$-zjl#EHQJ1{R_t4umQ1VxeKN9G*&Nn5D~!6ZtPIU_(XGypM1ST{{>%7&;1r zyQm;2Jt%`Hdwi}0d;}0w;?CShn9oQ+5^W&GUMQY-fd<{Hh_vYA9)SMB;n=d==D-@+ zSE-m_Afj2gW9dpsn9!f96BUOGrLsq3L}5e&Aw>YeiaBvoRj?-pgVjM<4mXdbJ8O~! zvf|rq0p{*MKnx$SdhG4(YkUu_9c+UD!e~7C1u*`@`hvkQ0rlDnaK)~}xrf?5Q}2KR z0Y=1%PoCVdcaY{7`}4=$|MqgRccJBl{M$&K$$~ZAQ*g19z4_SJugSNC-+&7s)fX^x zeal6#hl6Eq>+Fm)_b}pn8phD`cYN51#`kLU*VwSGY%vJQjR{2x#o@WcHw4YMWsB?C z>kS_fH(1}3i2*{gl#NA=QBY6-g9m%iRgB7|V9KXdO3~e!8JBc55gk_0*2FnHN7B0J zbiH3%2~YtvMEkOKOSXHjjbWS4&Ctlw7e+{&-CC^aAO6q0&cfsKJI>7s_S<5b396UlTNNFtAgU=s7eE9m2;V9|z@nfpO6lGU78~^p|Nydd2XsP>G*MCvA zbrS|qI{pi*Je~M`amvmFGW^k=Sdpk!He(cPejk)GA`A>BRH3kWQoWQ>HMC(pn0jre z!dq8Z+x^y@o_5MG(#IO;V^rGrnhXm9bE@It+fCvlSWO?~Tdsa9sQ(wXdHVYI2rqrd zqWUS4$%@MIo{Xx{E#0XZaGlX1!>Vf5T^C(~>1Fs|GW)(nT&z1}@m?@g{jS0l$^_|F zYsO&yeS>cifxM)ZN!YluejF@cT7&_D^Pd17u;61-1Ozrsjl2gu;;;SvFm#GYezYhs z5ydF-eW47w`awGWsVT334y9w|j0VWNt? zx6P400u6ZuX#}|W=iIMW?c#*xv=AugT`*HqQdcQ52SynBPD@wbMcBr&Ym>1#o*sET zi9ugC^;Px=z#EYu7kMg4(z8{WF5n)7TkRj<2Lj{gUJJ zv>o&S$#DCpRI7K$$lo{q|i>rQ~1P?3l50;PkU;u z3@jHetIz|zGUSwl1+^x_1!b?cJ&2_JhQDRH$$r*tE1?f?61FrnAvBtHez&pTmEQCp zYC|_o=a{DXfju_+%ERCfokdhDaZYb|i&;aR?mh7fD{JE;(z!nWrjj`bnU(gSsc&7% zS>B=ip4od#!ug;l;}yK$F)-lEr9AseyA*-(s!wioa}fRU)L8YO_@-KS8*W2~A@r(p zkp80VqLGNP{5Lb#eqRLrAbz{@gPgAyE9q5v-s1PjX{EM7@!pM%((3tkq=yrjk5Nq4 z0vXtk+cdBk?RTx8m@?3IzkAw28P@fNX1UkDpT;Is_bg5VirW4~hnGoCoOsQSAY5T* z@r2d$XkYF+gpEIW@4vWhdKRD6wyeO)QftWGnIA^9?2x(CFAvHMOkenjV$F8;L4+MH|zU7Y~t#LQNS4o&Z%(d&30Xnfh}X#u6*`_nt@ zh5s=;Nq?ZsaUJE3&EetwlkKJd+sN<>l*e7hRO^3%YhN-pMEk~uEvyW%ZGn`#r)ABb zjQZ&KL6PMYlb~m0==38f3gd%3GNQ=oO?8Gf8aOJ2BGorBc&`*ezn&d|<&D$+zZBmN z_BX}PTW8!co~FIhc`mdWfH}M{jOVG=mq6gz=j>=uMoO!3lP+2NewO|N5+d5RgZ0*W zh`J89MZU@6_-kJYw!QQWtoU9Ywk z9&jv#d5l+EZcd6Kj?7cTbub5|BIT&Cz8Ov>yQb<{S)oGm=(y}r@UlDX$PC&k4G&Rh zf{N%%O+qfv1|~{FVS#ysvaV;e6{ zquCl>drDf~Um)jl#9~Kr@1oS=vS})HeZqD!Zu(U|PDGW(LC7c~9OVcI&MsP#=lXeE{ziG!=j4N*TtbxZFeq<;P(( zhIEQnTJ<%@yf=IMe8b?g{`1kZ|8fC*4~Y+Uo}x_BhHodpRVm_BScqwKn|uj@8G+6N z1_ytSp3wJ6x~lDD!CdVK1R5q59(E6N{F#3;EPO}kIxyuVWO~6ZJLx%qc)Q%kM0$vI zbR?3oiv?wEIO9#r(fJD~$=W|twOh>~BBt7QIWh9lG$7g@%nyGCr_Gq> z7grKqzu0oSh-)%S)WEtN#(y!6TF39D5iyTdr;I_KsNi*8lGxi; z)&Qq3ju$h!bVr_eMVk;SF42wsp5|g9k{CD6lmx*JE6lwM61~_YQz~Twz)8tpQsOAB zi}X$K=BDP34*`0#Kohi%ioM`B_0uv36Lfhc!eZ6)jl`d4?BUEJUPqQ=`9?Jn&++oG zy&ZpGP`2=EiC(V!pzACST=YeOl=gmmByxEw)Qc(CZ?2gm6%9NbK-`OV0N+gGei8wK zy4CM#%pl$YR9}FzKu4JZj|%AXfy2}F^)=u|<3Hb-N*;Tpm8-3T2RcM_q&N6_>La@% zVC;gn67(;c0euM<`9BsR*T7Sd3i|*%54a9l_(bK*=K7lC$hyv{qX$Tn4Rh!HS?dD> z{5_<@C$8V@`?Gy2Sukn!LY@R3xbtVP@nBJAnK}WJy)n$hw$!KAR_#8+pzhlEGl6Io z%Ats^W1$ucN!m7E#(TNiU=tUTFE;z)N?4Q?H?^G4VQW3s1xnkz-MMxB@@u; zmdZ8bMed`k6wF8z`NdmK=d)3>mBpLAinHCcw~CJN$drvfQ9F%07gkR+WjF>*H8zq$ zV5l<}Ec(@%1ku_a+v$%V&do+)P$q^zKqosMqz?x~irEuMTiDw}rgVTv zk7Sc%W>SM1tdP|~(3)VboSq&DQX&BSev$Fyf70L@kT`+t3TclA$o3!`qokwj84z6r zy5WRAUr=6u{bBIGJQhqWtdY^t(4L+i!xicCU$3TG10OY6(E^aSOCY_@FjBxxYQ9&5X!J%ygx*cab*0S&l_hV&vl z>zx3H8^_%MjKD>mrI|&Ps^h^h2J*cC_ndhBPZp;h%Kk^M&UUeK!t|Ql#L)R2$^cme zXtYrvNcN7z8%0p52iy_Bh@uyxh73&)PfbPr$Jn5c|BUQ^n;)EC|Hu3QkcW}905E!a zl}>cC67+xvmXem1Xx9w#8UM@KMFPBau18hoyEFAjQ{X zngkWYS9*OH0f$AahCKC~uB|aBL_FPNVC-1R^4^NYlf+U-z|2D|?r5U*Nv1utW7KSt z%Xd2xo)N}z=aT5|SnG!#bMxV?OR@cs^Jd?eJoZe^6Dm|tHY7eMwPb}CP;h*kR0NsYKeul zNST?LksXg>>0H1B1AmVWd1q9Q185kGHl2oL6&2ro**I}fATPfbdhM0gXC|XI{O-LR zTzQv;JWikZL{tU++<*B!PpZ)SF;r&G43)r}i5Atq*?-Y%rBVC#>E3KM-uZ-HRP?>O zc2(a!TQ}@T305!`br@A$swY_6m0=z+te$=MDT(pW`B&`h>^eHauz(IK^uXsCBnv6< z|C>_FRz;O8JO`?&gr~KecR|QL?HMsA@XE66>=8IO8YryQ0+7j+H4DJS zkWQ6IXp;VVLkX!M$jr*Bb(jR^C(s)pkw>#U>!QEm11zv4bym0U+#k&W8uSSeoN8Pa zTl4lM_nX5oaLMyNf4=k8O2B4PIz!!PeflFH-kJb|4pYC)B6F;^4<9~k{082k%S}8W z0kw?}9lp%m#thz_{fIRbIP3H=|NVR7V75}*RuYogIUR@VHPJSzttYlu{@a5kkuV!% zDA7HK;Ky9XQC4nWWL!6<`alD}h;U`-8@iIVp;EX#OmDny5P}#O)eci1?-z%-kQm=f zc}iqcwPSvMImM~Gp~U(MyHY9OQ4!PpNZfHojGI-rU*|syf=jFd5(&1@-^F)JBXf#2 z@xRz|P6bi@2;luAkF%^40^Ntru(2>0w+}!vbQnA^`ivvyn%sZVMKP#GQJDF=^#@c` zRMfgI!y%?V%{-q(X_1V}?aAug3E_SrKu}a(N@j?<_y6?{!2T8wM7iCJzb~;MHgxU8 z3mqg&QYd^_5G>0%Jp*$*$Z7X5%lo&s+E}PB5uW{t;DggCs} zhV8e6eDl5u+}N4^5PNtZqRJs)@ix7}fM#vWq|9PKlpy~UH&gVfr1Ki5qj9s$G+4NTpvbk;&-yJma33E zpd8nFXwb~i*^#ccNz%|1%*p@7Jy{d_ zqR6(<)5J|JM_SsGG_(v;I+S&>jN$F6op&4|Z8#LOBy-?WG;m7_M^NK|^cbSurmcR7 zHi521$@OP4<}YY~+`RrQWh?FNY?oo4tBNGB2`~&Z%YG_Xn5)AHxGugyS*L+ner$K_ zjNAI0p__loLGI4l4~ro({~yo4bd?$=Q9h?soTGj0u0R21Y}U^7hU3I-_2Ef#iTlmo zj2<%&2J9pgW2&H4t8VYRfqwv)xBoufDa0v(2)aE&bfQsyHRhR~)$A9kTXhZjzHCr~ z@=@bn!w2+iYJzg&~<1yA4S;m)|qu;#Zfs^<4b+Se#{}VxTJg_H~4X zBy@=Qoft=9w@L1$u`3UXF(uKb6V82U8i^xjAmt{VBnYbf5th=F7#3{97gO4 ziInWKG8V%o*mKn?(69on4+a?&FoV%8X)Fr5FFmt?I{T`eAZI0*e~6Nfb|9}`^tH$2 zPm}d*c__-HSBsZiFn_z7n3(s{H}!-Q5J&U%1av)7W9y^dqS0M@mb?*6hCD_V9_2IHe`YA(2zX28;AAZoD1cH_Aub z<3m)InFVkJf{eEJD=^WdNFL8sJAPzI+IgaRBwSw4p#%^k9$=K#uN)dg$>MsHw!cz4 zE@}9=kmk-!8?MimATA07>9Gu9;CC?%8To&)1(G(`PEZ?>n%(KmEm6Ld`1y;GFR=k zYd}MPJ1ix2oa_!E4!Y{Sr6QK?bgS9_yco~_6v!4%I}YiAy~K~umQnoa5g}hfe!G8e z6HC6(P6DcbJB~U=xc~|!+DhXy($tl94|G0_aXtq@PPUMnvc5+}jCBOU#hAEj+^tO^ zd+L0bWg93TMiCOcq$cLCW5)|P#+wdLKF&=p=B|i|+Y!L6naO^FKI{DXqj5#R$F8mM z-c8WSf{a+gVe{ct>pU6`>s?jqThvYMI(RT1c9oN9sV*En<-==^u(_8$1~^|=E4vKu zhlqT^PxA5lw#lBVYEk>JVjjO1ZuRP&^4j^kFv^LlLWOqhiMtKvd~V8WCp?T4*uw&= z1#-P73an&QEY=q-GEIv)9~XT;mtYA(FqckO?1wy0FDq;??@13`N-bjL-h6kXnLd)c zS}?mNUFX&KnY@3^Il5Q9|E=@Y<}HK2gsbflgXYKP;1GG*^w>RgIFu0qgKyz0i3Pht zdTY0u&qY!N_M}PiZ*@z;0I#g=lqs3;!IfKBy=_lZV{Ek$=DQKh_mnEjVgxjgJ)f5H zAN%e&qzBIG6x~bD#4Tnnrnc4+w8+`5!`)Sqrp1c>sS=$51dm?oxuVWrezee66(Zb;n7ZeBvBX~Jh>7`J-Z79E%_MR- z1ZBrrJi@7fxN87{`MjXg29MUHgVJR$EG3dDfZ%H&P>NGd#qZT$Cw0ZuGW>n05Ax$n z5ARZjaa=8hy9%KFNqK;XG9P{mBzyD&bM~w{+!ee!gBJx_s-Ck3w&XcXdSU zdY6!9&NSV~s&neQ*z>2{C&FlyT(f?en+k1GR<@%0NfpC$;TF?mg*w@?Hf`P6?meOx*>!} z$;B7D6TloCGP#jKO~vIauZw68b}@~vkJ@6}k(rCGq=nX#ot&oAMUuapc13kbC}%W_ zO36{z;Pc)*)1xeRpe(==T{@b6e46n09VI#7Wf7U+UkrZMu#ux$XebRf>aUi>bv%6X ze5i#pZ(uvX8zQ- zH$%7RLpRT=7e!JbmJEjM=!mIA;ew030PT4T57)L;%7*xI>6Ad-BCo|rY_1|4lVR)@mi z{wzYwW_FCSsd3peYqbOBi4}(Cul3)h3d(5-E4wpH9TB~JTe5;+a2h0jVwN>lI59{X zoQYk=LBTl`gDV)je$IrQ+jKaVye)6`qLwB73)kU13auE+U4py9*t!^;TZ?Xe6iWIu zqqEz-n9l|+*EF}r+?3(=hYu#?po~@v9@`YHp$6Xb;WC|EXCEYOUI-(S9B9q7YkW)x zpA*CN$?|!M5Uz+H?We-D6?Yaza_vgfKG3i1MJAI*Rn0rnPcB|LIwjzyGU;-AvL=Z~ zw*aAq$2q5jiE8hYb2QX(1Jd}3kNt0Jn!piYoqpE9Y zcqmQBc$oO)cle{$(CXoQS!kJ_CsvqgOWvr4(T9M>a_oAhans>$#$(@-cPR9EM|h4p z_%~;!UynCX3nm?CQz63{Nz{sT;}oqvu^=QnS3hqk8>N9V)>{J@3+c!Rvi_t2YkuJW z2_#{F&!9D%?I{3zD<6rS9nR~A4Y!{ewmtXyjm_=>f3o9KOSk%L48$@`h*jYSaP;@!;fO%%;nk9M}_;2Npw;}IUg0E z8G*o%Fu1sw^&apggxJoJ2yh{vEF%E^2A%PW6OBW+@B1}dGnE%C4b$9%3c{#ZiF&^{(c=4nj$IC2QCUY?26LE^$Do2HdUxhfj z%uD^BNI_(y4Wqd-)3EdrO02BnCjeAp6NC<(nPymdhjNe0HNz40Zl^Ms^fCuFKMG&Qfvxn>Ar?kNk{uAN5CK65Q$$3>UyBzoS}Q9npL~8Z0X65zau4gsDHXc`(C&(`U|zaUK*1F!ucf#qLlz2`!3 zDR|V!NJw<6o5QQ;j#*rH$o!WlrcH4fe;Fx2QI^Gmqarpgb#RJyod^&@l3NY)SFSha z%+n1SK%8!-*Z<0@FKg1#$?<2hA9|=!g*zVmdgvyiCOPGs_J=>|28l_SF%-n`K4D;# z%LO`{Gd3TMszH#8B`!WbTn7u-^L}WC!`B2|mbttGP;BU|V$c|^o)f`b5i62p_tKkC zi`I(xjlBJ~5_OkS5S~8`i*N=aQHR;I>*u}q# z%AXjj6a)#S-M9pZfpl-dM)wo+e19O4^#!TWahw(aPy^PqBYAHkeJ_cYREVQUEcgHo zB5OkGfc41OSQucIffd1&_Wkh~&HL$l&YyQhkSlh7p=H?^=^PFI4%y8Rxdlu+K5wGS zN|FdoK!+;_o8H~W9JnJ9~G;f)lnTY|6u{7gb;F3(TS)J=LQ-|GX z%p=qHr-+pEJ6$L!!y9FaSYlaP@vGw;7 z4cSTG`Qa^pdQE)1I_L!^y;x%F!_{u>(=qMsDD*E!VkDHw;L8y(0f**evcH2JHvU~U z#x|p`yFnJVR=veZI?L|)eeAV}g<3oeURWWPF8kFdN|Essdv1;e_hTvrx6(e0miWNR z?67tf+m*z}Ed!=6Y*1;jts)w)lW(yywq0V3v;0qKuex#rtzSP>K!)2q9|M=kuBIJ% z!Fi0zQn*i`t>~zYDKM(|jrfUf^^rOC&MFh`Qw&P9=Dc4&_3dnJYl_uNiPJM8Fz#xi zKT!?yHHl9fT4%mKj>7GA(>3r+ceYDV#8@g#<^s6k8^_4lTn^j0^A z$=(#*w|UalPILk4sW~9=;dIl{77Xe4l~S{tnLZsO`jjEKtKPA?<4crlNXm+17lYN%qONC{KDx97dP^;D1MDvjIE2b@JIeL_}DWXuQ{ zj7(8dJ;+WOUQEU7>b@2EXk_sa^8C(Lg_E@9SiSN0Ij7Qj&w9GVf8iQ6Q)*W`kEv}j z|5Q21zED)iC>@_sr!rP4F{S??GoGy9A{+namh@|bFPwJZ@UsHz!gsAeS`-zG8iSvps(#Y|8ZvWBASA=?YigRhc<{B)OKFP?S4MgLUB? zFq)4};H2nZfA{X#(@W!ic7m}H9d^>ru7<#tp!>Org{tfpy{b7bgJLA#0+v72vkF`q zj?t9U*7@Q#IElqkq=;I)!*ZJ0*TCS$+u>>DRpF=HmYdxR`FWf(zdFYLbWO)2yv_GI zVxpvS{oQ>^znLA&e{WJiukWc!#6c#EN$Mk2zgsGy{^ffQ`?p~tyBM?C7sp_hP_LH9 z3w$z>H?N($c*%s(e^X3Sn0@W=LQy)NS>qydFRv6KzM{^+LU6a;&?Hly7;S2PG`{{? z?rdyBE_-1|5?`X>`Olg^VtCELV|Rirc`p+}Yts@@9E?KwHS;b9Dg$qCG_yAXM~RPN zGK3IM8qQ)1Pr3zqV~J$&<+2D4MO(Rhxgaua6YQjzejm4E0kDvD@eo z$8g-lww7qtcp*1HKRHP%DujOwPknax$J9lIug0xC=cICa%t^IE=hz%{*(=_omaXHMFV zN#oB)nP=YIAU2+hW3WQZk9RR6gSUD@N^>vv08)* zT@GI3P$>3%6eAA)^(JUud&o*4xz=+4T^U>S6^9#C!Hcjw_UUASprc}-@vjHzoWvv? z`3t;J6>EIlg9v;1i)ZdIh4ZACZ>W=M3cTtei7|>FJh-v>Ce&1WgU)t#lWy0&`OaQ# zAGDtGVpnIiB}8nyz~z@*&(_W2R&rEnu`PL5rlRYoCh-``1mK6{j$J&>QVql|ISUb3 zgia_YGSMUaOOy@Ewv~=&wRCk(m={F~SUtmI4Hf>mYdm=0c>vZS7e%tMW8;Y$4Yve) zE0j?%^k~T%9kHFqfTBgdMD2!d{9i7B7%E&Dl4G`vBH+piRffR94tOU<^g{7I15J?~ zEY~^@8Xr^{FFUd^aas19GhWVwixg*Bvo)|kwQR$)=lb5P6E&VqZ#^qrSxXeWYcvvcrke=$Ka&9vi%3_b6N zDqo^^(0%Z;aYs-UJCj@y0Sz1rB2?XNq;O1fLciDj@Rqf~5iMbNCUI=GA&+Wc>iw>e zsm~t`^I3BJUuw#kHb)xSQ#F{}vP&Do7ug#vmX_X8wtDPdU0?20WosY zCuQ_{!wh#CmSkpD93?+=h9pppR^!6f4$oh{c_BE^K}sX^0M7sss&O!U*sN@p6m7T6HiJxPd0Nfpmygz#0>AS+-odBAhh%vK;VKM4WKaL# zG+#ckImCYF8T3QT*YN0OW9V=m%-k`xs--sns+Upd?v;NowyU)o_W}Fb733GF5LQ-J zP%1X8c%~7J>|Fp{O>%w+!{BR#ye&t>?u|6S$Swj{Y*0L7>V|We&*lnH_$IgPba~H=H>;>in$`X^L+_zrxs!9w^6`Spx+w z`>(@?%+l)e!<DVfJiT@^VD`9v{BVlh)Qs z_YmKfY-_l9%EOS>!|KHRA*Wc`n$*Pc$y`N2MrV8xw+9|K?%mU0ivygt(_S~ZvBGrm zTXH|s=9>CpAb+)ZvLLSqf?{uF13j&?{UQhhI^w~rycvxZ0A_ks8h3|fkXuk+Szm-7SFTHn>Lws(Tn56VTC$ zu^F!i8fdr1T58&-E1V2dLL}o7@)}_b5^`FJ!^~L5li0oE>o{X{G@``2u*UVKJ~M8G zwfHQvN)vI;qZ7O6OZ9=M7*$#_u%5INjC^d?a8}Vp-<_@~p>duS{0k`%NvcV@a534u z9K+_~y%%&+n{x1WH{(xLxSPH}TNI4`=Nz^0NRNai7@og`E6iH><#W{&;x~B!KM3br zWzdw>5v>{MgUCpuB=aAiwt93#i=mABlgr3NIfR@@7Ba<4*E^V}c zg&*@kpnbr3rnPqfIP~?=p)BT9zZI_#vN0BoZfB zc{Qp~e1!&gZM{sAB)Bl@M0bmIAb&26G24MHJ_M{&G!haLAJAsg?N=WW04g||7iMN8 zVkqS(vU^~= zDydNc;%a!GV>0PY_5Rj&M6Dg)wq?eOMm^%K#%%j*YMnuXAG6arjmDXwd&=5&G;7&z z1fi;>J;habY{0dX&H;m!9ps!X)25hzOC_Ywx@O{TU)rOw3)dM)N>g_{#LgGXZ3zvV zW>tB_82^gt>t<4qYoeM*&49({hdi8e^pg*%nDCKnfX6)~DJvJtInbGS-}qS}4&!k< z*jR_h#}RrZngb`gf7i23O2wM_UU$|>Zq9_c+KU=-6l;OE(ma3O8heH|iHM6+l`So$ z6&wwCw;fpt*)wSxzMrEWsO9G#MBmi+){iDlrFT{MosL<&)nD4pL3~ro;KzQf=fyJr z`JvA`=fPlMyJ)Wsk5UYbSj*Cq8ENH&1Tn(G!j_K#um?za7Qi9H*4`dy94H`=63sWA z00gmdXas`@&0tl3rGQP08oZJsftdoa1TKwWizdYZ9~i2|w9&@dnvvTJv(7G%5&!{YkPLq0>oLlG&c@K3JUctCV6meiV0 zO?_Z3A%8zt>3(h`OhBseUi;yn1F74lZJe{j)sDkIN$(-;VJYDU!!jh-9-?n({BRx& zvmc)tiTdj&LA6MetKaKb1+^9pj zqq(m%lCtwl8Eh5Q@TTCm`12e( zn!!46W_yMSS7lvIC^FQ~r7wZS(g>&awhjkv!;oTP;BW!2W9}pI<*!ECqJ!vg`%c~) z8UG_c2!8z8mUwh^LUUHr_Dp?yZ5qByXFIOg+;sHdOx3?CQ<4KgNc)CHzFmm}b~;kR zu8S*FTn0-HG}y)xMt55aqfkDybQaT^HweaiK0(OOT{xDOqPA2D9E?ez zIT8@v{bpOG=lwGMuzVc^Gkb#X3=r^nF%o5g_up2Geimc2=T>6fZxRdJU*+_@AaLB3 z0-0@y%!xpP#hr#i4IN4!;(3S5t{|A|Dh0?KCPFP|6-oYk6Sqmk+QhNCs-?FaZjcY< zA&-kXfH^B>JvS{wl|)!&b?X?tP4KqjCpt3oDibZes9UKWj%z=R7?ytB=NLUPzRhp9Gy$)Y#<r0C&S0xvA7*-mJh7!QgL|C;#%S? z*(7QcQE`wP2IDX42dadlY6}lU-=J83lh4Q@SPZ6YGo5EI8qCmimry z8FnS(U%?s_9cz@pCoyF(^u{+shj6XA9=X|%fjrvo_R~?!Ctisvvr(}I;huo9`m6WV z!p@Em2CjZA`-M;^v4}J*zna@4IVnSxU$Pz)5k=iPJ5O=YkefD?5ye7WQ7c07v^d`} zRzdrD5|3)B1M9}5V1_!oeW@hfUmKDzGu7y?UsaSjOE!)-Zyy&C*t{@@# zgkor?p@h6W&8UG+Z>Eh@I%I+RVO6;1(RXV|!ANV@wU1t%tS46GMOoHAm}X5>_hJUB zdsYpHz^T~Ds3n?2LQ(`qO%kcKiJzm)H?DQP9a(QrpN4dHe7#{g{9yNb3)8R-5OZu<5NvTP@z z1kQTos9Q-8!Otc>!(g2u>O=`Zr-4|Jm6eSu?VwY6k@UsEPa$NJU3(i!OG+LBH<8tu zbm8kwj~-ZX_t;3L5Q&e<2u{ZK3gzZ4F;2(l|8$gi_N!WW@Pre2u!D=L8ASNP z8+qT&(5IEYebKqNnO*ck_@FZP*Y5%PHY`%skW-#z!iQ~yK__KJA6kUKH-WEjV!7&2yqO&?dfd@up^po>k*Wb~ACP3mb^yef%iXhG(oQJDU6>re3;^i{-o0FW;Am**VXF}jWlp&R1irb`O_fIf()*R*U%gD@1IsX`e)fHs#< zB)|`fTT7r9IbQV}DPLl6yC0e*kmJ;kjxmH*h$Tj>so4JY(*cg3guK2|htO6)7Zp3H zl+U?TValhf+7Z!rEv3?{zNYDa%xCkx5y9xdv^KTIjP(@<2X_W`HtDx?94;kWGG?%w z6{ZwEW&{qf`7>LZgikP{fBF@SVB)m2xg*k7?-ixE-t$N=VsYwkj?m}>g@DVdIv0hE4o z5R6W|Xf!4`U3kHpKqDRs(j(v*?!T#KhLp}jmOvTk>|(Ml0d%M|2a<5Jn?Gql3NDUp z_UE%%l-B76sKR%VKaHCsbKEV`=+V&xMt%bd$DUeo#d7GrtW7%rt=|thTBZvL3AMY? zfMTrw{Y3x!ghPj5`BPIxd2i&+jK%PC3Ul5((yUWGs`o8AOH;S60Tqea`A(f2-c>N)pRO6{H2SFxjT zOL16fa^4u$E~DTaFiqSk#k2=xrDBQFChG-ekhgUH-_+uP5J_=ocQ-oHQxFXTDqedn zr>3C(ivqd-J6em66M5d0dF$Urx1byfp@aV(uinX1x_5S>`@5CbnR54)RcRX6Z`&Em z{Hdq?0eQ{Vp*&l*8gexXR)s$v4fmEQL=I&SWxDHhu>P4#REL=kaEc=@NDE{GK1(53 zHNfICs;2|IF0fV9SbZf%x^RHR0;f7x%2yyxA8C`&dR*y(!v4eT(@KIQvTwrAACJtC zRaE{iEk)#jsKOG^5CkYiCV5O`F&m1Nrupr7Df}f-{KeawQ?L$DAOQgZ%a;=q50Ro2e=X#lU3?)z zHPz;jeL$CP-O%`C-xmbjb;_7+nPCccH8^0`}Q1}}I zyny=Xed2{jc|p<;o4wY?^}x_w?s^Z_{*LU6vJFT&y=%7jcLi@ImQ;=m?s0nCGigpQ zgV=AJj0k-=DER{6hS_gv$XS=nl{}4vC;Q0_XoO&LeDQbnwJ38i(#S%wT#Xs{tYV8J z5B9OKf`joq$rNnUCFNctoUh8GP+xS1wAwj%Fj*Oks;dmsqU5uN-NoID}#IK*C|W^b6M$ZmFdUw{tQLD=OXOn4VG@FRzm4;&if+Sski`- z5}Dof`i5PFvkaDx{Kv#h$&_QC?thu{X6qNWvN8We5GaapQjDhAic_o&5JII!CHKxCaO~pFPTGMVsP2vBak(K#a$M zGW5Rxy5!wSq)R5y$q#nMAm5FygJVOw`#osy?^LqF7Ok0qrBCJfDw|uJ@l4pOaivAB zmO?Xm<@v;ux?DD2gm={$Jkm}Vq0P5`=9`xof#*ZSF1O9kEk(U|4ON7MJQ=A=}p-tRIv=7Fk-rBdce=9l$=Sh*Sj$=RP5hQ-|hRS~&lnGrJ$N zO)m5kZQm@Eu(b{QPT-;U?~psxBXu*kbcdOU9wiyWX>ZAi5A>0uj$O7Y`kmmGj9eXO z*?-kM*E>N=1_=1;TkLF8K^%@O6g+cpBsQN)>5R!&a|hH?Hw@2_B{X>gZ~eOG|H7p$ z{QTQo_SY})^r-WSgwdV!v6T_kA^FukLaMx-wr0+~(p59?8GRqUPb1Bu1{$q(n$hkF zkr_44K&k8T^5en<%AcpGlZ!qi&c;V5%>m1Jfj0BBhBI}TG6CzH_dUl@@AZlG@z^Vi zzomaXj1SpRXxo98@h(53ksOH*==!mC-?6=cyMxlw#*LcIRV@3C?D|9V@6?WB%~Vbf ziv0b?xPNa`U??fDQi*}Ri(Oi);^&eaXGxefITr_7+fn|Lz$=79vEJLlPI;=V1)!6< zd>Cyi@}Y_UCoOrg?Js@hef84QH!mKuTFNU(Ygv4xBpaBr;5^XX6f1UN|B@)^$hnix zSub}+(oRFq$&C$@^{N-JA3A$-i@pqLbIfiZqPV7!xmbSef4Scp5}}9{TXhQ|=edB8 z&mUO$zk4Qq|7L{nC-d#w`u->*j7X{ylIuUPxBO6A%GV}frG&xQhNpSmqU8SNg;oSi zD9T!Ju^h7jxz9FgGOquJt+x(~s*SpbhaS3R=xz{@kZx%e5J5VnyF}^k5>SwCP$}u| zkWN85q(Qm`zI*g}-}m>&cU^NKg3dW}&VBE*_gZVOO+j+yg@88>c=tCe$k*u7pZjqL zGQMq3dSzHFq)czB#~|G{j6a1yrky}eqeMrM*dm>Vlntv;g^mo>#H<;Cq(>TBSE{?W zrsxrj$iSc%A8sjJS4v*msLB$wX+=k2JB+Byh)FsjfCGJt&S8{^8%f?3nC8c}d<-(Yh(+%J7a-r`)^~y-5fo zi?j{E4_M1tZi7j$A}@JT8$);^1onhQP+hsD|CMlqxbrGZVX}@8sE4|=60RR|)A1CM zU)%49`a%)ZaXCC$C3z(-(dl$FwgB3Frpl)fb*O(x2&zX0i7?irC^j~>BL&*kmxLeH zFHQF5_SB~&0NJstR#pm>?BfG$<0*LD3lZtx)R&|euIP5y1&rHs^6@$XcOlcwT!HK! z)TO%Rkc022O-oKk1BOpmwGvRw9^sVQDB$=jJqK0R%~64+Kh&AvPnbUd7UrXdI1v~A z!ce2tWrQY`ZN`wTJz0yrWJ*E4cX)Q3-8^GIaqG`e!iGYpP)?PF2^99PW~W;O=9FoI z1_?56_be-k2-KTNSKke!Cwux?aTeqB3aB2f0;)QL))6B{bkfw z<9_bM1&I>XLy8TdOFA3YzdOqJ*is&kXU19i^&rC|jd`RrZJ0DPhcIZZ!)acUq+Kez zf5>3LKTeZo%w6m~s;Y5B)3?Eu2W{Y`g-k#O-G7CvnalG3Y!(#(dojC zXiFvyZd6bnD|I0Sv*sxdzHkRQEd08{tHvOW@U?3-XhzhmSjOhndvxMozvsf($%_qN z9N5V+`_{4&7E6@U0tDxG~O2z-`eI?xbD(JR$H>diZC_)s`!{`yn{lfQ)?xd}rc zep>}vB;b~{7hC*!%p!B=E)o6T10*lZF(`9fmBoPlgJoi|`#oXrW2MKR5W^G^qgu*M z`92}AkS$x~AoW`@ZS79bGY|5tj#FA&wa$K4%ku{?-M=tT%Nye``bo~suErQZD~g{2 z#LGC>Jd`((v(2UVLge+ITc5tl>k|E3od`90?C5z9PXw=xGE#+`o0!7Cs z%5N}&5!2d|wKm`B>ZfL_vdDH3ObIHkli3yHUkjJo*ajsM1WO|%BqU@9b~sUhwoxLc z6Gj~Lsa8Ekbck^^1}~e8l~6LygOikT$9+M<&)w!UpI{*RgPyxN2}n4Vr2ooSAkqV`IxrKSn}>&IZUA)Y{H=3=()rPxGJI=n zaMJO41sQ&)oe92ZG9mLT%ts#VdT09*E78;#%s&HnMG|y@Mqfy0`++Nz(`%FqDpZb> zA{%FrGit#Z5+In_^}j9dM`;8+QdI_HVd2vPgex0@EXOaKMNE<>B|BbG4Lu?& z>E=6kTR+qtzFb=JcKty?@WD(A6VxG>U6mI zLh4Y+G{gucbUnzIxT*y8GAj33hq$$QuG z%0c1wGM&nEj|b9rwATBgx)lH;^tV73Bo8Q0&;$+hyoW;~m%S1(z)}LvEVtbJmhttK z0PGQfal(K;9WI##@?iK39iaUNEd)Kiy>K^%m>3+0x;xrsZ7 zNG3~JO~EwBE!2kH24jiJ>wwMeDT=%gi={oM(sMIQb5q@$5tvg?2+xiv&uG-EYvi$# zV;;EuO`cAxu=0zI2=ym>D}*>GXjK&h6c_S@66gLrB=0da_dCuPdA}K2cq{mNoBh3k z;?Uc@ieAS*mrh=X6NZYm7nKfP2=K;8N_3Fe082Fw0O|nH#&5atm?B zsl$$>>)mm=z1)6G)h%x*5wQED%8ml55oPvW&tN28BbpzOpoI%0*9OYXP$*RZfbcX23Zfb$yi$i5VR#9uk>}%4-UnO^s5ffaP4BTyoqa&7J@GRIVibotl)Pnec*U| z;}f3Qtko7>`)pO7glX(>Wgxz$;;$r<%ZR3l+m8h2jfqV!A7@6KO&DN>jR67*H0{1D z(wA@yxn|Cu-70m+9DrI*qDNhX_!ZsJlK%>Sfadq@@gzJdJ>Y+HS zXkNkoc;7ja>&9{Fj%Gm2PwSaR_TpF&g)3V4DGd$n$y<2RgqfA43TYCJ8$r7I(l&+O zw?Lg*(k-t_1_hHUyFdC`h_s|TNNqG09(KkW#x6CVaNBDikJO#U1WMfhq!*mN!FrY{ zt}pl47)#8K)59gRD;wvM6^F|<`1E_uxBRP@Rhg z;UrJ{58oMO7%l!L+;Dp|(FA6cy!hP+w#7W?wSjo8-wE3JrL2OXMs+v88!gAB@4H;8l$+=>tw3m8= z0g5Iyq)^v~d;vP;$_Ku>V#!8=N;q>gNcFD)nY86pU@l)VoKqr<^SR<9# z=Vye6O~2O23U!8{HumAyrcX&DcoSH9+peF-nAmhKEnoQFlsVl2)^F?JgXzQ%#l5>S z>TYEcgQ%+LLQ>rtySD90pE{T1Rn-oNd#$UfUF&_S7+jHD{|0MLE^x_JqP*4OYhEmc zSlC1=QhKmI^H_6@#2@l3`v1ydE!RdfCZ&;HF#5~J>gLNuQXUKB`xvg`JB%bc>_UI- zVkxoK;%x3hKEk|BM(WD+5J`*fG_Wb`=kA4l9JY|f&vZ~7TK`Zz@ZNo7uYI@s>hxBz z>aNyMc9vo1EQ{w3ZJ!<}=T=k-Hm}f7VMX0-lzMMX9;_fY=mz*&3Q(WB z!QjH>s>JY(hkLuC{*UGH^R#Rq68rvZ`83NQ&~#5Wr|1orWdNs%0wY$G4z;>|Hf8yI z=OgS0uN=&30#pG&M-v6rt&_~(1An4=6wh^Q_7690rX7zv=5nHza(6~@=W%m@857%` z6cpcQgK?N_tE@}cf_qdA^j+neFPc{dAl<*Kz9b{LlN4g?#BstMm6a83s>l3Q=0>%O<-kXK0 zGP`kzx)Kov3K2%|`##KRHw%?%Cht!&)mErh>cmkMY~va<(?tDJarO4b-;ew~V^@Cf z;~M`w_9eE`joILwD@PzNw^P=8C5?u2_Gb0a{GPf(e@0WqMG_4snhGq8i2KofDri|I z&UF}Ea6=}`g|&w>SL0gNE&e0(-@2HFO7m9P#iKODV-*eUTZ&8wa^cged}`GJLqOM9 zRYIleZ=9aJ&$CFiniF#S)ESi{?k7xiM}O9C8Y>pE)*IVt_ll@~QSj>FLj#KTXzIlv zFGsHW_knV8?s)k~p?MGFMxCJQRBRb6w4Tea;641do2`^j#qP?8@Jh9sK$A@sj$j{}AUK*8)_RJd=W`+I zvrFH5^!wOw`2<*>8{T9-FkNW9)6C=i4`mSN4#u?0C%2=$cPc(i3c37P!c?TDm>5V( z8)r_TOWN;z(qqNMvJjM#B|bs1^@`@TDo%jKedlI}jRXWTA7ycWY!0EiYqzV zV<*w(8@#o~RZB;HMTxiK@w&*(EU;uYu>QddayolXr)}&Si|Uf>53E#*8v11FYUcw* z<$QTUZ_?!};z(tM(6$)<)#GONboqeWrI5%+@Rwpn%Dk_(4@h)Nlc zd+5-r`9~q%DJd-PEmsqlQUda6A2dH4Zlh7PEIev4tCcm|zX(hP3b zEJlRnSv)T9a9Ro8x7{Ylv7|wphM<$q4rOc>O36-d2V3E30W0n(k{C7rxB8h@I8HN7 z@|r7h|D6%-nct)Hm#6;p6m3p4L4>o;Y`}(-uuDS*Nxif;%BWlj^}RZa#-#sFVH$G8 z_5;Q!ml$0JDDHfx%vpTs`aK6Y)I9@8E+K71Wuwb(+B7fP zAY~tE5~iEL*)6$$J^d&;i^3_N=c&JfZhweQ+3&iP#!u+$-24P8*Z_y1b%_9p4ajtG zfsY}ethcter9e9UQ=qKr7$YP!6mF~sfDhn?S3njC|Cp6BmRmbLc2UFaDwa%JB9}FN zQ12+gT(26%apk&mKEiQ9WLq+HxQ-pP9)ZHCO}xWLm? zrCE4m7HD3LL4x|q&zJqAktQs&%zN&@j|TbhEqsgfdQ zlx?S}$*TuPDDe~S^rmpXJc!v?2Qp{%CAj|?DC%B)GeZZJ?--~A9xr+z{j?RZH7#Jy zvm%`S>xOU^Oki+|fg&mBKa&GZ!$Oo61Pz6MelbuKTJCuoTqz(gNNTR!upzcL84S-% z-^d3MtGNoyP~cmO10#{QwmGpWZKT;Yd|SmNqjWf@Zd+@q&k(C0@}6}(=+26ieO4W{ zKCkFP)3r=psux=5^Hwb5di|`jnMhgz19VZq`T0NFnRl#!s|QtK05H^NETGS`dZ8!+ zu0+rzTFkDrpr_A$!Yd6Ae7ij8Xd z=rcTZTF_!H?dd53&iqG-ZYbD#rV|BEArVuQ86K_!=GjXedeG-!9;;g zME%vb)B|&g3Nn;}iV}s~+PEKMcow$1F-UVUzB(2Gtc#Yy%ByM60^ZIILGIp(bgU#V z)b*lFJ~U}{$86O*T$kS!IJmgy#?#JiZ*XioKD)>}ZX89o9qVt2RDQW;9j5M_hDh#q9PV?Mmo$sBM|d$l>Lsypr{E<2ETc&%*iQWI+f}C2 zT)G;5(_ga<5EC%D;wQ-D;e_V&?i>1>n~p=#eqo7?3t7KPr+dh^4KP=&6B`r53fVxuby`= zn>1UTtcQJFAX}FVUcPN_DZKmMFo>24;gox6b;aZ9b(M;-J1uir*OS2)0-p5yiv8g) zly92TvP-_^a$?iiB|%*t>P7^AO2g+4(s>FFlU znI;iIse>WSpxmZFsCr@Gsi92i;ff)5dHg)bbm7F~jGyLHk5OisLfj)Y=QU9;Luou6 z$GcRRhpEVK4kwBtW2)!^Q4T|YH;W}UMgRYvpPv~3I{+F#E&LVVXRT^r?N@CRZoG3v z=yKluHuRePiIr|(3F4D^j}4f4M2`kPVe*FL1`)LrW}T{|@|}lhy#J zz0cSU*|JLUY_E+6p90F(To?_%5n2omxW&gOf(@pGsKTgD1zcqJtw%?^f+rrMzEcx| z*H_WiiufM;T#iQT_-WgfZxM#qwqkA&#O$OR-~5hFs(WGB*+8t&oVQ+UvQA#MDjL^< z`!6qfNfVTLO+$eO?U#R-fu`Htr<8_LqY+f+etvQHg^iO`yDVN#)!vIYSSpi!SSV|k zu1iSY)>La}Spn(qK6-hU{YjEXEj99;* zVGE{b4Rza>O@y|kg(c7@S!U=-^yRm&xS)1uD0?PpoA6ieP=gl4-HcXh5lyU|k;7+L zqE+Zyu%M|CqqS(4qhbH(SaO{3^;Z?YITnR+ZSx-gtE?vdoIjyU@33O_OFpCGUDXIH z_K15hp=M;w^y}oU&F8?Mk8zqQ@=E@g_CyOKtaicdSc$E%#CBx#r_b=sRe9UL?BG4R zDsuPg3-HwtdA29DgYvi%Qo6Q!ezAV!;P9z!F?CVd){sR(FMV)iaCMkEn3~2B)nXWH zb;a!k=^A`hFoHabX-|47h1UZSm(&W!0rD#J@o>J1Y*?OJo(|sd&mS^>7i=HV81`I% zmfz-EW8$FiU$iyQ8!dLPFUgcgLhq5zf8QDw;jq>U@lsm#6J;PHF&ov=kYUmvl4+DWUrf(eQ| zWNV@tshxxYLM_L0w55xCqx{Tqn%8)%Ybd_Usu{}Y3Pw{qOKoTlpUZ=O9qU#QpdIem z#G0DMZ5*DS%vEeUK`t4De^9nf$V5{fh_IIGm0KOJidEWHV=Y+HF)q9CIXj_IHiP&$q)N`u06WOSwB4%kh zalg4oun~}Z(v`2x0@@A)F>UkN3sbK)RcKB!4FCKg@z`#?WdzW307$k%dVl?5IKC1E zFTiu%y1eW``hc=EBM(F7X>bohsuXjqHB&+A~yR88X~Ut$nW zQRMEN_jW`AT)qexzZ|u?iRbn3TH8E2oJcLVnnEyIaJPL4g$;-7ICITf zU&^{4Q{>i1r}?0lNVp`F2<rnq`SSf$j-HP)XXeLv^!y-+Qps#yQPKOuDlLUJc1ZC5 z!AM+QSQaB0=|hDO$e+vAk)yqpLc(8<5!n=+UOSiq+|KOKlz) zpjI}ZO85O)0RvKi*GlKN*8}AsMT5`cihRI{A>)Zo%YdDN?TaIb2`NNye1u1bgggty z^GE&UNJ9Z;QwRAW;m?yC4r$_7y~zDA#&)8dYppYq-$W@y=Dhmu;H&L z)cd5zNjV4S)F)#zcpGcuod%igcMFpgt=5CP9r?pWvDkuv`-{KrkbF-5Mpg=so*%XB zuAJSUxp4^BTh@G3r{-7+W)?;*FYZuJDido!N7MYBQVYy5;Op{{XEN=T(idVd>qjEtlsH?UpaN7HoT!AaWC5{ENSN9MYFkc3uUj&~f&E zomyZuMX&_wma!~5;1%pTgxoS)!IE$LgYUGYg|fSJqP}qF(hT-t>Z12;n}N6ZyZ*qJ zQqI#RA4$@_ZS3Q`dEZLmAXe3)+Smydg#lO6LjivU%9jG_3tHRcH5Ta)H)72L?)>ww z4(aHEW_gm{e%S_^z>`FfCxaeXI1Saiyu577^*0^nRbfhyf_EOv2MJ6}v1`#F134gs zR@Rb&*$QuKv*9u;2IC}l;wg}Pl#aiV z1pB^JoLC(rVd+!1S)ArrX8{FPxC=wX8!#~SEM=V76D#G65AEfnZyU4d>fdC6!OkR{ znS;CG@Q91Y*b0cu4Zv@49~NysTA8XJGh@*1WiS=}Ff#gzpz1nxejd3-o-8HqV7g3m6a3TE=C_EoVff2$;Gu2Nt`Q6)e6SK@(E zhy|!gr9mmA`SlgT-%{wGhtq2>U@_ctc*qUO%FRWB6H<4#HwciMi-X<_F;57@^Wt|m z5HO=bX6jv-f#EouCmb8|hnpOE9JZqY7pT`jBnx;CEFddnC+!sAN+*YZlG7Y{T!=r< z*QG#E16({kkbcio(lbGiJLtyngfWl*o81&c#N&jU52?9nTseBdP_gLtC`6t!wwx2q zxQKXgbLeH8*8GN%z{Mv9^U8xj?-@ur;RZe)N8Kc2z_> z?Cd1jHy*tw)}`MLyp_ffxW8~-0n!Gycn0SS^p5|>i5brUPAtT`<+7U#k>zPL(1&AD zqCB2=lrhUdLc_@d{!3tqz!}TmK=AvX2huhC@BDzn=?WAo59v6XphTQoRCxoYAbXiM zxX$Mh#F{h6I;9mAndsf~jhK02_j202XOf3(F+N<|P$GK_gi*I{*@|a>lo-B|ZDjHy zWL1J0v^!CNUfY|k#ss=u;|92Y{33wv6(XeG3$Fbyi*5L-T>|3-|yGpWRxYFZnHXv#((x#;^iUmVBC^5LtmL+NWJC zVacj?Q%E9G#>3=U98qmbIq%NBz!Oc-X%)HUcHd$8w+#FKBdktttO=^{72I?luSii$w&`u{eZSSY zjn8Godr8E?_#3JEboR+$o!IQ5({#~UK3;SK~hX++&p`v_&zW|#+w7MbSt zCz1B1EgxZ{jCL0vM|GyMZ)rdvLEYZX-*vpoC51LV@MO}o% zo44=V+FsghG}>TwcAZ{an1bN}aQS#SnAE22yLy--R0ygBbu5h=6*z=vUG0oEk&wu{>sqzZxEC<@j&HFbR&i?4{_wSn+)|)`1>mUBRJ28xDj(UoL`wiClE9KT$Wv+VHmd0*w5`KWi zz-IwInghmGH4KAr+^7>YXQYe7P?=62P5a(X57$J*R4m>6x0FOIg^Mvy%F^+8Y~&3+-_{bO2lwUXoq|wY;S3)@moL>5z0viu^~{x-^Bg9vd%NsU>a!C=I`0x zY^I?WP=XNkV4M)4qD%hgGZ|>-U-oz0Rw7eGs4|89?=Q$hdCP8l?{Uhs?}XFR(z}Cu zef)fd---UbxYU?Z4P}jTpn05zy_Sp!Q8Aiqz_){C9#5(ja`+WH+2WC_YUJU(SR<#A zW41msHL1#rRU68v*dDzL9}8&d*?c6tB4N=Bdlq#a3%_mPwLxmKe1m0e`fEH1b8m{= zwxaE$(O7jzGJv>Q<{;$qUJjS92TTWc8EFhFtVO45pvZ*8?NWjUu5 zGWxnApm>;fL?Slb(1xL`)yo#;?n?f-k!D&i=BAGy;RM%m>%FB|i^nnNUzBE6!}q(5YE2_q z3+_v0<4Rj*GjLozDIXf}_-l{y<+Z&YAZnTZGa`7b+{k?>(i*eL^@n%ZfND9ES~s-J zYq!=>+b}F;8UEe2H9U?y&=PqJYlUfpW3bY3Fo>?CgsIA^)}_j9@*0N1PRv7KHQbp zZ_f&g)KV!D33Km|yXhWeeVXqi#o2v-?IKd~tF<|ddM9%k%bYusx#IZu$3x}agKo@1 z-++|u?c@Fe9HWEylDckI3J=&!P<-~njMfv{zQpvlq8Y!jF>E{&BEqAaqhb~;nl(Xg zo=+i2D$%AgIj>@bk^Na^b)@|xk@nF_$RViH##>uXzXpGQtJwZ==l>K&DjczvC$nqc zO1R65*h$n=OWi#@=TO1^w8z9~0$P3{dDrxBl_m?(^Tb8(`bxbDWPR@RmN9w1<=7au z(LtY=7~YGxpSm!u*@a?gxHpQZRn+9|!&iuKX2AX0TZmpS16^FIoqy47#B;G5nKMUg z&h_U^Etm83laWD6?~feqi~}E68o3Z3-wjer{rSk+_w%voLg7QjprG|{;fEbp*2Fj^ zGPg~KCCrR63;(A`Yz zM-ACSp7IB~u@s$oHikcET76v@fRPvN;#!{~+tbPxG9T%_ zv`HU`AC0K(ZHh$4n!xzTVHlGCQ9nZY16Suy)zzNNdJ>1Go2w}KjsXjU_IlnjjW44X z3M7w$+>(f)I_`b@QrupcHB81(!kIU&%=Xl%+-?-|PROQ#N7%+|_7p;zt+gpWSO)>( zP0>NJSSIP~=y9q70{U~A)JrRKZ&tU?`*KZ8dSO47>N!b%#A9E;+6wSJqy_)GZS^!f z*573vehxO-NroCHqkESR%moB||0ucpus>zgYA^rcz88L}9!{yL{#%>~=O?g!0&Zb3 zLhF+C^5m|d26TeRbCLeJaH%S%iEu;o$SGy1!8IjHoDT->tRD;-u#`XYmp9>hZ0~XS zxKAyp^76i7GN=7C;c+Ez;q==Ug(v%2Ux4urW4Oq?D5iSt<@6rC+pn+qSj16Lx5BzPOHHWFY70xNcn@j5zCi@}}~q z%5eL-vC&Sg7(RpsONK9X$gH(^4$4qKNgtK$lk&|NCX7P(>DQR}Gblb6wzj_ND^U~a zvQhJ6oB}d%Ls5TDOI8*;{q`bMtxQg7@uR-mqA>U~#(wFTAPug6N+2v82)T*%hHaM zMx}3%E`8KOcx3PDQpl;wSi6W;YCoP&T2y-@5x#P9inRfGwlL#Zr- zMjW&L=?M)+LcPMTIZ*|SkxgN`zIct}!^YFUp4q}Ef?$!4?ZhnKGRyw{ql=?rtULZH z+DC<|Gybf$PAhVubI+R$Pzt2Qi0jEls%qpyuC_rw{iUz_n42 zRrUS)_KUpa^ZqLHP5oo6&QrG5tJGHQ;(1WRIbEMx>3N?`)t%4UIGs&tt&J;l?QeZ0@8pim zY{9-ja7M4PgnUDwy~*OI2}GqqlEh@ewuC|u@d&UBC;ViRT2K*@kedtjM3EdR?W<2FrcitrpORl z8d>XPawNUt)g)LH)QHQo$e6P_tSP>DREvs-A9k%Ksj_Tsk(Atd^uBmx06m%9fW}w1?d{ zb0!F@!bPbP#F&Yi_1w_LhY4*{{Lll;2M%i%VuK=5Bo#%D*iAbYAEt`t^t->=Bg))Ryi~-Ud)iRsR)dp3 z!!zvliQVS0p>u`1aXL9fE}z#1@2%$A@TH!XqMrneV1o+XvfFlJ7;4rhy^`N%kBTDocIR zzGZ0zMmQB0LE~V&D(o{KzTLQNj)!b2%8`%bjES6Wc{43REaH0kmFO3dWKkjwk8+uZ zdP0nPXA#ymd=Seq-t0lfKq~}Ym4A<6a1pih7|Gkoj&$iNfb=vo>W&?Bj~ zLB|U*POkqI!Cu;yEfeYp;-%MdLS`4-mwJ19Tj-z{zzs*hjF=Z6x3uxM@SlO!KbYW~ z2B8DYzt^30JIdF+K#!gaQ8h4=tn-|skrQi1u5uUVX{ddNqSbu<8RN-JHoALVz!$37 zg6Bj|(b#sCed3d&qYc+=VH6u}9Be=)>j&81H8A8774r2}1tMIp$@o$4(TJES%pCMy z&s19Af??q8a-x3^dBjo2^KM8z+=@<4vUdz`Y&=R$IJn5Gs3S@XF%DZ%VXhqO0Fgd5 zgoBR^yAZbWXpvP>-?&1}p4n>sa}0N zUSV&g3FE5z#i((FX?&i<{(`_A&)a7FyIxxAG z@3_1WmVEEtB7f9JIDIu} z7DkV}1TAqNSV2$1qS-xw#y(CyiRE=01FPVMhnw3E*vrg2c4A*{$xD1X(QusN5fh8P zXuZF!zxx|WU*JynBkAM|gd`#a$i@8<%94AeFGVXPAaMRv=tU2OO+PyAs3jjk=UfnH z^6|!#VC2d_xmR;IT-;orM1Z3MZnPY|qL-kENa`u4utdrc-{D)uI@{M;bs^uUmod(= zZqL0RFi~`Hl#zxQKN4u@|MY=JAKit85bHryRvQNle#f||1^o=Kk__7$7tbDk)vG6v zxSgFgaa<7o>e+jCxeK1Xz>(qVH&dtHB-~Y@?zo@5!hDDf(w4$&aabvFQ+Wwi6%ypK z4Ncrn;wnL+9V|4btx?)P!v}w!ne1f>xuE(Uk@)(GI{#TAlOy%UAB( zuLVzXsaN7w zk`>d)nu5Fwm58{wbMg{3Yz*B(LXP=sM$CuPl7&0>%Xwjg`!1GE!W5+8G@(Fp`#Siv zP&YP#=~|WsJYAl<0cpaA&IUeL zuk~t7P<&iBu;5JrwtxhiuX3W#5cQ#e%6#>B>FZR~39`R1DT>B~Fg`G8I2=JdC_TY^ zN$M*#c~rDJ34cG1ZKts}Yz}o+@U1hB?s<%n^K^MGHQD!#7cC0- z5(B0R;(#t6K8Ry75diQ?B}i=x}I;yyyY} zn?9>UN=+AlD6XDK-&b?W(Ug*$UmN3=w3#4QS|)>IffWyb;G3_KM_~|us;sme9)7@J zoc0emu_T=bIiTIlOCMMx(;E}Z3-QZeK|lIydMEvx+xnO^YD>_{_lM75b7T7%XEcO2 z<(|8ojy_F;P36w(N@-x1EM5Pog~$qFwOkE3FlAr>Y`=Z!{&ooo0z#($W~MLIfk&^% z`!y9y84@hJG zUgdLbrue@joZ?_|jm*JqNQ!KGw*2bD=nhV= zAVHYQaV38-mJ^#SA-iMCfA0AU+Z6Udn7D=ONaz#DLeU^9Q6`<2L?OI)w|~JKd(yrd zUI7+vRLD$3;5#iJCLd5dQ~wNA^z+~&y2#(slk0Z>n#z}rM#>MMpZJU36=T_ewq?|) z=M9}iAr3zyq6==ry#k{Y{;&qV& zIS$zP@%=ZJulyrpz4uIKs%^CF8xI5LqBK4xrZEMd(rl|jBi!T9Jrg$`U^Cevdc=#L+$y2r80K=95Fz`}7W?f~% zIYialIrRgjvnL+bQb38KU>EW^msT}6mJi5 zd>qsY`z@B3xrED>7QtDTvk*TawAEXla_l$uVgaTJj-L8>vEkv~@;uI)0O*4hV2E*t zlux)iUp}yX;$@I;K>06$9n_O_VWM$T3A0!&`FWG_Q#;5QN-Jx>-JOy`3Q_35)X^Sl zPa4dyXCFveRw`EzBepF=o)gK&*pI+{`Ceswig^cvSf7xvUz5D3k<5Q|3{%O%z`W6q z&BtnRUwL~F6I#iYZQWeO=A*BYCgh1jQgAXLYEZFSSiZ9K2eGta=j_$Er6h*`-CbtS z+|tp*zN|K2z4H%LqSB77en~*2@lYgc?hRG<`4Ov1v_tQh%3WZIph7FJyFmAca8a^j zZ}uJKP|}%@&RGI6IDX;jWMqwa6BA=JamW<43}XUufJ;vGNh`}|U!(o&h=BhR_lbw< z7*J!|HdoJM+b={_<0-d2ehvbu$sbNCY&F-cUq1AFl z{GXI)U12|%qB?L~`qBxJ8IXhIejBo+l*6txI?CSSMC=as#90Gr`MwEgK%`6^ZfxA(zGo6gr>SWWDbeXxM4 zI&R&4j6@tH)i{lw0D+2ABDjGtG-H3l* zBL5;HDm|2_?dzrlZ0>$2wjwi@i4Hm(By4i-~6RILGeV*nFB=^ZhU637(L)qwCm|Gjn00^ zd1M*Gg;~u)!2g*hU&RH8{M%lZDZk1xQFt$rZ9W{NB#!k(v*g|HU(LN*KZ>Tu)Q>{7 z$uhHFe8kywVmupp{H}#WPoam?;5Yr-;;sC?R!EjKjqU%URQHXDrd~L2FL&h+>lZGF zBhaty$foyNQ02v)kq7RbgnGn}G7sZ9TX~lB4<5c)n<+<`N%$VF>H+D=Mfw~`8JXBi z<@t5pbo#4y!dIe4Af?Y&{^v)K-^ijRo%Xo>my+tn2L9&LwlX=x46HqY8)g{S}xkX`$jAh?CXb&Sd4Cd|{ z(#$cl0YD;II-X`l$FAddYq~4}KT2>0KB1CC`Fq>M*L5+)xv!?a7cXn{ZOmor>H3m1 zd;PZ|Kv`p*(;@h?QN!ui|3}qZ2E`RE(ZU0PAVCHQ?(XjH65QS00>Rzg9R?2;+}&L> z!Ge3x;K3cfN$$PxeXnYM%qgguGyClB-MxCPZZZ3l54fYhV|cPixzfWz;i0YJ%P53{ z!-42*k+HTNNaW4KU^+Mj%zewV<^`Zk3MzDJ$J#54gO#?nNthVM%W)#xkBVa;EoX+P)_40;%I^j|L2|0O0{eAvg_~=P z;x(im`Ay^Yd{cPS;6G5)r^Fzb;!rGfF&v-rd(ap=DcbNL(}|%{BI8!B%)ux(372{(})6TI`pTSKV(cD|D@eK;-S&L>{qMjh2qS0DavZWK6(sUxlBA{)SC>%+c>5&V6tRH9-D6#H zps0Q;e@?$Wd${-IY;LA@%Q2^4OE=ua(buIrZ6i||ypb*0F&RN-Uj!n4*7yG)Oa^DX zxcBMIM)6v`kMn>)2trchZN-Yz*!EYyY4~!aWdgC{?A$rDAl+l}vjU}Bkk zKokYWp(1;++`vK#bAr0flFRG`lF_L-bgVolmf-(7AnQkUhW*I`#uWY=ZR9*%BY21CBKba*y5{O>)sv9g9)by|0bGf`UW+Yv!lrVN& z7tvdZ>BQsng_kcC*e;j0e`+3o6dngL!I`l8@3Np0% zk;Qqn9#-?Wy#T;z&RgJ#F}8s4K+#IYVmjTKE*Hwfjs2lc(`KQG8>}Ave>cYe0#CoD_Z)?5upCfD@gW3} zq?M_`i4e8!M7HtvD`lYoKwXAr;*+%1g^ePNRvXOvCY^gcte NBR0%az^ob`^4zz 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 diff --git a/flake.nix b/flake.nix index 22c8b5c..bc63944 100644 --- a/flake.nix +++ b/flake.nix @@ -1,8 +1,3 @@ -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - { description = "WinApps Nix packages & NixOS module"; diff --git a/install/ExtractPrograms.ps1 b/install/ExtractPrograms.ps1 index 54aa587..fcfbf3d 100644 --- a/install/ExtractPrograms.ps1 +++ b/install/ExtractPrograms.ps1 @@ -1,9 +1,3 @@ -# Copyright (c) 2024 Rohan Barar -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - ### FUNCTIONS ### # Name: 'GetApplicationIcon' # Role: Extract the icon from a given executable file as a base-64 string. diff --git a/oem/Container.reg b/oem/Container.reg new file mode 100644 index 0000000..10c018a --- /dev/null +++ b/oem/Container.reg @@ -0,0 +1,4 @@ +Windows Registry Editor Version 5.00 + + [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] + "RealTimeIsUniversal"=dword:00000001 diff --git a/oem/NetProfileCleanup.ps1 b/oem/NetProfileCleanup.ps1 new file mode 100644 index 0000000..3537063 --- /dev/null +++ b/oem/NetProfileCleanup.ps1 @@ -0,0 +1,30 @@ +# Get the current network profile name +$currentProfile = ^(Get-NetConnectionProfile^).Name + +# Get all profiles from the registry +$profilesKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" +$profiles = Get-ChildItem -Path $profilesKey + +foreach ^($profile in $profiles^) { + $profilePath = "$profilesKey\$($profile.PSChildName)" + $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName + + # Remove profiles that don't match the current one + if ^($profileName -ne $currentProfile^) { + Remove-Item -Path $profilePath -Recurse + Write-Host "Deleted profile: $profileName" + } +} + +# Change the current profile name to "WinApps" +$profiles = Get-ChildItem -Path $profilesKey +foreach ^($profile in $profiles^) { + $profilePath = "$profilesKey\$($profile.PSChildName)" + $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName + + if ^($profileName -eq $currentProfile^) { + # Update the profile name + Set-ItemProperty -Path $profilePath -Name "ProfileName" -Value "WinApps" + Write-Host "Renamed profile to: WinApps" + } +} diff --git a/oem/install.bat b/oem/install.bat index 3826f6f..018c510 100644 --- a/oem/install.bat +++ b/oem/install.bat @@ -1,47 +1,13 @@ @echo off -REM Copyright (c) 2024 Oskar Manhart -REM Copyright (c) 2024 itiligent -REM All rights reserved. -REM -REM SPDX-License-Identifier: AGPL-3.0-or-later -REG IMPORT C:\OEM\RDPApps.reg +reg import %~dp0\RDPApps.reg -:: Create Powershell network profile cleanup script -( -echo # Get the current network profile name -echo $currentProfile = ^(Get-NetConnectionProfile^).Name -echo. -echo # Get all profiles from the registry -echo $profilesKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" -echo $profiles = Get-ChildItem -Path $profilesKey -echo. -echo foreach ^($profile in $profiles^) { -echo $profilePath = "$profilesKey\$($profile.PSChildName)" -echo $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName -echo. -echo # Remove profiles that don't match the current one -echo if ^($profileName -ne $currentProfile^) { -echo Remove-Item -Path $profilePath -Recurse -echo Write-Host "Deleted profile: $profileName" -echo } -echo } -echo. -echo # Change the current profile name to "WinApps" -echo $profiles = Get-ChildItem -Path $profilesKey -echo foreach ^($profile in $profiles^) { -echo $profilePath = "$profilesKey\$($profile.PSChildName)" -echo $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName -echo. -echo if ^($profileName -eq $currentProfile^) { -echo # Update the profile name -echo Set-ItemProperty -Path $profilePath -Name "ProfileName" -Value "WinApps" -echo Write-Host "Renamed profile to: WinApps" -echo } -echo } -) > %windir%\NetProfileCleanup.ps1 +if exists %~dp0\Container.reg ( + reg import %~dp0\Container.reg +) -:: Create network profile cleanup scheduled task +REM Create network profile cleanup scheduled task +copy %~dp0\NetProfileCleanup.ps1 %windir% set "taskname=NetworkProfileCleanup" set "command=powershell.exe -ExecutionPolicy Bypass -File "%windir%\NetProfileCleanup.ps1^"" diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index 2af26ac..c960a74 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -1,8 +1,3 @@ -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - { stdenv, lib, diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index a89e092..401dd08 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -1,8 +1,3 @@ -# Copyright (c) 2024 Oskar Manhart -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later - { stdenv, lib, diff --git a/setup.sh b/setup.sh index 6aa9b57..885b321 100755 --- a/setup.sh +++ b/setup.sh @@ -1,13 +1,4 @@ #!/usr/bin/env bash -# Copyright (c) 2024 Felix Bartels -# Copyright (c) 2024 Coruscant11 -# Copyright (c) 2024 escapefreeg -# Copyright (c) 2024 Rohan Barar -# Copyright (c) 2024 Oskar Manhart -# Copyright (c) 2024 Sebastien Bürky -# All rights reserved. -# -# SPDX-License-Identifier: AGPL-3.0-or-later # shellcheck disable=SC2034 # Silence warnings regarding unused variables globally. From f27c3482a3cda37ff037b99853f1c4619533a8af Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Dec 2024 10:41:34 +0000 Subject: [PATCH 51/99] winapps: 0-unstable-2024-12-07 -> 0-unstable-2024-12-15 Diff: https://github.com/winapps-org/winapps/compare/3f44fc3b0fbe1437f2fb39b178fee63f81e34bbb...af238bd4ba9d83b527576df8e4d873bd97a9efd4 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 401dd08..f279c78 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "3f44fc3b0fbe1437f2fb39b178fee63f81e34bbb"; - hash = "sha256-5YOzr/Q7qfokQolTu285OPi+7cMvAiAsOP1o9nvyqPE="; + rev = "af238bd4ba9d83b527576df8e4d873bd97a9efd4"; + hash = "sha256-zXwoczD0zy2BKW+pZqVp3AHFQ6fdSUp5V2d3er8sp64="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-12-07"; + version = "0-unstable-2024-12-15"; src = fetchFromGitHub { owner = "winapps-org"; From a78982bda6222d0b628444f598e97739579499c5 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:58:39 +0100 Subject: [PATCH 52/99] fix: remove bad escape characters --- oem/NetProfileCleanup.ps1 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/oem/NetProfileCleanup.ps1 b/oem/NetProfileCleanup.ps1 index 3537063..e50a07c 100644 --- a/oem/NetProfileCleanup.ps1 +++ b/oem/NetProfileCleanup.ps1 @@ -1,16 +1,16 @@ # Get the current network profile name -$currentProfile = ^(Get-NetConnectionProfile^).Name +$currentProfile = (Get-NetConnectionProfile).Name # Get all profiles from the registry $profilesKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" $profiles = Get-ChildItem -Path $profilesKey -foreach ^($profile in $profiles^) { +foreach ($profile in $profiles) { $profilePath = "$profilesKey\$($profile.PSChildName)" - $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName + $profileName = (Get-ItemProperty -Path $profilePath).ProfileName # Remove profiles that don't match the current one - if ^($profileName -ne $currentProfile^) { + if ($profileName -ne $currentProfile) { Remove-Item -Path $profilePath -Recurse Write-Host "Deleted profile: $profileName" } @@ -18,11 +18,11 @@ foreach ^($profile in $profiles^) { # Change the current profile name to "WinApps" $profiles = Get-ChildItem -Path $profilesKey -foreach ^($profile in $profiles^) { +foreach ($profile in $profiles) { $profilePath = "$profilesKey\$($profile.PSChildName)" - $profileName = ^(Get-ItemProperty -Path $profilePath^).ProfileName + $profileName = (Get-ItemProperty -Path $profilePath).ProfileName - if ^($profileName -eq $currentProfile^) { + if ($profileName -eq $currentProfile) { # Update the profile name Set-ItemProperty -Path $profilePath -Name "ProfileName" -Value "WinApps" Write-Host "Renamed profile to: WinApps" From dd2c5ee25dee819060711bb366e3f7cf51beb98b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Dec 2024 10:12:03 +0000 Subject: [PATCH 53/99] winapps: 0-unstable-2024-12-15 -> 0-unstable-2024-12-18 Diff: https://github.com/winapps-org/winapps/compare/af238bd4ba9d83b527576df8e4d873bd97a9efd4...a78982bda6222d0b628444f598e97739579499c5 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index f279c78..4c59bfe 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "af238bd4ba9d83b527576df8e4d873bd97a9efd4"; - hash = "sha256-zXwoczD0zy2BKW+pZqVp3AHFQ6fdSUp5V2d3er8sp64="; + rev = "a78982bda6222d0b628444f598e97739579499c5"; + hash = "sha256-sslF/bnF1ofdwUBd5frPkZxNdhD/BNpS4aS8xbJl/6k="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-12-15"; + version = "0-unstable-2024-12-18"; src = fetchFromGitHub { owner = "winapps-org"; From 854bc4e85f9baf19571dcaac916071f12ebdf8a7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 29 Dec 2024 10:12:14 +0000 Subject: [PATCH 54/99] winapps: 0-unstable-2024-12-18 -> 0-unstable-2024-12-22 Diff: https://github.com/winapps-org/winapps/compare/a78982bda6222d0b628444f598e97739579499c5...ea1bd4f319887ca3d918cdb3e4524e35a81183b6 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 4c59bfe..b8f4d03 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "a78982bda6222d0b628444f598e97739579499c5"; - hash = "sha256-sslF/bnF1ofdwUBd5frPkZxNdhD/BNpS4aS8xbJl/6k="; + rev = "ea1bd4f319887ca3d918cdb3e4524e35a81183b6"; + hash = "sha256-GVjLNhkJQYiFqQ+FwgP+6MVWj4I0LuLnkKYQ+Mt4ycs="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-12-18"; + version = "0-unstable-2024-12-22"; src = fetchFromGitHub { owner = "winapps-org"; From 8e85c63ee5d4e8147412cee7d8c4e80d1d4454ba Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:12:32 +0100 Subject: [PATCH 55/99] feat: use cachix --- .github/workflows/update-nix.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index 1f9f76f..3b76fad 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -19,10 +19,16 @@ jobs: - name: Install Nix uses: DeterminateSystems/nix-installer-action@main - - name: Set up Nix cache - uses: DeterminateSystems/magic-nix-cache-action@main + - name: Set up cache + uses: cachix/cachix-action@v15 + with: + name: winapps + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - name: Update flake packages uses: winapps-org/nix-update-action@v1.3.0 with: extra-args: --version=branch + + - name: Build packages + run: nix-build From 983a305518fd00f85b0269a620d5e6e62792ba2c Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:27:36 +0100 Subject: [PATCH 56/99] doc: usage of binary cache --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 52e93f7..a060cd7 100644 --- a/README.md +++ b/README.md @@ -489,6 +489,10 @@ First, make sure Flakes and the `nix` command are enabled. In your `~/.config/nix/nix.conf`: ``` experimental-features = nix-command flakes +# specify to use binary cache (optional) +extra-substituters = https://winapps.cachix.org/ +extra-trusted-public-keys = winapps.cachix.org-1:HI82jWrXZsQRar/PChgIx1unmuEsiQMQq+zt05CD36g= +extra-trusted-users = # replace with your username ``` ```bash @@ -527,6 +531,12 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional ( { pkgs, ... }: { + # set up binary cache (optional) + nix.settings = { + substituters = [ "https://winapps.cachix.org/" ]; + trusted-public-keys = [ "winapps.cachix.org-1:HI82jWrXZsQRar/PChgIx1unmuEsiQMQq+zt05CD36g=" ]; + }; + environment.systemPackages = [ winapps.packages.${system}.winapps winapps.packages.${system}.winapps-launcher # optional @@ -546,8 +556,14 @@ However, if you still don't want to use flakes, you can use WinApps with flake-c ```nix # configuration.nix -{ ... }: +{ system, ... }: { + # set up binary cache (optional) + nix.settings = { + substituters = [ "https://winapps.cachix.org/" ]; + trusted-public-keys = [ "winapps.cachix.org-1:HI82jWrXZsQRar/PChgIx1unmuEsiQMQq+zt05CD36g=" ]; + trusted-users = [ "" ]; # replace with your username + }; environment.systemPackages = let From 996ff12c7f2d47f95a175af9033dcdf104069479 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 1 Jan 2025 16:29:10 +0000 Subject: [PATCH 57/99] winapps: 0-unstable-2024-12-22 -> 0-unstable-2025-01-01 Diff: https://github.com/winapps-org/winapps/compare/ea1bd4f319887ca3d918cdb3e4524e35a81183b6...983a305518fd00f85b0269a620d5e6e62792ba2c --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index b8f4d03..68e1bb8 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "ea1bd4f319887ca3d918cdb3e4524e35a81183b6"; - hash = "sha256-GVjLNhkJQYiFqQ+FwgP+6MVWj4I0LuLnkKYQ+Mt4ycs="; + rev = "983a305518fd00f85b0269a620d5e6e62792ba2c"; + hash = "sha256-O8ewfb1957ICHR60e/aAFTrVpGHq7uz72WbRrZcxD6k="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2024-12-22"; + version = "0-unstable-2025-01-01"; src = fetchFromGitHub { owner = "winapps-org"; From 7a59b3b9b773924ef51e27834e48cb1036020c07 Mon Sep 17 00:00:00 2001 From: stceum <50257864+stceum@users.noreply.github.com> Date: Fri, 3 Jan 2025 15:06:19 +0800 Subject: [PATCH 58/99] Fixup the bug that when the winapps-src is cloned but $INQUIRER is not updated with cloned path causing the failure of running the script. --- setup.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/setup.sh b/setup.sh index 885b321..b0b4667 100755 --- a/setup.sh +++ b/setup.sh @@ -188,8 +188,12 @@ function waGetSourceCode() { function waGetInquirer() { local INQUIRER=$INQUIRER_PATH - if [ ! -d "$SYS_SOURCE_PATH" ] && [ ! -d "$USER_SOURCE_PATH" ]; then - INQUIRER="/tmp/waInquirer.sh" + if [ -d "$SYS_SOURCE_PATH" ]; then + INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH + elif [ -d "$USER_SOURCE_PATH" ] ; then + INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH + else + INQUIRER="/tmp/waInquirer.sh" rm -f "$INQUIRER" curl -o "$INQUIRER" "https://raw.githubusercontent.com/winapps-org/winapps/main/install/inquirer.sh" From b76598b3bb296e5a68e2dbb76fb3b48b59db0f64 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 07:13:36 +0000 Subject: [PATCH 59/99] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- setup.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.sh b/setup.sh index b0b4667..78dde91 100755 --- a/setup.sh +++ b/setup.sh @@ -189,11 +189,11 @@ function waGetInquirer() { local INQUIRER=$INQUIRER_PATH if [ -d "$SYS_SOURCE_PATH" ]; then - INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH + INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH elif [ -d "$USER_SOURCE_PATH" ] ; then - INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH + INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH else - INQUIRER="/tmp/waInquirer.sh" + INQUIRER="/tmp/waInquirer.sh" rm -f "$INQUIRER" curl -o "$INQUIRER" "https://raw.githubusercontent.com/winapps-org/winapps/main/install/inquirer.sh" From 03c702a662e1040444860b5f4d864edc96e8aaf5 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Fri, 3 Jan 2025 11:16:46 +0100 Subject: [PATCH 60/99] fmt: reindent file --- setup.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.sh b/setup.sh index 78dde91..8c6209f 100755 --- a/setup.sh +++ b/setup.sh @@ -189,11 +189,11 @@ function waGetInquirer() { local INQUIRER=$INQUIRER_PATH if [ -d "$SYS_SOURCE_PATH" ]; then - INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH + INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH elif [ -d "$USER_SOURCE_PATH" ] ; then - INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH + INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH else - INQUIRER="/tmp/waInquirer.sh" + INQUIRER="/tmp/waInquirer.sh" rm -f "$INQUIRER" curl -o "$INQUIRER" "https://raw.githubusercontent.com/winapps-org/winapps/main/install/inquirer.sh" From e897292a3478eaee5ef520c577e41f5fd18c87df Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 5 Jan 2025 10:12:40 +0000 Subject: [PATCH 61/99] winapps: 0-unstable-2025-01-01 -> 0-unstable-2025-01-03 Diff: https://github.com/winapps-org/winapps/compare/983a305518fd00f85b0269a620d5e6e62792ba2c...f4f4d3099811823b2ebe92cd6615ae5a1f26eb67 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 68e1bb8..7fb0c6a 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "983a305518fd00f85b0269a620d5e6e62792ba2c"; - hash = "sha256-O8ewfb1957ICHR60e/aAFTrVpGHq7uz72WbRrZcxD6k="; + rev = "f4f4d3099811823b2ebe92cd6615ae5a1f26eb67"; + hash = "sha256-QOW6oPOQo+glWiMxxJT1F8DOY4YamOh0s2SQs8wiaVE="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2025-01-01"; + version = "0-unstable-2025-01-03"; src = fetchFromGitHub { owner = "winapps-org"; From a98589ba142c5cf49cc980e71bedde778a36ec36 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 12 Jan 2025 10:12:26 +0000 Subject: [PATCH 62/99] winapps: 0-unstable-2025-01-03 -> 0-unstable-2025-01-10 Diff: https://github.com/winapps-org/winapps/compare/f4f4d3099811823b2ebe92cd6615ae5a1f26eb67...c98938776d3de2acba9d49f5e92fde6021fd434c --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 7fb0c6a..a9a5923 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "f4f4d3099811823b2ebe92cd6615ae5a1f26eb67"; - hash = "sha256-QOW6oPOQo+glWiMxxJT1F8DOY4YamOh0s2SQs8wiaVE="; + rev = "c98938776d3de2acba9d49f5e92fde6021fd434c"; + hash = "sha256-lnaQl6DW65NyKMC/nrnjtj9mOqrBOsZb9As9gvzosgk="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2025-01-03"; + version = "0-unstable-2025-01-10"; src = fetchFromGitHub { owner = "winapps-org"; From 4ce6204881bf97efdfde90b517171cdb19bebb6f Mon Sep 17 00:00:00 2001 From: Feyaz Baker <44121644+starbr3aker@users.noreply.github.com> Date: Sun, 12 Jan 2025 22:59:38 +0530 Subject: [PATCH 63/99] doc: docker.md added Win10 instructions Added some steps I found useful while setting up with win10 --- docs/docker.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/docker.md b/docs/docker.md index ec03a39..308f364 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -6,6 +6,12 @@ Although WinApps supports using `QEMU+KVM+libvirt` as a backend for running Wind > [!IMPORTANT] > WinApps does __NOT__ officially support versions of Windows prior to Windows 10. Despite this, it may be possible to achieve a successful installation with some additional experimentation. If you find a way to achieve this, please share your solution through a pull request for the benefit of other users. +> Possible setup instructions for Windows 10: +> - 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice. It is recommended to download the ISO from a reputed source, as the built in downloader (default set to `tiny11` will take longer than it would to download from a browser/torrent. +> - It is recommended to edit the initial `compose.yaml` file to keep your required username and password from the beginning. +> - It is recommended to not use `sudo` to force commands to run. Add your user to the relevant permissions group wherever possible. + + ## `Docker` ### Installation @@ -23,6 +29,17 @@ It is also possible to specify the version of Windows you wish to install within Please refer to the [original GitHub repository](https://github.com/dockur/windows) for more information on additional configuration options. +> [!NOTE] +> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker` with `podman`. +> ```bash +> docker ps # verify if you have any dockers created +> docker rm -v -f $(docker ps -qa) # will remove all running dockers (EXERCISE CAUTION) +> docker container ls # see if you have any containers running +> docker container rm containerName # to remove any old containers +> docker volume ls # for old volumes. Docker will reuse old volumes which may have previous installations of windows +> docker volume rm volumeName +> ``` + ### Installing Windows You can initiate the Windows installation using `docker compose`. ```bash From 8cd9dd7919af06a33bdac9710c4a6f667575bbee Mon Sep 17 00:00:00 2001 From: starbr3aker Date: Sun, 12 Jan 2025 23:19:27 +0530 Subject: [PATCH 64/99] doc: default installation is via docker, changed files to reflect this. --- README.md | 8 +++++++- compose.yaml | 8 ++++---- docs/docker.md | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a060cd7..8e6a6ec 100644 --- a/README.md +++ b/README.md @@ -352,7 +352,7 @@ RDP_DOMAIN="" # - 'docker': '127.0.0.1' # - 'podman': '127.0.0.1' # - 'libvirt': '' (BLANK) -RDP_IP="" +RDP_IP="127.0.0.1" # [WINAPPS BACKEND] # DEFAULT VALUE: 'docker' @@ -434,6 +434,12 @@ FREERDP_COMMAND="" > [!NOTE] > If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`. +> [!NOTE] +> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with +> `rm -rf .config/freerdp/server/127.0.0.1_3389.pem` and run +> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` +> to set up Trust On First Authentication. Then retry the `setup.sh` script. + #### Configuration Options Explained - If using a pre-existing Windows RDP server on your LAN, you must use `RDP_IP` to specify the location of the Windows server. You may also wish to configure a static IP address for this server. - If running a Windows VM using `libvirt` with NAT enabled, leave `RDP_IP` commented out and WinApps will auto-detect the local IP address for the VM. diff --git a/compose.yaml b/compose.yaml index e9570d9..1fc3721 100644 --- a/compose.yaml +++ b/compose.yaml @@ -19,8 +19,8 @@ services: CPU_CORES: "4" # CPU cores allocated to the Windows VM. DISK_SIZE: "64G" # Size of the primary hard disk. #DISK2_SIZE: "32G" # Uncomment to add an additional hard disk to the Windows VM. Ensure it is mounted as a volume below. - #USERNAME: "Docker" # Uncomment to set a custom Windows username. The default is 'Docker'. - #PASSWORD: "" # Uncomment to set a password for the Windows user. There is no default password. + USERNAME: "MyWindowsUser" # Uncomment to set a custom Windows username. The default is 'Docker'. + PASSWORD: "MyWindowsPassword" # Uncomment to set a password for the Windows user. There is no default password. HOME: "${HOME}" # Set path to Linux user home folder. privileged: true # Grant the Windows VM extended privileges. ports: @@ -37,5 +37,5 @@ services: #- /path/to/windows/install/media.iso:/custom.iso # Uncomment to use a custom Windows ISO. If specified, 'VERSION' (e.g. 'tiny11') will be ignored. devices: - /dev/kvm # Enable KVM. - #- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive). - #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives). + #- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive. THIS DISK WILL BE FORMATTED DURING COMPOSE). + #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives THIS DISK WILL NOT BE FORMATTED). \ No newline at end of file diff --git a/docs/docker.md b/docs/docker.md index 308f364..9b61336 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -7,7 +7,7 @@ Although WinApps supports using `QEMU+KVM+libvirt` as a backend for running Wind > [!IMPORTANT] > WinApps does __NOT__ officially support versions of Windows prior to Windows 10. Despite this, it may be possible to achieve a successful installation with some additional experimentation. If you find a way to achieve this, please share your solution through a pull request for the benefit of other users. > Possible setup instructions for Windows 10: -> - 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice. It is recommended to download the ISO from a reputed source, as the built in downloader (default set to `tiny11` will take longer than it would to download from a browser/torrent. +> - 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice. It is recommended to download the ISO from a reputed source, as the built in downloader from dockur (default set to `tiny11`) will take longer than it would to download from a browser/torrent. > - It is recommended to edit the initial `compose.yaml` file to keep your required username and password from the beginning. > - It is recommended to not use `sudo` to force commands to run. Add your user to the relevant permissions group wherever possible. From 0826a238bc6aed3f5e4dcb8c20d795e8b88c8085 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 12 Jan 2025 17:50:28 +0000 Subject: [PATCH 65/99] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- README.md | 6 +++--- compose.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8e6a6ec..81530a8 100644 --- a/README.md +++ b/README.md @@ -435,9 +435,9 @@ FREERDP_COMMAND="" > If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`. > [!NOTE] -> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with -> `rm -rf .config/freerdp/server/127.0.0.1_3389.pem` and run -> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` +> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with +> `rm -rf .config/freerdp/server/127.0.0.1_3389.pem` and run +> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` > to set up Trust On First Authentication. Then retry the `setup.sh` script. #### Configuration Options Explained diff --git a/compose.yaml b/compose.yaml index 1fc3721..c4fea0c 100644 --- a/compose.yaml +++ b/compose.yaml @@ -38,4 +38,4 @@ services: devices: - /dev/kvm # Enable KVM. #- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive. THIS DISK WILL BE FORMATTED DURING COMPOSE). - #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives THIS DISK WILL NOT BE FORMATTED). \ No newline at end of file + #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives THIS DISK WILL NOT BE FORMATTED). From 8a4d8906d31ea0afb4c802e0239594fd7a5352b7 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Mon, 13 Jan 2025 09:24:36 +0100 Subject: [PATCH 66/99] doc: fallback to pkgs.system on nix --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a060cd7..fac9f3d 100644 --- a/README.md +++ b/README.md @@ -526,10 +526,18 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional nixosConfigurations.hostname = nixpkgs.lib.nixosSystem rec { system = "x86_64-linux"; + specialArgs = { + inherit inputs system; + }; + modules = [ ./configuration.nix ( - { pkgs, ... }: + { + pkgs, + system ? pkgs.system, + ... + }: { # set up binary cache (optional) nix.settings = { @@ -556,7 +564,11 @@ However, if you still don't want to use flakes, you can use WinApps with flake-c ```nix # configuration.nix -{ system, ... }: +{ + pkgs, + system ? pkgs.system, + ... +}: { # set up binary cache (optional) nix.settings = { From 9c0c39845c454e212a92d29a7edd25bae6bb535d Mon Sep 17 00:00:00 2001 From: starbr3aker Date: Mon, 13 Jan 2025 23:17:06 +0530 Subject: [PATCH 67/99] Resolved comments --- README.md | 6 +++--- compose.yaml | 2 +- docs/docker.md | 11 +++-------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 81530a8..30dfb43 100644 --- a/README.md +++ b/README.md @@ -435,9 +435,9 @@ FREERDP_COMMAND="" > If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`. > [!NOTE] -> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with -> `rm -rf .config/freerdp/server/127.0.0.1_3389.pem` and run -> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` +> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with +> `rm ~/.config/freerdp/server/127.0.0.1_3389.pem` and run +> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` > to set up Trust On First Authentication. Then retry the `setup.sh` script. #### Configuration Options Explained diff --git a/compose.yaml b/compose.yaml index c4fea0c..29d86b6 100644 --- a/compose.yaml +++ b/compose.yaml @@ -37,5 +37,5 @@ services: #- /path/to/windows/install/media.iso:/custom.iso # Uncomment to use a custom Windows ISO. If specified, 'VERSION' (e.g. 'tiny11') will be ignored. devices: - /dev/kvm # Enable KVM. - #- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive. THIS DISK WILL BE FORMATTED DURING COMPOSE). + #- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive. THIS DISK WILL BE FORMATTED BY DOCKER). #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives THIS DISK WILL NOT BE FORMATTED). diff --git a/docs/docker.md b/docs/docker.md index 9b61336..7059bb5 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -7,7 +7,7 @@ Although WinApps supports using `QEMU+KVM+libvirt` as a backend for running Wind > [!IMPORTANT] > WinApps does __NOT__ officially support versions of Windows prior to Windows 10. Despite this, it may be possible to achieve a successful installation with some additional experimentation. If you find a way to achieve this, please share your solution through a pull request for the benefit of other users. > Possible setup instructions for Windows 10: -> - 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice. It is recommended to download the ISO from a reputed source, as the built in downloader from dockur (default set to `tiny11`) will take longer than it would to download from a browser/torrent. +> - 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will __NOT__ suffice. It is recommended to download the ISO from a reputed source, as the built in downloader from dockur (default set to `tiny11`) will take longer than it would to download from a browser/torrent. > - It is recommended to edit the initial `compose.yaml` file to keep your required username and password from the beginning. > - It is recommended to not use `sudo` to force commands to run. Add your user to the relevant permissions group wherever possible. @@ -30,14 +30,9 @@ It is also possible to specify the version of Windows you wish to install within Please refer to the [original GitHub repository](https://github.com/dockur/windows) for more information on additional configuration options. > [!NOTE] -> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker` with `podman`. +> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker` with `podman`. > ```bash -> docker ps # verify if you have any dockers created -> docker rm -v -f $(docker ps -qa) # will remove all running dockers (EXERCISE CAUTION) -> docker container ls # see if you have any containers running -> docker container rm containerName # to remove any old containers -> docker volume ls # for old volumes. Docker will reuse old volumes which may have previous installations of windows -> docker volume rm volumeName +> docker compose down --rmi=all --volumes > ``` ### Installing Windows From 9a1ed82053df4d38fd902a5bec12c8bd06eebddc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 17:49:34 +0000 Subject: [PATCH 68/99] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- README.md | 6 +++--- docs/docker.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 30dfb43..d015ead 100644 --- a/README.md +++ b/README.md @@ -435,9 +435,9 @@ FREERDP_COMMAND="" > If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`. > [!NOTE] -> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with -> `rm ~/.config/freerdp/server/127.0.0.1_3389.pem` and run -> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` +> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with +> `rm ~/.config/freerdp/server/127.0.0.1_3389.pem` and run +> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` > to set up Trust On First Authentication. Then retry the `setup.sh` script. #### Configuration Options Explained diff --git a/docs/docker.md b/docs/docker.md index 7059bb5..39fa2b6 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -30,7 +30,7 @@ It is also possible to specify the version of Windows you wish to install within Please refer to the [original GitHub repository](https://github.com/dockur/windows) for more information on additional configuration options. > [!NOTE] -> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker` with `podman`. +> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker` with `podman`. > ```bash > docker compose down --rmi=all --volumes > ``` From 80ba2ad378709c0b7564daf5a0707a6bd8f7ba4a Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:41:01 +0100 Subject: [PATCH 69/99] fix: always source inquirer from path on nix --- packages/winapps/setup.patch | 72 +++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/packages/winapps/setup.patch b/packages/winapps/setup.patch index 18124b6..88b8844 100644 --- a/packages/winapps/setup.patch +++ b/packages/winapps/setup.patch @@ -1,8 +1,8 @@ diff --git a/setup.sh b/setup.sh -index 6aa9b574..9fbefe65 100755 +index 8c6209fb..b7651485 100755 --- a/setup.sh +++ b/setup.sh -@@ -48,8 +48,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir +@@ -39,8 +39,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation. readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation. # 'SOURCE' @@ -13,7 +13,7 @@ index 6aa9b574..9fbefe65 100755 # 'APP' readonly SYS_APP_PATH="/usr/share/applications" # UNIX path to 'applications' directory for a '--system' WinApps installation. readonly USER_APP_PATH="${HOME}/.local/share/applications" # UNIX path to 'applications' directory for a '--user' WinApps installation. -@@ -79,7 +79,7 @@ readonly TEST_PATH_WIN="${USER_APPDATA_PATH_WIN}\\FreeRDP_Connection_Test" # WIN +@@ -70,7 +70,7 @@ readonly TEST_PATH_WIN="${USER_APPDATA_PATH_WIN}\\FreeRDP_Connection_Test" # WIN # 'WinApps Configuration File' readonly CONFIG_PATH="${HOME}/.config/winapps/winapps.conf" # UNIX path to the WinApps configuration file. # 'Inquirer Bash Script' @@ -22,7 +22,7 @@ index 6aa9b574..9fbefe65 100755 # REMOTE DESKTOP CONFIGURATION readonly VM_NAME="RDPWindows" # Name of the Windows VM (FOR 'libvirt' ONLY). -@@ -139,13 +139,13 @@ function waTerminateScript() { +@@ -130,13 +130,13 @@ function waTerminateScript() { # Role: Displays usage information for the script. function waUsage() { echo -e "Usage: @@ -43,16 +43,44 @@ index 6aa9b574..9fbefe65 100755 } # Name: 'waGetSourceCode' -@@ -168,7 +168,7 @@ function waGetSourceCode() { - $SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH" - else - echo -e "${INFO_TEXT}WinApps installation already present at ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}. Updating...${CLEAR_TEXT}" -- $SUDO git -C "$SOURCE_PATH" pull --no-rebase -+ +@@ -155,13 +155,6 @@ function waGetSourceCode() { + echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You might want to remove your old installation on '${SCRIPT_DIR_PATH}'." fi +- if [[ ! -d "$SOURCE_PATH" ]]; then +- $SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH" +- else +- echo -e "${INFO_TEXT}WinApps installation already present at ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}. Updating...${CLEAR_TEXT}" +- $SUDO git -C "$SOURCE_PATH" pull --no-rebase +- fi +- # Silently change the working directory. -@@ -395,7 +395,7 @@ function waCheckExistingInstall() { + if ! cd "$SOURCE_PATH" &>/dev/null; then + # Display the error type. +@@ -186,21 +179,8 @@ function waGetSourceCode() { + # Name: 'waGetInquirer' + # Role: Loads the inquirer script, even if the source isn't cloned yet + function waGetInquirer() { +- local INQUIRER=$INQUIRER_PATH +- +- if [ -d "$SYS_SOURCE_PATH" ]; then +- INQUIRER=$SYS_SOURCE_PATH/$INQUIRER_PATH +- elif [ -d "$USER_SOURCE_PATH" ] ; then +- INQUIRER=$USER_SOURCE_PATH/$INQUIRER_PATH +- else +- INQUIRER="/tmp/waInquirer.sh" +- rm -f "$INQUIRER" +- +- curl -o "$INQUIRER" "https://raw.githubusercontent.com/winapps-org/winapps/main/install/inquirer.sh" +- fi +- + # shellcheck source=/dev/null # Exclude this file from being checked by ShellCheck. +- source "$INQUIRER" ++ source "$INQUIRER_PATH" + } + + # Name: 'waCheckInput' +@@ -390,7 +370,7 @@ function waCheckExistingInstall() { # Display the suggested action(s). echo "--------------------------------------------------------------------------------" @@ -61,7 +89,7 @@ index 6aa9b574..9fbefe65 100755 echo "--------------------------------------------------------------------------------" # Terminate the script. -@@ -415,7 +415,7 @@ function waCheckExistingInstall() { +@@ -410,7 +390,7 @@ function waCheckExistingInstall() { # Display the suggested action(s). echo "--------------------------------------------------------------------------------" @@ -70,7 +98,7 @@ index 6aa9b574..9fbefe65 100755 echo "--------------------------------------------------------------------------------" # Terminate the script. -@@ -810,7 +810,7 @@ function waCheckGroupMembership() { +@@ -805,7 +785,7 @@ function waCheckGroupMembership() { # Identify groups the current user belongs to. USER_GROUPS=$(groups "$(whoami)") @@ -79,7 +107,7 @@ index 6aa9b574..9fbefe65 100755 # Complete the previous line. echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n" -@@ -1244,11 +1244,11 @@ function waConfigureWindows() { +@@ -1239,11 +1219,11 @@ function waConfigureWindows() { # Populate variables. WIN_BASH="\ #!/usr/bin/env bash @@ -93,7 +121,7 @@ index 6aa9b574..9fbefe65 100755 Terminal=false Type=Application Icon=${APPDATA_PATH}/icons/windows.svg -@@ -1295,13 +1295,13 @@ function waConfigureApp() { +@@ -1290,13 +1270,13 @@ function waConfigureApp() { # Determine the content of the bash script for the application. APP_BASH="\ #!/usr/bin/env bash @@ -109,18 +137,18 @@ index 6aa9b574..9fbefe65 100755 Terminal=false Type=Application Icon=${APP_ICON} -@@ -1631,8 +1631,8 @@ function waInstall() { +@@ -1626,8 +1606,8 @@ function waInstall() { waFindInstalled # Install the WinApps bash scripts. - $SUDO ln -sf "${SOURCE_PATH}/bin/winapps" "${BIN_PATH}/winapps" - $SUDO ln -sf "${SOURCE_PATH}/setup.sh" "${BIN_PATH}/winapps-setup" -+ -+ ++ ++ # Configure the Windows RDP session application launcher. waConfigureWindows -@@ -1682,18 +1682,15 @@ function waUninstall() { +@@ -1677,18 +1657,15 @@ function waUninstall() { local DESKTOP_FILE_NAME="" # Stores the name of the '.desktop' file for the application. local BASH_SCRIPT_NAME="" # Stores the name of the application. @@ -129,7 +157,7 @@ index 6aa9b574..9fbefe65 100755 - $SUDO rm -f "${BIN_PATH}/winapps-setup" - # Remove WinApps configuration data, temporary files and logs. -+ chmod -R +rw "$USER_APPDATA_PATH" ++ chmod -R +rw "$USER_APPDATA_PATH" rm -rf "$USER_APPDATA_PATH" # Remove application icons and shortcuts. @@ -141,7 +169,7 @@ index 6aa9b574..9fbefe65 100755 # Remove each '.desktop' file. for DESKTOP_FILE_PATH in "${WINAPPS_DESKTOP_FILES[@]}"; do -@@ -1714,7 +1711,7 @@ function waUninstall() { +@@ -1709,7 +1686,7 @@ function waUninstall() { done # Store the paths of bash scripts calling 'WinApps' to launch specific applications in an array, returning an empty array if no such files exist. @@ -150,7 +178,7 @@ index 6aa9b574..9fbefe65 100755 # Remove each bash script. for BASH_SCRIPT_PATH in "${WINAPPS_APP_BASH_SCRIPTS[@]}"; do -@@ -1735,10 +1732,9 @@ function waUninstall() { +@@ -1730,10 +1707,9 @@ function waUninstall() { done # Print caveats. From 405e61d122c57c0cddf1e5b9ac967eda02633717 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:51:22 +0100 Subject: [PATCH 70/99] fix: actually build packages so they're inside the cachix cache --- .github/workflows/update-nix.yaml | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index 3b76fad..9b915c1 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -31,4 +31,4 @@ jobs: extra-args: --version=branch - name: Build packages - run: nix-build + run: nix build .#winapps .#winapps-launcher diff --git a/README.md b/README.md index fac9f3d..661c29d 100644 --- a/README.md +++ b/README.md @@ -517,7 +517,7 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional }; outputs = - { + inputs@{ nixpkgs, winapps, ... @@ -546,8 +546,8 @@ nix profile install github:winapps-org/winapps#winapps-launcher # optional }; environment.systemPackages = [ - winapps.packages.${system}.winapps - winapps.packages.${system}.winapps-launcher # optional + winapps.packages."${system}".winapps + winapps.packages."${system}".winapps-launcher # optional ]; } ) From 3290965614fea938231c4cb311bed0224b0cf147 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 14 Jan 2025 16:53:45 +0000 Subject: [PATCH 71/99] winapps: 0-unstable-2025-01-10 -> 0-unstable-2025-01-13 Diff: https://github.com/winapps-org/winapps/compare/c98938776d3de2acba9d49f5e92fde6021fd434c...8a4d8906d31ea0afb4c802e0239594fd7a5352b7 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index a9a5923..16e8838 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "c98938776d3de2acba9d49f5e92fde6021fd434c"; - hash = "sha256-lnaQl6DW65NyKMC/nrnjtj9mOqrBOsZb9As9gvzosgk="; + rev = "8a4d8906d31ea0afb4c802e0239594fd7a5352b7"; + hash = "sha256-FXMbHzH6JjFIPPZN5SsmzLQEXVkj87T+jZy+e7GO8A4="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2025-01-10"; + version = "0-unstable-2025-01-13"; src = fetchFromGitHub { owner = "winapps-org"; From af1ba31334142269c39e8fe7a22322579415be3d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 14 Jan 2025 16:53:48 +0000 Subject: [PATCH 72/99] winapps-launcher: 0-unstable-2024-10-01 -> 0-unstable-2025-01-12 Diff: https://github.com/winapps-org/WinApps-Launcher/compare/9f5fbcb57f2932b260202fb582f9adcf28df5f1c...3eb63ad1442068119c2e0f2586e6d63e7a45042e --- packages/winapps-launcher/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps-launcher/default.nix b/packages/winapps-launcher/default.nix index c960a74..8a40ad3 100644 --- a/packages/winapps-launcher/default.nix +++ b/packages/winapps-launcher/default.nix @@ -9,12 +9,12 @@ ... }: let - rev = "9f5fbcb57f2932b260202fb582f9adcf28df5f1c"; - hash = "sha256-cShXlcFHTryxKLKxdoqZSge2oyGgeuFPW9Nxg+gSjB4="; + rev = "3eb63ad1442068119c2e0f2586e6d63e7a45042e"; + hash = "sha256-y31AdBZSiarcQzH2wyDnhzgrrELbLW4XY94JvLejoTU="; in stdenv.mkDerivation rec { pname = "winapps-launcher"; - version = "0-unstable-2024-10-01"; + version = "0-unstable-2025-01-12"; src = fetchFromGitHub { owner = "winapps-org"; From 09abdb747e26cbf066707717c7af3c161eaacfea Mon Sep 17 00:00:00 2001 From: starbr3aker Date: Wed, 15 Jan 2025 08:30:13 +0530 Subject: [PATCH 73/99] Resolved comments --- compose.yaml | 6 +++--- docs/docker.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/compose.yaml b/compose.yaml index 29d86b6..6a2cf63 100644 --- a/compose.yaml +++ b/compose.yaml @@ -19,8 +19,8 @@ services: CPU_CORES: "4" # CPU cores allocated to the Windows VM. DISK_SIZE: "64G" # Size of the primary hard disk. #DISK2_SIZE: "32G" # Uncomment to add an additional hard disk to the Windows VM. Ensure it is mounted as a volume below. - USERNAME: "MyWindowsUser" # Uncomment to set a custom Windows username. The default is 'Docker'. - PASSWORD: "MyWindowsPassword" # Uncomment to set a password for the Windows user. There is no default password. + USERNAME: "MyWindowsUser" # Edit here to set a custom Windows username. The default is 'MyWindowsUser'. + PASSWORD: "MyWindowsPassword" # Edit here to set a password for the Windows user. The default is 'MyWindowsPassword'. HOME: "${HOME}" # Set path to Linux user home folder. privileged: true # Grant the Windows VM extended privileges. ports: @@ -38,4 +38,4 @@ services: devices: - /dev/kvm # Enable KVM. #- /dev/sdX:/disk1 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk1' will be mounted as the main drive. THIS DISK WILL BE FORMATTED BY DOCKER). - #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives THIS DISK WILL NOT BE FORMATTED). + #- /dev/sdY:/disk2 # Uncomment to mount a disk directly within the Windows VM (Note: 'disk2' and higher will be mounted as secondary drives. THIS DISK WILL NOT BE FORMATTED). diff --git a/docs/docker.md b/docs/docker.md index 39fa2b6..0d3e00e 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -30,7 +30,7 @@ It is also possible to specify the version of Windows you wish to install within Please refer to the [original GitHub repository](https://github.com/dockur/windows) for more information on additional configuration options. > [!NOTE] -> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker` with `podman`. +> If you want to undo all your changes and start from scratch, run the following. For `podman`, replace `docker compose` with `podman-compose`. > ```bash > docker compose down --rmi=all --volumes > ``` From df3548778c9c6903dd3bedfa3d7d71cf7535e5b7 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:25:40 +0100 Subject: [PATCH 74/99] fix: use better if format --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 8c6209f..b7d930d 100755 --- a/setup.sh +++ b/setup.sh @@ -149,7 +149,7 @@ function waGetSourceCode() { SCRIPT_DIR_PATH=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")") # Check if winapps is currently installed on $SOURCE_PATH - if [ -f "$SCRIPT_DIR_PATH/winapps" ] && [ "$SCRIPT_DIR_PATH" -ne "$SOURCE_PATH" ]; then + if [[ -f "$SCRIPT_DIR_PATH/winapps" && "$SCRIPT_DIR_PATH" -ne "$SOURCE_PATH" ]]; then # Display a warning. echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You are running a WinApps installation located outside of default location '${SOURCE_PATH}'. A new installation will be created." echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You might want to remove your old installation on '${SCRIPT_DIR_PATH}'." From 99fcee09825857d612f8682fa172f22e743f9502 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:36:00 +0100 Subject: [PATCH 75/99] fix: do not check for existing install on nix --- packages/winapps/setup.patch | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/winapps/setup.patch b/packages/winapps/setup.patch index 88b8844..9336a04 100644 --- a/packages/winapps/setup.patch +++ b/packages/winapps/setup.patch @@ -1,5 +1,5 @@ diff --git a/setup.sh b/setup.sh -index 8c6209fb..b7651485 100755 +index b7d930d6..18000c65 100755 --- a/setup.sh +++ b/setup.sh @@ -39,8 +39,8 @@ readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' dir @@ -137,6 +137,15 @@ index 8c6209fb..b7651485 100755 Terminal=false Type=Application Icon=${APP_ICON} +@@ -1550,7 +1530,7 @@ function waInstall() { + echo -e "${BOLD_TEXT}Installing WinApps.${CLEAR_TEXT}" + + # Check for existing conflicting WinApps installations. +- waCheckExistingInstall ++ # waCheckExistingInstall + + # Load the WinApps configuration file. + waLoadConfig @@ -1626,8 +1606,8 @@ function waInstall() { waFindInstalled From fe6322c5855c319992349b18092926bc9cdb50ef Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:40:50 +0100 Subject: [PATCH 76/99] fix: force runner user to be trusted --- .github/workflows/update-nix.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/update-nix.yaml b/.github/workflows/update-nix.yaml index 9b915c1..e9a568c 100644 --- a/.github/workflows/update-nix.yaml +++ b/.github/workflows/update-nix.yaml @@ -18,6 +18,8 @@ jobs: - name: Install Nix uses: DeterminateSystems/nix-installer-action@main + with: + trust-runner-user: true - name: Set up cache uses: cachix/cachix-action@v15 From 6df306f32a054edf8096935fb082ff408c328ca0 Mon Sep 17 00:00:00 2001 From: Oskar Manhart <52569953+oskardotglobal@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:29:33 +0100 Subject: [PATCH 77/99] fix: typo --- packages/winapps/setup.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/winapps/setup.patch b/packages/winapps/setup.patch index 9336a04..0130828 100644 --- a/packages/winapps/setup.patch +++ b/packages/winapps/setup.patch @@ -117,7 +117,7 @@ index b7d930d6..18000c65 100755 [Desktop Entry] Name=Windows -Exec=${BIN_PATH}/winapps windows %F -+Exec=@out/bin/winapps windows %F ++Exec=@out@/bin/winapps windows %F Terminal=false Type=Application Icon=${APPDATA_PATH}/icons/windows.svg From ad443a5a9732d12905e83b672a111cd8b156ceea Mon Sep 17 00:00:00 2001 From: starbr3aker Date: Wed, 15 Jan 2025 22:58:37 +0530 Subject: [PATCH 78/99] waEnsureOnPathFix --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 8c6209f..96c1515 100755 --- a/setup.sh +++ b/setup.sh @@ -1653,7 +1653,7 @@ function waInstall() { # Name: 'waEnsureOnPath' # Role: Ensures that $BIN_PATH is on $PATH. function waEnsureOnPath() { - if [[ ":$PATH:" == *":$BIN_PATH:"* ]]; then + if [[ !":$PATH:" =~ *":?$BIN_PATH:?"* ]]; then echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} It seems like '${BIN_PATH}' is not on PATH." echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You can add it by running:" # shellcheck disable=SC2086 From 7b939fc5419447ae3daccd3e0e99bd9e52acb7b5 Mon Sep 17 00:00:00 2001 From: starbr3aker Date: Wed, 15 Jan 2025 23:12:36 +0530 Subject: [PATCH 79/99] waEnsureOnPathFix --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 96c1515..a724e1e 100755 --- a/setup.sh +++ b/setup.sh @@ -1653,7 +1653,7 @@ function waInstall() { # Name: 'waEnsureOnPath' # Role: Ensures that $BIN_PATH is on $PATH. function waEnsureOnPath() { - if [[ !":$PATH:" =~ *":?$BIN_PATH:?"* ]]; then + if [[ !":$PATH:" =~ *":$BIN_PATH:"* ]]; then echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} It seems like '${BIN_PATH}' is not on PATH." echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You can add it by running:" # shellcheck disable=SC2086 From 4884cc97ca7901b007876b03a1628551565304af Mon Sep 17 00:00:00 2001 From: starbr3aker Date: Wed, 15 Jan 2025 23:20:17 +0530 Subject: [PATCH 80/99] waEnsureOnPathFix --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index a724e1e..d5ce356 100755 --- a/setup.sh +++ b/setup.sh @@ -1653,7 +1653,7 @@ function waInstall() { # Name: 'waEnsureOnPath' # Role: Ensures that $BIN_PATH is on $PATH. function waEnsureOnPath() { - if [[ !":$PATH:" =~ *":$BIN_PATH:"* ]]; then + if [[ ":$PATH:" != *":$BIN_PATH:"* ]]; then echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} It seems like '${BIN_PATH}' is not on PATH." echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You can add it by running:" # shellcheck disable=SC2086 From 373c85aeb268033c6f000b02acb4b383f5613313 Mon Sep 17 00:00:00 2001 From: Marcus Bannerman Date: Thu, 16 Jan 2025 13:44:08 +0000 Subject: [PATCH 81/99] Added reMarkable desktop app --- apps/remarkable-desktop/icon.svg | 97 ++++++++++++++++++++++++++++++++ apps/remarkable-desktop/info | 22 ++++++++ 2 files changed, 119 insertions(+) create mode 100644 apps/remarkable-desktop/icon.svg create mode 100644 apps/remarkable-desktop/info diff --git a/apps/remarkable-desktop/icon.svg b/apps/remarkable-desktop/icon.svg new file mode 100644 index 0000000..0586794 --- /dev/null +++ b/apps/remarkable-desktop/icon.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +rM diff --git a/apps/remarkable-desktop/info b/apps/remarkable-desktop/info new file mode 100644 index 0000000..29e05b0 --- /dev/null +++ b/apps/remarkable-desktop/info @@ -0,0 +1,22 @@ +# Copyright (c) 2025 Marcus Bannerman +# All rights reserved. +# +# SPDX-License-Identifier: Proprietary + +# GNOME shortcut name +NAME="reMarkable" + +# Used for descriptions and window class +FULL_NAME="reMarkable Desktop App" + +# The executable inside windows +WIN_EXECUTABLE="C:\Program Files\reMarkable\reMarkable.exe" + +# GNOME categories +CATEGORIES="WinApps;Office" + +# GNOME mimetypes +MIME_TYPES="" + +# System Icon +ICON="reMarkable" From db7562aec5ceea20869f7cd628d14b20cc38964b Mon Sep 17 00:00:00 2001 From: Marcus Bannerman Date: Thu, 16 Jan 2025 16:25:38 +0000 Subject: [PATCH 82/99] Removed copyright assertion --- apps/remarkable-desktop/info | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/remarkable-desktop/info b/apps/remarkable-desktop/info index 29e05b0..34f47f5 100644 --- a/apps/remarkable-desktop/info +++ b/apps/remarkable-desktop/info @@ -1,8 +1,3 @@ -# Copyright (c) 2025 Marcus Bannerman -# All rights reserved. -# -# SPDX-License-Identifier: Proprietary - # GNOME shortcut name NAME="reMarkable" From 1ffdff8fbe19fe7c5cb995a0485d20b50b149d3e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 16 Jan 2025 16:31:10 +0000 Subject: [PATCH 83/99] winapps: 0-unstable-2025-01-13 -> 0-unstable-2025-01-16 Diff: https://github.com/winapps-org/winapps/compare/8a4d8906d31ea0afb4c802e0239594fd7a5352b7...d12b40073074ba8f639d723601146ea9527ac16c --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 16e8838..b7c52d6 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "8a4d8906d31ea0afb4c802e0239594fd7a5352b7"; - hash = "sha256-FXMbHzH6JjFIPPZN5SsmzLQEXVkj87T+jZy+e7GO8A4="; + rev = "d12b40073074ba8f639d723601146ea9527ac16c"; + hash = "sha256-SG1EVN0pKXzZxQGz01HgmsmCEvRNBFI9JrA5VxmRzDg="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2025-01-13"; + version = "0-unstable-2025-01-16"; src = fetchFromGitHub { owner = "winapps-org"; From 01f070b70141c73ee19be1f149f038e283852370 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 19 Jan 2025 10:12:58 +0000 Subject: [PATCH 84/99] winapps: 0-unstable-2025-01-16 -> 0-unstable-2025-01-16 Diff: https://github.com/winapps-org/winapps/compare/d12b40073074ba8f639d723601146ea9527ac16c...e20e3423fb9c8070646b1764286fd5e4135da37e --- packages/winapps/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index b7c52d6..77414a4 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,8 +11,8 @@ ... }: let - rev = "d12b40073074ba8f639d723601146ea9527ac16c"; - hash = "sha256-SG1EVN0pKXzZxQGz01HgmsmCEvRNBFI9JrA5VxmRzDg="; + rev = "e20e3423fb9c8070646b1764286fd5e4135da37e"; + hash = "sha256-PKlVkse0E6bdqDIavDVnxasoQH2LkohOFFGt8o+t6cA="; in stdenv.mkDerivation rec { pname = "winapps"; From b2e2d946c8f0e60bced5b7b1aeb6b028ef48f3fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 26 Jan 2025 10:12:32 +0000 Subject: [PATCH 85/99] winapps: 0-unstable-2025-01-16 -> 0-unstable-2025-01-19 Diff: https://github.com/winapps-org/winapps/compare/e20e3423fb9c8070646b1764286fd5e4135da37e...8c4a695a9f10d9055cc6b699d4c58612348d4db4 --- packages/winapps/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/winapps/default.nix b/packages/winapps/default.nix index 77414a4..04252d5 100644 --- a/packages/winapps/default.nix +++ b/packages/winapps/default.nix @@ -11,12 +11,12 @@ ... }: let - rev = "e20e3423fb9c8070646b1764286fd5e4135da37e"; - hash = "sha256-PKlVkse0E6bdqDIavDVnxasoQH2LkohOFFGt8o+t6cA="; + rev = "8c4a695a9f10d9055cc6b699d4c58612348d4db4"; + hash = "sha256-aE31v2j5dWka5XdhBRwmnMGciOBP7yoK+hP2f4CIMTg="; in stdenv.mkDerivation rec { pname = "winapps"; - version = "0-unstable-2025-01-16"; + version = "0-unstable-2025-01-19"; src = fetchFromGitHub { owner = "winapps-org"; From 963e74b90e060da2b8ba65598394875810245ca8 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Sat, 1 Feb 2025 17:05:00 +1100 Subject: [PATCH 86/99] Fixed #177 - Removed erroneous instruction to install 'qemu-guest-agent' --- docs/libvirt.md | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/docs/libvirt.md b/docs/libvirt.md index 568ad79..52a2f52 100644 --- a/docs/libvirt.md +++ b/docs/libvirt.md @@ -39,21 +39,7 @@ Together, these components form a powerful and flexible virtualization stack, wi > ``` > Thanks to imoize for pointing this out: https://github.com/winapps-org/winapps/issues/310#issuecomment-2505348088 -4. Install `QEMU Guest Agent`. - ```bash - sudo apt install qemu-guest-agent # Debian/Ubuntu - sudo dnf install qemu-guest-agent # Fedora/RHEL - sudo pacman -S qemu-guest-agent # Arch Linux - sudo emerge app-emulation/qemu-guest-agent # Gentoo Linux - sudo systemctl enable qemu-guest-agent - sudo systemctl start qemu-guest-agent - ``` - -> [!NOTE] -> `QEMU Guest Agent` is a helper daemon used to exchange information and commands between host and guest operating systems. -> You can read more about `QEMU Guest Agent` [here](https://pve.proxmox.com/wiki/Qemu-guest-agent). - -5. Configure rootless `libvirt` and `kvm` by adding your user to groups of the same name. +4. Configure rootless `libvirt` and `kvm` by adding your user to groups of the same name. ``` bash sudo usermod -a -G kvm $(id -un) # Add the user to the 'kvm' group. sudo usermod -a -G libvirt $(id -un) # Add the user to the 'libvirt' group. @@ -73,7 +59,7 @@ Together, these components form a powerful and flexible virtualization stack, wi 3. Reboot your system to ensure that the user is correctly added to the relevant groups. -6. If relevant to your distribution, disable `AppArmor` for the `libvirt` daemon. +5. If relevant to your distribution, disable `AppArmor` for the `libvirt` daemon. ``` bash sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ # Disable AppArmor for the libvirt daemon by creating a symbolic link. ``` @@ -81,12 +67,12 @@ Together, these components form a powerful and flexible virtualization stack, wi > [!NOTE] > Systems with `SELinux` may also require security policy adjustments if virtual machine images are stored outside the default `/var/lib/libvirt/images` directory. Read [this guide](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/virtualization/sect-virtualization-security_for_virtualization-selinux_and_virtualization#sect-Virtualization-Security_for_virtualization-SELinux_and_virtualization) for more information. -7. Download a [Windows 10](https://www.microsoft.com/software-download/windows10ISO) or [Windows 11](https://www.microsoft.com/software-download/windows11) installation `.ISO` image. +6. Download a [Windows 10](https://www.microsoft.com/software-download/windows10ISO) or [Windows 11](https://www.microsoft.com/software-download/windows11) installation `.ISO` image. > [!IMPORTANT] > 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice. -8. Download [VirtIO drivers](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso) for the Windows virtual machine. +7. Download [VirtIO drivers](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso) for the Windows virtual machine. > [!NOTE] > VirtIO drivers enhance system performance and minimize overhead by enabling the Windows virtual machine to use specialised network and disk device drivers. These drivers are aware that they are operating inside a virtual machine, and cooperate with the hypervisor. This approach eliminates the need for the hypervisor to emulate physical hardware devices, which is a computationally expensive process. This setup allows guests to achieve high-performance network and disk operations, leveraging the benefits of paravirtualisation. @@ -644,10 +630,23 @@ Status Name DisplayName Running QEMU-GA QEMU Guest Agent ``` -You can then test whether the host GNU/Linux system can communicate with Windows via `QEMU Guest Agent` by running `virsh qemu-agent-command RDPWindows '{"execute":"guest-info"}'`. The output should resemble: +You can then test whether the host GNU/Linux system can communicate with Windows via `QEMU Guest Agent` by running `virsh qemu-agent-command RDPWindows '{"execute":"guest-get-osinfo"}' --pretty`. The output should resemble: -``` -{"return":{"version":"107.0.1","supported_commands":[{"enabled":true,"name":"guest-get-cpustats","success-response":true},{"enabled":true,"name":"guest-get-diskstats","success-response":true},{"enabled":true,"name":"guest-get-devices","success-response":true},{"enabled":true,"name":"guest-get-osinfo","success-response":true},{"enabled":true,"name":"guest-get-timezone","success-response":true},{"enabled":true,"name":"guest-get-users","success-response":true},{"enabled":true,"name":"guest-get-host-name","success-response":true},{"enabled":true,"name":"guest-exec","success-response":true},{"enabled":true,"name":"guest-exec-status","success-response":true},{"enabled":false,"name":"guest-get-memory-block-info","success-response":true},{"enabled":false,"name":"guest-set-memory-blocks","success-response":true},{"enabled":false,"name":"guest-get-memory-blocks","success-response":true},{"enabled":true,"name":"guest-set-user-password","success-response":true},{"enabled":true,"name":"guest-get-fsinfo","success-response":true},{"enabled":true,"name":"guest-get-disks","success-response":true},{"enabled":false,"name":"guest-set-vcpus","success-response":true},{"enabled":true,"name":"guest-get-vcpus","success-response":true},{"enabled":true,"name":"guest-network-get-interfaces","success-response":true},{"enabled":false,"name":"guest-suspend-hybrid","success-response":false},{"enabled":true,"name":"guest-suspend-ram","success-response":false},{"enabled":true,"name":"guest-suspend-disk","success-response":false},{"enabled":true,"name":"guest-fstrim","success-response":true},{"enabled":true,"name":"guest-fsfreeze-thaw","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze-list","success-response":true},{"enabled":true,"name":"guest-fsfreeze-freeze","success-response":true},{"enabled":true,"name":"guest-fsfreeze-status","success-response":true},{"enabled":true,"name":"guest-file-flush","success-response":true},{"enabled":true,"name":"guest-file-seek","success-response":true},{"enabled":true,"name":"guest-file-write","success-response":true},{"enabled":true,"name":"guest-file-read","success-response":true},{"enabled":true,"name":"guest-file-close","success-response":true},{"enabled":true,"name":"guest-file-open","success-response":true},{"enabled":true,"name":"guest-shutdown","success-response":false},{"enabled":true,"name":"guest-info","success-response":true},{"enabled":true,"name":"guest-set-time","success-response":true},{"enabled":true,"name":"guest-get-time","success-response":true},{"enabled":true,"name":"guest-ping","success-response":true},{"enabled":true,"name":"guest-sync","success-response":true},{"enabled":true,"name":"guest-sync-delimited","success-response":true}]}} +```json +{ + "return": { + "name": "Microsoft Windows", + "kernel-release": "26100", + "version": "Microsoft Windows 11", + "variant": "client", + "pretty-name": "Windows 10 Pro", + "version-id": "11", + "variant-id": "client", + "kernel-version": "10.0", + "machine": "x86_64", + "id": "mswindows" + } +} ``` Next, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the [RDPApps.reg](../oem/RDPApps.reg) file, right-clicking on the `Raw` button, and clicking on `Save target as`. Repeat the same thing for the [install.bat](../oem/install.bat) and the [NetProfileCleanup.ps1](../oem/NetProfileCleanup.ps1). **Do not download the Container.reg.** From 35c5a1dc6cad011402a6ff6183ce8b753483cbe5 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Sun, 2 Feb 2025 15:33:28 +1100 Subject: [PATCH 87/99] Correct reference to light-mode banner image in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9e9ffb..afbc508 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-

+


Run Windows applications (including [Microsoft 365](https://www.microsoft365.com/) and [Adobe Creative Cloud](https://www.adobe.com/creativecloud.html)) on GNU/Linux with `KDE Plasma`, `GNOME` or `XFCE`, integrated seamlessly as if they were native to the OS. From b678a9f130e0efb84633ade85ee4078ac475b780 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Sun, 2 Feb 2025 15:37:01 +1100 Subject: [PATCH 88/99] Add 'curl' and 'git' as required dependencies in README --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index afbc508..f3f0a5f 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ If you already have a Windows VM or server you wish to use with WinApps, you wil Install the required dependencies. - Debian/Ubuntu: ```bash - sudo apt install -y dialog freerdp3-x11 iproute2 libnotify-bin netcat-openbsd + sudo apt install -y curl dialog freerdp3-x11 git iproute2 libnotify-bin netcat-openbsd ``` > [!NOTE] @@ -297,19 +297,19 @@ Install the required dependencies. - Fedora/RHEL: ```bash - sudo dnf install -y dialog freerdp iproute libnotify nmap-ncat + sudo dnf install -y curl dialog freerdp git iproute libnotify nmap-ncat ``` - Arch Linux: ```bash - sudo pacman -Syu --needed -y dialog freerdp iproute2 libnotify gnu-netcat + sudo pacman -Syu --needed -y curl dialog freerdp git iproute2 libnotify gnu-netcat ``` - OpenSUSE: ```bash - sudo zypper install -y dialog freerdp iproute2 libnotify netcat-openbsd + sudo zypper install -y curl dialog freerdp git iproute2 libnotify netcat-openbsd ``` - Gentoo Linux: ```bash - sudo emerge --ask=n dev-util/dialog net-misc/freerdp:3 sys-apps/iproute2 x11-libs/libnotify net-analyzer/openbsd-netcat + sudo emerge --ask=n net-misc/curl dev-util/dialog net-misc/freerdp:3 dev-vcs/git sys-apps/iproute2 x11-libs/libnotify net-analyzer/openbsd-netcat ``` > [!NOTE] From d3d97d7d35bdc5493c4cc3fd1e68204643ce80d9 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Sun, 2 Feb 2025 17:30:07 +1100 Subject: [PATCH 89/99] Improve instructions for identifying and correcting RDP TLS certificate issues during WinApps setup --- README.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f3f0a5f..f63387f 100644 --- a/README.md +++ b/README.md @@ -428,18 +428,12 @@ AUTOPAUSE_TIME="300" FREERDP_COMMAND="" ``` -> [!NOTE] +> [!IMPORTANT] > `RDP_USER` and `RDP_PASS` must correspond to a complete Windows user account and password, such as those created during Windows setup or for a domain user. User/PIN combinations are not valid for RDP access. -> [!NOTE] +> [!IMPORTANT] > If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`. -> [!NOTE] -> If you encounter issues with tls certificate getting rejected, delete the existing `.pem` file with -> `rm ~/.config/freerdp/server/127.0.0.1_3389.pem` and run -> `xfreerdp3 /u:MyWindowsUser /p:MyWindowsPassword /v:127.0.0.1 /cert:tofu` -> to set up Trust On First Authentication. Then retry the `setup.sh` script. - #### Configuration Options Explained - If using a pre-existing Windows RDP server on your LAN, you must use `RDP_IP` to specify the location of the Windows server. You may also wish to configure a static IP address for this server. - If running a Windows VM using `libvirt` with NAT enabled, leave `RDP_IP` commented out and WinApps will auto-detect the local IP address for the VM. @@ -450,13 +444,65 @@ FREERDP_COMMAND="" - If you enable `DEBUG`, a log will be created on each application start in `~/.local/share/winapps/winapps.log`. - If using a system on which the FreeRDP command is not `xfreerdp` or `xfreerdp3`, the correct command can be specified using `FREERDP_COMMAND`. -### Step 4: Run the WinApps Installer -Run the WinApps installer. +### Step 4: Test FreeRDP +1. Test establishing an RDP session by running the following command, replacing the `/u:`, `/p:`, and `/v:` values with the correct values specified in `~/.config/winapps/winapps.conf`. + + ```bash + xfreerdp3 /u:"Your Windows Username" /p:"Your Windows Password" /v:192.168.122.2 /cert:tofu + + # Or, if you installed FreeRDP using Flatpak + flatpak run --command=xfreerdp com.freerdp.FreeRDP /u:"Your Windows Username" /p:"Your Windows Password" /v:192.168.122.2 /cert:tofu + ``` + + - Please note that the correct `FreeRDP` command may vary depending on your system (e.g. `xfreerdp`, `xfreerdp3`, etc.). + - Ensure you use the correct IP address for your Windows instance in the above command. + - If prompted within the terminal window, choose to accept the certificate permanently. + + If the Windows desktop appears in a `FreeRDP` window, the configuration was successful and the correct RDP TLS certificate was enrolled on the Linux host. Disconnect from the RDP session and skip the following debugging step. + +2. [DEBUGGING STEP] If an outdated or expired certificate is detected, the `FreeRDP` command will display output resembling the following. In this case, the old certificate will need to be removed and a new RDP TLS certificate installed. + + ``` + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @ WARNING: CERTIFICATE NAME MISMATCH! @ + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + The hostname used for this connection (192.168.122.2:3389) + does not match the name given in the certificate: + Common Name (CN): + RDPWindows + A valid certificate for the wrong name should NOT be trusted! + + The host key for 192.168.122.2:3389 has changed + + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! + Someone could be eavesdropping on you right now (man-in-the-middle attack)! + It is also possible that a host key has just been changed. + The fingerprint for the host key sent by the remote host is 8e:b4:d2:8e:4e:14:e7:4e:82:9b:07:5b:e1:68:40:18:bc:db:5f:bc:29:0d:91:83:f9:17:f9:13:e6:51:dc:36 + Please contact your system administrator. + Add correct host key in /home/rohanbarar/.config/freerdp/server/192.168.122.2_3389.pem to get rid of this message. + ``` + + If you experience the above error, delete any old or outdated RDP TLS certificates associated with Windows, as they can prevent `FreeRDP` from establishing a connection. + + These certificates are located within `~/.config/freerdp/server/` and follow the naming format `_.pem` (e.g., `192.168.122.2_3389.pem`, `127.0.0.1_3389.pem`, etc.). + + If you use FreeRDP for purposes other than WinApps, ensure you only remove certificates related to the relevant Windows VM. If no relevant certificates are found, no action is needed. + + Following deletion, re-attempt establishing an RDP session. + +### Step 5: Run the WinApps Installer +With Windows still powered on, run the WinApps installer. + ```bash bash <(curl https://raw.githubusercontent.com/winapps-org/winapps/main/setup.sh) ``` -A list of supported additional arguments can be accessed by running `./setup.sh --help`. +Once WinApps is installed, a list of additional arguments can be accessed by running `winapps-setup --help`. WinApps Installer Animation. From 7e657c58a740c7017959ff48ab21161113ca8e8e Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Sun, 2 Feb 2025 17:42:24 +1100 Subject: [PATCH 90/99] Updated setup script to reference 'winapps-setup' instead of './setup' + Added sourcing of shell configuration files to apply PATH modifications immediately --- setup.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/setup.sh b/setup.sh index 5ca6cf1..063060f 100755 --- a/setup.sh +++ b/setup.sh @@ -130,13 +130,13 @@ function waTerminateScript() { # Role: Displays usage information for the script. function waUsage() { echo -e "Usage: - ${COMMAND_TEXT}./setup.sh --user${CLEAR_TEXT} # Install WinApps and selected applications in ${HOME} - ${COMMAND_TEXT}./setup.sh --system${CLEAR_TEXT} # Install WinApps and selected applications in /usr - ${COMMAND_TEXT}./setup.sh --user --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in ${HOME} - ${COMMAND_TEXT}./setup.sh --system --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in /usr - ${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT} # Uninstall everything in ${HOME} - ${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr - ${COMMAND_TEXT}./setup.sh --help${CLEAR_TEXT} # Display this usage message." + ${COMMAND_TEXT} --user${CLEAR_TEXT} # Install WinApps and selected applications in ${HOME} + ${COMMAND_TEXT} --system${CLEAR_TEXT} # Install WinApps and selected applications in /usr + ${COMMAND_TEXT} --user --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in ${HOME} + ${COMMAND_TEXT} --system --setupAllOfficiallySupportedApps${CLEAR_TEXT} # Install WinApps and all officially supported applications in /usr + ${COMMAND_TEXT} --user --uninstall${CLEAR_TEXT} # Uninstall everything in ${HOME} + ${COMMAND_TEXT} --system --uninstall${CLEAR_TEXT} # Uninstall everything in /usr + ${COMMAND_TEXT} --help${CLEAR_TEXT} # Display this usage message." } # Name: 'waGetSourceCode' @@ -390,7 +390,7 @@ function waCheckExistingInstall() { # Display the suggested action(s). echo "--------------------------------------------------------------------------------" - echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --user --uninstall${CLEAR_TEXT}." + echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --user --uninstall${CLEAR_TEXT}." echo "--------------------------------------------------------------------------------" # Terminate the script. @@ -410,7 +410,7 @@ function waCheckExistingInstall() { # Display the suggested action(s). echo "--------------------------------------------------------------------------------" - echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}./setup.sh --system --uninstall${CLEAR_TEXT}." + echo -e "Please remove the existing WinApps installation using ${COMMAND_TEXT}winapps-setup --system --uninstall${CLEAR_TEXT}." echo "--------------------------------------------------------------------------------" # Terminate the script. @@ -1657,9 +1657,9 @@ function waEnsureOnPath() { echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} It seems like '${BIN_PATH}' is not on PATH." echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You can add it by running:" # shellcheck disable=SC2086 - echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For Bash: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.bashrc${CLEAR_TEXT}" + echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For Bash: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.bashrc && source ~/.bashrc${CLEAR_TEXT}" # shellcheck disable=SC2086 - echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For ZSH: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.zshrc${CLEAR_TEXT}" + echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For ZSH: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.zshrc && source ~/.zshrc${CLEAR_TEXT}" echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} Make sure to restart your Terminal afterwards.\n" fi } From b0a0993afcae9072cbb49109475826fed4e1db2b Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Sun, 2 Feb 2025 17:50:51 +1100 Subject: [PATCH 91/99] Improved virtualisation stack diagram readability for GitHub light mode --- docs/libvirt_images/Virtualisation_Stack.svg | 40 ++++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/libvirt_images/Virtualisation_Stack.svg b/docs/libvirt_images/Virtualisation_Stack.svg index 9ebb272..1cf451b 100644 --- a/docs/libvirt_images/Virtualisation_Stack.svg +++ b/docs/libvirt_images/Virtualisation_Stack.svg @@ -6,7 +6,7 @@ height="394.31107" id="svg171" sodipodi:docname="Virtualisation_Stack.svg" - inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)" + inkscape:version="1.4 (e7c3feb1, 2024-10-09)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -27,14 +27,14 @@ inkscape:deskcolor="#d1d1d1" showgrid="false" inkscape:zoom="1.4142136" - inkscape:cx="157.68481" - inkscape:cy="190.56528" - inkscape:window-width="1920" - inkscape:window-height="1003" + inkscape:cx="158.03836" + inkscape:cy="190.56527" + inkscape:window-width="1680" + inkscape:window-height="1050" inkscape:window-x="0" inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="Hardware" /> + inkscape:window-maximized="0" + inkscape:current-layer="svg171" /> Open-source-virtualization-stack