From bdda6e3b09f448adcb774e2aed8e6a65b9ee885c Mon Sep 17 00:00:00 2001 From: Tearran Date: Sat, 22 Jun 2024 20:57:30 -0700 Subject: [PATCH 1/8] chore: Remove unused system and network files, removed readme from bin. started hot spot/ap featur, --- README.md | 141 +++++++---- bin/README.md | 100 -------- bin/armbian-configng | 118 +++++++--- bin/configng-cli | 222 ------------------ bin/configng-tui | 119 ---------- lib/armbian-configng/config.ng.docs.sh | 210 +++++++++++++---- lib/armbian-configng/config.ng.functions.sh | 134 +++++++++-- lib/armbian-configng/config.ng.jobs.json | 81 +++++-- lib/armbian-configng/config.ng.network.sh | 109 +++++++++ lib/armbian-configng/config.ng.runtime.dev.sh | 7 - lib/armbian-configng/network/readme.md | 3 - lib/armbian-configng/network/set_wifi.sh | 19 -- .../system/armbian_install.sh | 21 -- lib/armbian-configng/system/hello_world.sh | 21 -- lib/armbian-configng/system/readme.md | 2 - lib/armbian-configng/system/see_monitor.sh | 45 ---- share/doc/armbian-configng/Command.md | 54 +++++ share/doc/armbian-configng/Functions.md | 49 ++-- share/doc/armbian-configng/Home.md | 151 ++++++++---- share/doc/armbian-configng/Menu.md | 28 ++- share/doc/armbian-configng/ScreenShot.md | 17 -- share/doc/armbian-configng/Standards.md | 37 --- .../doc/armbian-configng/armbian-configng.csv | 5 - .../armbian-configng/armbian-configng.html | 98 -------- .../armbian-configng/armbian-configng.json | 34 --- share/doc/armbian-configng/armbianCPU.svg | 5 - share/doc/armbian-configng/index.html | 42 ---- share/doc/armbian-configng/system.gif | Bin 222489 -> 0 bytes 28 files changed, 836 insertions(+), 1036 deletions(-) delete mode 100644 bin/README.md mode change 100644 => 100755 bin/armbian-configng delete mode 100755 bin/configng-cli delete mode 100755 bin/configng-tui delete mode 100644 lib/armbian-configng/network/readme.md delete mode 100644 lib/armbian-configng/network/set_wifi.sh delete mode 100644 lib/armbian-configng/system/armbian_install.sh delete mode 100644 lib/armbian-configng/system/hello_world.sh delete mode 100644 lib/armbian-configng/system/readme.md delete mode 100644 lib/armbian-configng/system/see_monitor.sh create mode 100644 share/doc/armbian-configng/Command.md delete mode 100644 share/doc/armbian-configng/ScreenShot.md delete mode 100644 share/doc/armbian-configng/Standards.md delete mode 100755 share/doc/armbian-configng/armbian-configng.csv delete mode 100755 share/doc/armbian-configng/armbian-configng.html delete mode 100755 share/doc/armbian-configng/armbian-configng.json delete mode 100755 share/doc/armbian-configng/armbianCPU.svg delete mode 100755 share/doc/armbian-configng/index.html delete mode 100644 share/doc/armbian-configng/system.gif diff --git a/README.md b/README.md index 413391cf..c1d734c7 100644 --- a/README.md +++ b/README.md @@ -8,88 +8,147 @@ Utility for configuring your board, divided into four main sections: - Software - system and 3rd party software install. - -To Configure and change global sytem settings, run the following command: `./armbian-configng` - -*** -## Screenshots -![edit-boot-env-2024-04-03 10-06-58](https://github.com/armbian/configng/assets/2831630/448f0515-0854-4a8a-8421-53c8b72bb5c5) -![BT-connect-2024-04-03 10-06-58](https://github.com/armbian/configng/assets/2831630/fef037ce-346d-4d70-9025-90f69fbdf5d3) -Following was updated on: -Fri Apr 12 01:33:08 AM MST 2024. - -*** - ## **System** - **S01** - Description: Enable Armbina kernal upgrades - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#s01) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s01) - **S02** - Description: Disable Armbina kernal upgrades - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#s02) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s02) - **S03** - Description: Edit the boot enviroment (WIP) - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#s03) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s03) + - **S04** - Description: Install Linux headers + - Status: [Pending Review](https://github.com/armbian/config/wiki#System) + - **S05** - Description: Remove Linux headers + - Status: [Pending Review](https://github.com/armbian/config/wiki#System) - ## **Network** - **BT0** - Description: Install Bluetooth support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#bt0) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt0) - **BT1** - Description: Remove Bluetooth support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#bt1) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt1) - **BT3** - Description: Bluetooth Discover - - Status: [review](https://github.com/armbian/configng/wiki/Menu#bt3) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt3) - **IR0** - Description: Install Infrared support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#ir0) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#ir0) - **IR1** - Description: Uninstall Infrared support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#ir1) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#ir1) - **N00** - Description: Manage wifi network connections - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n00) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n00) - **N01** - Description: Advanced Edit /etc/network/interface - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n01) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n01) - **N02** - Description: Disconect and forget all wifi connections (Advanced) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n02) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n02) - **N03** - Description: Toggle system IPv6/IPv4 internet protical - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n03) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n03) - ## **Localisation** - **L00** - Description: Change Globla timezone (WIP) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l00) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l00) - **L01** - Description: Change Locales reconfigure the language and charitorset - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l01) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l01) - **L02** - Description: Change Keyboard layout - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l02) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l02) - **L03** - Description: Change APT mirrors - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l03) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l03) - ## **Software** - **I00** - Description: Update Application Repository - - Status: [review](https://github.com/armbian/configng/wiki/Menu#i00) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#i00) - **I01** - Description: CLI System Monitor - - Status: [review](https://github.com/armbian/configng/wiki/Menu#i01) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#i01) - ## **Help** - **H00** - Description: About This systme. (WIP) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#h00) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#h00) - **H02** - Description: List of Config function(WIP) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#h02) + - Status: [Active](https://github.com/armbian/configng/wiki/Menu#h02) *** -## Quick start -Run the following commands: - echo "deb [signed-by=/usr/share/keyrings/armbian.gpg] https://armbian.github.io/configng stable main" | sudo tee /etc/apt/sources.list.d/armbian-development.list > /dev/null - - armbian-configng --dev +## Development -If all goes well you should see the Text-Based User Inerface (TUI) +To clone this development branch, run the following commands: -## Development -Development test brances are available for testing. To clone the development branch, run the following commands: +~~~ + git clone https://github.com/armbian/configng + cd configng + ./armbian-configng --help +~~~ +## Install latest release +dowload .deb package: + +~~~ +{ + latest_release=$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) + deb_url=$(echo "$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') + curl -LO "$deb_url" + deb_file=$(echo "$deb_url" | awk -F"/" '{print $NF}') + sudo dpkg -i "$deb_file" + sudo dpkg --configure -a + sudo apt --fix-broken install +} ~~~ -git clone https://github.com/armbian/configng.git -cd configng + +*** + +## CLI options +Command ine options. + +Use: +~~~ + armbian-config --help +~~~ + +Outputs: +~~~ +Usage: armbian-configng [option] [arguments] + + --help - Display this help message. + main=Help - Display Legacy Options (Backward Compatible) + + --cli S01 - Enable Armbina kernal upgrades + --cli S02 - Disable Armbina kernal upgrades + --cli S03 - Edit the boot enviroment (WIP) + --cli S04 - Install Linux headers + --cli S05 - Remove Linux headers + --cli BT0 - Install Bluetooth support + --cli BT1 - Remove Bluetooth support + --cli BT3 - Bluetooth Discover + --cli IR0 - Install Infrared support + --cli IR1 - Uninstall Infrared support + --cli N00 - Manage wifi network connections + --cli N01 - Advanced Edit /etc/network/interface + --cli N02 - Disconect and forget all wifi connections (Advanced) + --cli N03 - Toggle system IPv6/IPv4 internet protical + --cli L00 - Change Globla timezone (WIP) + --cli L01 - Change Locales reconfigure the language and charitorset + --cli L02 - Change Keyboard layout + --cli L03 - Change APT mirrors + --cli I00 - Update Application Repository + --cli I01 - CLI System Monitor +~~~ + +## Legacy options +Backward Compatible options. + +Use: + + armbian-config main=Help + +Outputs: +~~~ +Legacy Options (Backward Compatible) +Please use 'armbian-config --help' for more information. + +Usage: armbian-configng main=[arguments] selection=[options] + + armbian-configng main=System selection=Headers - Install headers: + armbian-configng main=System selection=Headers_remove - Remove headers: ~~~ diff --git a/bin/README.md b/bin/README.md deleted file mode 100644 index 413391cf..00000000 --- a/bin/README.md +++ /dev/null @@ -1,100 +0,0 @@ - -# Armbian configuration utility -Utility for configuring your board, divided into four main sections: - -- System - system and security settings, -- Network - wired, wireless, Bluetooth, access point, -- Personal - timezone, language, hostname, -- Software - system and 3rd party software install. - - - -To Configure and change global sytem settings, run the following command: `./armbian-configng` - -*** -## Screenshots -![edit-boot-env-2024-04-03 10-06-58](https://github.com/armbian/configng/assets/2831630/448f0515-0854-4a8a-8421-53c8b72bb5c5) -![BT-connect-2024-04-03 10-06-58](https://github.com/armbian/configng/assets/2831630/fef037ce-346d-4d70-9025-90f69fbdf5d3) -Following was updated on: -Fri Apr 12 01:33:08 AM MST 2024. - -*** -- ## **System** - - **S01** - Description: Enable Armbina kernal upgrades - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#s01) - - **S02** - Description: Disable Armbina kernal upgrades - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#s02) - - **S03** - Description: Edit the boot enviroment (WIP) - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#s03) - - -- ## **Network** - - **BT0** - Description: Install Bluetooth support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#bt0) - - **BT1** - Description: Remove Bluetooth support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#bt1) - - **BT3** - Description: Bluetooth Discover - - Status: [review](https://github.com/armbian/configng/wiki/Menu#bt3) - - **IR0** - Description: Install Infrared support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#ir0) - - **IR1** - Description: Uninstall Infrared support - - Status: [review](https://github.com/armbian/configng/wiki/Menu#ir1) - - **N00** - Description: Manage wifi network connections - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n00) - - **N01** - Description: Advanced Edit /etc/network/interface - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n01) - - **N02** - Description: Disconect and forget all wifi connections (Advanced) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n02) - - **N03** - Description: Toggle system IPv6/IPv4 internet protical - - Status: [review](https://github.com/armbian/configng/wiki/Menu#n03) - - -- ## **Localisation** - - **L00** - Description: Change Globla timezone (WIP) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l00) - - **L01** - Description: Change Locales reconfigure the language and charitorset - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l01) - - **L02** - Description: Change Keyboard layout - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l02) - - **L03** - Description: Change APT mirrors - - Status: [review](https://github.com/armbian/configng/wiki/Menu#l03) - - -- ## **Software** - - **I00** - Description: Update Application Repository - - Status: [review](https://github.com/armbian/configng/wiki/Menu#i00) - - **I01** - Description: CLI System Monitor - - Status: [review](https://github.com/armbian/configng/wiki/Menu#i01) - - -- ## **Help** - - **H00** - Description: About This systme. (WIP) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#h00) - - **H02** - Description: List of Config function(WIP) - - Status: [review](https://github.com/armbian/configng/wiki/Menu#h02) - - -*** -## Quick start -Run the following commands: - - echo "deb [signed-by=/usr/share/keyrings/armbian.gpg] https://armbian.github.io/configng stable main" | sudo tee /etc/apt/sources.list.d/armbian-development.list > /dev/null - - armbian-configng --dev - -If all goes well you should see the Text-Based User Inerface (TUI) - -## Development -Development test brances are available for testing. To clone the development branch, run the following commands: - -~~~ -git clone https://github.com/armbian/configng.git -cd configng -~~~ - - - -## Note: -> -> The Bash procedures embedded within the JSON structure are meticulously designed with a focus on clear naming conventions and the simplicity of key pairs. These procedures serve multiple purposes, including facilitating the generation of content in various formats, such as Whiptail, Markdown, json out and others. Moreover, they are utilized for evaluation and execution of commands outlined in the JSON structure. -> diff --git a/bin/armbian-configng b/bin/armbian-configng old mode 100644 new mode 100755 index c6d040f1..85208504 --- a/bin/armbian-configng +++ b/bin/armbian-configng @@ -10,13 +10,6 @@ tput init # allows CTRL c to exit trap "exit" INT TERM -if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then -# TODO : Add help message - echo -e "\nComming soon:\nsimple help meassage\n" - exit 0 ; -fi - - # Get the script directory script_dir="$(dirname "$0")" @@ -44,38 +37,103 @@ declare -A module_options # # Load configng core functions and module options array - source "$lib_dir/config.ng.functions.sh" set_runtime_variables -echo "Loaded Runtime variables..." | show_infobox ; -set_newt_colors 2 -echo "Loaded Dialog..." | show_infobox ; +echo "Loaded Runtime variables..." #| show_infobox ; +#set_newt_colors 2 +echo "Loaded Dialog..." #| show_infobox ; source "$lib_dir/config.ng.docs.sh" -echo "Loaded Docs..." | show_infobox ; +echo "Loaded Docs..." #| show_infobox ; source "$lib_dir/config.ng.network.sh" -echo "Loaded Network helpers..." | show_infobox ; - +echo "Loaded Network helpers..." #| show_infobox ; # # Loads the varibles from beta armbian-config for runtime handeling source "$lib_dir/config.ng.runtime.sh" ; -echo "Loaded Runtime conditions..." | show_infobox ; - -# -# if not sudo -# Runtime "include this script" for USER and development setup condistion -if [[ $EUID != 0 ]]; then - source "$lib_dir/config.ng.runtime.dev.sh" ; - echo "Loaded Develoment -Runtime conditions..." | show_infobox ; - -fi - - - - -tput clear +echo "Loaded Runtime conditions..." #| show_infobox ; + + +clear + +case "$1" in + "--dev") + if [[ $EUID != 0 ]]; then + source "$lib_dir/config.ng.runtime.dev.sh" + echo "Loaded Development Runtime conditions..." | show_infobox + fi + ;; + "--help") + see_cli_list + exit 0 + ;; + "--doc") + if [[ $EUID != 0 ]]; then + generate_readme + exit 0 + else + echo "Error: You must run this command as a normal user" + exit 1 + fi + ;; + "--cli") + shift + args=$(sanitize_input "$@") + execute_command "$args" + exit 0 + ;; + "main=help" | "main=Help") + see_cli_legacy + echo "" + exit 0 + ;; + "main="*) + cat << EOF +Legacy help commands are deprecated. May not work as expected. +Please use 'armbian-config --help' for more information. + +EOF + declare -A main_map + main_map=( + # map name to menu catagory + ["System"]="S" + ["Software"]="I" + ["Network"]="N" + ["Localisation"]="L" + ) + main_value="${1#main=}" + main_value="${main_map[$main_value]}" + + if [ -z "$main_value" ]; then + echo "Error: Invalid List $1" + exit 1 + fi + declare -A select_map + # map name to menu number + select_map=( + ["Headers"]="04" + ["Headers_install"]="04" + ["Headers_remove"]="05" + ["Firmware"]="06" + ["Nightly"]="07" + ) + select_value="${2#selection=}" + select_value="${select_map[$select_value]}" + if [ -z "$select_value" ]; then + echo "Error: Invalid Option $2" + exit 1 + fi + echo "$main_value""$select_value" + execute_command "$main_value""$select_value" + exit 0 + ;; + *) + if [[ $EUID != 0 ]]; then + echo -e "error: Exiting \nTry: 'sudo armbian-config'\n or: 'armbian-config --help' for More info\n\n" + exit 0 + fi + ;; +esac # # Generate the top menu with the modified Object data diff --git a/bin/configng-cli b/bin/configng-cli deleted file mode 100755 index 2a6c8977..00000000 --- a/bin/configng-cli +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/bash - -# This script provides a command-line interface for managing Armbian configuration. -# It loads libraries of functions from the lib directory and displays them in a menu. -# The user can select a function to run, or use a text-based user interface (TUI) to navigate the menus. -# The script also provides a help option and a debug option for developers. -# The script requires sudo privileges to run some functions. -# The script uses whiptail or dialog for the TUI, depending on which is available. - -#set -x -#set -e - -# -# Enable Dynamic directory root use home ~/ , /bin , /usr/sbin etc.. -bin="$(dirname "${BASH_SOURCE[0]}")" -directory="$(cd "$bin/../" && pwd )" -file_name="$(basename "${BASH_SOURCE[0]}")" -filename="${file_name%.*}" -libpath=$(cd "$directory/lib/$filename/" && pwd) -#sharepath=$(cd "$directory/share/${filename%-dev}/" && pwd) - - -# -# Consept Distribution Compatibility checks -check_distro() { - - [[ -f "/usr/bin/${filename%%-*}-config" ]] && distro_config="${filename%%-*}" - [[ -f "/etc/${filename%%-*}-release" ]] && distro_release="${filename%%-*}" - # if both true then we are good to go - [[ -z "$distro_config" ]] || [[ -z "$distro_release" ]] && echo "W: Costum build, Tech support links are missing." - [[ -n "$distro_config" ]] && [[ -n "$distro_release" ]] && echo "I: This build seems to be community supported" | ./armbian-interface -o - [[ -f "/usr/sbin/${filename%%-*}-config" ]] && distro_config="${filename%%-*}" - [[ -f "/etc/${filename%%-*}-release" ]] && distro_release="${filename%%-*}" - -} - -[[ "$1" == "--dev" ]] && dev=1 && shift 1 - -# -# Check if the script is dev version. -suffix="${file_name##*-}" - -if [[ "$suffix" == dev ]]; then - dev=1 - check_distro #| armbian-interface -o -fi - -if [[ "$(id -u)" != "0" ]] && [[ "$dev" == "1" ]] ; then - -cat << EOF #| ./armbian-interface -o -I: Running in UX development mode -W: Admin functions will not work as expected - -EOF -elif [[ "$(id -u)" == "0" ]] && [[ "$dev" == "1" ]] ; then -cat << EOF | ./armbian-interface -o -I: Running in UX development mode -W: Document files may need Admin privleges to edit/remove - -EOF - -fi - -# -# Check if the script is being run as root -# UX Development mode bypasses root check, many functions will not work as expected - -if [[ "$(id -u)" != "0" ]] && [[ "$dev" != "1" ]]; then - echo -e "E: This tool requires root privileges. Try: \"sudo $filename\"" >&2 - exit 1 -fi - -declare -A dialogue - -# -# Check if whiptail or dialog is installed and set the variable 'dialogue' accordingly. -# todo add a fallback TUI and GUI -if command -v whiptail &> /dev/null; then - dialogue="whiptail" -elif command -v dialog &> /dev/null; then - dialogue="dialog" -else - echo "TUI not found" - echo "Warning: Using fallback TUI" - sleep 1 - clear && generate_read -fi - -source "$libpath/functions.sh" -source "$libpath/documents.sh" -for file in "$libpath"/*/*.sh; do - source "$file" -done - -# -# mapfile -t categories < <(ls -d "$libpath"/* ) -mapfile -t categories < <(find "$libpath"/* -type d) -declare -A functions - -for category in "${categories[@]}"; do - category_name="${category##*/}" - - category_file="$category/readme.md" - if [[ -f "$category_file" ]]; then - category_description=$(grep -oP "(?<=# @description ).*" "$category_file") - fi - - for file in "$category"/*.sh; do - description="" - while IFS= read -r line; do - if [[ $line =~ ^#\ @description\ (.*)$ ]]; then - description="${BASH_REMATCH[1]}" - elif [[ $line =~ ^function\ (.*::.*)\(\)\{$ ]]; then - # END: be15d9bcejpp - function_name="${BASH_REMATCH[1]}" - key="$category_name:${file##*/}:${function_name}" - functions["$key,function_name"]=$(echo "$function_name" | sed 's/.*:://') - functions["$key,group_name"]=$(echo "$function_name" | sed 's/::.*//') - functions["$key,description"]=$description - elif [[ $line =~ ^#\ @options\ (.*)$ ]]; then - functions["$key,options"]="${BASH_REMATCH[1]}" - fi - done < "$file" - functions["$key,category"]=$category_name - functions["$key,category_description"]=$category_description - done -done - - -# -# WIP: Check arguments for no flag options -# armbian-config --help -# Change to BASH: /usr/sbin/armbian-config main=System selection=BASH -handle_no_flag(){ -if [[ "$1" == *"="* ]]; then - IFS='=' read -r key value <<< "$1" - function_name=$(parse_action "$key" "$value") - # Call the function using variable indirection - ${function_name} -elif [[ "$1" == "help"* ]]; then - generate_list_cli -fi -} - -# -# Check arguments for long flag options -# Help message related to the functions the back end -handle_long_flag(){ - if [[ "$1" == "--help" ]]; then - generate_list_run - exit 0 ; - elif [[ "$1" == "--doc" ]]; then - generate_doc - exit 0 ; - fi -# WIP: - if [ "$1" == "--run" ]; then - shift # Shifts the arguments to the left, excluding the first argument ("-r") - group_name="$1" # Takes the first argument as the group name - shift 1 # Shifts the arguments again to exclude the group name - - function_name=$(parse_action "$group_name" "$1") - if [ $? -eq 0 ]; then - # Call the function using variable indirection - ${function_name} - fi - elif [ "$1" == "--help" ]; then - generate_list_run - exit - elif [ "$1" == "--test" ]; then - check_distro | armbian-interface -o && $1 > /dev/null - fi - -} -# -# Check arguments for short flag options -# THe interface help message -handle_short_flag(){ -if [ "$1" == "-h" ]; then - generate_help - exit 0 ; -# Generate a text-based user interface -elif [ "$1" == "-t" ] ; then - generate_read ; exit 0 ; -# Generate all doc files -elif [ "$1" == "-d" ] ; then - generate_doc ; exit 0 ; -elif [ "$1" == "-j" ] ; then - generate_json ; exit 0 ; -fi - -} - -case "$1" in - *"="*) - # Handle the case where $1 contains "=" - handle_no_flag "$@" - ;; - *"--"*) - # Handle the case where $1 starts with "--" - handle_long_flag "$@" - ;; - *"-"*) - # Handle the case where $1 starts with "-" - handle_short_flag "$1" - ;; - *) - handle_no_flag "$@" - # Handle the case where $1 does not match any of the above patterns - # You can add your code here - ;; -esac - -if [[ -z "$1" ]] ; then - while true; do - generate_tui ; - if [[ "$?" == "0" ]]; then - exit 0 - fi - done - -fi \ No newline at end of file diff --git a/bin/configng-tui b/bin/configng-tui deleted file mode 100755 index 5f6e27c1..00000000 --- a/bin/configng-tui +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/bash - -# -# Copyright (c) 2023 Joseph C Turner -# All rights reserved. -# -# This script. -# demonstrates the compatibility of multiple interfaces for displaying menus or messages. -# It uses an array to set the options for all three menus (bash, whiptail, and dialog). -# The script checks if whiptail or dialog are available on the system and uses them to display the menu in a more user-friendly way. -# If neither of these programs is available, it falls back to using bash. -# while both are installed falls back to whiptail to display the menu. -# The user can override the default program by passing an argument when running the script: -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -## DIRECTORY variable to the absolute path of the script's directory -# directory="$(dirname "$(readlink -f "$0")")" -filename=$(basename "${BASH_SOURCE[0]}") - -## DIALOG variable to the absolute path of the script's directory -DIALOG="bash" -[[ -x "$(command -v dialog)" ]] && DIALOG="dialog" -[[ -x "$(command -v whiptail)" ]] && DIALOG="whiptail" - -show_help(){ - - echo -e "\nUsage: [command] | ${filename%.*} [ -h | -m | -o ]" - echo "Options:" - echo " -h, Print this help." - echo "" - echo " -o, Opens an OK message Box" - echo "" - echo " -m, Opens an Menu select Box." - echo "" - echo " -p, Opens Popup message box. " - echo "" - exit 1; - } - -show_message(){ - - # Read the input from the pipe continuously until there is no more input - input="" - while read -r line; do - input+="$line\n" - done - - # Display the "OK" message box with the input data - [[ $DIALOG != "bash" ]] && $DIALOG --title "Message Box" --msgbox "$input" 0 0 - [[ $DIALOG == "bash" ]] && echo -e "$input" - [[ $DIALOG == "bash" ]] && read -p -r "Press [Enter] to continue..." ; echo "" ; exit 1 - - } - -show_popup(){ - - - input="" - while read -r line; do - input+="$line\n" - done - - [[ $DIALOG != "bash" ]] && $DIALOG --title "Popup Box" --infobox "$input" 0 0 - [[ $DIALOG == "bash" ]] && echo -e "$input" - - } - -show_menu(){ - - - # Get the input and convert it into an array of options - inpu_raw=$(cat) - # Remove the lines befor -h - input=$(echo "$inpu_raw" | sed 's/-\([a-zA-Z]\)/\1/' | grep '^ [a-zA-Z] ' | grep -v '\[') - options=() - while read -r line; do - package=$(echo "$line" | awk '{print $1}') - description=$(echo "$line" | awk '{$1=""; print $0}' | sed 's/^ *//') - options+=("$package" "$description") - done <<< "$input" - - # Display the menu and get the user's choice - [[ $DIALOG != "bash" ]] && choice=$($DIALOG --title "Menu" --menu "Choose an option:" 0 0 9 "${options[@]}" 3>&1 1>&2 2>&3) - - # Check if the user made a choice - if [ $? -eq 0 ]; then - echo "$choice" - else - echo "You cancelled." - fi - } - -[[ $1 == "-m" ]] && show_menu ; -[[ $1 == "-o" ]] && show_message ; -[[ $1 == "-h" ]] && show_help ; -[[ $1 == "-p" ]] && show_popup ; -[[ -z "$*" ]] && show_help ; diff --git a/lib/armbian-configng/config.ng.docs.sh b/lib/armbian-configng/config.ng.docs.sh index 791ba27e..96fa4d2c 100644 --- a/lib/armbian-configng/config.ng.docs.sh +++ b/lib/armbian-configng/config.ng.docs.sh @@ -4,7 +4,7 @@ module_options+=( ["generate_readme,author"]="Joey Turner" - ["generate_readme,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/documents.sh#L18" + ["generate_readme,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L17" ["generate_readme,feature"]="generate_readme" ["generate_readme,desc"]="Generate Document files." ["generate_readme,example"]="generate_readme" @@ -18,29 +18,26 @@ function generate_readme() { # Get the current date local current_date=$(date) + # setup doc folders + mkdir -p "$script_dir/../share/doc/armbian-configng" -# [[ ! -d "$script_dir/images" ]] && mkdir -p "$script_dir/images" && generate_svg > "$script_dir/images/logo.svg" ; -# [[ ! -f "$script_dir/images/logo.svg" ]] && generate_svg > "$script_dir/images/logo.svg" ; - - -echo "Sorting data\nUpdating documentation" | show_infobox ; +echo -e "Sorting data\nUpdating documentation" # current_date ; ###################################### # Generate the README.md file -echo "$(see_jobs_list)" > "$script_dir/README.md" -echo "Updating Readme.md" | show_infobox +echo "$(see_full_list)" > "$script_dir/../README.md" +echo "Updating Readme.md" # current_date ###################################### -cp "$script_dir/README.md" "$doc_dir/Home.md" -cd "$script_dir" && cp ./README.md "../README.md" -echo "README.md has been updated." | show_infobox +cp "$script_dir/../README.md" "$doc_dir/Home.md" +echo "README.md has been updated." # current_date ###################################### -echo "Updating WIKI Functions" | show_infobox +echo "Updating WIKI Functions" # current_date cat << EOF > "$doc_dir/Functions.md" # Helper functions @@ -52,10 +49,10 @@ EOF ###################################### -echo "Updating WIKI HowTo" | show_infobox +echo "Updating WIKI HowTo" # current_date cat << EOF > "$doc_dir/Menu.md" -# Armbian-config Menu list. +# Menu list. armbian-config jobs list. $(see_jq_menu_list) @@ -64,16 +61,39 @@ EOF ###################################### -# show_infobox <<< $( echo "$(generate_json_options)" > "$script_dir/docs/config-helpers.json" ) -# Print a message indicating that README.md has been updated -# echo "Documents have been updated." | show_infobox +echo "Updating WIKI Command line options" # current_date +cat << EOF > "$doc_dir/Command.md" + +## CLI options +Command ine options. + +Use: + + armbian-config --help + +Outputs: +~~~ +$(see_cli_list) +~~~ + +## Legacy options +deprecated + +Use: + armbian-config main=Help + +Outputs: +~~~ +$(see_cli_legacy) +~~~ +EOF } module_options+=( ["serve_doc,author"]="Tearran" - ["serve_doc,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L89" + ["serve_doc,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L106" ["serve_doc,feature"]="serve_doc" ["serve_doc,desc"]="Serve the edit and debug server." ["serve_doc,example"]="serve_doc" @@ -112,7 +132,7 @@ function serve_doc() { module_options+=( ["see_use,author"]="Tearran" - ["see_use,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L126" + ["see_use,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L145" ["see_use,feature"]="see_use" ["see_use,desc"]="Show the usage of the functions." ["see_use,example"]="see_use" @@ -141,7 +161,7 @@ function see_use() { module_options+=( ["generate_json_options,author"]="Tearran" - ["generate_json_options,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L149" + ["generate_json_options,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L174" ["generate_json_options,feature"]="generate_json" ["generate_json_options,desc"]="Generate JSON-like object file." ["generate_json_options,example"]="generate_json" @@ -195,7 +215,7 @@ echo "}" module_options+=( ["generate_svg,author"]="Tearran" - ["generate_svg,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#201" + ["generate_svg,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L201" ["generate_svg,feature"]="generate_svg" ["generate_svg,desc"]="Generate 'Armbian CPU logo' SVG for docunment file." ["generate_svg,example"]="generate_svg" @@ -220,7 +240,7 @@ EOF module_options+=( ["generate_jobs_from_json,author"]="Tearran" - ["generate_jobs_from_json,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L223" + ["generate_jobs_from_json,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L253" ["generate_jobs_from_json,feature"]="generate_jobs_from_json" ["generate_jobs_from_json,desc"]="Generate jobs from JSON file." ["generate_jobs_from_json,example"]="generate_jobs_from_json" @@ -268,7 +288,7 @@ done } -function see_jobs_list() { +function see_full_list() { cat << EOF @@ -281,20 +301,9 @@ Utility for configuring your board, divided into four main sections: - Software - system and 3rd party software install. - -To Configure and change global sytem settings, run the following command: \`./armbian-configng\` - -*** -## Screenshots -![edit-boot-env-2024-04-03 10-06-58](https://github.com/armbian/configng/assets/2831630/448f0515-0854-4a8a-8421-53c8b72bb5c5) -![BT-connect-2024-04-03 10-06-58](https://github.com/armbian/configng/assets/2831630/fef037ce-346d-4d70-9025-90f69fbdf5d3) -Following was updated on: -$current_date. - -*** EOF - # Use jq to parse the JSON + # Use jq to parse the JSON into markdown menu_items=$(jq -r '.menu | length' "$json_file") for (( i=0; i<$menu_items; i++ )) @@ -331,22 +340,57 @@ EOF cat << EOF *** -## Quick start -Run the following commands: - echo "deb [signed-by=/usr/share/keyrings/armbian.gpg] https://armbian.github.io/configng stable main" \ - | sudo tee /etc/apt/sources.list.d/armbian-development.list > /dev/null - - armbian-configng --dev +## Development + +To clone this development branch, run the following commands: -If all goes well you should see the Text-Based User Inerface (TUI) +~~~ + git clone https://github.com/armbian/configng + cd configng + ./armbian-configng --help +~~~ -## Development -Development test brances are available for testing. To clone the development branch, run the following commands: +## Install latest release +dowload .deb package: + +~~~ +{ + latest_release=\$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) + deb_url=\$(echo "\$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') + curl -LO "\$deb_url" + deb_file=\$(echo "\$deb_url" | awk -F"/" '{print \$NF}') + sudo dpkg -i "\$deb_file" + sudo dpkg --configure -a + sudo apt --fix-broken install +} +~~~ + +*** + +## CLI options +Command ine options. +Use: ~~~ -git clone https://github.com/armbian/configng.git -cd configng + armbian-config --help +~~~ + +Outputs: +~~~ +$(see_cli_list) +~~~ + +## Legacy options +Backward Compatible options. + +Use: + + armbian-config main=Help + +Outputs: +~~~ +$(see_cli_legacy) ~~~ @@ -358,6 +402,8 @@ cd configng EOF +exit 0 ; + } @@ -398,7 +444,7 @@ function see_function_table_md() { module_options+=( ["see_jq_menu_list,author"]="Tearran" - ["see_jq_menu_list,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L304" + ["see_jq_menu_list,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L304" ["see_jq_menu_list,feature"]="see_jq_menu_list" ["see_jq_menu_list,desc"]="Generate a markdown list json objects using jq." ["see_jq_menu_list,example"]="see_jq_menu_list" @@ -419,4 +465,74 @@ jq -r ' "\n~~~\n" ' $json_file } +module_options+=( + ["see_cli_list,author"]="Tearran" + ["see_cli_list,ref_link"]="" + ["see_cli_list,feature"]="see_cli_list" + ["see_cli_list,desc"]="Generate a Help message for cli commands." + ["see_cli_list,example"]="see_cli_list" + ["see_cli_list,status"]="review" + ["see_cli_list,doc_link"]="" +) +# +# See command line options +# +function see_cli_list() { + local script_name=$(basename "$0") + cat << EOF +Usage: $script_name [option] [arguments] + + --help - Display this help message. + main=Help - Display Legacy Options (Backward Compatible) +EOF + # TODO: Migrate More features. + #echo " main=help - Display Legacy cli commands." + jq -r --arg script_name "$script_name" ' + .menu[] | + .sub[] | + select(.id | startswith("H") | not) | + " --cli " + .id + " - " + .description + ' $json_file +} + +module_options+=( + ["see_cli_legacy,author"]="Tearran" + ["see_cli_legacy,ref_link"]="" + ["see_cli_legacy,feature"]="see_cli_legacy" + ["see_cli_legacy,desc"]="Generate a Help message legacy cli commands." + ["see_cli_legacy,example"]="see_cli_legacy" + ["see_cli_legacy,status"]="review" + ["see_cli_legacy,doc_link"]="" +) +function see_cli_legacy() { + local script_name=$(basename "$0") + cat << EOF +Legacy Options (Backward Compatible) +Please use 'armbian-config --help' for more information. + +Usage: $script_name main=[arguments] selection=[options] + +EOF + cat << EOF + $script_name main=System selection=Headers - Install headers: + $script_name main=System selection=Headers_remove - Remove headers: + +EOF + +# TODO Migrate following features + +# $script_name main=System selection=Firmware - Update, upgrade and reboot: +# $script_name main=System selection=Nightly - Switch to nightly builds: +# $script_name main=System selection=Stable - Switch to stable builds: +# $script_name main=System selection=Default - Install default desktop: +# $script_name main=System selection=ZSH - Change to ZSH: +# $script_name main=System selection=BASH - Change to BASH: +# $script_name main=System selection=Stable - Change to stable repository [branch=dev]: +# $script_name main=System selection=Nightly - Change to nightly repository [branch=dev]: +# $script_name main=Software selection=Source_install - Install kernel source: +# $script_name main=Software selection=Source_remove - Remove kernel source: +# $script_name main=Software selection=Avahi - Install Avahi mDNS/DNS-SD daemon: + + +} diff --git a/lib/armbian-configng/config.ng.functions.sh b/lib/armbian-configng/config.ng.functions.sh index 9fe363d4..c726aacf 100644 --- a/lib/armbian-configng/config.ng.functions.sh +++ b/lib/armbian-configng/config.ng.functions.sh @@ -10,7 +10,7 @@ module_options+=( ["check_desktop,feature"]="check_desktop" ["check_desktop,desc"]="Migrated procedures from Armbian config." ["check_desktop,example"]="check_desktop" -["check_desktop,status"]="review" +["check_desktop,status"]="Active" ["check_desktop,doc_link"]="" ) # @@ -36,7 +36,7 @@ menu_options+=( ["get_headers_kernel,feature"]="get_headers_kernel" ["get_headers_kernel,desc"]="Migrated procedures from Armbian config." ["get_headers_kernel,example"]="get_headers_kernel" -["get_headers_kernel,status"]="review" +["get_headers_kernel,status"]="Active" ["get_headers_kernel,doc_link"]="" ) # @@ -61,7 +61,7 @@ module_options+=( ["set_header_remove,desc"]="Migrated procedures from Armbian config." ["set_header_remove,example"]="set_header_remove" ["set_header_remove,doc_link"]="" -["set_header_remove,status"]="review" +["set_header_remove,status"]="Active" ["set_header_remove,doc_ink"]="" ) # @@ -89,7 +89,7 @@ module_options+=( ["check_if_installed,feature"]="check_if_installed" ["check_if_installed,desc"]="Migrated procedures from Armbian config." ["check_if_installed,example"]="check_if_installed nano" -["check_if_installed,status"]="review" +["check_if_installed,status"]="Active" ) # # check dpkg status of $1 -- currently only 'not installed at all' case caught @@ -112,7 +112,7 @@ module_options+=( ["is_package_manager_running,feature"]="is_package_manager_running" ["is_package_manager_running,desc"]="Migrated procedures from Armbian config." ["is_package_manager_running,example"]="is_package_manager_running" -["is_package_manager_running,status"]="review" +["is_package_manager_running,status"]="Active" ) # # check if package manager is doing something @@ -135,7 +135,7 @@ module_options+=( ["set_runtime_variables,feature"]="set_runtime_variables" ["set_runtime_variables,desc"]="Run time varibales Migrated procedures from Armbian config." ["set_runtime_variables,example"]="set_runtime_variables" -["set_runtime_variables,status"]="review" +["set_runtime_variables,status"]="Active" ) # # gather info about the board and start with loading menu variables @@ -185,7 +185,7 @@ module_options+=( ["set_safe_boot,feature"]="set_safe_boot" ["set_safe_boot,desc"]="Freeze/unhold Migrated procedures from Armbian config." ["set_safe_boot,example"]="set_safe_boot unhold or set_safe_boot freeze" -["set_safe_boot,status"]="review" +["set_safe_boot,status"]="Active" ) # # freeze/unhold packages @@ -220,7 +220,7 @@ module_options+=( ["connect_bt_interface,feature"]="connect_bt_interface" ["connect_bt_interface,desc"]="Migrated procedures from Armbian config." ["connect_bt_interface,example"]="connect_bt_interface" -["connect_bt_interface,status"]="review" +["connect_bt_interface,status"]="Active" ) # # connect to bluetooth device @@ -278,7 +278,7 @@ module_options+=( ["set_colors,desc"]="Change the background color of the terminal or dialoge box" ["set_colors,example"]="set_colors 0-7" ["set_colors,doc_link"]="" -["set_colors,status"]="review" +["set_colors,status"]="Active" ) # # Function to set the tui colors @@ -357,7 +357,7 @@ module_options+=( ["generate_top_menu,desc"]="Build the main menu from a object" ["generate_top_menu,example"]="generate_top_menu 'json_data'" ["generate_top_menu,doc_link"]="" -["generate_top_menu,status"]="review" +["generate_top_menu,status"]="Active" ) # # Function to generate the main menu from a JSON object @@ -407,7 +407,7 @@ module_options+=( ["generate_menu,desc"]="Generate a submenu from a parent_id" ["generate_menu,example"]="generate_menu 'parent_id'" ["generate_menu,doc_link"]="" -["generate_menu,status"]="review" +["generate_menu,status"]="Active" ) # # Function to generate the submenu @@ -445,6 +445,7 @@ function generate_menu() { # If it doesn't, execute the command [[ -n "$debug" ]] && echo "$OPTION" execute_command "$OPTION" + #show_message <<< "$OPTION" fi fi @@ -460,7 +461,7 @@ module_options+=( ["execute_command,desc"]="Needed by generate_menu" ["execute_command,example"]="" ["execute_command,doc_link"]="" -["execute_command,status"]="review" +["execute_command,status"]="Active" ) # # Function to execute the command @@ -484,7 +485,7 @@ module_options+=( ["show_message,desc"]="Display a message box" ["show_message,example"]="show_message <<< 'hello world' " ["show_message,doc_link"]="https://github.com/armbian/configng/wiki/interface" -["show_message,status"]="review" +["show_message,status"]="Active" ) # # Function to display a message box @@ -510,7 +511,7 @@ module_options+=( ["show_infobox,desc"]="pipe line strings to a infobox " ["show_infobox,example"]="show_infobox <<< 'hello world' ; " ["show_infobox,doc_link"]="" -["show_infobox,status"]="review" +["show_infobox,status"]="Active" ) # # Function to display an infobox with a message @@ -548,7 +549,7 @@ module_options+=( ["show_menu,desc"]="Display a menu from pipe" ["show_menu,example"]="show_menu <<< armbianmonitor -h ; " ["show_menu,doc_link"]="" -["show_menu,status"]="WIP" +["show_menu,status"]="Active" ) # # @@ -586,10 +587,10 @@ module_options+=( ["get_user_continue,desc"]="Display a Yes/No dialog box and prosees continue/exit" ["get_user_continue,example"]="get_user_continue 'Do you wish to continue?' process_input" ["get_user_continue,doc_link"]="" -["get_user_continue,status"]="review" +["get_user_continue,status"]="Active" ) # -# Function to display a Yes/No dialog box (WIP) +# Function to display a Yes/No dialog box # function get_user_continue() { local message="$1" @@ -609,7 +610,7 @@ menu_options+=( ["get_user_continue,feature"]="process_input" ["get_user_continue,desc"]="used to process the user's choice paired with get_user_continue" ["get_user_continue,example"]="get_user_continue 'Do you wish to continue?' process_input" -["get_user_continue,status"]="review" +["get_user_continue,status"]="Active" ["get_user_continue,doc_link"]="" ) # @@ -630,7 +631,7 @@ module_options+=( ["get_user_continue_secure,desc"]="Secure version of get_user_continue" ["get_user_continue_secure,example"]="get_user_continue_secure 'Do you wish to continue?' process_input" ["get_user_continue_secure,doc_link"]="" -["get_user_continue_secure,status"]="WIP" +["get_user_continue_secure,status"]="Active" ) # # Secure version of get_user_continue @@ -641,9 +642,16 @@ function get_user_continue_secure() { # Define a list of allowed functions local allowed_functions=("process_input" "other_function") - # Check if the next_action is in the list of allowed functions - if [[ " ${allowed_functions[@]} " =~ " ${next_action} " ]]; then + found=0 + for func in "${allowed_functions[@]}"; do + if [[ "$func" == "$next_action" ]]; then + found=1 + break + fi + done + + if [[ "$found" -eq 1 ]]; then if $($DIALOG --yesno "$message" 10 80 3>&1 1>&2 2>&3); then $next_action else @@ -665,7 +673,7 @@ module_options+=( ["see_ping,desc"]="Check the internet connection with fallback DNS" ["see_ping,example"]="see_ping" ["see_ping,doc_link"]="" -["see_ping,status"]="review" +["see_ping,status"]="Active" ) # # Function to check the internet connection @@ -700,7 +708,7 @@ module_options+=( ["see_current_apt,desc"]="Check when apt list was last updated" ["see_current_apt,example"]="see_current_apt" ["see_current_apt,doc_link"]="" -["see_current_apt,status"]="review" +["see_current_apt,status"]="Active" ) # # Function to check when the package list was last updated @@ -737,3 +745,83 @@ see_current_apt() { return 1 # The package lists are not up-to-date fi } + + +module_options+=( +["Headers_install,author"]="https://github.com/Tearran" +["Headers_install,ref_link"]="https://github.com/armbian/config/blob/master/debian-config-jobs#L160" +["Headers_install,feature"]="Headers_install" +["Headers_install,desc"]="Install kernel headers" +["Headers_install,example"]="if ! is_package_manager_running; then, if [[ -f /etc/armbian-release ]]; then, INSTALL_PKG="linux-headers-${BRANCH}-${LINUXFAMILY}";, else, INSTALL_PKG="linux-headers-$(uname -r | sed 's/'-$(dpkg --print-architecture)'//')";, fi, debconf-apt-progress -- apt-get -y install ${INSTALL_PKG},fi" +["Headers_install,status"]="Pending Review" +["Headers_install,doc_link"]="https://github.com/armbian/config/wiki#System" +) +# +# @description Install kernel headers +# +function Headers_install () { + if ! is_package_manager_running; then + if [[ -f /etc/armbian-release ]]; then + INSTALL_PKG="linux-headers-${BRANCH}-${LINUXFAMILY}"; + else + INSTALL_PKG="linux-headers-$(uname -r | sed 's/'-$(dpkg --print-architecture)'//')"; + fi + debconf-apt-progress -- apt-get -y install ${INSTALL_PKG} + fi +} + +module_options+=( +["Headers_remove,author"]="https://github.com/Tearran" +["Headers_remove,ref_link"]="https://github.com/armbian/config/blob/master/debian-config-jobs#L160" +["Headers_remove,feature"]="Headers_remove" +["Headers_remove,desc"]="Remove Linux headers" +["Headers_remove,example"]="if ! is_package_manager_running; then, REMOVE_PKG="linux-headers-*", if [[ -n $(dpkg -l | grep linux-headers) ]]; then, debconf-apt-progress -- apt-get -y purge ${REMOVE_PKG}, rm -rf /usr/src/linux-headers*, else, debconf-apt-progress -- apt-get -y install ${INSTALL_PKG}, fi, # cleanup, apt clean, debconf-apt-progress -- apt -y autoremove,fi" +["Headers_remove,status"]="Pending Review" +["Headers_remove,doc_link"]="https://github.com/armbian/config/wiki#System" +) +# +# @description Remove Linux headers +# +function Headers_remove () { + if ! is_package_manager_running; then + REMOVE_PKG="linux-headers-*" + if [[ -n $(dpkg -l | grep linux-headers) ]]; then + debconf-apt-progress -- apt-get -y purge ${REMOVE_PKG} + rm -rf /usr/src/linux-headers* + else + debconf-apt-progress -- apt-get -y install ${INSTALL_PKG} + fi + # cleanup + apt clean + debconf-apt-progress -- apt -y autoremove + fi +} + +module_options+=( +["sanitize_input,author"]="https://github.com/Tearran" +["sanitize_input,ref_link"]="https://github.com/armbian/config/blob/master/debian-config-jobs#L160" +["sanitize_input,feature"]="Headers_remove" +["sanitize_input,desc"]="Remove Linux headers" +["sanitize_input,example"]="if ! is_package_manager_running; then, REMOVE_PKG=\"linux-headers-*\", if [[ -n $(dpkg -l | grep linux-headers) ]]; then, debconf-apt-progress -- apt-get -y purge ${REMOVE_PKG}, rm -rf /usr/src/linux-headers*, else, debconf-apt-progress -- apt-get -y install ${INSTALL_PKG}, fi, # cleanup, apt clean, debconf-apt-progress -- apt -y autoremove,fi" +["sanitize_input,status"]="Pending Review" +["sanitize_input,doc_link"]="https://github.com/armbian/config/wiki#System" +) +# +# sanitize input cli +# +sanitize_input() { + local sanitized_input=() + for arg in "$@"; do + if [[ $arg =~ ^[a-zA-Z0-9_=]+$ ]]; then + sanitized_input+=("$arg") + else + echo "Invalid argument: $arg" + exit 1 + fi + done + echo "${sanitized_input[@]}" +} + + + + \ No newline at end of file diff --git a/lib/armbian-configng/config.ng.jobs.json b/lib/armbian-configng/config.ng.jobs.json index 4dc2f552..9a3a227d 100644 --- a/lib/armbian-configng/config.ng.jobs.json +++ b/lib/armbian-configng/config.ng.jobs.json @@ -9,11 +9,10 @@ "id": "S01", "description": "Enable Armbina kernal upgrades", "command": [ - "get_user_continue \"This will allow apt to update boot critical items\n\n Continue?\" process_input", - "set_safe_boot unhold" + "set_safe_boot unhold" ], "show": true, - "status": "WIP", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -22,11 +21,10 @@ "id": "S02", "description": "Disable Armbina kernal upgrades", "command": [ - "get_user_continue \"This will apt hold boot critical items\n\n Continue?\" process_input", "set_safe_boot freeze" ], "show": true, - "status": "WIP", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -39,10 +37,34 @@ "nano /boot/armbianEnv.txt" ], "show": true, - "status": "WIP", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" + }, + { + "id": "S04", + "description": "Install Linux headers", + "command": [ + "Headers_install" + ], + "show": true, + "status": "Pending Review", + "doc_link": "https://github.com/armbian/config/wiki#System", + "src_reference": "https://github.com/armbian/config/blob/master/debian-config-jobs#L160", + "author": "https://github.com/Tearran" + }, + { + "id": "S05", + "description": "Remove Linux headers", + "command": [ + "Headers_remove" + ], + "show": true, + "status": "Pending Review", + "doc_link": "https://github.com/armbian/config/wiki#System", + "src_reference": "https://github.com/armbian/config/blob/master/debian-config-jobs#L160", + "author": "https://github.com/Tearran" } ] }, @@ -60,7 +82,7 @@ "check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y --no-install-recommends install pulseaudio-module-bluetooth blueman" ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -75,7 +97,7 @@ "debconf-apt-progress -- apt -y -qq autoremove" ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -88,7 +110,7 @@ ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -100,7 +122,7 @@ "see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc" ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -112,7 +134,7 @@ "see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc" ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -124,7 +146,7 @@ "nmtui connect" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -137,7 +159,7 @@ "nano /etc/network/interfaces" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -151,7 +173,7 @@ "do nmcli con delete uuid $line; done > /dev/null" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -164,7 +186,20 @@ "toggle_ipv6 | show_infobox" ], "show": true, - "status": "review", + "status": "Active", + "doc_link": "", + "src_reference": "", + "author": "" + }, + { + "id": "N04", + "description": "(WIP) Setup Hotspot?Access point", + "command": [ + "get_user_continue \"This operation will install necessary software and add configuration files.\nDo you wish to continue?\" process_input", + "hotspot_setup" + ], + "show": false, + "status": "WIP", "doc_link": "", "src_reference": "", "author": "" @@ -183,7 +218,7 @@ "dpkg-reconfigure tzdata" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -197,7 +232,7 @@ "export LANGUAGE=$LANG" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -209,7 +244,7 @@ "dpkg-reconfigure keyboard-configuration ; setupcon " ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -221,7 +256,7 @@ "get_user_continue \"This is only a frontend test\" process_input" ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -241,7 +276,7 @@ "debconf-apt-progress -- apt update" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -253,7 +288,7 @@ "armbianmonitor -m | show_infobox" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -272,7 +307,7 @@ "show_message <<< \"This app is to help exicute prosedures to configure your system\n\nSome option may not work on manualy modified sytemes\"" ], "show": true, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" @@ -284,7 +319,7 @@ "show_message <<< see_use" ], "show": false, - "status": "review", + "status": "Active", "doc_link": "", "src_reference": "", "author": "" diff --git a/lib/armbian-configng/config.ng.network.sh b/lib/armbian-configng/config.ng.network.sh index 27b0d2a4..9d20e7dd 100644 --- a/lib/armbian-configng/config.ng.network.sh +++ b/lib/armbian-configng/config.ng.network.sh @@ -106,3 +106,112 @@ function see_ping() { } + + +module_options+=( +["hotspot_setup,author"]="Joey Turner" +["hotspot_setup,ref_link"]="" +["hotspot_setup,feature"]="hotspot_setup" +["hotspot_setup,desc"]="Set up a WiFi hotspot on the device" +["hotspot_setup,example"]="hotspot_setup" +["hotspot_setup,status"]="review" +["hotspot_setup,doc_link"]="" +) + +# Function to display an error message and exit +function error_exit { + whiptail --msgbox "$1" 8 40 + exit 1 +} + +function hotspot_setup() { +# Ensure the script is run as root +if [[ $EUID -ne 0 ]]; then + error_exit "This script must be run as root." +fi + +# Gather SSID and passphrase for the hotspot +SSID=$(whiptail --inputbox "Enter SSID for the Hotspot:" 8 40 3>&1 1>&2 2>&3) +if [ $? -ne 0 ]; then + error_exit "SSID input cancelled." +fi + +PASSPHRASE=$(whiptail --passwordbox "Enter Passphrase for the Hotspot:" 8 40 3>&1 1>&2 2>&3) +if [ $? -ne 0 ]; then + error_exit "Passphrase input cancelled." +fi + +# Confirm SSID and Passphrase +whiptail --msgbox "SSID: $SSID\nPassphrase: $PASSPHRASE" 8 40 + +# Update and install necessary packages +apt update +apt install -y hostapd dnsmasq + +# Stop services while configuring +systemctl stop hostapd +systemctl stop dnsmasq + +# Configure hostapd +cat > /etc/hostapd/hostapd.conf < /etc/dnsmasq.conf <> /etc/network/interfaces < /etc/iptables.ipv4.nat" + +# Ensure iptables rule is loaded on boot +cat > /etc/rc.local < /dev/null - - armbian-configng --dev +## Development -If all goes well you should see the Text-Based User Inerface (TUI) +To clone this development branch, run the following commands: -## Development -Development test brances are available for testing. To clone the development branch, run the following commands: +~~~ + git clone https://github.com/armbian/configng + cd configng + ./armbian-configng --help +~~~ +## Install latest release +dowload .deb package: + +~~~ +{ + latest_release=$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) + deb_url=$(echo "$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') + curl -LO "$deb_url" + deb_file=$(echo "$deb_url" | awk -F"/" '{print $NF}') + sudo dpkg -i "$deb_file" + sudo dpkg --configure -a + sudo apt --fix-broken install +} ~~~ -git clone https://github.com/armbian/configng.git -cd configng + +*** + +## CLI options +Command ine options. + +Use: +~~~ + armbian-config --help +~~~ + +Outputs: +~~~ +Usage: armbian-configng [option] [arguments] + + --help - Display this help message. + main=Help - Display Legacy Options (Backward Compatible) + + --cli S01 - Enable Armbina kernal upgrades + --cli S02 - Disable Armbina kernal upgrades + --cli S03 - Edit the boot enviroment (WIP) + --cli S04 - Install Linux headers + --cli S05 - Remove Linux headers + --cli BT0 - Install Bluetooth support + --cli BT1 - Remove Bluetooth support + --cli BT3 - Bluetooth Discover + --cli IR0 - Install Infrared support + --cli IR1 - Uninstall Infrared support + --cli N00 - Manage wifi network connections + --cli N01 - Advanced Edit /etc/network/interface + --cli N02 - Disconect and forget all wifi connections (Advanced) + --cli N03 - Toggle system IPv6/IPv4 internet protical + --cli L00 - Change Globla timezone (WIP) + --cli L01 - Change Locales reconfigure the language and charitorset + --cli L02 - Change Keyboard layout + --cli L03 - Change APT mirrors + --cli I00 - Update Application Repository + --cli I01 - CLI System Monitor +~~~ + +## Legacy options +Backward Compatible options. + +Use: + + armbian-config main=Help + +Outputs: +~~~ +Legacy Options (Backward Compatible) +Please use 'armbian-config --help' for more information. + +Usage: armbian-configng main=[arguments] selection=[options] + + armbian-configng main=System selection=Headers - Install headers: + armbian-configng main=System selection=Headers_remove - Remove headers: ~~~ diff --git a/share/doc/armbian-configng/Menu.md b/share/doc/armbian-configng/Menu.md index 8e67088d..1e50aaa7 100644 --- a/share/doc/armbian-configng/Menu.md +++ b/share/doc/armbian-configng/Menu.md @@ -1,5 +1,5 @@ -# Armbian-config Menu list. +# Menu list. armbian-config jobs list. ### S01 @@ -9,9 +9,6 @@ Enable Armbina kernal upgrades Jobs: ~~~ -get_user_continue "This will allow apt to update boot critical items - - Continue?" process_input set_safe_boot unhold ~~~ @@ -22,9 +19,6 @@ Disable Armbina kernal upgrades Jobs: ~~~ -get_user_continue "This will apt hold boot critical items - - Continue?" process_input set_safe_boot freeze ~~~ @@ -42,6 +36,26 @@ would you like to continue?" process_input nano /boot/armbianEnv.txt ~~~ +### S04 + +Install Linux headers + +Jobs: + +~~~ +Headers_install +~~~ + +### S05 + +Remove Linux headers + +Jobs: + +~~~ +Headers_remove +~~~ + ### BT0 Install Bluetooth support diff --git a/share/doc/armbian-configng/ScreenShot.md b/share/doc/armbian-configng/ScreenShot.md deleted file mode 100644 index f82a980d..00000000 --- a/share/doc/armbian-configng/ScreenShot.md +++ /dev/null @@ -1,17 +0,0 @@ -# Wiptail -## usage -### Ok message box -image - - -the following will output the boot up time -```bash - systemd-analyze | show_message -``` -image - -### Menu selection box -```bash -apt-cache search desktop | grep -i -e "\-desktop-full " -e "\-desktop-environment " | awk -F "- " '{print $1, $2}' | show_menu -``` -(WIP) \ No newline at end of file diff --git a/share/doc/armbian-configng/Standards.md b/share/doc/armbian-configng/Standards.md deleted file mode 100644 index ffe5d857..00000000 --- a/share/doc/armbian-configng/Standards.md +++ /dev/null @@ -1,37 +0,0 @@ -# Naming Convention - -## Categories -1. Network - Ethernet Wireless Bluetooth Access Point -2. Locales - Locale Language Region Time Keyboard -3. System - System and Security -4. SoftWare - Third-party applications - -# Function Naming Convention - -This project uses the following naming convention for functions: -## Admin sudo user -### main function groups system and security -- `see_`: used for retrieving or viewing values `apt-cashe grep something` `ls -h` `cat file.txt` `lsblk` -- `set_`: used for setting or updating values `echo "somevalue" > somefile.txt` -- `get_`: used for getting downloads or updates `apt-get install something` -- `rem_`: used for removing or uninstalling something `apt-get purge something` -## Non Admin non sudo -### user space, end-user Customization -- `run_`: used for running apps in the user space `/usr/bin/chromium --kiosk https://forum.armbian.com/ https://github.com/armbian/configng &` -- `mod_`: used for modifying or getting something in user space `git clone` `wget` - -Please use these prefixes consistently when naming functions in this project. - -# Help message format -## Existing Example -- `ls --help` Shows advanced flag options -- `p7zip -h` Shows simple flag options -- `git --help` Shows advanced non flag options - -## Base Example. -potentially build to any of the with previous -```bash - -``` - - diff --git a/share/doc/armbian-configng/armbian-configng.csv b/share/doc/armbian-configng/armbian-configng.csv deleted file mode 100755 index 40dc84ad..00000000 --- a/share/doc/armbian-configng/armbian-configng.csv +++ /dev/null @@ -1,5 +0,0 @@ -Function Name,Group Name,Description,Options,Category,Category Description -NMTUI,network,Network Manager.,none.,network,Network Wired wireless Bluetooth access point -Hello,system,Hello System.,none,system,System and Security -Bencharking,monitor,Armbian Monitor and Benchmarking.,,system,System and Security -Install,system,Armbian installer,none.,system,System and Security diff --git a/share/doc/armbian-configng/armbian-configng.html b/share/doc/armbian-configng/armbian-configng.html deleted file mode 100755 index 40c3d780..00000000 --- a/share/doc/armbian-configng/armbian-configng.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - Armbian armbian-configng - - - -
-

armbian-configng

-
- -
-
- -
-
- - - - - - diff --git a/share/doc/armbian-configng/armbian-configng.json b/share/doc/armbian-configng/armbian-configng.json deleted file mode 100755 index 806c67fa..00000000 --- a/share/doc/armbian-configng/armbian-configng.json +++ /dev/null @@ -1,34 +0,0 @@ -[ - { - "Function Name": "NMTUI", - "Group Name": "network", - "Description": "Network Manager.", - "Options": "none.", - "Category": "network", - "Category Description": "Network Wired wireless Bluetooth access point" - }, - { - "Function Name": "Hello", - "Group Name": "system", - "Description": "Hello System.", - "Options": "none", - "Category": "system", - "Category Description": "System and Security" - }, - { - "Function Name": "Benchmarking", - "Group Name": "monitor", - "Description": "Armbian Monitor and Benchmarking.", - "Options": "", - "Category": "system", - "Category Description": "System and Security" - }, - { - "Function Name": "Install", - "Group Name": "system", - "Description": "Armbian installer", - "Options": "none.", - "Category": "system", - "Category Description": "System and Security" - } -] diff --git a/share/doc/armbian-configng/armbianCPU.svg b/share/doc/armbian-configng/armbianCPU.svg deleted file mode 100755 index 4d19784d..00000000 --- a/share/doc/armbian-configng/armbianCPU.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/share/doc/armbian-configng/index.html b/share/doc/armbian-configng/index.html deleted file mode 100755 index dc65e111..00000000 --- a/share/doc/armbian-configng/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
Function NameGroup NameDescriptionOptionsCategoryCategory Description
NMTUInetworkNetwork Manager.none.networkNetwork Wired wireless Bluetooth access point
HellosystemHello System.nonesystemSystem and Security
BenchmarkingmonitorArmbian Monitor and Benchmarking.systemSystem and Security
InstallsystemArmbian installernone.systemSystem and Security
- - - diff --git a/share/doc/armbian-configng/system.gif b/share/doc/armbian-configng/system.gif deleted file mode 100644 index 2e839d1157eadbc8db3277cc5c0b17b502a2fb09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222489 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,u1udl|6 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

_w6>-UeZ1ii zqwn#`@xx|kn*7&~Mk(LZ!&E+uCL%Px6_&1RR=1YAy-;%Q;tl;MV#{6U{X6Mvr?Tt7 zwdId)c+o$~?!(%bEN+$RYu|YB_0F}DXX6h;Z+J{SDg5N|&AID_=Zxp_C(ob0^eSGn zp_iJy=A*S$UZ!iCHNRZWqUZ8njec@g@Wi16=dQ+>vsB;gK`GRv+U5rU>@$Js z1`>II+{rxra^&E7j}dVe_F=b-yB+&y#^C`E-m^%KbzfrShb1;V@+X5sB>4+f?-xonx3FF&+S6i9s5eNZfqv|jr^t; ztHZd)G_%j}Mjb7Ww_#C1HiANmx_V|Ku}SSV!g7teMjj(^S+uqynu>ZRi6ila?LDFe z*_s#zW=H6J6u(8WqNdWXYYTnhlJ4QXdQaQbxUG0Yrte&EV7>KDTk7%i$vfHBuFffK z;(%+@pMKl3+!PeKu|O^=Wgts1PI%0#K&^<&AlE=9{bTxoI9}(xd4Enu*}X!o$9!7T zM43w)HM+`C^F}^98d;6Q%TBJ=H#6F)L)JCyR9TJ@<{!5*&K`&;)z*bvo3s*Pza4f_ zWR3eRBhw|$Q(eu~!t{4vvXMMjz&g&<^l@vn`Rc_hs^gfEgX>y z&7vD`K=4op!?N*(LgV~3!vgf}tU2SDQI|Ed+%@iUhy8+5CM=p-EUlICfVYWNP~xSu ze(<3hXYj=c@*~GDdRiA@rm+@-61Clv87||(X)ux%$19d0evhQ`*541`eldMk{#Dz@ z0(Ucf&U~6shgx{>FxXC?b+Tl<{__Q3AX@#CUBlbNWj%Ll zmSi2-t6UfD!;Ml$iXON#Cm*i(8jyHt8r(%>X6%e!agSx6Efhhh?M+{~66q)h#XB>r zH|wY4oX$dX?>+rx>S#0ZaYL};3GDZMa@$awaGkKlRy3R7tM~y+aGv41lY!cOzL5&K z+AH=?pL%}#_7n6c7INjc%blG;F$MQVnUrTQ>c7owN@Nz!UhI(`^Be!~FftxWw}BWn z=3m_g=X&3Bu512)x#oAx%zb~q_viC*s}auR^2jyq(SG><+JP=pLSZh$uQ()K3}0#3 z|4sN`>_D9hDMqJ-SuPT$~PuBeK>Rq39<8RoK$}C&s zfKI!A7>(Lyq*R9ez$1FL5-j}FRE@h>*H!f|S;RyMHra_Z>hriYKpjhNT-E+|=kJh8 zy_j7E_G|phm^yHj>zjsKl5b}vRCW??tBzXa@m$(}B}J1vwzEbOKinNAbsj351;oMg z!whY{Q+Ab?0`^BL4UYsF-@>ex+w^Les`@AxoqV&JtSa83L=@S zf3>yWltuTQO0BArEnz!H8`3?MxuH`~H~n`+R}Q&(Rbhw}hqXMDcTL~w#;Ee8iD#NM zM%FjD{_4!9@$=|)7um*P7xt5W>I~;SBr9>OF=KgEf+2@PlhEQ)k0~%Q(|2n7Fs#lX z#Mahte!1WbStTw;&zP6*8D4y->+F%;e z#f*!-exuW~-Aq<^zwOPc`ts{~>wSce_U-qH>8E7q$UmgR{iFj3YWJSSjh>id~B5*Ah;N z*a>Ue87>{Sd4F0&KDgg07t1poLEN^E5`JQHN>GxF_vt|MuSU+5E!XJ?Ejm{w(aqh4 z;nK#A{zHJU-U}VLx==WhLyc&JomVi}|0>Ay!$A6csKNOM$ar{;r0x<>`gLsxJt&lm zodu%9CKe=u{K9mWvC#0g=;PJf-J+55Du1~1l8&TDU>8&c4G+UWpVvUjvwpo1b_4NX zVXiru1+Ckc^!QR#d(LO%L>Z_qqVnsYLOyFok?+(@g1 z7bI$WSOEbxSlGMV`{mmZ@e>@(h@c7Uqu(nL}6*gIeyau&L1TfE(^RP_RI^0|d}Zc96RIBdiZ%gce(bIBbGh59Lfg}>VFz9d=| z5p(jr2{SUkl|hTT&N5bgqNgh~oQxzvy(usqunluKqB1v0(yjlLD2IHa?!GO*0Jr|l zF<7h`jc^3MmLL1Vy2XL{?l_gB-TjgedwUQqH;Ia2rGDExgV;EHto&gQ{n0D} z?+(g(nPz%3IdTs1lDuC64}t!$4wTP*CnzxJeyMrDL%&X%Kjs2r;C)kaid&GYnZn$)}2rT=jN-EbbJeDApHlc5zc&Uyk zREK;={%7Da-=jpxojX#=NkZMcX}S292XTd{GS$SY9B={L$f&zg9g&{61xdeaJyL+e zOi+{ZaR;U$RBB?P?)K-aKn^1Ub7UWN-E>o;n8qnTtGa4SS&;A%(zkCv4XkCQF8_UC zn1l?C3X<-aO4^95YTZw;OWu$m2?-u&dF_sE35aG8q%V&H-eGB565mCM=)DF&7si#_ z%M)&*d*O2!4k`IZ=vgOaM(WiHR@-<%LGb36`cK3ik!AlUQAf1J~_5r#p z&2JArCBE(MU-?CqoNoZMhKoLXWO1XiP?RA(j&5j0J+{GZJAcn%V6|ybbHuU>z zRVD(|qiE+RA$;lghEm!*olQ!LwCG@1aO(|ue>3C6=h7KI&bhABr`~sV@go{)c}H2^ zlgB_y+tqHY!c`ydjpqSoDh0j zUtn07HJY5DIRirKCPbYbDK{R&AYm`9^F+QXJfiypApDrO<;c~5lxyGgeR>Ok`-*xG z1=P#fJo)7{JwYL=X}mR*^GEdg#%Pa)1n$8lA3#H%@Xxz3sb01+yg_)qeNHGd7#@iC z5Fq-7(r`Z=0E62^{z}+>mAMozJQl$54$G4Z0UN)E+?5Y<*r2^z%Drtt9844L#wr_+ zyCgvq?=B#m!;9p%4ZIBYDrT6VE5XP$(9Y=NjBp>g7Xl3S>7+yU1b0VE8x6KC-I z5l~HqFxwtNRl=@q*jb!e#XN11a1^CxBT_==oCstD(!U zM~JGuer#B`w8o_c9|<<`KH5%%nfN{`j6KCtn_&@SZ6vobzUZ(}_Y-G=FC++usEz~^ zc8FG^csME}=-m@p=G zI1#ayxVnu$xQ$$5jbdp@tfA@}g@28VQk8$c$cj`jd7pFevQ+da%`3dW8GzEq=ZN{p zavSw_EaC(1KU`ajIMfymI3)1xVV`qYr*MQk=dMKEl?851^6s>yKqX&rn4mWCz`dOm zh|Y7nde#W_1+y(>m%$on0 z{MbiiNcx!%BfNX`3~>{lKP)j9HkHpBb5b~kN9SDb4v;IG^oNb-fWY&I%=4!WxrN7o zt&^Z3Jgrecx-8Jv8Q+3Mthd2;ne_D9sF%|1NLGG=gBRoJ3?xMXN%figjF)?CsT^zP z_$xCxym-W9fj`&`SbK_%IqHCr0cNK_*Hn0{lgpEmS;nzXQP~{w7viq)+R47yW=ls( zW~6ebIz|DHCV5$^0u*m9M`9-0ADCO`LFT+{cyi&07h>f5$t&C#mc@xBY?JKGXcOk$ zoa9@P1#~iimijE6bY1}wRK-pXM-J-!4r-m6`Iqntp7WB)NWKKiZ`aKP5)p`AnHCy+ zw++67D=@nvEN#I%1Gu|f(h^Nhrc=_sV+vtwSrYB}sE|Uq7tcw5z<-M0cNaCfQ+PBa zuy3iLg9eYDg1=#65iwKeGlwrB*o$BGAU*-+ZET26HpIwZfBDnMZnhF#r7+V-;MuK9 z{ZyTu=c#Iuz6$bsx$iH0ApuXWIHvZN6kkB};R64V9F`rmS}l03c3ss>N{)x=5U1sfs24isg)om4=Gd zsfypb6%3I#M@&N2{e=(jzL}W}B^A{K|v4m7c z^A9`zRJXOqKus|4xSBHoY!MFfk*o$VL+U!8WaV!Qf)6noXn$&%BX_tS#sr|bXo#Rr z)ynCr9Om8A{`A`!8&AMqFj+-7Gg=_q)X3|bFSG4RE!Dz6(CJS!cR5)@qfjmbhyhDJ z7{q8+F^r~!1h3^ifXKs>g{Y{t!2RgB+ELq0+e>3q+(w2#WtE5l`zPU)Du8im_t9Zd-OCCKuhJ1$Ic9{E5ZsyAs>$ z?nlk^y-N8;fChBhk)zvsNf(f;#BXK{@Vb$&!L)(;6feRank(8MCfNWFY1r1kd}Fje z`{mUv%Z4Q#xM>U@EAiV6=X=)%yu~$1^VT3jnppYa9?NFF$|kFymgm>5)4l*7pEl8% zuFdm(w_8%0K3{AR;D8XQo&uGgo|G0(e2jRG(Rv@SdWP4R(V~)LKfd}n-qS!h;Qp3iWNKqdj$!xGQYv?;&}~KeY`Z_mbj^nz_XB|Qs73i z6-R0~&nvz=qaCQO_7c%sI|A)Ru0f@Z)aE{b|7`n_ejwjfZv?pAyVb50VI{cF%Tv=a zy>{vJPhRsyt+X@1!grvhhxgWW45mPL^5F*s-iuVudI6IUY481Ss#GC|-C2QN$@UME zyzdOw8nuTTlya_mH|fe303~M#Em!#-HPzj{$&L;N#HpMhELY&FkTRi%#2n^`p6-d? z?;(qQOw#z6eDC9nXCKpEeavY3_-guN*8WF|SZ}UIZ{EG$f@i%&uX;Hfj}ewx_8Cyjy8 zdjsRo1}0t&Of?NmPY=xQ575O17c>SJp9#s}2Iaj5m#6tOsDr=v2N}~M$AO^@F@eAL zh9q?pq$%s& zU1LAO#t{)P5t%s=-8>OHGZB9E7n){%h?%t}b}-90Hph~YNs!rvsh^7nIQY(uglMvPZlUg$k1^TU0UA3fkPgnGLtE&q z9XH~T&Lch#XwCCIm_HIYFPJqi)G{wJJ1=%PFD|}-)>=6JfVII~IGME|)3R`ScH!(H zYZD46Ql|I@VmNX>88A@ZI4;Y!uf_zf|05aM{qq2VakWH~-H`rC>>P&%hCK}rkH)|s z0URLU|EO&+yUfI~iplI8YaC|?!w@faPBd_w!pYCzuED}<7~GNor#gkD`sLIhuavS{ zjE5@~zgLRlS1M;$YIuIup8r|b^0WGIO{**&x2o$Ex#sbe|--8IbHE{?vRx|_+9(^*QeQ^D_Xy&#DD*8 zS^eJf`v=dT<@0~muK(6#pj2p_ymU@^fP?MWwf*K{M-NU(40nzP{5im`faWX|U*pqW zJ0iDM@L)|SdrhQuO>AyWoVkXUSU;}4E^W1bGH6{Ud;N6l`q{bl^UU=V37k4i8YfDE zU57j+32+#ap+cFl8Rr51U`BijtR@%+Vp}U}SutweFdo`aC2y$UIZF>Wu32pwOKh5W zZdwd+nhtTA4{cs)-Mp5tc~frd+T5nq+@?e8hF$B{b=0Q)n=Ow&n`YYoj1soIB(@&T zZTX_MO0%~7|7<;bvr!VysY==O)7}he-3rtG7xm{KOM2(Q-1e5+el+(lxpmt?Zs*|~ zrzY(WtE8aLw$UgA%f)|%XtPs*m1_J3V8uxt;#5TMQBiy5+MFhydp8sIR49AztoAC0 z_FCljtL64uwfF0-IBT=_Yf<~{L;H={`|Uydy%Gn_RtHt6gHh)GXJ+gEXYB(;w*A?J z{h8LiK`YKltHU3t{Vs{aYVE^`8~X!)_J2w+KP4Q#{d2h3%3KRNWNWvLK#D5607ndI zly+f7u9e{B4m8g(Rl(z8W(*241b+17Xr#&fWs;&sG~%QDYn@neWT;)S_hMhtDf@!( z`pVaRuVge~)534RU&}f9q+&EG*@2cP#XA+e+<7@6NZzIhy>`P@sGNBo!N#}|9tUK* z$$lc1upy6$imHhHAVW~0T%s+0d%0aRwI@Xf9~GtknK`Pmdpw0@AfO9}ivF89bAe#j z6ps8CckyoJO!s41-9z}O*S9Vr$}!9GpTdt}%89>D?mO?g-j^_0&#VXuV^)W%DN+u}A|L;oE$fKC^fd}5c^x~ta?rQT@06o|ZdtYOoch4=*f)yeJnH9j zb|e1E$is$z{_5!S6?M}6r2dLl1Utho-^n+u_)CwQ{TA>0c8h1f^v7+U!SzLit5{cO z4;Qbi2(RtQHvuH+%AQY%Mjn;YGVgg%l+w+0gOeeji^;&NxOdE;}iVuuXuU%^U=|(*KH3> z$5dQzkBr6PQ{H_x58CV>|8u-Qg?hjFSqPEuBzm4JihSa_x%JC)zsxalNP!6xFXh{J zO;2nn_u;PujNN;1RsGJ4*QD6^jLkeUl_Z|G(hg?3jh~k|f|FrjB`(o91x$_RZ8?tF zMe2}*G%^&xV`WL(`R3&fJ?QxKQpv9(OY45UiKkms7oslD`h5#C`mMT{a;1XZKF;kV z^lQ3h{La@@`|&!v((5Yq=QG19CcnK*Q8Bd3a2K4id41bpiupa?*0V~Kf$ zuwCiPS+$iq5s`MpRh}pvE}g#X4UPpN;EO-X2eQqR}cSFzZkbu{3m~totR6)z)tg2Pe`_W$peZ zYCULXj9(56kP4E#o9Xx^s9V!xqWMMhzvegKtnc%W<+2!4J6T^GzdgD!^JFfk^}cH{ zGHKp=fHx|)WaOuZhJR{dLcrdn@CEI?>5=S@yI;Sb((sE!r1V_@k^&AvZ>Wv*#M$(6*9Uk7JXIE^~GCu3RcTg!bzvk}yH-l^4LA9Lw zx|i?sSKpLQT^NoUcv$f~bH%3+h1}%0cWET+-+M=`&H5XGTO--D=|ydjIxbZ3NcR7{ zS3P7KuJ-7I3pHma-#U!s-Y=~=_ode3Ye(jp+VeAwzJC{HN^9lj zS_3&b#n0AZ<~t+!r5;Q_Uey-UXshb!-OP^(dY6KY=8ZK?3EI9A`J5qv54@z>qgN+ zi~rMJ>BrJbLYM6KS3cv;-!uLG2iE;0BJCR)F!i#2diq`JBKVu~%74SU7eW{b5JA{x z4pwq@RQ3ki%z{>!Q?lWFy>P{JrAPq!?zB#^KXdAIQErF&&r;404M`Oj=6ipXS1+lb zDd{W`S$$I>zK42Kwzc@Psx8B!tZeY~)spIw-x=<2CQhFDb-ll2W3_s2<%oyQSA#EQ z^;Axn zQeNx+Ppq3_Zvl|-;<5jUbw9lE2duo_|DRa5ctii+AuQzF22Jm%yHfK7iSmt4#*hEy zUl-Y)-WWB#8(=!HYf-*Ae$VrT&u2X8obL^*1oy4UOST8MCY@@3sj#XlwDm7OpJ$Z5 z_c-0k&;`Rm`@iPB&Ev%yC_RGUle1GX1pyU(aj-n?*rXYuQa>pS1lERFq^UOk>2 z{hCEO-{4G1@Ywwk=MlfVQU*8Ooi6V_zqk7CvzBSj(W#2P-&cwU_x?N`+Ewk-nCohxoZC-xMhvUJmu`>7F6Lq7cXTe{E0; zz!up=0oNL|BK>I(w%?kAv<*A>GRVIC8aXgoa4WN%LBzz)f4d~pDdJ%q0Qx~eK8A|S zmrFlAvX}!fNrrmVd_sWK*<8NVp7$j`s8KjK7`s=c^eZi>5$w2WF0e#Euwb;vr*6I^p@qVLM#QyeN&JmL*JzkX(SM1?ef$>Fq z`p_khngf><))UpZ?KmXUyYHO%bSfz?kG0Y7*5-RpezhnmA|TwW=3kW@&?J5O?iD~D z#+6)VYTd|{YarcKmGG2n@!VDJzWZ5>V=7f(SqQXcx_&G^XLmc7MrGuH+#pwSVbU=guIK<89WZ zjd|R16mtkPn3Q%9o1-Nk&QT9ae!j0!#PKKnI#Gm?&XZz&;fim?#BHT$#I@zuq2XnH znsBRJSc;+U>6^B`CQn#2f{`*gxVHL;40q&@tJbGS(hsEzK*hz^ANP)A?QRsZ$P*mN zXfzkbRrtCgt@mCehI?O^_lo>`?L4EgVvFh$v*waJZ+pke{i{py2PI~mBIBV#3uPRM zD@KF8;~|vWr#wMMmS5CwH#DS_`wh5S{EfcLU~Ik#Mwa0@`}n!V6djQQsMoJb;v9Xx zR+8h&>`q;s?6ugcN*gG1_zxe;O<#1v!Q~5jq81^scdBwvoO8Km2@EXRRXaR&;|(Xi zea{R$WmxTEfH|CphivE8-rp-{`B?7FuaDPtpZiZA%Yyjl+Mdl{*Mh%%S&0DGy{i1J z?JEzg+T1-ceWK@a`Ij%YW)!qtXu5m7;>}R(SBbIhZk5F|fTvrhC|Bj1z(0Ga{oQ{p zhvk0)Aggl+E48gq1L_4qF*-|P+R7!~6SDb*zH4OG&R)X^{dv(E?CIAb^7{>md(|4u znbsz)f(e#&!wWR3emJw_8FD+8zQdO%@^>a8{`*g)JKIDz0_>fjziRCsY1V^P@lFVO zwzzjvty}GdTzpOwQVgZn%@wkq;(pft?5*^cvB*Ezg`Y?_w3O)E+dnR!IXOfmMl(5% z6bUGEEkHDB>F5A-Wagh$i1xlNDzM^h*4{lwZMgJMfOwC@;V=pNWfB$R@eaE|b<$qk zkqBDWl{ln1UVOOwDX>6EN6g*nn(gkV=i-K0Y6ss#{B|XXcdAQ{9(>nwY#7cw`L1AZ z8iM^R^0{%Ty29)JvX$t?&#g=E@=4{ZnoR2FR#+Eb^xVnZnZspG2&Qwy@ z78ZeYa(TTw96Re%Bk8`vI!AO_mr^xnxwFOVhN;-|kFo-E5O7nSd;!0-kK<=V;t#(L zc(q`p%&ent0eS+QA=|RXInlSU`x2$Wb+QWQ$b5ptlM;?#7XtT1s<<-$7ce(5dZ$GJl-VK%%a4bC;c}D*YZ=ve&GIX zzt`k>l=U)qMW9uEOf>6Zk>#`Ra&LA|E3|k~UQT}#N~oWDdYEt%8oultbWtZ<{Bi8d zfK}|!9yZJ4ac$}|fk3M#Q`hFVQjR`AhkEX5BNF^R$hDwJa{3E1Eq=YV0qdcs_H$o) zJy3>g_|}2gU%3+JMDKQr+H`ecsUb+0xA4^|!J$ZDP9|EdcE zeu6r7gP;=IZE{*FvBu=je`mMrgEW5!dG7tt4MNwD0vQQI0aK@}{>`EenOh$u_NHoQ z_rE$e?J)v!k zP|S8Hi?Hfogmw_Zlp@2_%)&01g{e7(sZNApd&1Ps!gZX&^@PHVpa{k7uuI!v7lnu> z+u;Ti;f6BAONKNM z`;i{20)9oLCo%vglH_d$XvzS=P6$n*NX@iJ_aZ(QRYWI~!3q|^-{ZIp6i!y#hsN0u zHi=Lw1{uE`$-y42o)ZyX7lCDu^fe>-m_qGQjLCM7Fi+``K%{8#3`n! zC+68iOpPJXCKS^yM2a_zu7;A{EXUNzU}|ZeKSSl0!sWL?KJARC;z<6+?dZbgm@_7k z9d#tSVayky*fPWTkIQkzk)kXo`~ zed3k+Tp$YpO&#y2zm>8Cd5xl1mDymCZFo~OBLu5xH zdKk(7!(n-qJLZOP(pje@COP%y$519MRa-bEG>W|05!W2d#gWLt#BuQ_VcyzE|1wno zKZy&vlKMX!mS$H{%(+u0Cem*{NhvW)bA>)Pq^EF5zNkpT@Dp#sJD+D6rei;**F+^> zf5KYSyeyVU%T-Hya)s2wosm5$m)DcPkti&&jmn6`{IipPu7>ENA{xyz4V*J4oHIM? zGfj40zBhllUxgqu{otqBLt$^_xF#{P!BD0nqOa{m7X?urMe4<6_cBm@`2TQNO4es@ z?L_K1$HXsZ_q8E5KO&$j+3Q!5y!|NPl58f0(u*dstd?6*Bp7$LYYzn%l_M67cp8O> zFUldxq`7^3@u!%)>73Gz$^4t1d1OZ}84VPx0kM;>PT9VgugpSiXQ5$;b~;=Q8u{-@ zHm76`zYD^-D54F>-hGm=x}9h&lw+u#(-BO%Ws%`!mfZ;;*3DzPa5+W|dBKqsw;vIo zBU3KOkSMAJr%va#v*qD>ldO9YCt#E%r$4kC_TiY_eJ&uq7R+qp_=(+IieSXRF6P*V_6H27|`k1yHh0|MPwGZ)~KG@ z&M2c%V#}b#BgHWT>WDKddHq=Aj(JXhFk6)nu>!DQ7sqD0nwjuf>FhzUc?|B(Tk@jpUEwyvTz<)B^$C6c<@j)dS!}# zx+tHzU9o6h6szziE-4E!Qslmz)kuN)&>@uoG!cu8ud8k$u=qGcBLU%3mpg>Z4*CIa zq{D~kFc$)Bj0z9KK&L1#5{eM78{j#6h_auE5jI344UyC!O z0S0PBw4s|gLaI;gBC6<+UPfp?Jqox8rLpC8)AINCz^~ex8rz!d7~o|3^8rl55U$K^ z8<9(ccGBUOT;HCELHv__t97-akqmxIy+6MRDQC<5y<9QAQZZFmVUb>^&`=ju|0;g3 z?uI;zL^THT9>)TGVdYft zTQ*h;43bL;sc3^b%Vul2!riFgS9rKT0pd<)wb9*5X|O;7Bn*qV*jPD=W>HWGXBvdX z09WH7t~l-qG`9;g7}5xETVcSNSVUA4_ZJrX)(;z{Lr84gm2F@G0TKj2eJNlgG1g}Z zn*vyYG4N|T%%27hV;}?Q&`K(t)n{|1aW_&R6KwEoED}3~XkdV?f+4j4Jb=a>h=JQP zKw;>pZZu-D6#M`SZ6v^b*tkdO$P6;~7zV*2vI7b5*QXI9G?+aA_NKxM2w*od>^)mm zHw}@Ghxp;(byRR5160d`Bk{0V9Jdt#`~r*UAm^2v9U)!p#7xVDp9YR%01^xn!I%F0 zNWE55WG4afg$_+&AXy!`w-^YGMKcF;&$7W?(cIP4?nX99ESlRF13$+61^e?2Qb>c3 zP++la{p;KaYh!3P9a6yn53yiJHfR8W1;@cYJ_R>o5l+U)w{*ytV7M~@nM{Mm5uhy; zNCg5J1aQv*P!%Myjs}^#3eTfL9#fD6415X$e~gBP;v8)*Lh7hUR-F8*7$ z(ZK1(kYE7*A{hFP2A*O-s3gqz0>d4S zWfkODY&EjKjN3h!dyGKqDuhMR;4OGaH5wKe%=%quaAD&H5ZuXhxEYoO&_Z*9kwY{{ z85ZI4u|vLu=D%Dyb`FC&Kxw0g)r`f-OwpICKZs#h z9OI`7S@Apq4dTvXahR13>4f6zmKn8R()?An0S<92M6epZO}Okw322UN1N)wLRdhjYcSIP+E@^on+#0k(2 z=tw*U{*ieO_Ju{+vMdI4IC-k0QsxL8*@69=Ega=Q~?b=0OI z2Ew1}?2bV`#KS9&^`@htK5P(QI%I_LHh=~r;US@I;CveNBNaSJgSfFl3uxTgIJheY z*-rq+(fzICk%M&jZWFwe0-*$dxE>E3>M0*_S?a(dt1ysUERsqFCo?g~AS#4}fp3c< z1~712HfReC>bl?e*$**;g$9r(-crFq1W*kHDcK5}B|x3=FwT;4!^8x^=QC`=%DLyo zui9S*sR5tOvU>;!bPhXqZMC+-LmJIezDg>a=2Yt=x7Ux<8&4`ZfleHD{vdn2b-Z!vQ)Yp3{-||tvd$TeSdn-3B+Vf3 zj7jctryp}(8ELWk-`KjBpU%-NnTPI?nU?=NW}9`Mw*9i)X3Wn@+kAC3x2blwtCfFT zhqUZ;5KI(!v}gSC0{O+x`7j4W+T#k#O2}V(a>kpa-eafkit|orQ?O5r7O%dO($C1; zNmA*j3<9O<2Pbx(iN}NuLSR@ksZE{ zftE0kbuw?BeX0w3H-9zPF+6G!Wv>1sEK%!vlpe}BqgX%1@tKJOy3$v8F~K}bc&N&e zARHl7QDjn}5$YFRl6NUvmceYWH@JlBwmvQ$eLSjQYPch$LbU7B(Z77g!nu56YZtA# zl1F>Mn#Yzp;tNVjPTjfkdSgWRRzTu7a9OWQfzRYy)CcpZs@S69XZDqH#^(7fL!x5b zZSCVx0V)>G*&nJb=F;w+Q+2J4i{l=gR=Zf^U+bffM= z{5AZrt|&fu%0AWOcW_>cnSaM4L3O?Q{Pg=aACp^ZeG~0d?a?iu49m!=55jhKYs7*U ztpmhj=wa!j%a&KWe!qq4NT0jepro{O32{Ruz35fiWMZLR_RPC+^TIe`dq-ETozKSZ z_D?MGQ%`!|E4&Q{TSlEHJ25#+v%7Y)VbZyu6p!G72YSo8Ul?9>8~oLuV43l^OHi|= z-ahX7VkAgVd&7Piu&Vj-6=iAA(Ic(XWcD@LasvM~VL!sz;f3;vMcs>B+h`b1Q@Pedi&jeU8Ou4C6nb^%KiN8MzDHFbQg*W?4rMQKPGecmMU*pt zsQZ0=s3>X%-(%$f?TT{rQ7&#zn&RAX^-o32xvuDv@5Coc$LW=Pd|s^Wv17oeGyX&B zML}rJNkL7asC;3Q)7D{0w@+K=KQ|kn&=WPzk$X_-;0w;neD~_n+wmNS5QUDIw|uHP zu6CAJo(dvI(WCt$1&V?WNt zrc6#|n1xWQ!xXq$iesLF@B7O&6~njp>nJ=1jKV?l{_5_u*WH!jLWf z_;YdoaYc{HnC9sP;r!elEoM}#C0nO7)6gJfqaGfex2jwch79hhQ*!#`kzOg9w0e5Q zIQGTKSDnQLzx}>92C@BlZOD=1Vd(csI_{Qeq}c5%#tS7Sh{{u%UJ**KEy9ZadWbirNO=-WIg zk@?N-pAQ%qv^O=XcmSh4O6*<=ni;_D$S&wuq$_o4>EiE{(h!el~Nr`}FPjXu(|Z z=ATJU57TD8t*KNFWZd^^6us23;HK^0b^fpodtw*nI)|+jxyG`t(ZB&ek z=`h4-HAlGNQpD*&TBJEOihuvv@qLGOZYvF2!5+Mvf`xUAwU{p8if0|CVv)7)hR>Df ze?)hfjdtVmlReNt?k%Z6%i*M47-Xw^BUB70{mxIae8g50>{zfPC&PJNVX+alwN^o|< z`)$$g+c}69bVMAvGERHj=2#q_OXIy#oXL}~C|_Fm_m(xH=Cd&2#$`^WCiWPEvan)Q zoK%urv$OY?+7@F)WmoUZ)jpQ+zF%7XF9P(DIz9`6H4_!bgx*3-+RRa6PdhteCy>nR z8`ehx*fPW8*?V1lLLabH7fM}?amLG%f>mkYGi@}mrLiYZBOrgwmmLvnXZLCN-Mgf| zX73lzd1kW`s~j&KcxPN3a1(&R&aWgdTcA0F-=p;;c;sQ17`s3f1$;JsI1c-cLo_f= z-=ga!(&(MFKnoBqj;=hKBxZXwM2PETmSm(E?l|v=5cs4}WsKd1HE*krlar;^;|AA; zB_@eUeOKVqB@r))NnTK?R`^`TUkeX%Sb$D<}W* zJ!!+w4Kpl z)INC;QBenw7_!Bbh$VbPYB1Pc2qZ@je}IdyHzS!WbGcw5(MqXp6JXEfv(JMgI3&5< z*oX=kkQ)x{G6Axj0NZXl^3aDrt}6ttX(%elh3&J-L4kYPv@3pJN3!?vm+PJd8H*& ziFYPq?@SQy09@h^L5^giMNxzSJI% z_JFTY!d-+Sge_khk;ARi!rh8MI>8_Ckx;uLqOu{UF)rdhHXO%xmcxICsA{KyHI~Dfo>VR^M#Ozen2rpmUJ=+gT2x&P zgr$XDTn;xf8+&833!`pjih^3YZK8(Jklj=7hp)$bw*UOM4Q@wc%&p+%AULP|Q3TzV9e zjto(UP;+e?Y-kwH`l;2XK#bTv9xDbb=5SikIAeyx^r+!AF=vmLfUni{+@Ap70f?SB z&?#J)rx{2k?UgAu{_+mkL7ceiC^ClF-2V3ZQ-6W#G7adpsa7pRAe};c6u@sDbmyU_r)x^ z*>{A`g_a&}eBvVhs4@X`@>AGt8P2QQVB@qfzYNa1W??$$Y{N;SEWjmF!lhT#rA7-^ zB45?zAZoRNtZ34gC=J?d;d(`>roqJf_!qY14y_(tO&pQ`Lr!uVDC{B8dOJ*;&V`LM zc5Vx0j)WQ2rP(`i-H8OL;2;-+K}JI1x_C}I3g>M@;!+gxqO-uh_t3d=MIh?NpXX3U zW251-xP9Z=^{2uvLPX|m8RD(B2x+5t*MV>yLy&tNQHRR)NGx0j19}&8#04K_Rs_Dh zegZGVWe~~rS0*}YhtqkZA=nvoht}n|9IhS7C5RLhyU1lYA*AEPb$>O|!wGa16k*B6 z)tUpsk->U(AU7G1wi74?r+)`cw55exv=OzT;f6)vJ3?G~RASmbmrG>RIpuM?&>Q?4 zE$M%+hQ~HvQBqdYL~hH%AGU+#Ou=q#V0UbzV^M?y9_&7G=izXQZIQA~QKf4N%xf&- zd?u8!E_+mfyQ>InHF3wSjT`a==Ek~1rgkJuwmQ=y0%v&iDm&I~qFp9pD9hju|E$4= zyVhv9J2i@F&$>*~9Jf7pX6(yV$74K-)m26sJQZotVNNn>1ns`lljYR28^H+2|XS5wEZF`>Jf1m~p7yEj#NM`oCgRgvq`3NIj19 z`}O7?KhmA%zo2*SH4zf8wQF^JyD3+$w)0-jQcoi zt+QT_J>lb8*JglL-DEDYSk+<^A5_T5X+0J95x!uUY}+@uKtBJ9BoF+j4|+PehnSgd5!^@E7>}`4|sM z1k=L_VL3k|eHh!>i^8!RUWllV&%bfn_s+q9f>QaH#=T^`5X6j3dMFd&!`7#PAX%xB z^tDI?D9PXftBVK`&-pqIfK#B+l8y06Z3{++i1A;2jh(jAH49D8>ZwrhBQ)_@56Q0x zVoCv7q;YwpA$Mx*@63|!Er9}o{2R`;>O3%}E*S1p^6w1(1~@M5BErq3IpZgKO{#yY zdA9i_jDjQC^pFAw-xPw0*PS>$(2!?6-vZi5-d*>T3kSr?Jvwevru_QmWu&e*$Tncp6Cc(M$+LJd=v0ePsBn2%*5{Ai@d zh7b=jB!B?%rhnVEbv!yAaYT`Lv6QIY1~OL-(-w+&ELLN?-mU>X(R%MXYgCA{-5m$qp5sd`#H)y^uq7=Dbn&q&#K#HZl@?~uMszYH5o92b z2_%9a$sbMfT_&++U?p4j>c0`ulrSx)H#*B)+B8m!w6I5JAf1Vb=MkJir@3!!Ev5@9 zpE7W$Gr%|xz?lJR*)_|p9`7!V90^9*i5&pW9~e`@%hUQ_N^P%i^6oNTtvG!S&* zdE;91&7T6gPXXyONUUTx;@>iZj0QjantmG=H4^cX0X}mNoMR7+RXc|uT1D; z%-lJxLwu-)MX3NUkF|GBGr)Bg1^<{xb+HC&&?8>9G3Wv;sl51AePemamR`4yUboD%?=7}uZ|SbN zTL})jD^`^=Z+6u$T!7#YqP@o^LQBmbGc&$!5nS$w4c_#>>vQTgK59iK@Qqrb;k4^x z>x;~|NM@0d9+z2~N1Mx~yXoB2w5YVyopjGj89_T4wL9sgomYR#(C?pQc*doXkR5x7 ztP8uDtxsOx-FTzSr_^uNAW2c67h})PBc>{nnwq z&VPFb+oT8E5Z9#0<8An(M=js|Lm0|%I^E+`H49V3g$>*dQ!)!1{h1pZ&-y>(2R@!zmptQ154LihyEg9o2WrzJ`zCUmZJ&gbk{W(V zh>&nwFVJJx)uNAZ`^2M}q02HH<+2V6>EuctlmJoJ$_zUi3v=+_S6s$94$HsA7`3?X z|Kt3aBjz+;ztWPRmBVDPbF_a_HA_qlYbuxg_&~pW(jVtr8yK5#&Sy!|HpxgL#0EMVH@~N=xw9-!I<>-w`*OEeZd? z^hG`RsinENEaHH%XcExh`00Sklky#VoPkf2CnuL7r1gU5bLL1a$+NMepDoM7nqL|% z&FMV9bqAdMwxsW{|5=zu@a+5#!E{DZjCe=b>pm~)3jX=vJU(Zpq>?wK{%9R_;*CzDb_}H`F6QJ;# zDMuGhu8dC}P4+9#T&R1uHeaacu=|@(@1H3K;SVRP=E8j!2l>MNH`m{U2Qb8pB7=Bj z?$KnRn}HgQFSa)#Bkzegsp^=lafHa9IQNQDOwSZtCrKSXSbx2{)g8Y9?q zEA~;e>IiQ}0(0_gMCQ=_+X%J6tsptw^y5dLpEHC$npflh@aPNu*Q4PXjC;iQPgO6? zUpqaEK#PxQy}6TEwn=;eI9`P2&sAbh>TO|KfuM##Oxzc5Q_m| z5Rc0w{K@%>TmO@b?{6?qE;kb8pI&X}hd;gEuj_w$bKK*l2$rfp=ymk!h{h$xRLomt zwAbHLhN@Q@N3+2JxX(pCOrDcx{*x1>p=OO zLDEQMG&_|INCTlrS&5G33n>BHEf3MPG{y4wvO;)4kvPBSlo(iu^Ukv=LCdq;K9sik zOJfa1qRsKzA#7A-Jfpn&%?U=mY&5Oaqk^xR6JOr4(GKq^c?c55KeEBqgq6vQ?{J9M zwWQE)@r=vNH>ddbvNN6Jj2m>tCqE*m_RHHHpY2LB41UbPMp-lQT&yMSwZImOT}y8< zqiDJiZ#nD3nn|r!Eg40(+iEogZFMSL7aLw>)|nmiVJA#q)ZgP(ieA;4e5o};reoR)mo)dyw)l(@ zvX79yANXI2t7{hTw7m-}&n{Q^0hb^*{eytx zS0$s?1N_F^I|1h}r^|Ec?eAeebuKUJ%-oax+ZylOEiFsOzRtI|&$~2u_}&<2REj?8 zz7zDu_{`S_OLmUU9C~9SR=31Dx;}+Ay2#v6tSNSMhgCGbZvD1UxC3Q+r>~vpRT2+({bI;(spC6{qMqXuj`)xN|Q=FA(2Sq z;B|cQ<@8BvcOM3UjR1ZBA(~GvL3yqmuLbf=+O$x8v|ktVbyfs`?Aq>&dHkf zmhdFM-m8?7`t5=ej&}aRzgfd;?bFf*W5PHm@-zZF5^iJ30t#Xo`_nrz8P(G-?p2ch z#yQHKm}=R7@-Da$aF)Egnu$mu3MzcO_q^DVGhm6kjD1F2rIlk0quN5e#=EbTF*eP! z{is@Q%fU|lt62i+>+*`*)S?}-NvN_!{kKc9+T5=C;FmZ=M(gm~vF@*8D~#!ea5u}7 z)vse=@z37KMz+N6;iL2h8}mbsTsq1>D$(K)Yp+Lo^sM6xATaGUHCo3^t@z)#odMkp zBDfFW=4-!=Hs8KW#(iMH3O-Bm!TZthCx^C`vIIoHeJ>gbrh4+#7jK}mQ=*ST(=U>f5^&Y|{GLqnc9?=EJRmodfihL& zW;>rt3Tl>)$U<1-0;;=aIFr#C#-$VrKczB_apS|^T6|L3eH1Te<5wkbIY((6{H5-< z8&&w#7c=JfQ&x9p3ghNn+=SQ5`xcH&jKN%0+HVkca*+HUHEG91yfe-E202Qa<$f=Z{JA~=JDQNlfv#c zjuU~&>$qp{t`}ST&KfUF_nsp2!T~lw2^^T(eRIHUZ{I~9<_Wr(?n#O60Oy2g>u0jr z^i)jLi+Iwfr)9!-`+u5oDVE*9$^&@Rh;?R&@xA)fB3w2qme0dgPp`kcyFZf>4GxG> zz-JT54gZJ&j`;;?Frt0ak(jF^j648{`qNcRH~^=33m{*>dPoMq_GZ&*1sVt|%yBfp z2u1MHdYv4F(*h^^2tW2P$D)`E`#;r_tgiIdM+}OH8(F~ExI;Syu%!qHR3P(Phq!-} z_xmZIG{h4!q<)l#U&O*V%0eFY1I)xqA;vTsh=GwR!JyCx(mfbSC#=0$i7q;VhcdzGLG3WUxu;F=9Esf6h_EAx2? z^F1pIu#|$sm5B+li_>ob*8q>0A~^g35=LbbFWDs>%OpM7rTojJ!q}x_%cN7-WwO|% zgJG19HYo3(F*L%EnR!I*IFtf_Crg;JCqLMq?vy?K%`SglCV$Tk1D3-`ITUEh6__{_ zxyluBIq(Dk5QGBT5f07TfTB_P^OqdTj^)bdTX>A9$`OEreO|?6G%1S;9%PUV5~1G6 zq0wHh(Z``VR<8MpLu;vA>j#JSPPz7P4xRIIoqG=5rC(&X0|4ldJmUaCxxKCs=L^Y- z7f(42#>zpRwh#kO(sh8qQZ!lb0Av|Xf+8^qt1yY>G)<{6&Dw57ZOfy!P1`xm`?gIQ zw@s%wEtV?Ge>j+Zs<8ac`SPH`3cFFa$!R&}U`FCep6o#pEisf=nsdUcbaw)2GspN7^;bI78x!XW_Vb7|i47Y{d zV~Ikx_U_{jBy|q|UCH0R8=>tKqU`J=xfgC!9l^JIn@O$ZXGNk^ z5*NmUh^#_X*>}`C`)Aa7=hyPo<4q~XF`4Gu|Xsy{LW;==T>x6gZS|`&>y3^ij{!i_? z*WG!@!Q4M69~B4v{bv{~_*Z9gca6Ez5Jv{ThtilGw90p)r9&{YBIM&H~9Ct4mA_sIa9|W=||%7i*|D z2bvO9!Fn5U9c=@6Jil&Yy^RDT@_f-OcFB*=5j6PtH2_=0QyQ0YV_1>uuQW|bHA4ar zXGd9vfl-YC0RzmM4a_9ug7r4u8z`h()>>C0Z7OTHv}s*~*uXr_RhxN!OZyaWJ%gQh zi$WTs9f~l~v`)p*G*je7_&)J$3LG5HSiVjje_O#Pj}DtnRUW}5Pjtj)Q-L`2TLq}B zYv(NUd-2+uddF3lx~6}a_yhU;M*72s&@ofqyv}p_%2M8IK7q{eyd2AfDAKz6)IfTM z>g;J{xvd<+3f@2!`Bbc;pVKtc>poVTBEN=TeB#|M^=DU7-_qFw0ZxIdc`OF9rIh<=c~dq>cR+#R>2O< zgHIk88uULKIyCG{F&{2|3X1w{euX~}qKM^WXuMRtC+)r5qL07vT0uNs( z>HFWK`7iyJCLi?q6=+F$b@gO0X!V}P*o8hh_YKgJz9>y43ERl2dUC&+{z72)>XWg# z(Du>vu~5~Y8>aqSg3mp7ckbYO*^^syhD~c4*nk9S5J7?YH8f|SEvV5R;J&_O;Uq@% zBiWB^E0bWDOXk=E={`fhcJNeMA?`Uc+K``~csi?ty3s?UApHxGWne4Ke3Lt0Z^=?o zT;$$9)OCUKCmE(~r;|0Z!C!eH51O$jevq3Q|4hT`4z=7$*ykB&(7Un{?bI*OeFT50 zl(!Bi=od+V_!vL3n+@Ef0N02bF->nU=qV3cx_G8Ama*)iXllo7w!R*v?P8N zUW@F%CbRrio~zf}5U`@yrIwn0XuYx95iGoo9M{ny!#XoCC6m zdWG6_%gNjg{=t~BK^vbefbS-=PnWvhc3o2MZB{=Yt!C6@bI#v9;}1x>CQ%yvoR1?$ zf_79hZyM?qA68f9ZB9J*Xsk==b}g4Gs~9&(p|lKpyxWIg^U0l6%=vhPhFyYI$3a0% zudB|fy*>w{8Y%?F&vmbmk9$3vKIn^@m*r7>vnX9D<5AK{Tnc0D79i6 z$=s95sQc}<3M=Pm!fT)MY~qbW-6_4yLERF88H0n<2QN%!8Y?>^=K)xM_zTtpJ7Lym zl5c8R1q`PPlt!smhty`vyQgX@hEUQa^t}H1XL^5>4h*jr=4w3KbjNS`O5Ayt6iYhwgynpp;d#@hb~e{ttpE`n;NC1 z(b&oKlskRFJDL@d?|v1TZ30ifHKAPXk1X{nIRtHqR7V7)QYsoZu zRF3NScyNeYfA6_)n?0P9Q=Btf^YfF(LLuR6vTF% z|8o@9-cL#_1Q%c6a{8MsM2%X9>+QbN6*7^Px%m+_y7h!mhxRd#BAYFRg@#@jiUqn1 zi>#a9aCm9LO~mA57`sxlR}{#>NYflyI5hU)n>`+9Q35>Q&2Ertx${Y5(yPR=EtW%v zhyaOywj4F~V-_8g32Dx0C5$-{TDem}YTC}tkQ|^}=5$bveeL{?t;q0ppqgZBqEfZv zF#I28+M^x(MvKvDu&MJC!bYsM8KIad9Z+l{vz^IOby-xh@&*E|i znXHysjZ<0kp5!8x`--b!p7cUEg{M{HrQgI-Wd&%SwwXTFP(P{-7VHj{Fh7viGp(u^ zYu5&+lNY+RM0;aLjU)`cZ|!Yv@>raoHa4f7&YKC#2~35YwpQR)S4g_93YQ7BkN(>t z_q-8+-}{?(E<93ByitpIecsjjYFFGc`1>%By|;hUL2s6UmvagI;oZEH#~*Wk%w30} zVuO2x3g;4VH-R~-&>IzEWJNNrUQ_YV2bJ@F)7(aSEJm!&&5Mywo4*jdo}_vgQSGvd zVGT0SZ+KPVNBK!mSbfTliJDEoS7w@g9_Cy`wX<2UtIg^=81b9(U^8S-38VI9KL4~d zi3MMWd*YSF_fwR;v@RbiaM1?$jEpt(P^L?^Y(U$8-@W!oZ4f7B?&aIo*6%#7;XQh5 zLKofN?tTZ(_WZc`bkTQn_XkeayH2QcImB>}M(FfzKA626le_3Mp0bAGb*^Ig9@26ImUT8HD(sIEr z=&jJRT_$^>E?@oWxo&Wqxlr5r*dg=-@wUcX&)!sB#uu{E&@B=^K05iV`s}&Ln^l@Z?|EI7CkAu)8wK2-^qm^c%na-pGCrHf37%`R z0JNTCQ=QkR%kCXdC_ote<8KX0t@!QV0(Xze*9b*1A3QVy4h1jQ={5$QeTwF8?9{Q$ zMo4rdst8>vz`n{}Xj1DmUadPB3%*#-k4p*IR%7ZD*yN26x;_ZHx$FGo)++R7DNFcG z_m|e)#@8!MeoR}($U~u!dGCOkA77iv-aSqmizL4NH%B%ba2&S9baytFPFl7Y3{1Vd zQ0#M;`?sELWj80B<9UCbH+^Wny3{I+v1uD$KE1s>{2q9J%O56wz@ul00fHXPUpaE& za-eV*(?!mEJtLr}bl2Je5&&g%q~a>`mB_?k3;I(4`s5{{%4O!h<#c3?1{0C7YUXDA zpFmf;5=g(TG}R|`Y~;#MJe#;-Chbvp<+lxWjM(ll8`o%nR95i&Cm^ z+g|r(Kvv-yUBl(9BVd#pC`uh5wnRNNp?g;ick2*bW#HC zF-4Q6|rwKi@Qwe{+r1V)sNsaSJTL$)re~Q$fWF~fdM>h$^PZ}GCZ`T_Ru`x?lx=D^IPZ85DWU7gz03a-W7hcUdz3*zx_&tly-DDr>6Te{i@AwSyn4+C<@s!qZQ69IEr0I>}(UCaD;Lj zb_8lydcMx@EZ8>=<&k1aTQ9L&bTIj1_Nh@jvq8$9nW#iCZ%QltDM%@|oMbK8dL&m(sgOTi zttiIznzP~R(y?LMw4J@!5c|vnasFaPHQQZDjw}pqW5dg7I({Bj8n+Q!fXpPaJ_$5( zXnkAhqSEL>1lcKy@@4urL%NwFVBBr`V;zbP7R(3=e-*L1Sn9(rom@jVFFvCh>viT> zky6&p9^}>PMc?JjyReICtGgxpe&E#r&6GLxR6C~dI8>dx1D%SEm@%y6C`WS(Y!JV= z#BP#{#7fm~kosN@Gm(lSR0K9DGA>8Bv_%t)>o;jyFGqz^M3bD{H^S|=XfaLjw#TDV zc;R1J=1)Ce445NdUT!iEuz*C;d)qjLO=-0q|0$FTB=Iq@(-M_nzds0Uw=mMNTBWGw zkcsU?K8|AfCW!V5ANuIicaCXs`yF48ubdR_{2zrxoD`^q#KV1<| zoGR73X}l3QNg4f*K<)7_UY*O4Y}=Els@`An*fV@_f0{aeyF)-0G~(9xH_GerkxqEf z7q@%nT9vzf>f*qUU-~X`Q$K9_qy{d^_nk!--~Pm;yxC!AzDoM@c!O2vZvRC%dT{ps z%$)gVzm*AHE_{bM>$gJAibvnBI^CW3r`{j;{G^I(B9KU6i6Dbp|28K7ZN2*4GpMA8 zWfclvhCyQ;op7b$*uo%)77m$!V^HvA7C4D?1l}bazZy=t2gkpJ)8$0?$3n@SouH~v zVxCA&=}00(1p6hNdLlA_CgLG&l$dHnY-|LfbQF;@Ttqrb&Kdr&GYb3Rk|EFu#~IFO z60IBvB><7Dc1EaAz*#RNfO^rfu~DSU5l@|CASNV**5JK%92PWI+DRSOYCdvid20;a zQzn@bfp}I!#sG0X)et{t2*w%`m=ou#8W+M77YK^;z9b8kMnqIY0xsjCtK$+>5mC;N zAq)zEq>T^ffxNmzq*r6r4Tz-9`25bec%Jxz97N=DeAZ=L(FDSuC!WA3!S9l62nj8r zO$?DvXfcTkoPbs?$Gta6tma7^hCzeItfA|6Mm~~_ixv;a&0%T6-(aA67zsAninRdX z`y`6nCkvFsk(MNr4JLQy#F1{q;wvP#&w;TzgNN2)1~!r!)Lwpno$6tU{w7+;%j6$9 z(6eRe)gE+Omk49+g=xaWFTvqFp&EW`!COv^mQDah#BE-Zk!dUJu?Z!~GnWt_;7foOGg;wD??z&D)(l26;5u z^MSX0hSbS1hD2P{XjKxQoGjDHEDN=)_cHnUrrB-#IX$MiZ9(}KGHLy}`C%*h#X;FU zL79`h1%qk@y{7qnHTgY61)XYzAL9$=f(quZ@~71b=v)fca|kwx*(Vf_EnSFen5NP6n zg+Nm}9q^_z2ceL+&ecZ=5W?vu;6`2lLAI4LBGWY2&m{kNwK2uCerO$Re2!E(Pe|Tx zib6n_E;GliGlQ#}QKk*}pKE}F4Tfos7;kd`CWg8~HZuSOv2<}+Mnk68?FDYg(ASL? zGRXuukOdTp!VM%m7IH~k(`uHxfQEeW#%j%*=*%6y@HAi@2>|o_K!gLz)B*#a)rrucyvH!Hv3D)MCs>WjV!2z%E#wfj2nP8?-Rj6mZ$5BAIG*1*y0p!V(9)*qUCk) zwrujvHCZhNKol96^F<`iU9Hsi3~q9kwpiSe8Vj_8}Djlg~=U?~jh zj|O6py;oddtboABd`zCVrNP_&t{pr%4aAQCc_Y2j*9lx<O! zcwnw$nuXX8Mc9e~c(((( ztI#BQFlZ*KAZ~CVJPOFb(yDKxC_M0z*pRx)0y+sJNuMLa%z?rI-5=p3bt2P^>r)cR z&|EYb3QV+k2nlT>#xnRAZxG^5(<&nfe`9(A`U(zzgMourhCc zRl)Yj)`abMWM2WmHl$OTE=j_7VkdB#{2i93DO1v-p06m=#iX^Km_T(NE+U)2{^*3d zrqx-^NND_O=m0PfKsXHd%-tbb79ox(Y?iK^4uhsTkN08brUsC}o+gNQAVe^y_j?o3 zKTV>+G0=N{P^&J|Te1Q)31P>7!~s)Cpp)Y) z{^u$GcH-!PuTHTJe{TH7kxo`ki*5OB%gDt9OXv?>5(JcJuRdtPdflIg*rx#!zycxp zjx~{x^>_pG0fBK)VvH{Ed<|5ICUK$xe;dd`3=X)O;k)PM8HjdaF~%b~c%KGzYi0t2 z22OjoMWKjIwIYWO=yu74mvGR!l%# zH3#Zx0{VqEeH2IzKO+2ew4y`Ukv9gc^9Em??-4Wuw-dm|hlDBUFcJyDS=~d#^7{0gH)I6{tfG7mPBAx`D>m)TIg!N4%5h!46N^*3>4gu@J zw};dRuN8+0Ov{Pa0c#x-x|{eu_TN00+RzEuUd)H!^`0j1xHow3rgt0-X|}fWee%!D ze1Ak>Bkc;(zD}I2`8mKjvl{aRYxP0Ce3(0f9#0K}uzSr(XZ6Avn{wzNP%CW27~E-& zo$Dy>XoC0&f;Gq>ehm=6!j&$!aVsN|_JP0cP%v&{oJSHECI^{?eVu69`?5F9)B_pp zfrLXKAEDq$21xG#WDW*?&jR@Z`|5W`_65+Ldz_oUHh_VZx&PRScs@m(+6oXtSpRAF z4{WO0LpZfVuq6lDpFM_2c19u7GwUbYQzJ9zw$Xx~l-%BP-~oPG{}kZ8#Y(sTC1k;R zt`GXJ+kAXn_vXC)*ZpcYOyfO{o8!1{W54PZkSX^>b-=-W$-Ngc3+VGt?tu%OOn7gU zhTrIFK(nOZ4PivyHEX<^weDZ=ZZk=;$A^$;)?Jt$c6>O1Y+-J{KrzFiZJ$k&!Aalo zBY+rKs~(OpAR>w|A)J7ONhwEnLopU3Yv4?)x2cps&F*ArYx zb8?^`LHv`4z?GHp@JI-d za;Y^}5Q!;z!XVjIE9yKEBBQa^yeE#5iMxBjNG)JpV_D37H=bQIM&VdJM$b@N6t1C%q3NiHO>1|}GdfRQ1jceoBTrie^ zzE?jk24-ww6UQXA<)~E%Uu0xB%eAOlJRf`jkMEwGr*q?NdCSz-tl=GIhxT9~xq{IZ zVRrZe;(69nZx{Brkxe#`KKquW5$cmY**cW|P6205iM8z?W|@sLhioTr(Vbccc>E~l zantWFzC0?N?(Tyasw5HpD4vQ#p{QSZi7)8lT!joEXDwjbCxZuS&06GQV=WXB6s|ca zX!lV|vAdy1b?(yzjfKy*`i2txahzGK_V#7RERXIZ0MWL^cO-G)l_5*49Cd>JGOq8F z&QdLFgMj&F(1R^zk-ERzxpp)%ToqBJuh3u#rIpbXNg8)*db4#jJC(ES)o$`{`xSyT zYrqv@>IzNrYo2O)T=Ey33e>L`Zqa#Q?iK?QqqYv&Lbs6-(!4g7xJ0(A8fxKs^gD8m zF-b@MD9!U?s{0jOTo7NUkt0*#-EK!@`DvFkU-lRMTpRd5ylk5k7e|_?d7eE?zFZxh z@~23Ph(E>Zc`j#Vj-@x;>CgJ&N%JBrud2wD?60b*G?&n=8Aha~Tg4aIik%e@PI0^4=JilvqP!9}ZCJIo0&q~y39`wYgvEG%Y*(L;^0D%yGp90c zR}a%o=tIR4$3;M+ME9z2!{}rjk`{4+9pGyMy}|d@i_gV`$|JD?Hrw;EbO*-a2l+T- z>KrYUv_1}8j{6LHjW3>-91T6_Q;ii5W+QPzOwyIBZz@r^R9wWkrjeJ}(lt2qsu|h) zfhGa?DF%~^?kvtVFDz-CD2#gBtdTSfNkr)6Pj7BPw}~X)`Wd&)7`We_5pEK`?X=!O)>mH~n9UUnuO_ zIF@G;3iM63gMi;)xXBI^EiAh(W9{>0SO9%1YvwZH;n_}3kAR+WZvl}=BOAn$XDjOq zRJj_hGBe!enD=WWS%NhfiA(d#5oo%u^k8!!JX-(lJN61?x>sW!cMdKDljZ}YV)>49 z?tvbxhH$M^4xV7!YS7Fxq`~!rwvmsvx2>oXqd@3jRjbL@U z2RzQt_{`?-M;}b1H{=~{)|>>M1$#(L2%Mr*-2or{SN5Qmn$-#xEK)C4VM@%-X*^MY zC6@1(;|~pnB&(}IgYrNz$ryWvqoV|J5dc>#F&9{y?i=3uDyDg!l&5Gd^_)FGKj?0gM;R{vjadTd*%o;sG zIdTi=JBgaGaIh$RRFwO^vN1us&rz%C-7L1@xM8+;p&wcCb4yo$08d;*2_WWNw5Epkp?^)ectwjwP46Hfx#LA2nGM}={ zy|0BCD1cRt+++l|4-97hsy8n_M%h_2(3RHysXH-Qu0{}xMBpGJ=aZ8%==GLngR2c1 zuA{=KaPWw!1VOa7E6pkY23md9Z8BbEVRr46MMY~0jYE7OW1&2we&l-_FCV_OGy#cp zc0LzQNrUK4mVbLVN&fQbTX)l$DPG)|Nj*=xq`IR(p%o$37CO8#8z`ed3T3RYXUklG zag74)nrlPi$C-WQy0W@2mHi}-<=D0H_}tCEi4}yUM`}jWPO6?~HmB7(9g%Php_L_~ zv1TNiXnJEIkVu{nxF)`oGJv{G3d-lv#8AGiXzHso^n=l()2(Wxm2^3{YSp?)oJWnQ z=l9D!VrO*MuEBMXLu;3og@&Q?x`E%eM6e(ihJd~e`9k~`N0k|jotp9eX!}t}l20=4 z(ucx^Tv3h{pY@`64x=1+9=v0Xc9o8m(tQUT03kv0QPRL-C6NE>36Gc7@?Dr;?ox@Y?B$mF6Q#OeahepfL#%ilZkwtwl z2Sr5=#Hg4MY(xN`T;kD>fW8mbROmHa)KwNI%BSJJFR5$vy5_mN=}1zgzXipTO*j3P z2Ej}4qmWGc)&q7RV)wvCj2x){M;gASbi#91a`%DgaCGcP@)%xJz5zUn#U;kb?SUcs zp{OaL(IuW2I?)l%V5oucu*UmvMcAoNZq*qhr%GfRDD+BHRBst*94WzbN?x1CLoh91 zRVJWQiwlZkL9Qx38bbCkh#HyTZPXCRN)tpiMN1A4UtpG9FfM~K|0;wo|1rWaBK$YnrFhUfBrQK|W9b>Y2WC$3?h_~9|w3Z6gAfF!8tf)aI}HZk2TCrITXEhm}ZgTVI7NhdNj*6_-q zgT&}n(spmgN?o;HH2Ac)33VAikvpST&e1~A9X=;;;F`{@HXW8YySAql)uVlKDLLN> zi7KOl+VI(S^WcPA@6sdt+Iw%R@9Jsz4pOH_&73X7{m4wN*13TkU5;0syF9uM z1JsbCSti!!uVk}USf&N_RbO@YikeMZO@mzFm8PtTxy~PtI>DgKxqdqRfwbauN;+-4 zR1z(uO;1j{3Ej^%DnLvp8*x@B$0Ms^gAx`A^AIGJoI6NzH2Kns%PGsH}~U)KK0$a z%2^((IO3>#X!^y&C7*|n3O~mmJhsg!$TA?xl;)8A@I~K2KjVs_n}wLmGS9}hgXQ6Z zkQPYcjPaoP#lkw*&{eug zh<9%hExMe?no#MsuS9>B%n6LG3K70B{oV~UQ3Nelb~JY1`E*(qbYH15#uQ=DjGY#G zX+fjO;X_}4t-l9s@Ry(xaMeJkZ{y|FE4)UTqm$XP1WlR^O2b1Y9A_&KZ6Kjq)vxxirJ?(fX*4D%>_Ln_h@-5Gwi39Bsmu_K(1Y2jMLp_o@?UITsVj z6YG5$=M7!+g|0f|ZvsSxiUI|G{ z2n%6=G|2BVE@U8X=PWJ+5f{ht(g=)HDj8yRyoMo&!`LT|U z7ri>|f@MW%Spo*K35$9v`Yl(~l-*Y`0fBKL&-F)1#Ez4quSf9}ka=3rss6h-Z2+(j zsjpXHaiG`|rTeq^^}5@upCebzR!xM1i*asqQH;28(awZXh}bz4WFJ?|ra3AS9s73S zq0A)^bC4pnOwfmV_&swWf0C}WPT<)Vj?(mFN6zGn!P%zfPtA&y3L&%Bl{zz#V?`^CQ44;XpOZuB zdR@y0vI(}T2>qO7S!GawH{qTo@(!9Cz(8!%$#3HvVk=MhIba7Ipj*+l{3oM|`NB|$!WqM4x`<9exaJ_Y*9zhW%y3oMN- znYMro4KtiSRttDO>9)P3jnx}Amjz3-|Lr|Qe{?_sF)kC3h+~--1dPIk9m;(+YEv_} z`RksI%f<{p_cz~Z&5YW#aB(@p^VQVv!~3-3%FM5wsdi}wVT}g5Lk2{Z>1s?avN zTcxLoh_fs}Qw13T!Br~3;P@8>@yYZ6TR0& zEky>DN+s<06Tp{CYMe~<;2TSc2ir52xgsI^?`{*?o*XMulHvq_AXvhsMHJ#+WX`Mj zz<*KI|D5)Pd9weNp14^A+matQ^)uXt5J?Nk4jq^%{ZUddqAcrgFo z_xQ%LoXBST3S5+l|49=2lOzg8io84F(~14U7V9S=;vechV)Q%oBz8NpK>{^c!wZto z#jB;GTvkVjiy*XgK-~%mfCZj}^jRb-Pva|-VO+x_(17N}sWBN$8u41|!I}1~pSJO9 z$vHn0458%uSvcTKwCl_O6DMKvT3R~FgzUAgJjiMH6rhRM{rNN!mG3(1_aeaGNe84Y z|5{(?+=%Ktk4U^k6XcF#%Vsj6UB3M?LCVhrGn(IecwtU&~{gkjS+9r1rst2&y7Bq>mP1mxPJEfY>OEWSv}eoH94I3#>4_dI0S z>UPxWJ5qo5oe=xuVY^@Nk9O~mFYbS*hV6g7KV%M%nF#ww7=DnAII%*^sAc-f)jY7a zf4zNY-(b^BdQa#UDPnxxOo*_=;8QSO{$Ux4CIE98I3sPIMT4333!Iy6mEvi|ZK)>y zvQHq{R8o4KTeg%_9>_NuWzjh}o@V|c7!riu8v<}nxaUypq4#Bx(3rV$^=vW2 zZku5Rkld47w{(%IL0(L$bK%fg-Pb1T@f2#eb2rmQr_oAFhL}U6POtA%nTJbmmJPn& zDrXojgscW4@h%qgJJ3Hd4N(s$pB{FI+K;7^zqzY2u1gJna9B;frqG6{pQ$P-dyc`R`q-ucWM< zb)K}DJL2rRVnZv740yk*xmcB%bQSHv-wa=(Xkf#u9|We1svpZ7r(h);YNiM z)AN)>(VOv<#_{FxlqJfp@|35l%d%D|fU0(M9I|!_h$UMB9#*oMj#mG`0w9q3pK}5O%6sa1D2#6XRA}XfQ5uzZ{4b>osp-8oarZhEn z#1^n&505?ysO02*SKDjtv-UZk_O+nJM$hH$5?EA}&7CbN$ogrx&|l z8ojpYd6gAu>G7I5@VS4k>FAz;d7Xx~zE6)nez_ukVfNMi`?XzPuP^>+*(>diGLBaWgBUICg<)mqDZ&lK?U7%0rhv}%9d~MFF7mk^hO7P)!!YS$d&~amG27eg zK3=iCbw(pOPS|) zLdr0BeSN%8DA+$go74lIHGA-A{Q34Lhn@zs?9^`xFdKvQ|IvCDxAVB;Z05Pd=MOdR zR6Z%Bd>` zMz-r5&QTD@&pa?NS#Rnav$U`-Fdn8-Y&#b84~F3ZC#dvcw`A)-7zVp2^E(Is$uJCp zLhQ8am`TLFvo~CfY}N()ZfdlW9-d9MlRq63gF7o8Jv)iI)GTEfY)u0;M>r0f-uB9p zH8m!ZZErT;KBQC_GG$=o{K|9_?|4&H=kM1p-F`6OQOL2=l5Ox z==Z1h-od%cmu|+(pLd&oJgB2wrsw=_olML0={oD(QT~L`Y$Jcb9hSI}e}anTJln6%vA($a`|;$?209^~_9mADA2roCxl^+TOZ{ z71@zPyA@uw%5wj8WZ2CPRPXq4%L`XNM7|)Z^*>r2;_FI${&D}|65GqW4i94|_Sc-g zH0QcEkBNEsS6$E5GPrrbV1DI?{+?^%px3EVhG8I6MYlTrWB5-q5$s8K8|22HEggT+ zs@FRx2ydalen&oW>K&>*^{HHG*R0&8pi4+M%k1^7nv05CE=%;>7Bb7jDySYChfhaJ z+oSY3jrzpa4wszQ>OQYlXOG=z`h5u#O6YsBxpc_I%?8lY>eEK4j|Z-xgC6Bq{JxfT zZPVNKi%nO|RZ7yXd0n$Px%*8hj-@e$vpgwf6v2@_-Qzouw#Eu`hCQ`ZxVcc_(DmO5 z^2M@aw_+L93s_uOG5|31LS8cQXir>j;Mk1kOE*XV6u;fO zinWxdyd1Br@0d#7TIc!nOLyC=TeIKx<-I_K|KNPP_*E|Z*P2(Qhj8A)PYm1N_&*Lr zzVbEkGhF}dT;_#d$=%!?dn>0^H}bdb_RM8b=AN%9I=oc&B=_{;V?)M!31kJ2J;m7H zZ=gNq2Txzz_dV^|+hqg?n*i)$r$o&?Tv(zXUClHI^LS-`uJ`OIOKPJr`&IjyWyU^c zN;#zcVM~U?qeD*_?AI>3c861^KRf@(GMH8BxUp$+S54|dFkaWiWZ?dtw#vLauDwYs z8=u-|$XpH4{&aljXT=g6Q$ySHoo&&tS!^_&B^ufIu?gNM*(kp>_Vo#Jq@An~54~8`4|z<-nz1&%gZ(!@#ooJ*#|uv3HZVydIVP z=q7im$7{?47ku=g`1qFt18zS$Fa7y^;JS1$*KKjwYGt8V3hADUd`IQNH4?{>5+1`+ zAsD#^eoRR1boC|~p859ex@6^_3G((DvgfNu2r&>=qfwZD!b{bc-5)|>aGf{UA0YDHKA73OV>kOTH5te z`MpT~ZB~Kqh`Kib5dfTY>sWh`{2I1K+f(zl?&?Rit6%8qy!|f>LoB}33%)3jHK+sk zJRw)n(Fe;D@pI@XK_-1%A?m+j7;5y^Hr1_d(=+Rq@(ezh20DzuRL0XAO&=w&>GB48 zfhMAtE_!>XfmepHdU~-%D*84$^){ONwnlNbmi4w?`gVb@Y(wkqBJ}OI)jK5UJI2;K z?s?^ys!uGeCzi$$YxLLE={xG_+pe(iDUk~Baakm+@xgz`F#M&j;P0)sGK?J)Sl*^* z$vjp6fvmIMCLQ_xSB7Da!N$~vjTr{sSq4yPjrGbJp43cjQQZ)?LX$&?p46$t7lst~Dijd|yUBqwj ze49lR(L?7*-|Wv}j~Rw#HHH-$hL<*m*BC}LHAb`%D&?u?2DXF_rUK{Waq|3dguCFpmxzUtzJ0UW)Y1bptSs#&R|4l&j z6!`u2!0gjKB{3ejcYAc+RsJ!e>AmAw7#}b?zi;jNeQxh+e2fppRvh}W^?y_ejssc1 z6zr~a15W}-q^ZAr?jSRB#W0G;*B#E5*Y~J0Y1bRgSGA3O#%tHVS){X`scqU}FkWmF z!c0lyH%^`<#7$KBbT$PrpRBxj*4$})=bRf0T)no-^-o~NIo;+`+l8OId5{@DEdDqT0bAHCzl%e7^yvr`;0?t0<#s$L=rf%2?qT8gT*I^_Q;s=ZUfI7EyfuB# zR-#>RVgt%SiGKH|%k-O0%dh>g?VxnC%(7<1R<;S=ys*ihV<8FQ*n;iLMdt7`GXCdJEB|?uW-s_CN zPa5?pJs5ZIM62YrBVm6Pb%1?afaBn6Qzm7^6%5T>#scU)k4a%zfMV7e{H$}Uhept5Bey{ zv=aXI;H;T8fRrs*x%)4V)6^Qa8OBg} z3W4g&j*aqNg|xcg^{IY4(VL0nn^DmTs+WHci!Xq%1HH*`YmX3{RCY4Qfy%DQNglYd zdw`TD?_*^gP_$N)j zJy#{C#7|yHzWLmnoEXu%DT$ZwyfBz}e_~CE5`6m~EBmKj{;c0|lb->VoYwxoi;jPu zQ+=L}yf}SmU3lM!+G5Ld+x~^?3>?k;q0O_4dl*FQyDJ8yKPO+DuJYZm;;St}c~ zd3*t%1u1&*-y%B0AJnB<)*^b#6a_k(^^w=N2j;4OUL_DTLN8Ak*uFmAm}6D0 zi$(0WHPC#mekTp-;1#B9mhnct?N?rU$v)e*advp~hgvR&aq{RO2d|!|XcK?qLctDP zFum@~sK#ba4Z;-S<$9?l2&yxl@9rX6G z2wk%+DOI(~r@nb#inm#3YxmkOt?Y(R>C`HTaMayF7Z+yw>M(pkkKDAcI3b|j`@GBT z`jo%wLi>X^{ko8EdU{Fe_v-tnZm8g=N)>PIj0mZKzpwU-3TpC0vsXPX$jux&;=D99 zi+`h^vlcNlS&BZt^9j-O?wHS}tx6m5JE%J4%mqmcqZL-_*d8#$P8dnow46`uEOR>91=_KXB}RyJpW8|Wrpvubs- z|M+F3lR!ybN7>sEy$`oDG0rPS8_kbj1e|!5;Wt@3mWQCZ8WG_rm3mY_Ugy*efw6P4Oo`md)eyvG*=#@Q8J9x>IGH zOGYp4mus!8!6>`4Ev+ViW~v&Nr&OqTHdv>loaApkxQvk7k`I=J!Z@0c8T4qW8lK*Lqd?;?p`}}es~dEC9-s{EIO<` zpv}K@7870ZhMacv9NBlD^4+{Q$GeX8W12WG>(GDRAd#aekRI^|Qi1L)V$weOO#O|m(ahXE1$sDz8zOhj1?}1oxA86q z$^$@{C13mTNP8nv{?w$-4uXC!(XQbb^Dt+p3P$5032E(nrPd^JcV7`A%aPD{u7dKa zm{fQ%uRCktqU)F%-p0mOFVckWdsZ@X_jH?6c96;Csn;8>%)Rrs=_BpSODt2!ODQw< z8)K-i51JzG=!xG@TL4aOD${%?E9X(``>l8a9MR8lOTno>83{7K{DlieCZaVu@14m~ zyzoBieW`5y!}uj}*~Wm6+a~hv63Ca^4)2y7t?Pdza4S0JmcDb_*NWSD$Nwg>ZhiVd z>wh9F?Cv@r@Hsj1*Ua?o?(QDxy4lfRPh-A_NnTA^?m6=}MLJuY9>ffUCE7nvcDcE3 zY{Mljg@$O_BFgHFZgSeN>1yayHg~$7%IaOW{?CuYRbp$CI36m+K=VesQkytW`CIJC z7{wY3OWrOMeNEBgM!OZo{lyCdm$M{q7rABR2T8a%^;eo_ZK1z+ohi!8F5isg+N6iO zK797JF1GIi#$&#*iM(MzW28ovLW&sW6h-zVnX zUJe<1e_LwodMBx0d~B8T`7vj2Id68+a`w2S5OH)&&Km#@2RrBcfQLzf5aLlTjZ#A_Hdfbf?1Z@k*WtL3XP8-YU!3_y0!I@ z)b10uFou!|9crgXjxw@)R4;8jqLo8eCn_V+s&FDxf6O>;BktHnW#&7jW2nOpXb*cu zpE04uGtj&mk!FWxTdOPA*s~pjSi2n$@4OjKxSx7Gh-C%KjEP~R9?FezHbfb(^()Ja znpQ%V80&}u2>}5rBI4CmL#SEFWmze`Sqalhd#1DE=HU`**1^Q=Lqx>EdHB(>Y>6N{ z2#*WI<(!z$KGvJfCgw2J5!qqVX(%EtZ!tTUn0srUP@z69!^~fos1F+OsP?3J>bu2tE)>v6|${_so(bK?z(?&QxEGZa{6P+e3 zowm^^wp&;15ME4_94U4xFLvoGc6(AxS}OL?DDhlZ;uT)veWb*gml(MoFiQwv?ZV=sOb?z6&QlgCpUn8l{kRX{=1?&ZRTRn9?1&rMsI;_xhBAgQW-F zmnNB>m5|OJNjiH}=Io*OXOHKeJ&}7hJ-qB#QW1vg~!`^yafg zN6H!R%gUdWq1s_2Jrlf8sWu5$AC7BGszB|lfNCpR$}8HIDtJB>buyLk!3r>@vUgo& zM_;9Mr>yIJ<<%z@*N;>V`&11kRoz@t=nJo!EU$V4g6E}U92%7m!YgYvsvn0}+%v6i zIa2-5w5sWS^>ayc)l7NyqjlASrRpBjnvXs;ug0rCH&@&`QZxO&W+D9CU*lDu-q(ox zsu!DU<~3?y6X)I}om-IM_V%5N?&HeNaOIb|IL%rmr&^VWTGjMg^@>`}{#xysTAk%u zyk?!AQ=LIXol$z7Nk!e-{yOuSI?Lrcf@Zyqlk{R(?~qDjFmD8>40#w=FkPHJf6cn&Kmx z64ILzE1Ht~n^I<)_AEEiG|%sMI)5b+j(=YP+FZ%rjx`mf5}vR3iYtk_{|Hmk?M(^senP`39CGuqfxET)sh* zQ@gJR_&B+JqsJu)K$TG8ITzYJnC)NmI=qzNJ7_qmy7KP`OCHb-T!+>E+ZB+vlRL;l zE3b_ja?94t!4>OYJ)c^hbSB=v zV4)GJZWDu?Y^(m~6>#6ehv$<$mtJ1~PcYq7Z~Lp89DTo<|8H?bdIcQl{`|D}z{eN2 z2711}6tJ*s0dcm3~SIuRYNnkZtRjd&uati!yBh4V6* zWvhfH&St77@Mg2LQ|D*1@mW%s&Y(1LF4v@qClyD!=jZYXH%wkhVY;G?8>)oE{=r7+!(|0<5~a`nt3$_>lVY|r{aj|9)g z{9HcV5JE7TWAzLcHZ`1yS~iWXz_5K9&ex@LnlGvrs(v7yNz-g;y^z{*|027OVAgzP zq5^JMc2LPY#yp4aY1pb`R(8po*MDE;HrUkK)gAir@#Xq27e062O_l0&M@*zzU%ZR#(}?aF*-tL+o}XWG!p0Bvvdv$|hjqlxgUFMJ%PS?Ux;f?Ke4>FwV}ev zEWRW@`Qyc$lgpc=)yY)8lzlQ8&KoguNX88qMV4W0)$>~wZ>zrj$bXnHS>28aYS~RS z&*4yvCGZ7{n6qehZqK{r#vzZ2?q81w{!(gU_KrPjxpcrx)biyTBPQ4frx!&41V=V# zPPlXNSJW^P_AG&lBB=ZiHTl1TsQMQSD(3$zGxWdKy}}3K-TIAlH#u@Yg=FEVpH}Iv z2Y6n%?YrCOobz=8{%12(>qo)U-d+E8G$&>2{JDe3Q?@Xk=e3vZCr=0^LEU621~ot3 zxa-dC;{!jxh^|YI=1mz_mj0T*)3WJK#?@ax#4jt)yRkO@S$^>97!)Z1Cpv)GYebKt*XQ2i#B-OoHsYL9&JF|AJB@B6N)oSAH5IRL~p zH~a?%#eXX~GU{$mn5Ozdxm*@{^4a=3m#%?+MHV*%opP?9T07;PzaLv)bm=GD>{HhR zH?2>upQbwGyY39dP1@bvZ}z40b>Xf(ee*Rfd-^}MecUr3zGk-f%J!R<`-Pb2qu(urV{lM}qy3&ei1Fta7{HuS5`Y(*C?krfip?P@9dh|K7wgsa( zw_Jp_&*5WTCoEf1Iv8-hTr27`n|zbHL}%1B%i(WkE+2)jY@OZoCtL4WU5aa6ePRSW z*dcx}l%vz=^8BxdVNwk0QPknje?O*5F{tVIv(If@JMHGMc#qEERv}qmu4t{xa7X~& zbGZJna9l@XaZrEe*|+bG6CW(P?xYX1HsViC>vi2F4HtiUGElOA)8Ofs_w&rAf9(G8 zj+jB)UXR=I436Bt_SrIhv(>uKqHL>`#n)%|t}M-;zqGRasmI;f zwGdY24CYnjy{UlJGWnc5P*d|((Y+_M;=ACa1EEBi{PLZnOhH8v&H?aQY;=fx6#%}Dzc$lgrl9sz6BURaUnxPnfp*vmq5;iTKxoLn=1#L4$=UTDFb4!buK z`*lzv6Z$Mpeq>Rj({A6LYe&9tE!XorlqZClPF=OQ<2+A&-@CaHU3KbL=gB({7rFEH zvwqSu%?!x0sdja%dh6M+)rxlMiLt8yWwr^Rd&g@rMJ?L}p|>KIOZ^@bSvo!Hs&0+( zGWS^3HGN~vyds*d+o{!?23H9m%(>G3N$2uBy!(qH+TPP|RWnZ8?xydfj*5rJybT!g zg07L`t9W<^wEY@-FptF3!+iuGW7;6ve{A9C_p}kaU~BYl0ZeU|31ZE)nB1Ua>lLbi z5gUm~uJ0$^@DsgAl{>T>o#{V1e)}uk6U@>*ANPGF(u0xV5 zgR8PRt!tPG`6LokIU{jcU;b{+_CBW4Q}M8g!9q4N^_6^QE8MJ0H#b^1r0`RGLyfB2 zwWZ7>@i}$9`Ltrb8;+@fQi)R_Prmrk-*Y^vQI>OI=}|AUNatzUsP!X;Y#N@WDW2Y- zdhTs^QtKNh9*xFr{SzxooOg-HxKDyCA_OHA8 zs;cof9ou5C@%a2;a?1_#u3E>vQ*&CKT*PF7eSSPOZncp1)UkqmayK5*VnrBPURjWf zFsRphI(@^b0ag?@Rj2w;aKrK1pjWC0+%BeMSzR+09nyxj573@g_)fibxV}|V5nE^E zyMN2}c*8HZUu#nDB29Xo^}pl+QLGRz8{D^Fyf)m$};*Ci7q$ zQ;EBJcj8_x8BtUB<%gd?8T2|o6BqVec^B|C{pqh4i?@5O{k-)xSEnYU^>1GxW4+}BAK_0Fv5doo9mU(1W=-Icyy?984z#DaV&-#9`tH*nU1XgbKe*mrJJtCju}Fgs|lW-fvXAa_vVF&qp7m+@l|s$*!`;x08M+gK9Fg^s>egeje0L#E*j!FbFDFkc_9=n4CqyZUTv^7C#T2`FQxW!zqdLEy= zx;jm3b7J1qDLl_4uXQ@FjhHp$h0`=qx^y2>CSXpA(Z}eR%VJa#1!*h9gwTOtK9)#9 zo))87RKTqazKbRs0{}sMj2i(s0AP?fm@5_gl7mPmV9%4VJE%aq2n{1>{HTSjxf+zk zyf2G|=cWrodNZ4O8sE`Hi)BU2y_(oLyzhRcz78`U6%$Iw>=U8704$9LlO6nQya|Xw0ydZcWKglD(ri^4au=Q5Ly%1s<_4-mc727v z(xlzF^5SZ8Q8cgEZK?Q6uajbjk}@@)OTjjhusjN20ib+1U^pk2Ohs%+gB?mkniIfa zAu@ymc4otq>2Ng~A{htw6J)80A&d~%XpD%XA-B_^z%a-@shD)+Y??-%Yx&t@PtFSN zrmq$5H?D^W8?m-KWo$$MMgY2T!0JU%nRc*87sQA`Hv)*E!GflbVz{6K4JJo`9i`@w zNburW$d+DS{v^|dayDbBg5Rg*(p>07D{4Pd*&D7&H!T}Af_%l5*G(ZZ4(=ib%hR+R zsBm5`^ynr;1P%tKX^};c0|9aqK{f=K2?2UIE*+RscO`+tl67Fgd+1pa4!Cj7kaj|@)H7B>$bBp5%g3Ce!iltU3>R`ERJ+mP zCrEHPakaS+AmSipJi-};qEZ1DDr7ANQ=ioQOLy+qbb32a$^D zJ!>WcwuulXG?|# z02?9%VyM__B2$F#CO~&Z9dD>5uJo8Lkc#Gg5-%%=fsFE5|B%mE#zcn6Tl30c$Y|88W;fuJI+ON zgy<3uvR{nYPQx6)VUQ#&6$kGmARszAgOB9nFIZ8a7T$&Vinb3kHGhctCbLkxFZPQn zc$tDsqGL`7(7q(B91XFRhE2iw>d~-XB=}_x!jy(NB1TZf$W}b26+m^8Eo#RWXYU|`tlj}aY4M>~#{HyMkI+78$_aLP)BSUy+!jAWH1?@=dlh%Oqi z6psz(AbJUM3^AljkePXd=%!!Lo)qw$SZ4R2p>XK!h0}Wy(zx3uVSEY=Y;1TF{cZ`o}cAiCh$B zQZzBychC8%;m7ogYtQKkA#2j=wZ?QC(rQbInEPQGx~~D(C&0`_Y$rmMHLd#bx{PN@ z(BmUj3V9W!8t_Ns5Zk!FcvrbA1$vNF1bl*A#nrF#D;_<8dS;>Te$~D0g=KzMm0Si* zKY-@AvXQq?sVRsefVLvQ9(Ser2%v|9>vGHBLS#1$WlDnU(|{}I50GgvV@joixJr%- zJUarz(1AA>0E`Gy#=*`|WPIqrUg-<)))I{9=-*o9DNi8nW1s{(GJX_>CP3|474-vG zseXf0?Hix_DtAU!o73S3NIfy4GckBDgoYY;2d8pTTXFCvv5Xo3_a&hGFi1Z^eGnaV z6@%VX#E*2C7Y(sfTL1Yxq!ABZES9Uqou={OY9ho|ICqUgaOa%v#&Bu<5kyMJ@j8JAvx@yg2Dyp6ErlHDnopVZYIfg2~QrR%a%y71TjjN zgiQsoM7;2|CiHGum{|QtY*M1$s>DwQ`}voWND!ZdRpTPN`C}v!s)_@8k$~eIjGhSb zl7s9ZpdtLGlPy)&e0UE9xr2jo#TTe?;5}Sa5+8{npf1wKFk+WkW6VQwelrEr#z&Tl z(MPBVH(!72fz9k%hSIAr`Jpw4E!>q($+3ag&5hUH3R^x!S(xF;9WQMP@!NH=x z0DdG;9}oJF4uXfXpe?rR8VzMW8`!-?P3s8`8&JTk`br#WvE9K-&l1Pp^-(X~_Fl|K%qDTp%J{ zbGWc#Y8KL6d;RZP4aBEWY*dvkz3`5k=EumogHLk5r)k-RUoZ)Q9^O@dyD}=xs@71M)WNMZ3))Xr|;!iGcCJ9pJzSjH%?hl0IXm1{c zU$dr;n%xxi%vMjVgUB?5VBp%!q`IjHAX5ZrZMY|;`n6fzj21@LE(IUU$9 zc`=M34U{K-UU;e=@vH%%P=P5ZZ_$C?KIQhtK=Qb2ZbHDEbibgs>hCWg1`na4);!k8 zd^=I?hJz3(RhoAoU3ZOj{=E4Y^T8Xrn|VYs#8Diw|x1p!_K^z#?GKy8u5R zBb-p^N&z%Q9#c(++u=u00&q1?Or%2r%b@dN7)l6L(=a|_$dwC7U$vbd z1E&1yG-0k86~L$Dr|?k$n2G{vh$%fojtUqSfM^i_s~AprP9OCVhn)R6j6yeaZ=V2= za1sRPfv)CYFkPm1hcp8X#S}vkNh3P402ME@?LB0P1G6O}IEo6eX$Tk{I_Cof-G(4B z;-sKqgT}Wr?_cNZ9y)6Z8W5l~PQ|WfKp&54relCvMCM6#>x3)nxC9QvW*Z}_cPAd0v#5dOMa&^mz=?c&QUg_>;NlX;t*(&bG)8gOP-zY3L>+blS z!%yH8V?*E%g1b8sng%%;A;d%)lyP5zw~Ovr`&Adc3QL1$Bi;UFT3zW?c_%a z_;c$=e3iTc*1DzV=CPo`{$lktLlXMC6ozbg6fsTKC4W%G`_BfOk^G318X%xSTE=JnqsK7vX0!O>@n5s zshl*^Y^>pn9<2;27>id6PYjAX8)u+9r9T`Nvy@3Xuvv+L}w-jH(e*?m|A(((i z)IM&>I$6#RrfKxu+JeorBvqNl`|6_nP)qe$W>|-M?JDRIZlDc<0vMw` zS%Z2qSeC|?2d;5;(8)GSvs{g3i{7JOucO?5f0dBQh*c_H*GFo$sq3Pn5-5UT*FtNq z!d9km5VrNUHv^6GU-E#Md@R9^t6T>_tEah`z}7mij4)3NBqPr!OxiCHj&`qzbFJow zB-s8k4^yXFy18%&9Wp(tHbG(&cy%zeXxPAOFgJ8c&mt)&P(NOg9TP@gb=+iwhM1HK z^Pk0rB+|`hsM*m`B19*87@^Hrg|E_6*~&#o-*HB84WM!c5vkrvV1&=l0z1nPieYqk zq~|`>ZS(A&g0PF54M3-60dtKWgG;c36e^_@Nc;jSk{6?uH0GgRcnS%RpT!0eNm|Dg zb8G`*RIRuy6C+qoSQXjroXMQFa0iwU2C6~=PeW}gBEbZvdb}6F9phUqJiJ%hGqS_d zwT^YR;m%pdC*$yR8cvHghiJHfFmpNuYEO+N5&Rf+w<-DKpK3L>N;nLYJ>+cc!OndL zrV)mk)+jgeph6K*pj}g&E&Y!)Xo50}6y4l4geKJx3S{kIpJ!D-g1wINBy|$R8Lq7FZ@gj{g|!ApfE0VFU>F}kRwU)bRe50Pe<8G9IF)JpELOD~05O3SCeA<)q~ksHTLoF90+Gr^973y!iw*bI zlWE6|8eJiwwjTstKlW{bC+y2Q(0E|g@x@{MTaxsB?$tgFdc8%Rh;F}l5Qh;DS@^~v zLZ)L?NM(#`2iJuSsXpSb%)MFi`tElFd7uoXI4Hp;5EwGj=9W_!LmCGF=|s^H@b`mo zikPWpM+ME%4A4smtXZTY+ji5@+5`sZFETddFm`ODf%l#8@bof-|KGKED8Zq0_ zfQ*fvXR3DL5vBz(@L+*U%QpJ#=YV++KPxGZsDuBqrTWI!Y^VG7Lw`T)sks$@^Z1uT zmrk+5B`%+_#XdMEH(9r+VVP=r=34cb%xKcwX4douy&(dy&VMLzfbVHBAwu6zF+TzXH$cH;qvuwn25kwZ52M-K`uR6vwNP|tqt(jVX-GF;VVp#^>Tkb!q zW&gBzeMVo8bJg(E16K>U>+g47eKIgiHoNL%F!B@{AU#`8{xs~~HN5`8de19^-X)%S zuiPb12djj{&&e=9?@V_RVCaq5OmA@KW!iZ&R1%@c=~A6CHibfOp|W)orTofS9Noj+ z1f~e^Rk$#NuwhGe=*B4*J9Bq^alf;92YbLV&zqPK-|76c$9b2hbE|t%qD=v>-?hNC z@u+Qq33_JOOQzZVY0HfySG|2SOs;P6yK0NIcZutFO6f4wx6vSU?1*!^^vX`Rh4JVDVR4ADuZ5w`&v`Uq zqeGYwPxusjI^NsQsCKbY%dv7l3R4p@m|@*(^Kp+qFx2rE+oHM~8*CCvI&|xEFwQ+K z_ir5DJb4+OyG`j-e&x-IGC+3yWof`cM!Vl*8|D_XE*-%d7c8jAzqzH8p(FqaW%T4o zdu<#{hYLesnZSS*u!~+$(rQ}YSfdPcH0y)y0uY2|bj+$XLYNY1qZ-9R-dXKoG1=oj zLq-5wO}MB-WAJ;g^7KKx2@D%~aTN}RkgDZ6i{q8Dm!x~OOL?$0Vq;aJk?0t#Ek%7* zjvzM-_Aswgvy86JhfOYby;LcJ?ZUh#9 z^kNuRVx|l~=io<}A`hl7hOI&~ZM>O=XqJui9Vg6wX}^zFFMU48a1EaMr~)uRL&ujW z1QXa&D+4cP+Rhv6Q-dXJyDn1#c;z&x(o4sqS(`(2tpp4W^~p7VgQ&EQRdS%Jm}x}; zRKdHZG{DMY>~s4auR{+Cyv=*3HmNLS|1l3x#KFqSfIELNZqlq#iEw>yhDMGc9REO( z$15oCSHr_rmC;ReGO=Rf0X_O=K9j`DiW4)tD-h%yLlrzsEsTN1!N5c)08LlMF}%Dp z_o!!@aFIc1_H8FAOgk$4kpnh zws>R^6`t*z8II3Wp#k9>rt36ar;)w`f0Q7f#EX7Qt#cL51XnPLRp4YtI zo4L7cHIbydmCstyxVq6WV&lU>AB0g2(MGY1MVe=ubHE@V)0{?kas%@R<-1VUGs5l}6--GN(5>rvcj-qFpPp>h+6|MnpDWO@uJhr(vgH*;2 zjz?H=*zRboL0KjPar>Nz72OLNcxUdWWJ+6|AzTFm04|{jp`Tai2RqoiV9x`HaD+G8 zOT_p&hHx!o7HkIkVxU+qWV{Hw?wRR81N?L9?aMN4M6mwRQ!>(Dc!W?Lk>x93TM1ys z9}vc2%wRs^0R=E6Wf@X{$Hy6)q(I_Axb_4YrBFe?>Iz)OXnr%t~rQKq$ zY5mADR!BG$MLqB4ow;s4lORBBx6=#UkK6_W@>Qw<0?m8K&27I7(=2!(hvbr;v@1woNw2rp)BqamVr3ikL; z8+ufLH)~fIi~onU7afTw(IuYV2o#5Dhi1ueSp|1liiFdS1ki=Yj+|$yNOM>5Sy#MS zHYN-MO4eQ?9N(K6vWRpqgGY`bok&dIX?8RL)FZNNY4pKLcyuq_a2l~!z;NegItvg^ z{LIK+gmKQ3oxPB;i0zYDN}xyiQUFlEiVkCV5m^C?;IS@t7@i5uv$o{ShRtWW1E7w2 zKbY_~wcr7~TV_os3?W<#qG6Go#vpaLmpUD32ZYk-Fsch!mgzu6Zl-1udYKe1+m0Si zp&*>82nfyc5kc$Jfp9((hRd|=ead^kC2$%Z>diWD4}b&~MIG>!_I4K`9|Bz&03-kh zA~gh4NW2t(*EV$5^!a4{60$cCuw;2cC)Zw(AUI42@B`Os!{z=ea*<2%RW zGIazO!qv|h&@w|@=r8~ZL$kKb!(+W6!k7x>A*7UeI(m`4g~|$1hooaC5I_&^h4jVE z=IV6*p3{6CHkk`gi_LV)LBKie^#lZw0PfWQ09@v}MJTm4$*uzSI}={uKtHw2SYtvD zqe4Iq!swy&fwm_keDZ#M`2=xIVq0!aSwhQ7K)?sM4B1EWCe z#84y$)V+{pFS;8;Wht7#dMJQ2wkK4mj;C2E@(~{M?C78@hj}EiEK~Z_$rRS1UY3mj zrdeh&x?Z2sOSkIHH2ltT;AXn>q3vnV%=@O@pXP!#>4YZ%*{&+;Y0w+NZ;0u~jY zhoxHE3m}p((`uS!%gJ<1V;%cDOSKL%xd%z!oOcI|&3ZFEP5vLE&NLvVK5XOX%)T~D z)6BG=Y2WviaHdTqX_L^yOpz^2BuO|kl~Q3!=&{Zu$v!33Lvp5)>=Q`{lQmn4D8#(; zetF-oGat^GbN>G`=f1D&{$2RFK>h}10p*{3f5mnmRsLE{zK23;@?Qic54WHy`N67B zR@Y}VS7sd6?jSv;bQ^;<%W;QSBYr~#UQnM`e}NagFmwWIEtf^X1rCVwv^tQbU;lZn zYoqxEkQ}7ru$&2OgydxIblfEvz{3ccgqZ>0-J#M5ZLJNOud9%St8nfUCCrw54zj-K zL$6&c;!uYZ1{7CKRz{6r*EC>fj^w+3C|EH!KSEO=|rv~fS=Awk^haN!XcHnYIj6BArlU=f#YPLet!1yK_+PD}pmk$mDeZ1@n? zTJulx0T9;eA8eRlJxJ8;_>2Io$8ua$G0sMg`ol7xVjOW?>J^*6gM>jpo|y0Tb@RQe zX3^_xU)&B}4~(Q<$aA?tg^)XqQl`ViHclWn0L1E_Q+Q8Z$gNqHBrw;zVFAI9ivyy4 z5v)A^$eAd-2f(fi-0`nezN%`iH*#e8S%Qj$@1Du40%Mkf`WAC}flJY{v%GkK%LI#N z)M82c3ghM+Z_Gb6v-ezx#{>X3+P~dAQ~a6r^GJZyd-v?}8G$$mAvm{*#dCr<*p<~6=9kmn;YR?fH9?aeDu%}TyNGVX4;8XYIt2|7HGLaJHm zdwh>HlGd*WP2u>@o4k(%H8{SRgfua|{{FgC2@QIhP+#+`twLU#OY^lEe=@uqvg*O! zX6e$}TX#=HE!*tX9@Ml&xc^K_p0#!KWuIHYd;Euw{;gdy334aD@-FWWn7S!iwB7jP zqqS!d!@Elp8jkubo`!-Y1^NV7motqa@z`Pu_bg^_PY0phWJ-oZZ``r)-F)W!iHY{q zt}?z?Y9~B_vEI#NtgDVl0S1-X!q!wTRd9i-6c2TZLXIGS=eO>9X)K02~t^h@W} zX34AjXIG88Eoue+&Q4w)(uw1`g{Da4!PjxRc9+z$;ObPFQEEkT3SS_*RuH+$6(}`@_mwM6Yn#`^uXT6d#;;mJ^iyBqcJzIe0IBr`PNWtFBR1=hd%U zlSfV^7sae{v<&FjAm|Cu^5vg)6@0P%G9Ut{mbOGd^`x-a@nV5~IPDxQHI%=!a`YNo-d$aU zsciHtw%BrJPqZEBP&vif`cv1Q4bL_e918WVUdmZZX1(4U@&v!*aL)h1pptb8g^cnc zGSK#)&yN+TEV_w`WZh|JBz_z)~n#G3uy{H!9IMywT2!+QilT&r# zQuFMxbzL5Zv(jd|G*7fgSY9rBd51GUX#Fhqv@(7ubFZrBCdty#cy7)e-^#>!GyLA9 z(A{vx|HRiGxoLCy>?OUiT4iVSW>eymQ;%kRzM(X!?ewXW5_(YauN3)dtGS->$EOcSLQJMMdUgv+ zgS>9o9?bLle;CwPHKlyn^OWW%X1vYAj*2J~YX?!Jlgg~R)2&j2>BKjPz7~S3y6-Qt z+B(7B4({k}=)(EsT_`eWDYK$l#W&81;I3-TEaEMzyVXst%Bv`WD5CgTCgI6~4Q!VJ zo1V3Ptk-+4rJl@sjUvS10n|KgZr^U?`mcc3<+G;$O!huF6GQfYdV3MWD_XMM(5Zl_ zw%E!a-DEw{qs7}Ubzl~nIGvG%Tde@%f|=3*CBkWoF2}iU8B+(N#R!mJtN?jcLS`|n=0&50(_0V&3&UVytA^y=e?KZ+#ypBs6BB!c ztj(fRHYPSCqOy{a2XPMEhDw4Q$iWUnhLo+*rL%i`;-cS#)!2+mBMTy!{I1S8N1L6| z?}fZ)#i6!a%eMfn))wFDW`64_NyjxBZ8qpH*Y-mt)2d*~Kr+^nDJ6ymNGZ9h2+N3u zofzRx`jS|^MAu0S*GOp+Emk%Hmjo3H8P&;Ql&Cn+(m2NUU^`aFHG@G?W`r}SK`e>^ zkSL*J2y$OMAK66g6*}q-DtOYHw7FwYNZt;NWw8jLjF2%T7*phuA@(tmf@Z)>TZ+v= zLsC1QJn@{yh zgDnnc4i(6DRBLx9QeKBA#$vC02k`b)u<>2(0jC2+UJ)c2DQo0kVgrKT7gtT{B;7C? z)9OEdLrNaO9Bvcggc8L3E^2IszQwPG+ezVC?5#SV65)uw?Q@BA{?_o>#{;k!G?tuD zAY6C~2*DCY$+P-}{w@=hD@+QhSIw30!W|cV0;WM*P&}K^J4xbc+@l;4P11|=7NZE9|tR`F(Xd7Ps-ksvGH4nTO0GRKP9}Z8v=DQ96BznsT%%-|d{FdSPs}-xRvk zAyirF1*l0n`iPLM8reC6uV6Gq6x!rTsIw;3q;0BemN(@X<1&C){Tej0?#fqprm`P( z%N#GNmD(Fx=2OhCN?e5Z)4O6s~U}#n)3T6H~eP_72x{VX@hM zp%De>aOp$zdPX(7EF##kHJ0j8DdpD3V%hBg!8Jn46;y@T>vN`jyY(U#UkAAMY6z=? zs)_ohwo!a}AxMKc(as%iau0lp8A3l0(e83rOR=sKaC2bvq697R)1*@D(yy79q4~^1 zATP8^ZEqG^;+xe+G?dF+0Az=7iP&hR1Wz~70;$OYJtzuGU#<;WFeU;>%dc^0C}9B~ zr8e=ALsvBvUloS5J_2vLNL6Z^tYmGB4P%$7WOEv&>?{a1PwzooM5!3nglrAz?Dw;sp4TmY`v}?(lH%koqmBh`Hy#{D7vlqh%g-!e0Ee3@4G{i-oZ2Adf z4j>Mn)IfpS4bY*MsF2%<`Lk2)dK+{*1G@M`IaNvBYDlU-C_k&+`i#&7ZD;tvHbX)n z2egNPk~{4lI1C1-X8x6$56E1!kuIU&cRXyW!agjMy4tAm1pw$Gb>*v@_sY!qi0z1Q z+2K%oZR0Md3G1(_%jBUttj5ed880@QXxYG6b?C0fl;J?8tMt}4)s zDYNit2O4E&w=rO=+M$(64M2=4G4w-PW+I;2bZqL&@`bU9w3x`vTHRgOns(0=#4;M= zrcyU)FfP3>?D}OUG}v@ZW&;SFdNKd5P`f~M?x$euh!Ep3q3aopYk<(Dto=$RCS;e) z#4O*fv7J$azB(!8Rben=Fs>$;sSP%{Ep%iG*oTA>^#G)8cg>TsqQ$OxYQKJ&Q;yoQ zGuUfL%IlOl_qMYu5%+=@ctq_HApGOGgqx#wQ-S;Ts$BUz;b|{Ze#pVDcG-e8_?MFw>SG7wCKd}&xAOawHqY{JK;i1q8GSmf+-PdSN%#p zdjpCIcI|Cvph8!Teh~qt1DJ!|YS;dD69*mmp(mJA+3xbG-Mlf`wd_&p25cV-M|#{d zRS$!5BX81#oxT0)pHE?na}2mR62(PrCQ0HTQuAmbHbQM)px#%B@=vzLR+ z+i=Mhq45N449IL-+VLq;ivs;!RqHRD6H{oCM=}_J$^ABLy>QqMm+VE2@}!0uwQ+G5 z$rr|40r?Iv7m;EMq`XR@>42I8EHjySV5|XKT|jd7r2AAN544}&a-*T7~jpAEi zvX7kJf}Dv-n6snv=uUw25XBD>C=Po`W1K(beYj|JjS4>Y68Q5^x&BmXLjc`oJ5`Pv zr$_@pC&Iti8zn$F(?bE-T>Hj9s;<-C<(ag@qD7M*BmM~UMq0aFqI!k!R>3Ct9#=qP%e)>CKtNL50WCS$%g4 zgd$fwE6LWVqOLVvZRIl1wK_R5vEwGR*lbs*q~t|V!P@Rmvs9s*@W#9O1tRe(j~WX(XT^aj5k=18(y|!xE#1=M}ikA8~v6Y4^R_&UKvOkx@mc16BH-NDaMkSBU*?Ncx?0sh-&^2m;hNMh z#PxXYH5G+0Gftz*R(u&UaWgorVw{i!HF+6u(VJX64Ig+~%<-}<&6Ir3 zJaR76cCDAar6=&}By-j}``uoSv(6t5{yJm%I>+-~&K;}G=GB|{XFA{Wa=rJ~Hh-Pn zt#z(nyxcb)PSLLGIJM55;q5ugld4$f^l_c1ySMkN9`_TO)Y5g{bG&_L#014~DsOwT z=6U;X^v+SKQj+VvHhTx||F*H;@eZ*5NYsVE<_lAg6}G49)_LsyHucekX{Ci`?)4ro zyl0Gmi*u--{@}t4#@IAx7pE`YLi@(4L{A&*#^4!^{`u?S3*MpgvV0d`2> z+Z(3Vhiq(&`1Y04(Gak9EaJqN%f`%rRbzgqeWKTXHJ&pz>w4qtSM__Ac-tHsn>{{e zeso=kzo#|BH;#8P&eAvD{$jklZ^HWMpwr%Kwl~h1^WF5t*T_dcbC>yYw|RL{891L5vuzBmuoC0T0pKndFg#ktTqs(|s+vnvJ@d5&7Y^1Tr zix=kP6g3o|nAn=;S9rOl%sXt^jES-rEz6%y>^w2CLN~r^_e6o=#O@Ol8C2a*`Nn|o zFWC#$PLx0OpQRrO3CW3EmL+S>shrikp1QGGIkETA#to*M_Ipochit0C=Ip*ck$d95 z1Lp$|Hvf0fmQoAA(uClJ@_em)x2t9;E@+UQV$07XKp&0HjZ4FP?!eDiYAn% zE&20)RzKSGvEt{kZT{OIT&$k+YpbE(Mux|pv`a_F%WF1ISwFS2c1}~>b^o$^KTpot zxYP8EDrowo4R<%b9VB%Zi@>-3d5 z#Mb7^f1dbnd3x*0?2bPjPp{13ZGQgo&+J*P4}MRZnU*)N=!*8~`iCDU2Y)x-%fE8f zy>05d*6Sf#qffNHOqd@1NEdWs#`L!{8`Zb+-koTCyLjtRX_f^0Yu~E8_b=Ap8~^hm zWK8qu&qv1C{#$=P{q}yg_Rr_v7v9YIJ3J%ni~Y2By6K)5t_&N_czN`1r!MZA_0@Nq z6CY2#8hmVvig9)9QN!qoKi?m%KekHuquKk#)4$_;){pP`JMn1!gr)B1OrP(+|LU)3 z*RidN(|>;(eoMGDQ>FFO;T?+nz}Dz{)Htwvge-8dW&9IJJ_{% z>i*#ro=e}`E&uhd{^#m8kjM>cvFbA{Vtl-FYriDz`fkC@rYKG!#mJ%2Dd|@7x@Gr{ z3X9w(@72A%wmR%Y(v<@n(yEWoUK{@GK=$gV%_q|@noa#OZ{Vtw$ZN}79`}4zAY)$J zp-taRuCXlN9T?cO;p3yQtNWhsos#|Kh5EO7RPOJw$Adj5=DF|ty5shnv?GgW9NoI* z=zPzPIUk;G-KNv|=h8j<$EKc~3b3MM)rApLU5;ZGPLZg|j$;hx+t2eQwq)l|nvgM* zpg|#>UiqcNFs^a9eKKM|)5#H+v098gGe#{9mg;WDUDpue^;yP?2jaQ~g8VhGX{Js5 z4ck9AN3QRgNQ=Me_{!;h4J$Ib;->3=Wt2lg@z`mNtX-s+^MoH+{w#cT5?#^UMwpY;teR@VvftiLO8 zd!ihKvPW%q%_EC8kKUR0V$09Zk6vs8`1}0P%i}_m7`OQ~`=0y0v@9I7e!RROy-K;=!ervrzoNXyVIR+yEA2j>RU4RAsWxs( zH*Ppc-u~(0jW*ki#mJ^w1}m>hIdsB5YGdIZm!Cw#g8c>;Q(CP*fYSIr@f&W=(27GA zIlFc&J-pfMeCxXGw)#UB3lAs|S=%QrI=o@%zc=*A$$q;HIsH0m(df{Z_jb&jlEuU$GYooO zadZ0||C)x5kzV9{o8$jCbLi0w-Nc5r`S|@&b}gGXmUT@%$&Q}#eyU{M`wcUS58am3 zYOc8qi-U%qb#V1@=K^`XL4=tVe+0Q^9jc!!oD?!;z|qnE!J;KdDt8PJOc0b;HY8Sa z##`{VKqe(ugk>TSA;@Etm;^HlKD89}4e@-z^qPQQ9i5StU5)dXt}4bmR(&xLQ5JT$ z7ua`(8TV?7H-}e(@!=Mt^O&T} z-JseKndtEE1E`C~Vx=wp_&*ttuj4akkLjtp9lFXE^AjvL!rn4T@7O;|$gX?IJl%iIKQWH% z^CW)D{8e^6#S@3tCfSP0GNRg2G(AAf@#5W+MI*((_AtZ~$>^b9IV9p?8hBm`v(srNspaxeE2rmn1~W{ffS zHKNy?jfQs4Z|$kNtmvA1JTquvXR7JPmN1v@+}2mCUvZjS9A--1G~5b0VI6oeV$na_ zmAC59^HX}}#V)?&#TnqZFn<%-wL8eGDoztU^;Cii70y0DO#XMNqcB68|1NJIG=(Hv zzTS&tE=sy^=!y&5EpUNsOhNpSmeKRc|LFs6LAk}2?xpUR3;OJoP47QQ7cPIwv*2G8 z)P9#TRP&Py^@G}R-7d@gFBd?)aCrh1vtrZ2{HRnf&d242?lt?LKR7&WQJI#q+45cB z_qK71pvL1r`oJ`i)g}& zl;-_X@7?2Frgfc@Y?dULt9;stbgw>?Lag?_=?Y z22Gbf@A4~d-WBJ75QAVfn4-z2rl3U6;%Dp2N}VrXg9%<9qa>OFFdjnhSszi8^3Z(Q z*_KA95w&aaJi7N$W14jp$TERsH=SV6x$dk%>PV;T*{05*;sd>}%YeE0PnsEI83vi3 zZofIibYuj3*!?{gufqYi{Bnd=%U~Iw`76*#(#~tu7CJAHKAxZa6kc`S~WYk>7e=Q6?04+p*417tq&c44A&?pYU&m zmzm39a7qhuTpE5Y2Yo53tlDnG5f!jPr3Q`@ z!N#E@GQ&!dj=XmwpM`kj*Q9NEdp;eD&F@*XELLWIApl{7YjHuMU$m960Mky3F_xnY zU%r|umu#|3tZg`E0qWshMI04$jcF}pyJ<0(#pZQ>&~vBZIQlzVcWQAqY}zW98Qm5# z5)=y$hQN)N2VAbx7dJA@n1r04gTzphki0H>w8R==w$^k_t1Ay&Ii`H!vKHmX#%;G8 z(c)bsQj#3P7zN~E4kf`@Eo0mG^`j5Qwr!hyvwItn4^hYA?aspjz7@!wE@m14f0+s# zLCJ>HWXxHRsQ@`Bp#6ejYJtGdfPn~;1d!v;6BWlB5;KstUEE=%QTH%c2MwAIX@N3? zmMxzgN<-+_^(#+`VXNQFx zj$%zZg!_T8YXQf#^PBAXh{&1ISavyh8wK5pu~5dG2D>$kfsg zfJ{itZxS;2AS*@)%0!q-5wBVS1}IrNCQ7PBNGTAxRzyfr&_h9Tu7W#FwI(;35HB!V zBV@QCBnd*YgXt>;)I7y4cC{!1BJEPLF-oIQ&~W8@x;|jn0A&LpSOam_4APPT(wPiO zIM5S|UJ8YAwb0l5*NAqR+&ZDTJF1R=t|#pllp()%NtsTArfexcMrsHsLF5yrOT=>! zv)DWFc?iB5;Q{2&ffWych}|xb|`eL<)xK3)E^mlvDxVEO4;umg5%)xEQHnpPKs% zVCzx`4N{n-V92OnVG=1KnJWlYo_~fjDe*8)3vsJqq68(^z;8@Ya*V;RTnL|2v7GO^ zG8G~*6^#2LPU;}FfoRb>XrL7sO&_FH^?;39E(u|e0bnuwITgkQLo5?9AP305cG4YX zNHR)t643hwslm#9?L`)eVoJZ5-5(A8M7R!W1_#DfBluW|v|x~y3lPIyaAy$nA((kU zddF-%J_#Y#Ah^E@LxPB0EE@Fa5%^>tNU}P|nGRUAQaPfnTsRE;Opg~{x7mwgaTG8n?&{P)=a)#wh3fyW3899j!lR?@q znCqjYr7Ku42;S9l>!e0<1x=q4(J0riRZ7Mn(5U5D2;fGqO+G?tlqqs1XVPU7r}a2)7n7Y*KSSWD&Ybtrsb@ zQQrgY0NMe;`gG;hzko%P8qAHxHKN>>ub97D!?&;z~Q~{L$(nN8T8XwvcPXzthdyUOxKJ?ky@9#08f-mb)PPc5#u#l{Zj*qE zqTH!sT#ks7tu)MmIq^!aSp~`Cl*NNL4~Ml32c_W%w7%`LXwI5SRUf||<~81-ry7HUePlGP`m-&7c35MWGU@>Oe!ip(?N z+x@V9Ibc%7Mtum0-$0=465!aZ$@dmGVdfWMytM)+Qkoly=oUi4IW@^mVYCmqlXN%W zcNDG_&g~t_nbexf2j46KrmY8gO9WIiEvHF9>Qk7o2Tj`{3#ooW7^L2ZOxWWbCJICe zxbaF;1i>GAUr{v@H8X}=%dKoGv3P&9a_{pgzs1&0Z9Z=y+__b4Vx!$V^IVYu21 zOfAG^!t@k1utZGPYsle)1{`Fu&~RnVcAxi|HSrn31TByX;=fW90v7i6$~daU?wuyuIBw!U4A~%UUOsZ z0WQ2L1l}ydWe?^LsTn0?#u)|RF`Jq$1@5CqL<0IJk^gQ#d`b=`Lz+A9{AC~6rsj>+ZSno+CI`vIwAkRb~2`n2>~nC_&XfHtjgRCf!RsnDk_*lDRlXl-ml2xEHh$o9VS^;;#cWygO??u^WFadGF z0Vs8il9sKcYqeCG!pI_Uh9{f4TtK-g;@qsGH-h9zn8}1NZ$%~&!KROAntwhho}y&S z&=m*Y)-b>9-Cbm{Qq6Euvd?KTNi1rH5Y&n`u2ORNVriP1+om<7?O^rA&6wK$a+16m zCty0MjW`MdLqU&M(zDcnE?}@PaSg_A&``UMmjaSyNu1}YbCN?{mrlJ*2PUI}td z^dm=V?y1H#hi*V){~moaK|Dik{RR9efvxQl4DoHUiA#KBG368!crc3id9gQJaE}2zkjM*qy^YC!(jSIg>DN zvwf4<%SGV;@bniSr(~sz4XSzw6qu7I)Nd|Yo|2m^CHaYYK7SZ%q}$6;@*1&zvwMqs zsk#g$H(g8-DRHrC#;N-DuXsTo01m^9R?q?vn@*PML%f;Wg?{-kK?d($EhP7os3`(m zx{yoBH8>~aaiw=P2egTY-QFYzE*!LQ5Qdo+t(iM$3JlV$pk6yILm#YUr3Pa`ZmgI> zQ?Rxx8C_pUYLrVu$w^{^Y-xs0Br*NVsxu`6Jz`aGo3ps#NYaCFly|?_qDgtO0XCWo zkXsSLAuYuWr3^t-1hRUnXF91FH-RtJvudWSTzT`+(Xw}@yQCJW%8qd+xdtG&X)%qn zc@I1&T7bM2rS?IjD2Vn1;*swVq99TiK+^-T?gF%P2vHXfQ=W(@5|MUfX-`W%u`DR} zNZDSe*>4tUsY_651xjhG|F{RC-$d|t={?~vS;8Rga>Lb#XuS~44jx*ydonlUV4fD> z3#5vo9L04;#gjD}LxTnp9tCLrYsq~m6;ZrD{QUjVkh($A`XM3T3|_DpBDIU?eIiOb zK<0?-kD~^SQ2sqFtqdjHRnQvH$upwQ_7Dx4((HL^toi+-Q1s!$Wu^$I;3%3>w3J@> ztGnpIVF;hArRi;hOBBDZq9h==&?q2bQ9*3O_Tmb^gzd@Yqf03}jeVUKoKae*g_{bQ znx9R(%pyIy4vl9j?@Gm|==MG9#M^iB1$nKp zgVxsyZ~57o6?=4-fL1{nDXlxFHV>Ojrdkl@ z>?4sGcuz>;@=TxS95k@X@l4r0HnC2++PBq1D05>@49NISkDgK8vt|Y}g5(}js-F$t zde^1H+M7jC%+eyvv`&?RbQ)hS!@9WaSF9WA;bAvhFX04Zz3cP_g=uoQ1Lrd&ugvo9 zhB{)S=6052Hfp?6wjTc8ZNPU~J^q^1e*+F71(j*_FAKA^DAjvq-J3O0|H(04yMmnt zri>NK-~yLu#WN|nWPuF3Z%x(`#uSajBG*@e$W}WXf;({mODYpj`f{?9Q+52&Ica~8v$3@)rZn~kcW)r*~`Q&aBs19$_o+|Jn%FFtAo0inauJY(O}sLBMA4AQQ^EHO{B3> zhnSDQwjY+*f1z&2rksXUSG9#FzLBg_%nRs(nSA9Vsl^WZ%@>53Kc*=wKmPd7_LpX~ zqvto}QpeM0!>i)r*U@uMPH9mDHtf4hVgmALcTgSvF&0(DXt8u)qu|ntvvhvTOx_EJ(9& zWGd*(T7c)_s)ESdGVXjn!W+{df&EtW8Iojdgcf^sGHl822U5z)5qbukYCh7BXFXDT zSt=m%iMm1)rU=IhfJo7qaP5SaVt;5Uj-oN#Xa`K;2Ec^w%!>DtURJPf;268P<+@8# zy}?2nCViR&F-aGcdek6z%JTW;8Ct-`1_be|;6KckgBG8LESiRJb6ZD?=F;@#2UTdA z0g^0gkSVlaDJB-hup)$@qg+ZNNO99^)kb=x-t&05()+oCwUq)t4HE9WgQl4_wRC`Q zlVogM>h>8q(!&{0{xZCfb29dti_LMXi2{f$>$hQ|&^76!D8fU%!Z8f*7ec`!| zLW{gO3clq!(Xgt+MJoX#Alxd`0?z%_^k)wFU@en?hXka>S~adqv(vo> z!bb*l&=3XUoTr=;sd;rZINax11PLrqU9$_Q-x)ga(v+QrJ~WUQCr*fYF(YbY8EWNN zAi#O{cRDsmX1gp=p4hFUa^~K##(0>$s;};+IlY#Yk|*pji_lINxfaI>5SE4qgg8A^ zQGIQM_{9_L)F|e5@jx{#+(VX^;OO<`z)Ht6%de$1gN!$Ksu@=g2}w@%l%N3+6gq^2 z>)NqajRNlVkq!UCz(hX~7?KuJ={VDaE7 zoP7qk)5{0Auz(+Knhg@LdJ(~zBxAb>i>nt1j!j{*N0>J-*0EN!7cK4f$g5Lp&IpWd zlEUU}K@h)zYKDxo!gz_tJ=;7b`0coqRSmdUP(R$VyV$)XMvL5R$?CC^+&BGFzjN(C z2r~mI(iuhdnk@Vzq((|)u5T4oizRAqRs?9-I!cQKKnKsNn8=eKu=q2BrsI#h>@c3C zk^B=PN>wN{q#$E`Qn?qZ+Ib7ar8A0QZgT*^JY~fbZvRW#;t4e`l|_PRD5IXA98;&8Z^rehOb{(7V5TIeOCi;h|MMy@wfT5&H{fu`B4QlCntNe6O` zxg?otYbey%&9&icC#>hyA7iyt0mf-ilI@{XN`nNk@sbwI?+j)qRE7CUbfepinAJvc z(S`oW<@m_kN?f;Ap{dQsmbRK$d(OpQyE@pmR_`awo_Is57+HiXMz87rC_DUT;sDJc zhaguwWyet+lTTf1i~w27p~A%2b|9~+(A~rnnbH6Bthc2}AYQ0P@=9NxK1Q^65|^$m z5Z^G+w7aU%630;CdufEwX=NOJTBXqVvZezc9lAUh+=UN~Erh~*iW2iaEoQY}7m6Nny3N_zpQ`H;lun2s=>=1SJsw!b1)DF_UDrFIu|JVY&}? zI3#pXM!Ly#{8K(3*_c!t2vDH;`_VFaHNO72upo*}qD zN>LgwNb*)75HiZORFmtO*L_J3MN}D#D`Qe#s0bMnYQYE|&=T`K0HKC@LQbpHMm2e6 z2gD;&Q`v{b>=)>Iz{*Kao=lQc5;PQwoV-(xYx1D1m1Cmh6gW0YprC}K3(hhFlNFRA zlzh&{xOb|&UR;=d4iM=be;gt{-5O6HReX{ln5Fhj{a zn<7BzK|7_ON+2phL(Z2|aCTHj59GyOj`&Bi3?bF345}c?h=Q^WAtNGk*IvI9u>^Na zvLQgp2B=H5xCRM$MnlwBRNh)2<3XR8gyq|RFq|ZqX|aS|V(i=Ij5jM7o`A?wot`#(hk-B)pClVoRTd9&M64x{?w%sYL_mwq=KsPtm#V0GxcLGP>Rtda*aQeg)O0x^&p4=%>o={z;G>qF zr&&KuVHSsCl9|+)*u%%=WJd{pr-}+g_={ScHPhm(A}xVQHF*V`7@^M>1)Co8h%w|7 z_gI%2mD&nZD*6Z%eOE|N-eeMzVCrs!VgQvbi_>9K3yIxT1U)RXQbIalh>25BeE=7O zSi&g)*r6dDNk5YI6Hm9F%TdBvTH@UidLEM9tet*PLYrVu6>5RrK;U#NVIM-)6E~N_ zR0AeuTP#IS!&AvImfpp8t2tr<`K*Ld22jQ%)HaxL4yBBHkn%i0v-Q9}lw^qD5L@gq z1#!j!`~?xPT4hj%0L2L``%M*&^I1AArgI%;mlAkmzvpep9xH{hx<2KjhKLXj8+uUx z)6ir9p&1~wjNroxsWK+8UPa$4$`QY-<%!)%b!4T4aY9RcBE}LS$~q6QQ9;-&p}P1G zZ=#eIH1x7I!>&e$9f_buD6pX(v+EUPiWdJ6qS(qwEljEizJv-3 zte`i{q@xPrwa{4nMNW7uIcfp`g%+supg(v=xg@8X z`hgF%;!$<2!~5FpQjE^y#CCPX;Cg+Kl<^b^rqZaH6>c;?*6l$Sex7DUgaU}v@OUa* z0;0zp;_;)Nd!4c=W2PN5jqI(d>P;rc=3;z$fcYMHJEC?^~0OySa4ugAnU{yu>m2oYtdA`nMb$QfhFU+b;V7&)<^InWj*k+)> zMa7CJu{>`NP^iF%Lr%AX-OYPQ5#D}Q!KBn+^JCY{9@yYN{Km{vr0IdMvqqTxmH2Hv z|2Uqs7KyG*-^}Qj82Ovd%NF}4$Z;oMo z1sgDRnTL#}muYe|g!}b(kyP-DM56!#^+GtH!MRz+aemxn;Al zgO>6@OKlg?x|y`D5n2K?^?@fQ%nM_WV5Y-&v=^tI6=1#&-f(=3rR#Z|TB=$?>+qnp z0r}SlF_&&(roneIy+MpGsHzNfK(GVeCN{{eDKO?pwY8Pj!pftj_VKhAudo+JXl)*} zn+jSxK))=)=fA^vva!qxbI(fzit28pCm3L(QM|^!S9U%u_qI-`X;H#kRrEHMKAW0$ z7ok1W5F4<3jll8`&D;%$J-5$XTW*2$+$pZHUd*I*sBWtfT8D;q7G=B1EKbNQR#lkC zFU30P`LkM`g_{R>yT_6zA(U&OAczxV=tI{K4ogUxxrg{_%wdF%YVY?Vv@X2>C^5QN zZ-4VX*2x2`PGz}pqg;}(3+adNRde2ZCPxWvS2aLIt{97qe7|FaUM4MU_1)Kbw12nI zG$Z)tBC{j$`k!R=FvVO`Z}qgbxBJ2qr^RnFYnfj2cq3V$VZ1ME$GrFqBD08Zb zltt7RIm!$7FJEv#pFN#z@t5lG=FjuCRBQnA=o0_u-vX!j$T+4L2k-%)qiYRRy1S#Z z{YUTI6R22GVvkmJpqGrR{p^f4I{oqNvr8CrL9v2oaW9R| z0i(3%kt8dGR42$Ps7B7cZKYwia+{iON|D5Tc zTQ9=JLoW|o`%~ZlrygSb9*Q}~YCHC>rGB8edMI$+`&nyPJDv~y2L^eMFbvZ8|CQ-J zxQqDPMEvT6GqRpHVF{*f`LENq#;=(YZ!*dV6}<6W!N0VIb@NK#(XFP(8UkmIew;eX zM-t;76{lUgh&9^tezU>Wt!uU#sy?hO`Sjw5Y0cly)(P)}r@cM5>P53~SUdgbfvp|Q znV;|78NMVKz9jtQTP;93YKgxXGUmt9kC^Z0hJ8mE&(?qR`^xaQ8u`{{`nGG>V52qp zsOf`2jJsxOvYErVx5IebQC=MXdiCe#-?f4{Uv1ZZwb$`^QdjHUU*Dei>dN?5+V$0W zx2qol>}LHBZ}%D0bojmtK0Tp_&_ZaT_g+M#B-Bt1MVg4A7g1wJETjRUsG%AVBot{P z(nQ2Ym12vCh#e3S0WlyTAd=1RoIPb{|GTrVmKk2~D$Hca{pESC`}*+GD!`X>f7_L> z=w<%4;~UuRU3EFS>UL$-{mOvH%T@1Rt9$pZI{o@h7B*yx+Z(0>*SwCRn_m2GRrq~S zVm-omJ!=k@_|J*Ge@-3!W40S`=Jua+FaOL6B(eWR ziKzl)0Kb8R|3)hPpWyj_rQI2JC9WO)t4GVu-4s~KStVZd?**2uXJC%NO~Eh|~jDuP$@B5~CfP&^5X zs0%%>RCSUiD;c(2PPc>gwt26E5enFR2!heP(BEyHV$P(kuAG3vWKX{sF%~`{m$r?;RE#7JZNe@Ze zi2_SlZU307Vz~-ppap@6S9ObG=Ytd;7F7JGJtaeOQRWnN$x2w3Hdog-mZXK>Y<|Mm zTWD+_7bs$#vkePP57y@wZg<1<7n}QK4=uI~Y293GeP*?=*v56$|Jgnk__w$?Gjz}4 zDsb9lZO4$fE{ob!1(h9+2bk`!U59wyG+%FxJv^;>0Yg~S!cxG{V5SwAJGNf@eX=PZawsB>|;O^qe zQxx=fk2->$+N4<9aTzyS+Gh7=B2s*s> zeF&?<59C3^KOaxNJ^bfW^7mVRKA-=?|M}+&1#Yx4$&fp;F~!tw z+L+GSwY2e-+#p%+lunB$c*))YUd^%{Sg%+FEEHH2S;P{`Sb< zpPk>E{w_WEv-I~@H{5ue*DrT;dwEFv_V&uNUB9+}bKQ*pt&Rm9{kJv|cl+P^$1}hF z{rSIa6&f-!=oU)I3T&9ZkP>^ip=3a zvxk4G zP{dN*$#AOP`VohL<0Dknsm>&)0;b5J{yXKh8bS_LJ!3JBefhzwy}R<}=zcn@R|4WA zvHrN8*v7~-4jE$pB{%<&V=fH7iuEM!22e$54A&%A;Y##~VtOyL68RNm#l=hPQ%42V zO}UXz3d;$N3f7eA;{0Hj*s<3|<+y2;n`#J&^JKvFFuIP|hHN6IMSKq;8WpEA1VrV^ zge@L3FYFvJ^3#>peHJNgU#xE8VNu{x`9!NMxZj~bGTpgLQ-%)!o0a=zrJi)OxDFb@ z!t;9BjS<*5b|!8N04slxO}H76VIi&dq`o_|=(;MJI5b9)Y#xT`#aDXzn6Q3TV`0W~ zSI$oM1wVz&F(2U|eySH9BK)Nt4nrB23;eg-MqUzJZCdvcON$Vo*K9EMT-S~TD0 zEZ8BrH^FF9);?KAOhl!FQ!kVjP*#XpkblW~Dqb5!SGKhXCKuHHT|Mb^4+8mLpVR+; z@OuA`uK^Hzd4UrD+mL{ZZn!o7zmur{@h0#2V*dw;`aiwN8Ucy=Ukr)=Mxy@rA>nbS z;myt9|2`!C<4tBMd3OBwA#vbo$E^>7LX`guiKhS3n@m_I{D(xvn5nuos=jLpSFnnW z|D3~W{XSCkwrc|}pVlL#?X@u0({*QodpwTE^1cR-r8S*cpgat86O(T6tqPpNeVa>H z^N|kNkr)t?;Z}K;`#kKL|1sjSee=b``+xp7Z*ok?>{m8?!8Q8 zMCgFi8#r)qzkgL>Aos#cnX7q-s%`&l!#mb^|2*MO+R9<9mYh1DZQF?qe5J?^GkfEL7O&yQDZd@PZv+& z+O2X=T*+k^jffk)+|Hk)sJ&`?VFUTpHdo0fzyDENGVeZDD|C44r3G7drXJsNo=&XD zTjJ|3)TQd#EZoYQ&01*cS|3@s{Rk$q*xW1Yx!CeVD|@kZ#A=VeBS4K1=3%1)f9bFY zDfxLPLliaa5IW(fkqM2ksq1))i8kUu6Mnnm-|v`BvNLeUAK{9|whFQZE!DS% z{FWT*{Za}})ZNpdi8n-~-0CZo?th}&QmQu6DIw)7@<1$|rmLm?x-Szi?j&}lZ;)%c zc86MX)AC6ezwOT31F43mC!*STaN(g*^a_S6tlUdfr`qn(I_Jc}rzzWVJGZq+WZ6$HMH*cq35 zzu+@LJA*x-EL;g6p-!vhk_Lw!Y3uzOxQs2EW31<`Kv5QMS{>@2Uw|~T_ijfaFJYOA zk-pZa+_O+kGzi`UuH%oaCer{1UwOE}lbmm%_JTjWIX%>;y!F4idzfV=!7H*0)>3gG z$KdScWSFf6P{a=nK{a({d=^F_<_N#o9>rPKeRuTao=% zFnET_K5rcXtv~v|*qf{$g{w2tbkus!jTV6_xcf!06 z_QM~+i=9=flAq9t+jFNy%q!+=3||m?k*}<9SQ*pyt;#2FOZjGI^|QK>(oQednsbUJ zYgU;D*1Kd|@5auAs{WR)g)6@Xy^;CyzsgY+cW zcKa(xkg*0CDVEcs*-$>KH||olR)6S8#j&9uuVQ)uJ#@1 zNE|^czACa`^ea|K7wbso=aSx_rl7~;k&;Ygxw13msd{JcEP^JlfS$30)?dOWp179U z{Ca!O0({M8ask@*!sM18h+0pMcX}71^u~2eVKBZa$6hK}DNc1Z@aNBP776&Z?-Ke7>N#TrOwl66(#W7c?2#B-<>A zn61@&&dhhhFO3&hg5}N!+KJy7cko!2u(ypw9pl5%If4T|uD$3v5gd8{Ay2Rlz7)vm zdu>2q8FN)jjTD%C;RFBVX=B|yXStN`Z;X#HG?d3x%O8G!ZCv}T`OD7I-V1}@9lA5|!FWI|6vNqi)TgFAnN zBou9;=5-3FW+kFi7~~mfEoTOdb@kC+lL!F-lF1@+Ea)K?3_^wSv7)~s!7Qr0?3qJu zK~$9-P#ZQW2?^yRA*W8mhHnUd z3>Oka_yt598O9fc&jm{mstgvM;iZEj5Kiglo;o`rZ8^z^vr?3}LsfeP)+7l@`e{g- zK=^zUjCCN0KM4>=Cd*L(NLOU_nuLuBNQ?(^zZ(JE1+ph*L0LiG3GpMRXq3cZc^pL+?r(!RjkUl4=HVIw}j29dgOPK(fIv^=5xTY=# zvYb$hbQFL}`SIXuvXE@kbU9*P0LUmvM_fQc1wNuBpOk^Rmk&Np{k4oL zt^gEr{eG^HKe2>P$B1z6icCfWij#r1$)c4f;AAe0Pqy$_llY9qcXItk!9Hc*Gi-Mk zU3zuOxaG2(Hu+dBJ(VI{84I|?73nQNP_P7$TSBFYs7~| zbb$qH!d}^{T@<~^X82yNl{~Mm>MNot0ty1T`6I7j(}mTX1Z^0dtgvHefR!vn(pzsx z1?>E)1cwBWR1<(zP*^v@#yWE#_$X4S_<=k+OiuB{KBk5#NLRbyO}B8pju@;W6u~ou zw;<#?gg&sKwgjZ>WUlEAkxaDbB}1%!o%Hp1n?AR(Pgr*t;7gWdb%s zo(eL7;)seKtXw?6?5csBDc=iK8U!XOCbeWVd9$Ab)1M?%7}Alpe0Z!psb2cFRd z*SN|{GOuGo<)nqqGlGNEBfv(ylj`>rG_etUELd>fY=u0f!@Ab60kUOf+HjOKgRW(?CAtpl|{;wt77M#G&R8tr01Nl22=k?ShI4fra*EOFphl4m6K+J zgmkD@4zP2!Zh&0@44Y>3UH%lfQ8mGSQeHmsM!|b&`vlB=CQ6FM(oc-EAp`9J5zaUe zqWO}#Ktbe592MM2Qb4EX6U8PQ#BrrYJdha&Ys^Vg*#yB^4dOgdL;(=239N6Dr`DYn5L!Qxl})pb7q3$~O{yhf!LB?TAKnGX6!Z)UdU_`G zB+n*-1reUi)kfA2=;gl{^oE+|nSg~|C(rwEbD>k<$~zG;JSg`rG`Bgznhg5(4N{K; zUb`38K@sI+FTj9havT7~3CX}BC}dZJGx8x;6p*ubkL|^u0Wy$1VoP|1B*yy(e)&(ht6o^SMr45^?NnsieAOVIrbHKBk z5;nn&5UR)p*uik;qu6jh z7khFN!AF8W-YquuL`G0V@ZGF>59C`U%pO3u5DYO`=kX zZc#jmm(4<^Si}f#kNC7$V)yATy#!9n5ukOwSVcat4jDAq_c1WhlZkvCFZh!=;@Q~$ z`+l9P;^jYw(DUx*J;RUHe2>0g23K2yGgd+Mp`dX@)~Xgrp8~Nk0TOuN;tjYiHu1JU zOxjOTItVPltBgqyHBP0V%G%Nc0=gP&2RQU@Lqd{w*^CPq=F5Nt!le`s>^M?w&jShm z3pCR^1qU*wo*)M$`|o&QEO{4MxhE|-;C55+-n&Q}(ji;ch{!PoPsQYWz9U|Z3hW34 zC(%Redj=@S>bK5ysrlZzD++NX9y28kp43aeWIn{g|*phfx(%IH1!H`i*&%Yq_jvff>GC$6gaK?+8arBC^YSFjWzWjZHY!714G6DZ|Bpi_JskgeeJW*)p8QJw6DG~+Z$jRUMF z!B^1`LMTXZcV|EbQs`9QzS#=@Zm~7zanpTAL+biSl#{%A-%l0_7 zU+IVy=UC6ROphSNVMPB8g0FT+PkokPumg-uhIZHudMRA=_!Y6DatlM2DW#4SmgOoS zAX&%p08HcZv1;GOKAll&1^|u&W6S!%?*R5lkPZ@J+Wk)LQojAi(esk883Yvg7|@&o zHX;LJ&P5=a!+?{yfJyM^88=tO$aw`j3aIU- zGM@{70=Y8@jf^idUxyj5OE9Yd!)xTmcO%bpPYzGO%2q8%*o0dy0t8YB67d4k1G@bt zG=c?v%jeLm!H~W`5(hZ|UlVvGQdI{D(#L|>#jrz@!kG(TO)`u^gsJP=v;ZJcL^p+T zcnas>k|(lK3q)}ORgSx>X+f!6M7?#6>g0ZSk`12=3-1m{G!ekO6?^x5JvF7k9ywUx zj%u{Sl(Y7^^IUGUsTLq187z?-QTV$^sJeTfh_rBK6!Ix)cMW|P93TP(+Bb93&bol} za3VMy_zp{Wx~V~s0y)PMJG%xi`g)h&EY@ZMN5Mq8h%lq-25GDG^$vT!3G~KqFy92( zccQS-1Xv>rQA5Ipe@meF5?(Qh4FJfzwr~qsq?t8EuoJ#W@-%{oo|yz(;Jb^CoYZV* zLH@h|mr!!GrnyJxBx(a1zqk$;h^qTA3<@wLsU1*j8%OeHM-1iHdUBCf3V;|E%t)wcZkV` z1ca3(#^Rl4!Rr8ax@Pu#uFc4wF8(AQUg78_1$Amo+uD+l*_N0;648Q8);1PLIl$`4 zum_$A*jZP;Ah#sQf>8hvFMwMctV#l2(hMqUF22bPJz^pB6_inmO}GJuqfWsn*RyIV zfRF7R!W?KG(anGiFpm`(b@Ryu^wyT&&g&R?6Zn3girfqSGUIP{mtsq1z}1sE4#+6N z*uL1r{7GoxFF-!-{Ar#MO8R;#t23^jTt)(vW(wWThXNw>h4lg)c80gEaz)tkFX6=9nFk2V} zD$doY*lWT+i4XH@ku=m4`b*r3Gk9*{P`dLkv(Uub@e2RNh8JP-i;<(8-*(&D?U!|X z&xc;R#~Eypw$U}lw_8l9wCFVM{G04?a-A$l6H{?54PK6Xa!JV{T`^=OdZf_s;FHpO zPco%+c8<+9POAU_#ZuX9U#B!tqS@-`@wH#QITOZwq=xjA)6w@}3Ns`(mnYsYlB~M2 zto~rXWANy>;vC&Gs3uio=Q&L$k>MeiC8>gJFKJmqv?)|~ z-`U}a6@Xq-O>IGed^ zUQJ4BdtnduwiqQi9k)_UWK}?v$%G+ls!tM$As?=@lqN^psD&tmi3pBk6`L^Kq~2|?kzX*&`}ROKLbVqRCbC?=T~GH+z0n^M54E}2U1fA=Bg+H z5tyNDZQ1L|6y5rswm~3MJ)v4;4qU-%ZOZRsdP)TYNue;Ivau{fRps*>^G<|~ArKlU zl?ZTrms|!Imr+Dafv`!FzzI|B;GT@slN*C+Ku@6 zgadhJgoHTa=|P>dcnCl7yZu$(_#~ zK)I~0f*yo<9y1s_rtP)eXU;@BJC1YAI4tn4r0yU-)196KtatzgZ8;iYKM(3O&zDoYOW2epQ)fN9yggF!evu zPaqhz^@%YR{X-(A#2MU0ioXODGTJ2DGeZs>c*tPzrXt%}HJ(V|$z1e+&?)A}{O>Z;SUF2BBy z(&rs7=>C4Dv$w{|vIuft)96&D#;10Y=0#qna~=oap!iKCrN`wQ%}J7tRfBj_2Mj&1 z&mA}f2vx9c$(VfQrCBW^)Dz&C(`{4-bcdhufA^!+rS`W?# z-xtQi%P~Ap+Q0cIC%+E5rh7Xf@)}3nZ*$Mv-AM_PSv_(1Yqz_Rv2?xPjbeI#uQYoH z*82<`KJqOXoPud7((bO!BYp+H6ts6A2Z{U@6@&tQd^6DJ2@RrX(BMTTQNOLHZU+c) zj3D}Fsmk2y<*;FeUnLjvh)|Bd+%zy z9@|{psAiDU4_a*~ytIZ&o=9IhC$~RD$f}Se8C)Uy#W`O@i${|@>1x3W&}yFJ-?4P4 zA1Sr6X2X;w^OuqntQJu~5uOYvWOFi7v#t>AS9E{ZMdPO)r_r9>1GY+~q*fy&6(p|p zT{`P|WQ>1Lw|x*;ox=g@O@47u>^6O|6=G$_%L$*iqKiDh`A8wY2-mD#fsIX;&X%ss z7!=V)w))}A39>bc0Gls2CdO*R!?plgAav04QGnHVxZy(+yFYh*Qs3Z(F=W%OOM1fA zh+b44OHk{niU`_pLl;pPsRY4d+Eb%iJq4&Nq=#aD53T;s0;ItjeQHIbigdFIjIsA$ zR44>Xgk#gf9s6xshl8TEv3fEmzpD_Kw2qh0o0aFFqEbveGW;!=Z%m~|hm&U5Nmd`s zk_G!R@voo{!q^6^?03$cYzO(q))86-@UkqmJI=E^H5usW7-8t^`|x;?xzO>296!YOzLcp^fsd|k+>m55g7)Z2XW#fwFo3A>I?%aW|Y zj-X>SWi&OBfVc@dkGz(OOWU*MnRz$MQN&Bb6SBVJmefkl@lP6E;!~dJA*q|jfO$|8 zu~%j1Ri-5Sn%#&=nr5U4mZ{+{WsB=Z%WkDJ&hrOlax#XLwpMMbJ3ejB1DQta~fUJTpG*RUzZ)I zb3b)LVDo6GTQjcWESOA5eNGx$hfbV8)M07TELs$YZh!>3P^-f?GBgN43n4*H(t?Qq zliZZRr_kF zR^1&qrYq_n4{@gm-yQ*3HmC9J*)6GT*x~(`y+~L5STzhDIGB~`u9JgARs$)F-8y1x zRcVLV;9pNOO^LAePK~%95MRoJ)L^K9PZJ$3^`n<&%^;%;wd1(L9g{ds&zU83n4sn1|gtnGcv^B zra%)~XZ*0-aP_%EX_5dCgupfA+`++vTUPSCTg2Q2HLDnwd1ld-)CFEGgl-g7cwSL&icu;~)6``{xl zx6kuAb-mhpl6_+vZ~+`8xuHe077ay1G&Wo`JrHkBXhk5i3b0rFaS%(SMi>HQFd>O0 zFx+vBR5s|%U${Q*xhaXxV7qJv8`%n`)Eqd8T*MW0z6e+(0vPWIP}I51M|P&AvLRtQ z^oWg&SQ0pt3*HyZU~s|dXdo0PCjP_4usJPfBcqE@8AYNW=FmT|GVQFPHs}{28{l8p zz@9k9J|4n>nBIg2=6Q;|$%a}{z+s*A!#t30ytiN>;5VIVJdxW+1n-H5SuzKHW@&iV z^~#~ITdq76a(N^}&(i@q_1fmiBhA*CR~S0p#u3k?SwcTNg)Ck{m^$>`bGyF!>3D8{ zBevlNh%y1pw|R{wC`AIZIvvnZL$;b52~6kFrJKc_bt;8A3%cg=T@es;x^tc2J<#+@$kpY5Ralw)y#zJ62`%G|!pGCnK0Mk{z2~S6 zuvaGyD_F9508m30i?BfM$&V#D^u0v8_pj*yz0u9$$JOk|LfxQSI$#)8IHn6>AquhB zO&1xuD*ca|scSE+x$i6ZS;3s4RtS4IrJ&un2FwBOHU(fNse*@Zj4%jFu8|=FA=Us? z^PZoAX1#^WU?x!BL`I1S0OJOLM9PRTXm^idB8npE9f zaSUj2Hn&%VmhJBP?ML&f2hcp>(FjIHrh%$FcSruF!K9@1?ZOfU;KK`3+WQ`pfQFKS zX5;HXS@LozYyoY)(mFh9l;W)bySc9~1=uPCsw-}}L1o%ZNq4;~6Zu;jA%>|cyLDd- zM2%|NR1JAnjAp<2Sac$f62iW#YI&`=rLd*_XeL!zhbnWa*jtr`0$dx$lr+05*Hg>H z^Nq>NRLlf6?-Z~YPvy&d)($~c{)ILao9zz-sl1rRe7l1YJg2?RJkaG{Rf1ukNKwCh zuB~IUXd)3)M@2s`sb6#{ZGOc$KCRp@q%r~e&|ATNW?1?>?cgU2`sJKs$pMsPv&HB6 z%OMr5@={b30`%jY6gP?sthlyUpsZ%%QNh&sdz7jZltkzYK~L{Lss)Nbb$ivlPJF$< z7Q1>tZ>CIFT2FNK7Vw+Qlxd5crJ3lIq3A?Rm4sO%mxf^eFfKxe%N0%aknhqQ-F1^c>{Jwfhrfike4e2m}`HCG@it_Dd?Q<1gH`^Rk{D^H+0q zDw*c#jj$rx@!zdN-FcaTScySlbXUcDK}VKS%{7d^LhNwsfhl`r@crF*>CE# z?`}2M=;S=rb6dB1PP(a8Tm#3abup>IOi9c=@i=u)B`1W}5Ag2#G>wKCbCa}N1OmZ1 zedfXCW<76*t&DsAEaOb*ZWEf^y}kfn&Dl2g@P=Z4_gA!RnV%<9f4AXqWc^^Ud7)&4 zC~DgIbZoMp#PDUE2r!(do@-(_js5KiDW zy|~hxQqEPNzzAukHRbt!InwvC*HlN&U%FyhYOarRP8)hXv`6WctA&@`XJ51vUebh^_#hlJ^K5CdzKnZTnPbomLWR2srK5NzEn!0V82z%-9J2!mV`Vole;b&!UnN%gvv4*7~>5puIn zpV*WhXbQbFJLOPg`eW_(uVtlv`Fj0#pF`>!nd|j=yBq1@ZT$qz%Qc6B&8B6+Vr%kZ z8X;)Kxy!ngE6PN>SWoagj=B*KF(KDjP!7})o;cw$Qwiw;$do~rEDp}ZkhS7Ka&L{D?WyoA8rIN+KaBDGc{{xEa!BV`_=4X#Oa806H}s2h zQAa}1^l+;DRF~^gP0GF0`dDQ&P}(FP&CPz3K%tcZ9h|72r_A2+gp_!|Xr=b+L-t37 zwC76;MQ)ZXp{a66pdwFHA%3!<;$uLuid1N^jeEtYcV^SiJ5O$5?7%814?k4go2#t& z@X_Ui%8qPf&4;mY^Pi~bCus_G-iIzai9WP=usJ0S`64|aHa7!178GjwaOrA>WDsiM zz^tPb+{Cum#2D7lct2C#e7Nb-Zdo~j-#b|_r(9?OF3l6lYtJqGd~1(fJV0(^FSdCK&8&rR0I%(q*jtC-B{Y*S7Hx56c*T26x$AEEs0_ZL;)a%L`9Q+l$ScGBN@qF`0gg3zSx+qLaZE5kO^Ywy%7l9FErVH}8uW6&VjEgf+Pt(1o~kKOSOC zQCvKY=|dnz{Q~wLD$;LWV;}^(?jWy?83w`kxM3-hSSUlRIAVN5W)4_7jypj|V2}(S z0thql1m(lrJoJlZxXxhjkwicQz$KhT^Cd~}wdWwV=puCI$u8i_~S zvhy;5C~_KcBG(=d>}p}SPNYc_UKIcsp~0Zt8ySZv%q4_)`9(<$Yv96m#ti}Lsgs$N z;(%xYmWIpAc6Xjt*?0NwdG_yHb(O1OqqXY-bcvj%#6TSA+*;;>66T=+Xxiav>iTO{ zbqeE%7P4g!@^qcvTq2p*?!sTeGBiz~25hJ?PkRL^tnd&Nr9o@tq-pT-f`jS1ha&re zjr_a6>!4piik`jvooU9TrYQ;sZw$y-2&*H*2fh~QlcAu_bAiF&;7NgG3`i90yG}q$ zH*T7fp}Thjf`<@$0EiGk^T(|}x3A#o1{2%DP(N5&%Dd-9FfE-tFl| z7@q2$nJHK7AYV370l@$N)+WJw25jR+sH<`@s zejF_32-*2C7dXMU?-1>9x7Jftq@O%LWfJdR5Pa}f&i3y-VL`D9-!a*gFjo$=TU=xj z^$0!n9_NW?3p5R)5Cw~zAecec0ok0TO!5Q>Y^jj;>5+b3`e z`34bBMa(oT+;k|^sa{2>;NDpUP_X%HA-4uGwJZMf6ELru1YjKm$gN zAR;BJXGD@a`u(0dv=f$xbmV%YkP29>lOmFJ5mo>#7%)PR(so{!aEF~OfJIOgHAk=l z>Tbe;Ulev~RMePZ(&uoo@{Ng=Cl1{H=@AE0%<3nH;_a^^k!A1lXjHz&@n;Sxlum{LTNRjPq~4nQ%%M4q zguD`Za-M#QKwgtLm7)V zcLQ-x4N^B|M+}3|C!eeE%A`HbVf%(c9NjS*Pam-}XP(OQs~xiqaA6f9B?{#hPdoS> z(tq|wwPTl89LP`1JW&-q0vrVMMmig|VEtpnT;7uPM&0!vTD-2D=YA1F|NCBkQLS3^ ziF{}?c}f0aA$0*7l6-O$1Dn?CbysD)f}ve0lH+=)a>igRB?ZVhb#!^0ehGGVs$VH4 zhjTqZwX>V+AilSGNxU1Ibm^KNQA3nkim}2SJ(m5jGj2nmJf2cXWbxF&<3&h9zSV;mkxUu z!9^!bl4*VXFdsKG?m=_EgIU33+A{22^CL0u`+WQD<)^8rF~6&ceIk5w2Isn%Q5cpc zF8CIyBb}8KsCm&?x{wzKZbZfjCzDua!xR&tAN^4~zBE`h1)&Ruh;*zW73TJ;ng<^g z@>*dPY>;5)ojBo2X^=b@00jpO0pp1D!~fJNYIXQoQ8l`<0Sji21-^IerXfvuD(1Lr zA}2XCp>1BgPfi|UWe_CEz{2!{eMO9MV0A79>Wl=6jD2;^$-y3#suQgXo$Hq3kU;`= zN;ohctaW)3YS&pRo=l;MG;`nw6?;U_Pts5tT%2w)P~v)Q`=)PeUeSY@^IKKz&)#)w z7{?z3o#N1CUr+>r>%6@uNvM7E0JxFudr{koNBmR^K}+vk&sOLVSiLR{FK=I-~%eS+gtluQr=*#aX*NcMqb@%<=?qglZB!Lx)cQJrs1}LGVb*y$i}AXT8DkZ zTh;Y1BBy_;a6;YP%j&!e+gD3v_bqrb=O?Ob3R_d|xbM~Vcs1ygrkY{T5S27Zzk1 zLE6DuFGKxXitREx)a1Hb>SF3#em zLKF7(G1H6HTISb z{{JL6h?pjDqM_SD<9x{Lu5o(PLC3&7oPUcG`gI*~_Dz%4uSbGB7xg70vEs93k5m&c?a#S=^5NF~>eqh>yIuN( zdTjmV%cq|?CmwvAdekxKWVDh{)jF;2uzQ3m78JRFnbb|){p^G7BK`jSXVb^KU)=pG zmAa?&j@8TETzZplR@=w#jt(}X=I@VIwD0-hlWL>cCc0MdZ+DU0WHa7&z1>MaC9!hc zW}?qW#XE9iD$-%k`=g-nd++!BJd%1puH5^C*w@;(l;@=Cuhy8Z2{U4K>1 zf5`KP-zwN&=f7$U=#e?$Uk2i!5o_+WC$o99| zbF&S%cmJ+RT`IeaS-)}Be*K2`Nl|@=zn^PQH_ZL}w@m;0XT~A*&h5)PYyQ_3GRH0d zew9dSJ(0S$@;J5O?dRV?2UYkxx6PWKE8YI50(^1hv*i9iG91tj`Ki`_t&~goR9vt=`1F;M zOswkTcYDPhIkFe0Jd?`5pH)Q{RUA7-x>sC*`3!+(O=2EJM1N9Nd@<$KS)RI$Rhm`x z;FbgCD^$$N!a~Z$cPivprhex}_)I9NKKTN?Jf+qffe`xq<&o&NT!5@UlkdQ`Fbb6QSZ zMQUr>I2?Wdz?8mll~`!R2h}J^<&v?Js^(f1Xyr%?t*Oy{Rf3XSE1QZfK`s9AvR$!J z^9LfVVHG>MpG}Lt!Z2#P8=}l$1D|u%)wvG-~YB~e8;rW_h3 zwZ&&dE?25!s^OJt7J4&?jz|@o8JlVB5BC|^do|_IYS?_GYYoZxbTtg5PN>03=T$zv z6b;mi0#(lZqpH7ruI9P(#RBuy_DS{XfhzBCj@9f8=(PG?SB~dSHMF%#LHNdYSrvA? z+80#r(J<|ocTnB0%FkYN$wjT*S942=^EM)8ds97VT1ER}OwdwQ@O2eONm|v#R zE)C!QTvGSyidh}56d8$GJ$vIoo{HP-w~Y%L2S0y9?PzWmMmq{?`S*VFz|<_>i+0kB z{S`xsu+dtYs*X1M;u9Fl+ti4aJxDwsm=op{7Mzx3h5WFzg>v$bC;Y7S+6|KR(@Gri{QBcY*LCKq*c-z$IFOk?*drlgk?U$39ry}!8i$I}pB-#S2<>_AEHkD-5z zjm&O{^Z+?~LlFVY4`kSqSzFY^fLV9>gGw{Sif{HVbjb3wvlUMM9L(Y&pfNnzU zgWM3T!Sz*W;We>`ZrDr#ZPRrr3+@O$_yo7lL3Eh)@sQ`oK8G>K_UjN^-q6Dp{d*XQ z-OSC09T3|b&-;#gJUj2MtVHbq+EHZ1s|^4sn&{X_$6E_~bUXD{IuDdW_8@vo=k)iW zosZ8gIGhLX!7kc}x)0?oI#e$@G}G|bxX;ly@C>~Hqnk2HI9)^|e!}2NH&|VNw8Ef|#d}p*hgzFx_!)hVxyC-T zn0_ti0oc@lS~qv6&yH;PdBi1JCma8<=SgD^v!AA0M|gJpFs2%^C#g?mZed6nG9&DG zAJeag0Dr(3cu3z|bs4V6<6psVC)J-W;-U;aEP5TbfrEkbMjMV;B>ccOeb+Y7j(lrZ zG9-vgfBxC!Yo)V6=MYwrp+_0AvgkcMV>Ec#^VEaG-jie7$qn~2>!h{?qV0U0;=G6T zuThe*NBpnx7RaAGS>KSsPc{7u#~pP{;C+gH7{sCm;mP|}r;#ofgUKa#Koj2JFrLtB z;|$YlKY}mqb*LjOP5)%(B>vU;rR+2D$Lgr&&#+Y=N{c$j27uQ3=*1RFNqK03sVMzAl0+b3O*NA08 zg>&7#%x4CVd%=&>7wx!xJs8O29s0xYB|v$etpy(pw|B_j_dM^2;cc0;gSz9FIrziGM}ugN$)hi5E%mm z+XWcC>UQ%A8i63;o^ryg-JO$ZyW;7)lKUKN^W3+eIazcgl39TvaGj|F4O25cB?_n$ ziGNq@$?pGE>11F*7HGG~2xbOGGKOf7H?!FV&2H`aJqr!mh z1gc7v;MW6^4)#2Zrpi5INKz)*43D+(lOj!-AnE|lz7glNU2PyXY<|w{xOL+ z6tyx-A?nj3XOGLDn8)4dC-Ui5UaRh2-CIbQ#Ht{?^4dv51pnr$Pndbdd2o1llW&ld zCHmCu0Joj7ZXh7t+Xbgq0nl|A6S8Aq?!305dLlXA5GIPTCX3PjKWKZ?aHs?S?|1gi z;5(KvmYA{cJ4s?@jIGGNBxx+!qC|^I%#3YFH6&@%SduLv6(x-=DoT=6(u{pel1h>} z^SjUgoOA!rb)RSFem>Vcn(OoZ&gcF9yk4}&V{>O_8ACiORmonB+$rbWjRr~VzTFOp z2;;pBsb&WtIbVzm@_C6oChlYaN~0**KlZXjYg1fWy9q%&vDlYl^e(aMJbSk2Mg@!p zep~$M*|O+Jtpt7K_W!PX<+A!~M=nZyLv*Ro|5NGyvj8{0Pbb7dfNqORQ5T!ZW?+;| zUD>;-=FlG7w47C5S|?JpS-~`eu9m-HmkDJ)T4g}gPv&c-=PS}K&a67=x8&>b;zte! zsi&#)^@#x%$*sI1D+B(&HK9us4?$P45MI{qCk#oTC2a(T?&_#t{A$+>cY;x{ zT;87A42eFFaE*c5;E2XcBYBw{^TC!4qKYU~*PuqCusxi9|7bd725F`xjH zv|-=70hO?!`3db&HBRc+juSNBVNZ9q53ktep7m~Rp+t4qr6;Lq(9mmH=Fw;uZr*yq za}=AG%O<0-HK{GI_qR-{`gkRc9SU;K>%Iv(`XpUaiLBPEr%pep6`Lgq zFrk(01~iCj`HzxPo=h)Qp6}&zLuO}_x8xcbSd1kLTVD(9MZbbK{#m%nyd!-bCL@o^ z3VE;XXofThDF`f8-WPIg08XTI|82$5v3lxENh?N_Im7Qvj^D#B%NCX%k*ZPOX|TpD zOQBi2fj}3UUn}WG5^-a9+x1;3Z;aYy>OtaGJSlS?I_ZHVae#5I$O1Q{5YN(Yw%DHB z`BHr$o-Sk>z(5+aOvo}w$`w?-X|D!AK*|4(%084uUTVzD#q(EOav?5CF9y`8)C~s8 z#9g`pp^QGzd9< zT`oed!B@C>i`u+=6Q3>tz43>Y9dZSYHBrT`T=-}gCDgW{M&0V7x|Zl0jKUF=ihvRY zM&5xrQRDH>=9__%uuRGH8;E-TJ)rj~!7?_yi_IT!IxMvQXZG{(fSrn^X8F1)U%3Cu z4q7;AHFMz$Y>P!qv&RB8dT*vP?wPSd8Nxms6=zUB(@(h|FRUHSXLUtrS=Z#EHcl|b zJB@_en>Cq!tIemReJT z>Pam>H@EG|NWC6VDTSp39fm1-@SLS8W9_3@M(jL?*3{(eaMGUZTxQ|6LSe67*Or6M zhs86kJ*QLxH_;TNiUiqNCYrr=I}hZj-Cj}Nit1*hhPpW5_sR5PNdYMy;{_gde~6*!$TOP<*QY8n6I zqNw{oaenPl**LF)H{H0+OhxS>$)^WpkE^KZUl(M^nV*&Eat>qr);-`?t=>Ffcr_$F z^;FBP2WY=PA~!WR?|bf^)&Nv)D&2%E=I5d4P^FNc^Mjfzx~|vUDJY2q;x=1m#8)Gp z2 z(`7K8Puh#3hf9#&@_a65$dvxRDIZTimg#5E>i0wr_&C{_DiJ!%*{80f@jR8*TY72l z5=UPuZVAPg(O>K=Ascn%`-!e;L&2{>Kxo8e#)&@T77gt^sO-vy2+{8_1ndTR5mYNRbS)OOO2he}>1CJq;Cxw~5!@02z+SXA@&O1d|Mg=|# zq5n7XOO|m5PP*W)ju{-}4NLe`Yf zjeuB1Nhqi&lzrwXr#Q9Wo&M`jr(r#_DLs5b@f5>Jmt2y`w;+qjlyxb2fHT8!;-G?F zNoo{en%B=rh|k&U_%RI^^{-4O=}(s7i-AlPH_!>;h%8|xL7Y_jO!nn^)&P~k(OHfs zbvbv~L6~_)8+;X`N>Zli*Is=LB3;ycb+kSrO_~_KWl=*Hz-jIi4P&`~x$QXlDNt~Mds;Dzu2T2^Y zlMtY46utIFKR%&5V}u9SJoq}Znj)FbUQl6;bP?94pmchOPvM-sR?do~FHjQapx~ul ze6d8?m5+VA{EQR|$X7C>PGG^i6WQ9(^ic@OYXol4b&=&2{{wPtk8BNA{&K?SERw|D zUh~G^6)}CGHVUy05Z~{loi+wy!e)dayJODc%#@r-lfm&?sB$~m+2HEiGy?62 zoH&GIEZynG+MFP`6tN6KahYfsSSygY%fR(MNBurh=U596G&r#>K3jscN_Wygf!Wd5 zNlDy$3eO!n`z30#u;0W`?FSad6EtF85;TJ zoD?aDRf;rIuD2A{x-k>uEY_|Zyk=5+DJu7XO_(*MJWYD`9H~8^M|Qmtl8y}_?T_jV za}<4xHW=S#50QxA>$X1X4&hPQv^|`3y~+fVT3EY`u*4@_e@VqVw>E;H0g(^V68pH0 z{OrTQUyhjFuK|&>iMh`?oKArqZluoQ2i?_k&my)A_A9kB(q7HdAv>e&uQV-Z9>akR z^80%otM@!fHO7)mK>><&4u+$)w}P*4R}!I)v@e5&4VgL{bTuK73JiH< zhBxpr=a|Y*l34)J<{8G52VR}dFDY!i?IgCR@|;{_?r3_#UZE9Ju5JyEbS-g}TkDa} zFhnzc|+o!uiE+`RE{RFp=g7p_#T<^1ySPk_|JAtXhfWC1j&?5 z#XAB_?Ep%sGl&{~cozT2iZ z-^5Ilj(zSw$w)W96;v_^R?x7uz;Waqw&*liVU?d}YuwcJpJ*eU_r{9I?5blGf71bJz)~+Zn{@WbqoA?J<`QFEw}}_2NP3QzB&`UvvvS`?kX4I9N&h;d9vw zfxAw!AThnBYRdsms=G=U#4fIxqXf0~Twj`ksI04!(bAw^|Mtm|JsR_Du!~ zdJ!a4lDDO#RX-kf)DsbTod>3QT#a=x*d6)ij~)9)OJ>VGuh!4#z4(bV>Z$j-wgZ2u z!2{)(vWtt4JR8MN4WucIT_a6M$UP(sUdA{y=v#6qz^Qs&6#^JJM*;tN`8xV&X~Qjx zLt5h(M6aU`MA-R<;JMTFxSMNyZEjkOjC#zKz97j*NjXNdgWHv9ex~Stfmk4=gS=Y)oTb)X3D-&DA-L6N zuj|u()xKWZxokSFs-$n~BhU$_VAiR~*iuVf9e6UY*UzX4fIQ7=zTdA)!|3AKwGCD9+vi$sWYk=VqKH*s<#Pb>K=dz+UQQ*#lF4udIy{I7t7Amu zqJN)vCCLz3GzN^o8XtzjW74EdZ+o>dujO2TJCfapi0}Y1IJj02Ohj7>N;r4VdQ`v) z>3}BvS1Iv4z7v6QfwB03jTzfE1%}4(@3HNY>s(9Q1AAjdIzJYoF^lx7jK%`Z7#?y0 zRUneNvWrtHn_ci09l|8^gepTaxLP*$#O&MKDo76LUE_;s=8$7 zj7mi2J$$H^St-1Tk}S;SGD;b+e2r*BKK51Rqoa2+chl9V0%_d2EU1-Az%l{dy> z6}X*j9{3}lU|i~=zzBBatG?hv0&e~Lc-J7tSsh!ATb-6%?;d4$#qD;es^em9>!c-E zNRbq7R>QZ>?a)A}SqG0`Es%C?zcKENaIAo}aiwEO(G|0hI!!c{E`CVh6wb%Ag6IWc z5{F^zRecYLzjP??AQdd#%G@&B&IR~+hT}5C{D^hhR~FaAu?*ZnHXDA8*CZMcRMBII z&r~k90`#HLc!x;&B~x~gkSVPzz*my6re+RN`6LG8FTjefqvH?sVGe)uJ?eJWc$_f8 zml1M8q!)W_S0I+3^CI$j=r%66PP<57$4mVnYsd>crIouGf<{fLpu%)Nb--gtdDSJm zHyNIFJlk+OOk}9wkmY}pok|m7D1jnh1J351t<_L7JZxs|`p^m-O{I{mU1dPvrdq%ib6UCgDTm!F7+X3 zDJ&LeViKByb^l$BCMf{109D?YiHIS8rDn;3$jDPs`1LBzCI!!qg4gn7tihnwt`Za- zhytr*944ItfoF+lO{s;j(%njQwUI>?*C{tG5I&ZoxJ<;ZCrB8UA|~H)f_X^toXT`$M@h=}^x5WWJ87sN z>DDhiOMz0$SB&UqP!yIgxj}TFt8h_od>l^p8%F!suR1j?NaR$5976D?1U_vcQjG%1 zQXUr%*=LiB!tgK!A|F>fs!m;MHyr|m;QU@I3av`yVWcF8*Yn9saKHLdK0KC1KR>H; zxITT)gER^CcVaShj4H);h%2i!uA)ymbd!YkB8tVKva};z^`=CkDZ+4wVaWy3FCG#x zSK0^y6B7tt0zx=#t<@*eS6b7Fm(8j_wP6NH;=|1WQYleiy`8=Z_BQ1C@F!GO^L>)I z;8vn6LJ(PVC{xPVD<&#vi>8!5G}YBjUL``dI@{Tqj{bwN7-Zlf4Rm<0^H|uvzK} zimWYW1yG>Kj)X+Gg-F`Mq=kk&EhVyTvyt^S(W`AZhFvbJiw+O`s#|*?6I*4r8w6*8 zI=d{QI~yX#7D5#zFZ^sSXIxp|xXo z2v&)Ti5J*h2Nf)PRwZYlEPtqs6`&;e;@a(CB@x480zX2hMmax+`I}jWE6i6gS#aG@2+H}$=M~7prvJH z#9OLEJHuLF{fZI1Rge)x(w<{U+{fGcX#!XbVfvWvFaE`M2p<|hE~W&DX*^(wAT{=) ztj{464q*guIP)EF1z?pC;1C14lD(!c&gc{opiaO6X`h_te=j+}(= z6pH}M&96r1^2HOM$YgJMDKC)in!Fl|m%Yt1?GzuR5F*KfH1#TwgqmH| zyBO9H?TpM572jj_H1ARbnAV%^U{yN&1~bCAz0syi*OjTTC^D$hIpG4X|MQao$KZMb zi6c*kz+ZvJywm56*~*L?;r0lQ+k)?Dpzx)CmIioNI-&Bc-r;sXlU8i}sR$ znvxF$qtzc6;UGchP50@1{53FMIu()9j6jZr1~HoryE;SIei%dEfK^6t1s%;fhHlb9 zmomId$(W_S=b;Wa(i5M4%w7mBF$yOemHk#}6d8San0yd=Cs$oKrum2KgvcjCj#EK5 zotvb-t1!5`_HpOA>nfJvJ$Q%}w)gL&U4~vfQ~*S`0A$N1HdK(orJ$x<*UN7f#W=)| zfzgdpXi~-6+{(3NWOV{Q6tZ5WJyH{s-6W^P*!BhaOdx^I1)*FW3_3K$uG0 z$)Oj9mt!(FA=A!u(QYWgtq4FiQw}Hwa1mjIup|q4MAl_F65l zwA9NgfY&#q=44n-&r@P-G;f>*LQ4K5Y1M@m3GaxIynkUd##ie{`nFePZADL@5CVfl zSSls$Cqh8g#M!zXY(g<70&EJs7+Nt^=@cHK>4R={!0;fd2m=vjA{ds3-xFfmAqvB!w8Pe*~ zP=tbsMYBO2U%pTcI=}=tl)Hy3YslkiUoql(v$Ao zGJAFan5VAS-J(^NjGYn4&pweC=2Rg*9)!_A2VA|P_?oZxOu>En*I3Zc48Li5EX>NG zE;q_I=z!WVSM+ISTFKZJjJ#u~erUflNE3JV5QIjC$MQ5oxtBzJ&Z*lp4w#V3lus9^ zFu;W55JE9i0Yyrvj)$)d!9!mmCPC=HHz+U2kdI+x9Is>Y(%zHiv{%%pp7e8sq^Ap1 zumTUf=o~t`r2SEEbWp7$&yvORLt5?Dk)cB-sj49uot#SVq zcir2j)*!9803PqKgBwNkt^IzTNmVgRCKfbwAUox40L_h_FocAnwTR$~GM#*?plXYW zC3bW_C72wYLq7 z{O;C=z9y$qtM9nqvmaYsYL0Gu=X62dGN_d<|4wyfs_*pn-y>?)9m*y$x?Qmxi|)DH zYiX17)LXBs&~fHXyINa+-r~rwYZIj6dq2FMIB_8lSJ88gak!)Iru-S9^D6bEFkLG@ z*rY&XZ}&y3_26xra_PGdoufu z4H}-NyN_Se6!>Ab$aEgDv{Luvyt!|s=Ak`Vu{ZC2Mi$?}RhQuFVAHx*n*ZwS&q8td zX2Fep^%RFGrw!7Odff4b%z;ywmZmUA?ux;kBh zUiw!oJH>1#eafm5Nk=E`ngtPhmF}h=4%Vv}$f-pbDV^1qcoEuLRo{TCuDthTM|57} zi=8#$w{|>vAtW|MX43>sPtT-#0(@v!e(DV_DWhjfp<)hY8-EFb}M`_Uyy)J6l1xA*?z@7NjT?*%>6d zdxnXDKq%jH$KKwj>^OGVD6Q-MaHze(uf&kc=Z=3QC%QfOI2amt-y!}q?8H0&_h){O zCPY4Y`1wrFjjdmf_3W_voQyow{Dt{<-HJ-<)@CjxjtRYI&!wd_&*nWHJGof@`23^!icfV`Umr~vuFXAu`0DYe*BL2Wom=FD zZ@w2Oez9K3G?P5Da8ghmueKuHL=y^v_CcbEyQ-S>kK#e=DOBucj4 zgle!U(3QK)r}v03vtCKY&6Yqecs=`Mp< zKoUDyM3r0rmcFBWOmcsey-J72sTb1ErSfKJN=rZv>Et+YD@oL~ZO92IFL6Jb)TM|2 zo*Yu}g&-T%EjEZal1`RURcPpaV&(^&*TxF)dD=bZDe>nVht!Z?l6sUh-<-VyR>S=n zp;$ljI7hu+O8imjtf@N4Ihr1>_Oi%%dt+YC<<&3^wdXD-EYq`bM@9T#wzE^UR4QY% zTv+}7g$E)&w`P^7KSSuqxeFz#L?A#GPiWLAGIC4HeY*N z5&3-g>FFQEoS@q_^3k^#|C0-V2$BYALtOvM1+bB|u-{-WR9ZKvx4xt^3sBp6-MOK( z`z*mMCYc>S(Vd2fd$%&;QT{wl+r8TLdBUxig~t0|`@wPih?q;6S zf4Kl6TAkeKZ&O#7wjI#@UgdS$|GzNL#}-EZiJ1d^Pxl1Bt={+Yc-ctC0^j$*!zIC9 zX2SQte@^U>Ɍ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 From 6000f051c163cb9581c51732338e5918d5ee7ac8 Mon Sep 17 00:00:00 2001 From: Tearran Date: Sat, 22 Jun 2024 21:03:05 -0700 Subject: [PATCH 2/8] fixed typo and updated docs --- README.md | 3 +++ lib/armbian-configng/config.ng.jobs.json | 2 +- share/doc/armbian-configng/Command.md | 1 + share/doc/armbian-configng/Functions.md | 1 + share/doc/armbian-configng/Home.md | 3 +++ share/doc/armbian-configng/Menu.md | 12 ++++++++++++ 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c1d734c7..8637eca5 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ Utility for configuring your board, divided into four main sections: - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n02) - **N03** - Description: Toggle system IPv6/IPv4 internet protical - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n03) + - **N04** - Description: (WIP) Setup Hotspot/Access point + - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#n04) - ## **Localisation** @@ -125,6 +127,7 @@ Usage: armbian-configng [option] [arguments] --cli N01 - Advanced Edit /etc/network/interface --cli N02 - Disconect and forget all wifi connections (Advanced) --cli N03 - Toggle system IPv6/IPv4 internet protical + --cli N04 - (WIP) Setup Hotspot/Access point --cli L00 - Change Globla timezone (WIP) --cli L01 - Change Locales reconfigure the language and charitorset --cli L02 - Change Keyboard layout diff --git a/lib/armbian-configng/config.ng.jobs.json b/lib/armbian-configng/config.ng.jobs.json index 9a3a227d..aa63efa5 100644 --- a/lib/armbian-configng/config.ng.jobs.json +++ b/lib/armbian-configng/config.ng.jobs.json @@ -193,7 +193,7 @@ }, { "id": "N04", - "description": "(WIP) Setup Hotspot?Access point", + "description": "(WIP) Setup Hotspot/Access point", "command": [ "get_user_continue \"This operation will install necessary software and add configuration files.\nDo you wish to continue?\" process_input", "hotspot_setup" diff --git a/share/doc/armbian-configng/Command.md b/share/doc/armbian-configng/Command.md index 6936ad29..2a11d2e0 100644 --- a/share/doc/armbian-configng/Command.md +++ b/share/doc/armbian-configng/Command.md @@ -27,6 +27,7 @@ Usage: armbian-configng [option] [arguments] --cli N01 - Advanced Edit /etc/network/interface --cli N02 - Disconect and forget all wifi connections (Advanced) --cli N03 - Toggle system IPv6/IPv4 internet protical + --cli N04 - (WIP) Setup Hotspot/Access point --cli L00 - Change Globla timezone (WIP) --cli L01 - Change Locales reconfigure the language and charitorset --cli L02 - Change Keyboard layout diff --git a/share/doc/armbian-configng/Functions.md b/share/doc/armbian-configng/Functions.md index 10c1f0eb..1e0be98b 100644 --- a/share/doc/armbian-configng/Functions.md +++ b/share/doc/armbian-configng/Functions.md @@ -28,6 +28,7 @@ A list of the heper function ie bash prosedures used in Jobs file. | see_jq_menu_list | Generate a markdown list json objects using jq. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L304) | X | review | | generate_jobs_from_json | Generate jobs from JSON file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L253) | X | review | | Headers_install | Install kernel headers | https://github.com/Tearran | [Source](https://github.com/armbian/config/blob/master/debian-config-jobs#L160) | [Document](https://github.com/armbian/config/wiki#System) | Review | +| hotspot_setup | Set up a WiFi hotspot on the device | Joey Turner | X | X | source link Needed | | toggle_ipv6 | Toggle IPv6 on or off | Joey Turner | X | X | source link Needed | | see_cli_list | Generate a Help message for cli commands. | Tearran | X | X | source link Needed | | generate_json | Generate JSON-like object file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L174) | X | review | diff --git a/share/doc/armbian-configng/Home.md b/share/doc/armbian-configng/Home.md index c1d734c7..8637eca5 100644 --- a/share/doc/armbian-configng/Home.md +++ b/share/doc/armbian-configng/Home.md @@ -40,6 +40,8 @@ Utility for configuring your board, divided into four main sections: - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n02) - **N03** - Description: Toggle system IPv6/IPv4 internet protical - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n03) + - **N04** - Description: (WIP) Setup Hotspot/Access point + - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#n04) - ## **Localisation** @@ -125,6 +127,7 @@ Usage: armbian-configng [option] [arguments] --cli N01 - Advanced Edit /etc/network/interface --cli N02 - Disconect and forget all wifi connections (Advanced) --cli N03 - Toggle system IPv6/IPv4 internet protical + --cli N04 - (WIP) Setup Hotspot/Access point --cli L00 - Change Globla timezone (WIP) --cli L01 - Change Locales reconfigure the language and charitorset --cli L02 - Change Keyboard layout diff --git a/share/doc/armbian-configng/Menu.md b/share/doc/armbian-configng/Menu.md index 1e50aaa7..08b1b9fb 100644 --- a/share/doc/armbian-configng/Menu.md +++ b/share/doc/armbian-configng/Menu.md @@ -160,6 +160,18 @@ Would you like to contiue?" process_input toggle_ipv6 | show_infobox ~~~ +### N04 + +(WIP) Setup Hotspot/Access point + +Jobs: + +~~~ +get_user_continue "This operation will install necessary software and add configuration files. +Do you wish to continue?" process_input +hotspot_setup +~~~ + ### L00 Change Globla timezone (WIP) From 9cfc0014ce4cebd507a113e5814afbe3c68c7a6a Mon Sep 17 00:00:00 2001 From: Tearran Date: Mon, 24 Jun 2024 11:46:08 -0700 Subject: [PATCH 3/8] - Added a new function to streamline switch management, improving code readability and ease of making future modifications. --- lib/armbian-configng/config.ng.docs.sh | 10 +- lib/armbian-configng/config.ng.runtime.sh | 122 ++++-- lib/armbian-configng/documents.sh | 388 ------------------ lib/armbian-configng/functions.sh | 145 ------- ...=> User-Guide_Armbian-ConfigNG-Command.md} | 0 ... User-Guide_Armbian-ConfigNG-Functions.md} | 3 + ...md => User-Guide_Armbian-ConfigNG-Menu.md} | 0 ...Home.md => User-Guide_Armbian-ConfigNG.md} | 0 8 files changed, 93 insertions(+), 575 deletions(-) delete mode 100644 lib/armbian-configng/documents.sh delete mode 100644 lib/armbian-configng/functions.sh rename share/doc/armbian-configng/{Command.md => User-Guide_Armbian-ConfigNG-Command.md} (100%) rename share/doc/armbian-configng/{Functions.md => User-Guide_Armbian-ConfigNG-Functions.md} (94%) rename share/doc/armbian-configng/{Menu.md => User-Guide_Armbian-ConfigNG-Menu.md} (100%) rename share/doc/armbian-configng/{Home.md => User-Guide_Armbian-ConfigNG.md} (100%) diff --git a/lib/armbian-configng/config.ng.docs.sh b/lib/armbian-configng/config.ng.docs.sh index 96fa4d2c..ce761b97 100644 --- a/lib/armbian-configng/config.ng.docs.sh +++ b/lib/armbian-configng/config.ng.docs.sh @@ -32,13 +32,13 @@ echo "Updating Readme.md" # current_date ###################################### -cp "$script_dir/../README.md" "$doc_dir/Home.md" +cp "$script_dir/../README.md" "$doc_dir/User-Guide_Armbian-ConfigNG.md" echo "README.md has been updated." # current_date ###################################### echo "Updating WIKI Functions" # current_date -cat << EOF > "$doc_dir/Functions.md" +cat << EOF > "$doc_dir/User-Guide_Armbian-ConfigNG-Functions.md" # Helper functions A list of the heper function ie bash prosedures used in Jobs file. @@ -50,7 +50,7 @@ EOF ###################################### echo "Updating WIKI HowTo" # current_date -cat << EOF > "$doc_dir/Menu.md" +cat << EOF > "$doc_dir/User-Guide_Armbian-ConfigNG-Menu.md" # Menu list. armbian-config jobs list. @@ -62,7 +62,7 @@ EOF ###################################### echo "Updating WIKI Command line options" # current_date -cat << EOF > "$doc_dir/Command.md" +cat << EOF > "$doc_dir/User-Guide_Armbian-ConfigNG-Command.md" ## CLI options Command ine options. @@ -93,7 +93,7 @@ EOF module_options+=( ["serve_doc,author"]="Tearran" - ["serve_doc,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L106" + ["serve_doc,ref_link"]="#L106" ["serve_doc,feature"]="serve_doc" ["serve_doc,desc"]="Serve the edit and debug server." ["serve_doc,example"]="serve_doc" diff --git a/lib/armbian-configng/config.ng.runtime.sh b/lib/armbian-configng/config.ng.runtime.sh index 6e334f08..2ddb3b37 100644 --- a/lib/armbian-configng/config.ng.runtime.sh +++ b/lib/armbian-configng/config.ng.runtime.sh @@ -7,54 +7,102 @@ set_colors 2 # Set the color to green -# Main menu items -system="$(uname -m)" -network="$(echo "$DEFAULT_ADAPTER")" -localisation="$LANG" -software="$(see_current_apt)" +# Dynamically updates a JSON menu structure based on system checks. +# Initialize variables +system_info="$(uname -m)" +network_adapter="$DEFAULT_ADAPTER" +locale_setting="$LANG" +installed_software="$(see_current_apt)" +bluetooth_status=$(dpkg -s bluetooth &> /dev/null && echo true || echo false) +bluez_status=$(dpkg -s bluez &> /dev/null && echo true || echo false) +bluez_tools_status=$(dpkg -s bluez-tools &> /dev/null && echo true || echo false) -# Sub menu items -bluetooth_installed=$(dpkg -s bluetooth &> /dev/null && echo true || echo false) -bluez_installed=$(dpkg -s bluez &> /dev/null && echo true || echo false) -bluez_tools_installed=$(dpkg -s bluez-tools &> /dev/null && echo true || echo false) -#check_hold=$(apt-mark showhold) +module_options+=( + ["update_json_data,author"]="Joey Turner" + ["update_json_data,ref_link"]="" + ["update_json_data,feature"]="update_json_data" + ["update_json_data,desc"]="Update JSON data with system information" + ["update_json_data,example"]="update_json_data" + ["update_json_data,status"]="review" + ["update_json_data,doc_link"]="" + +) +# +# Update JSON data with system information +update_json_data() { + json_data=$(echo "$json_data" | jq --arg key "$1" --arg value "$2" \ + '(.menu[] | select(.id == $key).description) += " (" + $value + ")"') +} -# Append Items to menu descriptions -json_data=$(echo "$json_data" | jq --arg str "$system" '(.menu[] | select(.id == "System" ) .description) += " (" + $str + ")"') -json_data=$(echo "$json_data" | jq --arg str "$network" '(.menu[] | select(.id == "Network" ) .description) += " (" + $str + ")"') -json_data=$(echo "$json_data" | jq --arg str "$localisation" '(.menu[] | select(.id == "Localisation" ) .description) += " (" + $str + ")"') -json_data=$(echo "$json_data" | jq --arg str "$software" '(.menu[] | select(.id == "Software" ) .description) += " (" + $str + ")"') +module_options+=( + ["update_submenu_data,author"]="Joey Turner" + ["update_submenu_data,ref_link"]="" + ["update_submenu_data,feature"]="update_submenu_data" + ["update_submenu_data,desc"]="Update submenu descriptions based on conditions" + ["update_submenu_data,example"]="update_submenu_data" + ["update_submenu_data,status"]="review" + ["update_submenu_data,doc_link"]="" +) # -# Append Items to Sub menu descriptions -json_data=$(echo "$json_data" | jq --arg str "$network" '(.menu[] | select(.id=="Testing").sub[] | select(.id == "T2").description) += " (" + $str + ")"') -json_data=$(echo "$json_data" | jq --arg str "$software" '(.menu[] | select(.id=="Testing").sub[] | select(.id == "T1").description) += " (" + $str + ")"') -json_data=$(echo "$json_data" | jq --arg str "$software" '(.menu[] | select(.id=="Install").sub[] | select(.id == "I0").description) += " (" + $str + ")"') +# Update submenu descriptions based on conditions +update_submenu_data() { + json_data=$(echo "$json_data" | jq --arg key "$1" --arg subkey "$2" --arg value "$3" \ + '(.menu[] | select(.id==$key).sub[] | select(.id == $subkey).description) += " (" + $value + ")"') +} -# Show or hide Sub menu items dynamicly -if [ "$network" = "IPv6" ]; then - # If IPv6 is being used, do something - json_data=$(echo "$json_data" | jq --arg str "IPV6" '(.menu[] | select(.id=="Network").sub[] | select(.id == "N03").description) += " (" + $str + ")"') -else - # If IPv4 is being used or the domain is unreachable, do something else - json_data=$(echo "$json_data" | jq --arg str "IPV4" '(.menu[] | select(.id=="Network").sub[] | select(.id == "N03").description) += " (" + $str + ")"') -fi +module_options+=( + ["toggle_menu_item,author"]="Joey Turner" + ["toggle_menu_item,ref_link"]="" + ["toggle_menu_item,feature"]="toggle_menu_item" + ["toggle_menu_item,desc"]="Show or hide menu items based on conditions" + ["toggle_menu_item,example"]="toggle_menu_item" + ["toggle_menu_item,status"]="review" + ["toggle_menu_item,doc_link"]="" +) +# +# Show or hide menu items based on conditions +toggle_menu_item() { + json_data=$(echo "$json_data" | jq --arg key "$1" --arg subkey "$2" --arg show "$3" \ + '(.menu[] | select(.id==$key).sub[] | select(.id == $subkey).show) |= ($show | test("true"))') +} + + +# Main menu updates +update_json_data "System" "$system_info" +update_json_data "Network" "$network_adapter" +update_json_data "Localisation" "$locale_setting" +update_json_data "Software" "$installed_software" + -if [ "$bluetooth_installed" = false ] || [ "$bluez_installed" = false ] || [ "$bluez_tools_installed" = false ]; then - json_data=$(echo "$json_data" | jq '(.menu[] | select(.id=="Network").sub[] | select(.id == "BT0").show) |= true') - json_data=$(echo "$json_data" | jq '(.menu[] | select(.id=="Network").sub[] | select(.id == "BT3").show) |= false') +# Submenu updates based on network and software +update_submenu_data "Testing" "T2" "$network_adapter" +update_submenu_data "Testing" "T1" "$installed_software" +update_submenu_data "Install" "I0" "$installed_software" + + +# Conditional submenu updates based on network type +if [ "$network_adapter" = "IPv6" ]; then + update_submenu_data "Network" "N03" "IPV6" else - json_data=$(echo "$json_data" | jq '(.menu[] | select(.id=="Network").sub[] | select(.id == "BT1").show) |= true') - json_data=$(echo "$json_data" | jq '(.menu[] | select(.id=="Network").sub[] | select(.id == "BT3").show) |= true') + update_submenu_data "Network" "N03" "IPV4" fi -# Show or hide Sub menu items dynamicly -# - -[[ -n "$check_hold" ]] && json_data=$(echo "$json_data" | jq '(.menu[] | select(.id=="System").sub[] | select(.id == "S03").show) |= true') -[[ -z "$check_hold" ]] && json_data=$(echo "$json_data" | jq '(.menu[] | select(.id=="System").sub[] | select(.id == "S04").show) |= true') +# Bluetooth menu item visibility +if [ "$bluetooth_status" = false ] || [ "$bluez_status" = false ] || [ "$bluez_tools_status" = false ]; then + toggle_menu_item "Network" "BT0" "true" + toggle_menu_item "Network" "BT3" "false" +else + toggle_menu_item "Network" "BT1" "true" + toggle_menu_item "Network" "BT3" "true" +fi +if [ "$system_info" ]; then + toggle_menu_item "System" "S01" "true" +else + toggle_menu_item "System" "S01" "false" +fi diff --git a/lib/armbian-configng/documents.sh b/lib/armbian-configng/documents.sh deleted file mode 100644 index 8a319822..00000000 --- a/lib/armbian-configng/documents.sh +++ /dev/null @@ -1,388 +0,0 @@ -# This function is used to generate a simple JSON file containing all functions and their descriptions. -# pthon is more suited to complex arrays this should be handeled during build time -generate_json() { - json_objects=() - for key in "${!functions[@]}"; do - if [[ $key == *",function_name"* ]]; then - function_key="${key%,function_name}" - function_name="${functions[$key]}" - group_name="${functions["$function_key,group_name"]}" - description="${functions["$function_key,description"]}" - options="${functions["$function_key,options"]}" - category="${functions["$function_key,category"]}" - category_description="${functions["$function_key,category_description"]}" - json_objects+=("{ \"Function Name\": \"$function_name\", \"Group Name\": \"$group_name\", \"Description\": \"$description\", \"Options\": \"$options\", \"Category\": \"$category\", \"Category Description\": \"$category_description\" }") - fi - done - IFS=',' - echo "[${json_objects[*]}]" | jq -} - -# This function is used to generate a armbian CPU logo -generate_svg(){ - -cat << EOF - - - - - -EOF -} - -# This function is used to generate a CSV file containing all functions and their descriptions. -generate_csv() { - echo "Function Name,Group Name,Description,Options,Category,Category Description" - for key in "${!functions[@]}"; do - if [[ $key == *",function_name"* ]]; then - function_key="${key%,function_name}" - function_name="${functions[$key]}" - group_name="${functions["$function_key,group_name"]}" - description="${functions["$function_key,description"]}" - options="${functions["$function_key,options"]}" - category="${functions["$function_key,category"]}" - category_description="${functions["$function_key,category_description"]}" - echo "$function_name,$group_name,$description,$options,$category,$category_description" - fi - done -} - -generate_csv_test() { - for category in "${categories[@]}"; do - echo "Function Name,Group Name,Description,Options,Category,Category Description" > "$category.csv" - for key in "${!functions[@]}"; do - if [[ $key == *",function_name"* ]]; then - function_key="${key%,function_name}" - function_name="${functions[$key]}" - group_name="${functions["$function_key,group_name"]}" - description="${functions["$function_key,description"]}" - options="${functions["$function_key,options"]}" - category="${functions["$function_key,category"]}" - category_description="${functions["$function_key,category_description"]}" - if [[ $category == "$category" ]]; then - echo "$function_name,$group_name,$description,$options,$category,$category_description" >> "$category.csv" - fi - fi - done - done -} - -# This function is used to generate a Single page app. -generate_html5() { - -html5_content=' - - - - - Armbian '$(echo "$filename")' - - - -
-

'$(echo "$filename")'

-
- -
-
- -
-
- - - - - -' - -echo "$html5_content" ; - -} - -# This function is used to generate tabe html file -# used to check proper array generation and output. -generate_html() { - html_content=' - - - - - - - - - - - - - - - - - ' - for key in "${!functions[@]}"; do - if [[ $key == *",function_name"* ]]; then - function_key="${key%,function_name}" - function_name="${functions[$key]}" - group_name="${functions["$function_key,group_name"]}" - description="${functions["$function_key,description"]}" - options="${functions["$function_key,options"]}" - category="${functions["$function_key,category"]}" - category_description="${functions["$function_key,category_description"]}" - html_content+="" - fi - done - html_content+=' - -
Function NameGroup NameDescriptionOptionsCategoryCategory Description
$function_name$group_name$description$options$category$category_description
- - - ' - - echo "$html_content" -} - -# This function is used to generate the main readme.md file -generate_markdown() { -cat << EOF - -
- -# User guide -## Quick start -Run the following commands: - - sudo apt install git - cd ~/ - git clone https://github.com/armbian/configng.git - cd configng - ./bin/${file_name%.*} --dev - -If all goes well you should see the Text-Based User Inerface (TUI) - -### To see a list of all functions and their descriptions, run the following command: -~~~ -bash ~/configng/bin/armbian-configng -h -~~~ -## Coding Style -follow the following coding style: -~~~ -# @description A short description of the function. -# -# @exitcode 0 If successful. -# -# @options A description if there are options. -function group::string() {s - echo "hello world" - return 0 -} -~~~ -## Codestyle can be used to auto generate - - [Markdown](share/${file_name%.*}/readme.md) - - [JSON](share/${file_name%.*}/data/${file_name%.*}.json) - - [CSV](share/${file_name%.*}/data/${file_name%.*}.csv) - - [HTML](share/${file_name%.*}/${file_name%.*}-table.html) - - [github.io](//tearran/github.io/${file_name%.*}/index.html) -## Functions list as of $(date +%Y-%m-%d) -EOF - - for category in "${categories[@]}"; do - echo "## ${category##*/}" - echo "${functions["$key,category_description"]}" - echo - - for file in "$category"/*.sh; do - echo "### ${file##*/}" - echo - - mapfile -t functions_in_file < <(grep -oP '(?<=function\s)\w+::\w+' "$file") - - for function in "${functions_in_file[@]}"; do - key="${category##*/}:${file##*/}:${function}" - echo " - **Group Name:** ${functions["$key,group_name"]}" - echo " - **Action Name:** ${functions["$key,function_name"]}" - echo " - **Options:** ${functions["$key,options"]}" - echo " - **Description:** ${functions["$key,description"]}" - echo - done - done - done -cat << EOF - -# Inclueded projects -- [Bash Utility](https://labbots.github.io/bash-utility) -- [Armbian config](https://github.com/armbian/config.git) - -EOF -} - - -# This function is used to generate a extention to help meassage of all functions and their descriptions. -generate_list_run() { - echo "Usage: ${filename%.*} [--run] [option] [action]" - # Loop through each category - for category in "${categories[@]}"; do - # Initialize an empty array to store the group names that have been printed - declare -A printed_groups - - # Loop through each file in the category - for file in "$category"/*.sh; do - - # Extract functions from the file - mapfile -t functions_in_file < <(grep -oP '(?<=function\s)\w+::\w+' "$file") - - # Loop through each function in the file - for function in "${functions_in_file[@]}"; do - key="${category##*/}:${file##*/}:${function}" - group_name=${functions["$key,group_name"]} - - # If the group name has not been printed yet, print it and add it to the array - declare -A printed_groups - if [[ -z ${printed_groups["$group_name"]} ]]; then - echo " $group_name, [action]" - printed_groups["$group_name"]=1 - fi - - echo " ${functions["$key,function_name"]} - ${functions["$key,description"]}" - echo - done - done - done - -} - -# This function is used to generate a no flag options help message -generate_list_cli() { - - echo "Usage: ${filename%.*} [group]=[function]" - # Loop through each category - for category in "${categories[@]}"; do - # Initialize an empty array to store the group names that have been printed - declare -A printed_groups - - # Loop through each file in the category - for file in "$category"/*.sh; do - - # Extract functions from the file - mapfile -t functions_in_file < <(grep -oP '(?<=function\s)\w+::\w+' "$file") - - # Loop through each function in the file - for function in "${functions_in_file[@]}"; do - key="${category##*/}:${file##*/}:${function}" - group_name=${functions["$key,group_name"]} - printf "\t%-20s - \t %s \n" "$group_name=${functions["$key,function_name"]}" "${functions["$key,description"]}" - done - done - done -} - - -# This function is used to generate a help message. -generate_help(){ -cat << EOF -Usage: ${filename%.*} [flag][option] - flag options: - -h, Print this help. - -t, Show a TUI fallback read. - --help, Prints Help message of long flag interactive options (WIP)." - help, View advanced no-interface options (CURRENT FOCUS)." -EOF -} - -# THis function is used to make documents -generate_and_print() { - local generate_func=$1 - local filename=$2 - local file_extension=$3 - local output_message=$4 - - "$generate_func" > "$filename.$file_extension" - chmod 755 "$filename.$file_extension" - echo "$output_message - generated $filename.$file_extension" -} - -generate_doc() { - dir="$(dirname "$(dirname "$(realpath "$0")")")/share/${filename%-dev}" - if [[ ! -d "$dir" ]]; then - mkdir -p "$dir/data/" - fi - cd "$dir" || exit - generate_svg > "$filename.svg" - generate_and_print generate_markdown "../../readme" md "readme.md" - generate_and_print generate_html "../../index" html "index.html" - generate_and_print generate_html5 "index" html "HTML5" - generate_and_print generate_json "data/$filename" json "JSON" - generate_and_print generate_csv "data/${filename%-dev}" csv "CSV" - if [[ "$EUID" -eq 0 ]]; then - chown -R "$SUDO_USER":"$SUDO_USER" "$(dirname "$dir")" - cd ../../ - chown "$SUDO_USER":"$SUDO_USER" readme.md - fi - return 0 -} \ No newline at end of file diff --git a/lib/armbian-configng/functions.sh b/lib/armbian-configng/functions.sh deleted file mode 100644 index 3d598c61..00000000 --- a/lib/armbian-configng/functions.sh +++ /dev/null @@ -1,145 +0,0 @@ - - -# This function is used to generate a text-based user interface (TUI) for navigating the menus. -generate_tui() { - local options=() - local i=0 - declare -A categories_array - for category in "${categories[@]}"; do - local category_name="${category##*/}" - local category_description="" - local category_file="$category/readme.md" - - if [[ -f "$category_file" ]]; then - category_description=$(grep -oP "(?<=# @description ).*" "$category_file") - fi - - categories_array["$i"]="$category_name" - description_array["$i"]="$category_description" - options+=("$i" "$(printf '%-7s - %-8s' "${categories_array[$i]}" "${description_array[$i]}")") - #options+=("$i" "${categories_array[$i]} - ${description_array[$i]}") - ((++i)) - done - options+=("$i" "$(printf '%-7s - %-8s' "Legacy" "Run Legacy configuration")") - - #options+=("$i" "Legacy - Run Legacy configuration") - ((++i)) - options+=("$i" "$(printf '%-7s - %-8s' "Help" "Documentation, support, sources")") - #options+=("$i" "Help - Documentation, support, sources" ) - ((++i)) - - local choice - - choice=$($dialogue --menu "Select a category:" 0 0 9 "${options[@]}" 3>&1 1>&2 2>&3) - - if [[ -n $choice ]]; then - - if ((choice == "$i - 1")); then - generate_help | armbian-interface -o - exit ; - elif ((choice == "$i - 2")); then - armbian-config - exit ; - else - generate_sub_tui "${categories_array[$choice]}" - fi - fi -} - -# This function is used to generate a text-based user interface (TUI) for navigating the menus. -generate_sub_tui() { - local category="$1" - local options=() - local i=0 - declare -A functions_array - for file in "$libpath/$category"/*.sh; do - mapfile -t functions_in_file < <(grep -oP '(?<=function\s)\w+::\w+' "$file") - for function in "${functions_in_file[@]}"; do - key="${category##*/}:${file##*/}:${function}" - functions_array["$i"]="$function" - options+=("$i" "${functions["$key,function_name"]} - ${functions["$key,description"]}") - ((++i)) - done - done - - local choice - - choice=$($dialogue --menu "Select a function:" 0 0 9 "${options[@]}" 3>&1 1>&2 2>&3) - - if [[ -n $choice ]]; then - generate_action "${functions_array[$choice]}" - fi - -} - -# This function is used to generate a whiptail/dialog text-based user interface (TUI) for navigating the menus. -generate_action() { - local function_name="$1" - ${function_name} -} - -# This function is used to generate a bash text-based user interface (TUI) for navigating the menus. -generate_read() { - echo - echo "Please select an action:" - echo - # Initialize an empty array to store the function keys - declare -a function_keys - - # Loop through each key in the functions array - local i=1 - local current_category="" - for key in "${!functions[@]}"; do - if [[ $key == *",function_name" ]]; then - # Add the key to the function_keys array - function_keys[i]="${key%,function_name}" - - # Check if the category has changed and display it if so - local category="${functions["${function_keys[i]},category"]}" # < editor" - if [[ "$category" != "$current_category" ]]; then - echo "Category: $category" - current_category="$category" - fi - - # Display the function and its description as an option in the menu - echo " $i. ${functions["${function_keys[i]},group_name"]} ${functions[$key]} - ${functions["${function_keys[i]},description"]}" #" < for my editor - ((i++)) - fi - done - - echo - echo "$i. Show help" - ((i++)) - echo "$i. Exit" - - read -p "Enter your choice: " choice - - if ((choice == i-1)); then - generate_help - elif ((choice == i)); then - exit 0 - elif ((choice >= 1 && choice <= ${#function_keys[@]})); then - # Call the selected function using variable indirection - eval "${functions["${function_keys[choice]},group_name"]}::${functions["${function_keys[choice]},function_name"]}" #" < for my editor - else - echo "Invalid choice" - fi -} - -# This function is used to parse the action name and return the full function name. -parse_action() { - local group=$1 - local action=$2 - - # Construct the full function name - local function_name="${group}::${action}" - - # Check if the function exists - if declare -f "$function_name" > /dev/null; then - # Return the function name - echo "$function_name" - else - echo "Error: Unknown action '$action' for group '$group'" - return 1 - fi -} \ No newline at end of file diff --git a/share/doc/armbian-configng/Command.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Command.md similarity index 100% rename from share/doc/armbian-configng/Command.md rename to share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Command.md diff --git a/share/doc/armbian-configng/Functions.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md similarity index 94% rename from share/doc/armbian-configng/Functions.md rename to share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md index 1e0be98b..9224fb54 100644 --- a/share/doc/armbian-configng/Functions.md +++ b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md @@ -21,6 +21,8 @@ A list of the heper function ie bash prosedures used in Jobs file. | check_if_installed | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L88) | X | Active | | generate_svg | Generate 'Armbian CPU logo' SVG for docunment file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L201) | X | review | | Headers_remove | Remove Linux headers | https://github.com/Tearran | [Source](https://github.com/armbian/config/blob/master/debian-config-jobs#L160) | [Document](https://github.com/armbian/config/wiki#System) | Review | +| toggle_menu_item | Show or hide menu items based on conditions | Joey Turner | X | X | source link Needed | +| update_submenu_data | Update submenu descriptions based on conditions | Joey Turner | X | X | source link Needed | | Headers_remove | Remove Linux headers | https://github.com/Tearran | [Source](https://github.com/armbian/config/blob/master/debian-config-jobs#L160) | [Document](https://github.com/armbian/config/wiki#System) | Review | | check_ip_version | Check if a domain is reachable via IPv4 and IPv6 | Joey Turner | X | X | source link Needed | | set_header_remove | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L64) | X | Active | @@ -34,6 +36,7 @@ A list of the heper function ie bash prosedures used in Jobs file. | generate_json | Generate JSON-like object file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L174) | X | review | | set_colors | Change the background color of the terminal or dialoge box | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L287) | X | Active | | serve_doc | Serve the edit and debug server. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L106) | X | review | +| update_json_data | Update JSON data with system information | Joey Turner | X | X | source link Needed | | show_infobox | pipe line strings to a infobox | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#512) | X | Active | | see_use | Show the usage of the functions. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L145) | X | review | | see_ping | Check the internet connection with fallback DNS | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#632) | X | review | diff --git a/share/doc/armbian-configng/Menu.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Menu.md similarity index 100% rename from share/doc/armbian-configng/Menu.md rename to share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Menu.md diff --git a/share/doc/armbian-configng/Home.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG.md similarity index 100% rename from share/doc/armbian-configng/Home.md rename to share/doc/armbian-configng/User-Guide_Armbian-ConfigNG.md From 55018eda2a76703ec93b819049029d72fa718a31 Mon Sep 17 00:00:00 2001 From: Tearran Date: Thu, 4 Jul 2024 09:41:47 -0600 Subject: [PATCH 4/8] Refactor switch management function for improved code readability and future modifications Refined doc generation to one page --- README.md | 488 +++++++++++++++--- bin/armbian-configng | 8 +- lib/armbian-configng/config.ng.docs.sh | 278 +++++----- lib/armbian-configng/config.ng.functions.sh | 68 +-- .../User-Guide_Armbian-ConfigNG-Command.md | 55 -- .../User-Guide_Armbian-ConfigNG-Functions.md | 44 -- .../User-Guide_Armbian-ConfigNG-Menu.md | 259 ---------- .../User-Guide_Armbian-ConfigNG.md | 162 ------ 8 files changed, 588 insertions(+), 774 deletions(-) delete mode 100644 share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Command.md delete mode 100644 share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md delete mode 100644 share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Menu.md delete mode 100644 share/doc/armbian-configng/User-Guide_Armbian-ConfigNG.md diff --git a/README.md b/README.md index 8637eca5..4a641593 100644 --- a/README.md +++ b/README.md @@ -1,98 +1,66 @@ -# Armbian configuration utility -Utility for configuring your board, divided into four main sections: +# Armbian Configuration Utility +Thu Jul 4 09:10:49 AM MDT 2024 -- System - system and security settings, -- Network - wired, wireless, Bluetooth, access point, -- Personal - timezone, language, hostname, -- Software - system and 3rd party software install. +Utility for configuring your board, adjusting services, and installing applications. It comes with Armbian by default. +To start the Armbian configuration utility, use the following command: +~~~ +sudo armbian-config +~~~ - ## **System** - - **S01** - Description: Enable Armbina kernal upgrades - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s01) - - **S02** - Description: Disable Armbina kernal upgrades - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s02) - - **S03** - Description: Edit the boot enviroment (WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s03) - - **S04** - Description: Install Linux headers - - Status: [Pending Review](https://github.com/armbian/config/wiki#System) - - **S05** - Description: Remove Linux headers - - Status: [Pending Review](https://github.com/armbian/config/wiki#System) + - **S01** - Enable Armbina kernal upgrades + - **S02** - Disable Armbina kernal upgrades + - **S03** - Edit the boot enviroment (WIP) + - **S04** - Install Linux headers + - **S05** - Remove Linux headers - ## **Network** - - **BT0** - Description: Install Bluetooth support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt0) - - **BT1** - Description: Remove Bluetooth support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt1) - - **BT3** - Description: Bluetooth Discover - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt3) - - **IR0** - Description: Install Infrared support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#ir0) - - **IR1** - Description: Uninstall Infrared support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#ir1) - - **N00** - Description: Manage wifi network connections - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n00) - - **N01** - Description: Advanced Edit /etc/network/interface - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n01) - - **N02** - Description: Disconect and forget all wifi connections (Advanced) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n02) - - **N03** - Description: Toggle system IPv6/IPv4 internet protical - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n03) - - **N04** - Description: (WIP) Setup Hotspot/Access point - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#n04) + - **BT0** - Install Bluetooth support + - **BT1** - Remove Bluetooth support + - **BT3** - Bluetooth Discover + - **IR0** - Install Infrared support + - **IR1** - Uninstall Infrared support + - **N00** - Manage wifi network connections + - **N01** - Advanced Edit /etc/network/interface + - **N02** - Disconect and forget all wifi connections (Advanced) + - **N03** - Toggle system IPv6/IPv4 internet protical + - **N04** - (WIP) Setup Hotspot/Access point - ## **Localisation** - - **L00** - Description: Change Globla timezone (WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l00) - - **L01** - Description: Change Locales reconfigure the language and charitorset - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l01) - - **L02** - Description: Change Keyboard layout - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l02) - - **L03** - Description: Change APT mirrors - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l03) + - **L00** - Change Globla timezone (WIP) + - **L01** - Change Locales reconfigure the language and charitorset + - **L02** - Change Keyboard layout + - **L03** - Change APT mirrors - ## **Software** - - **I00** - Description: Update Application Repository - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#i00) - - **I01** - Description: CLI System Monitor - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#i01) + - **I00** - Update Application Repository + - **I01** - CLI System Monitor - ## **Help** - - **H00** - Description: About This systme. (WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#h00) - - **H02** - Description: List of Config function(WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#h02) - - -*** - -## Development - -To clone this development branch, run the following commands: + - **H00** - About This systme. (WIP) + - **H02** - List of Config function(WIP) +## Install +Armbian installation ~~~ - git clone https://github.com/armbian/configng - cd configng - ./armbian-configng --help +sudo apt install armbian-config ~~~ -## Install latest release -dowload .deb package: - +3rd party Debian based distributions ~~~ { - latest_release=$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) - deb_url=$(echo "$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') - curl -LO "$deb_url" - deb_file=$(echo "$deb_url" | awk -F"/" '{print $NF}') - sudo dpkg -i "$deb_file" - sudo dpkg --configure -a - sudo apt --fix-broken install + sudo wget https://apt.armbian.com/armbian.key -O key + sudo gpg --dearmor < key | sudo tee /usr/share/keyrings/armbian.gpg > /dev/null + sudo chmod go+r /usr/share/keyrings/armbian.gpg + sudo echo "deb [arch=arm64 signed-by=/usr/share/keyrings/armbian.gpg] http://apt.armbian.com bookworm main bookworm-utils bookworm-desktop" | sudo tee /etc/apt/sources.list.d/armbian.list + sudo apt update + sudo apt install armbian-config } ~~~ @@ -103,7 +71,7 @@ Command ine options. Use: ~~~ - armbian-config --help +armbian-config --help ~~~ Outputs: @@ -140,8 +108,9 @@ Usage: armbian-configng [option] [arguments] Backward Compatible options. Use: - - armbian-config main=Help +~~~ +armbian-config main=Help +~~~ Outputs: ~~~ @@ -154,9 +123,370 @@ Usage: armbian-configng main=[arguments] selection=[options] armbian-configng main=System selection=Headers_remove - Remove headers: ~~~ +*** + +## Development + +Develoment is divided into three sections: + +Click for more info: + +
+Jobs / JSON Object + +A list of the jobs defined in the Jobs file. + + ### S01 + +Enable Armbina kernal upgrades + +Jobs: + +~~~ +set_safe_boot unhold +~~~ + +### S02 + +Disable Armbina kernal upgrades + +Jobs: + +~~~ +set_safe_boot freeze +~~~ + +### S03 + +Edit the boot enviroment (WIP) + +Jobs: + +~~~ +get_user_continue "This will open /boot/armbianEnv.txt file to edit +CTRL+S to save +CTLR+X to exit +would you like to continue?" process_input +nano /boot/armbianEnv.txt +~~~ + +### S04 + +Install Linux headers + +Jobs: + +~~~ +Headers_install +~~~ + +### S05 + +Remove Linux headers + +Jobs: + +~~~ +Headers_remove +~~~ + +### BT0 + +Install Bluetooth support + +Jobs: + +~~~ +see_current_apt +debconf-apt-progress -- apt-get -y install bluetooth bluez bluez-tools +check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y --no-install-recommends install pulseaudio-module-bluetooth blueman +~~~ + +### BT1 + +Remove Bluetooth support + +Jobs: + +~~~ +see_current_apt +debconf-apt-progress -- apt-get -y remove bluetooth bluez bluez-tools +check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y remove pulseaudio-module-bluetooth blueman +debconf-apt-progress -- apt -y -qq autoremove +~~~ + +### BT3 + +Bluetooth Discover + +Jobs: + +~~~ +get_user_continue "Verify that your Bluetooth device is discoverable!" process_input ; connect_bt_interface +~~~ + +### IR0 + +Install Infrared support + +Jobs: + +~~~ +see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc +~~~ + +### IR1 + +Uninstall Infrared support + +Jobs: + +~~~ +see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc +~~~ + +### N00 + +Manage wifi network connections + +Jobs: + +~~~ +nmtui connect +~~~ + +### N01 + +Advanced Edit /etc/network/interface + +Jobs: + +~~~ +get_user_continue "This will open interface file to edit +CTRL+S to save +CTLR+X to exit +would you like to continue?" process_input +nano /etc/network/interfaces +~~~ + +### N02 + +Disconect and forget all wifi connections (Advanced) + +Jobs: + +~~~ +get_user_continue "Disconect and forget all wifi connections +Would you like to contiue?" process_input +LC_ALL=C nmcli --fields UUID,TIMESTAMP-REAL,TYPE con show | grep wifi | awk '{print $1}' | while read line; \ +do nmcli con delete uuid $line; done > /dev/null +~~~ + +### N03 + +Toggle system IPv6/IPv4 internet protical + +Jobs: + +~~~ +get_user_continue "This will toggle your internet protical +Would you like to contiue?" process_input +toggle_ipv6 | show_infobox +~~~ + +### N04 + +(WIP) Setup Hotspot/Access point + +Jobs: + +~~~ +get_user_continue "This operation will install necessary software and add configuration files. +Do you wish to continue?" process_input +hotspot_setup +~~~ + +### L00 + +Change Globla timezone (WIP) + +Jobs: + +~~~ +dpkg-reconfigure tzdata +~~~ + +### L01 + +Change Locales reconfigure the language and charitorset + +Jobs: + +~~~ +dpkg-reconfigure locales +source /etc/default/locale ; sed -i "s/^LANGUAGE=.*/LANGUAGE=$LANG/" /etc/default/locale +export LANGUAGE=$LANG +~~~ + +### L02 + +Change Keyboard layout + +Jobs: + +~~~ +dpkg-reconfigure keyboard-configuration ; setupcon +~~~ + +### L03 + +Change APT mirrors + +Jobs: + +~~~ +get_user_continue "This is only a frontend test" process_input +~~~ + +### I00 + +Update Application Repository + +Jobs: + +~~~ +get_user_continue "This will update apt" process_input +debconf-apt-progress -- apt update +~~~ + +### I01 + +CLI System Monitor + +Jobs: + +~~~ +armbianmonitor -m | show_infobox +~~~ + +### H00 + +About This systme. (WIP) + +Jobs: + +~~~ +show_message <<< "This app is to help exicute prosedures to configure your system + +Some option may not work on manualy modified sytemes" +~~~ + +### H02 + +List of Config function(WIP) + +Jobs: + +~~~ +show_message <<< see_use +~~~ + +
+ + +
+Jobs API / Helper Functions + +These helper functions facilitate various operations related to job management, such as creation, updating, deletion, and listing of jobs, acting as a practical API for developers. + +| Description | Example | Credit | +|:----------- | ------- |:------:| +| Generate a Help message legacy cli commands. | see_cli_legacy | Joey Turner +| Run time varibales Migrated procedures from Armbian config. | set_runtime_variables | Igor Pecovnik +| Generate this markdown table of all module_options | see_function_table_md | Joey Turner +| Display a menu from pipe | show_menu <<< armbianmonitor -h ; | Joey Turner +| Build the main menu from a object | generate_top_menu 'json_data' | Joey Turner +| Migrated procedures from Armbian config. | is_package_manager_running | Igor Pecovnik +| Migrated procedures from Armbian config. | check_desktop | Igor Pecovnik +| Generate Document files. | generate_readme | Joey Turner +| Needed by generate_menu | | Joey Turner +| Display a Yes/No dialog box and prosees continue/exit | get_user_continue 'Do you wish to continue?' process_input | Joey Turner +| Display a message box | show_message <<< 'hello world' | Joey Turner +| Migrated procedures from Armbian config. | connect_bt_interface | Igor Pecovnik +| Freeze/unhold Migrated procedures from Armbian config. | set_safe_boot unhold or set_safe_boot freeze | Igor Pecovnik +| Check when apt list was last updated | see_current_apt | Joey Turner +| Migrated procedures from Armbian config. | check_if_installed nano | Igor Pecovnik +| Generate 'Armbian CPU logo' SVG for docunment file. | generate_svg | Joey Turner +| Remove Linux headers | Headers_remove | Joey Turner +| Show or hide menu items based on conditions | toggle_menu_item | Joey Turner +| Update submenu descriptions based on conditions | update_submenu_data | Joey Turner +| sanitize input cli | sanitize_input | +| Check if a domain is reachable via IPv4 and IPv6 | check_ip_version google.com | Joey Turner +| Migrated procedures from Armbian config. | set_header_remove | Igor Pecovnik +| Generate a submenu from a parent_id | generate_menu 'parent_id' | Joey Turner +| Generate a markdown list json objects using jq. | see_jq_menu_list | Joey Turner +| Generate jobs from JSON file. | generate_jobs_from_json | Joey Turner +| Install kernel headers | is_package_manager_running | Joey Turner +| Set up a WiFi hotspot on the device | hotspot_setup | Joey Turner +| Toggle IPv6 on or off | toggle_ipv6 | Joey Turner +| Generate a Help message for cli commands. | see_cli_list | Joey Turner +| Generate JSON-like object file. | generate_json | Joey Turner +| Change the background color of the terminal or dialoge box | set_colors 0-7 | Joey Turner +| Serve the edit and debug server. | serve_doc | Joey Turner +| Update JSON data with system information | update_json_data | Joey Turner +| pipe line strings to a infobox | show_infobox <<< 'hello world' ; | Joey Turner +| Show the usage of the functions. | see_use | Joey Turner +| Check the internet connection with fallback DNS | see_ping | Joey Turner +| Secure version of get_user_continue | get_user_continue_secure 'Do you wish to continue?' process_input | Joey Turner + + +
+ + +
+Runtime / Board Statuses + +(WIP) + +This section outlines the runtime environment to check configurations and statuses for dynamically managing jobs based on JSON data. + +(WIP) + +
+ + +## Testing and contributing + +
+Get Devleopment + +Install the dependencys: +~~~ +sudo apt install git jq whiptail +~~~ + +Get Developent and contribute: +~~~ +{ + git clone https://github.com/armbian/configng + cd configng + ./armbian-configng --help +} +~~~ + +Install and test Development deb: +~~~ +{ + sudo apt install whiptail + latest_release=$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) + deb_url=$(echo "$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') + curl -LO "$deb_url" + deb_file=$(echo "$deb_url" | awk -F"/" '{print $NF}') + sudo dpkg -i "$deb_file" + sudo dpkg --configure -a + sudo apt --fix-broken install +} +~~~ +
-## Note: -> -> The Bash procedures embedded within the JSON structure are meticulously designed with a focus on clear naming conventions and the simplicity of key pairs. These procedures serve multiple purposes, including facilitating the generation of content in various formats, such as Whiptail, Markdown, json out and others. Moreover, they are utilized for evaluation and execution of commands outlined in the JSON structure. -> diff --git a/bin/armbian-configng b/bin/armbian-configng index 85208504..949dfab4 100755 --- a/bin/armbian-configng +++ b/bin/armbian-configng @@ -82,6 +82,12 @@ case "$1" in execute_command "$args" exit 0 ;; + "--api") + shift + args=$(sanitize_input "$@") + "$args" + exit 0 + ;; "main=help" | "main=Help") see_cli_legacy echo "" @@ -89,7 +95,7 @@ case "$1" in ;; "main="*) cat << EOF -Legacy help commands are deprecated. May not work as expected. +Legacy help commands. Please use 'armbian-config --help' for more information. EOF diff --git a/lib/armbian-configng/config.ng.docs.sh b/lib/armbian-configng/config.ng.docs.sh index ce761b97..825cde39 100644 --- a/lib/armbian-configng/config.ng.docs.sh +++ b/lib/armbian-configng/config.ng.docs.sh @@ -4,7 +4,7 @@ module_options+=( ["generate_readme,author"]="Joey Turner" - ["generate_readme,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L17" + ["generate_readme,ref_link"]="#L17" ["generate_readme,feature"]="generate_readme" ["generate_readme,desc"]="Generate Document files." ["generate_readme,example"]="generate_readme" @@ -19,57 +19,53 @@ function generate_readme() { # Get the current date local current_date=$(date) # setup doc folders - mkdir -p "$script_dir/../share/doc/armbian-configng" + #mkdir -p "$script_dir/../share/doc/armbian-configng" + echo -e "Sorting data\nUpdating documentation" # current_date ; -###################################### -# Generate the README.md file -echo "$(see_full_list)" > "$script_dir/../README.md" -echo "Updating Readme.md" # current_date +cat << EOF > "$script_dir/../README.md" -###################################### +# Armbian Configuration Utility +Updated: $current_date +Utility for configuring your board, adjusting services, and installing applications. It comes with Armbian by default. -cp "$script_dir/../README.md" "$doc_dir/User-Guide_Armbian-ConfigNG.md" -echo "README.md has been updated." # current_date - -###################################### - -echo "Updating WIKI Functions" # current_date -cat << EOF > "$doc_dir/User-Guide_Armbian-ConfigNG-Functions.md" - -# Helper functions -A list of the heper function ie bash prosedures used in Jobs file. - -$(see_function_table_md) - -EOF - -###################################### - -echo "Updating WIKI HowTo" # current_date -cat << EOF > "$doc_dir/User-Guide_Armbian-ConfigNG-Menu.md" - -# Menu list. -armbian-config jobs list. +To start the Armbian configuration utility, use the following command: +~~~ +sudo armbian-config +~~~ -$(see_jq_menu_list) +$(see_full_list) -EOF +## Install +Armbian installation +~~~ +sudo apt install armbian-config +~~~ -###################################### +3rd party Debian based distributions +~~~ +{ + sudo wget https://apt.armbian.com/armbian.key -O key + sudo gpg --dearmor < key | sudo tee /usr/share/keyrings/armbian.gpg > /dev/null + sudo chmod go+r /usr/share/keyrings/armbian.gpg + sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/armbian.gpg] http://apt.armbian.com $(lsb_release -cs) main $(lsb_release -cs)-utils $(lsb_release -cs)-desktop" | sudo tee /etc/apt/sources.list.d/armbian.list + sudo apt update + sudo apt install armbian-config +} +~~~ -echo "Updating WIKI Command line options" # current_date -cat << EOF > "$doc_dir/User-Guide_Armbian-ConfigNG-Command.md" +*** ## CLI options Command ine options. Use: - - armbian-config --help +~~~ +armbian-config --help +~~~ Outputs: ~~~ @@ -77,27 +73,106 @@ $(see_cli_list) ~~~ ## Legacy options -deprecated +Backward Compatible options. Use: - - armbian-config main=Help +~~~ +armbian-config main=Help +~~~ Outputs: ~~~ $(see_cli_legacy) ~~~ + +*** + +## Development + +Develoment is divided into three sections: + +Click for more info: + +
+Jobs / JSON Object + +A list of the jobs defined in the Jobs file. + + $(see_jq_menu_list) + +
+ + +
+Jobs API / Helper Functions + +These helper functions facilitate various operations related to job management, such as creation, updating, deletion, and listing of jobs, acting as a practical API for developers. + +$(see_function_table_md) + + +
+ + +
+Runtime / Board Statuses + +(WIP) + +This section outlines the runtime environment to check configurations and statuses for dynamically managing jobs based on JSON data. + +(WIP) + +
+ + +## Testing and contributing + +
+Get Devleopment + +Install the dependencys: +~~~ +sudo apt install git jq whiptail +~~~ + +Get Developent and contribute: +~~~ +{ + git clone https://github.com/armbian/configng + cd configng + ./armbian-configng --help +} +~~~ + +Install and test Development deb: +~~~ +{ + sudo apt install whiptail + latest_release=\$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) + deb_url=\$(echo "\$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') + curl -LO "\$deb_url" + deb_file=\$(echo "\$deb_url" | awk -F"/" '{print \$NF}') + sudo dpkg -i "\$deb_file" + sudo dpkg --configure -a + sudo apt --fix-broken install +} +~~~ + +
+ EOF + } module_options+=( - ["serve_doc,author"]="Tearran" - ["serve_doc,ref_link"]="#L106" + ["serve_doc,author"]="Joey Turner" + ["serve_doc,ref_link"]="" ["serve_doc,feature"]="serve_doc" ["serve_doc,desc"]="Serve the edit and debug server." ["serve_doc,example"]="serve_doc" - ["serve_doc,status"]="review" + ["serve_doc,status"]="acive" ["serve_doc,doc_link"]="" ) # @@ -131,8 +206,8 @@ function serve_doc() { module_options+=( - ["see_use,author"]="Tearran" - ["see_use,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L145" + ["see_use,author"]="Joey Turner" + ["see_use,ref_link"]="" ["see_use,feature"]="see_use" ["see_use,desc"]="Show the usage of the functions." ["see_use,example"]="see_use" @@ -160,8 +235,8 @@ function see_use() { module_options+=( - ["generate_json_options,author"]="Tearran" - ["generate_json_options,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L174" + ["generate_json_options,author"]="Joey Turner" + ["generate_json_options,ref_link"]="" ["generate_json_options,feature"]="generate_json" ["generate_json_options,desc"]="Generate JSON-like object file." ["generate_json_options,example"]="generate_json" @@ -214,8 +289,8 @@ echo "}" module_options+=( - ["generate_svg,author"]="Tearran" - ["generate_svg,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L201" + ["generate_svg,author"]="Joey Turner" + ["generate_svg,ref_link"]="" ["generate_svg,feature"]="generate_svg" ["generate_svg,desc"]="Generate 'Armbian CPU logo' SVG for docunment file." ["generate_svg,example"]="generate_svg" @@ -235,12 +310,13 @@ cat << EOF EOF + } module_options+=( - ["generate_jobs_from_json,author"]="Tearran" - ["generate_jobs_from_json,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L253" + ["generate_jobs_from_json,author"]="Joey Turner" + ["generate_jobs_from_json,ref_link"]="" ["generate_jobs_from_json,feature"]="generate_jobs_from_json" ["generate_jobs_from_json,desc"]="Generate jobs from JSON file." ["generate_jobs_from_json,example"]="generate_jobs_from_json" @@ -278,7 +354,7 @@ do doc_link=$(jq -r ".menu[$i].sub[$j].doc_link" "$json_file") # Check if src_reference and doc_link are null - if [ "$doc_link" == "" ]; then doc_link="https://github.com/armbian/configng/wiki/Menu#$id_link"; else doc_link="[Document]($doc_link)"; fi + if [ "$doc_link" == "" ]; then doc_link="#$id_link"; else doc_link="[Document]($doc_link)"; fi echo -e "| | $id | $description | $doc_link | $status |" @@ -290,18 +366,6 @@ done function see_full_list() { - cat << EOF - -# Armbian configuration utility -Utility for configuring your board, divided into four main sections: - -- System - system and security settings, -- Network - wired, wireless, Bluetooth, access point, -- Personal - timezone, language, hostname, -- Software - system and 3rd party software install. - - -EOF # Use jq to parse the JSON into markdown menu_items=$(jq -r '.menu | length' "$json_file") @@ -327,88 +391,23 @@ EOF # Check if src_reference and doc_link are null if [ "$doc_link" == "" ]; then - doc_link="https://github.com/armbian/configng/wiki/Menu#$id_link"; + doc_link="#$id_link"; else doc_link="$doc_link"; fi - echo -e " - **$id** - Description: $description" - echo -e " - Status: [$status]($doc_link)" + echo -e " - **$id** - $description" +# echo -e " - Status: [$status]($doc_link)" done echo -e "\n" done -cat << EOF -*** - -## Development - -To clone this development branch, run the following commands: - -~~~ - git clone https://github.com/armbian/configng - cd configng - ./armbian-configng --help -~~~ - -## Install latest release -dowload .deb package: - -~~~ -{ - latest_release=\$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) - deb_url=\$(echo "\$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') - curl -LO "\$deb_url" - deb_file=\$(echo "\$deb_url" | awk -F"/" '{print \$NF}') - sudo dpkg -i "\$deb_file" - sudo dpkg --configure -a - sudo apt --fix-broken install -} -~~~ - -*** - -## CLI options -Command ine options. - -Use: -~~~ - armbian-config --help -~~~ - -Outputs: -~~~ -$(see_cli_list) -~~~ - -## Legacy options -Backward Compatible options. - -Use: - - armbian-config main=Help - -Outputs: -~~~ -$(see_cli_legacy) -~~~ - - - -## Note: -> -> The Bash procedures embedded within the JSON structure are meticulously designed with a focus on clear naming conventions and the simplicity of key pairs. These procedures serve multiple purposes, including facilitating the generation of content in various formats, such as Whiptail, Markdown, json out and others. Moreover, they are utilized for evaluation and execution of commands outlined in the JSON structure. -> - -EOF - -exit 0 ; } module_options+=( - ["see_function_table_md,author"]="Tearran" + ["see_function_table_md,author"]="Joey Turner" ["see_function_table_md,ref_link"]="" ["see_function_table_md,feature"]="see_function_table_md" ["see_function_table_md,desc"]="Generate this markdown table of all module_options" @@ -420,8 +419,8 @@ module_options+=( # This function is used to generate a markdown table from the module_options array # function see_function_table_md() { - mod_message="| Feature | Description | Credit | Reference | Documents | Status |\n" - mod_message+="|:------- | ----------- | ----------- |:---------:|:---------:|:------:|\n" + mod_message="| Description | Example | Credit |\n" + mod_message+="|:----------- | ------- |:------:|\n" # Iterate over the options for key in "${!module_options[@]}"; do # Split the key into function_name and type @@ -434,17 +433,16 @@ function see_function_table_md() { ref_link_md=$([[ -n "$ref_link" ]] && echo "[Source]($ref_link)" || echo "X") doc_link_md=$([[ -n "$doc_link" ]] && echo "[Document]($doc_link)" || echo "X") status_md=$([[ -z "$ref_link" ]] && echo "source link Needed" || ([[ ( -n "$ref_link" && -n "$doc_link") ]] && echo "Review" || echo "$status" ) ) - mod_message+="| ${module_options["$function_name,feature"]} | ${module_options["$function_name,desc"]} | ${module_options["$function_name,author"]} | $ref_link_md | $doc_link_md | $status_md | \n" + mod_message+="| ${module_options["$function_name,desc"]} | ${module_options["$function_name,example"]} | ${module_options["$function_name,author"]} \n" fi done echo -e "$mod_message" } - module_options+=( - ["see_jq_menu_list,author"]="Tearran" - ["see_jq_menu_list,ref_link"]="https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L304" + ["see_jq_menu_list,author"]="Joey Turner" + ["see_jq_menu_list,ref_link"]="" ["see_jq_menu_list,feature"]="see_jq_menu_list" ["see_jq_menu_list,desc"]="Generate a markdown list json objects using jq." ["see_jq_menu_list,example"]="see_jq_menu_list" @@ -466,7 +464,7 @@ jq -r ' ' $json_file } module_options+=( - ["see_cli_list,author"]="Tearran" + ["see_cli_list,author"]="Joey Turner" ["see_cli_list,ref_link"]="" ["see_cli_list,feature"]="see_cli_list" ["see_cli_list,desc"]="Generate a Help message for cli commands." @@ -497,7 +495,7 @@ EOF } module_options+=( - ["see_cli_legacy,author"]="Tearran" + ["see_cli_legacy,author"]="Joey Turner" ["see_cli_legacy,ref_link"]="" ["see_cli_legacy,feature"]="see_cli_legacy" ["see_cli_legacy,desc"]="Generate a Help message legacy cli commands." diff --git a/lib/armbian-configng/config.ng.functions.sh b/lib/armbian-configng/config.ng.functions.sh index c726aacf..0ba99424 100644 --- a/lib/armbian-configng/config.ng.functions.sh +++ b/lib/armbian-configng/config.ng.functions.sh @@ -6,7 +6,7 @@ module_options+=( ["check_desktop,author"]="Igor Pecovnik" -["check_desktop,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L16" +["check_desktop,ref_link"]="" ["check_desktop,feature"]="check_desktop" ["check_desktop,desc"]="Migrated procedures from Armbian config." ["check_desktop,example"]="check_desktop" @@ -32,10 +32,10 @@ function check_desktop() { menu_options+=( ["get_headers_kernel,author"]="Igor Pecovnik" -["get_headers_kernel,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L39" -["get_headers_kernel,feature"]="get_headers_kernel" +["get_headers_kernel,ref_link"]="" +["get_headers_kernel,feature"]="get_headers_install" ["get_headers_kernel,desc"]="Migrated procedures from Armbian config." -["get_headers_kernel,example"]="get_headers_kernel" +["get_headers_kernel,example"]="get_headers_install" ["get_headers_kernel,status"]="Active" ["get_headers_kernel,doc_link"]="" ) @@ -56,7 +56,7 @@ function get_headers_install() { module_options+=( ["set_header_remove,author"]="Igor Pecovnik" -["set_header_remove,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L64" +["set_header_remove,ref_link"]="" ["set_header_remove,feature"]="set_header_remove" ["set_header_remove,desc"]="Migrated procedures from Armbian config." ["set_header_remove,example"]="set_header_remove" @@ -85,7 +85,7 @@ function set_header_remove() { module_options+=( ["check_if_installed,author"]="Igor Pecovnik" -["check_if_installed,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L88" +["check_if_installed,ref_link"]="" ["check_if_installed,feature"]="check_if_installed" ["check_if_installed,desc"]="Migrated procedures from Armbian config." ["check_if_installed,example"]="check_if_installed nano" @@ -108,7 +108,7 @@ function check_if_installed (){ module_options+=( ["is_package_manager_running,author"]="Igor Pecovnik" -["is_package_manager_running,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L111" +["is_package_manager_running,ref_link"]="" ["is_package_manager_running,feature"]="is_package_manager_running" ["is_package_manager_running,desc"]="Migrated procedures from Armbian config." ["is_package_manager_running,example"]="is_package_manager_running" @@ -131,7 +131,7 @@ function is_package_manager_running() { module_options+=( ["set_runtime_variables,author"]="Igor Pecovnik" -["set_runtime_variables,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L136" +["set_runtime_variables,ref_link"]="" ["set_runtime_variables,feature"]="set_runtime_variables" ["set_runtime_variables,desc"]="Run time varibales Migrated procedures from Armbian config." ["set_runtime_variables,example"]="set_runtime_variables" @@ -181,7 +181,7 @@ function set_runtime_variables(){ module_options+=( ["set_safe_boot,author"]="Igor Pecovnik" -["set_safe_boot,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L188" +["set_safe_boot,ref_link"]="" ["set_safe_boot,feature"]="set_safe_boot" ["set_safe_boot,desc"]="Freeze/unhold Migrated procedures from Armbian config." ["set_safe_boot,example"]="set_safe_boot unhold or set_safe_boot freeze" @@ -216,7 +216,7 @@ set_safe_boot() { module_options+=( ["connect_bt_interface,author"]="Igor Pecovnik" -["connect_bt_interface,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L221" +["connect_bt_interface,ref_link"]="" ["connect_bt_interface,feature"]="connect_bt_interface" ["connect_bt_interface,desc"]="Migrated procedures from Armbian config." ["connect_bt_interface,example"]="connect_bt_interface" @@ -273,7 +273,7 @@ function connect_bt_interface(){ module_options+=( ["set_colors,author"]="Joey Turner" -["set_colors,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L287" +["set_colors,ref_link"]="" ["set_colors,feature"]="set_colors" ["set_colors,desc"]="Change the background color of the terminal or dialoge box" ["set_colors,example"]="set_colors 0-7" @@ -352,7 +352,7 @@ function reset_colors() { module_options+=( ["generate_top_menu,author"]="Joey Turner" -["generate_top_menu,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L370" +["generate_top_menu,ref_link"]="" ["generate_top_menu,feature"]="generate_top_menu" ["generate_top_menu,desc"]="Build the main menu from a object" ["generate_top_menu,example"]="generate_top_menu 'json_data'" @@ -402,7 +402,7 @@ generate_top_menu() { module_options+=( ["generate_menu,author"]="Joey Turner" -["generate_menu,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L416" +["generate_menu,ref_link"]="" ["generate_menu,feature"]="generate_menu" ["generate_menu,desc"]="Generate a submenu from a parent_id" ["generate_menu,example"]="generate_menu 'parent_id'" @@ -456,7 +456,7 @@ function generate_menu() { module_options+=( ["execute_command,author"]="Joey Turner" -["execute_command,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L464" +["execute_command,ref_link"]="" ["execute_command,feature"]="execute_command" ["execute_command,desc"]="Needed by generate_menu" ["execute_command,example"]="" @@ -480,11 +480,11 @@ function execute_command() { module_options+=( ["show_message,author"]="Joey Turner" -["show_message,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#486" +["show_message,ref_link"]="" ["show_message,feature"]="show_message" ["show_message,desc"]="Display a message box" ["show_message,example"]="show_message <<< 'hello world' " -["show_message,doc_link"]="https://github.com/armbian/configng/wiki/interface" +["show_message,doc_link"]="" ["show_message,status"]="Active" ) # @@ -506,7 +506,7 @@ function show_message() { module_options+=( ["show_infobox,author"]="Joey Turner" -["show_infobox,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#512" +["show_infobox,ref_link"]="" ["show_infobox,feature"]="show_infobox" ["show_infobox,desc"]="pipe line strings to a infobox " ["show_infobox,example"]="show_infobox <<< 'hello world' ; " @@ -544,7 +544,7 @@ function show_infobox() { module_options+=( ["show_menu,author"]="Joey Turner" -["show_menu,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L550" +["show_menu,ref_link"]="" ["show_menu,feature"]="show_menu" ["show_menu,desc"]="Display a menu from pipe" ["show_menu,example"]="show_menu <<< armbianmonitor -h ; " @@ -582,7 +582,7 @@ show_menu(){ module_options+=( ["get_user_continue,author"]="Joey Turner" -["get_user_continue,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L588" +["get_user_continue,ref_link"]="" ["get_user_continue,feature"]="get_user_continue" ["get_user_continue,desc"]="Display a Yes/No dialog box and prosees continue/exit" ["get_user_continue,example"]="get_user_continue 'Do you wish to continue?' process_input" @@ -606,7 +606,7 @@ function get_user_continue() { menu_options+=( ["get_user_continue,author"]="Joey Turner" -["get_user_continue,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#612" +["get_user_continue,ref_link"]="" ["get_user_continue,feature"]="process_input" ["get_user_continue,desc"]="used to process the user's choice paired with get_user_continue" ["get_user_continue,example"]="get_user_continue 'Do you wish to continue?' process_input" @@ -668,7 +668,7 @@ function get_user_continue_secure() { module_options+=( ["see_ping,author"]="Joey Turner" -["see_ping,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#632" +["see_ping,ref_link"]="" ["see_ping,feature"]="see_ping" ["see_ping,desc"]="Check the internet connection with fallback DNS" ["see_ping,example"]="see_ping" @@ -703,7 +703,7 @@ function see_ping() { module_options+=( ["see_current_apt,author"]="Joey Turner" -["see_current_apt,ref_link"]="https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#667" +["see_current_apt,ref_link"]="" ["see_current_apt,feature"]="see_current_apt" ["see_current_apt,desc"]="Check when apt list was last updated" ["see_current_apt,example"]="see_current_apt" @@ -748,13 +748,13 @@ see_current_apt() { module_options+=( -["Headers_install,author"]="https://github.com/Tearran" -["Headers_install,ref_link"]="https://github.com/armbian/config/blob/master/debian-config-jobs#L160" +["Headers_install,author"]="Joey Turner" +["Headers_install,ref_link"]="" ["Headers_install,feature"]="Headers_install" ["Headers_install,desc"]="Install kernel headers" -["Headers_install,example"]="if ! is_package_manager_running; then, if [[ -f /etc/armbian-release ]]; then, INSTALL_PKG="linux-headers-${BRANCH}-${LINUXFAMILY}";, else, INSTALL_PKG="linux-headers-$(uname -r | sed 's/'-$(dpkg --print-architecture)'//')";, fi, debconf-apt-progress -- apt-get -y install ${INSTALL_PKG},fi" +["Headers_install,example"]="is_package_manager_running" ["Headers_install,status"]="Pending Review" -["Headers_install,doc_link"]="https://github.com/armbian/config/wiki#System" +["Headers_install,doc_link"]="" ) # # @description Install kernel headers @@ -771,11 +771,11 @@ function Headers_install () { } module_options+=( -["Headers_remove,author"]="https://github.com/Tearran" +["Headers_remove,author"]="Joey Turner" ["Headers_remove,ref_link"]="https://github.com/armbian/config/blob/master/debian-config-jobs#L160" ["Headers_remove,feature"]="Headers_remove" ["Headers_remove,desc"]="Remove Linux headers" -["Headers_remove,example"]="if ! is_package_manager_running; then, REMOVE_PKG="linux-headers-*", if [[ -n $(dpkg -l | grep linux-headers) ]]; then, debconf-apt-progress -- apt-get -y purge ${REMOVE_PKG}, rm -rf /usr/src/linux-headers*, else, debconf-apt-progress -- apt-get -y install ${INSTALL_PKG}, fi, # cleanup, apt clean, debconf-apt-progress -- apt -y autoremove,fi" +["Headers_remove,example"]="Headers_remove" ["Headers_remove,status"]="Pending Review" ["Headers_remove,doc_link"]="https://github.com/armbian/config/wiki#System" ) @@ -798,13 +798,13 @@ function Headers_remove () { } module_options+=( -["sanitize_input,author"]="https://github.com/Tearran" -["sanitize_input,ref_link"]="https://github.com/armbian/config/blob/master/debian-config-jobs#L160" -["sanitize_input,feature"]="Headers_remove" -["sanitize_input,desc"]="Remove Linux headers" -["sanitize_input,example"]="if ! is_package_manager_running; then, REMOVE_PKG=\"linux-headers-*\", if [[ -n $(dpkg -l | grep linux-headers) ]]; then, debconf-apt-progress -- apt-get -y purge ${REMOVE_PKG}, rm -rf /usr/src/linux-headers*, else, debconf-apt-progress -- apt-get -y install ${INSTALL_PKG}, fi, # cleanup, apt clean, debconf-apt-progress -- apt -y autoremove,fi" +["sanitize_input,author"]="" +["sanitize_input,ref_link"]="" +["sanitize_input,feature"]="sanitize_input" +["sanitize_input,desc"]="sanitize input cli" +["sanitize_input,example"]="sanitize_input" ["sanitize_input,status"]="Pending Review" -["sanitize_input,doc_link"]="https://github.com/armbian/config/wiki#System" +["sanitize_input,doc_link"]="" ) # # sanitize input cli diff --git a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Command.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Command.md deleted file mode 100644 index 2a11d2e0..00000000 --- a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Command.md +++ /dev/null @@ -1,55 +0,0 @@ - -## CLI options -Command ine options. - -Use: - - armbian-config --help - -Outputs: -~~~ -Usage: armbian-configng [option] [arguments] - - --help - Display this help message. - main=Help - Display Legacy Options (Backward Compatible) - - --cli S01 - Enable Armbina kernal upgrades - --cli S02 - Disable Armbina kernal upgrades - --cli S03 - Edit the boot enviroment (WIP) - --cli S04 - Install Linux headers - --cli S05 - Remove Linux headers - --cli BT0 - Install Bluetooth support - --cli BT1 - Remove Bluetooth support - --cli BT3 - Bluetooth Discover - --cli IR0 - Install Infrared support - --cli IR1 - Uninstall Infrared support - --cli N00 - Manage wifi network connections - --cli N01 - Advanced Edit /etc/network/interface - --cli N02 - Disconect and forget all wifi connections (Advanced) - --cli N03 - Toggle system IPv6/IPv4 internet protical - --cli N04 - (WIP) Setup Hotspot/Access point - --cli L00 - Change Globla timezone (WIP) - --cli L01 - Change Locales reconfigure the language and charitorset - --cli L02 - Change Keyboard layout - --cli L03 - Change APT mirrors - --cli I00 - Update Application Repository - --cli I01 - CLI System Monitor -~~~ - -## Legacy options -deprecated - -Use: - - armbian-config main=Help - -Outputs: -~~~ -Legacy Options (Backward Compatible) -Please use 'armbian-config --help' for more information. - -Usage: armbian-configng main=[arguments] selection=[options] - - armbian-configng main=System selection=Headers - Install headers: - armbian-configng main=System selection=Headers_remove - Remove headers: -~~~ diff --git a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md deleted file mode 100644 index 9224fb54..00000000 --- a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Functions.md +++ /dev/null @@ -1,44 +0,0 @@ - -# Helper functions -A list of the heper function ie bash prosedures used in Jobs file. - -| Feature | Description | Credit | Reference | Documents | Status | -|:------- | ----------- | ----------- |:---------:|:---------:|:------:| -| see_cli_legacy | Generate a Help message legacy cli commands. | Tearran | X | X | source link Needed | -| set_runtime_variables | Run time varibales Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L136) | X | Active | -| see_function_table_md | Generate this markdown table of all module_options | Tearran | X | X | source link Needed | -| show_menu | Display a menu from pipe | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L550) | X | Active | -| generate_top_menu | Build the main menu from a object | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L370) | X | Active | -| is_package_manager_running | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L111) | X | Active | -| check_desktop | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L16) | X | Active | -| generate_readme | Generate Document files. | Joey Turner | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L17) | X | review | -| execute_command | Needed by generate_menu | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L464) | X | Active | -| get_user_continue | Display a Yes/No dialog box and prosees continue/exit | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L588) | X | Active | -| show_message | Display a message box | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#486) | [Document](https://github.com/armbian/configng/wiki/interface) | Review | -| connect_bt_interface | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L221) | X | Active | -| set_safe_boot | Freeze/unhold Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L188) | X | Active | -| see_current_apt | Check when apt list was last updated | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#667) | X | Active | -| check_if_installed | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L88) | X | Active | -| generate_svg | Generate 'Armbian CPU logo' SVG for docunment file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L201) | X | review | -| Headers_remove | Remove Linux headers | https://github.com/Tearran | [Source](https://github.com/armbian/config/blob/master/debian-config-jobs#L160) | [Document](https://github.com/armbian/config/wiki#System) | Review | -| toggle_menu_item | Show or hide menu items based on conditions | Joey Turner | X | X | source link Needed | -| update_submenu_data | Update submenu descriptions based on conditions | Joey Turner | X | X | source link Needed | -| Headers_remove | Remove Linux headers | https://github.com/Tearran | [Source](https://github.com/armbian/config/blob/master/debian-config-jobs#L160) | [Document](https://github.com/armbian/config/wiki#System) | Review | -| check_ip_version | Check if a domain is reachable via IPv4 and IPv6 | Joey Turner | X | X | source link Needed | -| set_header_remove | Migrated procedures from Armbian config. | Igor Pecovnik | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L64) | X | Active | -| generate_menu | Generate a submenu from a parent_id | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L416) | X | Active | -| see_jq_menu_list | Generate a markdown list json objects using jq. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L304) | X | review | -| generate_jobs_from_json | Generate jobs from JSON file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L253) | X | review | -| Headers_install | Install kernel headers | https://github.com/Tearran | [Source](https://github.com/armbian/config/blob/master/debian-config-jobs#L160) | [Document](https://github.com/armbian/config/wiki#System) | Review | -| hotspot_setup | Set up a WiFi hotspot on the device | Joey Turner | X | X | source link Needed | -| toggle_ipv6 | Toggle IPv6 on or off | Joey Turner | X | X | source link Needed | -| see_cli_list | Generate a Help message for cli commands. | Tearran | X | X | source link Needed | -| generate_json | Generate JSON-like object file. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L174) | X | review | -| set_colors | Change the background color of the terminal or dialoge box | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#L287) | X | Active | -| serve_doc | Serve the edit and debug server. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L106) | X | review | -| update_json_data | Update JSON data with system information | Joey Turner | X | X | source link Needed | -| show_infobox | pipe line strings to a infobox | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#512) | X | Active | -| see_use | Show the usage of the functions. | Tearran | [Source](https://github.com/armbian/configng/blob/main/lib/armbian-configng/config.ng.functions.sh#L145) | X | review | -| see_ping | Check the internet connection with fallback DNS | Joey Turner | [Source](https://github.com/Tearran/configng/blob/main/config.ng.functions.sh#632) | X | review | -| get_user_continue_secure | Secure version of get_user_continue | Joey Turner | X | X | source link Needed | - diff --git a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Menu.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Menu.md deleted file mode 100644 index 08b1b9fb..00000000 --- a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG-Menu.md +++ /dev/null @@ -1,259 +0,0 @@ - -# Menu list. -armbian-config jobs list. - -### S01 - -Enable Armbina kernal upgrades - -Jobs: - -~~~ -set_safe_boot unhold -~~~ - -### S02 - -Disable Armbina kernal upgrades - -Jobs: - -~~~ -set_safe_boot freeze -~~~ - -### S03 - -Edit the boot enviroment (WIP) - -Jobs: - -~~~ -get_user_continue "This will open /boot/armbianEnv.txt file to edit -CTRL+S to save -CTLR+X to exit -would you like to continue?" process_input -nano /boot/armbianEnv.txt -~~~ - -### S04 - -Install Linux headers - -Jobs: - -~~~ -Headers_install -~~~ - -### S05 - -Remove Linux headers - -Jobs: - -~~~ -Headers_remove -~~~ - -### BT0 - -Install Bluetooth support - -Jobs: - -~~~ -see_current_apt -debconf-apt-progress -- apt-get -y install bluetooth bluez bluez-tools -check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y --no-install-recommends install pulseaudio-module-bluetooth blueman -~~~ - -### BT1 - -Remove Bluetooth support - -Jobs: - -~~~ -see_current_apt -debconf-apt-progress -- apt-get -y remove bluetooth bluez bluez-tools -check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y remove pulseaudio-module-bluetooth blueman -debconf-apt-progress -- apt -y -qq autoremove -~~~ - -### BT3 - -Bluetooth Discover - -Jobs: - -~~~ -get_user_continue "Verify that your Bluetooth device is discoverable!" process_input ; connect_bt_interface -~~~ - -### IR0 - -Install Infrared support - -Jobs: - -~~~ -see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc -~~~ - -### IR1 - -Uninstall Infrared support - -Jobs: - -~~~ -see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc -~~~ - -### N00 - -Manage wifi network connections - -Jobs: - -~~~ -nmtui connect -~~~ - -### N01 - -Advanced Edit /etc/network/interface - -Jobs: - -~~~ -get_user_continue "This will open interface file to edit -CTRL+S to save -CTLR+X to exit -would you like to continue?" process_input -nano /etc/network/interfaces -~~~ - -### N02 - -Disconect and forget all wifi connections (Advanced) - -Jobs: - -~~~ -get_user_continue "Disconect and forget all wifi connections -Would you like to contiue?" process_input -LC_ALL=C nmcli --fields UUID,TIMESTAMP-REAL,TYPE con show | grep wifi | awk '{print $1}' | while read line; \ -do nmcli con delete uuid $line; done > /dev/null -~~~ - -### N03 - -Toggle system IPv6/IPv4 internet protical - -Jobs: - -~~~ -get_user_continue "This will toggle your internet protical -Would you like to contiue?" process_input -toggle_ipv6 | show_infobox -~~~ - -### N04 - -(WIP) Setup Hotspot/Access point - -Jobs: - -~~~ -get_user_continue "This operation will install necessary software and add configuration files. -Do you wish to continue?" process_input -hotspot_setup -~~~ - -### L00 - -Change Globla timezone (WIP) - -Jobs: - -~~~ -dpkg-reconfigure tzdata -~~~ - -### L01 - -Change Locales reconfigure the language and charitorset - -Jobs: - -~~~ -dpkg-reconfigure locales -source /etc/default/locale ; sed -i "s/^LANGUAGE=.*/LANGUAGE=$LANG/" /etc/default/locale -export LANGUAGE=$LANG -~~~ - -### L02 - -Change Keyboard layout - -Jobs: - -~~~ -dpkg-reconfigure keyboard-configuration ; setupcon -~~~ - -### L03 - -Change APT mirrors - -Jobs: - -~~~ -get_user_continue "This is only a frontend test" process_input -~~~ - -### I00 - -Update Application Repository - -Jobs: - -~~~ -get_user_continue "This will update apt" process_input -debconf-apt-progress -- apt update -~~~ - -### I01 - -CLI System Monitor - -Jobs: - -~~~ -armbianmonitor -m | show_infobox -~~~ - -### H00 - -About This systme. (WIP) - -Jobs: - -~~~ -show_message <<< "This app is to help exicute prosedures to configure your system - -Some option may not work on manualy modified sytemes" -~~~ - -### H02 - -List of Config function(WIP) - -Jobs: - -~~~ -show_message <<< see_use -~~~ - diff --git a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG.md b/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG.md deleted file mode 100644 index 8637eca5..00000000 --- a/share/doc/armbian-configng/User-Guide_Armbian-ConfigNG.md +++ /dev/null @@ -1,162 +0,0 @@ - -# Armbian configuration utility -Utility for configuring your board, divided into four main sections: - -- System - system and security settings, -- Network - wired, wireless, Bluetooth, access point, -- Personal - timezone, language, hostname, -- Software - system and 3rd party software install. - - -- ## **System** - - **S01** - Description: Enable Armbina kernal upgrades - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s01) - - **S02** - Description: Disable Armbina kernal upgrades - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s02) - - **S03** - Description: Edit the boot enviroment (WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#s03) - - **S04** - Description: Install Linux headers - - Status: [Pending Review](https://github.com/armbian/config/wiki#System) - - **S05** - Description: Remove Linux headers - - Status: [Pending Review](https://github.com/armbian/config/wiki#System) - - -- ## **Network** - - **BT0** - Description: Install Bluetooth support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt0) - - **BT1** - Description: Remove Bluetooth support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt1) - - **BT3** - Description: Bluetooth Discover - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#bt3) - - **IR0** - Description: Install Infrared support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#ir0) - - **IR1** - Description: Uninstall Infrared support - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#ir1) - - **N00** - Description: Manage wifi network connections - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n00) - - **N01** - Description: Advanced Edit /etc/network/interface - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n01) - - **N02** - Description: Disconect and forget all wifi connections (Advanced) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n02) - - **N03** - Description: Toggle system IPv6/IPv4 internet protical - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#n03) - - **N04** - Description: (WIP) Setup Hotspot/Access point - - Status: [WIP](https://github.com/armbian/configng/wiki/Menu#n04) - - -- ## **Localisation** - - **L00** - Description: Change Globla timezone (WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l00) - - **L01** - Description: Change Locales reconfigure the language and charitorset - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l01) - - **L02** - Description: Change Keyboard layout - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l02) - - **L03** - Description: Change APT mirrors - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#l03) - - -- ## **Software** - - **I00** - Description: Update Application Repository - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#i00) - - **I01** - Description: CLI System Monitor - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#i01) - - -- ## **Help** - - **H00** - Description: About This systme. (WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#h00) - - **H02** - Description: List of Config function(WIP) - - Status: [Active](https://github.com/armbian/configng/wiki/Menu#h02) - - -*** - -## Development - -To clone this development branch, run the following commands: - -~~~ - git clone https://github.com/armbian/configng - cd configng - ./armbian-configng --help -~~~ - -## Install latest release -dowload .deb package: - -~~~ -{ - latest_release=$(curl -s https://api.github.com/repos/armbian/configng/releases/latest) - deb_url=$(echo "$latest_release" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url') - curl -LO "$deb_url" - deb_file=$(echo "$deb_url" | awk -F"/" '{print $NF}') - sudo dpkg -i "$deb_file" - sudo dpkg --configure -a - sudo apt --fix-broken install -} -~~~ - -*** - -## CLI options -Command ine options. - -Use: -~~~ - armbian-config --help -~~~ - -Outputs: -~~~ -Usage: armbian-configng [option] [arguments] - - --help - Display this help message. - main=Help - Display Legacy Options (Backward Compatible) - - --cli S01 - Enable Armbina kernal upgrades - --cli S02 - Disable Armbina kernal upgrades - --cli S03 - Edit the boot enviroment (WIP) - --cli S04 - Install Linux headers - --cli S05 - Remove Linux headers - --cli BT0 - Install Bluetooth support - --cli BT1 - Remove Bluetooth support - --cli BT3 - Bluetooth Discover - --cli IR0 - Install Infrared support - --cli IR1 - Uninstall Infrared support - --cli N00 - Manage wifi network connections - --cli N01 - Advanced Edit /etc/network/interface - --cli N02 - Disconect and forget all wifi connections (Advanced) - --cli N03 - Toggle system IPv6/IPv4 internet protical - --cli N04 - (WIP) Setup Hotspot/Access point - --cli L00 - Change Globla timezone (WIP) - --cli L01 - Change Locales reconfigure the language and charitorset - --cli L02 - Change Keyboard layout - --cli L03 - Change APT mirrors - --cli I00 - Update Application Repository - --cli I01 - CLI System Monitor -~~~ - -## Legacy options -Backward Compatible options. - -Use: - - armbian-config main=Help - -Outputs: -~~~ -Legacy Options (Backward Compatible) -Please use 'armbian-config --help' for more information. - -Usage: armbian-configng main=[arguments] selection=[options] - - armbian-configng main=System selection=Headers - Install headers: - armbian-configng main=System selection=Headers_remove - Remove headers: -~~~ - - - -## Note: -> -> The Bash procedures embedded within the JSON structure are meticulously designed with a focus on clear naming conventions and the simplicity of key pairs. These procedures serve multiple purposes, including facilitating the generation of content in various formats, such as Whiptail, Markdown, json out and others. Moreover, they are utilized for evaluation and execution of commands outlined in the JSON structure. -> From 5ba6109b698c975fae01f83e5e8586dbd541da5c Mon Sep 17 00:00:00 2001 From: Tearran Date: Sat, 6 Jul 2024 00:11:30 -0600 Subject: [PATCH 5/8] add exit messages for running none sudo/root use. --- README.md | 62 +++++++++++------------ bin/armbian-configng | 32 ++++++------ lib/armbian-configng/config.ng.jobs.json | 24 ++++----- lib/armbian-configng/config.ng.runtime.sh | 12 ++--- 4 files changed, 66 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 4a641593..b1646b36 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Armbian Configuration Utility -Thu Jul 4 09:10:49 AM MDT 2024 +Updated: Thu Jul 4 10:57:01 PM MDT 2024 Utility for configuring your board, adjusting services, and installing applications. It comes with Armbian by default. @@ -18,16 +18,16 @@ sudo armbian-config - ## **Network** - - **BT0** - Install Bluetooth support - - **BT1** - Remove Bluetooth support - - **BT3** - Bluetooth Discover - - **IR0** - Install Infrared support - - **IR1** - Uninstall Infrared support - - **N00** - Manage wifi network connections - - **N01** - Advanced Edit /etc/network/interface - - **N02** - Disconect and forget all wifi connections (Advanced) - - **N03** - Toggle system IPv6/IPv4 internet protical - - **N04** - (WIP) Setup Hotspot/Access point + - **N00** - Install Bluetooth support + - **N01** - Remove Bluetooth support + - **N02** - Bluetooth Discover + - **N03** - Install Infrared support + - **N04** - Uninstall Infrared support + - **N05** - Manage wifi network connections + - **N06** - Advanced Edit /etc/network/interface + - **N07** - Disconect and forget all wifi connections (Advanced) + - **N08** - Toggle system IPv6/IPv4 internet protical + - **N09** - (WIP) Setup Hotspot/Access point - ## **Localisation** @@ -86,16 +86,16 @@ Usage: armbian-configng [option] [arguments] --cli S03 - Edit the boot enviroment (WIP) --cli S04 - Install Linux headers --cli S05 - Remove Linux headers - --cli BT0 - Install Bluetooth support - --cli BT1 - Remove Bluetooth support - --cli BT3 - Bluetooth Discover - --cli IR0 - Install Infrared support - --cli IR1 - Uninstall Infrared support - --cli N00 - Manage wifi network connections - --cli N01 - Advanced Edit /etc/network/interface - --cli N02 - Disconect and forget all wifi connections (Advanced) - --cli N03 - Toggle system IPv6/IPv4 internet protical - --cli N04 - (WIP) Setup Hotspot/Access point + --cli N00 - Install Bluetooth support + --cli N01 - Remove Bluetooth support + --cli N02 - Bluetooth Discover + --cli N03 - Install Infrared support + --cli N04 - Uninstall Infrared support + --cli N05 - Manage wifi network connections + --cli N06 - Advanced Edit /etc/network/interface + --cli N07 - Disconect and forget all wifi connections (Advanced) + --cli N08 - Toggle system IPv6/IPv4 internet protical + --cli N09 - (WIP) Setup Hotspot/Access point --cli L00 - Change Globla timezone (WIP) --cli L01 - Change Locales reconfigure the language and charitorset --cli L02 - Change Keyboard layout @@ -190,7 +190,7 @@ Jobs: Headers_remove ~~~ -### BT0 +### N00 Install Bluetooth support @@ -202,7 +202,7 @@ debconf-apt-progress -- apt-get -y install bluetooth bluez bluez-tools check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y --no-install-recommends install pulseaudio-module-bluetooth blueman ~~~ -### BT1 +### N01 Remove Bluetooth support @@ -215,7 +215,7 @@ check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y remove pul debconf-apt-progress -- apt -y -qq autoremove ~~~ -### BT3 +### N02 Bluetooth Discover @@ -225,7 +225,7 @@ Jobs: get_user_continue "Verify that your Bluetooth device is discoverable!" process_input ; connect_bt_interface ~~~ -### IR0 +### N03 Install Infrared support @@ -235,7 +235,7 @@ Jobs: see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc ~~~ -### IR1 +### N04 Uninstall Infrared support @@ -245,7 +245,7 @@ Jobs: see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc ~~~ -### N00 +### N05 Manage wifi network connections @@ -255,7 +255,7 @@ Jobs: nmtui connect ~~~ -### N01 +### N06 Advanced Edit /etc/network/interface @@ -269,7 +269,7 @@ would you like to continue?" process_input nano /etc/network/interfaces ~~~ -### N02 +### N07 Disconect and forget all wifi connections (Advanced) @@ -282,7 +282,7 @@ LC_ALL=C nmcli --fields UUID,TIMESTAMP-REAL,TYPE con show | grep wifi | awk '{p do nmcli con delete uuid $line; done > /dev/null ~~~ -### N03 +### N08 Toggle system IPv6/IPv4 internet protical @@ -294,7 +294,7 @@ Would you like to contiue?" process_input toggle_ipv6 | show_infobox ~~~ -### N04 +### N09 (WIP) Setup Hotspot/Access point diff --git a/bin/armbian-configng b/bin/armbian-configng index 949dfab4..d25dc307 100755 --- a/bin/armbian-configng +++ b/bin/armbian-configng @@ -16,7 +16,6 @@ script_dir="$(dirname "$0")" # Define the lib directory one level up from the script directory lib_dir="$script_dir/../lib/armbian-configng" doc_dir="$script_dir/../share/doc/armbian-configng" -# Check for the existence of the config.ng.jobs.json file in the lib directory json_file="$lib_dir/config.ng.jobs.json" # @@ -64,25 +63,33 @@ case "$1" in fi ;; "--help") - see_cli_list - exit 0 + see_cli_list + exit 0 ;; "--doc") - if [[ $EUID != 0 ]]; then - generate_readme - exit 0 - else - echo "Error: You must run this command as a normal user" - exit 1 - fi + if [[ $EUID != 0 ]]; then + generate_readme + exit 0 + else + echo "Error: You must run this command as a normal user" + exit 1 + fi ;; "--cli") + if [[ $EUID != 0 ]]; then + echo "Error: The --cli option requires root privileges. Please run as root or use sudo." + exit 1 + fi shift args=$(sanitize_input "$@") execute_command "$args" exit 0 ;; "--api") + if [[ $EUID != 0 ]]; then + echo "Error: The --api option requires root privileges. Please run as root or use sudo." + exit 1 + fi shift args=$(sanitize_input "$@") "$args" @@ -94,11 +101,6 @@ case "$1" in exit 0 ;; "main="*) - cat << EOF -Legacy help commands. -Please use 'armbian-config --help' for more information. - -EOF declare -A main_map main_map=( # map name to menu catagory diff --git a/lib/armbian-configng/config.ng.jobs.json b/lib/armbian-configng/config.ng.jobs.json index aa63efa5..3d41f374 100644 --- a/lib/armbian-configng/config.ng.jobs.json +++ b/lib/armbian-configng/config.ng.jobs.json @@ -74,7 +74,7 @@ "show": true, "sub": [ { - "id": "BT0", + "id": "N00", "description": "Install Bluetooth support", "command": [ "see_current_apt ", @@ -88,7 +88,7 @@ "author": "" }, { - "id": "BT1", + "id": "N01", "description": "Remove Bluetooth support", "command": [ "see_current_apt ", @@ -103,7 +103,7 @@ "author": "" }, { - "id": "BT3", + "id": "N02", "description": "Bluetooth Discover", "command": [ "get_user_continue \"Verify that your Bluetooth device is discoverable!\" process_input ; connect_bt_interface" @@ -116,31 +116,31 @@ "author": "" }, { - "id": "IR0", + "id": "N03", "description": "Install Infrared support", "command": [ "see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc" ], "show": false, - "status": "Active", + "status": "Testing", "doc_link": "", "src_reference": "", "author": "" }, { - "id": "IR1", + "id": "N04", "description": "Uninstall Infrared support", "command": [ "see_current_apt; debconf-apt-progress -- apt-get -y --no-install-recommends install lirc" ], "show": false, - "status": "Active", + "status": "Testing", "doc_link": "", "src_reference": "", "author": "" }, { - "id": "N00", + "id": "N05", "description": "Manage wifi network connections", "command": [ "nmtui connect" @@ -152,7 +152,7 @@ "author": "" }, { - "id": "N01", + "id": "N06", "description": "Advanced Edit /etc/network/interface", "command": [ "get_user_continue \"This will open interface file to edit\nCTRL+S to save\nCTLR+X to exit\nwould you like to continue?\" process_input", @@ -165,7 +165,7 @@ "author": "" }, { - "id": "N02", + "id": "N07", "description": "Disconect and forget all wifi connections (Advanced)", "command": [ "get_user_continue \"Disconect and forget all wifi connections\nWould you like to contiue?\" process_input", @@ -179,7 +179,7 @@ "author": "" }, { - "id": "N03", + "id": "N08", "description": "Toggle system IPv6/IPv4 internet protical", "command": [ "get_user_continue \"This will toggle your internet protical\nWould you like to contiue?\" process_input", @@ -192,7 +192,7 @@ "author": "" }, { - "id": "N04", + "id": "N09", "description": "(WIP) Setup Hotspot/Access point", "command": [ "get_user_continue \"This operation will install necessary software and add configuration files.\nDo you wish to continue?\" process_input", diff --git a/lib/armbian-configng/config.ng.runtime.sh b/lib/armbian-configng/config.ng.runtime.sh index 2ddb3b37..2d28c8d5 100644 --- a/lib/armbian-configng/config.ng.runtime.sh +++ b/lib/armbian-configng/config.ng.runtime.sh @@ -86,18 +86,18 @@ update_submenu_data "Install" "I0" "$installed_software" # Conditional submenu updates based on network type if [ "$network_adapter" = "IPv6" ]; then - update_submenu_data "Network" "N03" "IPV6" + update_submenu_data "Network" "N08" "IPV6" else - update_submenu_data "Network" "N03" "IPV4" + update_submenu_data "Network" "N08" "IPV4" fi # Bluetooth menu item visibility if [ "$bluetooth_status" = false ] || [ "$bluez_status" = false ] || [ "$bluez_tools_status" = false ]; then - toggle_menu_item "Network" "BT0" "true" - toggle_menu_item "Network" "BT3" "false" + toggle_menu_item "Network" "N00" "true" + toggle_menu_item "Network" "N02" "false" else - toggle_menu_item "Network" "BT1" "true" - toggle_menu_item "Network" "BT3" "true" + toggle_menu_item "Network" "N01" "true" + toggle_menu_item "Network" "N02" "true" fi if [ "$system_info" ]; then From ded3bc679de8783d676fc808cfceb63a0bcdd6b5 Mon Sep 17 00:00:00 2001 From: mordiaky Date: Sat, 6 Jul 2024 21:37:09 -0500 Subject: [PATCH 6/8] Update config.ng.docs.sh Corrected spelling --- lib/armbian-configng/config.ng.docs.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/armbian-configng/config.ng.docs.sh b/lib/armbian-configng/config.ng.docs.sh index 825cde39..132ab62f 100644 --- a/lib/armbian-configng/config.ng.docs.sh +++ b/lib/armbian-configng/config.ng.docs.sh @@ -60,7 +60,7 @@ sudo apt install armbian-config *** ## CLI options -Command ine options. +Command line options. Use: ~~~ @@ -89,7 +89,7 @@ $(see_cli_legacy) ## Development -Develoment is divided into three sections: +Development is divided into three sections: Click for more info: @@ -129,7 +129,7 @@ This section outlines the runtime environment to check configurations and status ## Testing and contributing
-Get Devleopment +Get Development Install the dependencys: ~~~ @@ -292,7 +292,7 @@ module_options+=( ["generate_svg,author"]="Joey Turner" ["generate_svg,ref_link"]="" ["generate_svg,feature"]="generate_svg" - ["generate_svg,desc"]="Generate 'Armbian CPU logo' SVG for docunment file." + ["generate_svg,desc"]="Generate 'Armbian CPU logo' SVG for document file." ["generate_svg,example"]="generate_svg" ["generate_svg,status"]="review" ["generate_svg,doc_link"]="" From 4a5b40c450d02d432209c452fe9468cddd8a95cf Mon Sep 17 00:00:00 2001 From: mordiaky Date: Sat, 6 Jul 2024 21:41:17 -0500 Subject: [PATCH 7/8] Update config.ng.jobs.json Fixed spelling in json object --- lib/armbian-configng/config.ng.jobs.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/armbian-configng/config.ng.jobs.json b/lib/armbian-configng/config.ng.jobs.json index 3d41f374..b3ea4621 100644 --- a/lib/armbian-configng/config.ng.jobs.json +++ b/lib/armbian-configng/config.ng.jobs.json @@ -7,7 +7,7 @@ "sub": [ { "id": "S01", - "description": "Enable Armbina kernal upgrades", + "description": "Enable Armbina kernel upgrades", "command": [ "set_safe_boot unhold" ], @@ -19,7 +19,7 @@ }, { "id": "S02", - "description": "Disable Armbina kernal upgrades", + "description": "Disable Armbina kernel upgrades", "command": [ "set_safe_boot freeze" ], @@ -31,7 +31,7 @@ }, { "id": "S03", - "description": "Edit the boot enviroment (WIP)", + "description": "Edit the boot environment (WIP)", "command": [ "get_user_continue \"This will open /boot/armbianEnv.txt file to edit\nCTRL+S to save\nCTLR+X to exit\nwould you like to continue?\" process_input", "nano /boot/armbianEnv.txt" @@ -166,9 +166,9 @@ }, { "id": "N07", - "description": "Disconect and forget all wifi connections (Advanced)", + "description": "Disconnect and forget all wifi connections (Advanced)", "command": [ - "get_user_continue \"Disconect and forget all wifi connections\nWould you like to contiue?\" process_input", + "get_user_continue \"Disconnect and forget all wifi connections\nWould you like to contiue?\" process_input", "LC_ALL=C nmcli --fields UUID,TIMESTAMP-REAL,TYPE con show | grep wifi | awk '{print $1}' | while read line; \\ ", "do nmcli con delete uuid $line; done > /dev/null" ], @@ -180,9 +180,9 @@ }, { "id": "N08", - "description": "Toggle system IPv6/IPv4 internet protical", + "description": "Toggle system IPv6/IPv4 internet protocol", "command": [ - "get_user_continue \"This will toggle your internet protical\nWould you like to contiue?\" process_input", + "get_user_continue \"This will toggle your internet protocol\nWould you like to contiue?\" process_input", "toggle_ipv6 | show_infobox" ], "show": true, @@ -213,7 +213,7 @@ "sub": [ { "id": "L00", - "description": "Change Globla timezone (WIP)", + "description": "Change Global timezone (WIP)", "command": [ "dpkg-reconfigure tzdata" ], @@ -225,7 +225,7 @@ }, { "id": "L01", - "description": "Change Locales reconfigure the language and charitorset", + "description": "Change Locales reconfigure the language and character set", "command": [ "dpkg-reconfigure locales", "source /etc/default/locale ; sed -i \"s/^LANGUAGE=.*/LANGUAGE=$LANG/\" /etc/default/locale", @@ -302,7 +302,7 @@ "sub": [ { "id": "H00", - "description": "About This systme. (WIP)", + "description": "About This system. (WIP)", "command": [ "show_message <<< \"This app is to help exicute prosedures to configure your system\n\nSome option may not work on manualy modified sytemes\"" ], @@ -327,4 +327,4 @@ ] } ] -} \ No newline at end of file +} From baee3e7e19b7100ac2000da4381795f01f38d667 Mon Sep 17 00:00:00 2001 From: mordiaky Date: Sat, 6 Jul 2024 21:45:10 -0500 Subject: [PATCH 8/8] Update config.ng.functions.sh corrected spelling --- lib/armbian-configng/config.ng.functions.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/armbian-configng/config.ng.functions.sh b/lib/armbian-configng/config.ng.functions.sh index 0ba99424..a6dd5a7c 100644 --- a/lib/armbian-configng/config.ng.functions.sh +++ b/lib/armbian-configng/config.ng.functions.sh @@ -133,7 +133,7 @@ module_options+=( ["set_runtime_variables,author"]="Igor Pecovnik" ["set_runtime_variables,ref_link"]="" ["set_runtime_variables,feature"]="set_runtime_variables" -["set_runtime_variables,desc"]="Run time varibales Migrated procedures from Armbian config." +["set_runtime_variables,desc"]="Run time variables Migrated procedures from Armbian config." ["set_runtime_variables,example"]="set_runtime_variables" ["set_runtime_variables,status"]="Active" ) @@ -275,7 +275,7 @@ module_options+=( ["set_colors,author"]="Joey Turner" ["set_colors,ref_link"]="" ["set_colors,feature"]="set_colors" -["set_colors,desc"]="Change the background color of the terminal or dialoge box" +["set_colors,desc"]="Change the background color of the terminal or dialog box" ["set_colors,example"]="set_colors 0-7" ["set_colors,doc_link"]="" ["set_colors,status"]="Active" @@ -508,7 +508,7 @@ module_options+=( ["show_infobox,author"]="Joey Turner" ["show_infobox,ref_link"]="" ["show_infobox,feature"]="show_infobox" -["show_infobox,desc"]="pipe line strings to a infobox " +["show_infobox,desc"]="pipeline strings to a infobox " ["show_infobox,example"]="show_infobox <<< 'hello world' ; " ["show_infobox,doc_link"]="" ["show_infobox,status"]="Active" @@ -584,7 +584,7 @@ module_options+=( ["get_user_continue,author"]="Joey Turner" ["get_user_continue,ref_link"]="" ["get_user_continue,feature"]="get_user_continue" -["get_user_continue,desc"]="Display a Yes/No dialog box and prosees continue/exit" +["get_user_continue,desc"]="Display a Yes/No dialog box and process continue/exit" ["get_user_continue,example"]="get_user_continue 'Do you wish to continue?' process_input" ["get_user_continue,doc_link"]="" ["get_user_continue,status"]="Active" @@ -824,4 +824,4 @@ sanitize_input() { - \ No newline at end of file +

- Armbian logo -
- Armbian ConfigNG -
-
CodeFactor -