#!/system/bin/sh

# MagiskHide Props Config
# Copyright (c) 2018-2021 Didgeridoohan @ XDA Developers
# Licence: MIT

# ====================================================
# ==================== Root check ====================
# ====================================================

# Check for access to the Magisk internals. No access == no root
ls /data/adb>/dev/null 2>&1
if [ "$?" != 0 ]; then
	su -c props "$@" # Rerun script with root access
	exit
fi

# Startup message
echo ""
echo "Loading... Please wait."
echo ""

# =====================================================
# ================ Paths and variables ================
# =====================================================

ADBPATHPH=ADB_PLACEHOLDER
MODPATH=$ADBPATH/modules/MagiskHidePropsConf
LATEFILEPH=LATE_PLACEHOLDER
BOOTSTAGE="props"

# Development testing check
DEVTESTING=false
case "$1" in
	*t*) # Development testing
		DEVTESTING=true
	;;
esac

# Colours
if [ -f "$LATEFILE" ] && [ "$(grep "OPTIONCOLOUR=" $LATEFILE | sed 's|.*=||' | sed 's|\"||g')" == 0 ] || [ "$ANDROID_SOCKET_adbd" ]; then
	COLOURCHK="nc"
else
	COLOURCHK="$1"
fi
case "$COLOURCHK" in
	*nc*) # Don't use colours
		G=''
		R=''
		Y=''
		B=''
		V=''
		Bl=''
		C=''
		W=''
		N=''
	;;
	*)	# Use colours
		G='\e[01;32m'    # GREEN
		R='\e[01;31m'    # RED
		Y='\e[01;33m'    # YELLOW
		B='\e[01;34m'    # BLUE
		V='\e[01;35m'    # VIOLET
		Bl='\e[01;30m'   # BLACK
		C='\e[01;36m'    # CYAN
		W='\e[01;37m'    # WHITE
		N='\e[00;37;40m' # NEUTRAL
	;;
esac

# ===================================================
# ==================== Functions ====================
# ===================================================

# Load functions
. $MODPATH/common/util_functions.sh

if [ -f "$VLOGFILE" ]; then
	mv -f $VLOGFILE $VLASTLOGFILE
fi
set -x 2>$VLOGFILE

log_handler "Running props script."

# Checking for Busybox
if [ ! -f "$BBPATH" ]; then
	menu_header "${C}No Busybox found${N}"
	echo ""
	echo "The script couldn't find Magisk's Busybox."
	echo "Make sure that your installation of Magisk"
	echo "is functioning properly and try again."
	echo ""
	echo "If you can't find anything wrong, please"
	echo "check the module documentation on how to"
	echo "ask for support and please provide"
	echo "logs (see the module documentation)."
	echo ""
	log_handler "No Busybox found."
	log_handler "Exiting... Bye bye.\n\n===================="
	exit 0
fi

# Check settings file
module_v_ctrl
if [ "$(get_file_value $MODPATH/module.prop "settingsVersion=")" != "$SCRIPTV" ]; then
	log_handler "Settings version mismatch ($SCRIPTCTRL vs $SCRIPTV)."
	menu_header "${C}Settings version mismatch${N}"
	echo ""
	echo "The settings file in use does not match"
	echo "the module version."
	echo ""
	echo -e "${C}Settings and props will be cleared.${N}"
	echo ""
	echo "Any props that were set previously will"
	echo "still be loaded into memory, but need"
	echo "to be set up again before a reboot."
	echo ""
	echo -n "Press enter to continue..."
	read -r INPUTTMP
	reset_fn "Settings version mismatch" "mismatch" "noreboot"
fi

# Check MagiskHide status
if [ "$(magisk -V)" -ge 23010 ]; then
	MHTEMP=$(magisk --denylist status) >> $LOGFILE 2>&1
	MHLST=$(magisk --denylist ls)
	for ITEM in $MHLST; do
		echo $ITEM >> $LOGFILE 2>&1
	done
else
	MHTEMP=$(magiskhide status) >> $LOGFILE 2>&1
fi

blank_input() {
	# Find menu level
	case $1 in
		1)	INPUT=""
		;;
		2)	INPUT2=""
		;;
		3)	INPUT3=""
		;;
		4)	INPUT4=""
		;;
		5)	INPUT5=""
		;;
		6)	INPUT6=""
		;;
	esac

	echo ""
	echo -e "${R}Don't enter an empty value${N}."
	echo "Try again."
	sleep 2
}

active_option() {
	echo ""
	echo -e "${R}That's already the active option.${N}"
	sleep 2
}

invalid_input() {
	INPMSG=""

	# Set the message text
	case $1 in
		1) INPMSG="Only pick from the options above, one at a time."
		;;
		2) INPMSG="Only enter '${G}y${N}' or '${G}n${N}'."
		;;
		3) INPMSG="Only enter '${G}y${N}', '${G}n${N}' or '${G}e${N}'."
		;;
		4) INPMSG="Only enter '${G}y${N}', '${G}n${N}', '${G}r${N}' or '${G}e${N}'."
		;;
		5) INPMSG="Only enter '${G}d${N}', '${G}y${N}', '${G}n${N}' or '${G}e${N}'."
		;;
		6) INPMSG="Enter a fingerprint or pick from the options, one at a time."
		;;
		7) INPMSG="Only pick numbers, separated by a comma."
		;;
		8) INPMSG="Only enter numbers, or an option from above."
		;;
	esac

	# Find menu level
	case $2 in
		1) INPUT=""
		;;
		2) INPUT2=""
		;;
		3) INPUT3=""
		;;
		4) INPUT4=""
		;;
		5) INPUT5=""
		;;
		6) INPUT6=""
		;;
		7) INPUT7=""
		;;
	esac

	echo ""
	echo -e "${R}Invalid input${N}. $INPMSG"
	sleep 2
}

exit_fn() {
	menu_header "${C}Bye bye.${N}"
	echo ""
	log_handler "Exiting... Bye bye.\n\n===================="
	exit 0
}

# ======================== Device's fingerprint ========================
# Second menu level - fingerprint, $1=header, $2=Current fingerprint, $3=Original fingerprint, $4=Module set fingerprint
menu_change_fingerprint() {
	rm -f $CSTMFILE
	if [ "$DEVPRINTS" == "true" ]; then
		INPUT2=f
	else
		INPUT2=""
	fi
	while true
	do
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Edit the device fingerprint to"
			echo "pass SafetyNet's CTS profile."
			echo
			if [ "$FINGERPRINTENB" == 0 ]; then
				echo "Fingerprint modification currently"
				echo "disabled because of a conflicting"
				echo "module (see the logs for details)."
				echo ""
				echo "Nothing to do... Returning to main menu."
				sleep 3
				INPUT=""
				break
			else
				if [ "$4" ] && [ "$PRINTEDIT" == 1 ]; then
					PRINTMODULETXT=" (by this module)"
				else
					PRINTMODULETXT=""
				fi
				if [ "$PRINTSTAGE" == 0 ]; then
					PRINTSTAGETXT="default"
				elif [ "$PRINTSTAGE" == 1 ]; then
					PRINTSTAGETXT="post-fs-data"
				elif [ "$PRINTSTAGE" == 2 ]; then
					PRINTSTAGETXT="late_start service"
				fi
				if [ "$PATCHSTAGE" == 0 ]; then
					PATCHSTAGETXT="default"
				elif [ "$PATCHSTAGE" == 1 ]; then
					PATCHSTAGETXT="post-fs-data"
				elif [ "$PATCHSTAGE" == 2 ]; then
					PATCHSTAGETXT="late_start service"
				fi
				if [ "$2" ]; then
					echo -e "Currently set to${PRINTMODULETXT}:"
					echo ""
					if [ "$PRINTMODULETXT" ]; then
						get_device_used "$2"
					fi
					echo -e ${C}$2${N}
					if [ "$2" != "$3" ]; then
						echo ""
						echo "The original value is:"
						echo -e ${C}$3${N}
					fi
				else
					echo "ro.build.fingerprint doesn't seem to"
					echo "currently exist on your system."
				fi
				echo ""
				echo "Enter the new fingerprint or"
				echo "pick from the options below."
				echo ""
				if [ "$(magisk -V)" -ge 23010 ]; then
					$(magisk --denylist status)
				else
					$(magiskhide status)
				fi
				echo ""
				echo -e "${G}f${N} - Pick a certified fingerprint"
				if [ "$PRINTMODULETXT" ]; then
					echo -e "${G}r${N} - Reset fingerprint"
				fi
				if [ "$ORIGVENDPRINT" ]; then
					if [ "$PRINTVEND" == 1 ]; then
						VENDTXT="${G} (active)${N}"
					else
						VENDTXT=""
					fi
					echo -e "${G}v${N} - Use vendor fingerprint (for Treble GSI ROMs)${VENDTXT}"
				fi
				if [ "$OPTIONWEBP" == 0 ]; then
					echo -e "${G}u${N} - Update fingerprints list (v$(get_file_value $PRINTSLOC "PRINTSV="))"
				fi
				echo -e "${G}s${N} - Boot stages (${C}${PRINTSTAGETXT}/${PATCHSTAGETXT}${N})."
				echo -e "${G}b${N} - Go back."
				echo -e "${G}e${N} - Exit"
				echo ""
				if [ "$PRINTCHK" == 1 ]; then
					echo -e "${R}The device fingerprint has been updated.${N}"
					echo -e "${R}Please reboot to apply.${N}"
					echo ""
				fi
				echo "See the module readme or the"
				echo "support thread @ XDA for details."
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT2
			fi
		fi
		case "$INPUT2" in
			f|F)	menu_pick_print "$1"
			;;
			r|R)
				if [ "$PRINTMODULETXT" ]; then
					menu_reset_print "Reset fingerprint"
				else
					menu_new_print "$1" "$INPUT2" 2
				fi
			;;
			v|V)
				if [ "$ORIGVENDPRINT" ]; then
					menu_vendor_print "$1"
				else
					invalid_input 6 2
				fi
			;;
			u|U)
				if [ "$OPTIONWEBP" == 0 ]; then
					menu_update_print "Update fingerprints list"
				else
					menu_new_print "$1" "$INPUT2" 2
				fi
			;;
			s|S) menu_bootstage_print "$1"
			;;
			b|B)
				INPUT=""
				break
			;;
			e|E) exit_fn
			;;
			""|[[:blank:]]*)	blank_input 2
			;;
			*)
				if [ "${#INPUT2}" -lt 10 ]; then
					invalid_input 6 2
				else
					menu_new_print "$1" "$INPUT2" 2
				fi
			;;
		esac
	done
}

# Third menu level - pick fingerprint, $1=header
menu_pick_print() {
	DEVPRINTS="" # Disable automatically entering the fingerprints list after the first time.
	INPUT3=""
	OEMLIST=""
	HEADERPRINTV="${C}$1${N}\n List version - v$(get_file_value $PRINTSLOC "PRINTSV=")\n Select an option below."
	while true
	do
		if [ -z "$INPUT3" ]; then
			# Load the list of fingerprint files
			log_handler "Loading fingerprints list v$(get_file_value $PRINTSLOC "PRINTSV=")."
			OEMLIST="$(ls $PRINTFILES | sed 's|\.sh||g')"
			if [ "$OEMLIST" ]; then
				# Check for custom fingerprints list
				if [ -s "$CSTMPRINTS" ] && [ ! -f "$CSTMFILE" ]; then
					log_handler "Found custom fingerprints list."
					format_file $CSTMPRINTS
					log_handler "Creating custom prints file."
					cat $CSTMPRINTS >> $LOGFILE 2>&1 && echo "" >> $LOGFILE 2>&1
					echo -e "PRINTSLIST=\"" >> $CSTMFILE
					cat $CSTMPRINTS >> $CSTMFILE
					echo -e "\"" >> $CSTMFILE
					# Reload the list with new files
					OEMLIST="$(ls $PRINTFILES | sed 's|\.sh||g')"
				fi
				ITEMCOUNT=1
				menu_header "$HEADERPRINTV"
				echo ""
				# Display currently set print when fingerprints testing
				if [ "$(get_file_value $PRINTSLOC "PRINTSV=")" == "Dev" ]; then
					TMPDEVPRINT="$(getprop ro.build.fingerprint)"
					echo "Currently set to:"
					get_device_used $TMPDEVPRINT
					echo -e "${C}$TMPDEVPRINT${N}"
					echo ""
				fi
				for ITEM in $OEMLIST; do
					echo -e "${G}$ITEMCOUNT${N} - $ITEM"
					ITEMCOUNT=$(($ITEMCOUNT+1))
				done
				echo -e "${G}b${N} - Go back"
				echo -e "${G}e${N} - Exit"
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT3
			else
				log_handler "No fingerprints list."
				collect_logs "issue"
				menu_header "${C}$1${N}\n Something's wrong!"
				echo "Hm... That's not right."
				echo ""
				echo "There is currently no fingerprints list"
				echo "available. Try updating it manually."
				echo ""
				echo "If the issue persists, report it in the"
				echo -e "support thread @ XDA, ${R}with logs!${C}"
				echo ""
				echo "Logs have automatically been saved to"
				echo -e "your internal storage ${R}(propslogs.tar.gz)${C}."
				echo ""
				echo -n "Press enter to continue..."
				read -r INPUTTMP
				INPUT2=""
				break
			fi
		fi
		case "$INPUT3" in
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUT3" -ge 1 -a "$INPUT3" -lt "$ITEMCOUNT" ]; then
					ITEMCOUNT=1
					for ITEM in $OEMLIST; do
						if [ "$ITEMCOUNT" == "$INPUT3" ]; then
							menu_pick_print_sub "$HEADERPRINTV" "$ITEM"
							break
						fi
						ITEMCOUNT=$(($ITEMCOUNT+1))
					done
				else
					invalid_input 1 3
				fi
			;;
		esac
	done
}

# Fourth menu level - pick fingerprint, $1=header, $2=OEM
menu_pick_print_sub() {
	# Loading fingerprints
	TMPFILE=$PRINTFILES/$2.sh
	if [ -f "$TMPFILE" ]; then
		. $TMPFILE
		INPUT4=""
	else
		menu_header "$1"
		log_handler "Can't find '$TMPFILE'."
		collect_logs "issue"
		echo "Oh no! Something went wrong..."
		echo ""
		echo "Can't find the fingerprints file."
		echo "Try updating it manually."
		echo ""
		echo "If the issue persists, report it in the"
		echo -e "support thread @ XDA, ${R}with logs!${C}"
		echo ""
		echo "Logs have automatically been saved to"
		echo -e "your internal storage ${R}(propslogs.tar.gz)${C}."
		echo ""
		echo -n "Press enter to continue..."
		read -r INPUTTMP
		INPUT4="b"
	fi
	while true
	do
		if [ -z "$INPUT4" ]; then
			ITEMCOUNT=1
			menu_header "$1"
			echo ""
			# Display currently set print when fingerprints testing
			if [ "$(get_file_value $PRINTSLOC "PRINTSV=")" == "Dev" ]; then
				TMPDEVPRINT="$(getprop ro.build.fingerprint)"
				echo "Currently set to:"
				get_device_used $TMPDEVPRINT
				echo -e "${C}$TMPDEVPRINT${N}"
				echo ""
			fi
			SAVEIFS=$IFS
			IFS=$(echo -en "\n\b")
			for ITEM in $PRINTSLIST; do
				if [ "$(get_first $ITEM)" == "$2" ] || [ "$2" == "Custom" ]; then
					echo -e "${G}$ITEMCOUNT${N} - $(get_device "$ITEM")"
					ITEMCOUNT=$(($ITEMCOUNT+1))
				fi
			done
			IFS=$SAVEIFS
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT4
		fi
		case "$INPUT4" in
			b|B)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUT4" -ge 1 -a "$INPUT4" -lt "$ITEMCOUNT" ]; then
					ITEMCOUNT=1
					SAVEIFS=$IFS
					IFS=$(echo -en "\n\b")
					for ITEM in $PRINTSLIST; do
						if [ "$ITEMCOUNT" == "$INPUT4" ]; then
							case "$ITEM" in
								*\;*)
									IFS=$SAVEIFS
									menu_pick_print_version "$1" "$(get_device "$ITEM")" "$(get_eq_right "$ITEM")"
									INPUT2=""
									INPUT3=""
									break
								;;
								*)
									IFS=$SAVEIFS
									menu_new_print "$1" "$(get_eq_right "$ITEM")"
									INPUT2=""
									INPUT3=""
									break
								;;
							esac
						fi
						ITEMCOUNT=$(($ITEMCOUNT+1))
					done
					IFS=$SAVEIFS
				else
					invalid_input 1 4
				fi
			;;
		esac
	done
}

