diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..273764a
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,5 @@
+*.sh text eol=lf
+*.exe binary
+*.apk binary
+*.so binary
+*.xml text eol=crlf
diff --git a/linker/x86_64/libc.so b/linker/x86_64/libc.so
new file mode 100644
index 0000000..748c48c
Binary files /dev/null and b/linker/x86_64/libc.so differ
diff --git a/linker/x86_64/libdl.so b/linker/x86_64/libdl.so
new file mode 100644
index 0000000..8b24897
Binary files /dev/null and b/linker/x86_64/libdl.so differ
diff --git a/linker/x86_64/libm.so b/linker/x86_64/libm.so
new file mode 100644
index 0000000..7bf99e8
Binary files /dev/null and b/linker/x86_64/libm.so differ
diff --git a/linker/x86_64/linker64 b/linker/x86_64/linker64
new file mode 100644
index 0000000..894beae
Binary files /dev/null and b/linker/x86_64/linker64 differ
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100644
index 0000000..d5dbe8f
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,670 @@
+#!/bin/bash
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+if [ ! "$BASH_VERSION" ] ; then
+ echo "Please do not use sh to run this script, just execute it directly" 1>&2
+ exit 1
+fi
+HOST_ARCH=$(uname -m)
+if [ "$HOST_ARCH" != "x86_64" ] && [ "$HOST_ARCH" != "aarch64" ]; then
+ echo "Unsupported architectures: $HOST_ARCH"
+ exit 1
+fi
+cd "$(dirname "$0")" || exit 1
+trap umount_clean EXIT
+WORK_DIR=$(mktemp -d -t wsa-build-XXXXXXXXXX_) || exit 1
+DOWNLOAD_DIR=../download
+DOWNLOAD_CONF_NAME=download.list
+OUTPUT_DIR=../output
+MOUNT_DIR="$WORK_DIR"/system
+CLEAN_DOWNLOAD_WSA=0
+CLEAN_DOWNLOAD_MAGISK=0
+CLEAN_DOWNLOAD_GAPPS=0
+REMOVE_AMAZON="keep"
+COMPRESS_OUTPUT="no"
+OFFLINE=0
+umount_clean(){
+ echo "Cleanup Work Directory"
+ if [ -d "$MOUNT_DIR" ]; then
+ if [ -d "$MOUNT_DIR/vendor" ]; then
+ sudo umount "$MOUNT_DIR"/vendor
+ fi
+ if [ -d "$MOUNT_DIR/product" ]; then
+ sudo umount "$MOUNT_DIR"/product
+ fi
+ if [ -d "$MOUNT_DIR/system_ext" ]; then
+ sudo umount "$MOUNT_DIR"/system_ext
+ fi
+ sudo umount "$MOUNT_DIR"
+ fi
+ sudo rm -rf "${WORK_DIR:?}"
+}
+clean_download(){
+ if [ -d "$DOWNLOAD_DIR" ]; then
+ echo "Cleanup Download Directory"
+ if [ "$CLEAN_DOWNLOAD_WSA" = "1" ]; then
+ rm -f "${WSA_ZIP_PATH:?}"
+ fi
+ if [ "$CLEAN_DOWNLOAD_MAGISK" = "1" ]; then
+ rm -f "${MAGISK_PATH:?}"
+ fi
+ if [ "$CLEAN_DOWNLOAD_GAPPS" = "1" ]; then
+ rm -f "${GAPPS_PATH:?}"
+ fi
+ fi
+}
+abort() {
+ echo "Build: an error has occurred, exit"
+ if [ -d "$WORK_DIR" ]; then
+ umount_clean
+ fi
+ clean_download
+ exit 1
+}
+trap abort INT TERM
+
+function Gen_Rand_Str {
+ tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w "$1" | head -n 1
+}
+
+usage(){
+ if [ -n "$1" ]; then
+ echo "Unknown parameter: $1"
+ fi
+ echo "Usage:
+ --arch
+ --release-type
+ --magisk-ver
+ --gapps-brand
+ --gapps-variant
+ --root-sol
+ --remove-amazon
+ --compress
+ --offline
+ --magisk-custom
+ --debug
+ "
+ exit 1
+}
+
+ARGUMENT_LIST=(
+ "arch:"
+ "release-type:"
+ "magisk-ver:"
+ "gapps-brand:"
+ "gapps-variant:"
+ "root-sol:"
+ "remove-amazon"
+ "compress"
+ "offline"
+ "magisk-custom"
+ "debug"
+)
+
+opts=$(getopt \
+ --longoptions "$(printf "%s," "${ARGUMENT_LIST[@]}")" \
+ --name "$(basename "$0")" \
+ --options "" \
+ -- "$@"
+)
+
+eval set --"$opts"
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --arch ) ARCH="$2"; shift 2 ;;
+ --release-type ) RELEASE_TYPE="$2"; shift 2 ;;
+ --magisk-ver ) MAGISK_VER="$2"; shift 2 ;;
+ --gapps-brand ) GAPPS_BRAND="$2"; shift 2 ;;
+ --gapps-variant ) GAPPS_VARIANT="$2"; shift 2 ;;
+ --remove-amazon ) REMOVE_AMAZON="remove"; shift ;;
+ --root-sol ) ROOT_SOL="$2"; shift 2 ;;
+ --compress ) COMPRESS_OUTPUT="yes"; shift ;;
+ --offline ) OFFLINE="1"; shift ;;
+ --debug ) DEBUG="1"; shift ;;
+ --magisk-custom ) CUSTOM_MAGISK="1"; shift ;;
+ -- ) shift; break;;
+ ? ) usage "$2"; shift ;;
+ * ) break ;;
+ esac
+done
+
+declare -A PARA_CHECK_LIST=([ARCH]="$ARCH" [RELEASE_TYPE]="$RELEASE_TYPE" [MAGISK_VER]="$MAGISK_VER" [GAPPS_VARIANT]="$GAPPS_VARIANT" [REMOVE_AMAZON]="$REMOVE_AMAZON" [ROOT_SOL]="$ROOT_SOL")
+for i in "${PARA_CHECK_LIST[@]}";
+do
+ if [ -z "$i" ]; then
+ usage
+ fi
+done
+
+echo -e "build: ARCH=$ARCH\nRELEASE_TYPE=$RELEASE_TYPE\nMAGISK_VER=$MAGISK_VER\nGAPPS_VARIANT=$GAPPS_VARIANT\nREMOVE_AMAZON=$REMOVE_AMAZON\nROOT_SOL=$ROOT_SOL\nCOMPRESS_OUTPUT=$COMPRESS_OUTPUT"
+
+declare -A RELEASE_TYPE_MAP=(["retail"]="Retail" ["release preview"]="RP" ["insider slow"]="WIS" ["insider fast"]="WIF")
+
+WSA_ZIP_PATH=$DOWNLOAD_DIR/wsa-$ARCH-${RELEASE_TYPE_MAP[$RELEASE_TYPE]}.zip
+vclibs_PATH=vclibs-"$ARCH".appx
+xaml_PATH=xaml-"$ARCH".appx
+MAGISK_PATH=$DOWNLOAD_DIR/magisk-$MAGISK_VER.zip
+if [ "$GAPPS_BRAND" = "OpenGApps" ]; then
+ GAPPS_PATH="$DOWNLOAD_DIR"/OpenGApps-$ARCH-$GAPPS_VARIANT.zip
+else
+ GAPPS_PATH="$DOWNLOAD_DIR"/MindTheGapps-"$ARCH".zip
+fi
+
+if [ "$OFFLINE" != "1" ]; then
+ trap 'rm -f -- "${DOWNLOAD_DIR:?}/${DOWNLOAD_CONF_NAME}"' EXIT
+ echo "Generate Download Links"
+ python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
+ if [ "$CUSTOM_MAGISK" != "1" ]; then
+ python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
+ fi
+ if [ "$GAPPS_VARIANT" != 'none' ] && [ "$GAPPS_VARIANT" != '' ]; then
+ if [ "$GAPPS_BRAND" = "OpenGApps" ]; then
+ python3 generateGappsLink.py "$ARCH" "$GAPPS_VARIANT" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
+ fi
+ fi
+
+ echo "Download Artifacts"
+ if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_download.log" -x16 -s16 -j5 -c -R -m0 --allow-overwrite=true --conditional-get=true -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR"/"$DOWNLOAD_CONF_NAME"; then
+ echo "We have encountered an error while downloading files."
+ exit 1
+ fi
+else
+ if [ ! -f "$WSA_ZIP_PATH" ] || [ ! -f "$xaml_PATH" ] || [ ! -f "$vclibs_PATH" ]; then
+ echo "Offline mode: missing WSA files."
+ OFFLINE_ERR="1"
+ fi
+ if [ ! -f "$MAGISK_PATH" ]; then
+ echo "Offline mode: missing Magisk $MAGISK_VER file."
+ OFFLINE_ERR="1"
+ fi
+ if [ "$GAPPS_VARIANT" != 'none' ] && [ "$GAPPS_VARIANT" != '' ]; then
+ if [ ! -f "$GAPPS_PATH" ]; then
+ echo "Offline mode: missing $GAPPS_BRAND file."
+ OFFLINE_ERR="1"
+ fi
+ fi
+ if [ -n "$OFFLINE_ERR" ]; then
+ echo "Offline mode: Some files are missing, please disable offline mode."
+ exit 1
+ fi
+fi
+
+echo "Extract WSA"
+if [ -f "$WSA_ZIP_PATH" ]; then
+ WSA_WORK_ENV="${WORK_DIR:?}"/ENV
+ if [ -f "$WSA_WORK_ENV" ]; then rm -f "${WSA_WORK_ENV:?}"; fi
+ export WSA_WORK_ENV
+ if ! python3 extractWSA.py "$ARCH" "$WSA_ZIP_PATH" "$WORK_DIR"; then
+ echo "Unzip WSA failed, is the download incomplete?"
+ CLEAN_DOWNLOAD_WSA=1
+ abort
+ fi
+ echo -e "Extract done\n"
+ # shellcheck disable=SC1091
+ source "${WORK_DIR:?}/ENV" || abort
+else
+ echo "The WSA zip package does not exist, is the download incomplete?"
+ exit 1
+fi
+echo "Extract Magisk"
+
+if [ -f "$MAGISK_PATH" ]; then
+ if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then
+ echo "Unzip Magisk failed, is the download incomplete?"
+ CLEAN_DOWNLOAD_MAGISK=1
+ abort
+ fi
+elif [ "$CUSTOM_MAGISK" != "1" ]; then
+ echo "The Magisk zip package does not exist, is the download incomplete?"
+ exit 1
+else
+ echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder."
+ exit 1
+fi
+echo -e "done\n"
+
+if [ "$GAPPS_VARIANT" != 'none' ] && [ "$GAPPS_VARIANT" != '' ]; then
+ echo "Extract GApps"
+ mkdir -p "$WORK_DIR"/gapps || abort
+ if [ -f "$GAPPS_PATH" ]; then
+ if [ "$GAPPS_BRAND" = "OpenGApps" ]; then
+ if ! unzip -p "$GAPPS_PATH" {Core,GApps}/'*.lz' | tar --lzip -C "$WORK_DIR"/gapps -xf - -i --strip-components=2 --exclude='setupwizardtablet-x86_64' --exclude='packageinstallergoogle-all' --exclude='speech-common' --exclude='markup-lib-arm' --exclude='markup-lib-arm64' --exclude='markup-all' --exclude='setupwizarddefault-x86_64' --exclude='pixellauncher-all' --exclude='pixellauncher-common'; then
+ echo "Unzip OpenGApps failed, is the download incomplete?"
+ CLEAN_DOWNLOAD_GAPPS=1
+ abort
+ fi
+ else
+ if ! unzip "$GAPPS_PATH" "system/*" -x "system/addon.d/*" "system/system_ext/priv-app/SetupWizard/*" -d "$WORK_DIR"/gapps; then
+ echo "Unzip MindTheGapps failed, package is corrupted?"
+ abort
+ fi
+ mv "$WORK_DIR"/gapps/system/* "$WORK_DIR"/gapps || abort
+ rm -rf "${WORK_DIR:?}"/gapps/system || abort
+ fi
+ cp -r ../"$ARCH"/gapps/* "$WORK_DIR"/gapps || abort
+ if [ "$GAPPS_BRAND" = "MindTheGapps" ]; then
+ mv "$WORK_DIR"/gapps/priv-app/* "$WORK_DIR"/gapps/system_ext/priv-app || abort
+ rm -rf "${WORK_DIR:?}"/gapps/priv-app || abort
+ fi
+ else
+ echo "The $GAPPS_BRAND zip package does not exist."
+ exit 1
+ fi
+ echo -e "Extract done\n"
+fi
+
+echo "Expand images"
+
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/system_ext.img || abort
+SYSTEM_EXT_SIZE=$(($(du --apparent-size -sB512 "$WORK_DIR"/wsa/"$ARCH"/system_ext.img | cut -f1) + 20000))
+if [ -d "$WORK_DIR"/gapps/system_ext ]; then
+ SYSTEM_EXT_SIZE=$(( SYSTEM_EXT_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/gapps/system_ext | cut -f1) ))
+fi
+resize2fs "$WORK_DIR"/wsa/"$ARCH"/system_ext.img "$SYSTEM_EXT_SIZE"s || abort
+
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/product.img || abort
+PRODUCT_SIZE=$(($(du --apparent-size -sB512 "$WORK_DIR"/wsa/"$ARCH"/product.img | cut -f1) + 20000))
+if [ -d "$WORK_DIR"/gapps/product ]; then
+ PRODUCT_SIZE=$(( PRODUCT_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/gapps/product | cut -f1) ))
+fi
+resize2fs "$WORK_DIR"/wsa/"$ARCH"/product.img "$PRODUCT_SIZE"s || abort
+
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/system.img || abort
+SYSTEM_SIZE=$(($(du --apparent-size -sB512 "$WORK_DIR"/wsa/"$ARCH"/system.img | cut -f1) + 20000))
+if [ -d "$WORK_DIR"/gapps ]; then
+ SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/gapps | cut -f1) - $(du --apparent-size -sB512 "$WORK_DIR"/gapps/product | cut -f1) ))
+ if [ -d "$WORK_DIR"/gapps/system_ext ]; then
+ SYSTEM_SIZE=$(( SYSTEM_SIZE - $(du --apparent-size -sB512 "$WORK_DIR"/gapps/system_ext | cut -f1) ))
+ fi
+fi
+if [ -d "$WORK_DIR"/magisk ]; then
+ SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/magisk/magisk | cut -f1) ))
+fi
+if [ -f "$MAGISK_PATH" ]; then
+ SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$MAGISK_PATH" | cut -f1) ))
+fi
+if [ -d "../$ARCH/system" ]; then
+ SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "../$ARCH/system" | cut -f1) ))
+fi
+resize2fs "$WORK_DIR"/wsa/"$ARCH"/system.img "$SYSTEM_SIZE"s || abort
+
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/vendor.img || abort
+VENDOR_SIZE=$(($(du --apparent-size -sB512 "$WORK_DIR"/wsa/"$ARCH"/vendor.img | cut -f1) + 20000))
+resize2fs "$WORK_DIR"/wsa/"$ARCH"/vendor.img "$VENDOR_SIZE"s || abort
+echo -e "Expand images done\n"
+
+echo "Mount images"
+sudo mkdir "$MOUNT_DIR" || abort
+sudo mount -o loop "$WORK_DIR"/wsa/"$ARCH"/system.img "$MOUNT_DIR" || abort
+sudo mount -o loop "$WORK_DIR"/wsa/"$ARCH"/vendor.img "$MOUNT_DIR"/vendor || abort
+sudo mount -o loop "$WORK_DIR"/wsa/"$ARCH"/product.img "$MOUNT_DIR"/product || abort
+sudo mount -o loop "$WORK_DIR"/wsa/"$ARCH"/system_ext.img "$MOUNT_DIR"/system_ext || abort
+echo -e "done\n"
+
+if [ "$REMOVE_AMAZON" = 'remove' ]; then
+ echo "Remove Amazon AppStore"
+ find "${MOUNT_DIR:?}"/product/{etc/permissions,etc/sysconfig,framework,priv-app} | grep -e amazon -e venezia | sudo xargs rm -rf
+ echo -e "done\n"
+fi
+
+if [ "$ROOT_SOL" = 'magisk' ] || [ "$ROOT_SOL" = '' ]; then
+ echo "Integrate Magisk"
+ sudo mkdir "$MOUNT_DIR"/sbin
+ sudo chcon --reference "$MOUNT_DIR"/init.environ.rc "$MOUNT_DIR"/sbin
+ sudo chown root:root "$MOUNT_DIR"/sbin
+ sudo chmod 0700 "$MOUNT_DIR"/sbin
+ sudo cp "$WORK_DIR"/magisk/magisk/* "$MOUNT_DIR"/sbin/
+ sudo cp "$MAGISK_PATH" "$MOUNT_DIR"/sbin/magisk.apk
+ sudo tee -a "$MOUNT_DIR"/sbin/loadpolicy.sh <
+
+
+
+
+
+
+EOF
+wine64 ../wine/"$HOST_ARCH"/makepri.exe new /pr "$WORK_DIR"/wsa/pri /in MicrosoftCorporationII.WindowsSubsystemForAndroid /cf "$WORK_DIR"/wsa/priconfig.xml /of "$WORK_DIR"/wsa/"$ARCH"/resources.pri /o
+sed -i -zE "s//\n$(cat "$WORK_DIR"/wsa/xml/* | grep -Po ']*/>' | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/\$/\\$/g' | sed 's/\//\\\//g')\n<\/Resources>/g" "$WORK_DIR"/wsa/"$ARCH"/AppxManifest.xml
+echo -e "Merge Language Resources done\n"
+
+echo "Add extra packages"
+sudo cp -r ../"$ARCH"/system/* "$MOUNT_DIR" || abort
+find ../"$ARCH"/system/system/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/priv-app/dir -type d -exec chmod 0755 {} \;
+find ../"$ARCH"/system/system/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/priv-app/dir -type f -exec chmod 0644 {} \;
+find ../"$ARCH"/system/system/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/priv-app/dir -exec chown root:root {} \;
+find ../"$ARCH"/system/system/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/priv-app/dir -exec chcon --reference="$MOUNT_DIR"/system/priv-app {} \;
+find ../"$ARCH"/system/system/etc/permissions/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system/etc/permissions/file -type f -exec chmod 0644 {} \;
+find ../"$ARCH"/system/system/etc/permissions/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system/etc/permissions/file -exec chown root:root {} \;
+find ../"$ARCH"/system/system/etc/permissions/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system/etc/permissions/file -type f -exec chcon --reference="$MOUNT_DIR"/system/etc/permissions/platform.xml {} \;
+echo -e "Add extra packages done\n"
+
+if [ "$GAPPS_VARIANT" != 'none' ] && [ "$GAPPS_VARIANT" != '' ]; then
+ echo "Integrate GApps"
+
+ find "$WORK_DIR/gapps/" -mindepth 1 -type d -exec sudo chmod 0755 {} \;
+ find "$WORK_DIR/gapps/" -mindepth 1 -type d -exec sudo chown root:root {} \;
+ file_list="$(find "$WORK_DIR/gapps/" -mindepth 1 -type f | cut -d/ -f5-)"
+ for file in $file_list; do
+ sudo chown root:root "$WORK_DIR/gapps/${file}"
+ sudo chmod 0644 "$WORK_DIR/gapps/${file}"
+ done
+
+ if [ "$GAPPS_BRAND" = "OpenGApps" ]; then
+ find "$WORK_DIR"/gapps/ -maxdepth 1 -mindepth 1 -type d -not -path '*product' -exec sudo cp --preserve=all -r {} "$MOUNT_DIR"/system \; || abort
+ elif [ "$GAPPS_BRAND" = "MindTheGapps" ]; then
+ sudo cp --preserve=all -r "$WORK_DIR"/gapps/system_ext/* "$MOUNT_DIR"/system_ext/ || abort
+ if [ -e "$MOUNT_DIR"/system_ext/priv-app/SetupWizard ] ; then
+ rm -rf "${MOUNT_DIR:?}/system_ext/priv-app/Provision"
+ fi
+ fi
+ sudo cp --preserve=all -r "$WORK_DIR"/gapps/product/* "$MOUNT_DIR"/product || abort
+
+ find "$WORK_DIR"/gapps/product/overlay -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/product/overlay/file -type f -exec chcon --reference="$MOUNT_DIR"/product/overlay/FontNotoSerifSource/FontNotoSerifSourceOverlay.apk {} \;
+
+ if [ "$GAPPS_BRAND" = "OpenGApps" ]; then
+ find "$WORK_DIR"/gapps/app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/app/dir -type d -exec chcon --reference="$MOUNT_DIR"/system/app {} \;
+ find "$WORK_DIR"/gapps/framework/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/framework/dir -type d -exec chcon --reference="$MOUNT_DIR"/system/framework {} \;
+ find "$WORK_DIR"/gapps/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/priv-app/dir -type d -exec chcon --reference="$MOUNT_DIR"/system/priv-app {} \;
+ find "$WORK_DIR"/gapps/app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system/app/file -type f -exec chcon --reference="$MOUNT_DIR"/system/app/KeyChain/KeyChain.apk {} \;
+ find "$WORK_DIR"/gapps/framework/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system/framework/file -type f -exec chcon --reference="$MOUNT_DIR"/system/framework/ext.jar {} \;
+ find "$WORK_DIR"/gapps/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system/priv-app/file -type f -exec chcon --reference="$MOUNT_DIR"/system/priv-app/Shell/Shell.apk {} \;
+ find "$WORK_DIR"/gapps/etc/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/etc/dir -type d -exec chcon --reference="$MOUNT_DIR"/system/etc/permissions {} \;
+ find "$WORK_DIR"/gapps/etc/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system/etc/dir -type f -exec chcon --reference="$MOUNT_DIR"/system/etc/permissions {} \;
+ else
+ find "$WORK_DIR"/gapps/product/app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/app/item -type d -exec chcon --reference="$MOUNT_DIR"/product/app {} \;
+ find "$WORK_DIR"/gapps/product/etc/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/etc/item -type d -exec chcon --reference="$MOUNT_DIR"/product/etc {} \;
+ find "$WORK_DIR"/gapps/product/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/priv-app/item -type d -exec chcon --reference="$MOUNT_DIR"/product/priv-app {} \;
+ find "$WORK_DIR"/gapps/product/framework/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/framework/item -type d -exec chcon --reference="$MOUNT_DIR"/product/framework {} \;
+
+ find "$WORK_DIR"/gapps/product/app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/app/item -type f -exec chcon --reference="$MOUNT_DIR"/product/app/HomeApp/HomeApp.apk {} \;
+ find "$WORK_DIR"/gapps/product/etc/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/etc/item -type f -exec chcon --reference="$MOUNT_DIR"/product/etc/permissions/com.android.settings.intelligence.xml {} \;
+ find "$WORK_DIR"/gapps/product/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/priv-app/item -type f -exec chcon --reference="$MOUNT_DIR"/product/priv-app/SettingsIntelligence/SettingsIntelligence.apk {} \;
+ find "$WORK_DIR"/gapps/product/framework/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I item sudo find "$MOUNT_DIR"/product/framework/item -type f -exec chcon --reference="$MOUNT_DIR"/product/etc/permissions/com.android.settings.intelligence.xml {} \;
+ find "$WORK_DIR"/gapps/system_ext/etc/permissions/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/system_ext/etc/permissions/file -type f -exec chcon --reference="$MOUNT_DIR"/system_ext/etc/permissions/com.android.systemui.xml {} \;
+
+ sudo chcon --reference="$MOUNT_DIR"/product/lib64/libjni_eglfence.so "$MOUNT_DIR"/product/lib
+ find "$WORK_DIR"/gapps/product/lib/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/product/lib/file -exec chcon --reference="$MOUNT_DIR"/product/lib64/libjni_eglfence.so {} \;
+ find "$WORK_DIR"/gapps/product/lib64/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I file sudo find "$MOUNT_DIR"/product/lib64/file -type f -exec chcon --reference="$MOUNT_DIR"/product/lib64/libjni_eglfence.so {} \;
+ find "$WORK_DIR"/gapps/system_ext/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system_ext/priv-app/dir -type d -exec chcon --reference="$MOUNT_DIR"/system_ext/priv-app {} \;
+ find "$WORK_DIR"/gapps/system_ext/etc/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system_ext/etc/dir -type d -exec chcon --reference="$MOUNT_DIR"/system_ext/etc {} \;
+ find "$WORK_DIR"/gapps/system_ext/priv-app/ -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I dir sudo find "$MOUNT_DIR"/system_ext/priv-app/dir -type f -exec chcon --reference="$MOUNT_DIR"/system_ext/priv-app/Settings/Settings.apk {} \;
+ fi
+
+ sudo patchelf --replace-needed libc.so "../linker/$HOST_ARCH/libc.so" "$WORK_DIR"/magisk/magiskpolicy || abort
+ sudo patchelf --replace-needed libm.so "../linker/$HOST_ARCH/libm.so" "$WORK_DIR"/magisk/magiskpolicy || abort
+ sudo patchelf --replace-needed libdl.so "../linker/$HOST_ARCH/libdl.so" "$WORK_DIR"/magisk/magiskpolicy || abort
+ sudo patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort
+ chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort
+ sudo "$WORK_DIR"/magisk/magiskpolicy --load "$MOUNT_DIR"/vendor/etc/selinux/precompiled_sepolicy --save "$MOUNT_DIR"/vendor/etc/selinux/precompiled_sepolicy "allow gmscore_app gmscore_app vsock_socket { create connect write read }" "allow gmscore_app device_config_runtime_native_boot_prop file read" "allow gmscore_app system_server_tmpfs dir search" "allow gmscore_app system_server_tmpfs file open" || abort
+ echo -e "Integrate GApps done\n"
+fi
+
+if [ "$GAPPS_VARIANT" != 'none' ] && [ "$GAPPS_VARIANT" != '' ]; then
+ echo "Fix GApps prop"
+ sudo python3 fixGappsProp.py "$MOUNT_DIR" || abort
+ echo -e "done\n"
+fi
+
+echo "Umount images"
+sudo find "$MOUNT_DIR" -exec touch -amt 200901010000.00 {} \; >/dev/null 2>&1
+sudo umount "$MOUNT_DIR"/vendor
+sudo umount "$MOUNT_DIR"/product
+sudo umount "$MOUNT_DIR"/system_ext
+sudo umount "$MOUNT_DIR"
+echo -e "done\n"
+
+echo "Shrink images"
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/system.img || abort
+resize2fs -M "$WORK_DIR"/wsa/"$ARCH"/system.img || abort
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/vendor.img || abort
+resize2fs -M "$WORK_DIR"/wsa/"$ARCH"/vendor.img || abort
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/product.img || abort
+resize2fs -M "$WORK_DIR"/wsa/"$ARCH"/product.img || abort
+e2fsck -yf "$WORK_DIR"/wsa/"$ARCH"/system_ext.img || abort
+resize2fs -M "$WORK_DIR"/wsa/"$ARCH"/system_ext.img || abort
+echo -e "Shrink images done\n"
+
+echo "Remove signature and add scripts"
+sudo rm -rf "${WORK_DIR:?}"/wsa/"$ARCH"/\[Content_Types\].xml "$WORK_DIR"/wsa/"$ARCH"/AppxBlockMap.xml "$WORK_DIR"/wsa/"$ARCH"/AppxSignature.p7x "$WORK_DIR"/wsa/"$ARCH"/AppxMetadata || abort
+cp "$DOWNLOAD_DIR"/"$vclibs_PATH" "$DOWNLOAD_DIR"/"$xaml_PATH" "$WORK_DIR"/wsa/"$ARCH" || abort
+tee "$WORK_DIR"/wsa/"$ARCH"/Install.ps1 <.
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+import sys
+
+import zipfile
+import os
+from pathlib import Path
+import platform
+
+is_x86_64 = platform.machine() in ("AMD64", "x86_64")
+host_abi = "x64" if is_x86_64 else "arm64"
+arch = sys.argv[1]
+magisk_zip = sys.argv[2]
+if not os.path.exists(Path.cwd().parent / sys.argv[3] / "magisk"):
+ os.makedirs(Path.cwd().parent / sys.argv[3] / "magisk")
+workdir = Path.cwd().parent / sys.argv[3] / "magisk"
+
+abi_map = {"x64": ["x86_64", "x86"], "arm64": ["arm64-v8a", "armeabi-v7a"]}
+
+def extract_as(zip, name, as_name, dir):
+ info = zip.getinfo(name)
+ info.filename = as_name
+ zip.extract(info, workdir / dir)
+
+with zipfile.ZipFile(magisk_zip) as zip:
+ extract_as(
+ zip, f"lib/{ abi_map[arch][0] }/libmagisk64.so", "magisk64", "magisk")
+ extract_as(
+ zip, f"lib/{ abi_map[arch][1] }/libmagisk32.so", "magisk32", "magisk")
+ standalone_policy = False
+ try:
+ zip.getinfo(f"lib/{ abi_map[arch][0] }/libmagiskpolicy.so")
+ standalone_policy = True
+ except:
+ pass
+ extract_as(
+ zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskinit", "magisk")
+ if standalone_policy:
+ extract_as(
+ zip, f"lib/{ abi_map[arch][0] }/libmagiskpolicy.so", "magiskpolicy", "magisk")
+ else:
+ extract_as(
+ zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskpolicy", "magisk")
+ extract_as(
+ zip, f"lib/{ abi_map[arch][0] }/libmagiskboot.so", "magiskboot", "magisk")
+ extract_as(
+ zip, f"lib/{ abi_map[arch][0] }/libbusybox.so", "busybox", "magisk")
+ if standalone_policy:
+ extract_as(
+ zip, f"lib/{ abi_map[host_abi][0] }/libmagiskpolicy.so", "magiskpolicy", ".")
+ else:
+ extract_as(
+ zip, f"lib/{ abi_map[host_abi][0] }/libmagiskinit.so", "magiskpolicy", ".")
+ extract_as(zip, f"assets/boot_patch.sh", "boot_patch.sh", "magisk")
+ extract_as(zip, f"assets/util_functions.sh",
+ "util_functions.sh", "magisk")
diff --git a/scripts/extractWSA.py b/scripts/extractWSA.py
new file mode 100644
index 0000000..9da9204
--- /dev/null
+++ b/scripts/extractWSA.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+import sys
+
+import warnings
+import zipfile
+import os
+from pathlib import Path
+
+warnings.filterwarnings("ignore")
+
+arch = sys.argv[1]
+
+if not os.path.exists(Path.cwd().parent / sys.argv[2] / "wsa"):
+ os.makedirs(Path.cwd().parent / sys.argv[2] / "wsa")
+zip_name = ""
+wsa_zip_path= Path(sys.argv[2]).resolve()
+workdir = Path.cwd().parent / sys.argv[3] / "wsa"
+with zipfile.ZipFile(wsa_zip_path) as zip:
+ for f in zip.filelist:
+ if arch in f.filename.lower():
+ zip_name = f.filename
+ output_name = zip_name[11:-5]
+ if not os.path.isfile(workdir / zip_name):
+ zip_path = workdir / zip_name
+ print(f"unzipping to {workdir}", flush=True)
+ zip.extract(f, workdir)
+ ver_no = zip_name.split("_")
+ long_ver = ver_no[1]
+ ver = long_ver.split(".")
+ main_ver = ver[0]
+ with open(os.environ['WSA_WORK_ENV'], 'a') as g:
+ g.write(f'WSA_VER={long_ver}\n')
+ with open(os.environ['WSA_WORK_ENV'], 'a') as g:
+ g.write(f'WSA_MAIN_VER={main_ver}\n')
+ rel = ver_no[3].split(".")
+ rell = str(rel[0])
+ with open(os.environ['WSA_WORK_ENV'], 'a') as g:
+ g.write(f'WSA_REL={rell}\n')
+ if 'language' in f.filename.lower() or 'scale' in f.filename.lower():
+ name = f.filename.split("-", 1)[1].split(".")[0]
+ zip.extract(f, workdir)
+ with zipfile.ZipFile(workdir / f.filename) as l:
+ for g in l.filelist:
+ if g.filename == 'resources.pri':
+ g.filename = f'{name}.pri'
+ l.extract(g, workdir / 'pri')
+ elif g.filename == 'AppxManifest.xml':
+ g.filename = f'{name}.xml'
+ l.extract(g, workdir / 'xml')
+with zipfile.ZipFile(zip_path) as zip:
+ if not os.path.isdir(workdir / arch):
+ print(f"unzipping from {zip_path}", flush=True)
+ zip.extractall(workdir / arch)
diff --git a/scripts/fixGappsProp.py b/scripts/fixGappsProp.py
new file mode 100644
index 0000000..0bd7dce
--- /dev/null
+++ b/scripts/fixGappsProp.py
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+from __future__ import annotations
+from io import TextIOWrapper
+from os import system, path
+from typing import OrderedDict
+import sys
+class Prop(OrderedDict):
+ def __init__(self, file: TextIOWrapper) -> None:
+ super().__init__()
+ for i, line in enumerate(file.read().splitlines(False)):
+ if '=' in line:
+ k, v = line.split('=', 2)
+ self[k] = v
+ else:
+ self[f".{i}"] = line
+
+ def __str__(self) -> str:
+ return '\n'.join([v if k.startswith('.') else f"{k}={v}" for k, v in self.items()])
+
+ def __iadd__(self, other: str) -> Prop:
+ self[f".{len(self)}"] = other
+ return self
+
+
+new_props = {
+ ("product", "brand"): "google",
+ ("product", "manufacturer"): "Google",
+ ("build", "product"): "redfin",
+ ("product", "name"): "redfin",
+ ("product", "device"): "redfin",
+ ("product", "model"): "Pixel 5",
+ ("build", "flavor"): "redfin-user"
+}
+
+
+def description(sec: str, p: Prop) -> str:
+ return f"{p[f'ro.{sec}.build.flavor']} {p[f'ro.{sec}.build.version.release_or_codename']} {p[f'ro.{sec}.build.id']} {p[f'ro.{sec}.build.version.incremental']} {p[f'ro.{sec}.build.tags']}"
+
+
+def fingerprint(sec: str, p: Prop) -> str:
+ return f"""{p[f"ro.product.{sec}.brand"]}/{p[f"ro.product.{sec}.name"]}/{p[f"ro.product.{sec}.device"]}:{p[f"ro.{sec}.build.version.release"]}/{p[f"ro.{sec}.build.id"]}/{p[f"ro.{sec}.build.version.incremental"]}:{p[f"ro.{sec}.build.type"]}/{p[f"ro.{sec}.build.tags"]}"""
+
+
+def fix_prop(sec, prop):
+ if not path.exists(prop):
+ return
+
+ print(f"fixing {prop}", flush=True)
+ with open(prop, 'r') as f:
+ p = Prop(f)
+
+ p += "# extra prop added by MagiskOnWSA"
+
+ for k, v in new_props.items():
+ p[f"ro.{k[0]}.{k[1]}"] = v
+
+ if k[0] == "build":
+ p[f"ro.{sec}.{k[0]}.{k[1]}"] = v
+ elif k[0] == "product":
+ p[f"ro.{k[0]}.{sec}.{k[1]}"] = v
+
+ p["ro.build.description"] = description(sec, p)
+ p[f"ro.build.fingerprint"] = fingerprint(sec, p)
+ p[f"ro.{sec}.build.description"] = description(sec, p)
+ p[f"ro.{sec}.build.fingerprint"] = fingerprint(sec, p)
+ p[f"ro.bootimage.build.fingerprint"] = fingerprint(sec, p)
+
+ with open(prop, 'w') as f:
+ f.write(str(p))
+
+
+sys_path = sys.argv[1]
+for sec, prop in {"system": sys_path+"/system/build.prop", "product": sys_path+"/product/build.prop", "system_ext": sys_path+"/system_ext/build.prop", "vendor": sys_path+"/vendor/build.prop", "odm": sys_path+"/vendor/odm/etc/build.prop"}.items():
+ fix_prop(sec, prop)
diff --git a/scripts/generateGappsLink.py b/scripts/generateGappsLink.py
new file mode 100644
index 0000000..06cc559
--- /dev/null
+++ b/scripts/generateGappsLink.py
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+import sys
+
+import requests
+import os
+import json
+import re
+from pathlib import Path
+
+arch = sys.argv[1]
+variant = sys.argv[2]
+download_dir = Path.cwd().parent / "download" if sys.argv[3] == "" else Path(sys.argv[3]).resolve()
+tempScript = sys.argv[4]
+print(f"Generating OpenGApps download link: arch={arch} variant={variant}", flush=True)
+abi_map = {"x64": "x86_64", "arm64": "arm64"}
+# TODO: keep it 11.0 since opengapps does not support 12+ yet
+# As soon as opengapps is available for 12+, we need to get the sdk/release from build.prop and
+# download the corresponding version
+release = "11.0"
+try:
+ res = requests.get(f"https://api.opengapps.org/list")
+ j = json.loads(res.content)
+ link = {i["name"]: i for i in j["archs"][abi_map[arch]]
+ ["apis"][release]["variants"]}[variant]["zip"]
+except Exception:
+ print("Failed to fetch from OpenGApps API, fallbacking to SourceForge RSS...")
+ res = requests.get(
+ f'https://sourceforge.net/projects/opengapps/rss?path=/{abi_map[arch]}&limit=100')
+ link = re.search(f'https://.*{abi_map[arch]}/.*{release}.*{variant}.*\.zip/download', res.text).group().replace(
+ '.zip/download', '.zip').replace('sourceforge.net/projects/opengapps/files', 'downloads.sourceforge.net/project/opengapps')
+
+print(f"download link: {link}", flush=True)
+
+with open(download_dir/tempScript, 'a') as f:
+ f.writelines(f'{link}\n')
+ f.writelines(f' dir={download_dir}\n')
+ f.writelines(f' out=OpenGApps-{arch}-{variant}.zip\n')
+ f.close
diff --git a/scripts/generateMagiskLink.py b/scripts/generateMagiskLink.py
new file mode 100644
index 0000000..0578c4b
--- /dev/null
+++ b/scripts/generateMagiskLink.py
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+import sys
+
+import os
+import json
+import requests
+from pathlib import Path
+
+magisk_ver = sys.argv[1]
+download_dir = Path.cwd().parent / "download" if sys.argv[2] == "" else Path(sys.argv[2]).resolve()
+tempScript = sys.argv[3]
+print(f"Generating Magisk download link: release type={magisk_ver}", flush=True)
+if not magisk_ver:
+ magisk_ver = "stable"
+if magisk_ver == "stable" or magisk_ver == "beta" or magisk_ver == "canary" or magisk_ver == "debug":
+ magisk_link = json.loads(requests.get(
+ f"https://github.com/topjohnwu/magisk-files/raw/master/{magisk_ver}.json").content)['magisk']['link']
+print(f"download link: {magisk_link}", flush=True)
+
+with open(download_dir/tempScript, 'a') as f:
+ f.writelines(f'{magisk_link}\n')
+ f.writelines(f' dir={download_dir}\n')
+ f.writelines(f' out=magisk-{magisk_ver}.zip\n')
diff --git a/scripts/generateWSALinks.py b/scripts/generateWSALinks.py
new file mode 100644
index 0000000..2c2038a
--- /dev/null
+++ b/scripts/generateWSALinks.py
@@ -0,0 +1,115 @@
+#!/usr/bin/python
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+import sys
+
+import requests
+from xml.dom import minidom
+import html
+import warnings
+import re
+import os
+from pathlib import Path
+
+warnings.filterwarnings("ignore")
+
+arch = sys.argv[1]
+
+release_type_map = {"retail": "Retail", "release preview": "RP",
+ "insider slow": "WIS", "insider fast": "WIF"}
+release_type = release_type_map[sys.argv[2]] if sys.argv[2] != "" else "Retail"
+download_dir = Path.cwd().parent / "download" if sys.argv[3] == "" else Path(sys.argv[3]).resolve()
+tempScript = sys.argv[4]
+cat_id = '858014f3-3934-4abe-8078-4aa193e74ca8'
+print(f"Generating WSA download link: arch={arch} release_type={release_type}", flush=True)
+with open(Path.cwd().parent / ("xml/GetCookie.xml"), "r") as f:
+ cookie_content = f.read()
+
+out = requests.post(
+ 'https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx',
+ data=cookie_content,
+ headers={'Content-Type': 'application/soap+xml; charset=utf-8'},
+ verify=False
+)
+doc = minidom.parseString(out.text)
+cookie = doc.getElementsByTagName('EncryptedData')[0].firstChild.nodeValue
+
+with open(Path.cwd().parent / "xml/WUIDRequest.xml", "r") as f:
+ cat_id_content = f.read().format(cookie, cat_id, release_type)
+
+out = requests.post(
+ 'https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx',
+ data=cat_id_content,
+ headers={'Content-Type': 'application/soap+xml; charset=utf-8'},
+ verify=False
+)
+
+doc = minidom.parseString(html.unescape(out.text))
+
+filenames = {}
+for node in doc.getElementsByTagName('Files'):
+ filenames[node.parentNode.parentNode.getElementsByTagName(
+ 'ID')[0].firstChild.nodeValue] = f"{node.firstChild.attributes['InstallerSpecificIdentifier'].value}_{node.firstChild.attributes['FileName'].value}"
+ pass
+
+identities = []
+for node in doc.getElementsByTagName('SecuredFragment'):
+ filename = filenames[node.parentNode.parentNode.parentNode.getElementsByTagName('ID')[
+ 0].firstChild.nodeValue]
+ update_identity = node.parentNode.parentNode.firstChild
+ identities += [(update_identity.attributes['UpdateID'].value,
+ update_identity.attributes['RevisionNumber'].value, filename)]
+
+with open(Path.cwd().parent / "xml/FE3FileUrl.xml", "r") as f:
+ file_content = f.read()
+
+if not os.path.exists(download_dir):
+ os.makedirs(download_dir)
+tmpdownlist = open(download_dir/tempScript, 'a')
+for i, v, f in identities:
+ if re.match(f"Microsoft\.UI\.Xaml\..*_{arch}_.*\.appx", f):
+ out_file_name = f"xaml-{arch}.appx"
+ out_file = download_dir / out_file_name
+ # elif re.match(f"Microsoft\.VCLibs\..+\.UWPDesktop_.*_{arch}_.*\.appx", f):
+ # out_file = download_dir / "vclibs.appx"
+ # out_file_name = "vclibs.appx"
+ elif re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", f):
+ out_file_name = f"wsa-{arch}-{release_type}.zip"
+ out_file = download_dir / out_file_name
+ else:
+ continue
+ out = requests.post(
+ 'https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx/secured',
+ data=file_content.format(i, v, release_type),
+ headers={'Content-Type': 'application/soap+xml; charset=utf-8'},
+ verify=False
+ )
+ doc = minidom.parseString(out.text)
+ for l in doc.getElementsByTagName("FileLocation"):
+ url = l.getElementsByTagName("Url")[0].firstChild.nodeValue
+ if len(url) != 99:
+ print(f"download link: {url} to {out_file}", flush=True)
+ tmpdownlist.writelines(url + '\n')
+ tmpdownlist.writelines(f' dir={download_dir}\n')
+ tmpdownlist.writelines(f' out={out_file_name}\n')
+tmpdownlist.writelines(f'https://aka.ms/Microsoft.VCLibs.{arch}.14.00.Desktop.appx\n')
+tmpdownlist.writelines(f' dir={download_dir}\n')
+tmpdownlist.writelines(f' out=vclibs-{arch}.appx\n')
+tmpdownlist.close
diff --git a/scripts/run.sh b/scripts/run.sh
new file mode 100644
index 0000000..bb884e5
--- /dev/null
+++ b/scripts/run.sh
@@ -0,0 +1,154 @@
+#!/bin/bash
+#
+# This file is part of MagiskOnWSALocal.
+#
+# MagiskOnWSALocal is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# MagiskOnWSALocal is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with MagiskOnWSALocal. If not, see .
+#
+# Copyright (C) 2022 LSPosed Contributors
+#
+
+# DEBUG=--debug
+# CUSTOM_MAGISK=--magisk-custom
+if [ ! "$BASH_VERSION" ] ; then
+ echo "Please do not use sh to run this script, just execute it directly" 1>&2
+ exit 1
+fi
+cd "$(dirname "$0")" || exit 1
+
+abort(){
+ echo "Dependencies: an error has occurred, exit"
+ exit 1
+}
+
+function Radiolist {
+ declare -A o="$1"
+ shift
+ if ! whiptail --nocancel --radiolist "${o[title]}" 0 0 0 "$@" 3>&1 1>&2 2>&3; then
+ echo "${o[default]}"
+ fi
+}
+
+function YesNoBox {
+ declare -A o="$1"
+ shift
+ whiptail --title "${o[title]}" --yesno "${o[text]}" 0 0
+}
+
+echo "Dependencies"
+sudo apt update && sudo apt -y install setools lzip wine winetricks patchelf whiptail e2fsprogs python3-pip aria2
+python3 -m pip install requests
+cp -r ../wine/.cache/* ~/.cache
+winetricks msxml6 || abort
+
+ARCH=$(
+ Radiolist '([title]="Build arch"
+ [default]="x64")' \
+ \
+ 'x64' "X86_64" 'on' \
+ 'arm64' "AArch64" 'off'
+)
+
+RELEASE_TYPE=$(
+ Radiolist '([title]="WSA release type"
+ [default]="retail")' \
+ \
+ 'retail' "Stable Channel" 'on' \
+ 'release preview' "Release Preview Channel" 'off' \
+ 'insider slow' "Beta Channel" 'off' \
+ 'insider fast' "Dev Channel" 'off'
+)
+if [ "$CUSTOM_MAGISK" != "1" ]; then
+ MAGISK_VER=$(
+ Radiolist '([title]="Magisk version"
+ [default]="stable")' \
+ \
+ 'stable' "Stable Channel" 'on' \
+ 'beta' "Beta Channel" 'off' \
+ 'canary' "Canary Channel" 'off' \
+ 'debug' "Canary Channel Debug Build" 'off'
+ )
+else
+ MAGISK_VER=debug
+fi
+
+if (YesNoBox '([title]="Install GApps" [text]="Do you want to install GApps?")'); then
+ if [ -f "$DOWNLOAD_DIR"/MindTheGapps-"$ARCH".zip ]; then
+ GAPPS_BRAND=$(
+ Radiolist '([title]="Which GApps do you want to install?"
+ [default]="OpenGApps")' \
+ \
+ 'OpenGApps' "" 'on' \
+ 'MindTheGapps' "" 'off'
+ )
+ else
+ GAPPS_BRAND="OpenGApps"
+ fi
+else
+ GAPPS_VARIANT="none"
+fi
+if [ $GAPPS_BRAND = "OpenGApps" ]; then
+ # TODO: Keep it pico since other variants of opengapps are unable to boot successfully
+ if [ "$DEBUG" = "1" ]; then
+ GAPPS_VARIANT=$(
+ Radiolist '([title]="Variants of GApps"
+ [default]="pico")' \
+ \
+ 'super' "" 'off' \
+ 'stock' "" 'off' \
+ 'full' "" 'off' \
+ 'mini' "" 'off' \
+ 'micro' "" 'off' \
+ 'nano' "" 'off' \
+ 'pico' "" 'on' \
+ 'tvstock' "" 'off' \
+ 'tvmini' "" 'off'
+ )
+ else
+ GAPPS_VARIANT=pico
+ fi
+else
+ GAPPS_VARIANT=$GAPPS_BRAND
+fi
+
+if (YesNoBox '([title]="Remove Amazon AppStore" [text]="Do you want to keep Amazon AppStore?")'); then
+ REMOVE_AMAZON=""
+else
+ REMOVE_AMAZON="--remove-amazon"
+fi
+
+ROOT_SOL=$(
+ Radiolist '([title]="Root solution"
+ [default]="magisk")' \
+ \
+ 'magisk' "" 'on' \
+ 'none' "" 'off'
+)
+
+if (YesNoBox '([title]="Compress output" [text]="Do you want to compress the output?")'); then
+ COMPRESS_OUTPUT="--compress"
+else
+ COMPRESS_OUTPUT=""
+fi
+
+# if ! (YesNoBox '([title]="Off line mode" [text]="Do you want to enable off line mode?")'); then
+# OFFLINE="--offline"
+# else
+# OFFLINE=""
+# fi
+# OFFLINE="--offline"
+clear
+
+COMMAND_LINE=(--arch "$ARCH" --release-type "$RELEASE_TYPE" --magisk-ver "$MAGISK_VER" --gapps-brand "$GAPPS_BRAND" --gapps-variant "$GAPPS_VARIANT" "$REMOVE_AMAZON" --root-sol "$ROOT_SOL" "$COMPRESS_OUTPUT" "$OFFLINE" "$DEBUG" "$CUSTOM_MAGISK")
+echo "COMMAND_LINE=${COMMAND_LINE[*]}"
+./build.sh "${COMMAND_LINE[@]}"
diff --git a/wine/x86_64/makepri.exe b/wine/x86_64/makepri.exe
new file mode 100644
index 0000000..0207ba5
Binary files /dev/null and b/wine/x86_64/makepri.exe differ
diff --git a/xml/FE3FileUrl.xml b/xml/FE3FileUrl.xml
index f125069..de2e6ad 100644
--- a/xml/FE3FileUrl.xml
+++ b/xml/FE3FileUrl.xml
@@ -1,40 +1,40 @@
-
-
- http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetExtendedUpdateInfo2
- urn:uuid:2cc99c2e-3b3e-4fb1-9e31-0cd30e6f43a0
- https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx/secured
-
-
- 2017-08-01T00:29:01.868Z
- 2017-08-01T00:34:01.868Z
-
-
-
- dAA9AEUAdwBBAHcAQQBzAE4AMwBCAEEAQQBVADEAYgB5AHMAZQBtAGIAZQBEAFYAQwArADMAZgBtADcAbwBXAHkASAA3AGIAbgBnAEcAWQBtAEEAQQBMAGoAbQBqAFYAVQB2AFEAYwA0AEsAVwBFAC8AYwBDAEwANQBYAGUANABnAHYAWABkAGkAegBHAGwAZABjADEAZAAvAFcAeQAvAHgASgBQAG4AVwBRAGUAYwBtAHYAbwBjAGkAZwA5AGoAZABwAE4AawBIAG0AYQBzAHAAVABKAEwARAArAFAAYwBBAFgAbQAvAFQAcAA3AEgAagBzAEYANAA0AEgAdABsAC8AMQBtAHUAcgAwAFMAdQBtAG8AMABZAGEAdgBqAFIANwArADQAcABoAC8AcwA4ADEANgBFAFkANQBNAFIAbQBnAFIAQwA2ADMAQwBSAEoAQQBVAHYAZgBzADQAaQB2AHgAYwB5AEwAbAA2AHoAOABlAHgAMABrAFgAOQBPAHcAYQB0ADEAdQBwAFMAOAAxAEgANgA4AEEASABzAEoAegBnAFQAQQBMAG8AbgBBADIAWQBBAEEAQQBpAGcANQBJADMAUQAvAFYASABLAHcANABBAEIAcQA5AFMAcQBhADEAQgA4AGsAVQAxAGEAbwBLAEEAdQA0AHYAbABWAG4AdwBWADMAUQB6AHMATgBtAEQAaQBqAGgANQBkAEcAcgBpADgAQQBlAEUARQBWAEcAbQBXAGgASQBCAE0AUAAyAEQAVwA0ADMAZABWAGkARABUAHoAVQB0AHQARQBMAEgAaABSAGYAcgBhAGIAWgBsAHQAQQBUAEUATABmAHMARQBGAFUAYQBRAFMASgB4ADUAeQBRADgAagBaAEUAZQAyAHgANABCADMAMQB2AEIAMgBqAC8AUgBLAGEAWQAvAHEAeQB0AHoANwBUAHYAdAB3AHQAagBzADYAUQBYAEIAZQA4AHMAZwBJAG8AOQBiADUAQQBCADcAOAAxAHMANgAvAGQAUwBFAHgATgBEAEQAYQBRAHoAQQBYAFAAWABCAFkAdQBYAFEARQBzAE8AegA4AHQAcgBpAGUATQBiAEIAZQBUAFkAOQBiAG8AQgBOAE8AaQBVADcATgBSAEYAOQAzAG8AVgArAFYAQQBiAGgAcAAwAHAAUgBQAFMAZQBmAEcARwBPAHEAdwBTAGcANwA3AHMAaAA5AEoASABNAHAARABNAFMAbgBrAHEAcgAyAGYARgBpAEMAUABrAHcAVgBvAHgANgBuAG4AeABGAEQAbwBXAC8AYQAxAHQAYQBaAHcAegB5AGwATABMADEAMgB3AHUAYgBtADUAdQBtAHAAcQB5AFcAYwBLAFIAagB5AGgAMgBKAFQARgBKAFcANQBnAFgARQBJADUAcAA4ADAARwB1ADIAbgB4AEwAUgBOAHcAaQB3AHIANwBXAE0AUgBBAFYASwBGAFcATQBlAFIAegBsADkAVQBxAGcALwBwAFgALwB2AGUATAB3AFMAawAyAFMAUwBIAGYAYQBLADYAagBhAG8AWQB1AG4AUgBHAHIAOABtAGIARQBvAEgAbABGADYASgBDAGEAYQBUAEIAWABCAGMAdgB1AGUAQwBKAG8AOQA4AGgAUgBBAHIARwB3ADQAKwBQAEgAZQBUAGIATgBTAEUAWABYAHoAdgBaADYAdQBXADUARQBBAGYAZABaAG0AUwA4ADgAVgBKAGMAWgBhAEYASwA3AHgAeABnADAAdwBvAG4ANwBoADAAeABDADYAWgBCADAAYwBZAGoATAByAC8ARwBlAE8AegA5AEcANABRAFUASAA5AEUAawB5ADAAZAB5AEYALwByAGUAVQAxAEkAeQBpAGEAcABwAGgATwBQADgAUwAyAHQANABCAHIAUABaAFgAVAB2AEMAMABQADcAegBPACsAZgBHAGsAeABWAG0AKwBVAGYAWgBiAFEANQA1AHMAdwBFAD0AJgBwAD0A
-
-
-
-
-
-
-
-
- {}
- {}
-
-
-
- FileUrl
- FileDecryption
-
- BranchReadinessLevel=CB;CurrentBranch=rs_prerelease;OEMModel=Virtual Machine;FlightRing={};AttrDataVer=21;SystemManufacturer=Microsoft Corporation;InstallLanguage=en-US;OSUILocale=en-US;InstallationType=Client;FlightingBranchName=external;FirmwareVersion=Hyper-V UEFI Release v2.5;SystemProductName=Virtual Machine;OSSkuId=48;FlightContent=Branch;App=WU;OEMName_Uncleaned=Microsoft Corporation;AppVer=10.0.16184.1001;OSArchitecture=AMD64;SystemSKU=None;UpdateManagementGroup=2;IsFlightingEnabled=1;IsDeviceRetailDemo=0;TelemetryLevel=3;OSVersion=10.0.16184.1001;DeviceFamily=Windows.Desktop;
-
-
-
+
+
+ http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetExtendedUpdateInfo2
+ urn:uuid:2cc99c2e-3b3e-4fb1-9e31-0cd30e6f43a0
+ https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx/secured
+
+
+ 2017-08-01T00:29:01.868Z
+ 2017-08-01T00:34:01.868Z
+
+
+
+ dAA9AEUAdwBBAHcAQQBzAE4AMwBCAEEAQQBVADEAYgB5AHMAZQBtAGIAZQBEAFYAQwArADMAZgBtADcAbwBXAHkASAA3AGIAbgBnAEcAWQBtAEEAQQBMAGoAbQBqAFYAVQB2AFEAYwA0AEsAVwBFAC8AYwBDAEwANQBYAGUANABnAHYAWABkAGkAegBHAGwAZABjADEAZAAvAFcAeQAvAHgASgBQAG4AVwBRAGUAYwBtAHYAbwBjAGkAZwA5AGoAZABwAE4AawBIAG0AYQBzAHAAVABKAEwARAArAFAAYwBBAFgAbQAvAFQAcAA3AEgAagBzAEYANAA0AEgAdABsAC8AMQBtAHUAcgAwAFMAdQBtAG8AMABZAGEAdgBqAFIANwArADQAcABoAC8AcwA4ADEANgBFAFkANQBNAFIAbQBnAFIAQwA2ADMAQwBSAEoAQQBVAHYAZgBzADQAaQB2AHgAYwB5AEwAbAA2AHoAOABlAHgAMABrAFgAOQBPAHcAYQB0ADEAdQBwAFMAOAAxAEgANgA4AEEASABzAEoAegBnAFQAQQBMAG8AbgBBADIAWQBBAEEAQQBpAGcANQBJADMAUQAvAFYASABLAHcANABBAEIAcQA5AFMAcQBhADEAQgA4AGsAVQAxAGEAbwBLAEEAdQA0AHYAbABWAG4AdwBWADMAUQB6AHMATgBtAEQAaQBqAGgANQBkAEcAcgBpADgAQQBlAEUARQBWAEcAbQBXAGgASQBCAE0AUAAyAEQAVwA0ADMAZABWAGkARABUAHoAVQB0AHQARQBMAEgAaABSAGYAcgBhAGIAWgBsAHQAQQBUAEUATABmAHMARQBGAFUAYQBRAFMASgB4ADUAeQBRADgAagBaAEUAZQAyAHgANABCADMAMQB2AEIAMgBqAC8AUgBLAGEAWQAvAHEAeQB0AHoANwBUAHYAdAB3AHQAagBzADYAUQBYAEIAZQA4AHMAZwBJAG8AOQBiADUAQQBCADcAOAAxAHMANgAvAGQAUwBFAHgATgBEAEQAYQBRAHoAQQBYAFAAWABCAFkAdQBYAFEARQBzAE8AegA4AHQAcgBpAGUATQBiAEIAZQBUAFkAOQBiAG8AQgBOAE8AaQBVADcATgBSAEYAOQAzAG8AVgArAFYAQQBiAGgAcAAwAHAAUgBQAFMAZQBmAEcARwBPAHEAdwBTAGcANwA3AHMAaAA5AEoASABNAHAARABNAFMAbgBrAHEAcgAyAGYARgBpAEMAUABrAHcAVgBvAHgANgBuAG4AeABGAEQAbwBXAC8AYQAxAHQAYQBaAHcAegB5AGwATABMADEAMgB3AHUAYgBtADUAdQBtAHAAcQB5AFcAYwBLAFIAagB5AGgAMgBKAFQARgBKAFcANQBnAFgARQBJADUAcAA4ADAARwB1ADIAbgB4AEwAUgBOAHcAaQB3AHIANwBXAE0AUgBBAFYASwBGAFcATQBlAFIAegBsADkAVQBxAGcALwBwAFgALwB2AGUATAB3AFMAawAyAFMAUwBIAGYAYQBLADYAagBhAG8AWQB1AG4AUgBHAHIAOABtAGIARQBvAEgAbABGADYASgBDAGEAYQBUAEIAWABCAGMAdgB1AGUAQwBKAG8AOQA4AGgAUgBBAHIARwB3ADQAKwBQAEgAZQBUAGIATgBTAEUAWABYAHoAdgBaADYAdQBXADUARQBBAGYAZABaAG0AUwA4ADgAVgBKAGMAWgBhAEYASwA3AHgAeABnADAAdwBvAG4ANwBoADAAeABDADYAWgBCADAAYwBZAGoATAByAC8ARwBlAE8AegA5AEcANABRAFUASAA5AEUAawB5ADAAZAB5AEYALwByAGUAVQAxAEkAeQBpAGEAcABwAGgATwBQADgAUwAyAHQANABCAHIAUABaAFgAVAB2AEMAMABQADcAegBPACsAZgBHAGsAeABWAG0AKwBVAGYAWgBiAFEANQA1AHMAdwBFAD0AJgBwAD0A
+
+
+
+
+
+
+
+
+ {}
+ {}
+
+
+
+ FileUrl
+ FileDecryption
+
+ BranchReadinessLevel=CB;CurrentBranch=rs_prerelease;OEMModel=Virtual Machine;FlightRing={};AttrDataVer=21;SystemManufacturer=Microsoft Corporation;InstallLanguage=en-US;OSUILocale=en-US;InstallationType=Client;FlightingBranchName=external;FirmwareVersion=Hyper-V UEFI Release v2.5;SystemProductName=Virtual Machine;OSSkuId=48;FlightContent=Branch;App=WU;OEMName_Uncleaned=Microsoft Corporation;AppVer=10.0.16184.1001;OSArchitecture=AMD64;SystemSKU=None;UpdateManagementGroup=2;IsFlightingEnabled=1;IsDeviceRetailDemo=0;TelemetryLevel=3;OSVersion=10.0.16184.1001;DeviceFamily=Windows.Desktop;
+
+
+
diff --git a/xml/GetCookie.xml b/xml/GetCookie.xml
index f8bfb1d..e8de3a5 100644
--- a/xml/GetCookie.xml
+++ b/xml/GetCookie.xml
@@ -1,27 +1,27 @@
-
-
- http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetCookie
- urn:uuid:b9b43757-2247-4d7b-ae8f-a71ba8a22386
- https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx
-
-
- 2017-12-02T00:16:15.210Z
- 2017-12-29T06:25:43.943Z
-
-
-
-
-
-
-
-
-
-
-
-
- 2015-10-21T17:01:07.1472913Z
- 2017-12-02T00:16:15.217Z
- 1.40
-
-
+
+
+ http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetCookie
+ urn:uuid:b9b43757-2247-4d7b-ae8f-a71ba8a22386
+ https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx
+
+
+ 2017-12-02T00:16:15.210Z
+ 2017-12-29T06:25:43.943Z
+
+
+
+
+
+
+
+
+
+
+
+
+ 2015-10-21T17:01:07.1472913Z
+ 2017-12-02T00:16:15.217Z
+ 1.40
+
+
\ No newline at end of file
diff --git a/xml/WUIDRequest.xml b/xml/WUIDRequest.xml
index 724c8e7..2a1be9e 100644
--- a/xml/WUIDRequest.xml
+++ b/xml/WUIDRequest.xml
@@ -1,680 +1,680 @@
-
-
- http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/SyncUpdates
- urn:uuid:175df68c-4b91-41ee-b70b-f2208c65438e
- https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx
-
-
- 2017-08-05T02:03:05.038Z
- 2017-08-05T02:08:05.038Z
-
-
-
- dAA9AEUAdwBBAHcAQQBzAE4AMwBCAEEAQQBVADEAYgB5AHMAZQBtAGIAZQBEAFYAQwArADMAZgBtADcAbwBXAHkASAA3AGIAbgBnAEcAWQBtAEEAQQBMAGoAbQBqAFYAVQB2AFEAYwA0AEsAVwBFAC8AYwBDAEwANQBYAGUANABnAHYAWABkAGkAegBHAGwAZABjADEAZAAvAFcAeQAvAHgASgBQAG4AVwBRAGUAYwBtAHYAbwBjAGkAZwA5AGoAZABwAE4AawBIAG0AYQBzAHAAVABKAEwARAArAFAAYwBBAFgAbQAvAFQAcAA3AEgAagBzAEYANAA0AEgAdABsAC8AMQBtAHUAcgAwAFMAdQBtAG8AMABZAGEAdgBqAFIANwArADQAcABoAC8AcwA4ADEANgBFAFkANQBNAFIAbQBnAFIAQwA2ADMAQwBSAEoAQQBVAHYAZgBzADQAaQB2AHgAYwB5AEwAbAA2AHoAOABlAHgAMABrAFgAOQBPAHcAYQB0ADEAdQBwAFMAOAAxAEgANgA4AEEASABzAEoAegBnAFQAQQBMAG8AbgBBADIAWQBBAEEAQQBpAGcANQBJADMAUQAvAFYASABLAHcANABBAEIAcQA5AFMAcQBhADEAQgA4AGsAVQAxAGEAbwBLAEEAdQA0AHYAbABWAG4AdwBWADMAUQB6AHMATgBtAEQAaQBqAGgANQBkAEcAcgBpADgAQQBlAEUARQBWAEcAbQBXAGgASQBCAE0AUAAyAEQAVwA0ADMAZABWAGkARABUAHoAVQB0AHQARQBMAEgAaABSAGYAcgBhAGIAWgBsAHQAQQBUAEUATABmAHMARQBGAFUAYQBRAFMASgB4ADUAeQBRADgAagBaAEUAZQAyAHgANABCADMAMQB2AEIAMgBqAC8AUgBLAGEAWQAvAHEAeQB0AHoANwBUAHYAdAB3AHQAagBzADYAUQBYAEIAZQA4AHMAZwBJAG8AOQBiADUAQQBCADcAOAAxAHMANgAvAGQAUwBFAHgATgBEAEQAYQBRAHoAQQBYAFAAWABCAFkAdQBYAFEARQBzAE8AegA4AHQAcgBpAGUATQBiAEIAZQBUAFkAOQBiAG8AQgBOAE8AaQBVADcATgBSAEYAOQAzAG8AVgArAFYAQQBiAGgAcAAwAHAAUgBQAFMAZQBmAEcARwBPAHEAdwBTAGcANwA3AHMAaAA5AEoASABNAHAARABNAFMAbgBrAHEAcgAyAGYARgBpAEMAUABrAHcAVgBvAHgANgBuAG4AeABGAEQAbwBXAC8AYQAxAHQAYQBaAHcAegB5AGwATABMADEAMgB3AHUAYgBtADUAdQBtAHAAcQB5AFcAYwBLAFIAagB5AGgAMgBKAFQARgBKAFcANQBnAFgARQBJADUAcAA4ADAARwB1ADIAbgB4AEwAUgBOAHcAaQB3AHIANwBXAE0AUgBBAFYASwBGAFcATQBlAFIAegBsADkAVQBxAGcALwBwAFgALwB2AGUATAB3AFMAawAyAFMAUwBIAGYAYQBLADYAagBhAG8AWQB1AG4AUgBHAHIAOABtAGIARQBvAEgAbABGADYASgBDAGEAYQBUAEIAWABCAGMAdgB1AGUAQwBKAG8AOQA4AGgAUgBBAHIARwB3ADQAKwBQAEgAZQBUAGIATgBTAEUAWABYAHoAdgBaADYAdQBXADUARQBBAGYAZABaAG0AUwA4ADgAVgBKAGMAWgBhAEYASwA3AHgAeABnADAAdwBvAG4ANwBoADAAeABDADYAWgBCADAAYwBZAGoATAByAC8ARwBlAE8AegA5AEcANABRAFUASAA5AEUAawB5ADAAZAB5AEYALwByAGUAVQAxAEkAeQBpAGEAcABwAGgATwBQADgAUwAyAHQANABCAHIAUABaAFgAVAB2AEMAMABQADcAegBPACsAZgBHAGsAeABWAG0AKwBVAGYAWgBiAFEANQA1AHMAdwBFAD0AJgBwAD0A
-
-
-
-
-
-
-
- 2045-03-11T02:02:48Z
- {}
-
-
- false
-
- 1
- 2
- 3
- 11
- 19
- 544
- 549
- 2359974
- 2359977
- 5169044
- 8788830
- 23110993
- 23110994
- 54341900
- 54343656
- 59830006
- 59830007
- 59830008
- 60484010
- 62450018
- 62450019
- 62450020
- 66027979
- 66053150
- 97657898
- 98822896
- 98959022
- 98959023
- 98959024
- 98959025
- 98959026
- 104433538
- 104900364
- 105489019
- 117765322
- 129905029
- 130040031
- 132387090
- 132393049
- 133399034
- 138537048
- 140377312
- 143747671
- 158941041
- 158941042
- 158941043
- 158941044
- 159123858
- 159130928
- 164836897
- 164847386
- 164848327
- 164852241
- 164852246
- 164852252
- 164852253
-
-
- 10
- 17
- 2359977
- 5143990
- 5169043
- 5169047
- 8806526
- 9125350
- 9154769
- 10809856
- 23110995
- 23110996
- 23110999
- 23111000
- 23111001
- 23111002
- 23111003
- 23111004
- 24513870
- 28880263
- 30077688
- 30486944
- 30526991
- 30528442
- 30530496
- 30530501
- 30530504
- 30530962
- 30535326
- 30536242
- 30539913
- 30545142
- 30545145
- 30545488
- 30546212
- 30547779
- 30548797
- 30548860
- 30549262
- 30551160
- 30551161
- 30551164
- 30553016
- 30553744
- 30554014
- 30559008
- 30559011
- 30560006
- 30560011
- 30561006
- 30563261
- 30565215
- 30578059
- 30664998
- 30677904
- 30681618
- 30682195
- 30685055
- 30702579
- 30708772
- 30709591
- 30711304
- 30715418
- 30720106
- 30720273
- 30732075
- 30866952
- 30866964
- 30870749
- 30877852
- 30878437
- 30890151
- 30892149
- 30990917
- 31049444
- 31190936
- 31196961
- 31197811
- 31198836
- 31202713
- 31203522
- 31205442
- 31205557
- 31207585
- 31208440
- 31208451
- 31209591
- 31210536
- 31211625
- 31212713
- 31213588
- 31218518
- 31219420
- 31220279
- 31220302
- 31222086
- 31227080
- 31229030
- 31238236
- 31254198
- 31258008
- 36436779
- 36437850
- 36464012
- 41916569
- 47249982
- 47283134
- 58577027
- 58578040
- 58578041
- 58628920
- 59107045
- 59125697
- 59142249
- 60466586
- 60478936
- 66450441
- 66467021
- 66479051
- 75202978
- 77436021
- 77449129
- 85159569
- 90199702
- 90212090
- 96911147
- 97110308
- 98528428
- 98665206
- 98837995
- 98842922
- 98842977
- 98846632
- 98866485
- 98874250
- 98879075
- 98904649
- 98918872
- 98945691
- 98959458
- 98984707
- 100220125
- 100238731
- 100662329
- 100795834
- 100862457
- 103124811
- 103348671
- 104369981
- 104372472
- 104385324
- 104465831
- 104465834
- 104467697
- 104473368
- 104482267
- 104505005
- 104523840
- 104550085
- 104558084
- 104659441
- 104659675
- 104664678
- 104668274
- 104671092
- 104673242
- 104674239
- 104679268
- 104686047
- 104698649
- 104751469
- 104752478
- 104755145
- 104761158
- 104762266
- 104786484
- 104853747
- 104873258
- 104983051
- 105063056
- 105116588
- 105178523
- 105318602
- 105362613
- 105364552
- 105368563
- 105369591
- 105370746
- 105373503
- 105373615
- 105376634
- 105377546
- 105378752
- 105379574
- 105381626
- 105382587
- 105425313
- 105495146
- 105862607
- 105939029
- 105995585
- 106017178
- 106129726
- 106768485
- 107825194
- 111906429
- 115121473
- 115578654
- 116630363
- 117835105
- 117850671
- 118638500
- 118662027
- 118872681
- 118873829
- 118879289
- 118889092
- 119501720
- 119551648
- 119569538
- 119640702
- 119667998
- 119674103
- 119697201
- 119706266
- 119744627
- 119773746
- 120072697
- 120144309
- 120214154
- 120357027
- 120392612
- 120399120
- 120553945
- 120783545
- 120797092
- 120881676
- 120889689
- 120999554
- 121168608
- 121268830
- 121341838
- 121729951
- 121803677
- 122165810
- 125408034
- 127293130
- 127566683
- 127762067
- 127861893
- 128571722
- 128647535
- 128698922
- 128701748
- 128771507
- 129037212
- 129079800
- 129175415
- 129317272
- 129319665
- 129365668
- 129378095
- 129424803
- 129590730
- 129603714
- 129625954
- 129692391
- 129714980
- 129721097
- 129886397
- 129968371
- 129972243
- 130009862
- 130033651
- 130040030
- 130040032
- 130040033
- 130091954
- 130100640
- 130131267
- 130131921
- 130144837
- 130171030
- 130172071
- 130197218
- 130212435
- 130291076
- 130402427
- 130405166
- 130676169
- 130698471
- 130713390
- 130785217
- 131396908
- 131455115
- 131682095
- 131689473
- 131701956
- 132142800
- 132525441
- 132765492
- 132801275
- 133399034
- 134522926
- 134524022
- 134528994
- 134532942
- 134536993
- 134538001
- 134547533
- 134549216
- 134549317
- 134550159
- 134550214
- 134550232
- 134551154
- 134551207
- 134551390
- 134553171
- 134553237
- 134554199
- 134554227
- 134555229
- 134555240
- 134556118
- 134557078
- 134560099
- 134560287
- 134562084
- 134562180
- 134563287
- 134565083
- 134566130
- 134568111
- 134624737
- 134666461
- 134672998
- 134684008
- 134916523
- 135100527
- 135219410
- 135222083
- 135306997
- 135463054
- 135779456
- 135812968
- 136097030
- 136131333
- 136146907
- 136157556
- 136320962
- 136450641
- 136466000
- 136745792
- 136761546
- 136840245
- 138160034
- 138181244
- 138210071
- 138210107
- 138232200
- 138237088
- 138277547
- 138287133
- 138306991
- 138324625
- 138341916
- 138372035
- 138372036
- 138375118
- 138378071
- 138380128
- 138380194
- 138534411
- 138618294
- 138931764
- 139536037
- 139536038
- 139536039
- 139536040
- 140367832
- 140406050
- 140421668
- 140422973
- 140423713
- 140436348
- 140483470
- 140615715
- 140802803
- 140896470
- 141189437
- 141192744
- 141382548
- 141461680
- 141624996
- 141627135
- 141659139
- 141872038
- 141993721
- 142006413
- 142045136
- 142095667
- 142227273
- 142250480
- 142518788
- 142544931
- 142546314
- 142555433
- 142653044
- 143191852
- 143258496
- 143299722
- 143331253
- 143432462
- 143632431
- 143695326
- 144219522
- 144590916
- 145410436
- 146720405
- 150810438
- 151258773
- 151315554
- 151400090
- 151429441
- 151439617
- 151453617
- 151466296
- 151511132
- 151636561
- 151823192
- 151827116
- 151850642
- 152016572
- 153111675
- 153114652
- 153123147
- 153267108
- 153389799
- 153395366
- 153718608
- 154171028
- 154315227
- 154559688
- 154978771
- 154979742
- 154985773
- 154989370
- 155044852
- 155065458
- 155578573
- 156403304
- 159085959
- 159776047
- 159816630
- 160733048
- 160733049
- 160733050
- 160733051
- 160733056
- 164824922
- 164824924
- 164824926
- 164824930
- 164831646
- 164831647
- 164831648
- 164831650
- 164835050
- 164835051
- 164835052
- 164835056
- 164835057
- 164835059
- 164836898
- 164836899
- 164836900
- 164845333
- 164845334
- 164845336
- 164845337
- 164845341
- 164845342
- 164845345
- 164845346
- 164845349
- 164845350
- 164845353
- 164845355
- 164845358
- 164845361
- 164845364
- 164847387
- 164847388
- 164847389
- 164847390
- 164848328
- 164848329
- 164848330
- 164849448
- 164849449
- 164849451
- 164849452
- 164849454
- 164849455
- 164849457
- 164849461
- 164850219
- 164850220
- 164850222
- 164850223
- 164850224
- 164850226
- 164850227
- 164850228
- 164850229
- 164850231
- 164850236
- 164850237
- 164850240
- 164850242
- 164850243
- 164852242
- 164852243
- 164852244
- 164852247
- 164852248
- 164852249
- 164852250
- 164852251
- 164852254
- 164852256
- 164852257
- 164852258
- 164852259
- 164852260
- 164852261
- 164852262
- 164853061
- 164853063
- 164853071
- 164853072
- 164853075
- 168118980
- 168118981
- 168118983
- 168118984
- 168180375
- 168180376
- 168180378
- 168180379
- 168270830
- 168270831
- 168270833
- 168270834
- 168270835
-
- false
- true
-
-
- {}
-
-
- true
- false
-
-
-
- Extended
-
-
- en-US
- en
-
-
-
- en-US
-
-
- false
- BranchReadinessLevel=CB;CurrentBranch=rs_prerelease;OEMModel=Virtual Machine;FlightRing={};AttrDataVer=21;SystemManufacturer=Microsoft Corporation;InstallLanguage=en-US;OSUILocale=en-US;InstallationType=Client;FlightingBranchName=external;FirmwareVersion=Hyper-V UEFI Release v2.5;SystemProductName=Virtual Machine;OSSkuId=48;FlightContent=Branch;App=WU;OEMName_Uncleaned=Microsoft Corporation;AppVer=10.0.16184.1001;OSArchitecture=AMD64;SystemSKU=None;UpdateManagementGroup=2;IsFlightingEnabled=1;IsDeviceRetailDemo=0;TelemetryLevel=3;OSVersion=10.0.16184.1001;DeviceFamily=Windows.Desktop;
- Interactive=1;IsSeeker=0;
-
-
-
-
-
-
+
+
+ http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/SyncUpdates
+ urn:uuid:175df68c-4b91-41ee-b70b-f2208c65438e
+ https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx
+
+
+ 2017-08-05T02:03:05.038Z
+ 2017-08-05T02:08:05.038Z
+
+
+
+ dAA9AEUAdwBBAHcAQQBzAE4AMwBCAEEAQQBVADEAYgB5AHMAZQBtAGIAZQBEAFYAQwArADMAZgBtADcAbwBXAHkASAA3AGIAbgBnAEcAWQBtAEEAQQBMAGoAbQBqAFYAVQB2AFEAYwA0AEsAVwBFAC8AYwBDAEwANQBYAGUANABnAHYAWABkAGkAegBHAGwAZABjADEAZAAvAFcAeQAvAHgASgBQAG4AVwBRAGUAYwBtAHYAbwBjAGkAZwA5AGoAZABwAE4AawBIAG0AYQBzAHAAVABKAEwARAArAFAAYwBBAFgAbQAvAFQAcAA3AEgAagBzAEYANAA0AEgAdABsAC8AMQBtAHUAcgAwAFMAdQBtAG8AMABZAGEAdgBqAFIANwArADQAcABoAC8AcwA4ADEANgBFAFkANQBNAFIAbQBnAFIAQwA2ADMAQwBSAEoAQQBVAHYAZgBzADQAaQB2AHgAYwB5AEwAbAA2AHoAOABlAHgAMABrAFgAOQBPAHcAYQB0ADEAdQBwAFMAOAAxAEgANgA4AEEASABzAEoAegBnAFQAQQBMAG8AbgBBADIAWQBBAEEAQQBpAGcANQBJADMAUQAvAFYASABLAHcANABBAEIAcQA5AFMAcQBhADEAQgA4AGsAVQAxAGEAbwBLAEEAdQA0AHYAbABWAG4AdwBWADMAUQB6AHMATgBtAEQAaQBqAGgANQBkAEcAcgBpADgAQQBlAEUARQBWAEcAbQBXAGgASQBCAE0AUAAyAEQAVwA0ADMAZABWAGkARABUAHoAVQB0AHQARQBMAEgAaABSAGYAcgBhAGIAWgBsAHQAQQBUAEUATABmAHMARQBGAFUAYQBRAFMASgB4ADUAeQBRADgAagBaAEUAZQAyAHgANABCADMAMQB2AEIAMgBqAC8AUgBLAGEAWQAvAHEAeQB0AHoANwBUAHYAdAB3AHQAagBzADYAUQBYAEIAZQA4AHMAZwBJAG8AOQBiADUAQQBCADcAOAAxAHMANgAvAGQAUwBFAHgATgBEAEQAYQBRAHoAQQBYAFAAWABCAFkAdQBYAFEARQBzAE8AegA4AHQAcgBpAGUATQBiAEIAZQBUAFkAOQBiAG8AQgBOAE8AaQBVADcATgBSAEYAOQAzAG8AVgArAFYAQQBiAGgAcAAwAHAAUgBQAFMAZQBmAEcARwBPAHEAdwBTAGcANwA3AHMAaAA5AEoASABNAHAARABNAFMAbgBrAHEAcgAyAGYARgBpAEMAUABrAHcAVgBvAHgANgBuAG4AeABGAEQAbwBXAC8AYQAxAHQAYQBaAHcAegB5AGwATABMADEAMgB3AHUAYgBtADUAdQBtAHAAcQB5AFcAYwBLAFIAagB5AGgAMgBKAFQARgBKAFcANQBnAFgARQBJADUAcAA4ADAARwB1ADIAbgB4AEwAUgBOAHcAaQB3AHIANwBXAE0AUgBBAFYASwBGAFcATQBlAFIAegBsADkAVQBxAGcALwBwAFgALwB2AGUATAB3AFMAawAyAFMAUwBIAGYAYQBLADYAagBhAG8AWQB1AG4AUgBHAHIAOABtAGIARQBvAEgAbABGADYASgBDAGEAYQBUAEIAWABCAGMAdgB1AGUAQwBKAG8AOQA4AGgAUgBBAHIARwB3ADQAKwBQAEgAZQBUAGIATgBTAEUAWABYAHoAdgBaADYAdQBXADUARQBBAGYAZABaAG0AUwA4ADgAVgBKAGMAWgBhAEYASwA3AHgAeABnADAAdwBvAG4ANwBoADAAeABDADYAWgBCADAAYwBZAGoATAByAC8ARwBlAE8AegA5AEcANABRAFUASAA5AEUAawB5ADAAZAB5AEYALwByAGUAVQAxAEkAeQBpAGEAcABwAGgATwBQADgAUwAyAHQANABCAHIAUABaAFgAVAB2AEMAMABQADcAegBPACsAZgBHAGsAeABWAG0AKwBVAGYAWgBiAFEANQA1AHMAdwBFAD0AJgBwAD0A
+
+
+
+
+
+
+
+ 2045-03-11T02:02:48Z
+ {}
+
+
+ false
+
+ 1
+ 2
+ 3
+ 11
+ 19
+ 544
+ 549
+ 2359974
+ 2359977
+ 5169044
+ 8788830
+ 23110993
+ 23110994
+ 54341900
+ 54343656
+ 59830006
+ 59830007
+ 59830008
+ 60484010
+ 62450018
+ 62450019
+ 62450020
+ 66027979
+ 66053150
+ 97657898
+ 98822896
+ 98959022
+ 98959023
+ 98959024
+ 98959025
+ 98959026
+ 104433538
+ 104900364
+ 105489019
+ 117765322
+ 129905029
+ 130040031
+ 132387090
+ 132393049
+ 133399034
+ 138537048
+ 140377312
+ 143747671
+ 158941041
+ 158941042
+ 158941043
+ 158941044
+ 159123858
+ 159130928
+ 164836897
+ 164847386
+ 164848327
+ 164852241
+ 164852246
+ 164852252
+ 164852253
+
+
+ 10
+ 17
+ 2359977
+ 5143990
+ 5169043
+ 5169047
+ 8806526
+ 9125350
+ 9154769
+ 10809856
+ 23110995
+ 23110996
+ 23110999
+ 23111000
+ 23111001
+ 23111002
+ 23111003
+ 23111004
+ 24513870
+ 28880263
+ 30077688
+ 30486944
+ 30526991
+ 30528442
+ 30530496
+ 30530501
+ 30530504
+ 30530962
+ 30535326
+ 30536242
+ 30539913
+ 30545142
+ 30545145
+ 30545488
+ 30546212
+ 30547779
+ 30548797
+ 30548860
+ 30549262
+ 30551160
+ 30551161
+ 30551164
+ 30553016
+ 30553744
+ 30554014
+ 30559008
+ 30559011
+ 30560006
+ 30560011
+ 30561006
+ 30563261
+ 30565215
+ 30578059
+ 30664998
+ 30677904
+ 30681618
+ 30682195
+ 30685055
+ 30702579
+ 30708772
+ 30709591
+ 30711304
+ 30715418
+ 30720106
+ 30720273
+ 30732075
+ 30866952
+ 30866964
+ 30870749
+ 30877852
+ 30878437
+ 30890151
+ 30892149
+ 30990917
+ 31049444
+ 31190936
+ 31196961
+ 31197811
+ 31198836
+ 31202713
+ 31203522
+ 31205442
+ 31205557
+ 31207585
+ 31208440
+ 31208451
+ 31209591
+ 31210536
+ 31211625
+ 31212713
+ 31213588
+ 31218518
+ 31219420
+ 31220279
+ 31220302
+ 31222086
+ 31227080
+ 31229030
+ 31238236
+ 31254198
+ 31258008
+ 36436779
+ 36437850
+ 36464012
+ 41916569
+ 47249982
+ 47283134
+ 58577027
+ 58578040
+ 58578041
+ 58628920
+ 59107045
+ 59125697
+ 59142249
+ 60466586
+ 60478936
+ 66450441
+ 66467021
+ 66479051
+ 75202978
+ 77436021
+ 77449129
+ 85159569
+ 90199702
+ 90212090
+ 96911147
+ 97110308
+ 98528428
+ 98665206
+ 98837995
+ 98842922
+ 98842977
+ 98846632
+ 98866485
+ 98874250
+ 98879075
+ 98904649
+ 98918872
+ 98945691
+ 98959458
+ 98984707
+ 100220125
+ 100238731
+ 100662329
+ 100795834
+ 100862457
+ 103124811
+ 103348671
+ 104369981
+ 104372472
+ 104385324
+ 104465831
+ 104465834
+ 104467697
+ 104473368
+ 104482267
+ 104505005
+ 104523840
+ 104550085
+ 104558084
+ 104659441
+ 104659675
+ 104664678
+ 104668274
+ 104671092
+ 104673242
+ 104674239
+ 104679268
+ 104686047
+ 104698649
+ 104751469
+ 104752478
+ 104755145
+ 104761158
+ 104762266
+ 104786484
+ 104853747
+ 104873258
+ 104983051
+ 105063056
+ 105116588
+ 105178523
+ 105318602
+ 105362613
+ 105364552
+ 105368563
+ 105369591
+ 105370746
+ 105373503
+ 105373615
+ 105376634
+ 105377546
+ 105378752
+ 105379574
+ 105381626
+ 105382587
+ 105425313
+ 105495146
+ 105862607
+ 105939029
+ 105995585
+ 106017178
+ 106129726
+ 106768485
+ 107825194
+ 111906429
+ 115121473
+ 115578654
+ 116630363
+ 117835105
+ 117850671
+ 118638500
+ 118662027
+ 118872681
+ 118873829
+ 118879289
+ 118889092
+ 119501720
+ 119551648
+ 119569538
+ 119640702
+ 119667998
+ 119674103
+ 119697201
+ 119706266
+ 119744627
+ 119773746
+ 120072697
+ 120144309
+ 120214154
+ 120357027
+ 120392612
+ 120399120
+ 120553945
+ 120783545
+ 120797092
+ 120881676
+ 120889689
+ 120999554
+ 121168608
+ 121268830
+ 121341838
+ 121729951
+ 121803677
+ 122165810
+ 125408034
+ 127293130
+ 127566683
+ 127762067
+ 127861893
+ 128571722
+ 128647535
+ 128698922
+ 128701748
+ 128771507
+ 129037212
+ 129079800
+ 129175415
+ 129317272
+ 129319665
+ 129365668
+ 129378095
+ 129424803
+ 129590730
+ 129603714
+ 129625954
+ 129692391
+ 129714980
+ 129721097
+ 129886397
+ 129968371
+ 129972243
+ 130009862
+ 130033651
+ 130040030
+ 130040032
+ 130040033
+ 130091954
+ 130100640
+ 130131267
+ 130131921
+ 130144837
+ 130171030
+ 130172071
+ 130197218
+ 130212435
+ 130291076
+ 130402427
+ 130405166
+ 130676169
+ 130698471
+ 130713390
+ 130785217
+ 131396908
+ 131455115
+ 131682095
+ 131689473
+ 131701956
+ 132142800
+ 132525441
+ 132765492
+ 132801275
+ 133399034
+ 134522926
+ 134524022
+ 134528994
+ 134532942
+ 134536993
+ 134538001
+ 134547533
+ 134549216
+ 134549317
+ 134550159
+ 134550214
+ 134550232
+ 134551154
+ 134551207
+ 134551390
+ 134553171
+ 134553237
+ 134554199
+ 134554227
+ 134555229
+ 134555240
+ 134556118
+ 134557078
+ 134560099
+ 134560287
+ 134562084
+ 134562180
+ 134563287
+ 134565083
+ 134566130
+ 134568111
+ 134624737
+ 134666461
+ 134672998
+ 134684008
+ 134916523
+ 135100527
+ 135219410
+ 135222083
+ 135306997
+ 135463054
+ 135779456
+ 135812968
+ 136097030
+ 136131333
+ 136146907
+ 136157556
+ 136320962
+ 136450641
+ 136466000
+ 136745792
+ 136761546
+ 136840245
+ 138160034
+ 138181244
+ 138210071
+ 138210107
+ 138232200
+ 138237088
+ 138277547
+ 138287133
+ 138306991
+ 138324625
+ 138341916
+ 138372035
+ 138372036
+ 138375118
+ 138378071
+ 138380128
+ 138380194
+ 138534411
+ 138618294
+ 138931764
+ 139536037
+ 139536038
+ 139536039
+ 139536040
+ 140367832
+ 140406050
+ 140421668
+ 140422973
+ 140423713
+ 140436348
+ 140483470
+ 140615715
+ 140802803
+ 140896470
+ 141189437
+ 141192744
+ 141382548
+ 141461680
+ 141624996
+ 141627135
+ 141659139
+ 141872038
+ 141993721
+ 142006413
+ 142045136
+ 142095667
+ 142227273
+ 142250480
+ 142518788
+ 142544931
+ 142546314
+ 142555433
+ 142653044
+ 143191852
+ 143258496
+ 143299722
+ 143331253
+ 143432462
+ 143632431
+ 143695326
+ 144219522
+ 144590916
+ 145410436
+ 146720405
+ 150810438
+ 151258773
+ 151315554
+ 151400090
+ 151429441
+ 151439617
+ 151453617
+ 151466296
+ 151511132
+ 151636561
+ 151823192
+ 151827116
+ 151850642
+ 152016572
+ 153111675
+ 153114652
+ 153123147
+ 153267108
+ 153389799
+ 153395366
+ 153718608
+ 154171028
+ 154315227
+ 154559688
+ 154978771
+ 154979742
+ 154985773
+ 154989370
+ 155044852
+ 155065458
+ 155578573
+ 156403304
+ 159085959
+ 159776047
+ 159816630
+ 160733048
+ 160733049
+ 160733050
+ 160733051
+ 160733056
+ 164824922
+ 164824924
+ 164824926
+ 164824930
+ 164831646
+ 164831647
+ 164831648
+ 164831650
+ 164835050
+ 164835051
+ 164835052
+ 164835056
+ 164835057
+ 164835059
+ 164836898
+ 164836899
+ 164836900
+ 164845333
+ 164845334
+ 164845336
+ 164845337
+ 164845341
+ 164845342
+ 164845345
+ 164845346
+ 164845349
+ 164845350
+ 164845353
+ 164845355
+ 164845358
+ 164845361
+ 164845364
+ 164847387
+ 164847388
+ 164847389
+ 164847390
+ 164848328
+ 164848329
+ 164848330
+ 164849448
+ 164849449
+ 164849451
+ 164849452
+ 164849454
+ 164849455
+ 164849457
+ 164849461
+ 164850219
+ 164850220
+ 164850222
+ 164850223
+ 164850224
+ 164850226
+ 164850227
+ 164850228
+ 164850229
+ 164850231
+ 164850236
+ 164850237
+ 164850240
+ 164850242
+ 164850243
+ 164852242
+ 164852243
+ 164852244
+ 164852247
+ 164852248
+ 164852249
+ 164852250
+ 164852251
+ 164852254
+ 164852256
+ 164852257
+ 164852258
+ 164852259
+ 164852260
+ 164852261
+ 164852262
+ 164853061
+ 164853063
+ 164853071
+ 164853072
+ 164853075
+ 168118980
+ 168118981
+ 168118983
+ 168118984
+ 168180375
+ 168180376
+ 168180378
+ 168180379
+ 168270830
+ 168270831
+ 168270833
+ 168270834
+ 168270835
+
+ false
+ true
+
+
+ {}
+
+
+ true
+ false
+
+
+
+ Extended
+
+
+ en-US
+ en
+
+
+
+ en-US
+
+
+ false
+ BranchReadinessLevel=CB;CurrentBranch=rs_prerelease;OEMModel=Virtual Machine;FlightRing={};AttrDataVer=21;SystemManufacturer=Microsoft Corporation;InstallLanguage=en-US;OSUILocale=en-US;InstallationType=Client;FlightingBranchName=external;FirmwareVersion=Hyper-V UEFI Release v2.5;SystemProductName=Virtual Machine;OSSkuId=48;FlightContent=Branch;App=WU;OEMName_Uncleaned=Microsoft Corporation;AppVer=10.0.16184.1001;OSArchitecture=AMD64;SystemSKU=None;UpdateManagementGroup=2;IsFlightingEnabled=1;IsDeviceRetailDemo=0;TelemetryLevel=3;OSVersion=10.0.16184.1001;DeviceFamily=Windows.Desktop;
+ Interactive=1;IsSeeker=0;
+
+
+
+
+
+