GNU GPL copyright notices/license notices added

This commit is contained in:
Jesse Gardner 2021-07-15 18:56:36 -07:00
parent d290211d7e
commit cc72e7ab80
11 changed files with 1424 additions and 819 deletions

View File

@ -31,3 +31,12 @@ The [manual](https://git.j-g-web.com/jesse/qq2clone/src/branch/master/man.md) is
## Why use Bash and C when this could all be written in Python?
Just to improve my Bash skills and gain a tiny bit of familiarity with C. Writing this in Python would certainly have been easier.
# Copyright 2021, Jesse Gardner
All files present in the qq2clone git repository are released under the
the GNU GPL v2 license, made available in the [license
file](https://git.j-g-web.com/jesse/qq2clone/raw/branch/master/LICENSE)
above. All files contained in the qq2clone git repository, beginning from
the first commit and continuing to the present, are offered solely under
the terms of the GNU GPL v2 license.

View File

@ -1,10 +1,29 @@
#!/bin/bash
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
# Generate all files that need to be generated
declare -a inst_arc_files=( qq2clone qq2clone.1 qq2clone_completion.bash )
declare -a req_files=( "${arc_files[@]}" inst_fragment.bash "lv_api_do.c"
man.pandoc )
man.pandoc LICENSE)
# Check for required files
@ -28,7 +47,7 @@ echo "Generating qq2clone"
while IFS= read -r line; do
if [[ "$line" == "#REPLACE WITH ARCHIVE#" ]]; then
echo "archive='"
tar -cz lv_api_do | base64
tar -cz LICENSE lv_api_do | base64
echo "'"
else
echo "$line"
@ -40,6 +59,27 @@ done < qq2clone_noarchive > qq2clone
echo "Generating installer script"
{
echo "#!/bin/bash"
echo
cat <<EOF
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
EOF
echo
echo "# This script generated automatically by gen_installer.bash"
echo

View File

@ -1,3 +1,22 @@
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
# Tail end of the installer script, following the tar archive
[[ -z "$HOME" ]] &&

View File

@ -3,6 +3,27 @@
#include <string.h>
#include <libvirt/libvirt.h>
/*
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
*/
void pr_bad();
void pr_conn_bad();
void pr_conn_good();

25
man.md
View File

@ -277,6 +277,12 @@ Otherwise, all templates are checked
List all configuration options and their current value, get info about a
particular option, or edit one
**copyright**
Output copyright information
**license**
Output the GNU GPL v2 complete text
**setup**
Perform initial setup. This is run automatically by the installer
script, but can be invoked manually to reset the database to its initial
@ -501,6 +507,25 @@ If you find any worse bugs, and Im sure I missed some, please let me
know and I will fix them as time allows. Contact me at:
jgardner7289@protonmail.com
COPYRIGHT 2021, Jesse Gardner
=============================
This file is part of qq2clone.
qq2clone is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 2 of the License, or (at your
option) any later version.
qq2clone is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along
with qq2clone. If not, see
<a href="https://www.gnu.org/licenses/" class="uri">https://www.gnu.org/licenses/</a>.
EXIT VALUES
===========

View File

@ -268,6 +268,12 @@ Otherwise, all templates are checked
: List all configuration options and their current value, get info about a
particular option, or edit one
**copyright**
: Output copyright information
**license**
: Output the GNU GPL v2 complete text
**setup**
: Perform initial setup. This is run automatically by the installer script,
but can be invoked manually to reset the database to its initial fresh state
@ -487,6 +493,23 @@ If you find any worse bugs, and I'm sure I missed some, please let me know
and I will fix them as time allows. Contact me at:
jgardner7289@protonmail.com
# COPYRIGHT 2021, Jesse Gardner
This file is part of qq2clone.
qq2clone is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
qq2clone is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with qq2clone. If not, see <https://www.gnu.org/licenses/>.
# EXIT VALUES
**10**

376
qq2clone
View File

@ -1,6 +1,25 @@
#!/bin/bash
#shellcheck disable=1090 disable=2012
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
#--------------------#
#@@@@@@@@@@@@@@@@@@@@#
#---LITERAL VALUES---#
@ -148,8 +167,8 @@ lv_api_do_check ()
{
local loc="/run/user/${UID}"
[[ -e "${loc}/lv_api_do" ]] && return
cd "$loc"
echo "$archive" | base64 -d | tar -zx
cd "$loc" || unexpected_error lv_api_do_check
echo "$archive" | base64 -d | tar -zx lv_api_do
}
#=========================================================================#
lv_api_do_close ()
@ -509,10 +528,11 @@ echo ' --no-run/-n --quiet/-q --quieter/-Q --run/-r --spicy/-S'
echo ' --storage/-s (filepath/pool-name) --template/-t (name)'
echo ' --use-spice/-g --verbose/-v --virt-viewer/-V'
echo
echo " commands: check clone config connect copy-template delete-template"
echo " destroy edit exec import-template list list-templates"
echo " modify-template restore resume rm rm-wipe rm-shred save"
echo " save-rm start suspend"
echo " commands: check clone config connect copy-template copyright"
echo " delete-template destroy edit exec import-template"
echo " license list list-templates modify-template restore"
echo " resume rm rm-wipe rm-shred save save-rm setup start"
echo " suspend"
echo
echo " For more information, see: man qq2clone"
return 0
@ -2344,6 +2364,9 @@ virsh uri |& grep -qi ^QEMU ||
if [[ "$com" == "check" ]]; then
exec_com_check "$@"
exit 0
elif [[ "$com" == "copyright" ]]; then
exec_com_copyright
exit 0
elif [[ "$com" == "config" ]]; then
exec_com_config "$@"
exit 0
@ -2356,6 +2379,9 @@ elif [[ "$com" == "delete-template" ]]; then
elif [[ "$com" == "import-template" ]]; then
exec_com_import_template "$@"
exit 0
elif [[ "$com" == "license" ]]; then
exec_com_license
exit 0
elif [[ "$com" == "list-templates" ]]; then
exec_com_list_templates "$@"
exit 0
@ -2620,6 +2646,25 @@ sqlite3 "insert into TEMPLATES values ('$2','$md5','$disks','1');"
exit 0
}
#=========================================================================#
exec_com_copyright ()
# DESCRIPTION: Output copyright notice to user
# INPUT: None
# OUTPUT: Show copyright notice
# PARAMETERS: None
#=========================================================================#
{
echo "Copyright 2021, Jesse Gardner"
echo
echo "qq2clone and all files in this project are released under the terms"
echo "of the GNU GPL v2. See the full copyright notice at the top of this"
echo "file (the top of the qq2clone bash script)"
echo
echo "To read the full text of the GNU GPL v2 license, use the command:"
echo " qq2clone license"
return 0
}
#=========================================================================#
exec_com_delete_template ()
# DESCRIPTION: Delete an existing template
# INPUT: A template name
@ -2765,6 +2810,17 @@ fi
exit 0
}
#=========================================================================#
exec_com_license ()
# DESCRIPTION: Output GNU GPL v2 license full text
# INPUT: None
# OUTPUT: Show license
# PARAMETERS: None
#=========================================================================#
{
echo "$archive" | base64 -d | tar -Ozx LICENSE
return 0
}
#=========================================================================#
exec_com_list ()
# DESCRIPTION: List clones
# INPUT: Nothing, "all", or "xml"
@ -3158,101 +3214,219 @@ return 0
# ENTRY POINT, at the bottom of this file
archive='
H4sIAAAAAAAAA+1cC3Bb1Zk+kvyQHUe28wAnBCIgYQ2JFTmx8wBcLNty5MWPkMSQFoKsWLKtRg8j
3RscFheDCVvV8W7Y0paZbaewwxa27S6BKZ2w3S0OARJmA5NQlmYHOpgAs3LNgqFx4hDb2v+8rs49
0g20s53d7vhkov/+3/845/znce899xyH9nh9vUGvP4r+eMkJacOGakwrN1Q7RQqpqmqt04kqq5wb
qiqr1zorAa+s3FDlRHbnH7FMWlLjii9mt6OvB+LxwEX0vkj+J5ruczc3mk0mjbegryDMjS6gfC3D
R2rTNrVoI5oPv8vRFSgP+BxBT6anzHpq1fKhdmUWyst0GdJTk0BzLlIfT5GeopK0Xa7Ay7Tapqei
HcnPznCJduToqWiHY2OtoLy1RqKsnk6L3s7M7MqYXVmNniKznvJ45rD/G5k/mcrFl+12MD2ZNiA9
5dXc9qHi/0Py28LsFl1JeZn+FOkpz+8WsMtDXz7x5t3K8jNqhymznvJ+tiYU3LW+ak3IXxEKRtS+
ir6N6yvWVzniUcdarVw4D9ynNre24+YYwRhvTlJHxmP5ndfXtbc88ka0teWa+/7uQOp9ZdG/NXAf
JqaDmD5vYs4vRen+hNDjaMBUQjA+Nsov37/sZOD1cHe7rwQZpH+C/wuy4G5TdrzbQP9rBvpVBvg2
Az+/McD7DPBNKN2XxHSPQb7fM/CzzUD/Lw30bQb5/tjAz4iBn+sM/OQY+LnOAH/YAI8a4D0G+KMG
+BoDfBxlx32gXwq9saSW8nycPwD4VVn0W5i+XdJHMN72BGMKHmFO5G3a3uL1B2KB7mBcCcS2t9SH
opHAdt+uUAB5vd3haMSLb9uK10tVsyqCu4Zo2BeMbA4oO1qaGwLxTh3W6gsTpfpoJBLoVNp6AxGB
BUdxvY/29qaGbUosGOnWwdsUnyIoenzxFl/E1x3wb/PtCTSF4SotbIwFxCybodCuUIjK4mm15mh0
t9pbt1fIEcLTiWOzHgX6ggrqVZU4RAKC0Lnb29mz29vlC4ZQLOALhaKdKK74gxHUC4ZKFzAxJbob
Y1FVQWGmEVBgXgvsUrtQN70Eb519Pm9XMOILBe8JYLPOcC+gOGcWbVw21IXrsLm5qa7eu9ZRpV2t
dVQjuLy1aet2r9OxyVG5TmA3QpumuUpHpcA5Het0hnh+NcO8lwP/c+E3B9F5NY9g+CofIcKl/1kZ
xfOkGdlNdF7Fz4+LgsH5eJZ+mmHq0mAB9vE8m+hNIMOXfOJ8v3N3Me6VL3Mfz50tRJDjm4yv/CXm
89Bpxq/7V8znoAnGr/055s1olvnX7jfM/8hCSkskfIDhVmlccP7UTZTie0CBMJ5GBdwm4EkBv0zA
JwS8VMCnBPxSAefjGt/nlgq4XcCXCbiT+cFtZBLwjQIu3t9qBdwi4B4BF5/3tgh4roDvEHDxOaFD
wPMFvEfArQLeK+CFAt4n4PMEfEDAiwT8mwI+X8APCHixgD8q4OJN/DEBF+ffpwR8oYAfFPBFAn5I
wBcL+IiAXyLgxwS8TMBPCPgSNJfm0lz6U06/K77ic8/gR1bPUO57a2Da3TeimFMnPIMvWY8Qear6
cwdCn6VWXgBSvJzo92DBZ2PvpVKpA4Q3Ef6kxpsJf1jjLYR/RuNzCP+4xucS/mGNzyP8/RqfT/i7
NN5KeJ/GFxD+Fo0vJLxL4+cRvlLjiwh/pcbPJ3ypxtsIb9L4YsJ/Osv5Elp/jS+l9df4BbT+Gr+Q
1l/jF9H6cx6iu5NEt4G2B/DfqdDzwxK/T+L7JV6V+LDEByR+p8S3S3yLxLslvkbiqyW+QuJXSvzl
Er9Y4udLfK7Ez6zW85MiX/lfTYmTd3oSpz2DH0xs2d48nHsN9AjP8PynCzGpOYz7+eLfgsmZA8Ce
X43R3M8w2TSlLIah8fPVdGgUpEaLlw/g7n+EUdB/lehXv4jJtbOexITn8Mc3eQ5PWTymVzwnZ5VF
4CDMHFhTo12kXNwel2+g5gcgRuqqds9gzVZ86Ul8qBR5hmq6gEn+x0wqlfRDZ3wlVwXetBNsdfZj
d4MQX7SDHQzmWr9nKGdlOfHjnqocgfxX4vwTR5P/CH3uBWyXtMCVJ5G7GguYfN+IeskhIkzCCD6E
ezmYfA0UKToG6FH3mYJCO/IcdSdJ9Y+6TzB6CtOj7uOEHVp8ZBWOSsspz7D7hCfxOs78MaiIZwjY
4fYznsRbGKrBUMI96hnsH0XF++4nttjgaPLZGZ5vPeQ7tgl+htzHB0dMiRHP8KKXaTbuJHP05jRx
lARHSaQWvoCnpGQbtdGpm14EMupJmAfdx01QOCjJKzQiz0wLZVG/Pdh/3Hx3Hvwi9TJepiu0MuH3
ibG/NzGnQ7gDNM6jMd4EShDKJRDW16+j0FvTPOxFNAbMpIyZ5FGTFZCbSS2mOZyEWXEMv8pQ9is4
w1Jdhu8WUutj05nWz8EcOnYacWv8LD72KyRa/4RZf4taV+D6qmVEPjhixTog9OHQ/63m5nn4Gduv
cxNmbuqpmz8jbhZLbt4AN+O3UR8q/IzfnHawnjkwX8zBE3ALGWedswo7KKTX5UKHuf8ChBY3f/GD
O3mUAf46wGPNM8IIGa5phDtG8jAIDuw8IsDFGP5xBmzF8LclePCjkkT/NEgLsVQF6ZB7GrJbdUGX
0zTcq5K3ZbjMxUa1mS49if4pT0KdgL7zN+W4au1TrIMf+RxXqX0Cei5UcgKp+YdwHx/PJYF4VfRi
By/JhPrBYP8HJrUIprK3oRBjj4AaIGaCnMTIAxSxqAWAvATIeBzYHML+C2b9wOaqm3Akf0kGEK4f
lCPhnh7snzYRxcex4g3AIsI+itnVpEzjK8E8j6APYfQSYPMJex9m8+HiAatUdCcU/ZQ8fQ23Q1dx
n2KBeG2W9BMf7QAPz6ZbenSKDOAJEh9lKcAQrVcg2susvAPXnE+lxov41LZGMH4fGw/XnIVnjeST
WIv1sM34Lg1KU37POloqJTf5XVDWlbsWyn0ss9ynwPAYK/diUu7ifYe00fTv0ClfwM8yyWvO06mH
cmXn2VyGKz2EK6+OPs/j//Y5HP83B/vfROpaPJUNlWA9mse5GRYBrepX5vPc6qZw1QG6FFfxpSlS
9VPYKnmOXI/i6xun0iFx0pC8D1NJ8pGpdEiqZrKEZPCcFBKDphwVmtI8Q0PyihaSF6dpUbTuduM5
sU3vIRUbrr41j0pnz4qz/mZa7aPJu4UKzYPr8RitEg5ISR7PqxJrDVcXAkDn5oM6b8e5t2vPiX3m
woW076fPkgC9CDN1Mn4uHaCFtBa6+HSeleOTeZf+4Qpyz0z+M609uWmuIu09iu9Je+E+lPsXK2jV
B8EfL1P3BX5begCuXliJr35FKzNx1P0OGYx+HIKh9nc8nW94Dp+GZ5MTeGolEwppi4VncT54zkDk
LsD6z3s5PFzms7RnZPgA4x9NplKD7ndMQ+53bnCP3vsID93Hk+nedHqSBOs74DDZeDZLD3JNShGy
Z0ao/+rMCBWkS04i9NWraYR8k+kIuT/nEeqAq6PuURKTMK3PaEZ9vnvGYCZ5w8LD8bszYq/48DwP
TqazxBkcnFEIzugN7g/uHeIBOXmGBORBcJmsnswSEOcZHJAuR/HyB3GW8EBbS573XLc1D9fcvBwh
161Nibdc7U2JSdd2V2K63TNccSPA25qvncHvdMnln0EOh2csyvLKt9nzYnPis+bExw2J/3SlFr3r
GTxi8mz6jfpb/L53+07XHa6drjtd3iNd6TxxfkeQ8J6ovRnOpf8PyaRbjdWvPeJ0tb01amefK4LR
CPCMCfiZvM7nt28N3KUG4grhG32KL2QPxGLRGOFbfLuDkW67a0uToKb3H/YpnT1YyU8+f9BPHKFg
nP54I/hDTXdAuIiTby74qi8cQjE1EsHfSIL+UAD1+tQ4lC3eoyoKgBX+6N0RFPftASza1YU6Y754
D1z3huNqvDcQ8eN6rFoZL0Tutka0iqz5mi6z3PAUouunRZ+kUngCDU2kUvhb3b1AlwE9/mkq9RLg
z8EQw98+fw0DeAtQPOP1As3FMxzQZUAPAnUBPQ50B9CPgEaBFkHonwO6GmgvTPPNQMvhPhsCegNM
KPuB3g7T1U+B9sPEfhzo9+HW8hFQ/B5RZUmv8Zru2YpMfSWmy4ryrThfjJN1eSjnGkwb8knTwt0D
4Qfo8o9TqQ78AGkrabSV/XnxvLutA+impddft24F+WyH7e+A/x1Qf7FPYBw34I5PaH15wmvE+MVg
L+R3FV7vcdtKHjLXz89j5cDxvA/mM/JtgctaobBMfgz+77mIHL9thg3kOG8rlMUP8pUoM+8VJmNb
LG9gtkZyP8hvB3mjKO9Pyx8E+f0g/4UoNz9LFLD8CdwPJtkNSJM/rclfAvnPQL7QJMgthSasgOUf
AP4k9BO7Tn6pJs+B/vAk9J+rdPIlmnwFyP8B+lWpTm4lcryvowHkT0F/I9ubGm0lf21uspX9lcVt
sw/nuG3l+3MbbM6H8jy2jYP5m221EdtGl83pspXX2ex1trI6W0mdzUrmDdxfT4Af8bvMXJpLc2ku
zaW5NJfm0v/VxPfl8H044n5jkdrZhbbXgz0c8z0e5VdQyvdG8P0/fA8O32vC99LwfUDLJPnkbIps
yX+MbYrhz1TfZJtb+B6XE0zO96oUsdc5vkeF790Q93zgxPfalLH9HPwtcIrVj79X8D0zfE/QlkI9
3lGgL/cEo3yPEs+fhUXTg9cZUj8Tg2YZf4IppBjPyzXB+EeY/DzjxT1D/5NJ228tJSdr71pGtzDa
wWgvowOMHmD0MUYPMjrC6AlGRxmd4C9bbHNWCaN2Rp2M1jK6hdEORnvFTV2/R+L7zDbX119vL2/f
pUYU1b7Jsc7hrKjcoBK28htrnQ5n1bUU/hI+LdC6ZVkayAKtujErbtH2nevxHHRvVjxXGx96PE8b
F3o8Xxs/etyq9Ss9XqD1Rz1eqPV7PT5PGx96vChzYYXg85E9K25DA1na0YKK0YGseIl2XkOPl2rz
kR5fkHUzsgUt1Pbh6/FFaCQrvlib3/T4Jdq8pscvzTquLDBL8HlIjy9JHyTR4en9xnr8sgyMnt/4
NCXjeP42Q9xKFupxG8NrJfxKhg9I+AaSx1JUXpvOD6dGcp0ZhzDzMyL52Uv0M+P5qEH5jer1BJEt
QneskCXZ9Z8l+pnxP0bwzPY6SX4XZ9TrNMPl8q8z4/pm9v9J8pvZ33bk4H2OJehVFp+r2Di2mige
ZU18FQv0EoP96tcz/YfZjbWU6d9soH/KQvX5OFrD8A4D/RjWN2eOrwGWb4jdMPl9cz/DX2XALxj+
AwP/zxjg+NwEPv2xsVaPv0b21UMOdsrzPbO/Zvm2sQcO/vxy2mDf/lmm3y6Vf5b5r2X++V7jPHP2
cl5rpn4OXk55fnRuk4H+rQa4wvw8yB4kDjH8TQuewjLnhwHQLzUv0e5nPA2bs5+/eJL5v5E9sC1k
8fmZQXleNcA/MdP48Ex4/GcN9BdYaDnleewKC20XJ8N5u1xtof6dzD9//qywZPffbMle3x7Wz+2s
3/Lnyj4DP9+yZD/H8SMDffyBrCRLu7xrof1Wru84K49Z6m/nGO5kwEqGF+Rkr1c5i08HE/Ln3bIc
ig9IuD0ne/lvzqHll8u5lc1Lg6w8jQzfaeAnyvK1s3z59NdnoL/fAH+C5btEis8zDB+/RI8fMvBz
3AAfN8BnDPBrcmm9ttgpz+eB1bkG53o6Y0pcUbu6HJ0ofaDHq4S9nfikDj7E4o96u0PRXb6Q169E
Y3GvT+1DndFwbyigBPyOjc71zuxK+KxK0OuLxXx7vYGIEtuLumK+cMDrV8PhvWAicF7QVHSqIX7u
Gcrl9TZudbW4ve7WBnygaHNzW52r2dvW2LjNvd273VXX7Aa04autrpamelDW+fLrAXJOBqDNre1e
t4f59TRsxfmRb1m+UMirqkF/5hGi2lr9KRjRgnz4Yqd7amvFIzfygSbRCz5Z0xvzRqJe8oEt/eUM
fsmhIno0SO9QPlSUllYht5c5x4XjX9/owSK9E8i1Oxr1ozpXg3er+5ZsR7HkgrKDRp1xlcRTf2ZK
Vtaf2pKlrHAkaNBz4lFvjy+Cvw0anxVjJtp3RXwiyjjQ6XNZYtb4WJO3qc1LTl95yVdIegRLDjDk
zPpaJ1QC1be1tno3t7U1yKfPMkJ00VNxWvjwsCCntOR8xfNdBpXLcnpNLAU+xwUR9Sk+rafvisfZ
NTQ6ro93lw9XHDqPAqMVAu8ln3OlY3utbS2u7fWei515y4htAGdMerHwnVhfERJL6HXs+JpemD70
ltFbScFJlwUGVyCcZaxlnIWT3KhKPCOsWU/66Yd65TrU6NruaqbH9vQekCO+N6z4dgGFsUpoD7+C
rhWI9SJHJKoEHN0R1dEbi/YGYspeAdqlBkP+CphuKOSqa6pQfN2IyHp88R7k8O+NQBaUKjEq2ROI
xfHHfpHxgiwWCPmwIrvqDSm4FNC4+NLRHWUX8UAnciiBPmBJX3TEoqTlHIEeNin3+GNpjvqgEyi1
4NeQlS8cBGfUHLoacsCdIQxTeJZb0x+U8OsEfuTj60xGf4eAJ5PEX430Z9qMzsHzJC8nrJfs5fP3
8muc/LcPmiR7vk5yr0H+sv1t8P9sKhXl9nw9hVO+zsOXTeTy+xBda+T2fN2F00NMwM8Dcnu+LhhE
+jPvfH2GU76eyZMc/7sQXSvkanwdh9PrpfJLfz4BfQPRtUet/FY9PYDS5TejzPoPIxpTbs/XhTjl
66Fy/Hj9v8fs6xjP14845euxecxGtn8ciX8bAGX8XQt5RURu/+9L9nw9itMOKeDyn894UrLn61ac
ystbsv1ByZ6vb3G65Qvyf16y5+/vnLrFw5pZyvOCZM/f5zmdL+nL8XsZ6ecPbcAxusCg/Dy9Jtkb
/T0Mo/zfluz5Oh2nj0njR+6/HyL6DM+XS7XzyhXZ9a0S/RTRc6zanzFh9iVf0n4G0dhr3yP43zth
9kiYP0Q7HsefIFp/+XtGGVvASX5B/nkmvb323urU5yPb81TEPmBo9Wf2Jcy+XNKX/ZWy/OX1dG5/
nYRn+y4lNTFJtczezuYRvAzjQJnzR4FQdjF1sInzJmkzjzz/lhrY/5C1w1LJQLafS3NpLs2lufS/
k/4b9s7GHQBQAAA=
H4sIAAAAAAAAA+19C5QcV3VgzYw+o7E8kvwB2Ti4EDaewa32jP6yUFDPTI+68fw8H8sKmFZNd810
oe6upj4aNYuDQMBmImvXbEjCOZucwB42sEl2MZyQYza7QcaAzVnDsQlLvAdyEAbOjiMWBLFsGUue
vfe++6peVXfJZhd2N3umEuv1u+9333333XvfffcNI/nB7NhUVvt1fn3w7dqxA9P+3Tv71BS+Hf27
dm/T+ndAlW27d+/csVvr6+/v39av6X2/Vqz4813PcHRde5fpuuYV6r1S+T/R7+DYjH4wO5adzIzo
EzMDI/lBfUSwRNc9puNadk3fltLf5tdMvX/v3v6urkG73nCs+bKn9wz2AmzP3hSV6MOOaepT9py3
YDimPmz7tZLhQfuUnq8V0107sYZRO1qxavqUB3W9lD5szXllfbhi205KH7BdD2uPZnS9b1t/f9/W
/u19/Sl9ZirT1ZU9ZjoNG5CwXL1uOlXL88yS7tl6EdDRjVpJL1mu51izvmfqUHcWhq5ioWW6uj2n
e2VoWLGKZs019ZJd9KtmDRCA6nqxbNTmrdq8bnnYe832dKNSsRfMUrqra8Ixjepsxezqmi6bsgNX
n7MdvQr46q6cL/5XMl1rvibw8oyjAFwwGnrD9h19DiZcsqtY4papPqBMI8OUvLQ+0ABka55juICV
B0PRupg10zEq+oQ/CyPrI4w+IGnVPLNWEiPN+wbQ1QPiv+JIWBagvHUrVKkimq4P1XDQYDYwBNXF
eQIxAEVX913gh7Q+jZRMwMyo1ytIcOwYqUOENxM54zZXoV+NJmPUGroNbRy97tjzjlHVF8o29ux7
ZdtxgUhVWHus6btizdJ6z5RdNblV0lCRqRVt4BAg3mwjIPUI7m4nkeI11zONUrpXP2z7etGo0Uwb
usCEyM7ourB6tg2Mc6hs1vQFIGndNI4iISK0T2ERYuOYc6bj4EygI166FPFg3YHB0/q4n4SV28Rz
6mIaHuKll41jYmkVtlB2SrhBIujpPcw0zrzgAdo+QKBjMLRuzVHXC5Zb7k2FQzlm0bSOYSe+U8Su
S7AoDlFr3vRod3FD4FbIKk2xDrNohA2hOXCdDjgWBZbYSU2vmQsCX0n0fYJ9ZHdHa/ZC0G/Jxj5d
7BnI7MLSTNvY0DOLnlg6kmYuLUnNVCjpmEinIrKPKzoHUsxaJWRSFEVISrNGG5yHED0h2sjK7lFR
ZOOaOLhfHZqeqIU7idpERoGd7FYMjzovmo5nwHShRh0KrVmrYnkWSx/smenZcj1VOqYQI65ctUvW
HHIuEGIYwOZxo1qvQJUrdeb6xbJuSHIDpcom7TbIeRbNlwSFPmdCRzQKaFV93mLeA86woKsakAaF
SUiDKJ+maXdR0xgnQ4sGbaxUwGUKZ4mpBkyX1jPADAEWbhmYAapUJRuA9kC5Q50KVoFflmQD3Lpm
K/4Afgdd5S3Aanpm3b1T7+nvJe0jlGGU3siOPdt6gXawvZlBFAW0ULaAoEgflwor5jxsb9JrLqlc
VmwpdTmgzztI7dACquMBzpmKC8TBVTANXCsSlyBfeSLYJ+IE0xGMTntQMrpkNKK1KTWtjwwLxlGt
5AarIORnzYb2DiqdRigdIgIkreejLIjNCHNLyF0XRDYOYlZcIfvrBghgQLAWoodKR2EdwJZXC3BZ
kGwhJBzrbRzRhvWwakYlJdYYqqFOATqAFq+S5nTskl8UaJDSwKUFtsQOQBxXcN1xCZS+pPq5DSrU
fY80CnLKMBZWGikaQpVIiJBXBtsB1DSMBKodCemByqC5M03qWIySADgOpSlJjWO2VaLBSygPHTEF
0FaSEVALwpY0ouPRDKxayTpmlXzESbdnaU3FGIHlkkL5aQJXFmmTkeIph91ACnrHBIu4AfIJ5SSw
A3IKrDAtDFG7apTQatGLFdNwFBqLoWjXzQbGUklwJXPVbcwoKNYBjDQP6hlkeKWFqVXHlQ+2K6kj
G6YnxCT2iPsD0Fe2iGRywWdFoffnbLTlsNPs5OiUnhkb0gfHx4by0/nxsSl9eHwSshOH82MHU/pQ
fmp6Mj8wg0VUcXR8KD+cH8wgoKurj22fFsYOcxiREFATpsiC7RzlnY6mHSwGzANnjDq0XjGKoQUS
ipGyXUE14RoNtkirYEECMUM5UBIbk9oJ4kjztrWZQHpG3zIh0NsCNq8JBEkJyyPAniS8MgVEXogx
Q99CM5k1xP6kgWVvetUEhaWbFs1YKcE+sF/A1DoGKwFcQ70I3MP5VoyFOwUHWYQLTByGFXWZapJH
1Z71uu3Q8pJNkJIIBIY/zgDFtcoKrpSggZItoTTA+YsFq8CG8415oFhPDiQd7O05IHAqqI/jke1d
rPhoe+MIto8MDCYpF9eCddG3qINvAdsxi5KZuZ1EllEqOSaJPcPVt4Ai2IKSHKT1MaHnbaYqWkev
jttRquCeili4Ic/uEyKTTCvfcy3axqAMoXfmE6NIVrvj15rozjJW2itmKcVWF3UGYhF2tl2NN5GY
2DW0l+doPFxYEukkFy2PtJueyGV6Dwg2s44GVI2wAyGEyM2aYGKTLIJptsC4FwQrGyoBhzk+mszY
l4ujSDUSDFWyTRTs/WyLGI1Xf8AMOqFjTWgDG27EPEZ2tWq0Oaog1X0wp2Dfgdg2FQsWCVO3ir7t
uxUxOkgbks3AtgCp4xYHhQFTIH3PSKq1lE3GMocnUawYVhVoAkhLLb5PP2qaddwNuP7SRhPNXKmB
0JLBg21EBopTG9Y2Zl2zBqOgboK5hV1jHTIFw7OdotWjpAM2oKlIkRaMU7FhbYUFFtaGhQpWSZxV
yARlmwSEbLnhws6oSK6mjSzPWwZbWIY0FqEXgy0+u87CBeccmDqKLYVK9Lg8VEvTF9DZFvIN22nU
n5iT05pdpKiMiTSv7JOiqwpkE3dHipVjM5eSTI9KQJbsrVTIFE+tH1YS9mwrrjTAyASmNQWLiFm4
pqKY7+zq0vEzekNTvmj4rjgGBPbfnFURerMIpCW6wiRxb0uOc1Gc0maW+4FILYSNaC1FTwlZnXlO
1EozErNNSBBf4vSDfhVqAWl4V/HB1ELxYFeohAwpxwsVOcJcod1wQnHBJ5cU25DZbM/h+SViFhlo
DogRDJy65GHUSLQDLadEPSDLJOl8qeR5zsVeaXgHxJZKvQasRIYhWKUl4Ugh0x5dSY6BSgcFywK6
LUCWKsc4QTtkSSpEdymqTilwkf2J05SOyLxjXSgcQU4J1KmDYoEOcujdQFnu4AqALSSEV61m+yBC
0DXHWpZ4/1WItcCuSj6o9KAVCqeNlDSuAiZgRsfV4Mq9oT+BvF60oRUb3IwYzcHaRPYCa0ezUpFq
CbvS6TRq68cscyFB2IH5kT1eNEkE3YkqM6JRPdeszEkXoCQ3ujFRc5GCDhZa0Fic3aPUTQmxlKxx
A13/bt9yhEtE9BbrKN1L1jq5MahqVZzyyTvGiiHgRBou5Ho6I1qo06HYgNOZ7prsBiGK4CmPWrBN
k7TZWAACZrOIhuHaNeiN/Klo4Thk5oX2A1Z2TdhXyEw4gMucWgXKHsMTkodsrq6IGAEtF9p8KfQp
kZs4nCb6KAP0aZ/ExAt5IAw3NnRaH/C9pPrAqFWlV2hM8oQOf0JuiNOF5V5ZP5CYVM1G1j+iD3lc
s2vJ4iXFXtjQQyHOYGw3s0kL54Dj6JaWC48r6/Aw0lb0Se4LHwUA6FgopuWY84ZTAtFOo0MjfQH1
rfBUTUPDlOKgx+7JB+4FqDKdSK2ghaM448jedKPeHKgmDmgOXiXUGFlxQId6+3RYpDJZ/+FQ4ohi
HjcdcTSVfizhrkHHQqUlsZVDEGFTQR+DPBK5LVcN5pyv4QHBElcoVZRoxvw8Ukl2K88tNA+kSsut
HDeaSBAS8ApM04t5Qz9mV/yqUK8g920HDkcss8P5CSM2FD+zjpR3Cnah+qKzRgv1tf3KFnd8AnHc
UT2JQaQds60X97U9+y50dUhnNKxd0fdI2KBpdQU7yEVDCHDYJsyhJGsIJAG6sXhHCWcDzF8xhDJF
ULV1tAaAfYPFQFjFJHXmCP8u6boqbAwwhbaijhYiMTxIpHi7yw37Ci6BhHnQuvKaFaEnu2o4FrC9
Lz01occOFYwwqfYB7VKhWdU8JSPYR2Qzp/RjRsUS/QG1KiCUPfKHmXrDNBy6JAnPBKGl00ixNc2m
UA3vkYQTuCYtaXGtJE17VHOmI81kppbKnynSskzsJvKG+je+EhHCC8vt/xLBi0k8ZNVw3kIcKCdM
sixZBIsTTPzOJ2GeYHiQg8uoAB41Ia8oS5eh4gQ/R067GlqPKAXhbNXkkJAn/QhKqr30ytuSpigN
F+YoPDMDGRzhd9Gn/Fkp8WcFpdkWiZy950JRITxVAg+6dBPkrwbaECvRva5wi0YPTkBCvGocJsNe
xVc4ygIOUwcXI8rTdBNaAIcxfDzMWOHJAs5dFd+lfWG4rl20pJ8KuNxA3jbnrJolXJt4EOL6QrQ6
Vl1c1JZUlYTIWey/IkMGndGViqHaAuGM0noOlvsYkpxsNbdu0jqb0iZNNU1H3Rh0g4Z6gN1kOBO6
eQt8MIF9qjbrwRO1cOJxz0CiWXFmwFXqDdm+aryLtGgVWJiszR4xQcT4KDCuWRHGhouiuVdOELSO
Iw6VbsP1wBYj7w/K0+j08Vzjoi4hS4RwDoaS1rfB25G8v1Higdqea9L/Su9oNCm8j7ci7MAiNqfz
TrFIQ3NsA5m7Bt/zEjOQ75jN1KAVmt8gdMnCjXbQxHzSfibzkjqDAp/sdreloRiRhXghgAavP1+O
nVFD52O1DsceJT5D6STmyVGIAbTbERoBoiN00AhHChzbyK0tzFHVCIkaB4JNcSbm8Tp6V+kgxLpb
Sm31sJXBnQaqqwqtyGJZINvOThz9CoNDv3h9I/iPrmQMHwW+x6oKdYWFixgxRVthFexBSVw0iOny
JRCpwplEtJA32LS0KHebuwzvuGRIgOWE8SwBYrRtaInwrEKXAowAnO3wPgn+f86vCKFSsQw4B8K6
7RTrJhlAPTYiM9a92GnCtdBTGMQnYBuOYkAhG8wd7VvibbwknMeTuXClRi9K2dGWvCroq/Hc+FVE
cAFvyPOVQyqqbM1annCdV4yF4FqcT3zNs6FuQKPYeO87K/1+iHbEUo4503vYQ5RsgQsPDF7pFQOG
EcMb7GaNLK9HtiheApM/hGN2fpnbM4FxiH6MhLGzCh3LdqXFpYZnVU3W91ey2V9hvp4aKhDbOcz1
qJDkNgzkWHBLK0pE9EXT9Xn06lziBduaBJAXRIm0oFhUKlmgDdiZOOc77M9WYjh4XqGP+7bwyMgC
lTc+sTRQoky3TfE9xEEfwiaC8yn8W8R1CXceX+8oIjjmn4cl2o1uFlbl6BGBrRm46VHsw8n7XX5p
nnxuwipRTph8owuGJuoYU1aa48WUznx0ueg94i63anFgnmzrur7p9qZUBiRjl6hIXICM0yNDSmYb
jBVYemSDwJE3GDiQz71SM2PIHOwQjy34YIgmBwZdfPEuBh2BDkocN2Ci5Lbkp+JoIvJDKR52m21t
F+NggLVcq+pXYIOa4uJGXCaA4phnM7KFXKbtGka9mbCQZGsozVjXN61hQ+HKhH3Hd+p6PNTHiAUG
wMb0K8JwE+GVumM34CDQ2ErX9cq+VuwCOQismbBybYptsYO7Lr7vKIEyKGLwA3nSgxwcCMmKgGkE
TjdTHB84bhJZAbCS1J0FGqGtLFxJqm6jarMkBUEUO6ioAocOLfEV0Bc2W+wGJuJSgp9ls4KGszjW
YlhaTWxIk6w6sazS428V/YoBItZyin7VJXEthNusUQllt6l2r8ZzCq+ivN+QlZTbgpb18VBFHKQO
i1eZ+YjTrO47JL1aeM1gZXxmKsqJPa9EdrhhbAO644FTG+z/IoebjHuT3jaileU15O0MWROi5r7o
4GWDDzA4OwVDeeHGyggnPe9wj145Fs4aXWJh5KdCD6mFrI9yRKj2uoiRkNxfJ086EkwfpQmbNlRX
ol3mMbYCNrUQOTxKcMxewOsDh24DMVquCSM6ADtsMsOW5CMIxfaxKLdrwmHt0q6k2JKickILGu1j
L6hfDy5eKTbpjpJdE/QvgeIpUZQm6UbdLRPLoP3HcaYRCca4SvxCUcRIiuuVIGyBhSArQSGFy7ZF
ZuB0bNOoXEqBZogojoLeeYodWuAz4SyQwTwmas6azapKKFTXa5LNXV17glizuCfiDg4fjUkry1Vi
GHANZPgbHYIcFFh8Ep2NcP5sI7x7Uo/kQjyHVkhTMA9KRDpmuRE8WugCuoMulYSLATkA1nrexOr1
Ml1kR6aoxJ2ARuPbMiGEg6mEUXCRppEoeuGwqZH6r9pkYUhCCLHhuzyAWQJi13gnG0KtKuiDVW/D
5sXrDTFVBUPY4sCR0kvId4Ozdqn5+qura6+IRUmM5UYyyQgIxzxm0W2qWG8MDT4m3i0E9+wJQd1C
9aPlihsJ0rQ+hROLdEGnJuBIUOwWCnVA3K1bjiUtRnQmubhjuYV4UoAIgqmJvjdoUDKBvSokqkXA
Dw0RRCSKCwpgQgopJHuaO8NlQi8pehBx+WB9fZgzLrOsUfOrs6YTbIHArEWnzRwdymNVmw4OQkIq
wWysYLegJMAoKUf2sCUVDSkPoiRCv7fiEY0dOnhLSWEmkbIdqR4iQ8nlDUPkkpihaerBRYSgQeMV
KZAK7CgQZNKyl03wIPpLINPV1d8X2IsypFPZFmQfNAWAUBSaELqRsHa+dYvs3JgZLbiMrnRxb5lR
pSDD0NFgDw/NwhoMJH+gIlXp9goTjY2WVG0fvYCwqyZuL1fogMCP6Aaxw+KVA+otorncc8DspRAV
jLyet42KKywDk14jMMcJQwAkjS9iY6F9eNonkHwZE31wImyMqh2YGPhiRsQclECysPIImswLQVJp
wDqPjeuHMpOTmbHpw7Do/Wl9IDuYmZnK6tO5rD4xOX5wMjOq56fkY6ohfXgym9XHh/XBXGbyYDaF
9SazWEPpieJRlQ6g1jjls/dOZ8em9Yns5Gh+ehp6GzisZyYmoPPMwEhWH8kcgpP4vYPZiWn9UC47
po9j74fygM7UdAbr58f0Q5P56fzYQeoPY14n8wdz03pufGQoO0mBsXfA4NRQn8hMTuezU4jGPfmh
6Jy2ZKYA6y36ofx0bnxmOsQd5pYZO6zflR8bSunZPHWUvXdiMjuF04e+86OAcBYK82ODIzNDFHM7
AD2MjU8DmWBiUG16nCgj68reERnofzQ7CeQbm84M5EfyMCQG6Q7np8dgCCJdRmA+ODOSgUnMTE6M
T2XTgoDQB5B7Mj91lw4TYLLePZMJ+gHaQhejmbFBWqbYMuJs9cPjM6AjYNYjQ5FyJFNWH8oOZwen
8/fA2kJFGGVqZjTL1J6aJvKMjOhj2UHANjN5WJ/KTt6THyQqTGYnMvlJnYKRJyexl/ExlCXb0rhw
wCDZe3D5Z8ZGcKaT2btnYDItmAB7yBwERkNCqmt+KA9D4+rEFz5FTaAgXPjDwELj+mjmsIh/PixZ
A0aUAdJRjgB6hoyZGRhHCgwAPnlCCxBBcuDyDGVGMwezUwoD0ND8/DClT01kB/P4A8qB7WCdRwRN
YAPdPYNLCADuRM/AWmIPyIO8Xrj9kM/GJH/A2PEt2ROO3cx7+sj4FDHaUGY6oxPGkA5ksfZkdgzo
RVspMzg4MwnbCmtgC8BmagY2Wn5MLArOlzZyfnIo2EvEnsOZ/MjMZBODwcjjQELskhhNWRBRY6o3
RTyg54dhqMEcr54e2bGH9RwsxUAWqmWG7snTruNxAMk802Sce2A6oskxJiq2CJDv6sqJeKUMHTKF
w3Sa9DsAD6NUHQNbhhWZSydpcpeC3qzYdYzLEqZOGKijvABja5+14Tw9lwAbH04Wwu/lu4GGEec1
PkZjJfQQkHu5jAcHodBFfAZpGcuLiXuh5YLHLRguFHFWKq8k1XgusmXEmzHpXvU8g2+NQrMnCJWV
RqHwLOji8O0ac4gyohs0rsq6FE9Ht0RYwrckeLUXvKIUzzVEfB6o/2Nmg2+dwCR32QKLhttSV9SH
WybXCNlsyk28qW8JtP0WMNNrMoyubtO5hsJjKIqO5umLqwN6/IdqGygkIw6RmNRe3ugr878NDDG8
YxIuLoz1MkRsj0GrT7HWevQ9cQM+0Qj1OBkxPBAdLpXnNZHl3Rc894ssqjBllVdTAGgZSXnF97YY
ePVqLcB9ylME8XhaDjCi3F31RAONe5sN4HTCrFWXAh+iyhhQ4zFNpe0EWwdWTZxGpKZGqSK19b7g
9QLf55FHtkJhejJiEhCPK1zA/ZX17ZRpvhJJxftper6KZyNXThc94CrLhiENkVCNKy2Wer8Y0m4f
nj6BhV+l4SrerKf0X+bReuzNelrHN3l0nFcDNdDdJUQq3fiLN4bIVSYGhTl2DeYi3sOBwQ6yzKoI
/2QkgCIS/ZkKJB4/wzCQhE4QH1uxjrJ8pDhDqEcixxWvECJxpLBLTBm6dLAGhvExYZFLZt61NxXf
r+jFie7XSMuijYY/LUdmYGp8BGyHkcOqybuPeIHZQPcawMtH6Mnmwm383iq+10M1QnLdrOAYwvMb
3fr81ijw7siD0z51mOJtKgL8+KzcqONxjC6fwkhpiReNH7RmdpXPTCOxypHTXtLzrPE5uvHgS4pw
OLrHZafQLGosulKn0xS5AJTXQS0x48c+woVOu3wWVxi63FoEBI6S56Fq1nyglVl1t25FuUznXde3
xE1r8KydX1rwXCnyDV/eUhUT5IbdgGY98n13EOfLraum06uLN8vQOZ6yK+ISoiaCwfHuF9+ZhZ6z
8JnKlvA1h7QicCfjg3CXXinmONbbwHiGegVUAcUvURNkzOBRwmG7YZcaNVPubVRvs41gKBGpE6JA
+wLVNotZufmOKOx9G95bUUwe7EBXvGF1dQ4ZwYgUtzdwecFQb0N09JxRPGo6QFER0IGPnIFDphuw
s1CS9IOt5VgV+ssaIXQCULHk+6d7gHW6un41f/+jcqxg1K1Cyf7VdNfyw7/ysnv3zqS//7JjW18f
/v2X3Tv6d23fvm0X/v2X3Tt3rPz9l/8T3/uyI8PtbW1BvkP7TQ1zZ68R+QMMP3MgbHNA26NdDf/e
rL1eWwP5VUq9ePp0ezTtDMYR7TZ3iHw8vUmLpm1KuuoK88mtj6baxrDdaiUfT3d2R1O1HY2nMzyW
HlkVTdV2SJvOrSLfuT+W8jz7OqLt2rndZm63eX801dqjqaTnKv5vD/cXT+Pox9vdy/Xi6ZAWTeU0
p37klf5Xxpvgdte9QeTj6V9o0VSOdze0W6O9+k8u7ySPl7QOF9ujqeSzOyrW7K4dd1RKW8H2849v
Pb5n19ZdO9Kund4W4IVjIE+BOYrLcQZhcjlpjpzH8nfeOTAz+tFv2mOjb3rfv3lw+Qfedf9lSPbR
xnU0ri+XWOZv1EJ+0rRPaCfaNhJM7o2e33jgpqfMb1TnZ4yNWsL3H+C/a1rAs22t4fMJ9X8rof6O
BPhUQj9/nwA/ngDfq4W8pH7vSRj3DxP6mUqo/88T6ncnjPtnCf2cSejnzQn9rEro580J8I8kwO0E
eDkB/rEE+B0J8HNaa7gB9TcBN248IPJyn38A4Fta1B/l+nqsvgb77ZjleLjD+rRCfnq0gG+35vFC
3JkeHYRjnTmNwRZaoTBftWsFOsQUCqJqy4rQ3ZCNQYsHTe/e0ZEh0y1GYGNgjiFg0K6BPemN182a
koWO3GgfMzP5ITgEgu0dAU95YDaHkJzhjho1Y94sTcEJNl+FX2EhnjeVMUYA6UylIsrcsNqIbR/1
6wMNZUQgTxFps0szj1ueBuc8FygBRCgeLRTLRwtzcHzRHBOD9Yua65WsmkYv9uYg43j2UYTB+VCr
cg3TQ6/NrD+nzYuf0FvxuFGYwzts6z0mNitW6wDFkZnaiJuGhzHt4Eh+YLCwLb0j+LUtvVODn/fk
J6cLfem96f7tSnYPrGmY60/3K7m+9PZIQ5Sv7SD3VsF/q+HfVZqQq2sIhr/Wahrlwv/r5BTlZLum
twm5ivbjdZZ1NUrpzzDMv9Fah318gQV9G5ThTyk4f1A8ugG58iuyj88/D5b2Wu1bnO//G8yv0Z7h
/Pb/jPlV2nnOb/srzLdrL3P/gb7h/s9cK9KNMfgJhnfG9oXMP/1WkaIOWKfsp7MKvFuBLynw1ynw
8wp8kwK/qMBfq8DlvkY9d6MC1xX4TQq8j/vBNWpT4HsUuKrfDijwDgWeU+CqvTehwFcr8HsVuGon
HFHgaxV4WYF3KvC6AlePWMcV+FUK/IQCX6/Af0eBX63AH1TgGxT4xxS4qsQ/rsBV+ftpBX6tAn9I
gV+nwB9W4Ncr8DMK/DUK/HEFvlmBP6nAb9BWvpVv5fun/P3jhtf/Infyx525U6u/fweI3Q+d8dqX
n8yd/HLno1S+vPMXaU37+fKtL0Gy4WaqX8aCnz/7/eXl5Qcp30b5p4J8O+UfCfIdlP9skF9F+U8E
+dWU/0iQX0P59wf5tZR/d5DvpLwR5NdR/u4g30X5TJC/ivL9QX495d8Q5K+m/KYg3035tiC/gfI/
e1nmN4r5B/lNYv5B/hox/yB/rZh/kL9OzF/mgbr3EXWHxHpA/ve3RvOnY/kPxfL3x/J+LF+N5c1Y
/r5YfiaWH43ls7H8/lh+Zyy/NZa/NZb/jVj++lj+6lh+dSx/ORXNX1Dz/f8jv/jUO3OLz+RO/vD8
xPTI6dVvAo7Inb76M12Y7H8E+fz6f4Amzz0I2RdTCF39c0z2XvSuh63xVymxNdYtn91w8wlk/0c5
hfpfo/o7v4RJ78u5xfO5R37y1twjFztybV/NPfWydx10UOUOOpfPzhFesj3id2L/H0Ox5t8+kzu5
fxJ/5hZ/5K3Pndo/B5ml/3Z5eXmpBMz41dU+5Nvug7aR9s8uQCH+mIF2sJkPlHKnVt3aQ/1kL/af
gfFvxfEXH1v698BzX8R2Sx3wK7e4OoUFXP6hM/5rHqbCJdjBDyOXQ5PfgooC+ixAH8s+t65L13KP
ZZdo+o9ln+T0aUwfyz5B2VPXP3o7UmX06dzp7JO5xW/g4B+HieROQfb0zHO5xW8jaD+CFrNncyfv
P6tt+ND7qS02eGzpc5fluIMw7rN74Z9T2SdOnmlbPJM7fd1XxDDZJe7oW5eooyXoaEnzu76IImlp
XLSJVG/7EiRnc4vtJ7NPtAFygMlXBUU+e0nBxf+9k/c/0b6wBv7V/NdJnF4f4ITniWf/bRt3egoZ
YPgqQeO9UAlIeQOQ9RtvFqBvX5JkXy9owE02c5M1osktMFqbv0GM8BRIxWfxKCOyv4kDbooM+L0u
0frxS82tPw8y9NlnNNkabfFn/1ZTW/85t/5d0XorztffTOUnz3RiHSg0kPT/OujmC/DPsw9Euqly
N4Oim9uom+tj3XwTujl3SPThwz/n7go72MUdtF+pg0+CCjnHzLkDO+gSv3sUhnn/S0BaXP4NH7xP
UhnA7wLwsyOXlR1yev8waIylR6DgwfseVcAbEPxnTeBOBP9eDHzyxxsX778EpV1Y6kPpqewlGO72
lyIjXQJdtXSoqcvV2OhAc5e5xfsv5hb988A7/6oHpzZzkRn80V/glGbOA+fCJM9r/tqHkcfPrSZC
fE3tRYdelhb9H568/4dt/noQZd8BJJ79KFQDSDtBnkLIBwSkw18HkC8D5JwL2VWU/U+YLUF2tb8X
Kfk3tIFwfoDHYvbSyfsvtVHFT2DFfZDVKPsxzKYIp3O3QvM1BP0wQl8D2bWUfR9m18KPD3TGUO8D
1J+Oi6/TM8Aq2aeZEF9/mfjEEAzwkZfDlT57kTbweaKPdyOAgVpfBWrf1CkZeP+Ly8vn1kvRdofS
+AfY+PT+58HWWPoU1mIOO4haGipdLOW2C6y81Ut/AJUjeB8AvB9vxvtpaPg443094b3hQw8Hu+m/
AlN+EW2ZpTe9KESPyG1+kWUZTvoUTt4/+wVJ/++8gPT/1sn7v6X521CUndqI9cQYL1xmCgRTf8Na
OdrARZw6gF6LU/zyRZr609hq6QX6fRZ/v+ViSJI+QZIfgChZ+ujFkCQ7LrcgyckXYiRJWMqzylK2
XxYk+WpAki9dEqgE7PaWF9Q1fQ9N7PTOe9aI0pefV6X+QTHtx5YWlAldBb/POWJKSJCNa+RY/Vjr
9M4uAAjZ/FCktydkb70vqDzz0kth3595ngj0JZDUS+4LIYGuFbOI0Kf4fJw+zVr6T24hnbn0H8Xs
SWneTut9FnVSA/TQ6n92i5j6SehP4jT/klRLH4BfX7wVf/2tmMz5x7Lfpc1YQhKcmvlurvjN3CPP
gG3yJIpWEii0Ftc+j+OgzNBICzD/fH+VJFf784IzmvqAxn96YXn5ZPa7baey392XPfvej0rS/eRC
yE3PXCBi/T50uDT8fAsOylyIUUhvptD9b2ym0LoQc6LQ4TcKChkXQgplfyEpdAR+PZY9SzSpivmc
bZrPHzyXIEm+2SHJ8Y/PqVzxoxclcZo7W3wOiXMWiHN2X/aH7z0lCfLUc0SQD0KXSzsvtCBI33NI
kLn0hps/iEOCQXuA7L3MoZHT+++6WdMy9+QXv52ZyS9eyExnFi/N5E5vfQuAp0Z6L+OZbunmn8MI
j1zu8G7u/w7biyOLPx9Z/MnQ4n/PLF/3vdzJR9tye//e/wc87739vsw7Mvdl3pkpPDoXjonjPaop
58TgZLjy/f/wtUW8sVHfI35v1Mdsna8rLLsGec6YJS4fMEr6JL7Vcz3KDxse/rkYx7Edyo+Kv6eT
mcgr1aL9Vw2vSDFNJbr+EFccFcsV/xQwjAevKcIfLt254K/j1YrGf4pSs0oVU6vjn6ssaW7Z9/BZ
x9aSvVDTXOMYwOy5Oa3oGBjHqdWrru/S3wSEedx+q9ulZceHtdvJ59v2uo59n9aE/3T9T5eXUYBW
zi8v413deyG9CdInfra8/GWAfx62GN59/h1s4AlIUeLVIV2NEg7SmyB9CNIMpE9Aei+kP4bUhnQ9
kP7zkKYgrYOYH4G0B/RsBdJ9IFAegPTtIK7+AtL7QbA/AekfgWr5MaR4jtjREfp4294zqbUd39j2
uvVrO3FchJNfHvC8A9OhtbS0oD00NKB7frK8fAQNyO6Nw92b37bhqoXOE9pbb7zzzdtvoWs7bP8O
+O8IzF/lCYTjAt77UzFf+aGPGA8GDRhvC/p7st0bP9w+ePUaxgPp+T6QZ3S3IMvGAFkufxz+O3aF
cjxtVhPKcexOwKUE5bdqzWPf0pbcFsuHuG1SeQnK3w7lw2r5/WH5B6H8/VD+12p5++eoApZ/Evng
AiugoPwzQfmXofwvofzaNqW8o6sNK2D5DwH+KeATPVL+2qB8FfDDp4B/tkTKbwjKb4Hyfwd8tSlS
3knlGNcxBOWfBn6j8Kbh7o3/sj3fvflfdGS79dOrst09D6we6u778Jpc956Taw92H6h178l092W6
ewa69YHuzQPdGwe6O0luIL8+Cf2o9zIr38q38q18K9/Kt/KtfP+vfjIuR8bhqPHGaqrzjyDWg41j
GePR83qRytgIGf8jY3BkrImMpZFxQDfFyi+8vEwh+R/noBhpU/0OB7fIGJcnuVzGqqzn45yMUZGx
G2rMB34y1mYzx3PIU+BFnp88V8iYGRkTNNEVhR9ZF8X7PKcyRkmOz2QJ6sFxhubXxqCXOf8kV1jm
vMTrPOc/yuUvcl6NGfpVfkG8dezr4/U+wOkEp0c4rXN6gtMHOf04pw9xeobTJzk9y+l5edji4KyN
nOqc9nF6gNMJTo9wWleDun6JT8aZHRwcvFPvmZn1a56v701vT/dt7d/tU7b/t7f1pft29Arwq+iz
A1Z3c4sF6oBV3dMS3hHEnUfhq7T3toSvDvZHFL4m2BdR+Npg/0ThnQFfReHrAn6MwrsCvo/Crwr2
RxS+vtmxQvCrNb0lvFs70WIdO7QN2oMt4RuD9xpR+KZAHkXh17QMRu7Qrg3i8KPw67QzLeHXB/It
Cn9NINei8Ne23FcdICWkHIrCbwgfkkTgYbxxFP66Jph4v/Gz5Tgc5Xc70G3jtVF4N8MPxOBvYPiJ
GHw3jXGj1nMgHA+/YfrdTIcq93Mm1k+D6jfT82MJ+CfN65NUdp32jlviJa3rf47qN9P/cYI3r9dT
9O/1TfN6huFx/Le343yb+f8C/dvMb/euwjjHjdrXmD5beB93tgm4zUu8hQl9Q0K8+p1c/yOsWDdx
/bsS6j/dIerLfXQHw48k1Hewfnvz/jrB41ZYYUq9+QDDv8aAv2b4Hyf0/9kEOL6bwNcfew5E4V+n
uHoYQRd5GTP7dzzuOBsc0n55JiFu/3muPxPD/2Xu/wD3L2ON17S3xrO3XfTz0G+IvHw6tzeh/j0J
cI/7+SAbEg8z/FsdKMKa5cMJqL+p/YZAn8nvdHvr9xef4v7fwgbbtUyfv0zA52sJ8J+2C/rIQST9
X06of02HwDMux17fIdalj+FyXd7YIfrv4/6l/bm1o3X/Ix2t51tmPteZb6VdeTyhn9/taP2O408T
6uMF2cYW6/K9DsG38fmeY3zaY/z2AsP7GHArw9etaj2vHqbPES6U9u7mVQJ+IgbXV7XG/65VAv84
npMsl04yPsMMvy+hH5vH1XlcKf6OJ9R/IAH+SR73hhh9Psvwc6+Jwh9O6OeJBPi5BPjlBPibVot5
TegiL+VAanXCu56i47mePzeXLmrhg56CVy0U8aUOPmIp2YX5ij1rVAol/F+3LRj+cU3+DyqU0nv6
dvW1roRvVawC/rWKRsGseU5Dm3OMqlko+dVqA5oouQL+byZEqgbvngGvQmF4MjOaLWTHhvBB0cGR
8YHMSGF8eHgqO12Yxr9iBNChw2OZ0fwgVI70VYoC6J0MgA6OzRSyOe43NzSJ49FdllGpFHzfKjU/
ITpwIPoKRm1BF1/8uufAAfXJTfxBk9oLvqypO4WaXaALtvDmrOCKR0XiaVC0w/ijorB0h5YtcOeI
nLx9Ew+Lop3AqPO2XdIGMkOFyezdrZ5ixRHlh0ZF1yd6Rt9MxStHX23FSxk5IhpwjmsXykYN7waT
34pxk+BeEV9EJRM6fJelDo3Pmgr58QK9virQLaR4ghUnMIzMvFaESWiD42NjhYPj40Px12dNJLri
q7iAfLgt6JVWfFz1fVfC5Fq8XlOxwHdcQFHDMwJOn3Vd/g2LjvMpzBo4cWAeD3YrEL5A17mxZ3tj
46OZ6cHcld68NdHWxIGJi5V74uhEiJbAdfx8LVoYPnpr4lZCnFgWMjiBaou91vQWLtaN77lNZG35
0i+61fu3a8OZ6cyIeLYX7UFLu42qZ8xCCnuV0rL8RX+hoq6la7Znpudrflr+VWYFNOtbldJWEDcC
lBnIb/WMeY3KyoZb1tKlRg2GEKnniBL+ey+RTAHKHLNiYEX+Va94iAUsLv5Mz9v8wzWLWtozj0OW
eDHt2LRyabPMQrlccsKc6EMIUNFC/oahjKoFnYnmwGpamv6nh2qRGIL/nQ+PE2jyST9T0t8hkF9b
LP9GLfqmLekdvPzi7oRdsfbx9/fxY1z8bx/kY+2ln+S9CePH2x+C/55fXrZle+lPkan080i3SRx/
QxO+Rtle+l1k+jAXyPeAsr30C1pa9M279M/IVPoz5Ren/7s14SuU1aQfR6Z3xvCP/fkE7bc14XsM
8O+Mpg9qIf7tWvP8T2uCprK99AvJVPpD4/ST8/9Dbj/Aeek/kqn0x67hNvH2n9DUvw2gNf1di7hH
JL7+fxRrL/1RMj0SI3j8z2d8KtZe+q1kGndvxds/FGsv/VsynXiF8b8Qay/P7zLNqo81W+DzxVh7
eZ6X6dWx+nH6fUWLyo9gw3F6TQL+8vt6rH3S38NIGv87sfbSTyfTj8f2T5x/f6QJG166S4P3yltb
1++MpT/TxDvW4M+YcPuNr7L9ZU3QPriPkH/vhNtrivxQ20k6/rkm5h+/z9jMDpylVxh/TVu0fXBu
7YuOE28vv/V8gRHMn9tv5PY9sfrx/jbx+HF/umz/5hi81b1UbInpO8DtdZYj6IZJa83yY52Cu/od
YcH51lgwT1z+bkpo/ye8DjfGGsTbr3wr38q38q18K9/Kt/KtfCvfyrfyrXwr38r36//+J4asyacA
oAAA
'
#-----------------#

