From 3ed25b5b3f74ca178c521ede40e365d98609f894 Mon Sep 17 00:00:00 2001
From: c0dev0id "
+echo " File: ${_file} (Open Original)My Photos
"
+[ -f index.txt ] && cat index.txt
+
+
+makelink() {
+ _text="$(echo "$1" | sed 's/-/ /g;s/_/ - /g;s/\(....\) \(..\) \(..\)/\1-\2-\3/')"
+ echo "Events:
"
+
+echo ""
+find * -maxdepth 0 -mindepth 0 -type d \
+ | grep "^20" \
+ | grep -v "unlisted" \
+ | sort -r \
+ | while read _dir
+do
+ makelink "$_dir"
+done
+echo "
"
+
+echo "Collections:
"
+
+echo ""
+find * -maxdepth 0 -mindepth 0 -type d \
+ | grep -v "^20" \
+ | grep -v "unlisted" \
+ | sort -r \
+ | while read _dir
+do
+ makelink "$_dir"
+done
+echo "
"
diff --git a/scripts/mkphotos.sh b/scripts/mkphotos.sh
new file mode 100644
index 0000000..77d2000
--- /dev/null
+++ b/scripts/mkphotos.sh
@@ -0,0 +1,90 @@
+#!/bin/sh -e
+
+## settings
+
+DIR="$(basename "$PWD")"
+TITLE="$(basename "$PWD" |sed 's/unlisted-//g' | cut -d"_" -f2- | tr '-' ' ')"
+
+mkdir -p thm mid
+
+echo "$TITLE
"
+[ -f index.txt ] && cat index.txt
+
+echo ""
+echo "
"
+echo ""
+
+_count=0
+find * -maxdepth 0 -mindepth 0 -type f \( -iname "*.jpg" \
+ -o -iname "*.jpeg" \
+ -o -iname "*.png" \
+ -o -iname "*.gif" \
+ \) \
+ | sort -r | while read _file
+do
+ _file_thm="thm/${_file%%.*}.jpg"
+ _file_mid="mid/${_file%%.*}.jpg"
+ _file_html="${_file%%.*}.html"
+ _file_descr="${_file%%.*}.txt"
+
+ # increase file counter
+ _count=$(( _count + 1))
+
+ if [ ! -f "${_file_thm}" ]
+ then
+ convert -quality 73 \
+ -sharpen 2x2 \
+ -auto-orient \
+ -define jpeg:size=440x440 \
+ "$_file" \
+ -thumbnail 220x220^ \
+ -gravity center \
+ -extent 220x220 \
+ "${_file_thm}" \
+ >/dev/null 2>&1 &
+ fi
+
+ if [ ! -f "${_file_mid}" ]
+ then
+ convert -quality 83 \
+ -sharpen 2x2 \
+ -auto-orient \
+ -define jpeg:size=1440x2400 \
+ "$_file" \
+ -thumbnail 720x1600 \
+ "${_file_mid}" \
+ >/dev/null 2>&1 &
+ fi
+ if [ ! -f "${_file_html}" ]
+ then
+ echo " $TITLE
" > "${_file_html}"
+ echo ""
+ if [ $(( _count % 3 )) -eq 0 ]
+ then
+ echo " "
+ fi
+
+ while [ $(pgrep convert | wc -l) -ge 15 ]
+ do sleep 0.3; done
+
+done
+echo " "
+echo "
+$ run this command as user +# run this command as root (or prepend doas/sudo) +diff --git a/site/blog.meta b/site/blog.meta new file mode 100644 index 0000000..4ceb086 --- /dev/null +++ b/site/blog.meta @@ -0,0 +1,2 @@ +title: Blog +section: blog diff --git a/site/blog/2019-04-27-manage-dotfiles-with-git.md b/site/blog/2019-04-27-manage-dotfiles-with-git.md new file mode 100644 index 0000000..a27d99c --- /dev/null +++ b/site/blog/2019-04-27-manage-dotfiles-with-git.md @@ -0,0 +1,58 @@ +# Manage dotfiles with git + +I'm managing my dotfiles with git. My method serves me well for a few +years already and so I think it's time to write it down. + +If you think git, you might think of a dotfile repository and dozens of +symlinks into the home directory. This is precisely what kept me from +using git until I discovered bare repositories. + +Create your dotfile repository with the `--bare` parameter + +
+git init --bare ${HOME}/.cfg ++ +This creates only a folder for git control files, which normally reside +inside the `.git` folder within the repository. + +You can now tell git to use `${HOME}` as your work-tree directory. This +makes git handle your home directory like all the files would be within +the git repository. Now you can: + +
+git --git-dir=${HOME}/.cfg/ --work-tree=${HOME} add .vimrc +git --git-dir=${HOME}/.cfg/ --work-tree=${HOME} commit -m "my .vimrc" ++ +If course it is silly to type out such a long command every time you +want to interract with your dotfiles. So why not create an alias? + +
+alias config='git --git-dir=${HOME}/.cfg/ --work-tree=${HOME}' ++ +Put this in your `~/.bashrc` or `~/.kshrc` and you can now use the command +`config` in the same way you usually use git. + +
+config add .vimrc +config commit -m "my vimrc" ++ +Maybe you have been brave and typed `config status` already. This will +list the content of your whole home directory as "untracked files". This +is not what we want. We can run `git config` and tell it to stop doing +this. But of course we must run our git, which is called `config`. + +
+config config --local status.showUntrackedFiles no ++ +Now git status will only check what's being tracked. So if you add +your vimrc file and later change it, `config status` will show it, +`config diff` will diff it... + +You can now use the power of git with your new `config` command. + +The solution is not perfect, but it comes pretty close... diff --git a/site/blog/2019-10-17-LineageOS-on-Motorola-Z2-Force.md b/site/blog/2019-10-17-LineageOS-on-Motorola-Z2-Force.md new file mode 100644 index 0000000..47a3012 --- /dev/null +++ b/site/blog/2019-10-17-LineageOS-on-Motorola-Z2-Force.md @@ -0,0 +1,42 @@ +# LineageOS on Motorola Z2 Force + +Whenever there is a major LineageOS Update, chances are that I forgot +the flashing process. So here are the notes. + +Disclaimer: Due to the missing tools to flash from OpenBSD, I use my +work computer, which runs windows. + +*Required Downloads:* + +* [Android Platform Tools](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) + (contains adb and fastboot) +* [Motorola Smart Assistant](https://support.lenovo.com/us/en/downloads/ds101291) (contains USB drivers for fastboot) + +*Prepare:* + +- Install motorola smart assistant +- Extract platform-tools make sure you're in the platform tools + directory or that they are in your $PATH. + +*Update steps:* + +- > Boot into bootloader (power+down) +- $ fastboot flash boot_a <lineageos_recovery>.img +- $ fastboot flash boot_b <lineageos_recovery>.img +- > Boot into bootloader (power+down) -> Boot Recovery +- > Factory Reset -> Wipe data / factory reset + Wipe System +- > Apply update -> adb sideload +- $ adb sideload <lineageos>.zip +- $ adb sideload <addons>.zip +- > Reboot + +$ == commandline activity
+# cd /usr +# cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs checkout -P src ++ +*Update the kernel source (if you downloaded it a while ago)* + +
+# cd /usr/src +# cvs -q up -Pd ++ +*Configure Kernel* + +
+# cd /usr/src/sys/arch/amd64/conf +# cp GENERIC.MP MYKERNEL +# config MYKERNEL ++ +*Build and install kernel (amd64)* + +
+# cd /sys/arch/amd64/compile/MYKERNEL +# make clean +# make +# make install # the old kernel is /obsd now ++ +That's it. Reboot. + +This is ONLY the Kernel. If you need to build the whole system, please +consult the OpenBSD documentation. The manpage release(8) is a good start. diff --git a/site/blog/2020-05-17-browser-dark-mode.md b/site/blog/2020-05-17-browser-dark-mode.md new file mode 100644 index 0000000..0fba212 --- /dev/null +++ b/site/blog/2020-05-17-browser-dark-mode.md @@ -0,0 +1,55 @@ +# Browser Dark Mode + +Dark Mode luckily has become a thing also in the non-unix world. Finally +browsers can be used with dark interfaces and websites can have +alternative color schemes. + +However, in other operating systems, there is a global toggle for dark +mode, which also switches the browser into it. This is not the case on +linux and unix systems. + +## Chrome / Chromium / Iridium + +Chrome and Chromium starting with version 73 can be tought to start in +dark mode: + +
+$ chrome --enable-features=WebUIDarkMode --force-dark-mode ++ +Then go to chrome://settings/?search=themes and switch the theme to +"Classic". + +## Firefox + +Firefox learned the dark mode in release 70. + + 0. Go to "about:config" + 1. Enter "ui.systemUsesDarkTheme" into the search bar + 2. Click "Number" and then "+" + 3. Enter "1" and click the check mark + +Right click on a free spot in the icon bar and select "customize". At +the bottom left of the screen, you can switch to a dark theme. + +Note: If you've set privacy.resistFingerprinting to "true" the CSS dark +mode switching won't work. Kudus to +[@andinus@tilde.zone](https://tilde.zone/@andinus) for figuring this out. + +There you go, both browsers are in dark mode now. The UI should be dark +and also websites that support the `@media (prefers-color-scheme: dark)` +directive should make use of it. + +You can test it on my webpage ([https://codevoid.de](https://codevoid.de)). The +light version has a light gray background and a blue font. The dark version has +a dark gray background and an orange font. + +## vim-browser (vimb) + +
+$ echo "set dark-mode=true" >> ${HOME}/.config/vimb/config ++ +## luakit + +Open `:settings` and check `application.prefer_dark_mode` diff --git a/site/blog/2020-11-14-openbsd-fde.md b/site/blog/2020-11-14-openbsd-fde.md new file mode 100644 index 0000000..c16ca16 --- /dev/null +++ b/site/blog/2020-11-14-openbsd-fde.md @@ -0,0 +1,32 @@ +# OpenBSD FDE Setup + +This is a condensed version of [OpenBSD FDE +FAQ](https://www.openbsd.org/faq/faq14.html#softraid). + +Boot installer, drop to shell with "s" + +
+# cd /dev && sh MAKEDEV sd0 +# dd if=/dev/urandom of=/dev/rsd0c bs=1m +# fdisk -iy -g -b 960 sd0 # GPT / without -g and -b for MBR +# disklabel -E sd0 ++ +Note, switch to kbd en before setting the password as this is +what you have on the boot prompt. + +
+# bioctl -c C -l sd0a softraid0 +# dd if=/dev/zero of=/dev/rsd1c bs=1m count=1 ++ +Ctrl+D to restart the installer. Choose sd1 as install target. + +If sd1 is not present: + +
+# cd /dev && sh MAKEDEV sd1 ++ +When the installer later asks about installing with MBR or GPT layout, +choose MBR. Even if you boot via UEFI/GPT. diff --git a/site/blog/2021-01-09-mutt-inline-patch-macro.md b/site/blog/2021-01-09-mutt-inline-patch-macro.md new file mode 100644 index 0000000..363f1a0 --- /dev/null +++ b/site/blog/2021-01-09-mutt-inline-patch-macro.md @@ -0,0 +1,74 @@ +# Mutt inline patch handling + +Developers like to send diffs inline in emails. They do this, because it's fast +and easy to read through them, comment on them and also to apply them. Some +version control systems also take over the email text into the patch description +as well. + +Up to now, my workflow was manual. I had to save the email somewhere, then open +a terminal, cd to the direcory the patch shall be applied in and call the patch +utility with the path to the saved email as argument. + +No more. + +This mutt macro takes the current visible email and copies it to a temporary +file (/tmp/mutt-patch.diff). Then it executes the portpatch.sh shell script. All +with one push on ctrl+s while looking at the email. + +The macro must be written in one line and ^S can be entered with the keyboard +sequence ctrl+v ctrl+s: + +
+macro pager ^S "<shell-escape>rm -f /tmp/mutt-patch.diff<enter><copy-message>/tmp/mutt-patch.diff<enter><enter-command>echo 'Saved as /tmp/mutt-patch.diff'<enter><shell-escape> ~/.mutt/scripts/portpatch.sh /tmp/mutt-patch.diff<enter>" ++ +The portpatch.sh script: + +
+#!/bin/sh +# needs converters/qprint +clear + +echo '---------------------------------------------------------------------' +grep -E 'Subject: |^Index|^RCS|^diff --git|^file +|^[-+]{3} ' "${1}" +echo '---------------------------------------------------------------------' + +printf "Apply patch on path [defaults to /usr/ports]? " +read -r _path + +printf "Fix quoted-printable mangeled patch? [y/N]: " +read -r _qprint + +case ${_qprint} in + [y|Y]) _catcmd="qprint -d"; ;; + *) _catcmd="cat"; ;; +esac + +printf "Strip? [0]: " +read -r _strip + +${_catcmd} "${1}" | doas patch -Ep${_strip:=0} -d ${_path:=/usr/ports} +cd ${_path} && ksh ++ +The script shows some relvant bits from the email patch that are handy +to determine on which path the patch shall be applied. + +Next it allows the user to enter a different path. I mostly use /usr/ports, so +this is the default. Then the patch is applied and a ksh shell is opened for +further work. + +Quitting the shell brings me back to mutt to work on the next email. + +Sometimes someone sends a mangled patch encoded in quoted-printable. My script +allows to fix this with qprint. + +Git diffs mostly need strip 1 to cut off the a/ b/ in front of the file path, so +the script is asking for that too. For most patches on ports@, the defaults are +fine and hitting enter 2 times works as intended. + +*...and if everyone would generate patches from the /usr/ports root, it wouldn't +even be necessary to enter the path.* + +This is quite friggin handy. + diff --git a/site/blog/2021-05-19-gnupg-quickstart.md b/site/blog/2021-05-19-gnupg-quickstart.md new file mode 100644 index 0000000..5d82ff3 --- /dev/null +++ b/site/blog/2021-05-19-gnupg-quickstart.md @@ -0,0 +1,213 @@ +# GnuPG Quickstart + +I love GPG and the way it works. I know there are many that complain +about it because it has flaws. My stance on this is that I prefer +battle-tested software with known flaws to something with unknown flaws. + +Anyway, this should get you started with GnuPG + +## Prerequisites + +Install gpg and pinentry. + +
+# pkg_add gnupg pinentry ++ +## You need a Key + +If you want to lock and unlock stuff, you need a key. This is how you +get to one: + +
+$ gpg --generate-key ++ +Hop through the wizard until you see these lines: + +
+pub rsa3072 2021-05-19 [SC] [expires: 2023-05-19] + BA696588D9A04AD9F70DA33EC54733F6DBECC2C1 +uid John Doe <j.doe@example.com> +sub rsa3072 2021-05-19 [E] [expires: 2023-05-19] ++ +If you see an error like: + gpg: agent_genkey failed: Permission denied + +Add the following entry and try again. + +
+$ echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf ++ +Congratulations, you got yourself a GPG Key. This long gibberish is your +full GPG Key ID. Most of the time, you can simply use the last 8 +characters. So the short version of this GPG Key is DBECC2C1. + +You can set it as default key, so it's used to encrypt stuff when no +explicit key is given. + +
+$ echo "default-key DBECC2C1" >> ~/.gnupg/gpg.conf ++ +## Share the key with your people + +If you want someone to be able to encrypt something for you, send him or +her the output of: + +
+$ gpg --export -a DBECC2C1 ++ +You can also use your email address instead of the Key ID, if you have +only one key with it. This key is public. So put it on some webspace and +add a link to your email header or signature. + +## Upload the key so people can find it (optional) + +You can also upload your key to a key server. For this, configure a +keyserver: + +
+$ echo "keyserver hkps://keys.openpgp.org" >> ~/.gnupg/gpg.conf ++ +Then send your key to it: + +
+$ gpg --send-keys DBECC2C1 ++ +## You got a key from someone + +Add a key from someone else to gnupg, so you can use it to encrypt data +for this person. If the key is on your harddrive, use: + +
+$ gpg --import <pubkeyfile.asc> ++ +The file ending here is kind of undefined. Some call it .asc, .gpg, .pub +or .key. If the key is on a key server, you can import it like so: + +
+$ gpg --recv-key 52BE43BA ++ +This would import my key. You can look at it now with: + +
+$ gpg --list-keys 52BE43BA ++ +## Encrypt a file + +This encrypts the file plain.txt with the public key DBECC2C1. + +
+$ gpg --encrypt -r DBECC2C1 file.txt ++ +Now you have file.txt.gpg, which is the encrypted version + +## Decrypt a file + +GnuPG automaticall figures out what key it can use to decrypt a file. So +this will output the content of file.txt on the terminal. If you want +to save the output in a file, add -o file.txt. + +
+$ gpg -d file.txt.gpg +$ gpg -d file.txt.gpg -o file.txt ++ +## Choose a better password prompt (optional) + +You can change the way gpg asks for the password: + +
+$ cat ~/.gnupg/gpg-agent.conf +[...] +pinentry-program /usr/local/bin/pinentry-curses +[...] ++ +Options are: + + - pinentry (sometimes also called pinentry-tty) + - pinentry-curses + - pinentry-gtk2: pkg_add pinentry-gtk2 + - pinentry-gnome3: pkg_add pinentry-gnome3 + - pinentry-dmenu: https://github.com/ritze/pinentry-dmenu + +*Note: If you use a console pinentry program and want to use gpg with a +GUI tool (like thunderbird), the password prompt will be invisible and +gpg/thunderbird will freeze.* + +Makes sense, doesn't it? + +## Start GPG Agent for password caching (optional) + +Put this in your .kshrc or .bashrc: + +
+export GPG_TTY=$(tty) +gpg-connect-agent /bye ++ +## Make a Backup (not so optional) + +There is no handholding cloud or support team you can call when you +messed up or deleted your key. So back it up safely. + +Either you backup your ~/.gnugp directory, or you export the secret +keys and backup them safely. + +
+$ gpg --export-secret-keys -a DBECC2C1 > gpg_key_backup.sec ++ +Seriously, don't skip this step. + +## Configure Mutt (optional) + +Install mutt with the gpgme flavor. Gpgme is the "new way" of handling +gpg in mutt. + +
+# pkg_add mutt--gpgme ++ +If you're not on OpenBSD, check with `mutt -v` if it was compiled with +the `--enable-gpgme` option. Then enable it in mutt. + +
+$ cat ~/.muttrc +[...] +crypt_use_gpgme = yes +[...] ++ +In the mutt compose view, you can now select Security Options. + +
+ From: c0dev0id <c0@example.com> + To: j.doe@example.com + Cc: + Bcc: + Subject: Hello my friend + Reply-To: + Fcc: =Sent + Security: Sign, Encrypt (PGP/MIME) + Sign as: <default> ++ +You can change the setting with the key "p", which should bring up a +selection menu. + + PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, s/(m)ime or (c)lear? + +*That's it! GPG is not difficult. You need to know a few bits, but these are not +more difficult than many other things we do on a daily basis.* diff --git a/site/blog/2021-09-26-memory-management.md b/site/blog/2021-09-26-memory-management.md new file mode 100644 index 0000000..dc02446 --- /dev/null +++ b/site/blog/2021-09-26-memory-management.md @@ -0,0 +1,69 @@ +Disclaimer: I'm trying to learn this stuff. Now a year later, I think +I got some terminology wrong. The process address space is not one, but +many pages. How many depends on the page size. + +# Memory management, virtual and residential memory + +Memory management is a complex topic and most can be left for the kernel +to handle. But having a fundamental idea about where memory is +allocated greatly helps in understanding top(1) and the memory footprint +of applications. + +## Process memory address space (page) + +When a process starts up, the kernel assigns it a so called memory page. +The page size depends on the architecture. On amd64 it's 2^64 - 1 bytes. + +Every memory allocation this process performs, returns a pointer to some +place within this page. Forcing a pointer outside this page, will cause +a SEGFAULT. + +
+char *w = 1; // segfault +char *w = malloc(12); // returns pointer within page ++ +# Memory allocation (virtual memory) + +Let's say we allocatate 2G of memory: + +
+char *m = malloc(2*1073741824); // 2*1G in bytes ++ +This will grab 2G of consecutive address space within the process memory. +At this point, the memory is likely available but not guaranteed. The +allocation shows up in top(1) as "SIZE" or on linux as "VIRT"ual memory. +This memory is not actually used. So nothing has been written to the +physical RAM chip in your computer. + +# Using memory (residential memory) + +Once memory gets used, it will actually use up space on your RAM chip. + +
+memset(m, 'u', 1073741824); ++ +Now we've written the character "u" to the first 1G of our allocated +memory. If we look at top(), we'll see something like this: + +
+ PID TID PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND +96621 569318 3 0 2048M 1027M sleep/12 ttyin 0:01 1.66% ./a.out + ^ ^ + allocated memory -' `- used (written) memory ++ +Note 1: When memory is swapped to disk, it leaves the residential bucket and +can be seen as swap->used. + +Note 2: Stack memory will also show up as residential when used. Unused stack +memory will *not* show up as virtual memory. + +Note 3: Residential memory includes shared memory as well. If you see 10 +chrome processes which are consuming 300MB of residential memory each, this +does *not* mean that chrome as a whole is using 3000MB. + +TODO: Find out how the shared memory part of RES can be seen on OpenBSD. +(Linux has SHR in top) diff --git a/site/code.meta b/site/code.meta new file mode 100644 index 0000000..afc4ec3 --- /dev/null +++ b/site/code.meta @@ -0,0 +1,2 @@ +title: Code +section: code diff --git a/site/code.sh b/site/code.sh new file mode 100644 index 0000000..5a1d89a --- /dev/null +++ b/site/code.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +_distpath="$PWD/www/distfiles" +mkdir -p "$_distpath" + +_repopath="/home/sdk/www/repo" + +out() { printf ' %s%s\n' "$1"; } + +out "
Stuff I wrote or regularly contribute to
" + +repo() { + NAME="$1" + LINK="$2" + DESC="$3" + out "Repository | " +out "Description | " +out "
---|
bDX{*Rarb{I0th0!vso?_N)o7o;L{Uop~EMckbiYCgqhrN{AZ(q2Imb!B_etZBuX zh$LYWntQ?s#8~V!LM&HjDbn5#$M>fiu{JUpGDioTF5idTf+I*s&ldzxU#{ZBeVIJR zWNCmeYU|IUUvCN{=fGNW?*d<+5e7SO&DhOS>EBXts1jR}Rq$|^qvp^q?944enzB$3 zK*QG`qoGNI^&3*);pT$xXb&sxiJAM6Uv$g_AT2%&E2yOEdKrruga66o8?0vc+1s$v z>ft6Q;=T@Af5``(+eL)W z*1WLPA3GDHu;j%}(6qE$o(1DO*0kHoN{p(a4AeJXz=rtjv1P$T0AM!!{d}mdbo1IU zO2UaUemi#VoIj%5K|c|Drrrb885t+L9~AP`NMo|9g9@TzBHTGv8w8+(HK(!EoZkFY zjn&FH*3*w{ENjJCdmcT~o+~Ch9L()>W+!!p*=;`+ru+>YmE}}Lrw$$f0000 literal 0 HcmV?d00001 diff --git a/site/code/logo.png b/site/code/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6cbfa28b2d9cbbd564e49f16adc04bc98ff0e755 GIT binary patch literal 7535 zcmZu$by!r}*FGRhN{2LzAPqyy&?O8ANP|eXbazNd%h1ixrHHf)AOa$Sgdic|fYKd9 z=QrN_UGMMreV*spXRTT5eb-*^diMEecFZGnrQ3KkcmM$0hAJy)p{?1kg@b+py(soY zv|+MT)=~oi|9b!s8UX-j=uqe?0C<4`VBHJ=AejI_<(iAolt3piEmV~hfa|Elfe!R9 zTvug74* %>HAU=Y0$MU+hWU8oR&*%EU&p{x%iM>_)!oI$-qD)L z)6dnK>Ar=%69C|3d8tDQv6yk%&SQfybMS^WN2~}@*AB%gp71i9h$ wmQvN?U^YU=t#M=$$9+VA
*tlFl~6?gm h0cnpHG1o_ >anb<^r{ANF~Mfx|%nmj;~bXjFa_+n4a#H!s1SQ%2dmK(g~#5 zahzF1LxNj9!FQ=T^i}z@WpD1gx_Eq#SC_fL48j6_oTFs5WN5TwQGPm+ULdPjR) *k|H&npx?4BfR`Bd~i zPzQ&pq(OX2ft8h_Jdh8&?v6*28y++9BiRfw(7k(tVbFc|$CGT;AAJU5WE2%{K6R@N z{M!BfuuxQ3n^|EIx=Iy&u1OPtMVz3slk2}jJmN8$U0M~7wLPhRg7x|70}_mcGy_xJ zWNkmb*(VD7y?Yv=I_wc|Sk@)!wb;BSS%71kZO?X=@eh>(rHidoR*`sMw_4#~AzQz> zc~FrY?gYt;vY(W#axCd~maz&`q2;tA$)YuKG!eb_3h#&{PBa(iIywnL-xtJwu=+x{ zOTzF_`!-al&_UzIQ>Hcu2K#ewMz4Hw5c52)!1body&eT-Id&Erd#KR8l9bnJbeIMp z%JbO>6CH9U9fwzxHb03ebr*+C P?pe*K#J3>U px=s4#P}lT_c10|!_M|_|4#c*lk>DMUR2*R? zfvS*E4X$##M#@IJyn?ju@Ty90mC5H;;TP-vpB(aND`v}LLQ6&^9 ^R1NPznit!7{0DH6p(-OLhWJQ`Sda4CVY%UqGQD6h5T?`QhGfF z0;|x>CO;H+U{$uiNZDqUA=AR!poeS`)f;s#UT?xMIw7b(0kP%?>e8(h|8~`>-y!HV zeb!h#4kf9ZwT3XhE%B>;|KMh(xHX{(lMse1(d>r%9!iNw`?}s=H!RJY8@@H9o&su5~qlFtp(QHv>5pTshw*d!?9^wiYh| zR~}Aj8Uj_BhPdwF&Fv3)K0_vmQ6iZEUsQt872a}y^^)iW{`thUiT`qTCmYXLIyUhg zk=D|82498l?Yd9fOucrQZT0fy6%N*RKc3Lvw(3b64^T@}d+xn*5{VkB%tmESTLrhZ zIu+M*Ei4Vzw@1yL>>Kg%EvfPRplUtbG-yNL^xYv}h$I)%`PPENMC5`q zt4}C|@-r&DOd8qYyVd-STs1t-^zxFHZ;+ kZ^!9~sYwfM z&TaaTJ^7BKkRi#LugLY}ugh9Z7wdwLgW!za%d5-X!bE%^?yIvh`%#UcHDTs2+Z_i} zeAf@oiLTbACEhk3t|R9zkFM>cdWa4LnOPE7i6;53dlTE+t~U9un>XsQ;V-ADh&H|v zP7aYPn_DjZj5KiBk@WaT(cRY#@!bhMI$IJ&w(O<;_^78*f4`;S!l?Obd68}M3Rx5K z)b(KPWxyocBpelqNz8+2L~-@>!uu1CucmitX*=GyopT?FHcyBQC6t664oAMN*@+)I zWNl)0IYVmC*X#scy5{q?zT`WuJXP_#=<6W)IC|-L=pVSJ+p(Y3XH~ty!A!i84xjU2 zG~#kRzd~u0e=kO6jV$h?QcSk*A|N@NJ4?o=UCGVl=IP1Uj%{8pr`nh9K3Z);MLt)f zX`3fyFV0Rgq+AvZ&*RCq&U!fVtG}&BE W>MCp`O z^ZC454U76VUGNTptY4TaZUSe-GE8r-cdGv|_qKhvA)+@#XndblAW7BD+B#&FE5e|q z0j@X9cdYbG$oil=Y;RVZ?9rB80JPY5RF7H@mH*LGnl{BG`XSaOVmo`G*xS?Ft1fwr zhb7T~!u<)|z{dE)8NY?IZnv71aaJ0br)QX`X@7A=lnKMFD(w4KA=ZnYx$DmovxvJ2 zRuN+&bxp#ar&Z00s6ygCJcr>j1Q%#nmDG37vnoN+vVT2X+SlXknPxr}89dEIlBpd` zcT0dgXNHt6GISNpEu433NE`PoB$168_C@dV>P=j>jzVf`38z%dXBwY-X-ab=gZ25~ zxXVRm3&oI;DC>eUe2Rk2L*|LH`SwT3hP(LnLt*1iM1HqubY&C`4$M?F;g_DXj6<`r zA4C!l`tWz}tK2mqNKE<0;Zy=+68KbP&K-?cD6>%-n-ocv&BCi3&8phTdiJx0>)IMt zUScIREK77Y6HwgWTDHh@=aiv5T{|*Bg%1l$h>8Bb>5?RKA(Wmv&w#uAfkUxIZOCBy ze%DCt8XF3 GNd0^KSTf&Pl)m4DEYv#t6?Kcr=7L0z|=RLh)Y=+S^0$wXQrM6 zacBrevNFnJH 5tWF z9aQ{y`_H~uKjU~=_l=c8`RJtji#^iR&wP}olPx+)J6$;^4c}N9n97FJH?5_f;pzxg z2+}leO&1Ta!L20h?D!P~g|&9uZ&ga0v~Ge(SxAfGlp00=J!2E@2AV>Mgm~8Q2c7Dh znWO}d;0}<=hh0Kj5)8%$RY&^}93BqYlc*U*PqA4mLe|^m 2`$3F zHg&LB@@!8MhFo2Bc9D(%RS|t&25_Tup-&oYsFYWaqA24ua><-pKMM7&I6D?w7SY=* z6)3@8QeHVgJ7>yd%3k6iE+C(=SVCBc@G8&oZNCo}zp(*|mc2_&mQB|9BU~t-T-V5I zucACu8<7}?*YI^?uLQRF>3FQKlAMYqv-Fm;-BNRK_2YaWB8Ia`7w04Sl?Us}*vU>0 zo$9 Pc>7~9UL;y@Md($>ZwwC&jdoIJ}M1d>0TMI zzgC#e^@L*ZlPYVS2(|lM!C#mfbokXkeAm*x<#ZhOB@Iuf(qVXi`ut_AmbGpiJF4ci z)Oq5o_FdIkB_>Qc+be1rRRRcOJiv`>=QI#7#J4pUboAAzJ9lsMRIb@pWA4sf|7VKX zk7z#DRXxl_%`pz!I!V%X#c(RjlVRb-UT=S gqn0Lv4A~=h8_8RQs^q*$Lr94tVjdb?hspbhdEf}CxJ`gqza(4_Bi-tsp9+W^I zR}fd*xZibQBJAs3J?9{xe2vkgib %5OGycoTvknoM~TWnZ rdw-WT=>Au&bVT4AWVz$Uk{leZ`_KVKe#BxH} z?^}L%4>y*~HoCI%FScjkrfi|FKSS8Q&-*`qA-R(0uNf`FbP$8p@; vIJlDO54#!tTB(@#{RxJzZwY-@$=$% zuUIbvrF}s3M5GlgvZA9AQwBpi{`i&&j7<<(vUM6AFd+<&wTIK#W`?h46Hrvc=~3tW z4lp8(vexFA({b93chDijDZK$wckjwkE>87BrK|k+&BV3{GmnBFS3N1UXRj<(tgdFk za00CuJ98l^u6X+XDQ-l$r+{}Q8!or4*Gz`UZFQOs{XG71PL})=cPY(>KT@$$&z^sc zaR|r#!L1Rxv1~HvgR(>!>#M}Mzur)-@cJU}T+yF0Z6N%5@ImbpWBUV1d3qp_3&c<+ zhZkAzvsYgXD6ueEu|IDqh=!J0>5Ag=9%Wbt49F%e*`@4QP-W16hKkfw?c3um_CC>^ z<9+m$e1v`e>Z-I k<^z_@&BCevC3T;IJVijq`+m zZd{2h!Gxlytbl&HFo$h$)wsIFFS~1+-7Un$U+ZLnjEZH4hX_AWg*@-;6B}IL#kz%s zasipeUT!a<8@Ln@3bqG_9j)H4;gg&en2(cLDz~!NhPvzM%PR5GGuZBK$<6q8frr~Z zrUdGHy=&MjCz`|2U^XX*>SV^Gv|l&+S _FbWhP6`i4?kVL%w11P79*G zn_c>&w&Qg0&8L&{g<*{J@Z5YiUrjPnP#+ydS!UzeAzW(ivk-e~1k5HlHIWahKmO?( zZADaUHv7x`JSKkA7U>X9zFZ@_BDQiU*5w+n`Xhc;ombQkI~v7W#y+3%Pbvs lH~P&M2%hd@h2JqrMVB1nXGNGpXj zWjJ&SncOUc$rMdg1?a8(RGs$6>=y=!=w96*4ICL<7q4{OZzcNp-O2&X9@x7V9CS1$ z!fgJ)XOO+B41`Ici!(nT{Nv+wPR*w7$cor!a+ 7 z;+p8*O#Wo{ypvW#luc5 );F2vH#~j zWg4EQ5wZy0J53cHa<7Aa;!`aXi5?bX&$a&4UaPa!pPAV4A=}KO8wzS_7Ts7c+-7iD z`MMyVy0xqllFD;iXE65yNj1Egd)$cIM{apAA`>0U<7kV(ho5hT9={kOlQs?v+8OP6 zb~L(8{oO6t?CYD&s=A{_0m;}_H%LbM%J6Zl pdXNa4h zfee$20WO-LDa0qFM&9*0GE1z#fwy;t%ij7(hV5)s_GZ@S@6HIf6;0705#C61*rRBW zN;-YeIh%Y|KuA%##f+E9TCTQa&-S#Ew8uCks?`Kb({#6EZ)oW-ygJ;-K`GV!>TSs9 zMLUMkwyc`%v?%elSrmgI3??2O>p_i_)$6`x%~89Ry{a2lq0LV+QZJ2)ImB{X+UW?x zGQT`{*>T!_HXsC_jG8%o9K3tP4&|9zFnBS&6;K=WqYht@5jOj>^7yUR#qM{|D}T`} z@7fK-1h%Gb^Zimfsq@)vT!N5&xO82`y*>Gh{-eQC7` Z98Jxf5hB@dbh_ z<6h^A w3A>&;eQJZ;_{cx=VA*15T^eK!e4p@`feio;TSe)hg<>aaNKb8%zB_kaoSgkwNw z^^1<%RpE~ qe5&gElU`LaD01Czu6r7FF$IOKn!e@&AN;lz3*+TXSB6P2MJ%MBkM zqJJ@LMRgv`p<<(nnX6sH`yM;G?7(@V`(WwQ! PRa`G{zA6l7l zl+d9@9mW+SZAGUSb{Ob_wxkD*``b!cFl8vr#in+Lf>mocVC{Ew^JtRq59+j&-7o!e za<={aU|Xs!@Z@993OtYCHKU}8$<1j~@f OT!UZ7&O35w1 |E!N9x$B*XrSV}Ze7AUWwj{N#WAf`9hq2ZIYR{#OyY z*8 ZxepX=Uzd4Y72$ zMw?%C1$g)ccmzas_{AXnA`pHtE--p-;IyCTcmIpv gBrrbsEWjlN8Z1HEe7= ztUUpKesF}oUq3oc@n2~@Yj=-dx_+I}#V5i%XaMzZzyn8f54%V9zP~}}14TN<{t6AE z{0;hhgTLheeGs k^RR576I2|3=o}>k*=ncYY($ZCN`S zD4?hA{FeX`AutgnZft%JT(1i+vMe)O%~ ze~eMv%R<}Q@-KzxoW9??k8R{;lvk{jWSUu10R+*P*8U1MasrG^`a#_Z$rapo;1W JujS0b{s+M ^K6?G{CMJ+`(+? c|SdRw%LD#p*zvSBg%a1Aj-W|GgBc3iqMbNRm+bARTF7<9yo3<^RO&21=DNr*$ z=+^JQ|E9u6c|0};a%=es{d6H#=!bP`NK*!MrHL*bg!j66lPGl8X3h9kh%Cq-@l6w< z>C^Z >!;DKTKgPE68sV zt(`N0z!!RaH)fz-|K0ve^`5nSYUJL*uIy#yV*kAS{ }1A<9(ZwZLP1`x&Hq$Uo$;=(a3L`*NCmh*_m-KnQ#tk=hL| ^1C*bw!Isct9*> G1p&d^Pf9W n}SIEWq@*if)T2++0arwL|Yw`G@vZl3s+&eT7 z(gR!kR61?Dsr$rh7b)%TZKHj9v!6bsU45COn`|dc@jyNH14`(wEoSKqd0dT)q+FhJ z!+Py=ddeNT6@SSrO`pc^i~JuWkJFqHeQD*i(X@Tp917X)FSZ) 2B_&)jO9NU{>kjs+Fh5Ve{jiS)eN|WGb^6F&v1j-uQsfz4 zQ*S5Io$J?3wk!0L`gNk6ehbCcFYt1s$*!FU-)()Hyl=8EzRi5xx|rO1;60&ldm7ub zjY%GgeCzeM>5tXqdzWuP2fM7A(t*Fz(|T~Mtj6R&{|0^sIyl G01={e0Ssf z+e}>GH_?PR35RHPZv3kxPNM5t_s_Mu*SGD*F@qRKd)t!N@xH3MHf2xQ+ZFTsjqPr4 z;|861Xu7ta|Lsq_-dFc@uq~-7&l;oW7#zn)R$>estLfFV8Zo(=9fOS<$Je53Ob7M@ zsw126gjlTi>hP$^zHjPYwRBG2L_1@t?pC_$?LF)KS?ABX1}t9#{W*5y*`*odjHbVv z-_-d8_Ivv9UcsQ>#&33D>&Jt4NK7O&XtPnD12OnFb^f6j;_8TLm6es!XpReNb#-m= zvEbgos<$qkDY19t10ZIFIE=SrE5ZI c4itO zZkKQ|mU)EGk)0c5+=$B|FGA7Hg=2B24)2lJSyKFEwO(mAcST&Rq_{|pr-Sx*aDeCp z{ZJ6^o4~PQg%5H%5N}2vM0Q4+#9j+HHU~by6rP#DEQHz5e-Miu(CSm+>D=rCjxX+$ zmaMdUX5(mz4$3w2ev0%vxOI)HAMh1Lcf_NSyP?Gz5R*lYiD%blk^?cry(cXkJBU_I z_ohvYrcuzEMRbT`p5eiP9M=z_%Q2?}<3Vmm;iG)vjd=Dvj!Q!i*bCq>D2Ro-H2+Z5 zMbXpLH6t}y`azyTgZTLE>sRUGnFxtR`VQ=-wkb4~T`@-Jg|&eg|A5w?N*p>QV7=)7 zDDNR5-VZ)~8ofuML7PMm-~_-CD&w!TBkqlInE5JoxDIObIbr|77HR9Na}RtZ^5}k% zm&Na0+27c|2e MydPt-? jsp7x8?EKLWyuUGe^SQw zH ZWI}wRDE}$v5ML=MVdKsQe%scqH%&yicrK!+yY!ONxr5ui>8xp2z%$If8X0 zT#A#m0{e39T(pp4j~Zef>*r4vJP-Ew{HbHIACcdN^AWhUoR6N)f?bc{v&w_9F6 y*UnDl1_4hVwt2bLmiUK8)+#PTFBFv1ZVQ zvjFD+=H*Ikl;i`X-A$4lKyA)|!uR{h!>EWcP2lwp(o^X^pB2b)zwI0jEO298GrZY?MZ!#T8>iuB8??*0v+B0XhQ5L%t=> zN8|}02NQXR!0T5{_o7X_$AFI=+P;?0#{j`tp$9NHEx*e0II#beQdOTzPY#a_&vQmN zi!No49}8Y?j7D3B{R2!7_5&r-$Qseo8{QA=)JRePg&aylT1%d%4e25NF7_|-GcD-@ z8swFroC!N s)z9se^^vTP~BKSH*1^M)t{Zr&T zV9yV2ub&%?JOk`o>`lX*T0_~|XXLb?oDDxxCH=tz`czi1zhPscH|!tA@{oNT!!veN zw_m;~cKa`}SeJ{@Cq#v~6QLIOQO1v4;v)8kp&QOQVEo91fWM4 ANH{%BXp`$mqm!UtF6NWe~GK4E7p^&5jXt`K>!)mna*++z(7@7!2^?z|obx2-3> zFZ^Zr3$PD{=d3Bd&=>vigRM11XIPIs3Xx~TM=+$dK3g7tvd)!tuB>aox(2jsKrs22 z_+Kt9kD9z^{fiife{1n;#($%_)w6Yct8yRMH<5SF`5KP)?>ZxYgU8|bR*ix4H5}{P quF~e9aQ;jW&O?cOQ!#n$Rnd*}HIQ@C+2P$kB7eqOtTRxZ8TcPlOB9;` literal 0 HcmV?d00001 diff --git a/site/favicon.png b/site/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..3212266a3f3e608fadb196da7d5144a7285b1a65 GIT binary patch literal 1192 zcmV;Z1XufsP) HLiZ+3hDqoEtr5dHZFR-TB04-yEE0b>X(#@NVWSZ-qFKJH zwDi*QsQ@rMjCPTSUkG`AYJ`VlDgm(9{vW`d I^MZpPiWEMkWH`UeOQfg(WR zTQi}%qUY-}5+blN@CnRW@Dhwh^8hN zWTH<$fS^}ngaIgA9Pz^uCHCZ(A|?Bv#Q;k4 zk|434fknX^Z`mUjiy@QR<8b~qXuEV+{#u+cfH|HDRF`C7hf (*rT+(2F{KW9- bDX{*Rarb{I0th0!vso?_N)o7o;L{Uop~EMckbiYCgqhrN{AZ(q2Imb!B_etZBuX zh$LYWntQ?s#8~V!LM&HjDbn5#$M>fiu{JUpGDioTF5idTf+I*s&ldzxU#{ZBeVIJR zWNCmeYU|IUUvCN{=fGNW?*d<+5e7SO&DhOS>EBXts1jR}Rq$|^qvp^q?944enzB$3 zK*QG`qoGNI^&3*);pT$xXb&sxiJAM6Uv$g_AT2%&E2yOEdKrruga66o8?0vc+1s$v z>ft6Q;=T@Af5``(+eL)W z*1WLPA3GDHu;j%}(6qE$o(1DO*0kHoN{p(a4AeJXz=rtjv1P$T0AM!!{d}mdbo1IU zO2UaUemi#VoIj%5K|c|Drrrb885t+L9~AP`NMo|9g9@TzBHTGv8w8+(HK(!EoZkFY zjn&FH*3*w{ENjJCdmcT~o+~Ch9L()>W+!!p*=;`+ru+>YmE}}Lrw$$f0000 literal 0 HcmV?d00001 diff --git a/site/global.meta b/site/global.meta new file mode 100644 index 0000000..ee19823 --- /dev/null +++ b/site/global.meta @@ -0,0 +1 @@ +site_title: Stefan Hagen diff --git a/site/gpg.txt b/site/gpg.txt new file mode 100644 index 0000000..41e1f54 --- /dev/null +++ b/site/gpg.txt @@ -0,0 +1,122 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=ZR0P +-----END PGP PUBLIC KEY BLOCK----- diff --git a/site/helpers.awk b/site/helpers.awk new file mode 100644 index 0000000..5ba1cf9 --- /dev/null +++ b/site/helpers.awk @@ -0,0 +1,38 @@ +{ helpers = "yes" } + +function load_helpers() { + data["page_title"] = page_title() + data["section_blog"] = section_blog() + data["section_code"] = section_code() + data["section_photos"] = section_photos() + data["page_css"] = page_css() +} + +function page_title( title) { + if (data["title"]) { + title = data["title"] " - " data["site_title"] + } else { + title = data["site_title"] + } + return title +} +function section_blog(section) { + if (data["section"] == "blog") { + return " class=\"section\"" + } +} +function section_code(section) { + if (data["section"] == "code") { + return " class=\"section\"" + } +} +function section_photos(section) { + if (data["section"] == "photos") { + return " class=\"section\"" + } +} +function page_css(css) { + if (data["page_css"]) { + return "\n " + } +} diff --git a/site/images/404.png b/site/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..ae118bee79ee2998361fa426f929cd0acfb406e8 GIT binary patch literal 61464 zcmafa1yt6}_b1&YA>BxKcQ;6<(k0#9ASErG(%mVY(ug1;A=2I5vBUd|{qH$@c0EUZ zc=+bboqIoV=aY((3@Q=<5(ESUs+_E(8UzI71^DZY00q7=LKAWW|KYnz>A0#pSh#u^ zJDWp@nK_u4lgZf`e=t`wH#YNf8Zj4yfPj8wrJ>`h^H!1H)WMF~_~jU8Pdi6&HUxyA zh^M2msg1cSnTh!aD|;b| {ptZyA9%q^{Cy`9a~y_Gafy=_eS%qT>J z$pk(5!3FHhU5&{+?QHE`_&tRv{<$tc`26xU3kBIfhq&4ZQT*$nbl$3vNjNy0lW{R~ zF`2Tmvyt)eF|%=T^0BcolCiV0aj>wlvas_pv9a-U^6;~9ll}V-1-P5DnFYU^r1Zb< z1%48uuyl2G h&IFENa`CcvHTGn(ccJ{x6(r4F zOr5P9U9BAK$zHB#Y~tYNDntRE^k1)F=lJ&Re=ltB^6!BHL&oB1?8w5#%*tYC_wru< z9PQ$&X8yk) S>n9Z!r_@%`pr8)VyxWxE)xY*dFIC#Z5rTHYp#l+dfd8D~{x&CvmoV|;yvAwDJ zf6le~-{*4vKhNcta5gt~b#T^jaIpQ)?5S8fxH`C4IyjO^NRYiXHnp;U`SE3B|NWrm z&Q|W`X41|Mc4Yqy4Zqd@xIH(UG$$`F7dJZ(7Y_#~D<3--A1k{UI|m1=w3wI#hXlpH z&oTQSulxT!hXvf6 tfkfLWr|FFf6$w5E=g}g(Rw)Q3L!!m4 z3xu^1WwTcNwXGmcWbGRp?o}-GxBCb0vQu~Wrf}+*6zp+l_3aS;{XxSIW}6?E*~@&h zdM=NQatRXolAkc&$e$)WN4&*&BcDY3YO&y-Z(y!zRbPJBD+Im-pB&@BVgLPgu+KkV zep(@U`BIglMdsxyNeD;(ob%@2zy3eZkq4KAmt68a|2~KCa@dN&VxjGPecdbYIU(+W z@wdxAw-{b5z()FHoc?mtt$!~6xmAYl+s{s)>u?fp%b{3eTaSY|r->}Sy0 a1R(6!ZOGPbH<(4DMty5a}|(SMuS<7hl-l%l`L= zbBy2~^O@h$e5T@ao*%Xi10FB;W-640Z#M>G2xlvGU8alQa#{cK+^_n&_q&Sl4-I%( zx=(D^6eb}7R~*6)otM9dNPMDWSh{YY%s#9a#0f{nV1aQMUW_VFV$imq%9j%IzJS>D zGB+Ph^4iY!Skox}XE0grlzs<14Dl@cf;(h(`Q1NV)&x{(lwodkN=3b{Gk =qh_NCO_WMV`HEQ~q_8g`XW>=YQKh8cw4OAJ&cop6}a_yZ)4_ z7X0&OBkCsfW}iQgCNtFNw_jyCbd~AUtz~f8bUoeevvfbyYm}+|b0^GnpI0d~IllGo zhYN( e-YtrYNq0{xD2A9pz dd#glyLi>BtW=qjqfhDau9;~Z-S&&%9;bg z_k36Lyf;-aMBaKyHs5kONN6)#?Kko!^#Q!@76a{bO~4}qx7*93xrnTs^&zv^{%vbA z==2VF+&6sRY ~q|CJ|Pen zQ>I>Gf_E`3N0a?+8 x*e7UjT(NKZy^~B!j{?lwX?N_bet`!jQbh|x2*YH6(liRLQIvid2 z^c&W-`xh`MXlv+|+b&FGU(QYaEpy;d35>L#&QiPeyf%~XJ4UdSc*)%}U$P!9((ZH# zx*+k*5}_^{EY$$SuNuRE(ImQ=3hnT9bYgzjZsre)@H;`5$SfVTAfjMz*JF5=hPVB$ z|Au!?E!VUk@jtq5e3l8ThVbwNOK00F0hzfaP=;2sTtk>T ~>vMhIoKR`*|zV0bBL9`}tnvv5@9&lO T9-X;=-?i?Zk!zM3;7 zfr|hW9NkK)F@^aveiMYWX~469_k|^IeIM6w6ie4|Nw59W!|emoWcT%w&n?Gwo7;YU zo%f}6gHcQXiQmQ4?Zat#MfFcO+M1pyiUT?aQNpzNR6~D0H#j!G9GW+H(AnF?nf7bP z0v<;ioQ9q;o3aC`;$OFByPukv+rB2gEV3|jv@lCV{?O#HWCnO<+=p(EuB{eZ>Y5$e z54nXMx*y&98Fq>}B(8ezw!UYYLJNcR;rJ`b5C_k=AA;%IhCj)O?3Ek&%>wV`FZJ7y zLQ@jkI#+0qzizm3TPuotD4tBss4p2dL0M5BOvPMatw2YjkkLxwzD O#9hR~ry)$DaN^n6~M+upBU+wn9uXvYsC zN8-u!nywGqIRO*+XhIj0*a;>~EvRoO=@abnIV@1VT6=ey4xvf41>FBxKJ)taN(O~Q zkeBM1z#KKyv{p!2=u(4z_{j4S3~k@kUyz?x(oADp!9w8NisrOi;FMZr!Xu0k9CII> z04W9LTAZo}>!R6wEM>Yx8Mo-WOp@DCi)4vX_G@N6+8vE?c-kCpy9H2bZeVx@ieGZ^ zfD2679JC%hH;CKQyZxH*?e41un}JOU2+dMSLU-K06_la wp`9P@H=QKoIk}D$8WcP<#KwFLHQ`5Q=C?6q05!s+9BOHaQLbOj6$Y__U zKvKUi*C^|L*kth{DJF~FIj_`hs6}$T(l+o46#}(#)_>*c8 =j@!vNg)QvKf4@LGX8={XFl|RCvno+fkg49ykFZq*;K_2CA&U{{S65Bc!5&AB- zg~ir*daAxV{xyf!nHgCo;R@c>{_!G}!GN}*U(tG;$djk}2a~~sG}eC&8FRbG@$X66 zNt8Co7B4uv9?4L4&Ooon%UOXrzx%_l=ZFa6MVUMf_C3UGCXxtUS?P%&ndBUbJe|hH zrUWJs3%FymXo(7rP$hJOWNJ$*h$($Y>UW_!kHTgX!M!L#xTtRWC94XQ0Ts^yUr}pj zk5RgkmG+&$&9PLE!vzp6WfP@d0Le7^fs*>wX7(r;nK?cu2;OnYYr9IXmHjH~pOj{O zI!6gZ^zE0d6+I=1ZRpRvVMHuys`Nr^@&aS*HN&s=e*p}OI0VHAD!3j-hSaYy(S7Sj z&T_Ned(TdkPwph3fX_$27d_sszx(83VhSQ*Lnz1ZD*gG0vis@ICWpvSY_ 9@J6V(3jrFy;h2@paR; j73BP zWQ*}w9#UgKJwj4^=qG*3{dQ7kIuuJPLeghYp;g82wg(ZB<9jx8?0?;^RwQrCXWzC< zom~scRT{jbp(XNNe-a *aqBjTBfbeqaof5M3LYy2de1}% zrq4~3Jtk!#8{GE=b7%qA!=_n!iJX3J`$e4-cb|j0p_Wxp^XcC10K^pChW$n!Wel5n zs?;Ju&H~=0rfrXYhD4 YFHN>#Q=U-dd86H*-|(UjFWBNG8zdqZ)M R{@>&5k6}eDv-QL%j#Z^ywsA 7kINLmQO7QWbZC**qyH+%kqH`=I;w;qX=;700dNiQJ&uuV_z>FZS1lnY^{QoR zZ}Q41F-1%AiNe;yPzmYf{l9a~TK1d&=7W36+?Zf3SIG dv>{8&nbbHIdnhSq;~x+fXrLsMgR@g7B@Jn zhI)Uy1_;gMPe1;RVwXOu&UJq_?NdR}8o&}?9^YniyQy-h-oId%$LfIe5)?x2N{}g3 zdBA#DF$gIFnSo-!aU+J1hgq)$L+|$ (VsYct*c>#g2>pE zQ-J95aO6K*b9dLyrE_~Cc43H;YPrL74eUr1^syPJ^+QA3+RzCT@2)r5%9f*~(~Mf@ z@+u>4bAqz}T3s7NZz=shvta@?XZN=aXGN=53YCMzYvc3RMdv6eTu^zNP8LL4L9jbo zF03Yj)DWplXr^8D?gch;-(BvPbXVX(gm^D?c!5`9|8s_3%S_Orc_BS*-imLYG+XsP zl~S2+Gbx4Xy)||DtXAk&ctMTtOejcuTCL9J&mpjF$6fa=ZBPPUgVU#~;-)<=f8A#F z@dRPLzIbh=mollUVHTswfT3yG_^H4Gi$UHOIgWt3J&}#9Xyc!#W@+&~qsUD1 @SwmZD~Y zBEZE79TaDv+V5P>8Xgz%HBPF58AvL?#0=m*0;#?lc1nre*eN*`GB^2PSgyyfrTJN{ z+y4;~8ZHE9Qa*)o fKRT36 zkcXF!oBhM _lIkGqj`j(9`h&O=$F4E1|^es>pg?6Ceeze*uv@7t=0 zYr;)R t3t50e^RB_$!vERx=u;u0D2BG zr@B}&8Zkd@!6{3?ZB&Cz!s3em@G_3UwWr0Xppo_{2(wOaH>UbXEC?R-nouuU=fvyV zg)ToI4?*VgM*O2@kTdx|9;zga L7PIfx$frI-dBBHDqkn{ zIbahcF`t&fxuYBY># % q5NOmE(PJ!gr;BG6u6I zugN=qph3h>7NR55(n9 BG*~aTxKs0}_ba)NHy6C4FiC$uA{S(& zLf{q_wW5k5otsiuEItSIh(^)2E?_7o`@!E&TuvqD(4AbOLzMbR*({XilN$PzX|f!H z6?i3?=$C?HL-Ex=WV>mB{JBHGv*-wIcnoOgF9PU)s5IoL)CkTH1O<6>NsfP;`pOIK zQc>20M9NmUI+!m&V&(bkn%Jqa-ma1yKo{Rf@}?*7KwKgjN{O8>X<@F>3Tyn`XIBVq z8sF!~>$i30=yNq<`aw_UKSXNI&xbU0<%b+|H=sQ3%+?2EaALQ$^!rE%CfLNSzx+KV ziVjjL>NB&gIGO)?u^TUO)!gNtv_}4}s3)J?dss|KX#(g*IJ3@RS pYkf7{#=Tl%b>aHnwPK*i^( zgBH@xaCjj{xQk7Bm3T~L@4)H=B8<`(LEXA7fNko5CPD99kuDi-K?VDb2+T{y^1~L- zsIDuo6cN$M<3^$~ga-!x7&-H?ijOCKI(#)n{AMErKOv9|)-<5uP+Gtvmnf#6NlORb zn8xx+EBGp=u|fv)?ZyckKR-PJK=_3!kqX*ndl%;V1|CQ+{XLdAwxl(ZWT~ClsYA7^ zai%@2=*GgdG^z=fzlu!g3`Er0R;}?}Bh&bCdOKB+<2!+B`y!zM$ZeF+E;*RR=b~X{ z18DCGS^V9k1bUGDirYxSn;^H6kP0}eN<$T9bth0aN!)&^vRbMiPr?ny%&h%lCjlt$ zvgQVcu0D=~Tz-O2A&E8*Ij95Zs#9$79;Cj2hn*)9L1kwdf?2u;{LuGyGZi4IK4*=p zcgc_2SuSWFwwAE7tmbNs!65RM1a>K=vk%%NOT@d>ezo{Uqf&QIJD>>G lX((gx=#4AU~@JsR%m}s_&J}mvm*T!eU4ce zMa~cj5XNm=i)2VxG=@Wy)np%jZ7 EG#TaG8CJ0<1-@ z)}YSqO(H~@$^yAW7(^_PFFVwFA=Ha}&T9ZyEamLL{|;pIPSk4;lCflM16`2gwo7}W zoM1x+(2fz@f$Y_$aS#E`i^tL54Rpk^JtMn6&Dp$86bB>*hM>&a|CHKz1uN}@4dKd& zC9N>4W&qYK;rm9*Rl*c6LI9_zCCWl3fS{!(n(=yGug>gf^#W}SU>?V($h+yOAzVfs zjNZ;U`E+*kK<7;X@lKptgGS5Gm>qptQdQA))-&Z3*#gkLXn7sCTbahm%uE{DW?P~~ zYiDT~-<9}*3Ya{QW|m+*SJq}4IlFK4$}2VM)$yR|N=3dj9wG$s1e#5XZhm*r!G!Sd z@9S^FD>_J=zP&2P?SA15{b6)z=RMHq!}3niQCKVdr6-~q2|4wR)-%>X&VJgf^ k`wX*cVJIkV(lG=`aiw2awQ(zH(ub+B iynqrdRDP#LN66w0XTeSc6ArVW(lL(E>%Mh z1Vv1~z>3W4zd^1V#6q)bsQ?N$WV!v;1=PZNDnB%(9D-qBIrLM&-E@wiqxZ#>jD$n4 zO1uWuY=asbdd3EwEt7h2^jh-WaWp 8ry37n69Fo& zVd3F`P6w}cvnQ -ULqdeuYSe{9CD{?h5C kDg5=kL6bF3SDuBl z#19bdFA`22)2!HvKhT%yAq}@*44+r{s@SsCZz7`2)ueqr`$@JgYw`Zb+o;-k6awY$ z1|!Tlrp0^ICdq{E_WhA#E%p*+xU%8$NJQB3A$Fu9Hs93vxe3Prf3S}~)NpV|d0=To zgRo|dDBbp`!m3Rii4f6Hpm+bp?L7e9Z)|5!{6lq55N}vSKGFHGQLB v5G#BQgkDCx0^7?U^!Q<2Y@jb&e8L2o- z0H_pmD4O|kYK#Nx5?+zXNK^bwmQm+6s_2ccaHkP_Z*!_9k+`kERpW%N((c5;YGPbD z2JCqMR~a;IDxEr9Zg{Pws|G%Gd2z+aowCTIYr+VUGJDyn@8 !!cotIh>UYLw2FwBPjx0@6zG+#U^%$`%;+vgoSCGunT=aLC) zZ#*nQ=VT;?roUoXZEoVeCiYld&EV$mp3KVjL>WtE2>>pQ#J4zl)#!8|;j!Ejq}%eN zXCN|Z`fBLJMRoxh8&}`;b5kk8r? =KMGf%&H5e!Nsw&O#fs zR{`>d{K;&MVRzO0uNena>2A8P#cRjFS@2x@L=&B`N3{x5`gO@0c@DO?$iU`zr7Ge` zRu&O)!7#e^2G(m4+d0-7fe(R}{i6)p)zQ#-qb7i4LT2YZ0R5wgpT>8&$iY?Q0Jm}< zLYZQ=1~^(XCDAI;t+?7jE*sCzr(EijEDkdp`jGf!n16i$Qto=ML~dPdLITw0d>1Ra z(2tbBf4JZlQo7^=0WG21=31se1$6|tm2)T(&ZKD);Qrp-kB1IG0MxAtE&OyZcVsPZ zL~&r?xGRav=?_p4K^DyXsrAeofQ5_e%2+84T9lVnyr|nEC)UO2S1W^e>76)$9WYUo z=oup<8M?&>!6QERxE96YoR-hI=g(#HJ86Eh8(Y1PZ {WR8EhPQT{X@ zm}}WU?o_fHSGV}_rRtqq9>UXHjWg~~I|dhk8uUG@$)J)7!ZRvmW(k4U0jM!ZPtAbN zOI+;q+%hcm_@EIQg9Ax^N3Iz7N@97zWKSBW%8jPr8hG|rC^5+QbKBls{c#8<2v?AO zv5yG?p@_6=45~C_F?83@;5;VPVbPU9JzfrjljX`SpF{X9-iivA-+)NZ_+r5Gquzqm z%^uYmUrUN-{Eo;sz2xD9#S1tuJfsAq)7E~V$BRE`9`-Qb0=o+zx$Wtf*|&&S1Sdb# zH)N`TWII9}ukBG=po=ke+wf7`F{<|I3Z2 R z>tR3X=kgbh5Qbw(R>qNh6UXICEI&z*mLEi Dz39 zXN>1J=Ixa)c-FyfKE=^U)X(}mt}lc^Gz3L=2 `U~$_f`TGdvi>EV^0h!VSKn8x8jt2erYaq1=VpJ*oi_3h(mqV zwdw;EpI?MkP2ILYZqop%i_nSueBydeXEBg-P(j^KCOZbUY9NAy+PC6E)5vt{bg9sT z0=wld{e5RafNqR(Qs2ls -n2#k!k<7BJU+%my`&ZTr>gc`_fGmw>Zij6xiB zIH1~e=kj=WSptY9t4D&IvLIk4D+dOoAJu_{gDE0vSO+g>{}esPLs-*s7TH8vu%_sK zSf){yz)iqu85n~P;&f#KSf!D1TdzR6FH$el28}98ZCzH=)DwIl&!#6j>e|Izh(~q& z{L<3RzKMFY`aN*HWsl;%8B2Kkg=CP|<3)_O4vt@I7vfCNeD;FC8lXCX1xy~T5 ZUv=89L9YiKrA5&GwwGnmyDZxAGj%?95v(H30zK^bYr+I z+lt4fK|(N{uU};<1tSWpd;)pc+n9B!w3sg2eZk6kGz^WnJpFOiOH>E@m1DRe^yfJ* zY$t%IcPd_wAd_Pvuj)S8mgXi5J@$VldPRFURhS2SYl!9AOq=Rf3($u%^0nkaEb14H zG11a;jiHE6v(g&Z7hjx%bn(M--Wp!?97>tk#_1kA+Aq}s-?Ig9BT@?pyyxH1(#yZX zVWNT{=G!YR;9T7ih^Q~`fY6mMniu6zx7E*wsmd1c_!$Q}E)arLPT+Y6nnS#DyIaC) zLzpMqJsix}8i=X$PO&evyo<6-H`xz3D3X|rx7X0}w2-7sI*lw|Eh5)gj+O?K8}#Gy zs&l1LC3>kfS!-h5f_^6cWxX@NL_wR*8% -#h~GuD 2Pcv$lxbi$`N&uL9l7cCu{cG>})8jo&divX?kJaT8c}nG08D_t)g1!6K z{P3PA^y9unxLeJ54vD|PpvF#CDuiU!u7wO}@(sqFUKvk=@e3 }WeIo8y zS8Sqi=f?uW)=D)}TcnRCH*rr@Xv!ox_c!d^CEkw!bD+Sd8ZE=MP^pWh9 zJ?w>xycCqu(LMP+`*{z*l;I%lwH?-)S6|hrSIljOGi?pAD2NzfKv$$Hm5C!c6H!xS zl3#rl dVP_ErEwO$oIf?H} z ~1c5pnD z5D%bd*rb)S`ElT?xU?lc#?{mJA=JL;)AX4o6owD8uBL!Nt_W0blHXI-08bV;4oY#s z<~G%29#Y{UTVJiF;m-RXLy{?_2H*B@1xq%(@MO?SGP&R%Im4*mrtwj>F<~4px5w)I zqP_qd(}{g;Nz&4D+3&h{I WQEK L(1*HLGnn8ZpdT+ZyoG ziC)7<*WH@t2>V@J-frh?XL-ioK(eC9#-(A=Xv|-LrXQIvk_q^t!Tx!PDir+K*&aQC zkh~dL=hxlOop41|uC$)g^xl-JzfMnwNR{2TRYW1u-yCJdu51v!Ju2||Df#uUJE3qR z&9by3i{2XIwEVLpAEc8GPMtcHBnMxRIE4Mh&J@xgA;9!41=}i4Jb=&>D|DsfFAl4! zwTtn=Jtz D-D45*Lt$10tC*FaAmd9MEGdNbOzrLn`CX1`sj@LA-H*e9Hat8 zoVIuB^N5PtbS 3j&S aU?~a&m-D#fuRsb@ray|^nSo$$!jcsLNB|9L1>9h#gWKP z;-*H$O%-o K mL}CeA?}-$>kPyJXNY&k_Nb+$?yX!}@4kASTiiAo*KR5Y+^O$56Rj*v z{S=LHab|*doGU)=akdAF`Hyh+jxY`BcO`YCI#I#lquZx*jCzq3oDNG_UrO^RJrRi| ztxR89Ld=B@vR)&-o?X?#`Q(;6s3iEj#+`&2$#)9lzzu4{;KvPhZTjH*IL25X&(~QN zOug8Bkoc&h{qvB1=zRHDDmTE)OJUT-EKC%KsO<2pDKxGd+r3Dm^59ex9WUFPt@)uD z2>LJkgguV*)+>qSj)FKM{%%l?(*1seef}a!f{e}U0=T$LEYYXSd>R+-wnVpIpVJ+$ zh`-XTt#>FtL4BVZNmjy|YLFcUXn-hjH5;l1wCc$R^GO;NQAEy%svG#8O1ZcrXFLNT z*lEEuPDm?Js&^U*hyLUfTx3A5t(?UINB2wO(<%pjM2h{*N`f492;uJY{#)rE1iAM! z4S_5O$GuzbN`yg5$O?=i&_;{fAC4a0d8!gm&!UU++vmXr;MiFAzP2`xW3 YGw++e0mJkz}eT#82_ zmHBYTJR!3rm+v*n)=Tr3;PJaCdHy^Vmd_1{qHN?^+$(8IAF^?~0ci`G!+VT41giBX zt? c%lD z8e&MD_J8@4UyE|AEUeNibm$Mg7nOD-EoODw)0o5f0~V?SAg*a@>1NL5g-AybrCs?C za!23H>3A?I^_WA=T?4J<=vScI 9dRZo+NmS{l8LTRF{WNwo@7uEy2@bY6LSiW|jk71Vyf48muYX M5enM~^!MJBT|i~Rpc5O@WHHiKxvR($mKJSYR46In(S;I*>IxCK zC)C&~^ap^pD~lYRs2^16i@w<@U2t#ekH;F&LGu9EQgE>hB&r*MA5B09dFeF_f+uOY zKWe{JDamq 8|Qn6qraIfBw74Y82lS_1{H<7R%IDhZipPU}bbom@3 z=rTYBj8-dvW&o_+k`2|4WP|J_p+(vtDMID~umh(s$9A!0>hHJ>Y>4VGRfA%X)lI;L z{EjL873LLcP9ijDl&S|XO~;3T$KIB>=zO{?SK&;*2X>X0xq;%~p%5WKOCWLP)~UhI zSlJ+Tks(F0PLz@Cjh3uaC lZ8H=i%k&ku h-=nQ zGk*Z$oj~*YpnNbW3)%*kp(U?SlLKMz7)oi9VJG>jpx9aMHM{%27X3&o)H(jk0JAg5 z6{th*ys2efGV@EGg|@JP&JrPXwi1iq8h{}qHQ?>x@!0Dn= D zPlAu>`}Iyz^9`de;X8WEWO M^<9ECT&ZK9}OH&6oc27p6lk z@n)G>8ty|X*O_ZP2p!oz{$E$SDo(zNt|mVV Zfbbw7!vjtbf;JJ&?|q*8cNsAJY?4 zA2C}aUjaC<16e9oy03Ja@7Uv3PU!R@z6~j(h9jxu5pY>s{(cdzo%&IEAlC8_RTsJx z6s&x8?D|k!nz^rfL;y&X#H0@KqLGC!mO$}pD)+G;E)ZeVt(T+}^oo@XUG+&*N^1?h ziXg`O)I&|H26|8IP&gOTVI czq@va0p(XE8BB> zJ)?=m0vUAPc9W>ZFR0Pb0x$i#PC>+(YV-9U$*zW)>T~xk&&lj*SKH@Oaz#?w zc$CTV#?G3w_I>pT_g_nG7iUIIS# zV(9AvD~4t)6YZn7cnZv?rkkIn9DgWhwc-rE2DU9-Z1h!xJi=PyI1(HX-)#U3_P#z6 z0v)V7=!U0A16_5`rBZ1UgEeTWQH&)g`jk(eh|aH6xX5dig9*IWK285fT;zIClPI2t z!pH4$am1_PIYzMS*Zq)P#EOQ-^+z6Fi;c*%jW3%ad$(e=m(
2+=r4e zu(<$TryD3v`mI6mjC;Bx%Z6kON&)pO!%CsNFq$V?7knszw417Q@71IRD!DF21iRZL zbX>K|SjzHG=(^D3+#gv&!#IgyG_jXUM9}b9MR`zK+Of)TU3~Olv9~M$B7gJ7NfEAI zeB1d$VVuh)kP~<;CwsOLkHckhVK4O1E+ino+WiUpkc)shTl8#A@lwrbs1GuX$?^GJ zX)naYc$};~AXLz4*v5xM4I73=>$c%~sT$-z$G|TxcDyGXHG>a>`K=}+C0OKWfhukG z7g3~4%kT+`a(!H0-w|P0!Eq&`RA6@xf}hw3NXd?M@rMf#X}ck-l^?NOE&`dpS4b1G znZRsewW~E)yp5ASAzKN4hNWoPpsC3Wn-P^_(`kJ28C+H;?3kW(F6q CW9}`E|R-L_A|VdQjCb1jsa)}+MmbK;>cs+T|!%a?gNnb zXAUqe+l%wUjl3}!>%ztwGi+#q*MptwD9XFeII^K708IeeJ!7=_ALKsC+Jp9O+b>+< z2+r~!A6C%=WLuNH7CvHUS^+fsE@6F_PPh^nc51dC9_4SWBlOx_=??H5J^n@kq?hLd zngL%5)>X*JXzZ|49)O~{3`?DfuOdYB-Xo`nLM?WKDh^WY?~~}gA3M`-9oe~MjloH! zDh%ABc1307wROiG`RXv&AIVo`cX71!J|i9E8_3gp)Fb7hYl5-z5k?M48Ix@pYF-7K zf_{ z?mo~!?RN-s{RP@)x!Y0`DNXWqltcM!q`!4;s20+Cikv;UWsFE39(N8&^1!3i8< By_N`FEk6V3w$i!Sjp#Ae$XVn9wOS&PlmM8qLsP`Rh#xPNW<;DL5}swY0W{X z=B_JX7Tb*wJp6&p0 ahqgG29yxr5)=y5W5(!whE)MccoJO^T+? 1In|5`-4F=KM0gIc( z_pnBd_F(^l-s}tl(1_U(X FY>a`jtX$!0(xF`lJB%Wh&GDs4dF^lZeawf zy(8%+a@$5|$yd5}sNW)LX?>LMg;2w@k*1HqW 9rvKd{pfDMqjc*2M&a78NVXyj+&^myOsa z1mh_?r53Xh%wIUR0}jX)MFl4r5T(-@Ed6+r{Zf&wM_{$%91p?)`OFN+Un}*@8- f=LgcSxhq;4R!nQdUu+piIvB{wvWXiM!8qBlYkElm4An+q&0) l0ei3tq<=H%ar{DPx{_>pSZ{Vd6~!QS=)z~#{>G-_^Y-$>vP*qP z5EfAi#h5{_H %VB>Udc8_>=W;WK{JgPr+!~*Sgw(e ziuQ81ZKfLp6thf7J3ABD?Z$dVeW3oXRd~c~L3Wi*VZt?HwA5oW@*7dVw zx}r+;AjkU6k(sCu`N8JyR%O)9ppPP2uP`BVuo2C*6bFsqWpqKR(jHOS($VQ5R;qea z%ZK@RP0>$%pT) gSg0zol zz!XQqbWEj%_}-3Q5jZ86)!xS! pIn|}5BE~=0x7YKW zL<8lDzw#S{x^2w+1oOU>`zy0Tr?=z#tB}57XfPg8xFlf )`Ns29A`B&H8?=ZB-TOf!&AWIV{H;jC zU8|$^R!uXn2u*kvfSpRTvnx~88_;mtAQOM>sZ*$? y)N)cXgP#p>-Y@HHD`4uEF7#N-m$k?vjO_xbHh0Yz(#Y;8@-@1b8COSD(*! zP%iAs;QypCFa6q?Dj=qW!{$X<--DxTiSP_-z-UncJCj>5u2I}`rN};4Z@R6Z#Rnef zylS=2Q`ksD^n;ur|BZ4HE NHoYyUuYn)2KyMlx=TQ6-DL5J(u2k*6&@CL-BD4;No%1#dy^hQ?+xpa zEky1j!=lW;TUZNRKIvvj #!l5*24bQOdu`kz*u 7HI2dMP?7%V=owMR^R>e93hLyNZGZ?lq|m(nHaRd)_2#(FQd$B# rRJ|?oP*stR2){4xRWpCuh#@vjh+e~YO4^5E z_3%V0P-&@R`ViOkBhqXJ!;WMs^+F`9i>H(f@>`-z 6wcWCdH^LrLbYBMTJ@^;Q3h*C9a5clGP*V^9u@~XB XvU{%-TA^O{jVx9F9#LQ~$Ov;ozn1Hld_9N9Wu0VC zorPS^e+=vJdQmMoQn6^2M(nd}Rd8`O!FWiq@!$ MvTBC=J{(6vFx6!NLz>@_PHd06jbMewvertPm6W$-4 zmx2Vz#Y>eO_8DUSoj!}%k#zv9-HoP@!cMe3L;l%|62hD}iNUlrulO`_x!lBAf&IQy znmYVF6za?7EBz@?6oMrHWQ&eGDVQJsZe#Zjl_AmOm%LU54PJPm9`kt;|BIuuV5_Rz zqA=avCDPs9-6ak3(G3!ZZs`u`?(P(6ICM%QAt>D bl>g@z|;wr+h-d zqC=8{t70_<*MnCjdqG%_5jso%du*F^c2I})Av!?ke!5L +s(R5%*bEy=g>5(Rn!Ut=|=2Z }Zg9LXjhLr}cB$OXRV+@|5@o=(y%pUS}(@i*W4aL#ahmCj3m z^w7n2RzSVw1sSVqzsbglUDpt|Ob!@>KIihsOGtvnK3L64f_&fXog~T-=D*j}U!i2? zo65)GjiE3dYGx$3 SZ%PR}(5P2XjhmxC89BHMRbzWL{lV+xG8x(-m zb#f5X1CU&d(Us2F4C?eT?_I#uo5rBNJt6fCto;XF-iNh;!OaN$D-H0A1=psu&gpAI zg!L>pw5SN#+>^}jF1A92$6xa~$QoiVex8ZRI#3Cd+u_ptyXi6Kr6e+Ga?9ZfyI}g! z o;_0q-D1rO+$m2pO(6QENTAKB z8v|Oe8##MD+!*0=idGidI=Pa&0rv0GY+zj|+fF13Z2pf|xa3D}z~}hj%R%H{VXC%r z<)(UZ*Y#Fd(>GE&_BSi^Y7eruEar$ LMGPq;Xg>W*0^ z4%QIAlJV&*lJ_fRPg{@*IA!bD4`sFty#8aomVjdj7Wc?rLcj|5F<;-_7RpA!kRJlc zV7kQ8pMa0@at$=mpiCk>dYHQ2oO2G@o}Iv2is-bXB*hPFS=f;EZ 0~=!z_jrBiy(M!W3|hqWjK*GJ`myrvDC9GPT9T z8gcQ%*smpD^}!)tGfUJjgcwE *xIwAo|qn zk-*b?L9&Gdsv|*G7!q`v9;3}XL79u=efXAQI9_CZF~SV{`Vp-TUFxHH`*!N8S+MwT zq&H!<5uWg`$)aJJp+5Ze@A{)HRg=m1$ocGXs_BZxq#=l}`7RO(R|m88BHwAd!iK zd8L&m7NcUA5WI9I94j>+f>0XT*>qh&1Fy2}n7X0-7yA8HdbYf@0f>g=BLL2HfdPse ziN5xoBwFUt2x4`Jd!{wYkGtlg%of< k$@3@Ve8T5( z>1{&Ceb(y`6e%S6k$HC^ls*k{B6=7^xiS8?!jne#T3Tc{bO{=zkQ!-k4mS{-_)0F% z(YXzW^Idh<>v*0T1FjWzOJ`6C-c0C~WWWzT*)FC$?mDmz2@o|jY9vQ7u)x%!jJ~5P z?@&z$;^GN`qLk)*1U@?cg16zAlol>4wHc Nj#UQU`6{?N(@0!}9lwFi&6MJR-n- zcDmwQfb-WiXQDGI!}Z0>Cf&*&67pj~vaeRsI>n1~j8c~4sW$p%GU!A3x(rT7|H{)8 z$Gjo#35cY-ziRvn0;bl}myg#74312qf8ELQ5L~Qxx|N+roU2SIrE>#+6vmzqW5l2B zk@LxzAs<6apOxnVX}o{2n-{WMG{V7WumExZA0ADe0Ekdmjeivsb7PN$PZ98u(uAUh zQoPQ-tTVfSET!XYjN?|MghXSv$JdH5isI4iwKA9CDABHIth2@Scy70}^QW)hUw(fG zej2_~$*B{YPOQ=7e~-GwBPvnGB=(3s%TlwZ6kXWaJ?Rc);amY{mMC;( l z={FLVEdfoM)6Z2i;b mfMcAu0rlhUADijLv7f_bvy#^=e8J7$i8>q-|#K;?rr zovyc4Mg6*LynNWaCxPjA_iA(9;{5=9zVQ?z4)#&wG_D#=_0QOLHGD;UjNJYcaFYP$ zCEFTg0u*vF>{g@BB(CFhrj;wrv6dQb38t?m5}!!UneJrqC!-!Td;>M$!rki4mQ(_5 z``(e7h&c&Gbd!k3Fzz-EtrUv|Dc4T$PMua4)7Bq@T;|H@ZxLt*u0sBD$+C?nuczsq zqR|U*u3-DU0gF@ihx%~D#?bQ}R=L;$n507W93I40r>RN@m3fZ|^q?jnVKNo@M_$+E zr(+Upu13-pM^dFYNI)Zwuz-rg2Xlbqms;adjQLC9PuKP^t(8U6$WSEuXlI|| gfs-WLtrJs3!dD?G)^n |&yt6;M9INy>uF6poWv z1JnJuIq^H=)K!*Fu`LiwvG }TbfHuX$8f&gNzE^Z4Hv^_xrw?mm}5HPCHu1^aewLu?vy; zK! N+-XE^n(|FX2p(}6E8L35WCKY;?)Ttr3a#Sx zZ@qi@0hWocfZotJfx41?UD1j84Sfs>4+A`}4dT>lh+p3`&wFpfw utwS)ZC-Ue3|`mQsg&U!?~ zRl}gpDc(<^`YYRMm9J3$h`&&L!w6ok0r9~GF0NgAo;A|L)x5`eGY~g0Jz6mMoV>fV zs;#p}F^!Jet|bD4y%feP1Ib<3Y5dh=nKd5R>S6BVMz-QnHfS}_ah*Ln>X_jI zt&s}VEK~4x&)^;ES)L#fS5ZEbie+S#Dah}RFN{RQF!zv3%@H!0&EZmZ`JqFOVG!t< zn^m ;B5}(hLb9MW!D{b?~C<*VZg;g-Tu>4xhDC0n1GKQ+khYA zNqF%+yjv_ckQfouX`zj{NL#KSe9NC!m&w)jZRk{$B>f;8yln4wFtHIAJpUQLC?mcK z;JkaUz)}+xfVD?b(@~uEP9^123xp?ATev$R3ig(@qxLeFp=qIEUvRBMzo(?{+KED? zw8jC}PW!rs!1TEm)lIv$S)gy%-Quw`WjKR}wv$-IEposq*aIX$d#%28Y;mtyI(A}A za~^Ss9@nHWDT7ds*k?jj^Ob0dgRV-1TGvm63Rc=Q`u6j4NHuhV?<5{iU}*1?pm5c2 z8QMF`5PqZ#{#mTRM}dT&$grDza7l2_m-GLu6sk`#(Tn86IS9&{Oht-B2%SSkcrU3l zi|v$bpLr|mnZ ~XlD %>bpmDdXl;xyxBbmhVy<)}ZV!>Y>rT!fjfo&f&nA<;Tt2VqJN`SjV1^Yl zs(3PdjH_I~x`gp^90%b rAA$=@4Wyc1$4D^T_pla&VZ%CB2v!Z{msAL)?osPkx{s!bOG< zNY+f)tZh)N_xgEUSsMEqQ{36*I3qT7QFvmXbppYyx$-N>dUT2$jT6p?F&0M+i9X4b zQh|9Pyy!YZ5PcZ&+0Q0f=Npe1H}>ow7#}X-A>u8hb3Jo38~x0NC$5TJA$JttgSK1b zyBSe3AqW*3{MWv}FOSb@!%KYV60D6#63KCm5cutS>3R81Pb->F(AO80Z%PGLFW>(r z0eq!DSRx)kb9byE-IN}5Db(|@VIEyV#-=>?#ma)|_pAE&!MhbUCg4xwo>zX6xA!4l zlR{T5PZ3{xYprL7u*adX?@r_=1u+MbF0XmcnMLrh`Q#4xjafow^W%&bRb?&DHs0Sl z-@h{5`KIO{)8)zQfypj`qn!s9a|J-Qp{&DL7fG`2T(X`L4upG4IDxh9KlmS2zCmQh z2IK3yiPKPqpE%Bc7)??z$zT_eMdsIGbk>`7`3X^YOiVhWZz8NHv52FG@!~pQdMHkq zaxRBFj`gM%(%ug {PR@|Z%iV2kcDMoV+$5m-dfs|*t>+K*1t;iU367yik@hbJC zs=XA&nVmA`bJeH#H68|Ed>(NpTs1s0v!pC6IraaK%kuM*Ld_+ogNK0bQ!DriI}+&~ zM 4J+Q8qKFR9bjo)~Pg)i#R+Df0D-%QHVE)tr@FJURjuwg^a7GBeLI !i7Isw7{lY2hC2EZk|r-N=~^@YZYDAlK`-A7mK#3&oh8z7%(J*W7ms2#u9w zb9J8RO;J?7Nh#J<3UW e3RSz X>@nE%$SAIpt`c=^@yhmB#a0xgKu-OiIh zwRKcQD?AgzGnhc2rkiiB8V5lijkcs`(E+jjF+s3WZe0^;Fp_j(H$~GVIjgQZpW?^i z+tytXv@qrWtc?gri4$bjbmGdX)lcyJhxE?LYZfTTuHOqsY9>P7*LM*l$p9aN-y(3K ze*Lr~ENsJyQEK_a{K8+`bPBj!&EY}fvIwK=kmYP8p8k>r_@7*4`?C-RjO{e!{{pqh z8m?)pBCxV!Te-i8mHpU=rS}E1 zfzG`I$Se@_NAsH1Uj 2X`&m_|Hx{F{SH|#CjyZR1ja6j4YI=K5(dB+HMbJ-dj1h*lUX~09 zBpmxDpAZf(x*S1(%ig04*Ri5`J9k%LZF{*K`KY^Ci-d3{&(44@CxJ|u$%W~h1AA8a z*wektf)T){Qt74EFP*3?jJ_+d)>s@0=TVMhj}~leUCDKG^VhJnJLpGb?j@_**^!l9 zfBDaqxkkBWYy&&z2CjBz$j;F0B_2E7F3cF*T&Y!pxJyfDN^Wd$PQY#3hvk=0zM!>2 zj$MP$MC4G-Eve@ME~PI*VCeh!Or`+wH`dr`+7Xu2k#gz JPTz&Y9{qzJy#*LV&9VnFW+!0in;NuzCLt2MR0SU{-SEnaz61F}!%$IlWL zAXX*2p)q%-61UBNRPy$? L1gQptn5N;}j8D__+4r~ce+Z~_fXXuihL-s0!(pV-7 zuFmdaFn_a-*--G=CntzYF*M`*ix8A~mEC>^lp?d7$45OKiMc_NH(~hOa4~>529*eH zaI_mFZGg38k!DITh*8EM<*^3QeTvr#(0ReEK)1#C{@rz$r9WuW`hVi^%x};CpxU88 zd_3hP-Pj{-5DrQ{#g{Mng<8!PYjMvO+tmBHf#bnl3a|(j{M;m-N0yks9fwqn-wZqX zG@cD%jPm^G%MR(0S%E2fbpyT;5evWRe1uKB%)KVKme3o*P#4J~C7fVrF8S{xZyII% z*k~a*Y{*;@t2HZht%{oMP>0&&_|q8bN)}2IHTNn`>L~-(;tAuDrN Q=V*msxQ3 zi=P3#EY0Xh8WFKC4rN@5vL&9P#;@yN%t{G?V2DpRo9I0NQVn-U{acTc*r)#YVmdwg zzz% wh%PPR)Q1KHkiQJ7au zlyUs>e4{=7tk&-V!I)2ofJg@A=G`50cc11akHxwc*%AXgMK~dre}m#c3SCE|MmF&r zEvu!nRa86v&_t>@Jff+!!zDu(EJ}~v+kbv7D+6dB0|r{IUl-sSxU<;6FHc)DPc zzCD3%Ou~cbq9b4t`c_#Ayr*e#WedeK)hqwDGT=w_dG&0*1YTSu zeRF3w*N$@8l6^j+WhTP8QU75P!EKx<+xE(qd_TiIZjY4`^-E?@ z5+_V_5v>V>d(<250|Kt2M>z(xAuRB8&2@cLwh-X)Ld8J3XRbg~&KHb1hG3(4wRw z&{$lMeMm^zOM97YTRM;PjmePh`_&E> KGD=C7)S #6DJX#a4Es(9NbU%j8*BLlTiHe}aKp6YWWY+eqm z{>dgu)j1riTSItph~itDR6ITy_?3#5z3JK0^`%;bUDH=!Ih)M!i|-a7Je36abFv$K zy!5YCW;jU{EPcZNq?kw+>8Cj*EO@wEOaps*qtUv{VzEdNA@wVgFN~PM>(X-*so6!N z_@m3K;{PH=pr&pw<~5ExIF{v `jOj)6&$!sOm|{RB7`;`g#)zb_Vfx zpTH7C%z$h+?)t}*0%U8`CL;B{;>V~zszTg^u9G$P(CW%?dz6vrN!HyJCWMjo{H~Cl z!LY@y<~s#Fk;)@(n0^2SUfDPX<`Ivd^95{1A5lK 1N)Sv!`E>o5@$s2Uzy<=XFeFrTN=2Vusr9r!6Yhf3oE} z4h-G;p)r-A-jf`52!_cX`&pFr8;Gl!n)2?LLZD^8n!GRsFwMx4-r`+iZ5m%9*op z+NGAk7_;Y715Xo)uGfEr|B{J%vz2Q%?6+W6v_}ZbZ00c%(RXDq4;Q!Dew~IPf9o<6 zvsCSeW}2_T@!brwbWif--paYy;W&?@1lKBKY|AcE<3HlhA7xf7+M|ppMz|shsy;Vr zl||`O6TSRCU5T%I*Bggb8q#hog%KObESSqS_%CoJo*xm+EE5LD+U@*OJ~0Pa3q77E zL*&XlHwY~$$w3*|ZCQISqi2V)`!Vm{;+gq_JhiVCc#MaITUcn0%#3 YKjWYn6l!z-*NrNAz95lsh%z$TS0r)CG}0owhq)||I5QMzgg znD)Ef_7pzUGH* Rs+Q`z}Nc;RAw;=(;6bduyyiN}&WID0}he zlY!nCF74$GSF@KSac_T)tRBFmK{Hj51Q8V4Sr4B>@X*&jP`-;nwTFo%fJ87w+BimR znIjl20_B9uFlR1(0a)E_6g48=I`t^*NsP+VIMd} z04RFxKUcrhWG1DS$QtYuHVLthpwj846__LPe@iLW>`d9#-bH1GZ z=9cK(0U7Y(!;dfPtYKbzX3y)|HOVwSCz*K^Ih~b~k=&8q+ONT1Xle!AVm4yl$wl(5 z{6jwV-Udz;s7MYo<(ts|03hzZEWb$)3$(iwfUB+Q9X{{ob27Z~<4{jfawjIoogXf; z<{=E-`Ryyx8J3hTc?Y}~aW-`y=|l-@e8QRxI2S7XXlp%+3lyzK$V%OaG4RHrS6+A~ zN;;FNGgHBa`W_5M%JluR;szKhACWMHh1#2FJA-|+MljK+UMgV4{ru*K>3r6`&IRIj z^SN$p?5X LP%pEeQ7?MTW&%)k$;O(FHpJdsbVe@ sz{+pXn>AP(;B#~Ii6 zH{|l6AKm#F6b}_C1dK`C0o3l2dSzsl(!>a<2B5CUtddz76i3Vx-<4(}2MW6bmF?ze zZZ*fjdHs-UPLXO>87zN b9U{eNwjqy|GTIMt?CghowYLX3h#%ieEzS68rNcc)DPT-jYl@|iTQJ2 z&}*?~Cb=s(un<+yCXCDF+2 %<{1 808 zjpX-+k@ipRKnNu^3*;_9vH2Z`5@uC^7Cv6K1yB`a-@mL=bd-36E|aLTRSUK5-UFUO z#!vZp=I{9)i>o8h<9CP1FdrT7FB8y;hQ1 02p!kJsa(<^~i(i#YcA&ezkq6P|xWu|K5AZpVU+TCCNbsf3LV{ zkY-(BjFye;V$Gc@IS7bLWeGHZV5=V0H9OX-U{iboe~P=DOtG7qH}Fcn#N!*Dv_L~| z*15YaTw2XaKUbyb)_n1FVp9~FRPCxNwj*&aOAEl$6!PJI@P4lZYtTC!l#&CWIRZFQ zs>lp*>xIdPVv{mZsVn#)Y6?!xRbXFpX%87i|Mi8d@gJA2Gx~SS7|TX-ZOxFGuKk;k zGpSD(u=!i<@3KhzebZ+3__NWbU=;(+excMGq~;YXe|3bWNjjF$U#L85*g>f^ixmu_ zX^uY_uQKRIA=o92Ee~F^bHO~RZd2BpUH{ U _S8XDIJ>7*k%%0Lrb;<=Bg+K znc4mUk0scovLunX%Fc`KGpdt76>c!NBeNf1>7=-H6n;sB<5;MGEb2>GGD<}l{Az6f z$E?gnxKmRY3U+Hg!bJTH_&J;-y1&aQzwfoEygB|pFtGQCR=Bpls7 C+c_C5#yR$7lp#OEU6Orb;X5_zTc7hf^^+35Rk zoye*u*M)WRZ`NCF(EBLW#v|-GGC~V^6(O8tsqQm`+DG_`i_*$5z4mZ?ii1Q1ePHOW z(PjtNGyXDUpG)lpu|2KM+LRk>qYjs#?b`O@PQWP?5iFYW= ^0klz^qH DP4VE>5cE+L*oIrC=CJ&-fXzCh@Tea;N&*sgzkY4zyuu2?jqbd zaSf~_>>aW#Ny{ocNg1rF>M^}RkKP&_F-I7_4r?YZNbqwSi7Cf3SY_+IzkYlrwz>p( zS#(DacXzd~g!ALS&6S>-TgxN} PPen z>;Oq31&McihT?kzzIBX!0d)d!ez<5-HB{&JdfsC(H(71?%g4#hFiYNVl-2u9IQF9P z Q5QO9ZkT@Y=gWl$XC4;ug&(PC3JVk3Eq*O3G#4(-d+h0nm!SJ $ocZyWp}s`!!bD=r2otdjd86P^X;&12s$o=zM(J zSs66xo5UTJdbp&+hijcH&rqvEvbr`9o*o_Hf)Q)FNey}dlt418GO9v?1XW0L24=uq zn#@=ivXLHkwUb8Ss>!$Hf?U#B%xzML0l2B^U-7hu91;He*$(}e-fnOWNV{EB>h3ay zVlKpR>6t <^1h{iz09IF-rm3~^>AJ{8~52yLNQ5ONtx_Yp?P9cxL`y&&)hf#w&OP9ty3A^1- zq&P}&HMLIzLHcdKnWyn?UQ3<2$Ia;HE)YBU!`p^0sP(rM*eMo&JQZ+pAsP~^!em&J z4>`$WehHNu!p(}QHXD!_Z}tGK4#osN7GT`G52O-pR>HsX%-5H6qnpZCmypYBL1PI; z_Krqe6|+7S>1cK@8R(^7Jq-~tXZw|Qp_5oPkzl2d_R}|G84^h<$@x=b_^=ah&4~hW zcIIF?&zI)gPq4To$k}mLA?5SP7T8(WtH%_H{A4deGDk0;D-k3zKHauJg8B)$Aw0iJ z?!$#ONLK8G2>dN2)v-E>+wjo%ZxH1|{^-h`7*~%2nbWZQ_~M5Jt4)vSVwN4&+s-I- z5fO_agyVrr@r23hwH=8nvO`XlPs*Q-pJz*zr5?blywL!sYd=+$VjhJX-4c;Rm_?>3 zZS{O=V+b*vKobQ5qek{c2P2}8NISq6IJOoExJCdXe)pu#x@^x1CKPVa*krG0XOC$a z$;HxYAMH|rPz{B4+yAEpbjzcsQx8J`qFJVZ`3 U7#unyhqNf}+LW>1iC_l3#u8!1lI%=7{T^IERsZ *OZWlO!ostazFD)hUn^6E+%tN+l~P3w8{BBO3V*)!kZWGgrr4tXgf`Te zgfys#yeyqA7Kgfndz-!HHIC$9y&~6E)u=F!LBbYck8HPQ=T!slNb>XUS3+7y?7Ri) zJz^sfsq3+ArFp%12%%;>ahM!C>@k0rieA!#xpRWzcus{-G3<*rkepAx^*sXlZ65Fi z?k$V7(z*VMy!p@Y@{u5KI0#TBe}O 4KBd1o$sbNY(11Zn*!w7z9W{_IKl~uyU%YR;_2B)lTZjqXC+!()by*+V$0Rg) zoVmBS2>{L(Aw`av75clF@VEUId2e8YfE?34J}7=%)oLkJLV<3Or$wT28&+lirJnR| zsr{Y7x2&nM$GAq%5wDDp{fB&J2zLDFR}wpNFX2v>8<@+ gnC{GJ?&tv4S`|qW2 z*cV{jK8YSsIJU4Os9|u50JE(p^Z@Tw@Ee{;myh=iyNr~I2ZMt=!~&Y|wKa(h)FL4R zg$u*1kP>N>CQAJ-?WZk6hdczW`P6l7nZ)lR$hvMU^Sn;Z<`eb8Y>pEZ+*XdHFz5z6 zw+7b Y-%s-4rBZ; zC9QAW(S0dCe^{y^keHg49lo7nnJ@d*{o~b80GD}l+;`iN;GJd=qa0lEm9q0Dsv5eG zC*K6 ze~T@qGOH4ymVjx(-NaYHrANujVjc`^*Jd=rvO z58%Fq(MCPI93K{=-8`Hcnh7FctU}~p1YoAQ3~sf>%RIasztp1+F2HTp@Khn 6^Z$^8dN7=q3hU~7kE;7aM-k+u>MRMfLGY{soB94p>{4^hC(DcldABw%iotW zvlujDxJF{5Df_*vc@ltSLTUwR37&l(nA_kB{8}dei|byCQ9+dYN_)3U5UM6bKh%IQ zG<*2}`Xkynyge8$PQ!v!iy_&gE<}OzCI^$(jK6 n#B==k zZ le_s@Qb+wZ05_W8G`K@dVka=H7b z6m`MphXIaH7b_D8q@}j@0vH;Dp4styU$+}ae}wd&3n%)G@oDP~qjBIwFAt5lOUkMt zYl;~FMtv5ZN1#ByuHL2Irz_>VcWQb$cEBY*=P^}5{{76Z*7YkSiCj?Q?TV&>=(+NR zxl>_ETJz{g(n;UC02@Y02-Q6r*u)}w@bi7Xs+BFh8>O`(SYXmScSDNlcel3xl)*d9 zEyezogmEUew8IgTf4f{cO# k%s>3nxgGW z_cZ;O;p%~lx&{uij?NL4mii9{NNPpj?fXp%kKm2qu}Ara+|6S|t;OE(ACp#gV_}~5 zlJRs{BvbwjX;|*AaGbz)R5Kg0b`CU{AI6oSpaCM&9VkRgEGpgeu&C0l?ymT*tK f$hK z+(~H#%}HtL)EO!~dUiZSc{u{abUG^OQVeB7M1o8TI$8`WWs?y(ZCwI`OhRJgWIf^q z!k<5%KR?d+C9UlI#!M@oeSLF#+i=m?*y#VJ8lOSS4Zd<>c{S6%MWfNQFZUu!W8W*) z>8D(-L^|`{FVcy;sJrg%0_lCb#e|=c@^C1_Oc|VJg{Q&EFVXLRGEgLkSQ@$#SWUW( z_EV_bw6Aq}Fm_>8tb+U*%)q65CtC^o !;F>IZm>hs zXxOygA6>t{2gA~K%tl #(ZEw7t^Ys2EUc#)o-KJ;L(e3n%a zuBu6^3~4#Im;V(Sx5bF3tcK=40x`xemM^XIr^@`Ks`z{?ls#|07d*d(vG$9&Rla0b z 1qhv{9p3L=BVkt?NyVUq99u(;__jE2fsq{)n4u0L< zjKQGn#Qu5Pf5dlD1nnw5=0hDYdZU*L`*4!b(SOmfbH-$1%J%L2fP#=ZO}T`J@kW3S z;}vcYOf=}PA=>0kqbkRjC~i&pzT2bXg&sqhe0YhE)rpL_N#I2u$JK<`G&b%{)Q&r{ zKL}1m*re>F4P~gA?*|$8)r08Y7h7jWkt=^=6%zG(o4ki(?8601|J0G_LBE8;BimP3 zJk6FIs*emOyrOcHQcD{}Dr8Y1p_6bcuEc#SRyi5#W=F-D!He`q)*8uB&~X{%dp96; z8C2p?qP1Lna3J8y;HHz;&YLa{6&7CND-{<~DHQXQBajLp^W(CEq3NXv4~JKi zN#QNOW+YdVCvNp~QDQS}hN{Y4y7>*s%uAf4AIP$3hVVpqpRPVeTTVePb}unpP%Kc$ zQ2WcU_F!D8442{%lcs-iJk$*$+3#5U!%WtXe`Y@wH-9*1l;r-|3p!JVM0nfavs&KE zM-5McB8=U@e+57Q+oC`(ESk74-~E!_@;Zu>yyn+pSb%?ubx(y;SQC?mc{Wi93>&r* z>GqFwO!|%FF~u1|Hu8K=TVk9r-|D}k38;nXDNwQ}FRmaPox8K9fkPw9_E*kmkiJaP zMz0t)SX~Wm-x9{R&|;R47=`z`JrFJ){GyOGY90myEIOZj 6N9p?RLDeUTpeIZ( z!YP3{3Q2@Ay+hk2DmX!ycU18h5k1cUU9rL>5PhPSnVGrOX6iirss5wnao@V;sREO4 z;ZiBy7mmQ)5mcf^p2hSytcb^@#~4;Xk1d@4EskfZ$o4D5s*7-$fYRPgE}4Mh3RqHo zMN&-Y=rXlYDjt^G7-C73WF3SvYyJZ*QiKEAaN+3;ssTX$)TAmVy6my%JpunliOfk2 zQzdzej|2DYrTdoyC|jo;Lu?tMyjLKhU7tA(piRShMnz$Ln^m7~{>>kIPnE%8Le`r1 z&e4ex){}Ow{e9#V4MYhUpdodL7&H1bhgRm3sFV+nZGHNIRS^ zu3kP!?4aDOTj99>uw#|9!r3nhQ|^X|)M0G`hx8qpZJg~G5<96Gb-^u!tGA|!o3rEE zuahCKdkuh4D6h0n0JrFdZ|Z}sBn}LJ>l-PvAw?%@y+(Wt$J>Y7F(4FLGABxI1%XmR zoGmSBk~vDVEi#=(7}t9JcyaPc##vVAwrM-;?2(5JsCw~kO$0T5<;t{yJ(e1v>Z@$; z2BgfTJj&S8a7@R;d)QPJ^q^!zDWbP(=va!aW76MI-zw!ig1nGhSm;>{5u#g({X*%# zE|$Zv?7sR5h9$#ze$C?wxdb+;DQ)o9=VU`agoO|rSx_r)P|cc8-NWKPDyvBn({-$d ziK4ilA}2(JC@_nJ&Wau)_*Au(>4@;+QB#16S4lKwDdH#KUN#!NDoL#&Scrn ?pSJGp~=J*!_e|Cj%EUG`FpQj_#RYSLvL)Ux2= z;Z1y?4~2DEYcv5ZDIV0w1RHFfRh-gU KjgohM#WNwG(s>#M&MRaX(lChsqP?MI7Zq@Z;Z)uv+Ey!;DUT3zIFbl`1 zz`kXUQyWdLyyEaYOu5R!mdlBknlF_{haqZ ^p1 9wBm>R#yzu8L>|#@$!NGq2l+b04We_YvSLZxaUq z8XS{cip6J^Z#b9H&X6Mf`)%~=_tn6N4$R;{!JzHN5`z7~ Bq1 zZ$t(d>}bBun~r3r-peoI##duG!+5xY9cs3d?<*!}oc#qg?N9Q#3rk@Ehd6r6AUW{L zsH$!at0pH?blV+-VOq#yakH&oT2QwifE*3qEYr9ECo%n6)vK`Bs`j+_Pg?nHs*1Ug z1n46r44tgT-)%!ie-PQWm6EG~jr<2J`}W$OBRU9hD4&2qxWKU4_{yZSPan`{1 DR2~M!?q*^d}^1`)!CXtvXJ2 z+)Jyu7t&8+Y@ m6*Z6 z9aY+cVlA7zi}7~gy*MG_hAKDK?uy2eq`GO~IQVg@yn&iSuie k8HN^$$v|#S zMjM+ab!qJ`?H_|*JQ_Cgem5^ntHH3v5=doof|uE#GVG=>y9hwnNwB^J-I>JQY`)oz z7>_RQpuZ$&BNH!K*BoQHeT4h6iD{cF?3~Lr6O_E^C5%2R#i_{Ysh34r5#HsbcqQYO zj67!*MwLI(Jb#%u?#2uoFZt(~wtoSPDP8DOR6=g^Baxf=N8+Tdo=^8~2_efcOa_e< zM9dPfV>gewaPO!kp?+UHF^*r}4T|5y7NPOP?-Sy=QSzG7*-UJuetQSDb=rf|@l>=@ zV$$ThxaM%$FhOmluXWm)$s)2>SlM!;33o=L%x^>8DTu_Dnh{{{n2go!rK%?0Grk@BIv0vZhT2H=AoRE$1G;7CebRr5P z&?D7THCxnb3Wfh13W6&ZR`^e*6v`r`H?L=^ *y7U31I4M#hmm7(W*_@|A|AC|OhcLMT z3rtI^rVN*Di?fc{P$n9 Hn^o{k6a+rmXHor32wAvkP#jxKVsd z%~^xgN*J}g;ib}Gt)A1Amo~7N3oB8n$U01G+&p?(fn4=Mkv`e~u*z7De^-7!H((mD z?HL~-gvw`OYW6hk5^t_yWdy1xyz*IWl>0?V@FI*=nsik{RuiNVC7BGHi=8CUO~d2o z2XN*UEb@_DXc5bh-abqL4@KFk8h(yKcG~hUEOOKm#_X1(k}kFYrZGM)>VkqW5zMs# z-|toB}#ggobXT?R${bgB;}KirkXeSYn$Dff+lp?+@YsAamVv#I}D0l3}?~!>VGr zp6tS0+aGj5F~f-t1#ah~Qz8;0>amYYx8<*01B@~)=FiFiCZ#B6OFyL}$Bn^k^WS!R zx?h (QfDhAyOIw;S>gM2o{}{)+rirTac1Z#aGskP7S{U`J6Q^ks!v-`r zuIfeD2Mi{oh48$30Kr-kYA*n`g787B=tmnhsE>G;d|?99xrs+P>Nn63vg&-5nY?IC zBvViTqK L{tF#AD32J9Sh9*>!X3^-~T;Da)kXvJP+YR8+