From fb10e52b6bf1a4978348226a35bef8c4c9a539f6 Mon Sep 17 00:00:00 2001 From: parazyd Date: Sun, 23 Apr 2017 14:59:01 +0200 Subject: [PATCH 01/18] apply uefi_opt if we're building a uefi-enabled iso --- zlibs/iso | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/zlibs/iso b/zlibs/iso index 2cd3bdb..1871c09 100644 --- a/zlibs/iso +++ b/zlibs/iso @@ -102,6 +102,10 @@ iso_xorriso_build() { notice "building iso..." isoname="${image_name}-live.iso" + [[ -n "$mkefi" ]] && { + uefi_opt="-eltorito-alt-boot -e boot/grub/efiboot.img -isohybrid-gpt-basdat -no-emul-boot" + } + mkdir -p $R/dist pushd $workdir sudo xorriso -as mkisofs -r -J -joliet-long -l \ @@ -113,6 +117,7 @@ iso_xorriso_build() { -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ + ${=uefi_opt} \ -o $R/dist/$isoname \ binary || zerr popd From db35673fa3bf58ac329dd91d9b8aa772e788f952 Mon Sep 17 00:00:00 2001 From: parazyd Date: Sun, 23 Apr 2017 15:03:22 +0200 Subject: [PATCH 02/18] same for iso_squash_strap --- zlibs/iso | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/zlibs/iso b/zlibs/iso index 1871c09..b5440e0 100644 --- a/zlibs/iso +++ b/zlibs/iso @@ -88,10 +88,13 @@ iso_squash_strap() { notice "creating squashfs out of strapdir" + [[ -n "$mkefi" ]] && uefi_opt="-Xbcj x86" pushd $workdir sudo mksquashfs $strapdir binary/live/filesystem.squashfs \ + ${=uefi_opt} \ -noappend -comp xz || zerr popd + unset uefi_opt } iso_xorriso_build() { @@ -121,6 +124,7 @@ iso_xorriso_build() { -o $R/dist/$isoname \ binary || zerr popd + unset uefi_opt } iso_setup_installer() { From 8ad0d444e30374684f64168bf669ba5d235455d3 Mon Sep 17 00:00:00 2001 From: parazyd Date: Sun, 23 Apr 2017 16:58:54 +0200 Subject: [PATCH 03/18] update the sources list if needed when unpacking the tarball --- zlibs/bootstrap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zlibs/bootstrap b/zlibs/bootstrap index a2ef358..f0d1e3e 100644 --- a/zlibs/bootstrap +++ b/zlibs/bootstrap @@ -148,6 +148,8 @@ bootstrap_tar_unpack() { exit 1 fi + conf_print_sourceslist | sudo tee $strapdir/etc/apt/sources.list >/dev/null + cat </dev/null #!/bin/sh apt-get update From 9461b3b87bceb2cb476becd7823058556ca88eb0 Mon Sep 17 00:00:00 2001 From: parazyd Date: Sat, 15 Apr 2017 18:17:02 +0200 Subject: [PATCH 04/18] unpack the tarball now and then --- zlibs/bootstrap | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/zlibs/bootstrap b/zlibs/bootstrap index f0d1e3e..ecd083d 100644 --- a/zlibs/bootstrap +++ b/zlibs/bootstrap @@ -116,7 +116,7 @@ bootstrap_tar_pack() { local _dest=$(dirname $bootstrap_tgz) if [[ -f $bootstrap_tgz ]]; then - act "tarball found already in $_dest" + notice "tarball found already in $_dest" else notice "Creating boostrap tarball in $bootstrap_tgz" silly @@ -138,14 +138,13 @@ bootstrap_tar_unpack() { ckreq || return 1 if [[ -f "${unpath}/.keep" ]]; then + act "skipping tarball unpack" + else + sudo rm -rf ${unpath} mkdir -p ${unpath} silly sudo tar xfp $bootstrap_tgz -C ${unpath} sudo mkdir -p ${unpath}/{boot,dev,sys,proc} - else - error "no .keep file found. exiting..." - zerr - exit 1 fi conf_print_sourceslist | sudo tee $strapdir/etc/apt/sources.list >/dev/null From 523994035e0c0dc38aadc52bef957b3e6c1bcf69 Mon Sep 17 00:00:00 2001 From: parazyd Date: Wed, 3 May 2017 14:04:59 +0200 Subject: [PATCH 05/18] safer fails --- zlibs/helpers | 76 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/zlibs/helpers b/zlibs/helpers index fe81321..20fd835 100644 --- a/zlibs/helpers +++ b/zlibs/helpers @@ -33,14 +33,14 @@ build_image_dist() { notice "building complete dist image" act "$image_name" - bootstrap_complete_base || zerr - blend_preinst || zerr - image_prepare_raw || zerr - image_partition_raw_${parted_type} || zerr - build_kernel_${arch} || zerr - blend_postinst || zerr - rsync_to_raw_image || zerr - image_pack_dist || zerr + bootstrap_complete_base || { zerr; wrapup } + blend_preinst || { zerr; wrapup } + image_prepare_raw || { zerr; wrapup } + image_partition_raw_${parted_type} || { zerr; wrapup } + build_kernel_${arch} || { zerr; wrapup } + blend_postinst || { zerr; wrapup } + rsync_to_raw_image || { zerr; wrapup } + image_pack_dist || { zerr; wrapup } } build_iso_dist() { @@ -50,16 +50,16 @@ build_iso_dist() { notice "building complete iso image" - bootstrap_complete_base || zerr - blend_preinst || zerr - iso_prepare_strap || zerr - build_kernel_${arch} || zerr - iso_setup_isolinux || zerr - iso_write_isolinux_cfg || zerr + bootstrap_complete_base || { zerr; wrapup } + blend_preinst || { zerr; wrapup } + iso_prepare_strap || { zerr; wrapup } + build_kernel_${arch} || { zerr; wrapup } + iso_setup_isolinux || { zerr; wrapup } + iso_write_isolinux_cfg || { zerr; wrapup } #[[ $INSTALLER = 1 ]] && iso_setup_installer || zerr - blend_postinst || zerr - iso_squash_strap || zerr - iso_xorriso_build || zerr + blend_postinst || { zerr; wrapup } + iso_squash_strap || { zerr; wrapup } + iso_xorriso_build || { zerr; wrapup } } build_vagrant_dist() { @@ -69,16 +69,16 @@ build_vagrant_dist() { notice "building complete vagrant image" - image_${imageformat}_as_strapdir || zerr - bootstrap_complete_base || zerr - vm_inject_overrides || zerr - blend_preinst || zerr - vm_setup_grub || zerr - blend_postinst || zerr - vm_umount_${imageformat} || zerr - vm_vbox_setup || zerr - vm_vagrant_package || zerr - vm_pack_dist || zerr + image_${imageformat}_as_strapdir || { zerr; wrapup } + bootstrap_complete_base || { zerr; wrapup } + vm_inject_overrides || { zerr; wrapup } + blend_preinst || { zerr; wrapup } + vm_setup_grub || { zerr; wrapup } + blend_postinst || { zerr; wrapup } + vm_umount_${imageformat} || { zerr; wrapup } + vm_vbox_setup || { zerr; wrapup } + vm_vagrant_package || { zerr; wrapup } + vm_pack_dist || { zerr; wrapup } } getfield() { @@ -120,15 +120,29 @@ devprocsys() { sudo mount -o bind /dev/pts $werdo/dev/pts && act "mounted devpts" && \ return 0 elif [[ $watdo = umount ]]; then - sudo umount $werdo/dev/pts && act "umounted devpts" && sleep 1 && \ - sudo umount $werdo/dev && act "umounted dev" && sleep 1 && \ - sudo umount $werdo/proc && act "umounted proc" && sleep 1 && \ - sudo umount $werdo/sys && act "umounted sys" && sleep 1 && \ + sudo umount $werdo/dev/pts && act "umounted devpts" && sleep 1 \ + sudo umount $werdo/dev && act "umounted dev" && sleep 1 \ + sudo umount $werdo/proc && act "umounted proc" && sleep 1 \ + sudo umount $werdo/sys && act "umounted sys" && sleep 1 \ return 0 fi return 1 } +wrapup() { + # a hopefully clean exit + fn wrapup + req=(strapdir) + ckreq || { + die "something is very wrong" + die "cleanup yourself, sorry" + exit 1 + } + + devprocsys umount $strapdir + exit 1 +} + findloopmapp() { fn findloopmapp req=(workdir image_name) From 6a0fb10b6db8c62cff5d8d4979d09aafd0dbd976 Mon Sep 17 00:00:00 2001 From: parazyd Date: Wed, 3 May 2017 15:32:40 +0200 Subject: [PATCH 06/18] fixup! safer fails --- zlibs/helpers | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zlibs/helpers b/zlibs/helpers index 20fd835..421c4bc 100644 --- a/zlibs/helpers +++ b/zlibs/helpers @@ -120,10 +120,10 @@ devprocsys() { sudo mount -o bind /dev/pts $werdo/dev/pts && act "mounted devpts" && \ return 0 elif [[ $watdo = umount ]]; then - sudo umount $werdo/dev/pts && act "umounted devpts" && sleep 1 \ - sudo umount $werdo/dev && act "umounted dev" && sleep 1 \ - sudo umount $werdo/proc && act "umounted proc" && sleep 1 \ - sudo umount $werdo/sys && act "umounted sys" && sleep 1 \ + sudo umount $werdo/dev/pts && act "umounted devpts" && sleep 1 + sudo umount $werdo/dev && act "umounted dev" && sleep 1 + sudo umount $werdo/proc && act "umounted proc" && sleep 1 + sudo umount $werdo/sys && act "umounted sys" && sleep 1 return 0 fi return 1 From 96bbb06ae423ad87fc614251e8e21e3c98f687f1 Mon Sep 17 00:00:00 2001 From: parazyd Date: Thu, 4 May 2017 17:28:19 +0200 Subject: [PATCH 07/18] bump to RC2 --- config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config b/config index 3f2ede6..5d69023 100644 --- a/config +++ b/config @@ -28,7 +28,7 @@ arrs+=(core_packages base_packages purge_packages blend_packages) os="devuan" release="jessie" -version="1.0.0-RC" +version="1.0.0-RC2" mirror="http://auto.mirror.devuan.org/merged" section="main" From dac77409c2183138ac6e446461ff9541bb9b591c Mon Sep 17 00:00:00 2001 From: parazyd Date: Fri, 5 May 2017 18:48:21 +0200 Subject: [PATCH 08/18] try a different xz call with an array --- zlibs/imaging | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zlibs/imaging b/zlibs/imaging index b508915..1328f90 100644 --- a/zlibs/imaging +++ b/zlibs/imaging @@ -114,12 +114,12 @@ image_pack_dist() { zerr } - _xz="xz -zv" + _xz=(xz -zv) [[ $(command -v pixz) ]] && _xz=pixz notice "compressing image with $_xz" silly pushd $workdir - ${=_xz} ${image_name}.img + ${xz} "${image_name}.img" notice "generating sha256 for ${image_name}.img.xz" sha256sum ${image_name}.img.xz > ${image_name}.img.xz.sha From 23cc6fc711360faae31bd27fce5dc79b13d037b1 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 13:57:01 +0200 Subject: [PATCH 09/18] deprecate kpartx in favor of partx --- zlibs/helpers | 2 +- zlibs/imaging | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/zlibs/helpers b/zlibs/helpers index 421c4bc..c9c0253 100644 --- a/zlibs/helpers +++ b/zlibs/helpers @@ -151,7 +151,7 @@ findloopmapp() { notice "finding a free loopdevice" loopdevice=$(sudo losetup -f --show $workdir/${image_name}.img) - mappdevice=$(sudo kpartx -va $loopdevice | \ + mappdevice=$(sudo partx -va $loopdevice | \ sed -E 's/.*(loop[0-9])p.*/\1/g' | sed 1q) func "loopdevice: $loopdevice" diff --git a/zlibs/imaging b/zlibs/imaging index 1328f90..50f4d0a 100644 --- a/zlibs/imaging +++ b/zlibs/imaging @@ -105,8 +105,8 @@ image_pack_dist() { sleep 1 } - sudo kpartx -dv $loopdevice || { - die "kpartx failed to remove $loopdevice" + sudo partx -dv $loopdevice || { + die "partx failed to remove $loopdevice" zerr } sudo losetup -d $loopdevice || { From eed8948991efb08973f0e20e0e5b31dd3c1ddfc0 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 15:12:43 +0200 Subject: [PATCH 10/18] import devuan keyring as git submodule and utilize it in debootstrap --- .gitmodules | 3 +++ extra/devuan-keyring | 1 + zlibs/bootstrap | 1 + 3 files changed, 5 insertions(+) create mode 100644 .gitmodules create mode 160000 extra/devuan-keyring diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e0fab89 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extra/devuan-keyring"] + path = extra/devuan-keyring + url = https://git.devuan.org/devuan-packages/devuan-keyring diff --git a/extra/devuan-keyring b/extra/devuan-keyring new file mode 160000 index 0000000..e82213e --- /dev/null +++ b/extra/devuan-keyring @@ -0,0 +1 @@ +Subproject commit e82213e52259a497db285c59758b9f6a95308060 diff --git a/zlibs/bootstrap b/zlibs/bootstrap index ecd083d..bbafa53 100644 --- a/zlibs/bootstrap +++ b/zlibs/bootstrap @@ -40,6 +40,7 @@ bootstrap_complete_base() { export DEBIAN_FRONTEND=noninteractive sudo -E debootstrap \ + --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-keyring.gpg" \ --foreign \ --arch $arch $release $strapdir $mirror || zerr From 22c24a992ce3f5fc0004f1d87c63a8d3e97126f0 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 15:34:19 +0200 Subject: [PATCH 11/18] use the correct -archive- keyring --- zlibs/bootstrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zlibs/bootstrap b/zlibs/bootstrap index bbafa53..ab6493d 100644 --- a/zlibs/bootstrap +++ b/zlibs/bootstrap @@ -40,7 +40,7 @@ bootstrap_complete_base() { export DEBIAN_FRONTEND=noninteractive sudo -E debootstrap \ - --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-keyring.gpg" \ + --keyring="$LIBPATH/extra/devuan-keyring/keyrings/devuan-archive-keyring.gpg" \ --foreign \ --arch $arch $release $strapdir $mirror || zerr From bcfc231bdd21f9bde26a8409d6a8542e3602bc0b Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 16:05:03 +0200 Subject: [PATCH 12/18] proper partx support --- zlibs/helpers | 9 +++------ zlibs/imaging | 11 +++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/zlibs/helpers b/zlibs/helpers index c9c0253..0b30d09 100644 --- a/zlibs/helpers +++ b/zlibs/helpers @@ -143,20 +143,17 @@ wrapup() { exit 1 } -findloopmapp() { - fn findloopmapp +findloopdev() { + fn findloopdev req=(workdir image_name) ckreq || return 1 notice "finding a free loopdevice" loopdevice=$(sudo losetup -f --show $workdir/${image_name}.img) - mappdevice=$(sudo partx -va $loopdevice | \ - sed -E 's/.*(loop[0-9])p.*/\1/g' | sed 1q) + sudo partx -av $loopdevice || zerr func "loopdevice: $loopdevice" - func "mappdevice: $mappdevice" - silly sleep 2 } diff --git a/zlibs/imaging b/zlibs/imaging index 50f4d0a..dce77d6 100644 --- a/zlibs/imaging +++ b/zlibs/imaging @@ -45,8 +45,8 @@ image_partition_raw_dos() { parted $workdir/${image_name}.img --script -- mkpart primary ${parted_boot} parted $workdir/${image_name}.img --script -- mkpart primary ${parted_root} - ## get loopdevice and mapper device (see ./helpers) - findloopmapp + ## get loopdevice (see ./helpers) + findloopdev mappdevice="/dev/mapper/${mappdevice}" bootpart=${mappdevice}p1 @@ -77,11 +77,10 @@ image_partition_raw_gpt() { awk '/Sec GPT table/ {print $1}') - ${gpt_root[1]}) \ -l Root $workdir/${image_name}.img - findloopmapp + findloopdev - mappdevice="/dev/mapper/${mappdevice}" - bootpart=${mappdevice}p1 - rootpart=${mappdevice}p2 + bootpart=${loopdevice}p1 + rootpart=${loopdevice}p2 notice "formatting partitions..." sudo mkfs.ext4 -L rootfs ${rootpart} From d693431e2574209296e112d28f67f586deb8bcbd Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 16:33:44 +0200 Subject: [PATCH 13/18] fixup! proper partx support --- zlibs/helpers | 2 ++ zlibs/imaging | 9 ++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/zlibs/helpers b/zlibs/helpers index 0b30d09..6c0d61f 100644 --- a/zlibs/helpers +++ b/zlibs/helpers @@ -19,6 +19,8 @@ ## helper functions that make my life easier +vars+=(loopdevice) + build_image_dist() { fn build_image_dist req=(arch size parted_type) diff --git a/zlibs/imaging b/zlibs/imaging index dce77d6..c5719f6 100644 --- a/zlibs/imaging +++ b/zlibs/imaging @@ -48,9 +48,8 @@ image_partition_raw_dos() { ## get loopdevice (see ./helpers) findloopdev - mappdevice="/dev/mapper/${mappdevice}" - bootpart=${mappdevice}p1 - rootpart=${mappdevice}p2 + bootpart=${loopdevice}p1 + rootpart=${loopdevice}p2 notice "formatting partitions..." sudo mkfs.vfat ${bootpart} @@ -79,8 +78,8 @@ image_partition_raw_gpt() { findloopdev - bootpart=${loopdevice}p1 - rootpart=${loopdevice}p2 + bootpart="${loopdevice}p1" + rootpart="${loopdevice}p2" notice "formatting partitions..." sudo mkfs.ext4 -L rootfs ${rootpart} From 4c80ff10ef378c687f0a46680678c2ce63cc0482 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 17:08:41 +0200 Subject: [PATCH 14/18] no need for mappdevice in image_pack_dist --- zlibs/imaging | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zlibs/imaging b/zlibs/imaging index c5719f6..a5f8caf 100644 --- a/zlibs/imaging +++ b/zlibs/imaging @@ -87,14 +87,14 @@ image_partition_raw_gpt() { image_pack_dist() { fn image_pack_dist - req=(mappdevice loopdevice image_name strapdir workdir) + req=(loopdevice image_name strapdir workdir) ckreq || return 1 notice "packaging image for dist" act "rechecking filesystem" - sudo e2fsck -f ${mappdevice}p2 - sudo resize2fs ${mappdevice}p2 + sudo e2fsck -f ${loopdevice}p2 + sudo resize2fs ${loopdevice}p2 sleep 2 From fafcb999a2218d2bbc9827f296723d98baebafd3 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 18:16:44 +0200 Subject: [PATCH 15/18] support gentoo isolinux location --- zlibs/iso | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/zlibs/iso b/zlibs/iso index b5440e0..aa23845 100644 --- a/zlibs/iso +++ b/zlibs/iso @@ -52,10 +52,24 @@ iso_setup_isolinux() { sudo cp $strapdir/boot/vmlinuz* binary/live/vmlinuz sudo cp $strapdir/boot/initrd* binary/live/initrd - sudo cp /usr/share/live/build/bootloaders/isolinux/isolinux.bin \ - binary/isolinux || zerr - sudo cp /usr/share/live/build/bootloaders/isolinux/*.c32 \ - binary/isolinux || zerr + eval $(cat /etc/os-release) + case "$ID" in + devuan) + sudo cp \ + /usr/share/live/build/bootloaders/isolinux/isolinux.bin \ + binary/isolinux || zerr + sudo cp /usr/share/live/build/bootloaders/isolinux/*.c32 \ + binary/isolinux || zerr + ;; + gentoo) + sudo cp \ + /usr/share/syslinux/isolinux.bin binary/isolinux || zerr + sudo cp \ + /usr/ahre/syslinux/*.c32 binary/isolinux || zerr + ;; + *) + warn "no isolinux has been copied. take care of it yourself" + ;; popd } From 6019687bc8724781020b13cbae3d4fd7b408209b Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 18:24:35 +0200 Subject: [PATCH 16/18] fixup! support gentoo isolinux location --- zlibs/iso | 1 + 1 file changed, 1 insertion(+) diff --git a/zlibs/iso b/zlibs/iso index aa23845..033a645 100644 --- a/zlibs/iso +++ b/zlibs/iso @@ -70,6 +70,7 @@ iso_setup_isolinux() { *) warn "no isolinux has been copied. take care of it yourself" ;; + esac popd } From 070f35481d8601e667276b26be15622c19757e02 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 18:45:30 +0200 Subject: [PATCH 17/18] fixup! fixup! support gentoo isolinux location --- zlibs/iso | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zlibs/iso b/zlibs/iso index 033a645..1fbcd1a 100644 --- a/zlibs/iso +++ b/zlibs/iso @@ -65,7 +65,7 @@ iso_setup_isolinux() { sudo cp \ /usr/share/syslinux/isolinux.bin binary/isolinux || zerr sudo cp \ - /usr/ahre/syslinux/*.c32 binary/isolinux || zerr + /usr/share/syslinux/*.c32 binary/isolinux || zerr ;; *) warn "no isolinux has been copied. take care of it yourself" From 67ede3bd8c75222f3399f86841f587f96225c8a1 Mon Sep 17 00:00:00 2001 From: parazyd Date: Mon, 15 May 2017 18:50:57 +0200 Subject: [PATCH 18/18] support for gentoo isohybrid path --- zlibs/.helpers.swp | Bin 0 -> 16384 bytes zlibs/iso | 12 +++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 zlibs/.helpers.swp diff --git a/zlibs/.helpers.swp b/zlibs/.helpers.swp new file mode 100644 index 0000000000000000000000000000000000000000..663166011ba611d66bc0875d70bda691487dba05 GIT binary patch literal 16384 zcmeI3ZHya78GyGbA2r`?RUtr#sblg*Z09aCZ7;c!YjQ^p(&Th^X_YpKS+B?T_SU=G z-SzpLI;0G#dt0MjYqU~Q0w5Sq)_(s6<&hGkrsqZR~ z5E8Q6C*Iwed1vOGcV^#t$5%ga=lmV&mdXK(&+9Dffgiu&>?6N>$5n+z%L?ttzSwU_ z%C?`xPJ+Po^|qNvd~YVO+R&@olYhImUyd6qRnJ}3*+re3dYU9D7rBe8ZS93RieIdP zar#&TV-0Mhfmd4xCnwBQ-&wp-U4Pw~ZSszj#u^xFV61_$2F4l~YhbK_u?EH(7;E7F zO#?}IwRJz8+L3jvmwjJ##rHq6&lj`jYgeRSo!y7o_Zu?-xt#3r_-m|zu?EH(7;9jx zfw2b08W?L}tbwrx#u^xFV61_$2L1;cusPl@Q14X|0O0&T-~T`VTFd$&d;lJR3vdpu zg(qHPSs#M;zy){{JpF3RdI(m)g}1`fud=MC;Op=(JP4nG2cQEBP=@Q^`Bz%jlkgaP z89ojl0~hXuGw^2k^(!pv8_%b!Gn`$;&P4^AN)v9EW4DA8vqWUuIdqfS<#|@HL2F3Ud=5SWABHxxU>XjBf`2e(e}!k@DflHk4&Q<= z!N=jfumbnOyTObz--Az~5O*7a>I7XsQRP6@UB98KaX(h_DfM*J2nM&ib}8FQRMF(t z4Mn!1WaIfctKc@(J@-(=P7pYqi9CP)uu9t6$IP6SNZ+R}UsjP$x{L{{iPtRG}X$KU)Bnj(NrAwh5$LmFPSvhUF>@_S&p`O%3{p31&+dyA#1a}!go z-4<3cNUZFePE)f)`pRGzT9FP_@j_{GS`@~UFmf>=8KCr@L2Buw>1wZ`O8cz*dQksr zrxx1IO0D6>i5Ss{4`X%7jMib*L#5qNF|3qZwOf(xC#JmJ(l02vWx0B=R*SK|@C8N8 zgRRPSjltJSm)s83HG`;QC+kBZMwY94+HcgtAWmF=iyn?FNB>L{YptkTAF5>Na%8!z zzDRFbo!I_JeY*a=+DU4`DigzP=ydMCXnjmBW12N5=!Bk5bggd3n+9WKeMW~@=(1+V zwSk$dk?q`=LiMienMst_t1^2~M)Y=5sTV{mOiVSXD~OdHIqkG$IxGX7w(Q11Z7o1~e4A{U@SLdy&idapk#wcdh0$Tcbz8WX>dInbYQvY)`7O6&?B7 zW5h+%X4;I*EX@d6RP0D^(#y!qTN(T4%v)IMsLb1$87=(JO>Ee#q^mQ!01d| zfWhizUVtX=)=SshaFecFyEep&ZMnRYai_?b=~0{?m0e3m$fUi@M;lT#t3-oUaNwuq zQd(hBlVVCPL>A>omL`3uwDIW7k{Y`gbzZ-WsWdWQSJS2sPXS}`@*tfAt9BIA6)y-v zJUcw6y_U6er%HbateRcl5yOdbEpfp*_KH@WzM^+pX*+gxL~dn!0c!5KNt> z;et6qLs!&%Q!yg@RgA}Wq@5(;RJGdc^(rmDTM42Tze0AjAM3b!TLn>PgRY9(K^Ir1 zZLexPSV!}l<%Y5m7xq=q6em}`^VAvjPVM6|dTOCtM}|6?%CUALW$R?cs|SZU()hKB z?Rv3PddKYIu@f_=mS=9CKRLgAR*_|He)-hw(vq4xy{Kl?!p!3G{IN49XBO4MnZ|p?tlYsJrHuPnxSE+XzM&J;QcNac6fzG=A23*4nUJv$P| zN;-sqC=9 z@;h;!ZyUwiu?l6R;x>J%_cwYyuodZeQ<@fMO`DSbD983OgAI*H^|s%rnt^P%O+@9w znyzQmC$mnPH2e#9lWX{aRM)X_rNJ~w&973`yDI7k<>d$YM;m=#i;><&1;;SI$ZfR~ zwa3}3CJ#&;D)Z0H>Ufq%ZRk;UF5NgXyBF=Rs*7x4WdDE94$Hcky{PQ}^YisJZ^9|*K=?XZh*fN2lyNO27U%#fR925`{1?kN_Yi4MttB0@G#sDC*e3u zLIrk!1^*;A@H{*NkHYuhyYL8n1thL;86pTF01bD-EW91w0)LcP0(=WT4?S3dH^L71 z4Y7nTz&W@Hu7zI{KX?>A2Z2?5zrYXZL__B1hqbO(}Nmq?k+BRUkB zF71ii-KHwL6Xnv*RF*0e8p2uN|3Yy_b$F-n65zetiCNTTzs6D=y1p+?6iYqZxn5gq zFIMR~=m$OAtwOOC@RDM64ZWwxf zN$dpviYCgG`VsgsW~&qtu_2rI1=1dZA-v}9?Xu68mru{`n|B0BCffq{exU3m(Z0OV zR1%nc9TxVwZcE5biaFg#R((_CIDb*q5*LNkmU(iAy&{j~-P5yq*@(-4P->2Yw9M^< zQzQ%F4G|}G(YARXwfQ=!R4PW!Ox`mm=!W=E`SV!<6~r|}fYY{pJSARLw&*-?aeLgv zB+c>;Ya2Po*!8Hp2;#i7{TNC%R zjZp+qW6-&~G;dwJ#MQv##T~@^ae9p^H$8nvuIMYB5it(@nl=X0H+fnC)@8;f7Dpa` zLq;?p{2`r_@iEzC7&=6NBoBs!J4{rOc8Ot5OdfpuO^5aywcssz#$>Q>l5iiIXvR;4 zi0;sXaiW~SZ@MkKRx=v0+BFcFP7LikQ9l&_%-HM9?9${-hfGs$KX$Av3L-S1mQT#8 zrG@#~r5jCBUDG^CiNKIFo={-fPfH`JHaz&IJb|XSr zSbIp|j*RR%92OUb1)t2r-t~?7@+C{zrr4{jdKN+#~ZGfZf`h9OrPx-Q}vyo3V)eP7pIjmv4sY(wNm znF4FrK44zPCZ$id>O3B7JW@o%1zG^K*Za}oKKb7t1Y|mPv#imD` zeWaIi{K6Y?#NkK{Q&}Gx#G%U(!#+Gf*-4cN;FdXiD2b?QDYHXnPI`1CPnm{!h*wN= zi?~XfKWi~X4i03b7Q1P7XVqjA+=MyuDpZyx->91<)2Jg2cw`1plL<9AurNnfqf!R5 z(i|trTw|)`^;Ao#@o-k8W81+2DI7j5|E5QHtCD%B;|zv5`dY7eL90m0VwH<3oyUchO0cL?stz}bg)--e4m5MjU&r4!WJA@ACk7<@! zvZXBra|m^GaIUs-b#8ZQ_c@|4oJ_9aT8aQQd0TaNCSkX9?5Lbpr5Z42R_@5Q$%&OL z<`ihr95h(S%q4A1Hmrqx;&o