#!/bin/bash

CPUS(){
	nproc
}
clean(){
	_clean
}
_nl(){
	printf "$rs_\n"
}
_set_dialog_types(){
	gui="$(type -pf dialog)"
	st_="--stdout"
	ib_="--infobox"
	ip_="--inputbox"
	nc_="--no-cancel"
	cl_="--checklist"
	rl_="--radiolist"
	bt_="--backtitle"
	pb_="--progressbox"
	title_="SIMPLEBUILD3 (${SIMPLEVERSION}.${VERSIONCOUNTER}) - in memory of gorgone -"
}
cedit(){
	s3cfg_menu
	bye
}
counter(){
	COUNT="$((COUNT+1))"
}
timer_calc(){
	Tcalc="$((Te-Ts))"
}
timer_stop(){
	Te="$(date +%s)"
}
timer_start(){
	Ts="$(date +%s)"
}
decode(){
	eval printf $(printf "$1" | base64 -d)
}
get_module_name(){
	printf "${INTERNAL_MODULES[$1]}"
}
gitrevision(){
	if echo "$1" | grep -qocP '^(https?|git@.*)://\S+'
	then
		git ls-remote $1 2>/dev/null | head -1 | awk '{print substr($1, 1, 7)}' || echo 0
	else
		git -C $1 rev-parse --short HEAD 2>/dev/null || echo 0
	fi
}
_wait(){
	printf "$w_l\n"
	read -n1 -r -p "  $txt_help3" key
	tput cuu1
	printf '                                          '
}
_systype(){
	systype="bad"
	case "$(uname -m)" in
		x86|x86_64|amd64|i686)
			systype="ok";;
	esac
}
_pcsc_on(){
	sed -i 's@^//#define CARDREADER_PCSC 1@#define CARDREADER_PCSC 1@g' "${repodir}/config.h"
}
_pcsc_off(){
	sed -i 's@^#define CARDREADER_PCSC 1@//#define CARDREADER_PCSC 1@g' "${repodir}/config.h"
}
_stapi5_on(){
	sed -i 's@^//#define CARDREADER_STAPI5 1@#define CARDREADER_STAPI5 1@g' "${repodir}/config.h"
}
_stapi5_off(){
	sed -i 's@^#define CARDREADER_STAPI5 1@//#define CARDREADER_STAPI5 1@g' "${repodir}/config.h"
}
_generate_oscam_name(){
	cd "${repodir}";_dvbapi=$(
	[ "$(./config.sh --enabled HAVE_DVBAPI)" == Y ] && echo -dvbapi || printf ''; );_dvbapi=$(
	[ "$(./config.sh --enabled CARDREADER_GXAPI)" == Y ] && echo -gxapi || echo -n $_dvbapi; );_webif=$(
	[ "$(./config.sh --enabled WEBIF)" == Y ] && echo -webif || printf ''; );_ssl=$(
	[ "$(./config.sh --enabled WITH_SSL)" == Y ] && echo -ssl || printf ''; );_emu=$(
	[ "$(./config.sh --enabled WITH_EMU)" == Y ] && echo -emu$(./config.sh --emu-version) || printf ''; );_neon=$(
	[ "$(./config.sh --enabled WITH_ARM_NEON)" == Y ] && "$tcdir/$_toolchainname/bin/$_compiler""gcc" -dumpmachine 2>/dev/null | grep -i -E '(arm|aarch64)' &>/dev/null && echo -neon || printf ''; );_icam=$(
	[ "$(./config.sh --enabled MODULE_STREAMRELAY)" == Y ] && echo -icam || printf ''; );_ipv6=$(
	[ "$(./config.sh --enabled IPV6SUPPORT)" == Y ] && echo -ipv6 || printf ''; )
	[ "${USE_vars[USE_COMPRESS]}" == "USE_COMPRESS=1" ] && _upx="-upx" || _upx=''
	[ "$1" == "native" ] && _b_name="$(uname -s)-$(uname -m)" || _b_name="$1"
	if [ "${s3cfg_vars[ADD_PROFILE_NAME]}" == "0" ] || [ $pf_name == "not_set" ]
	then
		oscam_name="oscam-${REPO}$(REVISION)$($(USEGIT) && printf "@$(COMMIT)" || printf "")-$_b_name$_webif$_dvbapi$_ssl$_usb$_pcsc$_dvbcsa$_stapi$_stapi5$_emu$_ipv6$_icam$_neon$_upx"
	else
		oscam_name="oscam-${REPO}$(REVISION)$($(USEGIT) && printf "@$(COMMIT)" || printf "")-${pf_name%.*}";
	fi
}
e_readers(){
	silent=$("${repodir}/config.sh" -s readers)
	echo ${silent//READER_/}
}
e_protocols() {
	silent=$("${repodir}/config.sh" -s protocols)
	echo ${silent//MODULE_/}
}
e_card_readers(){
	silent=$("${repodir}/config.sh" -s card_readers)
	echo ${silent//CARDREADER_/}
}
e_addons(){
	"${repodir}/config.sh" -s addons |sed 's/WEBIF_//g;s/WITH_//g;s/MODULE_//g;s/CS_//g;s/HAVE_//g;s/_CHARSETS//g;s/CW_CYCLE_CHECK/CWCC/g;s/SUPPORT//g'
}
sysinfo(){
	printf "$g_l\nSYSTEM$w_l\n"
	system_info=$(type -pf lsb_release)
	[ ${#system_info} -ge 11 ] && lsb_release -irc
	printf "Uptime:\t\t$(uptime -p)\n"
	printf "$g_l\nMEMORY$w_l\n"
	free -mht | awk '/Mem/{print "Memory:\t\tTotal: " $2 "Mb\tUsed: " $3 "Mb\tFree: " $4 "Mb"} /Swap/{print "Swap:\t\tTotal: " $2 "Mb\tUsed: " $3 "Mb\tFree: " $4 "Mb" }'
	[ -f /sys/dev/block ] && lsblk
	printf "$g_l\n CPU$w_l\n"
	cpu_info=$(type -pf lscpu)
	[ ${#cpu_info} -ge 5 ] && lscpu | grep -iE 'model name|vendor id|Architecture|per socket|MHz'
	printf "$g_l\nNetwork\n"
	printf "$w_l""Hostname:\t$HOSTNAME\n"
	ip -o addr | awk '/inet /{print "IP (" $2 "):\t" $4}'
	ip route | awk '/default/ { printf "Gateway:\t"$3"\n" }'
	awk '/^nameserver/{ printf "Name Server:\t" $2 "\n"}' /etc/resolv.conf
	printf "$re_\n"
	exit
}
_pget(){
	url="$(decode "$_toolchainfilename")"
	tc_dl="$dldir/$(basename $url)"
	[ -f "$tc_dl" ] && rm -rf "$tc_dl"
	cd "$dldir"
	zeile=$(expr 12+$zzusatz)
	spalte=$(expr 17+$szusatz)
tput sc
	wget -N -q --show-progress --progress=dot "$url" 2>&1 |
	awk '{ printf "\033["'$zeile'";"'$spalte'"H\033[K%-4s ", $7; } { printf "'"$txt_wait >"'";} { printf " %-6s",$9; }'
tput rc
	echo -e " 100%                                     "
}
_clean(){
	[ -L "$workdir/lastbuild.log" ] && rm -rf "$workdir/lastbuild.log"
	[ -L "$workdir/lastpatch.log" ] && rm -rf "$workdir/lastpatch.log"
	clear
	printf "$w_l"
	ologo
	for e in "$menudir" "$bdir" "$ldir" "$tcdir"
	do
		printf "  $r_l$txt_delete$w_l\t$e\n"| sed "s@$workdir@@g"
	done
	rm -rf "$menudir" "$bdir" "$ldir" "$tcdir" 2>/dev/null
	for e in "$menudir" "$bdir" "$ldir" "$tcdir"
	do
		printf "  $g_l$txt_create$w_l\t$e\n"| sed "s@$workdir@@g"
	done
	mkdir -p "$menudir" "$bdir" "$ldir" "$tcdir" 2>/dev/null
	sleep 2
	reporestore
	_nl
}
_sz(){
	lmin=24
	lmax=40
	_lin=$(tput lines)
	cmin=79
	cmax=200
	_col=$(tput cols)
	if [ "$_lin" -gt "$lmin" ]
	then
		if [ "$_lin" -lt "$lmax" ] || [ "$_lin" -eq "$lmax" ]
		then
			_lines="$((_lin-6))"
		fi
		if [ "$_lin" -gt "$lmax" ]
		then
			_lines="$((lmax-6))"
		fi
	fi
	if [ "$_col" -gt "$cmin" ]
	then
		if [ "$_col" -lt "$cmax" ] || [ "$_col" -eq "$cmax" ]
		then
			_cols="$((_col-6))"
		fi
		if [ "$_col" -gt "$cmax" ]
		then
			_cols="$((cmax-6))"
		fi
	fi
}
save_master(){
	[ -f "${repodir}/config.sh" ] && cp -f "${repodir}/config.sh" "$configdir/config.sh.master"
	[ -f "${repodir}/Makefile" ] && cp -f "${repodir}/Makefile" "$configdir/Makefile.master"
}
_pre_build(){
	_oscamconfdir_default=""
	_oscamconfdir_custom=""
	_extract_strip="0"
	source "$tccfgdir/$1"
	clear
	_nl
	printf $WH
	ologo
	_tcfile=""
	[ -n "$_toolchainfilename" ] && dln="$(basename $(decode "$_toolchainfilename"))" || dln=""
	tc_dl="$dldir/$dln"
	if [ -f "$tcdir/$_toolchainname/bin/$_compiler""gcc" ]
	then
		if [ "$run" == "0" ]
		then
			printf "$w_l   toolchain :$y_l $_toolchainname\n"
			printf "$w_l      status :$g_l compiler $txt_found \n"
			printf "$w_l    compiler :$p_l $_compiler""gcc\n"
		else
			printf "$w_l   toolchain :$y_l $_toolchainname      \n"
			printf "$w_l     recheck :$g_l ok $txt_now compiler $txt_found\n"
			printf "$w_l    compiler :$p_l $_compiler""gcc      \n"
		fi
	else
		[ "$run" == "1" ] && echo "$txt_error : build not possible\n" && exit
		_nl
		printf "$w_l     toolchain :$y_l $_toolchainname   \n"
		printf "$w_l        status :$r_l compiler $txt_not_found\n"
		printf "$w_l   backupcheck : "
		if [ -f "$dldir/$dln" ]
		then
			printf  "$g_l$dln $txt_found\n"
			printf "$w_l    $txt_extracting :$y_l $txt_wait"
			_console_extract_toolchain
			sleep 1
			run=1
		else
			printf  "$r_l$dln $txt_not_found \n"
			printf "$w_l      $txt_loading :$g_l"
			zzusatz=0
			szusatz=1
			_pget
			printf "$w_l    $txt_extracting :$y_l $txt_wait"
			_console_extract_toolchain
			sleep 1
			run=1
		fi
		_pre_build "$1"
	fi
	_cmd_build "$_toolchainname"
}
_init_menu(){
	IFS="#"
	COUNT=0
	MENU_OPTIONS="BACK#$txt_back#"
	MENU_OPTIONS_GEN=""
	MENU_OPTIONS_STD=""
	counter
}
_select_menu(){
	revision_="$($(USEGIT) && printf "$(COMMIT)" || printf "r$(REVISION)")"
	_menutext="Simplebuild3 ${SIMPLEVERSION}.${VERSIONCOUNTER} by Gorgone, WXbet"
	smenu=$(
	"$gui" "$st_" "$bt_" "$title_" "$nc_" --title "-[ $txt_start_menu ]-" --menu "\n $_menutext" 14 55 7 "Continue" "$txt_firstmenu_continue $revision_" "CHANGE" "$txt_firstmenu_chose" "CEDIT" "$txt_firstmenu_cedit" "TCUPDATE" "$txt_firstmenu_tcupdate" "LANG" "$txt_firstmenu_lang" "EXIT" "$txt_firstmenu_exit")
	[ $? = 255 ] && _select_menu

	case $smenu in
		Continue)
					if [ ! -f "${repodir}/config.sh" ]
					then
						"$gui" "$st_" "$bt_" "$title_" --infobox "\n  $txt_no oscam-${REPO} $txt_found" 5 35
						sleep 2
						_select_menu
					else
						_toolchain_main_menu
					fi;;
		CHANGE)
					if $(USEGIT)
					then
						_rev=$("$gui" "$st_" "$nc_" --cr-wrap "$ip_" "Commit: at least 8 digits \nCommit: 0 = $txt_latest" 9 35 0)
					else
						new_rev=$("$gui" "$st_" "$nc_" --cr-wrap "$ip_" "Revision: 7000+ \nRevision: 0 = $txt_latest" 9 35 0)
						[[ $new_rev =~ ^-?[0-9]+$ ]] && [ ! "$new_rev" -le "7000" ] && _rev="$new_rev" || _rev=0
					fi
					[ ! -z "$_rev" ] && check_url "$trunkurl" && _dialog_checkout1 "$_rev"
					_select_menu;;
		CEDIT)
					s3cfg_menu
					_select_menu;;
		TCUPDATE)
					tcupdate "" "" "" "1"
					_select_menu;;
		LANG)
					lang_select
					cd "$workdir"
					./s3 menu;;
		EXIT)
					bye;;
	esac
exit
}
_oscam_extra_menu(){
	uv=
	check_smargo
	unset MENU_OPTIONS

	for e in "${!USE_vars[@]}"
	do
		if [ ! "$e" == "USE_TARGZ" ] && [ ! "$e" == "USE_COMPRESS" ] && [ ! "$e" == "USE_PATCH" ] && [ ! "$e" == "USE_LIBUSB" ] && [ ! "$e" == "USE_EXTRA" ] && \
		   [ ! "$e" == "USE_STATIC" ] && [ ! "$e" == "STATIC_LIBCRYPTO" ] && [ ! "$e" == "STATIC_SSL" ] && [ ! "$e" == "STATIC_LIBUSB" ] && [ ! "$e" == "STATIC_PCSC" ] && [ ! "$e" == "STATIC_LIBDVBCSA" ]
		then
			if [ "${#USE_vars[$e]}" -gt "4" ]
			then
				MENU_OPTIONS+=( "$e" "$e" on )
			else
				MENU_OPTIONS+=( "$e" "$e" off )
			fi
		fi
	done

	oextra=$("$gui" "$st_" "$nc_" "$bt_" "$title_" --title "-[ Oscam EXTRA ]-" "$cl_" " OPTIONS " 19 40 12 ${MENU_OPTIONS[@]});
	[ $? = 255 ] && _toolchain_config_menu

	for e in "${!USE_vars[@]}"
	do
		if [ ! "$e" == "USE_TARGZ" ] && [ ! "$e" == "USE_COMPRESS" ] && [ ! "$e" == "USE_PATCH" ] && [ ! "$e" == "USE_LIBUSB" ] && [ ! "$e" == "USE_EXTRA" ] && \
		   [ ! "$e" == "USE_STATIC" ] && [ ! "$e" == "STATIC_LIBCRYPTO" ] && [ ! "$e" == "STATIC_SSL" ] && [ ! "$e" == "STATIC_LIBUSB" ] && [ ! "$e" == "STATIC_PCSC" ] && [ ! "$e" == "STATIC_LIBDVBCSA" ]
		then
			ok=0
			for oex in $oextra
			do
				o=$(echo "$oex" | tr -d '"')
				[ "$e" == "$o" ] && ok=1
			done
			if [ "$ok" == "1" ]
			then
				USE_vars[$e]="$e=1"
			else
				USE_vars[$e]=
			fi
		fi
	done

	[ "${USE_vars[USE_PCSC]}" == "USE_PCSC=1" ] && _pcsc_on
	[ ! "${USE_vars[USE_PCSC]}" == "USE_PCSC=1" ] && _pcsc_off
	save_config
	_toolchain_config_menu
}
_build_extra_menu(){
	us=
	check_smargo
	unset MENU_OPTIONS
	for e in USE_COMPRESS USE_TARGZ USE_PATCH USE_EXTRA USE_STATIC STATIC_LIBCRYPTO STATIC_SSL STATIC_LIBUSB STATIC_PCSC STATIC_LIBDVBCSA
	do
		[ "${#USE_vars[$e]}" -gt "4" ] && MENU_OPTIONS+=( "$e" "$e=1" on ) || MENU_OPTIONS+=( "$e" "$e=1" off )
	done
	bextra=$("$gui" "$st_" "$nc_" "$bt_" "$title_" --title "-[ Build EXTRA ]-" "$cl_" " OPTIONS " 17 45 3 ${MENU_OPTIONS[@]})
	[ $? = 255 ] && _build_extra_menu
	USE_vars[USE_COMPRESS]=
	USE_vars[USE_PATCH]=
	USE_vars[USE_TARGZ]=
	USE_vars[USE_EXTRA]=
	USE_vars[USE_STATIC]=
	USE_vars[STATIC_LIBCRYPTO]=
	USE_vars[STATIC_SSL]=
	USE_vars[STATIC_LIBUSB]=
	USE_vars[STATIC_PCSC]=
	USE_vars[STATIC_LIBDVBCSA]=
	for bex in $bextra
	do
		b=$(echo "$bex" | tr -d '"')
		USE_vars[$b]="$b=1"
	done
	save_config
	_toolchain_config_menu
}
_pre_main_menu(){
	IFS="#"
	COUNT=0
	MENU_OPTIONS="EXIT#$txt_menu_builder1#"
	counter
	MENU_OPTIONS=${MENU_OPTIONS}"ADD#$txt_menu_builder2#"
	counter

	if [ "$tcempty" == "0" ]
	then
		MENU_OPTIONS="${MENU_OPTIONS}REMOVE#$txt_menu_builder3#"
		counter
	fi

	MENU_OPTIONS="${MENU_OPTIONS}NATIVE#$txt_menu_builder4$native#"
	counter
	_a=$(uname -m)

	if [ "$systype" == "ok" ]
	then
		if [ "$tcempty" == "0" ]
		then
			for i in "${INST_TCLIST[@]}"
			do
				source "$tccfgdir/$i"
				MENU_OPTIONS="${MENU_OPTIONS}$_toolchainname#$_description#"
				counter
			done
		fi
	fi

	out=$("$gui" --help-button --help-label INFO --title "-[ Toolchain Menu ${SIMPLEVERSION}.${VERSIONCOUNTER} ]-" --menu "$txt_t_menu1$REVISION" "${COUNT+8}" 75 0 "${MENU_OPTIONS}")
	IFS=$OIFS
	first=$(echo "$out" | awk '{printf $1}')
	tc_info=$(echo "$out" | awk '{printf $2}')

	if [ "$first" == "HELP" ]
	then
		if [ -f "$tccfgdir/$(echo "$out" | awk '{printf $2}')" ]
		then
			source "$tccfgdir/$tc_info"
			printf "\n\n\tinfobox $_tc_info"
			sleep 4
		fi
	fi
	if [ "$first" == "EXIT" ]
	then
		bye
	else
		toolchain_main_menu;
	fi
}
tedit(){
	clear
	if [ -f "$tccfgdir/$1" ]
	then
		source "$tccfgdir/$1"
		printf  $y_l
		slogo;
		printf  "$p_l change CONF_DIR for $c_l$_toolchainname$w_l\n"
		printf  "$w_l    current =$c_l $_oscamconfdir_custom\n"
		printf  "$w_l    default =$c_l $_oscamconfdir_default\n"
		printf "$w_l  Enter new =$w_l "
		read name
		printf      "        now =$y_l CONF_DIR=$name$re_\n"
		sed -i s@^_oscamconfdir_custom.*@_oscamconfdir_custom=\"$name\"@ "$tccfgdir/$_toolchainname"
	fi
}
_gtedit(){
	if [ -f "$tccfgdir/$_toolchainname" ]
	then
		source "$tccfgdir/$_toolchainname"
		input=$("$gui" "$st_" "$bt_" "$title_" --title " -[ $1 Toolchain ]- " --inputbox "\n CONF_DIR=$_oscamconfdir_default 'default'\n [ESC] = default\n" 0 0 "$_oscamconfdir_custom")
		retval=$?

		case $retval in
			0)
				confdir="$input";;
			1)
				confdir="$_oscamconfdir_custom";;
			255)
				confdir="$_oscamconfdir_default";;
		esac

		sed -i s@^_oscamconfdir_custom.*@_oscamconfdir_custom=\"$confdir\"@ "$tccfgdir/$_toolchainname"
		source "$tccfgdir/$_toolchainname"
	fi
}
check_smargo(){
	if [ -f "${repodir}/config.sh" ]
	then
		if [ "$("${repodir}/config.sh" --enabled CARDREADER_SMARGO)" == "Y" ]
		then
			USE_vars[USE_LIBUSB]="USE_LIBUSB=1"
		else
			USE_vars[USE_LIBUSB]=
		fi
	fi
}
check_streamrelay(){
	if [ -f "${repodir}/config.sh" ]
	then
		if [ "$("${repodir}/config.sh" --enabled MODULE_STREAMRELAY)" == "Y" ]
		then
			USE_vars[USE_LIBDVBCSA]="USE_LIBDVBCSA=1"
		else
			USE_vars[USE_LIBDVBCSA]=
		fi
	fi
}
_reset_config(){
	if [ -f "${repodir}/config.sh" ]
	then
		[ -f "$menudir/$_toolchainname.save" ] && rm -rf "$menudir/$_toolchainname.save"
		if [ ! -f "$workdir/${REPO^^}-IS-PATCHED" ]
		then
			reset_="$("${repodir}/config.sh" -R)"
		fi
	else
		_select_menu
	fi
}
_get_config_menu(){
	tmp="$(mktemp)"
	while read -r _l;
	do
		c=$(echo "$_l" | tr -cd \" | wc -c)
		_c=$((_c + c))
		[ ${_c} -lt 11 ] && printf "$_l" >>"$tmp"
		[ ${_c} -eq 10 ] && break
	done <"${repodir}/config.sh"
	mk="$(grep '^   USE_' "${repodir}/Makefile" |sort -u|awk '{print $1}')"
	for e in $mk
	do
		USE_vars[${e:0:-2}]=
	done;
	check_smargo
	source "$tmp"
	rm -rf "$tmp"
}
read_s3cfg(){
	if [ -f "$s3cfg" ]
	then
		while read l
		do
			s3cfg_vars[$(echo "$l"| awk -F'=' '{print $1}')]=$(echo "$l"| awk -F'=' '{print $2}')
		done < "$s3cfg"
	fi
}
s3cfg_menu(){
	unset CFG_MENU
	declare -a CFG_MENU
	old_IFS=$IFS
	COUNT=0
	found=""

	for e in "${!s3cfg_vars[@]}"
	do
		CFG_MENU+="$e#on/off#$([ "${s3cfg_vars[$e]}" -gt "0" ] && echo on || echo off)#"
		counter
	done

	IFS="#"
	erg=$("$gui" "$st_" "$bt_" "$title_" "$cl_" "enable/disable options" 16 45 10 ${CFG_MENU[@]})
	IFS=$old_IFS

	for e1 in "${!s3cfg_vars[@]}"
	do
		for e2 in $erg
		do
			found="0"
			if [ "$e1" == "${e2//\'}" ]
			then
				found="1"
				break
			fi
		done
		if [ "$found" == "1" ]
		then
			s3cfg_vars[$e1]=1
		else
			s3cfg_vars[$e1]=0
		fi
	done

	write_s3cfg
}
write_s3cfg(){
	[ -f "$s3cfg" ] && rm -rf "$s3cfg"
	for e in "${!s3cfg_vars[@]}"
	do
		echo "$e=${s3cfg_vars[${e}]}" >>"$s3cfg"
	done
}
_stapi_select(){
	if [ "$stapi_allowed" == "1" ]
	then
		stapivar=''
		addstapi=
		USESTRING=
		stapimode=$($gui $rl_ " SELECT STAPI MODE" 12 0 5 0 "STAPI_OFF" on 1 "USE_STAPI" off 2 "USE_STAPI5 UFS916" off 3 "USE_STAPI5 UFS916003" off 4 "USE_STAPI5 OPENBOX" off 3>&1 1>&2 2>&3)
		usevars=$(echo $usevars | sed "s@USE_STAPI5@@" | xargs)
		usevars=$(echo $usevars | sed "s@USE_STAPI@@" | xargs)

		case $stapimode in
			0)
				stapivar=;;
			1)
				[ -z "$stapi_lib_custom" ] && stapivar="STAPI_LIB=$sdir/stapi/liboscam_stapi.a" || stapivar="STAPI_LIB=$sdir/stapi/${stapi_lib_custom}"
				addstapi="USE_STAPI";;
			2)
				stapivar="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_UFS916.a"
				addstapi="USE_STAPI5";;
			3)
				stapivar="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_UFS916_0.03.a"
				addstapi="USE_STAPI5";;
			4)
				stapivar="STAPI5_LIB=$sdir/stapi/liboscam_stapi5_OPENBOX.a"
				addstapi="USE_STAPI5";;
		esac;

		save_config
	else
		"$gui" "$st_" --title "STAPI INFO" --msgbox "NOT for $_toolchainname" 0 0
		_toolchain_config_menu
	fi
}
save_config(){
	usevars=
	enabled=
	disabled=
	check_smargo
	enabled=($("${repodir}/config.sh" -s))
	disabled=($("${repodir}/config.sh" -Z))
	[ "$_toolchainname" == "sh4" ] && unset USE_vars[USE_COMPRESS]
	[ "$_toolchainname" == "sh_4" ] && unset USE_vars[USE_COMPRESS]
	unset USE_vars[USE_STAPI]
	unset USE_vars[USE_STAPI5]

	for e in ${USE_vars[*]}
	do
		usevars="${e:0:-2} $usevars"
	done

	[ -f "$menudir/$_toolchainname.save" ] && rm -rf "$menudir/$_toolchainname.save"
	printf "enabled=\"${enabled[*]}\"\n"  >"$menudir/$_toolchainname.save"
	printf "disabled=\"${disabled[*]}\"\n">>"$menudir/$_toolchainname.save"
	if [ "$stapi_allowed" == "1" ]
	then
		if [ "${#stapivar}" -gt "15" ]
		then
			printf "stapivar=\"$stapivar\"\n">>"$menudir/$_toolchainname.save"
			printf "usevars=\"$usevars $addstapi\"\n" >>"$menudir/$_toolchainname.save"
		else
			printf "usevars=\"$usevars\"\n" >>"$menudir/$_toolchainname.save"
		fi
	else
		printf "usevars=\"$usevars\"\n" >>"$menudir/$_toolchainname.save"
	fi
};