# Fifth menu level - pick Android version, $1=header, $2=Device, $3=fingerprint string (without device info)
menu_pick_print_version() {
	INPUT5=""
	ANDROIDV="$(get_print_versions "$2")"
	while true
	do
		if [ -z "$INPUT5" ]; then
			ITEMCOUNT=1
			menu_header "$1"
			echo ""
			echo "There are several fingerprints available"
			echo "for this device, for different versions"
			echo "of Android. Pick one."
			echo ""
			echo -e "${C}$(echo "$2" | sed 's| (.*||')${N}"
			echo ""
			for ITEM in $ANDROIDV; do
				echo -e "${G}$ITEMCOUNT${N} - Android version ${C}$ITEM${N}"
				ITEMCOUNT=$(($ITEMCOUNT+1))
			done
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT5
		fi
		case "$INPUT5" in
			b|B)
				INPUT4=""
				break
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUT5" -ge 1 -a "$INPUT5" -lt "$ITEMCOUNT" ]; then
					ITEMCOUNT=1
					for ITEM in $ANDROIDV; do
						if [ "$ITEMCOUNT" == "$INPUT5" ]; then
							TMPPRINT="$(echo $3 | cut -f $ITEMCOUNT -d ';')"
							menu_new_print "$1" "$TMPPRINT"
							INPUT2=""
							INPUT3=""
							INPUT4=""
							break
						fi
						ITEMCOUNT=$(($ITEMCOUNT+1))
					done
				else
					invalid_input 1 5
				fi
			;;
		esac
	done
}

# Sixth menu level - confirm fingerprint, $1=header, $2=fingerprint
menu_new_print() {
	# Check if fingerprints testing is active
	if [ "$(get_file_value $PRINTSLOC "PRINTSV=")" == "Dev" ]; then
		DEVCHK=true
		INPUT6=y
	else
		DEVCHK=false
		INPUT6=""
	fi
	while true
	do
		if [ -z "$INPUT6" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "You are about to use the following as your device's fingerprint."
			echo ""
			get_device_used "$2"
			echo -e "${V}$(get_print_display $2)${N}"
			echo ""
			echo "Make sure that it is correct before continuing."
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT6
		fi
		case "$INPUT6" in
			y|Y)
				change_print "$1" "$2"
				if [ "$DEVCHK" == "true" ]; then
					force_reboot
				fi
				INPUT2=""
				INPUT3=""
				INPUT4=""
				INPUT5=""
				break
			;;
			n|N)
				INPUT2=""
				INPUT3=""
				INPUT4=""
				INPUT5=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 6
			;;
		esac
	done
}

# Third menu level - Reset fingerprint, $1=header
menu_reset_print() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will reset the device"
			echo "fingerprint to the default value."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				reset_print "$1"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Vendor fingerprint, $1=header
menu_vendor_print() {
	INPUT3=""
	while true
	do
		if [ "$PRINTVEND" == 0 ]; then
			STATETXT="${G}enable${N}"
			CURRTXT="${R}disabled${N}"
			TMPVAL=1
		else
			STATETXT="${R}disable${N}"
			CURRTXT="${G}enabled${N}"
			TMPVAL=0
		fi
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo -e "This will $STATETXT using the vendor"
			echo "fingerprint for Treble GSI ROMs."
			echo ""
			echo -e "The option is currently $CURRTXT."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				change_print_vendor "$1" "$TMPVAL"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Update fingerprints listj, $1=header
menu_update_print() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}\n List version - v$(get_file_value $PRINTSLOC "PRINTSV=")"
			echo ""
			echo "Do you want to check online if there"
			echo "is an update to the fingerprints list?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				download_prints "manual"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Boot stage, $1=header
menu_bootstage_print() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			if [ "$PRINTSTAGE" == 0 ]; then
				PRINTSTAGETXT=" ${C}(default)${N}"
			elif [ "$PRINTSTAGE" == 1 ]; then
				PRINTSTAGETXT=" ${C}(post-fs-data)${N}"
			elif [ "$PRINTSTAGE" == 2 ]; then
				PRINTSTAGETXT=" ${C}(late_start service)${N}"
			fi
			if [ "$PATCHSTAGE" == 0 ]; then
				PATCHSTAGETXT=" ${C}(default)${N}"
			elif [ "$PATCHSTAGE" == 1 ]; then
				PATCHSTAGETXT=" ${C}(post-fs-data)${N}"
			elif [ "$PATCHSTAGE" == 2 ]; then
				PATCHSTAGETXT=" ${C}(late_start service)${N}"
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Change boot stage for the device fingerprint"
			echo "or security patch date props."
			echo ""
			echo "Pick an option below."
			echo ""
			echo -e "${G}1${N} - Device fingerprint$PRINTSTAGETXT."
			echo -e "${G}2${N} - Security patch date$PATCHSTAGETXT."
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT3
		fi
		case "$INPUT3" in
			1)
				menu_bootstage_print_set "$1" "print"
				INPUT2=""
				break
			;;
			2)
				menu_bootstage_print_set "$1" "patch"
				INPUT2=""
				break
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 3
			;;
		esac
	done
}

# Fourth menu level - Set boot stage, $1=header, $2=type (print or patch)
menu_bootstage_print_set() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			if [ "$2" == "print" ]; then
				PROPTXT="fingerprint"
				TMPSTAGE=$PRINTSTAGE
				CHNGSTAGE="PRINTSTAGE"
			elif [ "$2" == "patch" ]; then
				PROPTXT="security patch date"
				TMPSTAGE=$PATCHSTAGE
				CHNGSTAGE="PATCHSTAGE"
			fi
			if [ "$TMPSTAGE" == 0 ]; then
				CURRTXT="default"
				TMPTXT="${C}post-fs-data${N} or ${C}late_start sevice${N}"
				CHOICETXT="${G}p${N}(ost), ${G}l${N}(ate)"
			elif [ "$TMPSTAGE" == 1 ]; then
				CURRTXT="post-fs-data"
				TMPTXT="${C}default${N} or ${C}late_start service${N}"
				CHOICETXT="${G}d${N}(efault), ${G}l${N}(ate)"
			elif [ "$TMPSTAGE" == 2 ]; then
				CURRTXT="late_start service"
				TMPTXT="${C}default${N} or ${C}post-fs-data${N}"
				CHOICETXT="${G}d${N}(efault), ${G}p${N}(post)"
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Current boot stage for $PROPTXT is"
			echo -e "${C}$CURRTXT${N}."
			echo ""
			echo "Do you want to change it to"
			echo -e "$TMPTXT?"
			echo ""
			if [ "$PRINTSTAGE" == 2 ] && [ "$PRINTSOFTBOOT" == 0 ] || [ "$PATCHSTAGE" == 2 ] && [ "$PATCHSOFTBOOT" == 0 ]; then
				echo -e "Since you have the ${C}late_start service${N}"
				echo -e "boot stage set, you can also ${G}enable${N} a"
				echo "soft reboot at the end of the boot process."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			elif [ "$PRINTSTAGE" == 2 ] && [ "$PRINTSOFTBOOT" == 1 ] || [ "$PATCHSTAGE" == 2 ] && [ "$PATCHSOFTBOOT" == 1 ]; then
				echo -e "Soft reboot at the end of the ${C}late_start${N}"
				echo -e "${C}service${N} boot stage is ${G}enabled${N} and can be"
				echo -e "${R}disabled${N}."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			fi
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter $CHOICETXT, ${G}b${N}(ack) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			r|R)
				menu_softboot_print "Soft reboot" "$2"
				INPUT3=""
				break
			;;
			d|D)
				if [ "$TMPSTAGE" != 0 ]; then
					before_change
					OPTNEW=0
					log_handler "Boot stage for $PROPTXT changed to default."
					replace_fn $CHNGSTAGE $TMPSTAGE $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT3=""
					after_change "$1"
					break
				else
					invalid_input 1 4
				fi
			;;
			p|P)
				if [ "$TMPSTAGE" != 1 ]; then
					before_change
					OPTNEW=1
					log_handler "Boot stage for $PROPTXT changed to post-fs-data."
					replace_fn $CHNGSTAGE $TMPSTAGE $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT3=""
					after_change "$1"
					break
				else
					invalid_input 1 4
				fi
			;;
			l|L)
				if [ "$TMPSTAGE" != 2 ]; then
					before_change
					OPTNEW=2
					log_handler "Boot stage for $PROPTXT changed to late_start service."
					replace_fn $CHNGSTAGE $TMPSTAGE $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT3=""
					after_change "$1"
					break
				else
					invalid_input 1 4
				fi
			;;
			b|B)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 4
			;;
		esac
	done
}

# Fifth menu level - Fingerprint soft reboot, $1=header, $2=type
menu_softboot_print() {
	INPUT5=""
	while true
	do
		if [ -z "$INPUT5" ]; then
			if [ "$2" == "print" ]; then
				TYPETXT="device fingerprint"
				TYPEPROP="PRINTSOFTBOOT"
			elif [ "$2" == "patch" ]; then
				TYPETXT="security patch"
				TYPEPROP="PATCHSOFTBOOT"
			fi
			if [ "$2" == "print" ] && [ "$PRINTSOFTBOOT" == "1" ] || [ "$2" == "patch" ] && [ "$PATCHSOFTBOOT" == "1" ]; then
				CURRTXT="${G}enabled${N}"
				TMPTXT="${R}disable${N}"
				LOGTXT="disabled"
				OPTCURR=1
				OPTNEW=0
			else
				CURRTXT="${R}disabled${N}"
				TMPTXT="${R}enable${N}"
				LOGTXT="enabled"
				OPTCURR=0
				OPTNEW=1
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Soft reboot for setting $TYPETXT"
			echo "in the late_start service boot stage"
			echo -e "is currently ${CURRTXT}."
			echo ""
			echo -e "Do you want to ${C}${TMPTXT}${N} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT5
		fi
		case "$INPUT5" in
			y|Y)
				before_change
				log_handler "The $TYPETXT soft reboot was ${LOGTXT}."
				# Saves new module value
				replace_fn $TYPEPROP $OPTCURR $OPTNEW $LATEFILE
				# Load module values
				. $LATEFILE
				INPUT4=""
				after_change "$1"
				break
			;;
			n|N)
				INPUT4=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 5
			;;
		esac
	done
}

# ======================== Force BASIC key attestation ========================
# Second menu level - BASIC attestation, $1=header
menu_force_basic() {
	INPUT2=""
	while true
	do
		if [ "$BASICATTEST" == 0 ]; then
			fn_oem_file # Find the OEM print file used
			STATETXT="${G}enable${N}"
			if [ "$BASICATTMODEL" ]; then
				YTXT=", use default value (${C}$BASICATTMODEL${N})"
			else
				YTXT=", use default value (${C}$(getprop ro.product.device)${N})"
			fi
			YDTXT="Yes, p"
		else
			STATETXT="${R}disable${N}"
			YTXT=""
			YDTXT="P"
		fi
		if [ "$BASICATTCUST" ]; then
			CUSTTXT=" (${G}active${N})"
		else
			CUSTTXT=""
		fi
		if [ "$BASICATTLIST" ]; then
			LISTTXT=" (${G}active${N})"
		else
			LISTTXT=""
		fi
		fn_oem_file
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Edit device model to change"
			echo "bootloader state check from"
			echo "hardware based to basic."
			echo ""
			echo -e "Do you want to $STATETXT"
			echo "forced BASIC key attestation?"
			echo ""
			echo "The currently loaded value is:"
			echo -e "${C}$CURRMODEL${N}"
			if [ "$BASICATTEST" == 1 ] && [ "$ORIGMODEL" != "$CURRMODEL" ] && [ "$CURRMODEL" == "$BASICATTMODEL" -o "$CURRMODEL" == "$BASICATTCUST" -o "$CURRMODEL" == "$BASICATTLIST" ]; then
				echo "(Set by this module.)"
			fi
			echo ""
			echo -e "${G}y${N} - Yes$YTXT"
			echo -e "${G}d${N} - ${YDTXT}ick value from device list$LISTTXT"
			echo -e "${G}c${N} - Set a custom value$CUSTTXT"
			echo -e "${G}n${N} - No"
			if [ "$BASICATTCUST" ] || [ "$BASICATTLIST" ]; then
				echo -e "${G}r${N} - Reset"
			fi
			echo -e "${G}e${N} - Exit"
			echo ""
			if [ "$BASICATTEST" == 0 ]; then
				echo "This may disable some device"
				echo "specific features, like the"
				echo "Samsung Galaxy Store. YMMV."
				echo ""
			fi
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT2
		fi
		case "$INPUT2" in
			y|Y)
				forced_basic "$1"
				INPUT=""
			;;
			n|N)
				INPUT=""
				break
			;;
			d|D)
				forced_list_menu "$1"
				INPUT=""
			;;
			c|C)
				forced_custom_menu "$1"
				INPUT=""
			;;
			r|R)
				if [ "$BASICATTCUST" ] || [ "$BASICATTLIST" ]; then
					forced_reset_menu "$1"
					INPUT=""
					break
				else
					invalid_input 1 2
				fi
			;;
			e|E) exit_fn
			;;
			*) invalid_input 1 2
			;;
		esac
	done
}

# Third menu level - Pick from list, $1=header
forced_list_menu() {
	INPUT3=""
	OEMLIST=""
	HEADERPRINTV="${C}$1${N}\n List version - v$(get_file_value $PRINTSLOC "PRINTSV=")\n Select an option below."
	while true
	do
		if [ -z "$INPUT3" ]; then
			# Load the list of fingerprint files
			log_handler "Loading fingerprints list v$(get_file_value $PRINTSLOC "PRINTSV=")."
			OEMLIST="$(ls $PRINTFILES | sed 's|\.sh||g')"
			if [ "$OEMLIST" ]; then
				ITEMCOUNT=1
				menu_header "$HEADERPRINTV"
				echo ""
				for ITEM in $OEMLIST; do
					echo -e "${G}$ITEMCOUNT${N} - $ITEM"
					ITEMCOUNT=$(($ITEMCOUNT+1))
				done
				echo ""
				if [ "$BASICATTLIST" ]; then
					echo "The currently set list value is:"
					echo -e "${C}$BASICATTLIST${N}"
					echo ""
					echo -e "${G}r${N} - Reset list value"
				else
					echo "Currently the default/custom"
					echo "values are being used."
					echo ""
				fi
				echo -e "${G}b${N} - Go back"
				echo -e "${G}e${N} - Exit"
				echo ""
				echo "Do NOT use your actual device."
				echo "Pick a device as close to yours"
				echo "as you can, to possibly keep"
				echo "device specific features working."
				echo ""
				echo "See the module readme or the"
				echo "support thread @ XDA for details."
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT3
			else
				log_handler "No fingerprints list."
				collect_logs "issue"
				menu_header "${C}$1${N}\n Something's wrong!"
				echo "Hm... That's not right."
				echo ""
				echo "There is currently no fingerprints list"
				echo "available. Try updating it manually."
				echo ""
				echo "If the issue persists, report it in the"
				echo -e "support thread @ XDA, ${R}with logs!${C}"
				echo ""
				echo "Logs have automatically been saved to"
				echo -e "your internal storage ${R}(propslogs.tar.gz)${C}."
				echo ""
				echo -n "Press enter to continue..."
				read -r INPUTTMP
				INPUT2=""
				break
			fi
		fi
		case "$INPUT3" in
			r|R)
				if [ "$BASICATTLIST" ]; then
					forced_list_reset_menu "$1"
					INPUT2=""
					break
				else
					invalid_input 1 3
				fi
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUT3" -ge 1 -a "$INPUT3" -lt "$ITEMCOUNT" ]; then
					ITEMCOUNT=1
					for ITEM in $OEMLIST; do
						if [ "$ITEMCOUNT" == "$INPUT3" ]; then
							forced_list_pick_menu "$HEADERPRINTV" "$ITEM"
							break
						fi
						ITEMCOUNT=$(($ITEMCOUNT+1))
					done
				else
					invalid_input 1 3
				fi
			;;
		esac
	done
}