View File

@ -295,6 +295,12 @@ Otherwise, all templates are checked
List all configuration options and their current value, get info about a
particular option, or edit one
.TP
.B \f[B]copyright\f[R]
Output copyright information
.TP
.B \f[B]license\f[R]
Output the GNU GPL v2 complete text
.TP
.B \f[B]setup\f[R]
Perform initial setup.
This is run automatically by the installer script, but can be invoked
@ -553,6 +559,23 @@ likely to come before this bug fix.
If you find any worse bugs, and I\[cq]m sure I missed some, please let
me know and I will fix them as time allows.
Contact me at: jgardner7289\[at]protonmail.com
.SH COPYRIGHT 2021, Jesse Gardner
.PP
This file is part of qq2clone.
.PP
qq2clone is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 2 of the License, or (at your
option) any later version.
.PP
qq2clone is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
.PP
You should have received a copy of the GNU General Public License along
with qq2clone.
If not, see <https://www.gnu.org/licenses/>.
.SH EXIT VALUES
.TP
.B \f[B]10\f[R]

View File

@ -1,10 +1,29 @@
#!/bin/bash
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
# Bash completion for qq2clone
_qq2clone () {
QQ2_DIR="$(<"${HOME:?}/.config/qq2clone")"
[[ -n "$QQ2_DIR" ]] || QQ2_DIR="$(<"${HOME:?}/.config/qq2clone")"
[[ -e "${QQ2_DIR}/qq2clone.db" ]] || return 1
declare -a templates

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,25 @@
#!/bin/bash
#shellcheck disable=1090 disable=2012
#------------------------------------------------------------------------#
# Copyright 2021, Jesse Gardner #
#------------------------------------------------------------------------#
# This file is part of qq2clone. #
# #
# qq2clone is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 2 of the License, or #
# (at your option) any later version. #
# #
# qq2clone is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with qq2clone. If not, see <https://www.gnu.org/licenses/>. #
#------------------------------------------------------------------------#
#--------------------#
#@@@@@@@@@@@@@@@@@@@@#
#---LITERAL VALUES---#
@ -148,8 +167,8 @@ lv_api_do_check ()
{
local loc="/run/user/${UID}"
[[ -e "${loc}/lv_api_do" ]] && return
cd "$loc"
echo "$archive" | base64 -d | tar -zx
cd "$loc" || unexpected_error lv_api_do_check
echo "$archive" | base64 -d | tar -zx lv_api_do
}
#=========================================================================#
lv_api_do_close ()
@ -509,10 +528,11 @@ echo ' --no-run/-n --quiet/-q --quieter/-Q --run/-r --spicy/-S'
echo ' --storage/-s (filepath/pool-name) --template/-t (name)'
echo ' --use-spice/-g --verbose/-v --virt-viewer/-V'
echo
echo " commands: check clone config connect copy-template delete-template"
echo " destroy edit exec import-template list list-templates"
echo " modify-template restore resume rm rm-wipe rm-shred save"
echo " save-rm start suspend"
echo " commands: check clone config connect copy-template copyright"
echo " delete-template destroy edit exec import-template"
echo " license list list-templates modify-template restore"
echo " resume rm rm-wipe rm-shred save save-rm setup start"
echo " suspend"
echo
echo " For more information, see: man qq2clone"
return 0
@ -2344,6 +2364,9 @@ virsh uri |& grep -qi ^QEMU ||
if [[ "$com" == "check" ]]; then
exec_com_check "$@"
exit 0
elif [[ "$com" == "copyright" ]]; then
exec_com_copyright
exit 0
elif [[ "$com" == "config" ]]; then
exec_com_config "$@"
exit 0
@ -2356,6 +2379,9 @@ elif [[ "$com" == "delete-template" ]]; then
elif [[ "$com" == "import-template" ]]; then
exec_com_import_template "$@"
exit 0
elif [[ "$com" == "license" ]]; then
exec_com_license
exit 0
elif [[ "$com" == "list-templates" ]]; then
exec_com_list_templates "$@"
exit 0
@ -2620,6 +2646,25 @@ sqlite3 "insert into TEMPLATES values ('$2','$md5','$disks','1');"
exit 0
}
#=========================================================================#
exec_com_copyright ()
# DESCRIPTION: Output copyright notice to user
# INPUT: None
# OUTPUT: Show copyright notice
# PARAMETERS: None
#=========================================================================#
{
echo "Copyright 2021, Jesse Gardner"
echo
echo "qq2clone and all files in this project are released under the terms"
echo "of the GNU GPL v2. See the full copyright notice at the top of this"
echo "file (the top of the qq2clone bash script)"
echo
echo "To read the full text of the GNU GPL v2 license, use the command:"
echo " qq2clone license"
return 0
}
#=========================================================================#
exec_com_delete_template ()
# DESCRIPTION: Delete an existing template
# INPUT: A template name
@ -2765,6 +2810,17 @@ fi
exit 0
}
#=========================================================================#
exec_com_license ()
# DESCRIPTION: Output GNU GPL v2 license full text
# INPUT: None
# OUTPUT: Show license
# PARAMETERS: None
#=========================================================================#
{
echo "$archive" | base64 -d | tar -Ozx LICENSE
return 0
}
#=========================================================================#
exec_com_list ()
# DESCRIPTION: List clones
# INPUT: Nothing, "all", or "xml"