load_config(){
	_stapi=
	_stapi5=
	enabled=
	disabled=
	stapivar=""
	USESTRING=
	usevars=
	unset USE_vars[USE_STAPI]
	unset USE_vars[USE_STAPI5]
	if [ -f "$menudir/$_toolchainname.save" ]
	then
		source "$menudir/$_toolchainname.save"
		ena=$("${repodir}/config.sh" -E $enabled)
		dis=$("${repodir}/config.sh" -D $disabled)
		for e in $usevars
		do
			USE_vars[$e]="$e=1"
			[ "$e" == "USE_LIBUSB" ] && silent=$("${repodir}/config.sh" --enable CARDREADER_SMARGO)
			[ "$e" == "USE_PCSC" ] && sed -i 's@^//#define CARDREADER_PCSC 1@#define CARDREADER_PCSC 1@g' "${repodir}/config.h"
		done
	else
		_reset_config
		[ "${s3cfg_vars[USE_TARGZ]}" == "1" ] && USE_vars[USE_TARGZ]="USE_TARGZ=1"
		[ "${s3cfg_vars[USE_COMPRESS]}" == "1" ] && USE_vars[USE_COMPRESS]="USE_COMPRESS=1"
		for e in $default_use
		do
			USE_vars[$e]="$e=1"
		done
	fi
	check_smargo
	[ "$_toolchainname" == "sh4" ] && unset USE_vars[USE_COMPRESS]
	[ "$_toolchainname" == "sh_4" ] && unset USE_vars[USE_COMPRESS]
	USESTRING="$(echo "${USE_vars[@]}"| sed 's@USE_@@g'| sed 's@=1@@g'| tr -s ' ')"
}
_get_config_con(){
	if [ ! "$1" == "checkout" ] && [ ! "$1" == "clean" ]
	then
		tmp="$(mktemp)";

		if [ -f "${repodir}/config.sh" ]
		then
			while read -r _l
			do
				c=$(echo "$_l" | tr -cd \" | wc -c)
				_c=$((_c + c));
				[ ${_c} -lt 11 ] && echo "$_l" >>"$tmp"
				[ ${_c} -eq 10 ] && break
			done <"${repodir}/config.sh"
		else
			while read -r _l
			do
				c=$(echo "$_l" | tr -cd \" | wc -c)
				_c=$((_c + c))
				[ ${_c} -lt 11 ] && echo "$_l" >>"$tmp"
				[ ${_c} -eq 10 ] && break
			done <"$configdir/config.sh.master"
		fi

		if [ -f "${repodir}/Makefile" ]
		then
			str_="$(grep '^   USE_' "${repodir}/Makefile"| sort -u| awk '{print $1}')"
			for e in $str_
			do
				es="${e:0:-2}"
				USE_vars[$es]=
			done
		else
			if [ -f "$configdir/Makefile.master" ]
			then
				str_="$(grep '^   USE_' "$configdir/Makefile.master"| sort -u| awk '{print $1}')"
				for e in $str_
				do
					es="${e:0:-2}"
					USE_vars[$es]=
				done
			fi
		fi

		check_smargo
		source "$tmp"
		rm -rf "$tmp" "$tmp1"
		rm -rf "$tmp.load" "$tmp1.load"
	fi
}
check_url(){
	if ! http_code=$(curl --output /dev/null --write-out "%{http_code}" --silent --fail "$1")
	then
		printf "$r_l$1 is not reachable! (HTTP status: $http_code)$re_\n"
		return 1
	fi
}