# Fourth menu level - reset list value, $1=header
forced_list_reset_menu() {
	INPUT4=""
	fn_oem_file # Find the OEM print file used
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Are you sure you want to reset"
			echo "the list value for forced BASIC"
			echo "key attestation to the default"
			if [ "$BASICATTMODEL" ]; then
				echo -e "value (${C}$BASICATTMODEL${N})?"
			else
				echo -e "value (${C}$(getprop ro.product.device)${N})?"
			fi
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				forced_reset "$1" 1
				INPUT2=""
				INPUT3=""
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*) invalid_input 3 4
			;;
		esac
	done
}

# Fourth menu level - pick from list, $1=header, $2=OEM
forced_list_pick_menu() {
	# Loading fingerprints
	TMPFILE=$PRINTFILES/$2.sh
	if [ -f "$TMPFILE" ]; then
		. $TMPFILE
		INPUT4=""
	else
		menu_header "$1"
		log_handler "Can't find '$TMPFILE'."
		collect_logs "issue"
		echo "Oh no! Something went wrong..."
		echo ""
		echo "Can't find the fingerprints file."
		echo "Try updating it manually."
		echo ""
		echo "If the issue persists, report it in the"
		echo -e "support thread @ XDA, ${R}with logs!${C}"
		echo ""
		echo "Logs have automatically been saved to"
		echo -e "your internal storage ${R}(propslogs.tar.gz)${C}."
		echo ""
		echo -n "Press enter to continue..."
		read -r INPUTTMP
		INPUT4="b"
	fi
	while true
	do
		if [ -z "$INPUT4" ]; then
			ITEMCOUNT=1
			menu_header "$1"
			echo ""
			SAVEIFS=$IFS
			IFS=$(echo -en "\n\b")
			for ITEM in $PRINTSLIST; do
				if [ "$(get_first $ITEM)" == "$2" ]; then
					echo -e "${G}$ITEMCOUNT${N} - $(get_device "$ITEM" | sed "s| (.*)||")"
					ITEMCOUNT=$(($ITEMCOUNT+1))
				fi
			done
			IFS=$SAVEIFS
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT4
		fi
		case "$INPUT4" in
			b|B)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUT4" -ge 1 -a "$INPUT4" -lt "$ITEMCOUNT" ]; then
					ITEMCOUNT=1
					SAVEIFS=$IFS
					IFS=$(echo -en "\n\b")
					for ITEM in $PRINTSLIST; do
						if [ "$ITEMCOUNT" == "$INPUT4" ]; then
							IFS=$SAVEIFS
							forced_list_confirm_menu "$1" "$(get_eq_left "$ITEM" | sed "s|^.*\:||")"
							INPUT2=""
							INPUT3=""
							break
						fi
						ITEMCOUNT=$(($ITEMCOUNT+1))
					done
					IFS=$SAVEIFS
				else
					invalid_input 1 4
				fi
			;;
		esac
	done
}

# Fifth menu level - confirm list value, $1=header, $2=device info
forced_list_confirm_menu() {
	INPUT5=""
	while true
	do
		if [ -z "$INPUT5" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Do you want to use the following"
			echo "as the value for the module props?"
			echo ""
			echo -e "${C}$2${N}"
			echo ""
			if [ "$BASICATTLIST" ]; then
				echo "The currently set list value is:"
				echo -e "${C}$BASICATTLIST${N}"
			else
				echo "Currently the default/custom"
				echo "values are being used."
			fi
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT5
		fi
		case "$INPUT5" in
			y|Y)
				forced_list_confirm "$1" "$2"
				INPUT2=""
				INPUT3=""
				INPUT4=""
				break
			;;
			n|N)
				INPUT4=""
				break
			;;
			e|E) exit_fn
			;;
			*) invalid_input 3 5
			;;
		esac
	done
}

# Third menu level - set custom value, $1=header
forced_custom_menu() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Enter the value you want the"
			echo "module props to have, or pick"
			echo "an option below."
			echo ""
			if [ "$BASICATTCUST" ]; then
				echo "The currently set custom value is:"
				echo -e "${C}$BASICATTCUST${N}"
				echo ""
				echo -e "${G}r${N} - Reset custom value"
			else
				echo "Currently the default/list"
				echo "values are being used."
				echo ""
			fi
			echo -e "${G}b${N} - Back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT3
		fi
		case "$INPUT3" in
			r|R)
				if [ "$BASICATTCUST" ]; then
					forced_custom_reset_menu "$1"
					INPUT2=""
					break
				else
					invalid_input 1 3
				fi
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*) forced_custom_confirm_menu "$1" "$INPUT3"
			;;
		esac
	done
}

# Fourth menu level - reset custom value, $1=header
forced_custom_reset_menu() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Are you sure you want to reset"
			echo "the custom value for forced BASIC"
			echo "key attestation to the default"
			if [ "$BASICATTMODEL" ]; then
				echo -e "value (${C}$BASICATTMODEL${N})?"
			else
				echo -e "value (${C}$(getprop ro.product.device)${N})?"
			fi
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				forced_reset "$1" 2
				INPUT2=""
				INPUT3=""
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*) invalid_input 3 4
			;;
		esac
	done
}

# Fourth menu level - confirm custom value, $1=header, $2=custom input value
forced_custom_confirm_menu() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Do you want to use the following"
			echo "as the value for the module props?"
			echo ""
			echo -e "${C}$2${N}"
			echo ""
			if [ "$BASICATTCUST" ]; then
				echo "The currently set custom value is:"
				echo -e "${C}$BASICATTCUST${N}"
			else
				echo "Currently the default module"
				echo "values are being used."
			fi
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				forced_custom_confirm "$1" "$2"
				INPUT2=""
				INPUT3=""
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*) invalid_input 3 4
			;;
		esac
	done
}

# Third menu level - reset, $1=header
forced_reset_menu() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Are you sure you want to reset"
			echo "the custom/list value for forced"
			echo "BASIC key attestation to the default."
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				forced_reset "$1" 3
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*) invalid_input 3 3
			;;
		esac
	done
}

# ======================== Device simulation ========================
# Second menu level - Device simulation, $1=header
menu_dev_sim() {
	INPUT2=""
	while true
	do
		ENABLE="${G} (enabled)${N}"
		DISABLE="${R} (disabled)${N}"
		DEVSIMTXT=""
		DESCRIPTIONTXT=""
		DISPTXT=""
		SDKTXT=""
		MANUFACTURERTXT=""
		MODELTXT=""
		if [ "$DEVSIM" == 1 ]; then
			DEVSIMTXT=$ENABLE
		else
			DEVSIMTXT=$DISABLE
		fi
		for ITEM in $PRINTPARTS; do
			TMPPROP=$(get_prop_type $ITEM | tr '[:lower:]' '[:upper:]')
			TMPVAR=$(echo "${TMPPROP}TXT")
			if [ "$(get_file_value $LATEFILE "${TMPPROP}SET=")" == 1 ]; then
				eval "${TMPPROP}TXT='$ENABLE'"
			elif [ "$(get_file_value $LATEFILE "${TMPPROP}SET=")" == 0 ]; then
				eval "${TMPPROP}TXT='$DISABLE'"
			else
				eval "${TMPPROP}TXT="
			fi
		done
		if [ "$DESCRIPTIONSET" == 1 ]; then
			DESCRIPTIONTXT=$ENABLE
		else
			DESCRIPTIONTXT=$DISABLE
		fi
		if [ "$DISPLAYSET" == 1 ]; then
			DISPTXT=$ENABLE
		else
			DISPTXT=$DISABLE
		fi
		if [ "$SDKSET" == 1 ]; then
			SDKTXT=$ENABLE
		else
			SDKTXT=$DISABLE
		fi
		if [ "$MANUFACTURERSET" == 1 ]; then
			MANUFACTURERTXT=$ENABLE
		else
			MANUFACTURERTXT=$DISABLE
		fi
		if [ "$MODELSET" == 1 ]; then
			MODELTXT=$ENABLE
		else
			MODELTXT=$DISABLE
		fi
		if [ "$PARTPROPSSET" == 1 ]; then
			PARTPROPSTXT=$ENABLE
		else
			PARTPROPSTXT=$DISABLE
		fi
		if [ "$SIMSTAGE" == 0 ]; then
			STAGETXT=" ${C}(default)${N}"
		elif [ "$SIMSTAGE" == 1 ]; then
			STAGETXT=" ${C}(post-fs-data)${N}"
		elif [ "$SIMSTAGE" == 2 ]; then
			STAGETXT=" ${C}(late_start service)${N}"
		fi
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Change prop values based on the"
			echo "currently used fingerprint to"
			echo "simulate that device."
			echo ""
			if [ "$PRINTEDIT" == 0 ]; then
				echo "This option is only enabled if there"
				echo "is a fingerprint set by the module."
				echo ""
				echo "Nothing to do... Returning to main menu."
				sleep 3
				INPUT=""
				break
			fi
			echo "These settings will do basic device"
			echo "simulation by setting certain props"
			echo "based on the currently set device"
			echo "fingerprint."
			echo ""
			echo -e "${R}Only enable this if you really need it"
			echo "and be careful about which props you"
			echo -e "enable.${N}"
			echo ""
			echo "Pick an option below."
			echo ""
			echo -e "${G} s${N} - Device simulation${DEVSIMTXT}"
			if [ "$DEVSIM" == 1 ]; then
				echo -e "${G} 1${N} - ro.product.brand${BRANDTXT}"
				echo -e "${G} 2${N} - ro.product.name${NAMETXT}"
				echo -e "${G} 3${N} - ro.product.device${DEVICETXT}"
				echo -e "${G} 4${N} - ro.build.version.release${RELEASETXT}"
				echo -e "${G} 5${N} - ro.build.id${IDTXT}"
				echo -e "${G} 6${N} - ro.build.version.incremental${INCREMENTALTXT}"
				echo -e "${G} 7${N} - ro.build.version.sdk${SDKTXT}"
				echo -e "${G} 8${N} - ro.build.display.id${DISPTXT}"
				if [ "$SIMMANUFACTURER" ] && [ "$SIMMODEL" ]; then
					echo -e "${G} 9${N} - ro.product.manufacturer${MANUFACTURERTXT}"
					if [ "$BASICATTEST" == 0 ]; then
						echo -e "${G}10${N} - ro.product.model${MODELTXT}"
					else
						echo -e "    (Simulating ro.product.model is currently ${R}disabled${N}.)"
						echo ""
					fi
					MANMODEN=true
				else
					MANMODEN=false
				fi
				echo -e "${G} a${N} - Enable/disable all props"
			fi
			echo -e "${G} d${N} - ro.build.description${DESCRIPTIONTXT}"
			echo -e "${G} p${N} - Use partition props$PARTPROPSTXT"
			echo -e "${G} t${N} - Boot stage$STAGETXT"
			echo -e "${G} b${N} - Go back"
			echo -e "${G} e${N} - Exit"
			echo ""
			echo "Pick several options at once by"
			echo "separating inputs with a comma."
			echo "Example: 1,5,6"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT2
		fi
		case "$INPUT2" in
			s|S) menu_dev_sim_enable "$1"
			;;
			*\,*|1|2|3|4|5|6|7|8|9|10|a|A|d|D)
				case "$INPUT2" in
					*\,*)
						NUMCHECK="$(echo $(echo $INPUT2 | sed 's|\,||g') | tr -d [0-9])"
						case "$INPUT2" in
							*1*|*2*|*3*|*4*|*5*|*6*|*7*|*8*|*a*|*A*|*d*|*D*)
								if [ -z "$NUMCHECK" ]; then
									menu_dev_sim_prop "$1" "$INPUT2"
								else
									invalid_input 7 2
								fi
							;;
							*9*|*10*)
								if [ "$MANMODEN" == "false" ]; then
									invalid_input 1 2
								else
									if [ "$BASICATTEST" == 1 ]; then
										case "$INPUT2" in
											*10*) invalid_input 7 2
											;;
											*)
												if [ -z "$NUMCHECK" ]; then
													menu_dev_sim_prop "$1" "$INPUT2"
												else
													invalid_input 7 2
												fi
											;;
										esac
									else
										if [ -z "$NUMCHECK" ]; then
											menu_dev_sim_prop "$1" "$INPUT2"
										else
											invalid_input 7 2
										fi
									fi
								fi
							;;
							*)
								invalid_input 1 2
							;;
						esac
					;;
					*)
						if [ "$DEVSIM" == 1 ] || [ "$INPUT2" == "d" -o "$INPUT2" == "D" ]; then
							if [ "$MANMODEN" == "false" ] && [ "$INPUT2" == 9 -o "$INPUT2" == 10 ]; then
								invalid_input 1 2
							else
								if [ "$BASICATTEST" == 1 ] && [ "$INPUT2" == 10 ]; then
									invalid_input 1 2
								else
									menu_dev_sim_prop "$1" "$INPUT2"
								fi
							fi
						else
							invalid_input 1 2
						fi
					;;
				esac
			;;
			t|T) menu_bootstage_sim "$1"
			;;
			p|P) menu_partprops_sim "$1" "$PARTPROPSSET"
			;;
			b|B)
				INPUT=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 2
			;;
		esac
	done
}

# Third menu level - Enable device simulation, $1=header
menu_dev_sim_enable() {
	INPUT3=""
	while true
	do
		if [ "$DEVSIM" == 0 ]; then
			STATETXT="${G}enable${N}"
			CURRTXT="${R}disabled${N}"
		else
			STATETXT="${R}disable${N}"
			CURRTXT="${G}enabled${N}"
		fi
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo -e "Do you want to $STATETXT basic"
			echo "device simulation?"
			echo ""
			echo -e "Currently $CURRTXT."
			echo ""
			if [ "$DEVSIM" == 0 ]; then
				echo "Enabling this option will let you"
				echo "set certain props based on the"
				echo "currently used device fingerprint."
				echo ""
			fi
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				change_dev_sim "$1" "file"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Set device simulation props, $1=header, $2=list value for specific prop/option
menu_dev_sim_prop() {
	INPUT3=""
	while true
	do
		TMPTXT=""
		TMPPARTS=$PRINTPARTS$ADNSIMPROPS1$ADNSIMPROPS2
		TMPITEMS=""
		CNT=1
		case "$2" in
			*\,*) TMPTXT="Multi"
			;;
			1) TMPTXT="ro.build.brand"
			;;
			2) TMPTXT="ro.build.name"
			;;
			3) TMPTXT="ro.build.device"
			;;
			4) TMPTXT="ro.build.version.release"
			;;
			5) TMPTXT="ro.build.id"
			;;
			6) TMPTXT="ro.build.version.incremental"
			;;
			7) TMPTXT="ro.build.version.sdk"
			;;
			8) TMPTXT="ro.build.display.id"
			;;
			9) TMPTXT="ro.product.manufacturer"
			;;
			10) TMPTXT="ro.product.model"
			;;
			a|A) TMPTXT="All"
			;;
			d|D) TMPTXT="ro.build.description"
			;;
		esac
		if [ "$TMPTXT" == "Multi" ] || [ "$TMPTXT" == "All" ]; then
			TMPLST=$(echo $2 | sed 's|\,| |g')
			for ITEM in $TMPPARTS; do
				for INT in $TMPLST; do
					if [ "$INT" == "$CNT" ]; then
						if [ "$TMPITEMS" ]; then
							TMPITEMS="$TMPITEMS $ITEM"
						else
							TMPITEMS="$ITEM"
						fi
					fi
				done
				CNT=$(($CNT+1))
			done
			if [ "$TMPTXT" == "All" ]; then
				TYPETXT="all"
				if [ "$MANMODEN" == "true" ]; then
					TMPINPUT="$TMPPARTS"
				else
					TMPINPUT=$PRINTPARTS$ADNSIMPROPS1
				fi
			else
				TYPETXT="the following"
				TMPINPUT="$TMPITEMS"
			fi
			if [ -z "$INPUT3" ]; then
				menu_header "${C}$1${N}"
				echo ""
				echo -e "Do you want to ${G}enable${N} or ${R}disable${N}"
				echo "$TYPETXT simulation props?"
				echo ""
				if [ "$TMPTXT" == "Multi" ]; then
					echo -e "${C}$(echo $TMPITEMS | sed 's| |\n|g')${N}"
					echo ""
				fi
				echo -e "${R}Warning!${N} Some of these props"
				echo "may cause issues with your device."
				echo ""
				echo "See the module readme or the"
				echo "support thread @ XDA for details."
				echo ""
				echo -e "${G}1${N} - Enable"
				echo -e "${G}2${N} - Disable"
				echo -e "${G}b${N} - Go back"
				echo -e "${G}e${N} - Exit"
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT3
				case "$INPUT3" in
					1|2)
						before_change
						if [ "$INPUT3" == 1 ]; then
							TMPVAL=1
						else
							TMPVAL=0
						fi
						for ITEM in $TMPINPUT; do
							change_sim_prop "Device simulation" "$ITEM" "$TMPVAL" "none"
						done
						INPUT2=""
						after_change "$1"
						break
					;;
					b|B)
						INPUT2=""
						break
					;;
					e|E) exit_fn
					;;
					*)	invalid_input 1 3
					;;
				esac
			fi
		else
			TMPPROP=$(get_prop_type $TMPTXT | tr '[:lower:]' '[:upper:]')
			if [ "$(get_file_value $LATEFILE "${TMPPROP}SET=")" == 0 ]; then
				STATETXT="${G}enable${N}"
				CURRTXT="${R}disabled${N}"
				TMPVAL=1
			else
				STATETXT="${R}disable${N}"
				CURRTXT="${G}enabled${N}"
				TMPVAL=0
			fi
			if [ -z "$INPUT3" ]; then
				menu_header "${C}$1${N}"
				echo ""
				echo -e "Do you want to $STATETXT simulating"
				echo -e "${C}${TMPTXT}${N}?"
				echo -e "It is currently $CURRTXT."
				echo ""
				echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
				read -r INPUT3
				case "$INPUT3" in
					y|Y)
						if [ "$TMPPROP" == "DESCRIPTION" ]; then
							change_sim_descr "$1" "$TMPVAL"
						else
							change_sim_prop "$1" "$TMPTXT" "$TMPVAL"
						fi
						INPUT2=""
						break
					;;
					n|N)
						INPUT2=""
						break
					;;
					e|E) exit_fn
					;;
					*)	invalid_input 3 3
					;;
				esac
			fi
		fi
	done
}

# Third menu level - Partition props, $1=header, $2=Partition simulation currently enabled or disabled
menu_partprops_sim() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			if [ "$2" == "1" ]; then
				CURRTXT="enabled"
				TMPTXT="disable"
				OPTCURR=1
				OPTNEW=0
			else
				CURRTXT="disabled"
				TMPTXT="enable"
				OPTCURR=0
				OPTNEW=1
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Partition specific props simulation"
			echo -e "is currently ${G}$CURRTXT${N}."
			echo ""
			echo -e "Do you want to ${C}$TMPTXT${N} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				change_sim_partprops "$1" "$OPTNEW"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Boot stage, $1=header
menu_bootstage_sim() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			if [ "$SIMSTAGE" == 0 ]; then
				CURRTXT="default"
				TMPTXT="${C}post-fs-data${N} or ${C}late_start sevice${N}"
				CHOICETXT="${G}p${N}(ost), ${G}l${N}(ate)"
			elif [ "$SIMSTAGE" == 1 ]; then
				CURRTXT="post-fs-data"
				TMPTXT="${C}default${N} or ${C}late_start service${N}"
				CHOICETXT="${G}d${N}(efault), ${G}l${N}(ate)"
			elif [ "$SIMSTAGE" == 2 ]; then
				CURRTXT="late_start service"
				TMPTXT="${C}default${N} or ${C}post-fs-data${N}"
				CHOICETXT="${G}d${N}(efault), ${G}p${N}(post)"
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo -e "Current boot stage is ${G}$CURRTXT${N}."
			echo ""
			echo "Do you want to change it to"
			echo -e "$TMPTXT?"
			echo ""
			if [ "$SIMSTAGE" == 2 ] && [ "$SIMSOFTBOOT" == 0 ]; then
				echo -e "Since you have the ${C}late_start service${N}"
				echo -e "boot stage set, you can also ${G}enable${N} a"
				echo "soft reboot at the end of the boot process."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			elif [ "$SIMSTAGE" == 2 ] && [ "$SIMSOFTBOOT" == 1 ]; then
				echo -e "Soft reboot at the end of the ${C}late_start${N}"
				echo -e "${C}service${N} boot stage is ${G}enabled${N} and can be"
				echo -e "${R}disabled${N}."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			fi
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter $CHOICETXT, ${G}b${N}(ack) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			r|R)
				menu_softboot_sim "Soft reboot"
				INPUT2=""
				break
			;;
			d|D)
				if [ "$SIMSTAGE" != 0 ]; then
					before_change
					OPTNEW=0
					log_handler "Device simulation boot stage changed to default."
					replace_fn SIMSTAGE $SIMSTAGE $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			p|P)
				if [ "$SIMSTAGE" != 1 ]; then
					before_change
					OPTNEW=1
					log_handler "Device simulation boot stage changed to post-fs-data."
					replace_fn SIMSTAGE $SIMSTAGE $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			l|L)
				if [ "$SIMSTAGE" != 2 ]; then
					before_change
					OPTNEW=2
					log_handler "Device simulation boot stage changed to late_start service."
					replace_fn SIMSTAGE $SIMSTAGE $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 3
			;;
		esac
	done
}

# Fourth menu level - Devices simulation soft reboot, $1=header
menu_softboot_sim() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			if [ "$SIMSOFTBOOT" == "1" ]; then
				CURRTXT="${G}enabled${N}"
				TMPTXT="${R}disable${N}"
				LOGTXT="disabled"
				OPTCURR=1
				OPTNEW=0
			else
				CURRTXT="${R}disabled${N}"
				TMPTXT="${R}enable${N}"
				LOGTXT="enabled"
				OPTCURR=0
				OPTNEW=1
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Soft reboot for device simulation set"
			echo "in the late_start service boot stage"
			echo -e "is currently ${CURRTXT}."
			echo ""
			echo -e "Do you want to ${TMPTXT} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				before_change
				log_handler "Device simulation soft reboot ${LOGTXT}."
				# Saves new module value
				replace_fn SIMSOFTBOOT $OPTCURR $OPTNEW $LATEFILE
				# Load module values
				. $LATEFILE
				INPUT3=""
				after_change "$1"
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 4
			;;
		esac
	done
}

# ======================== MagiskHide Props ========================
# Second menu level - MagiskHide props, $1=header
menu_magiskhide_props() {
	INPUT2=""
	while true
	do
		ITEMCOUNT=0
		ENABLEDCOUNT=0
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}\n Select an option below:"
			echo ""
			echo "Set/reset MagiskHide sensitive props."
			echo ""
			echo -e "${C}Note that only props that originally are${N}"
			echo -e "${C}set to sensitive values will show in the list.${N}"
			echo ""
			magiskhide_props_menu "$PROPSLIST"
			magiskhide_props_menu "$TRIGGERPROPS" "trigger"
			magiskhide_props_menu "$LATEPROPS" "late"
			if [ "$ITEMCOUNT" == 0 ]; then
				echo "None of the sensitive props available"
				echo "need to be changed."
				echo ""
				echo "They are all already set to a safe"
				echo "value or does not exist on the device."
				echo ""
				echo "If you still want to change/set some of"
				echo "them, to values other than the safe"
				echo "ones, use the custom props option."
				echo ""
				if [ "$PROPEDIT" == 1 ]; then
					echo -e "But, this option is currently ${C}active${N}..."
					echo ""
					echo -e "Do you want to ${R}disable${N} this feature?"
					echo "(Doing so would save some resources during boot.)"
					echo ""
					echo -e "${G}y${N} - Yes"
					echo -e "${G}n${N} - No"
					echo -e "${G}e${N} - Exit"
					echo ""
					echo "See the module readme or the"
					echo "support thread @ XDA for details."
					echo ""
					echo -n "Enter your desired option: "
					read -r INPUT2
				else
					echo "Nothing to do... Returning to main menu."
					sleep 5
					INPUT=""
					break
				fi
			else
				if [ "$PROPCOUNT" -lt $(($ITEMCOUNT-3)) ] || [ "$ENABLEDCOUNT" -gt 2 ]; then
					echo -e "${G}a${N} - Set all props"
				fi
				if [ "$PROPCOUNT" -gt 2 ]; then
					echo -e "${G}r${N} - Reset all props"
				fi
				echo -e "${G}s${N} - Boot stage"
				echo -e "${G}b${N} - Go back to main menu"
				echo -e "${G}e${N} - Exit"
				echo ""
				echo "Pick several options at once by"
				echo "separating inputs with a comma."
				echo "Example: 1,3,4"
				echo ""
				echo "See the module readme or the"
				echo "support thread @ XDA for details."
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT2
			fi
		fi
		case "$INPUT2" in
			*\,*)
				if [ -z "$(echo $(echo $INPUT2 | sed 's|\,||g') | tr -d [0-9])" ] && [ "$ITEMCOUNT" != 0 ]; then
					menu_change_prop "Set multiple props" $INPUT2
				else
					invalid_input 7 2
				fi
			;;
			a|A)
				if [ "$ITEMCOUNT" != 0 ] && [ "$PROPCOUNT" -lt $(($ITEMCOUNT-3)) ] || [ "$ENABLEDCOUNT" -gt 2 ]; then
					menu_change_prop "Set all props"
				else
					invalid_input 1 2
				fi
			;;
			r|R)
				if [ "$PROPCOUNT" -gt 2 ] && [ "$ITEMCOUNT" != 0 ]; then
					menu_reset_prop_all "Reset all props"
				else
					invalid_input 1 2
				fi
			;;
			s|S)
				menu_bootstage_prop "Sensitive props boot stage"
			;;
			b|B)
				if  [ "$ITEMCOUNT" != 0 ]; then
					INPUT=""
					break
				else
					invalid_input 1 2
				fi
			;;
			y|Y)
				if  [ "$ITEMCOUNT" == 0 ]; then
					menu_reset_prop_all "Disable?" "yes"
					INPUT2=""
					break
				else
					invalid_input 1 2
				fi
			;;
			n|N)
				if  [ "$ITEMCOUNT" == 0 ]; then
					INPUT=""
					break
				else
					invalid_input 1 2
				fi
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUT2" -ge 1 -a "$INPUT2" -lt "$ITEMCOUNT" ] && [ "$ITEMCOUNT" != 0 ]; then
					ITEMCOUNT=1
					for ITEM in $PROPSLIST$TRIGGERPROPS$LATEPROPS; do
						PROP=$(get_prop_type $ITEM)
						CURRVALUE=$(eval "echo \$$(echo "CURR${PROP}" | tr '[:lower:]' '[:upper:]')")
						ORIGVALUE=$(eval "echo \$$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')")
						MODULEVALUE=$(eval "echo \$$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')")
						if [ "$ORIGVALUE" ] && [ "$MODULEVALUE" != "$ORIGVALUE" ]; then
							if [ "$ITEMCOUNT" == "$INPUT2" ]; then
								menu_change_prop "$ITEM" "$CURRVALUE" "$ORIGVALUE" "$MODULEVALUE"
								break
							fi
							ITEMCOUNT=$(($ITEMCOUNT+1))
						fi
					done
				else
					invalid_input 1 2
				fi
			;;
		esac
	done
}

# Third menu level - MagiskHide props, $1=header, $2=Currently set prop value, $3=Original prop value, $4=Module set prop value
menu_change_prop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			if [ "$1" == "Set multiple props" ]; then
				TMPITEMS=""
				CNT=1
				TMPLST=$(echo $2 | sed 's|\,| |g')
				for ITEM in $PROPSLIST$TRIGGERPROPS$LATEPROPS; do
					PROP=$(get_prop_type $ITEM)
					ORIGVALUE=$(eval "echo \$$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')")
					MODULEVALUE=$(eval "echo \$$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')")
					if [ "$ORIGVALUE" ] && [ "$MODULEVALUE" != "$ORIGVALUE" ]; then
						for INT in $TMPLST; do
							if [ "$INT" == "$CNT" ]; then
								if [ "$TMPITEMS" ]; then
									TMPITEMS="$TMPITEMS $ITEM"
								else
									TMPITEMS=$ITEM
								fi
							fi
						done
						CNT=$(($CNT+1))
					fi
				done
				echo "Do you want to change the"
				echo "following props:"
				echo ""
				for ITEM in $TMPITEMS; do
					CURRVALUE=$(eval "echo \$$(echo "CURR$(get_prop_type $ITEM)" | tr '[:lower:]' '[:upper:]')")
					safe_props $ITEM $CURRVALUE
					if [ "$SAFE" == 1 ]; then
						SAFETXT=" (currently set to a safe value)"
					else
						SAFETXT=" (currently set to a triggering value)"
					fi
					echo -e ${C}$ITEM${N}$SAFETXT
				done
			elif [ "$1" == "Set all props" ]; then
				echo "Do you want to set all"
				echo "MagiskHide sensitive props?"
				TMPITEMS=$PROPSLIST$TRIGGERPROPS$LATEPROPS
			else
				# Checks if the prop exists
				if [ "$2" ]; then
					CTRLTRIGG=true
					for TRIGG in $TRIGGERPROPS; do
						if [ "$TRIGG" == "$1" ]; then
							CTRLTRIGG=false
							break
						fi
					done
					REVALUE=$(get_file_value $LATEFILE "$(echo "RE$(get_prop_type "$1")" | tr '[:lower:]' '[:upper:]')=")
					if [ "$2" == "$4" ] && [ "$2" != "$3" ] && [ "$REVALUE" == 1 ]; then
						if [ "$CTRLTRIGG" == "true" ]; then
							PROPMODULETXT=", by this module"
							BACKTXT=" back"
						else
							PROPMODULETXT="${G}active${N}"
							BACKTXT="${R}deactivate${N}"
						fi
					else
						if [ "$CTRLTRIGG" == "true" ]; then
							PROPMODULETXT=""
							BACKTXT=""
						else
							PROPMODULETXT="${R}deactivated${N}"
							BACKTXT="${G}activate${N}"
						fi
					fi
					if [ "$CTRLTRIGG" == "true" ]; then
						echo -e "Currently set to ${C}$2${N}${PROPMODULETXT}."
						if [ "$2" != "$3" ]; then
							echo -e "The original value is ${C}$3${N}."
						fi
						echo ""
						safe_props "$1" "$2"
						change_to "$1" "$2"
						if [ "$SAFE" == 1 ]; then
							echo "You currently have the safe value set."
							echo -e "Are you sure you want to change it$BACKTXT to ${C}$CHANGE${N}?"
						else
							echo -e "Do you want to change it${BACKTXT} to ${C}$CHANGE${N}?"
						fi
					else
						echo -e "Changing of ${C}$1${N} when"
						echo -e "containing triggering value is $PROPMODULETXT."
						echo ""
						echo -e "Are you sure you want to $BACKTXT it."
					fi
				else
					echo "This prop doesn't currently exist on your system."
					echo ""
					echo "Nothing to do... Returning to main menu."
					sleep 3
					INPUT2=""
					break
				fi
			fi
			if [ "$ENABLEDCOUNT" -gt 1 ] && [ "$1" != "Set all props" ]; then
				echo ""
				echo -e "${C}Note that since there are several props${N}"
				echo -e "${C}that are enabled but not active, these other${N}"
				echo -e "${C}props will become active if you say \"yes\".${N}"
			fi
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				if [ "$1" == "Set multiple props" ] || [ "$1" == "Set all props" ]; then
					for ITEM in $TMPITEMS; do
						CURRVALUE=$(eval "echo \$$(echo "CURR$(get_prop_type $(get_eq_left "$ITEM"))" | tr '[:lower:]' '[:upper:]')")
						safe_props "$ITEM" $CURRVALUE
						if [ "$SAFE" == 1 ] && [ "$1" != "Set all props" ]; then
							reset_prop "$ITEM" "none"
						else
							change_prop "$ITEM" "none"
						fi
						. $LATEFILE
					done
					after_change "$1"
				elif [ "$PROPMODULETXT" ]; then
					menu_reset_prop "Reset $1" "$1"
				else
					change_prop "$1"
				fi
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Reset all MagiskHide props, $1=header, $2=type of question to ask
menu_reset_prop_all() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			if [ "$2" == "yes" ]; then
				echo -e "This will ${R}disable${N} the"
				echo "MagiskHide sensitive props feature."
			else
				echo "This will reset all prop values"
				echo "to the default device values."
			fi
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				reset_prop_all "$1"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Reset specific MagiskHide prop, $1=header, $2=prop name
menu_reset_prop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will reset $2"
			echo "to it's default device value."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				reset_prop "$2"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - MagiskHide props boot stage, $1=header
menu_bootstage_prop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			if [ "$PROPBOOT" == 0 ]; then
				CURRTXT="default"
				TMPTXT="${C}post-fs-data${N} or ${C}late_start sevice${N}"
				CHOICETXT="${G}p${N}(ost), ${G}l${N}(ate)"
			elif [ "$PROPBOOT" == 1 ]; then
				CURRTXT="post-fs-data"
				TMPTXT="${C}default${N} or ${C}late_start service${N}"
				CHOICETXT="${G}d${N}(efault), ${G}l${N}(ate)"
			elif [ "$PROPBOOT" == 2 ]; then
				CURRTXT="late_start service"
				TMPTXT="${C}default${N} or ${C}post-fs-data${N}"
				CHOICETXT="${G}d${N}(efault), ${G}p${N}(post)"
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo -e "Current boot stage is ${G}$CURRTXT${N}."
			echo ""
			echo "Do you want to change it to"
			echo -e "$TMPTXT?"
			echo ""
			if [ "$PROPBOOT" == 2 ] && [ "$PROPSOFTBOOT" == 0 ]; then
				echo -e "Since you have the ${C}late_start service${N}"
				echo -e "boot stage set, you can also ${G}enable${N} a"
				echo "soft reboot at the end of the boot process."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			elif [ "$PROPBOOT" == 2 ] && [ "$PROPSOFTBOOT" == 1 ]; then
				echo -e "Soft reboot at the end of the ${C}late_start${N}"
				echo -e "${C}service${N} boot stage is ${G}enabled${N} and can be"
				echo -e "${R}disabled${N}."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			fi
			echo ""
			echo -e "${C}Note that this option does not apply to${N}"
			echo -e "${C}trigger or late props.${N}"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter $CHOICETXT, ${G}b${N}(ack) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			r|R)
				menu_softboot_prop "Soft reboot"
				INPUT2=""
				break
			;;
			d|D)
				if [ "$PROPBOOT" != 0 ]; then
					before_change
					OPTNEW=0
					log_handler "MagiskHide props boot stage changed to default."
					replace_fn PROPBOOT $PROPBOOT $OPTNEW $LATEFILE
					replace_fn PROPSOFTBOOT 1 0 $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			p|P)
				if [ "$PROPBOOT" != 1 ]; then
					before_change
					OPTNEW=1
					log_handler "MagiskHide props boot stage changed to post-fs-data."
					replace_fn PROPBOOT $PROPBOOT $OPTNEW $LATEFILE
					replace_fn PROPSOFTBOOT 1 0 $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			l|L)
				if [ "$PROPBOOT" != 2 ]; then
					before_change
					OPTNEW=2
					log_handler "MagiskHide props boot stage changed to late_start service."
					replace_fn PROPBOOT $PROPBOOT $OPTNEW $LATEFILE
					replace_fn PROPSOFTBOOT 1 0 $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 3
			;;
		esac
	done
}

# Fourth menu level - MagiskHide props soft reboot, $1=header
menu_softboot_prop() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			if [ "$PROPSOFTBOOT" == "1" ]; then
				CURRTXT="${G}enabled${N}"
				TMPTXT="${R}disable${N}"
				LOGTXT="disabled"
				OPTCURR=1
				OPTNEW=0
			else
				CURRTXT="${R}disabled${N}"
				TMPTXT="${R}enable${N}"
				LOGTXT="enabled"
				OPTCURR=0
				OPTNEW=1
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Soft reboot for sensitive props set"
			echo "in the late_start service boot stage"
			echo -e "is currently ${CURRTXT}."
			echo ""
			echo -e "Do you want to ${TMPTXT} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				before_change
				log_handler "Sensitive props soft reboot ${LOGTXT}."
				# Saves new module value
				replace_fn PROPSOFTBOOT $OPTCURR $OPTNEW $LATEFILE
				# Load module values
				. $LATEFILE
				INPUT3=""
				after_change "$1"
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 4
			;;
		esac
	done
}

# ======================== Custom Props ========================
# Second menu level - Custom props, $1=Header
menu_custom_props() {
	INPUT2=""
	while true
	do
		if [ -z "$INPUT2" ]; then
			ITEMCOUNT=0
			if [ "$OPTIONBOOT" == 0 ]; then
				DEFSTAGETXT=" (system.prop)"
			elif [ "$OPTIONBOOT" == 1 ]; then
				DEFSTAGETXT=" (post-fs-data)"
			elif [ "$OPTIONBOOT" == 2 ]; then
				DEFSTAGETXT=" (late_start service)"
			fi
			menu_header "${C}$1${N}\n Select an option below:"
			echo ""
			if [ "$CUSTOMEDIT" == 0 ] && [ "$CUSTOMPROPS" -o "$CUSTOMPROPSPOST" -o "$CUSTOMPROPSLATE" -o "$CUSTOMPROPSDELAY" ]; then
				CTRLSET=0
				echo -e "You have ${C}custom props set${N},"
				echo -e "but the option is ${R}not activated${N}."
				echo ""
				echo -e "Do you want to activate it (enter ${G}r${N} to reset)?"
				echo ""
				echo -en "Enter ${G}y${N}(es), ${G}n${N}(o), ${G}r${N}(eset) or ${G}e${N}(xit): "
				read -r INPUT2
			else
				CTRLSET=1
				echo "Set or edit custom prop values for your device."
				echo ""
				if [ "$CUSTOMPROPS" ] || [ "$CUSTOMPROPSPOST" ] || [ "$CUSTOMPROPSLATE" ] || [ "$CUSTOMPROPSDELAY" ]; then
					echo "Currently set props (pick to edit):"
					ITEMCOUNT=1
					if [ "$CUSTOMPROPS" ]; then
						echo ""
						echo -e "${C}Default boot stage${G}${DEFSTAGETXT}${N}"
						for ITEM in $CUSTOMPROPS; do
							echo -e "${G}$ITEMCOUNT${N} - $(get_eq_left "$ITEM")"
							ITEMCOUNT=$(($ITEMCOUNT+1))
						done
					fi
					if [ "$CUSTOMPROPSPOST" ]; then
						echo ""
						echo -e "${C}post-fs-data boot stage${N}"
						for ITEM in $CUSTOMPROPSPOST; do
							echo -e "${G}$ITEMCOUNT${N} - $(get_eq_left "$ITEM")"
							ITEMCOUNT=$(($ITEMCOUNT+1))
						done
					fi
					if [ "$CUSTOMPROPSLATE" ] || [ "$CUSTOMPROPSDELAY" ]; then
						CUSTOMPROPSLATETMP="$CUSTOMPROPSLATE $CUSTOMPROPSDELAY"
						echo ""
						echo -e "${C}late_start service boot stage${N}"
						for ITEM in $CUSTOMPROPSLATETMP; do
							if [ "$(echo $CUSTOMPROPSDELAY | grep $(get_eq_left $ITEM))" ]; then
								DELAYTXT=" ${C}(delayed)${N}"
							else
								DELAYTXT=""
							fi
							echo -e "${G}$ITEMCOUNT${N} - $(get_eq_left "$ITEM")$DELAYTXT"
							ITEMCOUNT=$(($ITEMCOUNT+1))
						done
					fi
				else
					echo "Currently no custom props set."
					echo "Please add one by selecting"
					echo "\"New custom prop\" below."
				fi
				echo ""
				echo -e "${G}n${N} - New custom prop"
				if [ "$CUSTOMPROPS" ] || [ "$CUSTOMPROPSPOST" ] || [ "$CUSTOMPROPSLATE" ] || [ "$CUSTOMPROPSDELAY" ]; then
					echo -e "${G}r${N} - Reset all custom props"
				fi
				echo -e "${G}b${N} - Go back to main menu"
				echo -e "${G}e${N} - Exit"
				echo ""
				echo "See the module readme or the"
				echo "support thread @ XDA for details."
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT2
			fi
			case "$INPUT2" in
				y|Y)
					if [ "$CTRLSET" == 1 ]; then
						invalid_input 1 2
					elif [ "$CTRLSET" == 0 ]; then
						replace_fn CUSTOMEDIT 0 1 $LATEFILE
						INPUT=""
						break
					fi
				;;
				n|N)
					if [ "$CTRLSET" == 1 ]; then
						menu_new_custprop "New custom prop"
					elif [ "$CTRLSET" == 0 ]; then
						INPUT=""
						break
					fi
				;;
				r|R)
					if [ "$CTRLSET" == 1 ]; then
						menu_reset_all_custprop "Reset all custom props"
					elif [ "$CTRLSET" == 0 ]; then
						menu_reset_all_custprop "Reset all custom props"
					fi
				;;
				b|B)
					if [ "$CTRLSET" == 1 ]; then
						INPUT=""
						break
					elif [ "$CTRLSET" == 0 ]; then
						invalid_input 4 2
					fi
				;;
				e|E) exit_fn
				;;
				*)
					if [ "$INPUT2" -ge 1 -a "$INPUT2" -lt "$ITEMCOUNT" ] && [ "$CTRLSET" == 1 ]; then
						ITEMCOUNT=1
						for ITEM in $CUSTOMPROPSLIST; do
							if [ "$ITEMCOUNT" == "$INPUT2" ]; then
								menu_edit_custprop "$(get_eq_left "$ITEM")"
								break
							fi
							ITEMCOUNT=$(($ITEMCOUNT+1))
						done
					else
						if [ "$CTRLSET" == 1 ]; then
							invalid_input 1 2
						elif [ "$CTRLSET" == 0 ]; then
							invalid_input 4 2
						fi
					fi
				;;
			esac
		fi
	done
}

# Third menu level - Edit custom prop, $1=prop name
menu_edit_custprop() {
	INPUT3=""
	if [ "$(echo $CUSTOMPROPS | grep $1)" ]; then
		STAGETXT=" ${C}(system.prop)${N}"
	elif [ "$(echo $CUSTOMPROPSPOST | grep $1)" ] && [ "$(echo $CUSTOMPROPSLATE | grep $1)" -o "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
		STAGETXT=" ${C}(both)${N}"
	elif [ "$(echo $CUSTOMPROPSPOST | grep $1)" ]; then
		STAGETXT=" ${C}(post-fs-data)${N}"
	elif [ "$(echo $CUSTOMPROPSLATE | grep $1)" ] || [ "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
		STAGETXT=" ${C}(late_start service)${N}"
	fi
	DELAYTXT=""
	if [ "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
		for ITEM in $CUSTOMPROPSDELAY; do
			case $ITEM in
				*$1*)
					DELAYTXT=" ${G}(active, $(get_prop_delay "$ITEM") seconds)${N}"
					break
				;;
			esac
		done
	fi
	while true
	do
		if [ -z "$INPUT3" ]; then
			for ITEM in $CUSTOMPROPSLIST; do
				TMPITEM=$(get_prop_value "$ITEM")
				if [ "$(get_eq_left "$ITEM")" == "$1" ]; then
					if [ "$TMPITEM" == "$(getprop $1)" ]; then
						PROPNOTSET=0
					else
						PROPNOTSET=1
					fi
					SETPROPVALUE="$TMPITEM"
					break
				fi
			done
			menu_header "${C}$1${N}"
			echo ""
			echo "The current value for"
			echo -e "${C}$1${N} is:"
			echo ""
			echo -e "${C}$(getprop $1)${N}"
			if [ "$PROPNOTSET" == 0 ]; then
				echo "(Set by this module.)"
				echo ""
				echo "Enter a new value or select"
				echo "from the options below."
				echo ""
			else
				echo ""
				echo -e "${R}Not yet set by this module. Please reboot to set.${N}"
				if [ "$OPTIONBOOT" == 1 ] || [ "$STAGETXT" == " ${C}(post-fs-data)${N}" ] || [ "$STAGETXT" == " ${C}(system.prop)${N}" ]; then
					echo ""
					echo "This might be caused by the prop being set"
					echo "too early. If the above state does not change"
					echo "after a reboot, try changing the boot stage"
					echo -e "when the prop is set to ${G}late_start service${N}."
				fi
				echo ""
				echo -e "Do you want to reboot now (${G}y/n${N})?"
				echo ""
			fi
			echo -e "${G}s${N} - Prop boot stage$STAGETXT"
			echo -e "${G}d${N} - Delay$DELAYTXT"
			echo -e "${G}r${N} - Reset prop"
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y) force_reboot
			;;
			n|N)
				INPUT2=""
				break
			;;
			s|S) menu_bootstage_custprop "$1" "$SETPROPVALUE"
			;;
			d|D) menu_delay_custprop "$1" "$SETPROPVALUE" "$(getprop $1)" "edit"
			;;
			r|R)
				menu_reset_custprop "$1" "$SETPROPVALUE"
				break
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$PROPNOTSET" == 0 ]; then
					menu_set_custprop "$1" "$INPUT3" "$(getprop $1)"
					break
				else
					invalid_input 1 3
				fi
			;;
		esac
	done
}

# Third menu level - New custom prop, $1=Header
menu_new_custprop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Enter the prop to set. Example:"
			echo -e "${C}ro.sf.lcd_density${N}"
			echo ""
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT3
		fi
		case "$INPUT3" in
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			""|[[:blank:]]*) blank_input 3
			;;
			*)
				PROP=$(get_prop_type $INPUT3)
				REVALUE=$(eval "echo \$$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')")
				ORIGVALUE=$(eval "echo \$$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')")
				MODULEVALUE=$(eval "echo \$$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')")

				if [ "$REVALUE" == 1 ] && [ "$ORIGVALUE" ] && [ "$MODULEVALUE" ] || [ "$(echo $CUSTOMPROPSLIST | grep -Eo "(^| )$INPUT3($| )")" ]; then
					menu_magiskhide_custprop "$INPUT3"
				else
					menu_set_new_custprop "$INPUT3"
					break
				fi
			;;
		esac
	done
}

# Third menu level - Reset all custom props, $1=Header
menu_reset_all_custprop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will reset all"
			echo "custom prop values."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				reset_all_custprop
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Fourth menu level - MagiskHide custom prop and duplicate props, $1=prop name
menu_magiskhide_custprop() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			if [ "$(echo "$CUSTOMPROPSLIST" | grep -o $1)" ]; then
				echo -e "${C}$1${N} is"
				echo "already on your list of custom props."
				echo "No need to set it again."
			else
				echo -e "${C}$1${N} is"
				echo "one of the sensitive props that can be"
				echo "set by the MagiskHide props option."
			fi
			echo ""
			echo "Are you sure you want to proceed?"
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				menu_set_new_custprop "$1"
				INPUT2=""
				INPUT3=""
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 4
			;;
		esac
	done
}

# Fourth menu level - Set new custom prop, $1=prop name
menu_set_new_custprop() {
	INPUT4=""
	TMPPROP=$(getprop "$1")
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Enter the value you want to set"
			echo -e "${C}$1${N} to,"
			echo "or select from the options below."
			echo ""
			echo "The currently set value is:"
			if [ "$TMPPROP" ]; then
				echo -e "${C}$TMPPROP${N}"
				echo "Please enter the new value."
			else
				echo -e "${C}Currently not set, or the value could not be retrieved.${N}"
				echo "Please enter the value to set."
			fi
			echo ""
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT4
		fi
		case "$INPUT4" in
			b|B)
				INPUT2=""
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			""|[[:blank:]]*)	blank_input 4
			;;
			*)
				menu_set_custprop "$1" "$INPUT4" "$TMPPROP"
				INPUT2=""
				INPUT3=""
				break
			;;
		esac
	done
}

# Fourth menu level - Custom prop boot stage, $1=prop name, $2=prop value
menu_bootstage_custprop() {
	INPUT4=""
	PLEND=" is"
	DEFAULTTXT=""
	POSTTXT=""
	LATETXT=""
	BOTHTXT=""
	TMPSOFT=""
	OPTTYPE1="default"
	OPTTYPE2="post"
	OPTTYPE3="late"
	OPTTYPE4="both"
	if [ "$(echo $CUSTOMPROPS | grep $1)" ]; then
		TMPBSTAGE="default"
		DEFAULTTXT="${G} (current)${N}"
		INTOPT=1
	elif [ "$(echo $CUSTOMPROPSPOST | grep $1)" ]; then
		TMPBSTAGE="post-fs-data"
		POSTTXT="${G} (current)${N}"
		INTOPT=2
	elif [ "$(echo $CUSTOMPROPSLATE | grep $1)" ] || [ "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
		TMPBSTAGE="late_start service"
		if [ "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
			LATETXT="${G} (current, delayed)${N}"
		else
			LATETXT="${G} (current)${N}"
		fi
		INTOPT=3
	elif [ "$(echo $CUSTOMPROPSPOST | grep $1)" ] && [ "$(echo $CUSTOMPROPSLATE | grep $1)" ]; then
		TMPBSTAGE="both"
		PLEND="s are"
		BOTHTXT="${G} (current)${N}"
		INTOPT=4
	else
		TMPBSTAGE=""
	fi
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Select what boot stage"
			echo -e "${C}$1${N}"
			echo "should be set in."
			echo ""
			echo -e "Currently ${C}${TMPBSTAGE}${N}"
			echo "boot stage$PLEND used."
			echo ""
			if [ "$TMPBSTAGE" == "late_start service" -o "$TMPBSTAGE" == "both" ] && [ "$CUSTOMSOFTBOOT" == 0 ]; then
				echo "Since you have custom props set in"
				echo -e "the ${C}late_start service${N} boot stage"
				echo -e "you can also ${G}enable${N} a soft"
				echo "reboot at the end of the boot process."
				TMPSOFT="disabled"
			elif [ "$TMPBSTAGE" == "late_start service" -o "$TMPBSTAGE" == "both" ] && [ "$CUSTOMSOFTBOOT" == 1 ]; then
				echo -e "Soft reboot at the end of the ${C}late_start${N}"
				echo -e "${C}service${N} boot stage is ${G}enabled${N} for custom"
				echo -e "props and can be ${R}disabled${N}."
				TMPSOFT="enabled"
			fi
			echo ""
			echo "Select an option below."
			echo ""
			echo -e "${G}1${N} - Default${DEFAULTTXT}"
			echo -e "${G}2${N} - post-fs-data${POSTTXT}"
			echo -e "${G}3${N} - late_start service${LATETXT}"
			echo -e "${G}4${N} - Both boot stages${BOTHTXT}"
			if [ "$TMPSOFT" ]; then
				echo -e "${G}r${N} - Soft reboot${TMPSOFT}"
			fi
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT4
		fi
		case "$INPUT4" in
			1|2|3|4)
				if [ "$INTOPT" == "$INPUT4" ]; then
					INPUT4=""
					active_option
				else
					OPTTYPE="OPTTYPE${INPUT4}"
					set_custprop "$1" "$2" "$(eval "echo \$$OPTTYPE")"
					DELAYTXT=""
					INPUT3=""
					break
				fi
			;;
			r|R)
				menu_softboot_cust "Soft reboot"
				INPUT4=""
				break
			;;
			b|B)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 4
			;;
		esac
	done
}

# Fifth menu level - Custom props soft reboot, $1=header
menu_softboot_cust() {
	INPUT5=""
	while true
	do
		if [ -z "$INPUT5" ]; then
			if [ "$CUSTOMSOFTBOOT" == "1" ]; then
				CURRTXT="${G}enabled${N}"
				TMPTXT="${R}disable${N}"
				LOGTXT="disabled"
				OPTCURR=1
				OPTNEW=0
			else
				CURRTXT="${R}disabled${N}"
				TMPTXT="${R}enable${N}"
				LOGTXT="enabled"
				OPTCURR=0
				OPTNEW=1
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Soft reboot for custom props set"
			echo "in the late_start service boot stage"
			echo -e "is currently ${CURRTXT}."
			echo ""
			echo -e "Do you want to ${TMPTXT} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT5
		fi
		case "$INPUT5" in
			y|Y)
				before_change
				log_handler "Custom props soft reboot for custom props was ${LOGTXT}."
				# Saves new module value
				replace_fn CUSTOMSOFTBOOT $OPTCURR $OPTNEW $LATEFILE
				# Load module values
				. $LATEFILE
				INPUT4=""
				after_change "$1"
				break
			;;
			n|N)
				INPUT4=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 5
			;;
		esac
	done
}

# Fourth menu level - Reset custom prop, $1=prop name, $2=prop value
menu_reset_custprop() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo -e "This will reset ${C}$1${N}"
			echo "to its original value."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				reset_custprop "$1" "$2"
				INPUT2=""
				INPUT3=""
				break
			;;
			n|N)
				INPUT3=""
				INPUT4=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 4
			;;
		esac
	done
}

# Fifth menu level - Set custom prop, $1=prop name, $2=prop value, $3=current value, $4=option
menu_set_custprop() {
	PROPSTAGE="default"
	DEFAULTTXT=" ${G}(current)${N}"
	POSTTXT=""
	LATETXT=""
	BOTHTXT=""
	DELAYTXT=""
	DELAYVAL=""
	DELAYTIMING=""
	if [ "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
		for ITEM in $CUSTOMPROPSDELAY; do
			case $ITEM in
				*$1*)
					DELAYTXT=" ${G}(active)${N}"
					break
				;;
			esac
		done
	fi
	INPUT5=""
	while true
	do
		if [ -z "$INPUT5" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo -e "This will set ${C}$1${N} to:"
			echo ""
			echo -e "${C}$2${N}"
			echo ""
			if [ "$4" == "option" ]; then
				echo "The currently set value is:"
				if [ "$(getprop "$1")" ]; then
					echo -e "${C}$(getprop "$1")${N}"
					echo "Please enter the new value."
				else
					echo -e "${C}Currently not set, or the value could not be retrieved.${N}"
					echo "Please enter the value to set."
				fi
				echo ""
			fi
			echo "Pick an option below to change"
			echo "what boot stage the prop will"
			echo "be set in, or set/reset a delay:"
			echo ""
			echo -e "${G}1${N} - Default${DEFAULTTXT}"
			echo -e "${G}2${N} - post-fs-data${POSTTXT}"
			echo -e "${G}3${N} - late_start service${LATETXT}"
			echo -e "${G}4${N} - Both boot stages${BOTHTXT}"
			echo -e "${G}d${N} - Delay${DELAYTXT}"
			echo ""
			echo "Do you want to continue?"
			echo ""
			if [ "$4" == "option" ]; then
				echo -e "Enter ${G}y${N}(es) or ${G}n${N}(o)"
			else
				echo -e "Enter ${G}y${N}(es), ${G}n${N}(o), ${G}e${N}(xit)"
			fi
			echo -n "or an option from above: "
			read -r INPUT5
		fi
		case "$INPUT5" in
			1)
				if [ "$DEFAULTTXT" ]; then
					INPUT5=""
					active_option
				else
					PROPSTAGE="default"
					DEFAULTTXT=" ${G}(current)${N}"
					POSTTXT=""
					LATETXT=""
					BOTHTXT=""
					DELAYTXT=""
					DELAYVAL=""
					DELAYTIMING=""
					INPUT5=""
				fi
			;;
			2)
				if [ "$POSTTXT" ]; then
					INPUT5=""
					active_option
				else
					PROPSTAGE="post"
					DEFAULTTXT=""
					POSTTXT=" ${G}(current)${N}"
					LATETXT=""
					BOTHTXT=""
					DELAYTXT=""
					DELAYVAL=""
					DELAYTIMING=""
					INPUT5=""
				fi
			;;
			3)
				if [ "$LATETXT" ]; then
					INPUT5=""
					active_option
				else
					PROPSTAGE="late"
					DEFAULTTXT=""
					POSTTXT=""
					LATETXT=" ${G}(current)${N}"
					BOTHTXT=""
					DELAYTXT=""
					DELAYVAL=""
					DELAYTIMING=""
					INPUT5=""
				fi
			;;
			4)
				if [ "$BOTHTXT" ]; then
					INPUT5=""
					active_option
				else
					PROPSTAGE="both"
					DEFAULTTXT=""
					POSTTXT=""
					LATETXT=""
					BOTHTXT=" ${G}(current)${N}"
					DELAYTXT=""
					DELAYVAL=""
					DELAYTIMING=""
					INPUT5=""
				fi
			;;
			d|D) menu_delay_custprop "$1" "$2" "$3" "new"
			;;
			y|Y)
				set_custprop "$1" "$2" "$PROPSTAGE" "$3" "$DELAYVAL" "$DELAYTIMING"
				INPUT2=""
				INPUT3=""
				INPUT4=""
				INPUT5=""
				break
			;;
			n|N)
				INPUT4=""
				INPUT5=""
				break
			;;
			e|E)
				if [ "$4" == "option" ]; then
					invalid_input 2 5
				else
					exit_fn
				fi
			;;
			*)
				if [ "$4" == "option" ]; then
					invalid_input 2 5
				else
					invalid_input 3 5
				fi
			;;
		esac
	done
}

# Fourth or sixth menu level - Delay prop, $1=prop name, $2=prop value, $3=current value, $4=new or edit
menu_delay_custprop() {
	INPUTTMP=""
	TMPDELAY="$DELAYVAL"
	TIMINGTXT=" ${G}(Wait for \"Boot completed\")${N}"
	TIMINGOPT="boot"
	if [ "$4" == "edit" ]; then
		INPUT4=""
		if [ "$CUSTOMPROPSDELAY" ]; then
			for ITEM in $CUSTOMPROPSDELAY; do
				case $ITEM in
					*$1*)
						TMPDELAY="$(get_prop_delay "$ITEM")"
						if [ "$(get_prop_delay_exec "$ITEM")" != "boot" ]; then
							TIMINGTXT=" ${G}(Run immediately)${N}"
							TIMINGOPT=""
						fi
					;;
				esac
			done
		fi
	elif [ "$4" == "new" ]; then
		INPUT6=""
	fi
	while true
	do
		if [ "$4" == "edit" ] && [ -z "$INPUT4" ] || [ "$4" == "new" ] && [ -z "$INPUT6" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Enter the time (in seconds)"
			echo "you want the prop"
			echo -e "${C}$1${N}"
			echo "to be delayed."
			if [ "$TMPDELAY" ]; then
				echo ""
				echo "Currently delayed by"
				echo -e "${C}$TMPDELAY${N} seconds"
			fi
			echo ""
			echo "Note that this prop will"
			echo "automatically be set during the"
			echo "late_start service boot stage."
			echo ""
			echo -e "${G}t${N} - Change timing$TIMINGTXT"
			if [ "$DELAYTXT" ]; then
				echo -e "${G}r${N} - Reset delay"
			fi
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			if [ "$4" == "edit" ]; then
				read -r INPUT4
			elif [ "$4" == "new" ]; then
				read -r INPUT6
			fi
		fi
		if [ "$4" == "edit" ]; then
			INPUTTMP=$INPUT4
		elif [ "$4" == "new" ]; then
			INPUTTMP=$INPUT6
		fi
		case "$INPUTTMP" in
			t|T)
				if [ "$TIMINGOPT" ]; then
					TIMINGTXT=" ${G}(Run immediately)${N}"
					TIMINGOPT=""
				else
					TIMINGTXT=" ${G}(Wait for \"Boot completed\")${N}"
					TIMINGOPT="boot"
				fi
				if [ "$4" == "edit" ]; then
					INPUT4=""
					INPUTTMP=""
				elif [ "$4" == "new" ]; then
					INPUT6=""
					INPUTTMP=""
				fi
			;;
			r|R) menu_reset_delay_custprop "$1" "$2" "$3" "$4"
			;;
			b|B)
				if [ "$4" == "edit" ]; then
					INPUT3=""
					break
				elif [ "$4" == "new" ]; then
					INPUT5=""
					break
				fi
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$INPUTTMP" ]; then
					NUMCHECK="$(echo $INPUTTMP | tr -d [0-9])"
					if [ -z "$NUMCHECK" ]; then
						if  [ "$4" == "edit" ]; then
							STAGETXT=" ${C}(late_start service)${N}"
							DELAYTXT=" ${G}(active, $INPUTTMP seconds)${N}"
							INPUT3=""
							set_custprop "$1" "$2" "delay" "$3" "$INPUTTMP" "$TIMINGOPT"
							break
						elif [ "$4" == "new" ]; then
							PROPSTAGE="delay"
							DEFAULTTXT=""
							POSTTXT=""
							LATETXT=" ${G}(current)${N}"
							BOTHTXT=""
							DELAYTXT=" ${G}(active)${N}"
							DELAYVAL="$INPUTTMP"
							DELAYTIMING="$TIMINGOPT"
							INPUT5=""
							break
						fi
					else
						if [ "$4" == "edit" ]; then
							invalid_input 8 4
						elif [ "$4" == "new" ]; then
							invalid_input 8 6
						fi
					fi
				else
					if [ "$4" == "edit" ]; then
						invalid_input 8 4
					elif [ "$4" == "new" ]; then
						invalid_input 8 6
					fi
				fi
			;;
		esac
	done
}

# Fifth or seventh level - Reset delay, $1=prop name, $2=prop value, $3=current value, $4=new or edit
menu_reset_delay_custprop() {
	if [ "$4" == "edit" ]; then
		INPUT5=""
	elif [ "$4" == "new" ]; then
		INPUT7=""
	fi
	INPUTTMP=""
	TMPDELAY=""
	if [ "$(echo $CUSTOMPROPSDELAY | grep $1)" ]; then
		for ITEM in $CUSTOMPROPSDELAY; do
			case $ITEM in
				*$1*)
					TMPDELAY="$(get_prop_delay "$ITEM")"
					break
				;;
			esac
		done
	fi
	while true
	do
		if [ "$4" == "edit" ] && [ -z "$INPUT5" ] || [ "$4" == "new" ] && [ -z "$INPUT7" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Do you want to reset"
			echo "the delay for prop"
			echo -e "${C}$1${N}"
			echo ""
			echo "The current delay is"
			echo -e "${C}$TMPDELAY${N} seconds"
			echo ""
			echo "This will move the prop back"
			echo "to the default boot stage."
			echo ""
			echo -e "${G}y${N} - Yes"
			echo -e "${G}n${N} - No"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			if [ "$4" == "edit" ]; then
				read -r INPUT5
			elif [ "$4" == "new" ]; then
				read -r INPUT7
			fi
		fi
		if [ "$4" == "edit" ]; then
			INPUTTMP=$INPUT5
		elif [ "$4" == "new" ]; then
			INPUTTMP=$INPUT7
		fi
		case "$INPUTTMP" in
			y|Y)
				set_custprop "$1" "$2" "default" "$3"
				if [ "$4" == "edit" ]; then
					INPUT3=""
					INPUT4=""
					break
				elif [ "$4" == "new" ]; then
					INPUT5=""
					INPUT6=""
					break
				fi
			;;
			n|N)
				if [ "$4" == "edit" ]; then
					INPUT4=""
					break
				elif [ "$4" == "new" ]; then
					INPUT6=""
					break
				fi
			;;
			e|E) exit_fn
			;;
			*)
				if [ "$4" == "edit" ]; then
					invalid_input 3 5
				elif [ "$4" == "new" ]; then
					invalid_input 3 7
				fi
			;;
		esac
	done
}

# ======================== Delete Props ========================
# Second menu level - Delete props, $1=header
menu_delete_props() {
	INPUT2=""
	while true
	do
		if [ -z "$INPUT2" ]; then
			ITEMCOUNT=0
			menu_header "${C}$1${N}\n Select an option below:"
			echo ""
			if [ "$DELEDIT" == 0 ] && [ "$DELETEPROPS" ]; then
				CTRLSET=0
				echo -e "You have a list of ${C}props to delete${N},"
				echo -e "but the option is ${R}not activated${N}."
				echo ""
				echo -e "Do you want to activate it (enter ${G}r${N} to reset)?"
				echo ""
				echo -en "Enter ${G}y${N}(es), ${G}n${N}(o), ${G}r${N}(eset) or ${G}e${N}(xit): "
				read -r INPUT2
			else
				CTRLSET=1
				echo "Delete prop values on your device."
				echo ""
				if [ "$DELETEPROPS" ]; then
					ITEMCOUNT=1
					echo "Select a prop below to reset it."
					echo ""
					for ITEM in $DELETEPROPS; do
						echo -e "${G}$ITEMCOUNT${N} - $ITEM"
						ITEMCOUNT=$(($ITEMCOUNT+1))
					done
				else
					echo "Currently no props set for removal."
					echo "Please add one by selecting"
					echo "\"New prop\" below."
				fi
				echo ""
				echo -e "${G}n${N} - New prop"
				if [ "$CUSTOMPROPS" ]; then
					echo -e "${G}r${N} - Reset all props"
				fi
				echo -e "${G}b${N} - Go back to main menu"
				echo -e "${G}e${N} - Exit"
				echo ""
				echo "See the module readme or the"
				echo "support thread @ XDA for details."
				echo ""
				echo -n "Enter your desired option: "
				read -r INPUT2
			fi
			case "$INPUT2" in
				y|Y)
					if [ "$CTRLSET" == 1 ]; then
						invalid_input 1 2
					elif [ "$CTRLSET" == 0 ]; then
						replace_fn DELEDIT 0 1 $LATEFILE
						INPUT=""
						break
					fi
				;;
				n|N)
					if [ "$CTRLSET" == 1 ]; then
						menu_new_delprop "New prop"
					elif [ "$CTRLSET" == 0 ]; then
						INPUT=""
						break
					fi
				;;
				r|R)
					if [ "$CTRLSET" == 1 ]; then
						menu_reset_all_delprop "Reset all props"
					elif [ "$CTRLSET" == 0 ]; then
						menu_reset_all_delprop "Reset all props"
					fi
				;;
				b|B)
					if [ "$CTRLSET" == 1 ]; then
						INPUT=""
						break
					elif [ "$CTRLSET" == 0 ]; then
						invalid_input 4 2
					fi
				;;
				e|E) exit_fn
				;;
				*)
					if [ "$INPUT2" -ge 1 -a "$INPUT2" -lt "$ITEMCOUNT" ] && [ "$CTRLSET" == 1 ]; then
						ITEMCOUNT=1
						for ITEM in $DELETEPROPS; do
							if [ "$ITEMCOUNT" == "$INPUT2" ]; then
								menu_reset_delprop "$ITEM"
								break
							fi
							ITEMCOUNT=$(($ITEMCOUNT+1))
						done
					else
						if [ "$CTRLSET" == 1 ]; then
							invalid_input 1 2
						elif [ "$CTRLSET" == 0 ]; then
							invalid_input 4 2
						fi
					fi
				;;
			esac
		fi
	done
}

# Third menu level - Reset deleted prop, $1=header/prop name
menu_reset_delprop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo -e "This will remove ${C}$1${N}"
			echo "from the list of props to delete."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				reset_delprop "$1"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - New prop to delete, $1=header
menu_new_delprop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Enter the prop to delete. Example:"
			echo -e "${C}ro.sf.lcd_density${N}"
			echo ""
			echo -e "${G}b${N} - Go back"
			echo -e "${G}e${N} - Exit"
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT3
		fi
		case "$INPUT3" in
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			""|[[:blank:]]*) blank_input 3
			;;
			*)
				menu_set_new_delprop "$INPUT3"
				break
			;;
		esac
	done
}

# Third menu level - Reset all deleted props, $1=header
menu_reset_all_delprop() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will reset the entire"
			echo "list of props to delete."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				reset_all_delprop
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Fourth menu level - Set new prop to delete, $1=header/prop name
menu_set_new_delprop() {
	INPUT4=""
	TMPPROP=$(getprop "$1")
	while true
	do
		if [ -z "$INPUT4" ]; then
			menu_header "${C}$1${N}"
			echo ""
			if [ "$TMPPROP" ]; then
				echo "The current value is:"
				echo -e "${C}$TMPPROP${N}"
				echo ""
				echo "This will delete"
				echo -e "${C}$1${N}"
				echo "from your system."
			else
				echo "This prop doesn't currently exist on your system."
				echo ""
				echo "Nothing to do... Returning to main menu."
				sleep 3
				INPUT2=""
				INPUT3=""
				break
			fi
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				set_delprop "$1"
				INPUT2=""
				INPUT3=""
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 4
			;;
		esac
	done
}

# ======================== Options ========================
# Second menu level - Options, $1=header
menu_options() {
	INPUT2=""
	while true
	do
		COLOURTXT=""
		PRINTSCHKTXT=""
		if [ -z "$INPUT2" ]; then
			if [ "$OPTIONBOOT" == 0 ]; then
				BOOTTXT="system.prop"
			elif [ "$OPTIONBOOT" == 1 ]; then
				BOOTTXT="post-fs-data"
			elif [ "$OPTIONBOOT" == 2 ]; then
				BOOTTXT="late_start service"
			fi
			if [ "$OPTIONCOLOUR" == 1 ]; then
				COLOURTXT="enabled"
				CC=${G}
			else
				COLOURTXT="disabled"
				CC=${R}
			fi
			if [ "$OPTIONWEBP" == 1 ]; then
				PRINTSCHKTXT="enabled"
				CP=${G}
			else
				PRINTSCHKTXT="disabled"
				CP=${R}
			fi
			if [ "$OPTIONWEBU" == 1 ]; then
				MUPDATECHKTXT="enabled"
				CMU=${G}
			else
				MUPDATECHKTXT="disabled"
				CMU=${R}
			fi
			if [ "$OPTIONUPDATE" == 1 ]; then
				PUPDATECHKTXT="enabled"
				CPU=${G}
			else
				PUPDATECHKTXT="disabled"
				CPU=${R}
			fi
			if [ "$OPTIONBACK" == 1 ]; then
				BACKCHKTXT="enabled"
				CB=${G}
			else
				BACKCHKTXT="disabled"
				CB=${R}
			fi
			menu_header "${C}$1${N}\n Select an option below:"
			echo ""
			echo -e "${G}1${N} - Boot stage (currently ${C}${BOOTTXT}${N})"
			echo -e "${G}2${N} - Script colours (currently ${CC}${COLOURTXT}${N})"
			echo -e "${G}3${N} - Automatic module update check (currently ${CMU}${MUPDATECHKTXT}${N})"
			echo -e "${G}4${N} - Automatic update of fingerprints list (currently ${CP}${PRINTSCHKTXT}${N})"
			echo -e "${G}5${N} - Automatic fingerprints update (currently ${CPU}${PUPDATECHKTXT}${N})"
			echo -e "${G}6${N} - Background boot script (currently ${CB}${BACKCHKTXT}${N})"
			echo -e "${G}x${N} - Export settings"
			echo -e "${G}r${N} - Reset all settings"
			if [ "$2" != "s" ]; then
				echo -e "${G}b${N} - Go back to main menu"
			fi
			echo -e "${G}e${N} - Exit"
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT2
		fi
		case "$INPUT2" in
			1) menu_options_bootstage "Boot stage" "$BOOTTXT"
			;;
			2) menu_option_chng "Script colours" "$COLOURTXT" "Script colours are" "OPTIONCOLOUR"
			;;
			3) menu_option_chng "Automatic module update check" "$MUPDATECHKTXT" "Automatic checking for a module update\nis" "OPTIONWEBU"
			;;
			4) menu_option_chng "Automatic update of fingerprints list" "$PRINTSCHKTXT" "Automatic updating of the fingerprints\nlist is" "OPTIONWEBP"
			;;
			5) menu_option_chng "Automatic fingerprints update" "$PUPDATECHKTXT" "Automatic updating of the applied\nfingerprint is" "OPTIONUPDATE"
			;;
			6) menu_option_chng "Background boot script" "$BACKCHKTXT" "Background boot script execution\nis" "OPTIONBACK"
			;;
			x|X) menu_option_export "Export settings"
			;;
			r|R) menu_options_reset "Reset all settings"
			;;
			b|B)
				if [ "$2" == "s" ]; then
					invalid_input 1 2
				else
					INPUT=""
					break
				fi
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 2
			;;
		esac
	done
}

# Third menu level - Options, boot stage, $1=header, $2=Current stage
menu_options_bootstage() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			if [ "$2" == "system.prop" ]; then
				TMPTXT="${C}post-fs-data${N} or ${C}late_start sevice${N}"
				CHOICETXT="${G}p${N}(ost), ${G}l${N}(ate)"
			elif [ "$2" == "post-fs-data" ]; then
				TMPTXT="${C}system.prop${N} or ${C}late_start service${N}"
				CHOICETXT="${G}s${N}(ystem.prop), ${G}l${N}(ate)"
			elif [ "$2" == "late_start service" ]; then
				TMPTXT="${C}system.prop${N} or ${C}post-fs-data${N}"
				CHOICETXT="${G}s${N}(ystem.prop), ${G}p${N}(post)"
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo -e "Current boot stage is ${G}$2${N}."
			echo ""
			echo "Do you want to change it to"
			echo -e "${TMPTXT}?"
			echo ""
			if [ "$2" == "late_start service" ] && [ "$OPTIONSOFTBOOT" == 0 ]; then
				echo -e "Since you have the ${C}late_start service${N}"
				echo -e "boot stage set, you can also ${G}enable${N} a"
				echo "soft reboot at the end of the boot process."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			elif [ "$2" == "late_start service" ] && [ "$OPTIONSOFTBOOT" == 1 ]; then
				echo -e "Soft reboot at the end of the ${C}late_start${N}"
				echo -e "${C}service${N} boot stage is ${G}enabled${N} and can be"
				echo -e "${R}disabled${N}."
				CHOICETXT="${G}r${N}(eboot), $CHOICETXT"
			fi
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -en "Enter $CHOICETXT, ${G}b${N}(ack) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			r|R)
				menu_softboot_option "Soft reboot"
				INPUT2=""
				break
			;;
			s|S)
				if [ "$OPTIONBOOT" != 0 ]; then
					before_change
					OPTNEW=0
					log_handler "Boot stage changed to system.prop."
					replace_fn OPTIONBOOT $OPTIONBOOT $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			p|P)
				if [ "$OPTIONBOOT" != 1 ]; then
					before_change
					OPTNEW=1
					log_handler "Boot stage changed to post-fs-data."
					replace_fn OPTIONBOOT $OPTIONBOOT $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			l|L)
				if [ "$OPTIONBOOT" != 2 ]; then
					before_change
					OPTNEW=2
					log_handler "Boot stage changed to late_start service."
					replace_fn OPTIONBOOT $OPTIONBOOT $OPTNEW $LATEFILE
					# Load module values
					. $LATEFILE
					INPUT2=""
					after_change "$1"
					break
				else
					invalid_input 1 3
				fi
			;;
			b|B)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 3
			;;
		esac
	done
}

# Fourth menu level - Options soft reboot, $1=header
menu_softboot_option() {
	INPUT4=""
	while true
	do
		if [ -z "$INPUT4" ]; then
			if [ "$OPTIONSOFTBOOT" == "1" ]; then
				CURRTXT="${G}enabled${N}"
				TMPTXT="${R}disable${N}"
				LOGTXT="disabled"
				OPTCURR=1
				OPTNEW=0
			else
				CURRTXT="${R}disabled${N}"
				TMPTXT="${R}enable${N}"
				LOGTXT="enabled"
				OPTCURR=0
				OPTNEW=1
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo "Soft reboot for the late_start"
			echo "service boot stage"
			echo -e "is currently ${CURRTXT}."
			echo ""
			echo -e "Do you want to ${TMPTXT} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT4
		fi
		case "$INPUT4" in
			y|Y)
				before_change
				log_handler "Late_start service soft reboot was ${LOGTXT}."
				# Saves new module value
				replace_fn OPTIONSOFTBOOT $OPTCURR $OPTNEW $LATEFILE
				# Load module values
				. $LATEFILE
				INPUT3=""
				after_change "$1"
				break
			;;
			n|N)
				INPUT3=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 4
			;;
		esac
	done
}

# Third menu level - Options, general function, $1=header, $2=is option disabled or enabled, $3=information text
menu_option_chng() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			if [ "$2" == "enabled" ]; then
				TMPTXT="disable"
				OPTCURR=1
				OPTNEW=0
				EXECCURR="background"
				EXECNEW="regular"
			else
				TMPTXT="enable"
				OPTCURR=0
				OPTNEW=1
				EXECCURR="regular"
				EXECNEW="background"
			fi
			menu_header "${C}$1${N}"
			echo ""
			echo -e "$3 currently ${G}$2${N}."
			echo ""
			echo -e "Do you want to ${C}$TMPTXT${N} it?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				log_handler "$1 was ${TMPTXT}d."
				replace_fn $4 $OPTCURR $OPTNEW $LATEFILE
				if [ "$4" == "OPTIONBACK" ]; then
					sed -i -e "s|^{|\#anch${OPTCURR}|;s|^\#anch${OPTNEW}|{|;s|$EXECCURR|$EXECNEW|" $MODPATH/post-fs-data.sh
				fi
				# Load module values
				. $LATEFILE
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Export all settings to a module configuration file, $1=header
menu_option_export() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will will export all settings"
			echo "to a module configuration file."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				export_settings "$1"
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# Third menu level - Options, reset all options, $1=header
menu_options_reset() {
	INPUT3=""
	while true
	do
		if [ -z "$INPUT3" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will reset all script settings"
			echo "to their default values."
			echo ""
			echo "Do you want to continue?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT3
		fi
		case "$INPUT3" in
			y|Y)
				log_handler "Resetting all script settings."
				replace_fn OPTIONBOOT $OPTIONBOOT 0 $LATEFILE
				replace_fn OPTIONCOLOUR $OPTIONCOLOUR 1 $LATEFILE
				replace_fn OPTIONWEBP $OPTIONWEBP 1 $LATEFILE
				replace_fn OPTIONWEBU $OPTIONWEBU 1 $LATEFILE
				replace_fn OPTIONUPDATE $OPTIONUPDATE 1 $LATEFILE
				replace_fn OPTIONBACK $OPTIONBACK 0 $LATEFILE
				# Load module values
				. $LATEFILE
				INPUT2=""
				break
			;;
			n|N)
				INPUT2=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 3 3
			;;
		esac
	done
}

# ======================== Logs ========================
# Second menu level - Logs, $1=header, $2=Run as a command flag or not
menu_logs() {
	INPUT2=""
	while true
	do
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "This will package the Magisk log and the"
			echo "module specific log files, together with"
			echo "all the original and current prop values"
			echo "and save it on your device."
			echo ""
			echo "If you are having issues, please upload"
			echo "the packaged file to the support thread"
			echo "@ XDA, with a detailed description."
			echo ""
			echo "Do you want to contine?"
			echo ""
			if [ "$2" == "l" ]; then
				echo -en "Enter ${G}y${N}(es) or ${G}n${N}(o): "
			else
				echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			fi
			read -r INPUT2
		fi
		case "$INPUT2" in
			y|Y)
				collect_logs "$1" "$2"
				INPUT=""
				break
			;;
			n|N)
				if [ "$2" == "l" ]; then
					exit_fn
				else
					INPUT=""
					break
				fi
			;;
			e|E)
				if [ "$2" == "l" ]; then
					invalid_input 1 2
				else
					exit_fn
				fi
			;;
			*)	invalid_input 1 2
			;;
		esac
	done
}

# ======================== Perform module update check ========================
# Second menu level - Reset all options and settings, $1=header
menu_update_check() {
	INPUT2=""
	while true
	do
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "Do you want to check online if there"
			echo "is an update to module?"
			echo ""
			echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
			read -r INPUT2
		fi
		case "$INPUT2" in
			y|Y)
				update_check "manual"
				INPUT=""
				break
			;;
			n|N)
				INPUT=""
				break
			;;
			e|E) exit_fn
			;;
			*)	invalid_input 1 2
			;;
		esac
	done
}

# ======================== Reset all options and settings ========================
# Second menu level - Reset all options and settings, $1=header, $2=Run as a command flag or not
reset_everything() {
	INPUT2=""
	while true
	do
		if [ -z "$INPUT2" ]; then
			menu_header "${C}$1${N}"
			echo ""
			echo "All module options and settings"
			echo "will be reset to the default values."
			echo ""
			echo "Do you want to continue?"
			echo ""
			if [ "$2" == "r" ]; then
				echo -en "Enter ${G}y${N}(es) or ${G}n${N}(o): "
				LOGTXT=" (option -r)"
				INV1=2
				INV2=1
			else
				echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): "
				LOGTXT=""
				INV1=3
				INV2=2
			fi
			read -r INPUT2
		fi
		case "$INPUT2" in
			y|Y)
				log_handler "Resetting all module settings$LOGTXT."
				reset_fn "$1" "$2"
				INPUT=""
				break
			;;
			n|N)
				if [ "$2" == "r" ]; then
					exit_fn
				else
					INPUT=""
					break
				fi
			;;
			e|E)
				if [ "$2" == "r" ]; then
					invalid_input $INV1 $INV2
				else
					exit_fn
				fi
			;;
			*)	invalid_input $INV1 $INV2
			;;
		esac
	done
}

# ====================================================
# =================== Script check ===================
# ====================================================

ISSUECHK=0
if [ "$ISSUECHK" == 0 ] && [ ! -f "$LATEFILE" ]; then
	log_handler "The module settings file can't be found."
	ISSUECHK=1
	ISSUETXT="The module settings file can't be found.\n\n Please reboot your device to reset."
fi

# Load module settings
all_values

orig_check
if  [ "$ISSUECHK" == 0 ] && [ "$ORIGLOAD" == 0 ]; then
	log_handler "Original prop values are not loaded in late_start service boot script."
	ISSUECHK=1
	ISSUETXT="The original prop values are not loaded,\n possibly due to a full reset of the module,\n or something has gone wrong.\n\n Please reboot your device to reset."
fi

script_ran_check
if [ "$ISSUECHK" == 0 ] && [ "$POSTCHECK" == 0 ] && [ "$LATECHECK" == 0 ]; then
	log_handler "None of the module scripts ran during boot."
	ISSUECHK=1
	ISSUETXT="None of the module scripts appear\n to have run during boot.\n\n This means the module won't work.\n\n Please reboot your device and see if\n they do run."
elif [ "$ISSUECHK" == 0 ] && [ "$POSTCHECK" == 0 ]; then
	log_handler "The post-fs-data.sh module script did not run during boot."
	ISSUECHK=1
	ISSUETXT="The post-fs-data.sh module script does not\n appear to have run during boot.\n\n This means the module won't work.\n\n Please reboot your device and see if\n it does run."
elif [ "$ISSUECHK" == 0 ] && [ "$LATECHECK" == 0 ]; then
	log_handler "The service.sh module script did not run during boot."
	ISSUECHK=1
	ISSUETXT="The service.sh module script does not\n appear to have run during boot.\n\n This means the module won't work.\n\n Please reboot your device and see if\n it does run."
fi

if [ "$ISSUECHK" == 1 ] && [ "$1" != "-s" ]; then
	collect_logs "issue"
	reboot_fn "${ISSUETXT}\n\n Things to try:\n Disable other modules.\n (Cloudflare and EdXposed are known examples)\n Change boot stage settings or background\n execution for the boot script\n (run the props\n command with the -s option).\n\n If the issue persists after a reboot,\n please report the issue, ${R}with logs!${C}\n\n Logs have automatically been saved\n to your internal storage\n ${R}(propslogs.tar.gz)${C}.\n\n If the automatic collection failed,\n please collect the logs manually.\n\n ${G}See the documentation for further details.${N}" "reset-script"
fi

# ====================================================
# =================== Options, etc ===================
# ====================================================

# Testing connection
test_connection "$1"

if [ "$1" ]; then
	invalid_option() {
		log_handler "Invalid option."
		clear
		menu_header "${C}Help${N}"
		echo ""
		echo -e "${R}Invalid option.${N}"
		echo ""
		echo "Try again without options,"
		echo "or use -h for help and details."
		echo ""
		log_handler "Exiting... Bye bye.\n\n===================="
		exit 0
	}

	# Check for second input variable. If found, set custom prop
	if [ "$2" ]; then
		log_handler "Setting custom prop from command prompt."
		clear
		menu_set_custprop "$1" "$2" "$(getprop $1)" "option"
		clear
		echo "Done."
		echo ""
		log_handler "Exiting... Bye bye.\n\n===================="
		exit 0
	else
		case "$1" in
			*\.*|*\=*) invalid_option
			;;
			*d*|*f*|*l*|*h*|*nc*|*nw*|*r*|*s*|*t*|*u*) # Do nothing
			;;
			*) invalid_option
			;;
		esac
	fi

	# Check non-combinable options
	for ITEM1 in $SOLORUN; do
		case "$1" in
			*$ITEM1*)
				for ITEM2 in $SOLORUN; do
					if [ "$ITEM1" != "$ITEM2" ]; then
						case "$1" in
							*$ITEM2*)
								invalid_option
							;;
						esac
					fi
				done
			;;
		esac
	done

	# Help menu
	case "$1" in
		-h)
			log_handler "Showing help (-h)."
			clear
			menu_header "${C}Help${N}"
			echo ""
			echo -e $(echo $(get_file_value $MODPATH/module.prop "description=") | sed 's|, |,\\n|g' | sed 's|\. |\.\\n|g')
			echo ""
			echo "Usage: props NAME VALUE"
			echo "   or: props [options]..."
			echo ""
			echo "Entering a property NAME and VALUE will save"
			echo "this information to the module settings as custom"
			echo "prop values."
			echo ""
			echo "Options:"
			echo "  -d		*Update to fingerprints test list during start."
			echo "  -f		*Update fingerprints list during start."
			echo "  -l		*Save module logs and info."
			echo "  -h		*Show this message."
			echo "  -nc		Run without colours."
			echo "  -nw		Run without connecting to the web during start."
			echo "  -r		*Reset all options/settings."
			echo "  -s		*Open script settings menu."
			echo "  -t		Activate test mode."
			echo "  -u		*Perform a module update check during start."
			echo ""
			echo "Options marked with an asterisk (*) cannot be"
			echo "combined with each other."
			echo ""
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			log_handler "Exiting... Bye bye.\n\n===================="
			exit 0
		;;
	esac

	# Run options
	case "$1" in
		*d*) # Download developers prints list, for testing prints
			download_prints "Dev" "$1"
		;;
		*f*) # Update fingerprints list
			download_prints "f" "$1"
		;;
		*l*) # Save logs
			menu_logs "Collect logs" "l"
		;;
		*r*) # Reset all settings
			reset_everything "Reset all settings" "r"
		;;
		*s*) # Open settings menu
			menu_options "Script settings" "s"
		;;
		*u*) # Perform an update check
			update_check "" "$1"
		;;
	esac
fi

# Download fingerprints list and perform a module update check, if enabled
if [ "$OPTIONWEBP" == 1 ] || [ "$OPTIONWEBU" == 1 ]; then
	case "$1" in
		*d*|*f*|*u*)
			case "$1" in
				*d*|*f*) # Don't download prints
					if [ "$OPTIONWEBU" == 1 ]; then
						update_check "" "$1"
					fi
				;;
				*u*) # Don't perform the update check
					if [ "$OPTIONWEBP" == 1 ]; then
						download_prints "" "$1"
					fi
				;;
			esac
		;;
		*)
			if [ "$OPTIONWEBP" == 1 ]; then
				download_prints "" "$1"
			fi
			if [ "$OPTIONWEBU" == 1 ]; then
				update_check "" "$1"
			fi
		;;
	esac
fi

# Check if fingerprints testing is active
if [ "$(get_file_value $PRINTSLOC "PRINTSV=")" == "Dev" ]; then
	DEVPRINTS=true
fi

# ===================================================
# ==================== Main menu ====================
# ===================================================

while true
do
	orig_check
	if [ "$ORIGLOAD" == 0 ]; then
		log_handler "Original values are not loaded in propsconf_late. Attempting to fix..."
		log_handler "Saving device default values."
		default_save
		log_handler "Default values saved to $LATEFILE."
		orig_check
		if [ "$ORIGLOAD" == 0 ]; then
			reboot_fn "The original prop values are not loaded,\n possibly due to a full reset of the module.\n\n Please reboot your device to reset." "reset-script"
		fi
	else
		if [ "$DEVPRINTS" == "true" ]; then
			INPUT=1
		else
			INPUT=""
		fi
		ACTIVE="${G} (active)${N}"
		DISABLED="${R} (disabled)${N}"
		PRINTTXT=""
		BASICTXT=""
		DEVTXT=""
		FILETXT=""
		PROPTXT=""
		CUSTTXT=""
		DELTXT=""
		if [ -z "$INPUT" ]; then
			if [ "$FINGERPRINTENB" == 0 ]; then
				PRINTTXT=$DISABLED
			elif [ "$PRINTEDIT" == 1 ]; then
				PRINTTXT=$ACTIVE
			fi
			if [ "$BASICATTEST" == 1 ]; then
				BASICTXT=$ACTIVE
			fi
			if [ "$FINGERPRINTENB" == 0 ] || [ "$PRINTEDIT" == 0 ]; then
				DEVTXT=$DISABLED
			elif [ "$DEVSIM" == 1 ] && [ "$BRANDSET" == 1 ] || [ "$NAMESET" == 1 ] || [ "$DEVICESET" == 1 ] || [ "$RELEASESET" == 1 ] || [ "$IDSET" == 1 ] || [ "$INCREMENTALSET" == 1 ] || [ "$SDKSET" == 1 ] || [ "$DISPLAYSET" == 1 ]; then
				DEVTXT=$ACTIVE
			fi
			if [ "$PROPEDIT" == 1 ]; then
				ITEMCOUNT=0
				magiskhide_props_menu "$PROPSLIST" "" "count"
				magiskhide_props_menu "$TRIGGERPROPS" "trigger" "count"
				magiskhide_props_menu "$LATEPROPS" "late" "count"
				if [ "$ITEMCOUNT" != 0 ]; then
					PROPTXT=$ACTIVE
				fi
			fi
			if [ "$CUSTOMEDIT" == 1 ]; then
				CUSTTXT=$ACTIVE
			fi
			if [ "$DELEDIT" == 1 ]; then
				DELTXT=$ACTIVE
			fi
			menu_header "Select an option below."
			echo ""
			if [ "$UPDATECHECK" ]; then
				echo -e "${C}$UPDATECHECK${N}"
				echo ""
				if [ "$UPDATECHECK" == "No update available." ]; then
					UPDATECHECK=""
				fi
			fi
			echo -e "${G}1${N} - Edit device fingerprint${PRINTTXT}"
			echo -e "${G}2${N} - Force BASIC key attestation${BASICTXT}" # Google once again changed their SN checks. This is no longer viable. Will remove completely in future.
			echo -e "${G}3${N} - Device simulation${DEVTXT}"
			echo -e "${G}4${N} - Edit MagiskHide props${PROPTXT}"
			echo -e "${G}5${N} - Add/edit custom props${CUSTTXT}"
			echo -e "${G}6${N} - Delete prop values${DELTXT}"
			echo -e "${G}7${N} - Script settings"
			echo -e "${G}8${N} - Collect logs"
			if [ -z "$UPDATECHECK" ]; then
				echo -e "${G}u${N} - Perform module update check"
			fi
			echo -e "${G}r${N} - Reset all options/settings"
			echo -e "${G}b${N} - Reboot device"
			echo -e "${G}e${N} - Exit"
			echo ""
			if [ "$REBOOTCHK" == 1 ]; then
				echo -e "${R}Some options/settings have been changed.${N}"
				echo -e "${R}Please reboot for them to take affect.${N}"
				echo ""
			fi
			if [ "$PRINTCHK" == 1 ]; then
				echo -e "${R}The device fingerprint has been updated.${N}"
				echo -e "${R}Please reboot to apply.${N}"
				echo ""
			fi
			echo "See the module readme or the"
			echo "support thread @ XDA for details."
			echo ""
			echo -n "Enter your desired option: "
			read -r INPUT
		fi
		case "$INPUT" in
			1) menu_change_fingerprint "Edit device fingerprint${PRINTTXT}" $CURRFINGERPRINT $ORIGFINGERPRINT $MODULEFINGERPRINT
			;;
			2) menu_force_basic "Force BASIC key attestation${BASICTXT}" # Google once again changed their SN checks. This is no longer viable. Will remove completely in future.
			;;
			3) menu_dev_sim "Device simulation${DEVTXT}"
			;;
			4) menu_magiskhide_props "MagiskHide props${PROPTXT}"
			;;
			5) menu_custom_props "Custom props${CUSTTXT}"
			;;
			6) menu_delete_props "Delete props${DELTXT}"
			;;
			7) menu_options "Script settings"
			;;
			8) menu_logs "Collect logs"
			;;
			u|U)
				if [ -z "$UPDATECHECK" ]; then
					menu_update_check "Perform module update check"
				else
					invalid_input 1 1
				fi
			;;
			r|R) reset_everything "Reset all options/settings"
			;;
			b|B) reboot_fn "Reboot device" "reboot"
			;;
			e|E) exit_fn
			;;
			*) invalid_input 1 1
			;;
		esac
	fi
done
