From 404aa8ebbb154f7a9a87d31b524a1a20bededcee Mon Sep 17 00:00:00 2001 From: Dawid Sobczak Date: Fri, 18 Apr 2025 12:41:04 +0100 Subject: [PATCH] clang unvendor --- 05/musl-0.6.0/arch/x86_64/bits/alltypes.h | 468 --------- 05/musl-0.6.0/include/bits | 1 - 05/musl-final/arch/x86_64/bits/alltypes.h | 468 --------- 05/musl-final/include/bits | 1 - 06 | 1 - 06/.github/workflows/is-tested-enough.yml | 16 + 06/.github/workflows/release-checks.yml | 19 + 06/.github/workflows/stage1.yml | 77 ++ 06/.gitignore | 20 + 06/.oldgit/HEAD | 1 + 06/.oldgit/ORIG_HEAD | 1 + 06/.oldgit/config | 11 + 06/.oldgit/description | 1 + 06/.oldgit/hooks/applypatch-msg.sample | 15 + 06/.oldgit/hooks/commit-msg.sample | 24 + 06/.oldgit/hooks/fsmonitor-watchman.sample | 173 ++++ 06/.oldgit/hooks/post-update.sample | 8 + 06/.oldgit/hooks/pre-applypatch.sample | 14 + 06/.oldgit/hooks/pre-commit.sample | 49 + 06/.oldgit/hooks/pre-merge-commit.sample | 13 + 06/.oldgit/hooks/pre-push.sample | 53 + 06/.oldgit/hooks/pre-rebase.sample | 169 ++++ 06/.oldgit/hooks/pre-receive.sample | 24 + 06/.oldgit/hooks/prepare-commit-msg.sample | 42 + 06/.oldgit/hooks/push-to-checkout.sample | 78 ++ 06/.oldgit/hooks/update.sample | 128 +++ 06/.oldgit/index | Bin 0 -> 8324 bytes 06/.oldgit/info/exclude | 6 + 06/.oldgit/logs/HEAD | 4 + 06/.oldgit/logs/refs/heads/main | 1 + 06/.oldgit/logs/refs/remotes/origin/HEAD | 1 + .../38/0dd4861a9837e60a666c58e43a14ff12ea4603 | Bin 0 -> 578 bytes .../44/b6c0c855a0b28ba2565a50f92aca8257bc5128 | Bin 0 -> 89 bytes .../49/27a2d50ee572da5f019e227e5df1afdc6c3963 | Bin 0 -> 786 bytes .../4b/5eb3f8368f574620aa1908fbac2a9b95600f4a | Bin 0 -> 980 bytes .../4c/4d8b09b35845aab8b1ca27ea99476a2614610d | 2 + .../4e/3f03ef0a8729af8451b24ef139f779d7721f20 | Bin 0 -> 8402 bytes .../63/45cc24f98d393f2da3f9e307f5a1402f95b015 | Bin 0 -> 65 bytes .../66/133e31e865aaadaca08072ddad7f987a0fd230 | Bin 0 -> 3041 bytes .../9f/a1dd951fc8994e7f4beba5b94b2503cac13b3d | 1 + .../a4/39d0d9d17edd5cc0161e7a50b4e1b3188b3db5 | Bin 0 -> 1460 bytes .../a7/2fee58d519bf613769936da06b67b9de33629a | 2 + .../c8/f855b9fb630e2a585fb06572bdc5123a0975a6 | Bin 0 -> 207 bytes .../d6/d52e7f9449ce98317a97830dc726e211c4744d | Bin 0 -> 196 bytes .../db/42ebd40db62eaa1e868c31d924d317dda4c4a5 | Bin 0 -> 1425 bytes ...58506a18ff05f1c00c67a067ffdd111ddf7303.idx | Bin 0 -> 50940 bytes ...8506a18ff05f1c00c67a067ffdd111ddf7303.pack | Bin 0 -> 384639 bytes 06/.oldgit/packed-refs | 2 + 06/.oldgit/refs/heads/main | 1 + 06/.oldgit/refs/remotes/origin/HEAD | 1 + 06/LICENSE | 21 + 06/Makefile | 840 ++++++++++++++++ 06/README.md | 212 ++++ 06/build-using-nix.sh | 47 + 06/build.sh | 55 ++ 06/compile-tcc-seed-with-nix.sh | 12 + 06/default.nix | 144 +++ 06/download.sh | 85 ++ 06/flake.nix | 15 + 06/helpers/builddir | 70 ++ 06/helpers/cheat | 49 + 06/helpers/chroot | 18 + 06/helpers/chroot-inner | 40 + 06/helpers/inject | 20 + 06/helpers/maint/build-custom-stage5 | 97 ++ 06/helpers/maint/is-tested-enough | 66 ++ 06/helpers/maint/notes | 29 + 06/helpers/maint/release | 61 ++ 06/recipes/0-tcc-seed/seed.host-executed.sh | 4 + 06/recipes/1-stage1.c | 933 ++++++++++++++++++ 06/recipes/1-stage1/hello.c | 21 + 06/recipes/1-stage1/protobusybox.c | 46 + 06/recipes/1-stage1/protobusybox.h | 240 +++++ 06/recipes/1-stage1/seed.host-executed.sh | 89 ++ 06/recipes/1-stage1/syscall.h | 60 ++ 06/recipes/2a0-static-gnumake.sh | 54 + 06/recipes/2a1-static-binutils.sh | 47 + 06/recipes/2a2-static-gnugcc4-c.sh | 71 ++ 06/recipes/2a3-intermediate-musl.sh | 36 + 06/recipes/2a4-gnugcc4-cpp.sh | 97 ++ 06/recipes/2a5-gnugcc10.sh | 90 ++ 06/recipes/2a6-linux-headers.sh | 36 + 06/recipes/2a7-cmake.sh | 48 + 06/recipes/2a8-python.sh | 70 ++ 06/recipes/2a9-intermediate-clang.sh | 142 +++ 06/recipes/2b0-musl.sh | 36 + 06/recipes/2b1-clang.sh | 153 +++ 06/recipes/2b2-busybox.sh | 48 + 06/recipes/2b3-gnumake.sh | 45 + 06/recipes/3a-boost.sh | 50 + 06/recipes/3a-brotli.sh | 46 + 06/recipes/3a-curl.sh | 31 + 06/recipes/3a-editline.sh | 29 + 06/recipes/3a-gnugperf.sh | 33 + 06/recipes/3a-libarchive.sh | 33 + 06/recipes/3a-libsodium.sh | 34 + 06/recipes/3a-lowdown.sh | 33 + 06/recipes/3a-mbedtls.sh | 32 + 06/recipes/3a-nlohmann-json.sh | 29 + 06/recipes/3a-pkg-config.sh | 32 + 06/recipes/3a-seccomp.sh | 31 + 06/recipes/3a-sqlite.sh | 28 + 06/recipes/3b-busybox-static.sh | 49 + 06/recipes/3b-nix.sh | 100 ++ 06/recipes/3b-tinycc-static.sh | 42 + 06/recipes/3b-zig.sh | 14 + 06/recipes/4-rebootstrap-using-nix.sh | 98 ++ 06/recipes/5-go-beyond-using-nix.sh | 203 ++++ 06/recipes/_1.test.sh | 40 + 06/recipes/_2a0-ccache.sh | 65 ++ 06/recipes/_2a3.test.sh | 37 + 06/recipes/_2a4.test.sh | 46 + 06/recipes/_2a5.test.sh | 46 + 06/recipes/_2a9.test.sh | 49 + 06/recipes/_2b1.test.sh | 51 + 06/recipes/_3b.test.sh | 54 + 06/recipes/all-past-stage1.sh | 39 + 06/seed.sh | 22 + 06/using-nix/0-from-nixpkgs.nix | 77 ++ 06/using-nix/0-prebuilt.nix | 28 + 06/using-nix/0.nix | 35 + 06/using-nix/1-stage1.nix | 26 + 06/using-nix/2a0-static-gnumake.nix | 70 ++ 06/using-nix/2a1-static-binutils.nix | 56 ++ 06/using-nix/2a2-static-gnugcc4-c.nix | 85 ++ 06/using-nix/2a3-intermediate-musl.nix | 42 + 06/using-nix/2a4-gnugcc4-cpp.nix | 113 +++ 06/using-nix/2a5-gnugcc10.nix | 104 ++ 06/using-nix/2a6-linux-headers.nix | 39 + 06/using-nix/2a7-cmake.nix | 51 + 06/using-nix/2a8-python.nix | 74 ++ 06/using-nix/2a9-intermediate-clang.nix | 145 +++ 06/using-nix/2b0-musl.nix | 45 + 06/using-nix/2b1-clang.nix | 157 +++ 06/using-nix/2b2-busybox.nix | 52 + 06/verify.nix | 16 + 06/verify.pkgs.sha256 | 32 + BOOSTRAP.md | 241 +++++ README.md | 242 +---- 139 files changed, 8091 insertions(+), 1178 deletions(-) delete mode 100644 05/musl-0.6.0/arch/x86_64/bits/alltypes.h delete mode 120000 05/musl-0.6.0/include/bits delete mode 100644 05/musl-final/arch/x86_64/bits/alltypes.h delete mode 120000 05/musl-final/include/bits delete mode 160000 06 create mode 100644 06/.github/workflows/is-tested-enough.yml create mode 100644 06/.github/workflows/release-checks.yml create mode 100644 06/.github/workflows/stage1.yml create mode 100644 06/.gitignore create mode 100644 06/.oldgit/HEAD create mode 100644 06/.oldgit/ORIG_HEAD create mode 100644 06/.oldgit/config create mode 100644 06/.oldgit/description create mode 100755 06/.oldgit/hooks/applypatch-msg.sample create mode 100755 06/.oldgit/hooks/commit-msg.sample create mode 100755 06/.oldgit/hooks/fsmonitor-watchman.sample create mode 100755 06/.oldgit/hooks/post-update.sample create mode 100755 06/.oldgit/hooks/pre-applypatch.sample create mode 100755 06/.oldgit/hooks/pre-commit.sample create mode 100755 06/.oldgit/hooks/pre-merge-commit.sample create mode 100755 06/.oldgit/hooks/pre-push.sample create mode 100755 06/.oldgit/hooks/pre-rebase.sample create mode 100755 06/.oldgit/hooks/pre-receive.sample create mode 100755 06/.oldgit/hooks/prepare-commit-msg.sample create mode 100755 06/.oldgit/hooks/push-to-checkout.sample create mode 100755 06/.oldgit/hooks/update.sample create mode 100644 06/.oldgit/index create mode 100644 06/.oldgit/info/exclude create mode 100644 06/.oldgit/logs/HEAD create mode 100644 06/.oldgit/logs/refs/heads/main create mode 100644 06/.oldgit/logs/refs/remotes/origin/HEAD create mode 100644 06/.oldgit/objects/38/0dd4861a9837e60a666c58e43a14ff12ea4603 create mode 100644 06/.oldgit/objects/44/b6c0c855a0b28ba2565a50f92aca8257bc5128 create mode 100644 06/.oldgit/objects/49/27a2d50ee572da5f019e227e5df1afdc6c3963 create mode 100644 06/.oldgit/objects/4b/5eb3f8368f574620aa1908fbac2a9b95600f4a create mode 100644 06/.oldgit/objects/4c/4d8b09b35845aab8b1ca27ea99476a2614610d create mode 100644 06/.oldgit/objects/4e/3f03ef0a8729af8451b24ef139f779d7721f20 create mode 100644 06/.oldgit/objects/63/45cc24f98d393f2da3f9e307f5a1402f95b015 create mode 100644 06/.oldgit/objects/66/133e31e865aaadaca08072ddad7f987a0fd230 create mode 100644 06/.oldgit/objects/9f/a1dd951fc8994e7f4beba5b94b2503cac13b3d create mode 100644 06/.oldgit/objects/a4/39d0d9d17edd5cc0161e7a50b4e1b3188b3db5 create mode 100644 06/.oldgit/objects/a7/2fee58d519bf613769936da06b67b9de33629a create mode 100644 06/.oldgit/objects/c8/f855b9fb630e2a585fb06572bdc5123a0975a6 create mode 100644 06/.oldgit/objects/d6/d52e7f9449ce98317a97830dc726e211c4744d create mode 100644 06/.oldgit/objects/db/42ebd40db62eaa1e868c31d924d317dda4c4a5 create mode 100644 06/.oldgit/objects/pack/pack-5358506a18ff05f1c00c67a067ffdd111ddf7303.idx create mode 100644 06/.oldgit/objects/pack/pack-5358506a18ff05f1c00c67a067ffdd111ddf7303.pack create mode 100644 06/.oldgit/packed-refs create mode 100644 06/.oldgit/refs/heads/main create mode 100644 06/.oldgit/refs/remotes/origin/HEAD create mode 100644 06/LICENSE create mode 100644 06/Makefile create mode 100644 06/README.md create mode 100755 06/build-using-nix.sh create mode 100755 06/build.sh create mode 100755 06/compile-tcc-seed-with-nix.sh create mode 100644 06/default.nix create mode 100755 06/download.sh create mode 100644 06/flake.nix create mode 100755 06/helpers/builddir create mode 100755 06/helpers/cheat create mode 100755 06/helpers/chroot create mode 100755 06/helpers/chroot-inner create mode 100755 06/helpers/inject create mode 100755 06/helpers/maint/build-custom-stage5 create mode 100755 06/helpers/maint/is-tested-enough create mode 100755 06/helpers/maint/notes create mode 100755 06/helpers/maint/release create mode 100755 06/recipes/0-tcc-seed/seed.host-executed.sh create mode 100644 06/recipes/1-stage1.c create mode 100644 06/recipes/1-stage1/hello.c create mode 100644 06/recipes/1-stage1/protobusybox.c create mode 100644 06/recipes/1-stage1/protobusybox.h create mode 100755 06/recipes/1-stage1/seed.host-executed.sh create mode 100644 06/recipes/1-stage1/syscall.h create mode 100755 06/recipes/2a0-static-gnumake.sh create mode 100755 06/recipes/2a1-static-binutils.sh create mode 100755 06/recipes/2a2-static-gnugcc4-c.sh create mode 100755 06/recipes/2a3-intermediate-musl.sh create mode 100755 06/recipes/2a4-gnugcc4-cpp.sh create mode 100755 06/recipes/2a5-gnugcc10.sh create mode 100755 06/recipes/2a6-linux-headers.sh create mode 100755 06/recipes/2a7-cmake.sh create mode 100755 06/recipes/2a8-python.sh create mode 100755 06/recipes/2a9-intermediate-clang.sh create mode 100755 06/recipes/2b0-musl.sh create mode 100755 06/recipes/2b1-clang.sh create mode 100755 06/recipes/2b2-busybox.sh create mode 100755 06/recipes/2b3-gnumake.sh create mode 100755 06/recipes/3a-boost.sh create mode 100755 06/recipes/3a-brotli.sh create mode 100755 06/recipes/3a-curl.sh create mode 100755 06/recipes/3a-editline.sh create mode 100755 06/recipes/3a-gnugperf.sh create mode 100755 06/recipes/3a-libarchive.sh create mode 100755 06/recipes/3a-libsodium.sh create mode 100755 06/recipes/3a-lowdown.sh create mode 100755 06/recipes/3a-mbedtls.sh create mode 100755 06/recipes/3a-nlohmann-json.sh create mode 100755 06/recipes/3a-pkg-config.sh create mode 100755 06/recipes/3a-seccomp.sh create mode 100755 06/recipes/3a-sqlite.sh create mode 100755 06/recipes/3b-busybox-static.sh create mode 100755 06/recipes/3b-nix.sh create mode 100755 06/recipes/3b-tinycc-static.sh create mode 100644 06/recipes/3b-zig.sh create mode 100755 06/recipes/4-rebootstrap-using-nix.sh create mode 100755 06/recipes/5-go-beyond-using-nix.sh create mode 100755 06/recipes/_1.test.sh create mode 100755 06/recipes/_2a0-ccache.sh create mode 100755 06/recipes/_2a3.test.sh create mode 100755 06/recipes/_2a4.test.sh create mode 100755 06/recipes/_2a5.test.sh create mode 100755 06/recipes/_2a9.test.sh create mode 100755 06/recipes/_2b1.test.sh create mode 100755 06/recipes/_3b.test.sh create mode 100755 06/recipes/all-past-stage1.sh create mode 100755 06/seed.sh create mode 100644 06/using-nix/0-from-nixpkgs.nix create mode 100644 06/using-nix/0-prebuilt.nix create mode 100644 06/using-nix/0.nix create mode 100644 06/using-nix/1-stage1.nix create mode 100644 06/using-nix/2a0-static-gnumake.nix create mode 100644 06/using-nix/2a1-static-binutils.nix create mode 100644 06/using-nix/2a2-static-gnugcc4-c.nix create mode 100644 06/using-nix/2a3-intermediate-musl.nix create mode 100644 06/using-nix/2a4-gnugcc4-cpp.nix create mode 100644 06/using-nix/2a5-gnugcc10.nix create mode 100644 06/using-nix/2a6-linux-headers.nix create mode 100644 06/using-nix/2a7-cmake.nix create mode 100644 06/using-nix/2a8-python.nix create mode 100644 06/using-nix/2a9-intermediate-clang.nix create mode 100644 06/using-nix/2b0-musl.nix create mode 100644 06/using-nix/2b1-clang.nix create mode 100644 06/using-nix/2b2-busybox.nix create mode 100644 06/verify.nix create mode 100644 06/verify.pkgs.sha256 create mode 100644 BOOSTRAP.md diff --git a/05/musl-0.6.0/arch/x86_64/bits/alltypes.h b/05/musl-0.6.0/arch/x86_64/bits/alltypes.h deleted file mode 100644 index f07dc5c..0000000 --- a/05/musl-0.6.0/arch/x86_64/bits/alltypes.h +++ /dev/null @@ -1,468 +0,0 @@ - -#include - -#if defined(__NEED_size_t) && !defined(__DEFINED_size_t) -typedef unsigned long size_t; -#define __DEFINED_size_t -#endif - -#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t) -typedef long ssize_t; -#define __DEFINED_ssize_t -#endif - -#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t) -typedef long ptrdiff_t; -#define __DEFINED_ptrdiff_t -#endif - -#if 0 -#if defined(__NEED_va_list) && !defined(__DEFINED_va_list) -typedef __builtin_va_list va_list; -#define __DEFINED_va_list -#endif - -#endif - -#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t) -typedef int wchar_t; -#define __DEFINED_wchar_t -#endif - -#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t) -typedef int wint_t; -#define __DEFINED_wint_t -#endif - -#if defined(__NEED_wctrans_t) && !defined(__DEFINED_wctrans_t) -typedef int wctrans_t; -#define __DEFINED_wctrans_t -#endif - -#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t) -typedef int wctype_t; -#define __DEFINED_wctype_t -#endif - - -#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t) -typedef char int8_t; -#define __DEFINED_int8_t -#endif - -#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t) -typedef short int16_t; -#define __DEFINED_int16_t -#endif - -#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t) -typedef int int32_t; -#define __DEFINED_int32_t -#endif - -#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t) -typedef long int64_t; -#define __DEFINED_int64_t -#endif - - -#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t) -typedef unsigned char uint8_t; -#define __DEFINED_uint8_t -#endif - -#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t) -typedef unsigned short uint16_t; -#define __DEFINED_uint16_t -#endif - -#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t) -typedef unsigned int uint32_t; -#define __DEFINED_uint32_t -#endif - -#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t) -typedef unsigned long uint64_t; -#define __DEFINED_uint64_t -#endif - - -#if defined(__NEED___uint8_t) && !defined(__DEFINED___uint8_t) -typedef unsigned char __uint8_t; -#define __DEFINED___uint8_t -#endif - -#if defined(__NEED___uint16_t) && !defined(__DEFINED___uint16_t) -typedef unsigned short __uint16_t; -#define __DEFINED___uint16_t -#endif - -#if defined(__NEED___uint32_t) && !defined(__DEFINED___uint32_t) -typedef unsigned int __uint32_t; -#define __DEFINED___uint32_t -#endif - -#if defined(__NEED___uint64_t) && !defined(__DEFINED___uint64_t) -typedef unsigned long __uint64_t; -#define __DEFINED___uint64_t -#endif - - -#if defined(__NEED_int_least8_t) && !defined(__DEFINED_int_least8_t) -typedef int8_t int_least8_t; -#define __DEFINED_int_least8_t -#endif - -#if defined(__NEED_int_least16_t) && !defined(__DEFINED_int_least16_t) -typedef int16_t int_least16_t; -#define __DEFINED_int_least16_t -#endif - -#if defined(__NEED_int_least32_t) && !defined(__DEFINED_int_least32_t) -typedef int32_t int_least32_t; -#define __DEFINED_int_least32_t -#endif - -#if defined(__NEED_int_least64_t) && !defined(__DEFINED_int_least64_t) -typedef int64_t int_least64_t; -#define __DEFINED_int_least64_t -#endif - - -#if defined(__NEED_uint_least8_t) && !defined(__DEFINED_uint_least8_t) -typedef uint8_t uint_least8_t; -#define __DEFINED_uint_least8_t -#endif - -#if defined(__NEED_uint_least16_t) && !defined(__DEFINED_uint_least16_t) -typedef uint16_t uint_least16_t; -#define __DEFINED_uint_least16_t -#endif - -#if defined(__NEED_uint_least32_t) && !defined(__DEFINED_uint_least32_t) -typedef uint32_t uint_least32_t; -#define __DEFINED_uint_least32_t -#endif - -#if defined(__NEED_uint_least64_t) && !defined(__DEFINED_uint_least64_t) -typedef uint64_t uint_least64_t; -#define __DEFINED_uint_least64_t -#endif - - -#if defined(__NEED_int_fast8_t) && !defined(__DEFINED_int_fast8_t) -typedef int8_t int_fast8_t; -#define __DEFINED_int_fast8_t -#endif - -#if defined(__NEED_int_fast16_t) && !defined(__DEFINED_int_fast16_t) -typedef int int_fast16_t; -#define __DEFINED_int_fast16_t -#endif - -#if defined(__NEED_int_fast32_t) && !defined(__DEFINED_int_fast32_t) -typedef int int_fast32_t; -#define __DEFINED_int_fast32_t -#endif - -#if defined(__NEED_int_fast64_t) && !defined(__DEFINED_int_fast64_t) -typedef int64_t int_fast64_t; -#define __DEFINED_int_fast64_t -#endif - - -#if defined(__NEED_uint_fast8_t) && !defined(__DEFINED_uint_fast8_t) -typedef unsigned char uint_fast8_t; -#define __DEFINED_uint_fast8_t -#endif - -#if defined(__NEED_uint_fast16_t) && !defined(__DEFINED_uint_fast16_t) -typedef unsigned int uint_fast16_t; -#define __DEFINED_uint_fast16_t -#endif - -#if defined(__NEED_uint_fast32_t) && !defined(__DEFINED_uint_fast32_t) -typedef unsigned int uint_fast32_t; -#define __DEFINED_uint_fast32_t -#endif - -#if defined(__NEED_uint_fast64_t) && !defined(__DEFINED_uint_fast64_t) -typedef uint64_t uint_fast64_t; -#define __DEFINED_uint_fast64_t -#endif - - -#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t) -typedef long intptr_t; -#define __DEFINED_intptr_t -#endif - -#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t) -typedef unsigned long uintptr_t; -#define __DEFINED_uintptr_t -#endif - - -#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t) -typedef long long intmax_t; -#define __DEFINED_intmax_t -#endif - -#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t) -typedef unsigned long long uintmax_t; -#define __DEFINED_uintmax_t -#endif - - -#if defined(__NEED_time_t) && !defined(__DEFINED_time_t) -typedef long time_t; -#define __DEFINED_time_t -#endif - -#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t) -typedef long useconds_t; -#define __DEFINED_useconds_t -#endif - -#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t) -typedef long suseconds_t; -#define __DEFINED_suseconds_t -#endif - -#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval) -struct timeval { time_t tv_sec; int tv_usec; }; -#define __DEFINED_struct_timeval -#endif - -#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec) -struct timespec { time_t tv_sec; unsigned long tv_nsec; }; -#define __DEFINED_struct_timespec -#endif - - -#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t) -typedef int pid_t; -#define __DEFINED_pid_t -#endif - -#if defined(__NEED_id_t) && !defined(__DEFINED_id_t) -typedef int id_t; -#define __DEFINED_id_t -#endif - -#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t) -typedef unsigned int uid_t; -#define __DEFINED_uid_t -#endif - -#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t) -typedef unsigned int gid_t; -#define __DEFINED_gid_t -#endif - -#if defined(__NEED_key_t) && !defined(__DEFINED_key_t) -typedef int key_t; -#define __DEFINED_key_t -#endif - - -#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t) -typedef struct __pthread * pthread_t; -#define __DEFINED_pthread_t -#endif - -#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t) -typedef int pthread_once_t; -#define __DEFINED_pthread_once_t -#endif - -#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t) -typedef int pthread_key_t; -#define __DEFINED_pthread_key_t -#endif - -#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t) -typedef int pthread_spinlock_t; -#define __DEFINED_pthread_spinlock_t -#endif - - -#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t) -typedef struct { union { int __i[14]; size_t __s[2]; } __u; } pthread_attr_t; -#define __DEFINED_pthread_attr_t -#endif - -#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t) -typedef unsigned pthread_mutexattr_t; -#define __DEFINED_pthread_mutexattr_t -#endif - -#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t) -typedef unsigned pthread_condattr_t; -#define __DEFINED_pthread_condattr_t -#endif - -#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t) -typedef unsigned pthread_barrierattr_t; -#define __DEFINED_pthread_barrierattr_t -#endif - -#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t) -typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t; -#define __DEFINED_pthread_rwlockattr_t -#endif - - -#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t) -typedef struct { union { int __i[10]; void *__p[1]; } __u; } pthread_mutex_t; -#define __DEFINED_pthread_mutex_t -#endif - -#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t) -typedef struct { union { int __i[12]; void *__p[1]; } __u; } pthread_cond_t; -#define __DEFINED_pthread_cond_t -#endif - -#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t) -typedef struct { union { int __i[14]; void *__p[1]; } __u; } pthread_rwlock_t; -#define __DEFINED_pthread_rwlock_t -#endif - -#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t) -typedef struct { union { int __i[8]; void *__p[1]; } __u; } pthread_barrier_t; -#define __DEFINED_pthread_barrier_t -#endif - - -#if defined(__NEED_off_t) && !defined(__DEFINED_off_t) -typedef long off_t; -#define __DEFINED_off_t -#endif - - -#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t) -typedef unsigned int mode_t; -#define __DEFINED_mode_t -#endif - - -#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t) -typedef unsigned long nlink_t; -#define __DEFINED_nlink_t -#endif - -#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t) -typedef unsigned long long ino_t; -#define __DEFINED_ino_t -#endif - -#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t) -typedef unsigned long dev_t; -#define __DEFINED_dev_t -#endif - -#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t) -typedef long blksize_t; -#define __DEFINED_blksize_t -#endif - -#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t) -typedef long long blkcnt_t; -#define __DEFINED_blkcnt_t -#endif - -#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t) -typedef unsigned long long fsblkcnt_t; -#define __DEFINED_fsblkcnt_t -#endif - -#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t) -typedef unsigned long long fsfilcnt_t; -#define __DEFINED_fsfilcnt_t -#endif - - -#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t) -typedef void * timer_t; -#define __DEFINED_timer_t -#endif - -#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t) -typedef int clockid_t; -#define __DEFINED_clockid_t -#endif - -#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t) -typedef long clock_t; -#define __DEFINED_clock_t -#endif - - -#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t) -typedef struct { unsigned long __bits[128/sizeof(long)]; } sigset_t; -#define __DEFINED_sigset_t -#endif - -#if 1 -#if defined(__NEED_siginfo_t) && !defined(__DEFINED_siginfo_t) -typedef struct __siginfo siginfo_t; -#define __DEFINED_siginfo_t -#endif - -#else -#if defined(__NEED_siginfo_t) && !defined(__DEFINED_siginfo_t) -#define siginfo_t struct __siginfo -#define __DEFINED_siginfo_t -#endif -#endif - -#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t) -typedef unsigned int socklen_t; -#define __DEFINED_socklen_t -#endif - -#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t) -typedef unsigned short sa_family_t; -#define __DEFINED_sa_family_t -#endif - -#if defined(__NEED_in_port_t) && !defined(__DEFINED_in_port_t) -typedef unsigned short in_port_t; -#define __DEFINED_in_port_t -#endif - -#if defined(__NEED_in_addr_t) && !defined(__DEFINED_in_addr_t) -typedef unsigned int in_addr_t; -#define __DEFINED_in_addr_t -#endif - -#if defined(__NEED_struct_in_addr) && !defined(__DEFINED_struct_in_addr) -struct in_addr { in_addr_t s_addr; }; -#define __DEFINED_struct_in_addr -#endif - - -#if defined(__NEED_FILE) && !defined(__DEFINED_FILE) -typedef struct __FILE_s FILE; -#define __DEFINED_FILE -#endif - - -#if defined(__NEED_nl_item) && !defined(__DEFINED_nl_item) -typedef int nl_item; -#define __DEFINED_nl_item -#endif - - -#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t) -typedef struct __locale * locale_t; -#define __DEFINED_locale_t -#endif - - -#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec) -struct iovec { void *iov_base; size_t iov_len; }; -#define __DEFINED_struct_iovec -#endif - - diff --git a/05/musl-0.6.0/include/bits b/05/musl-0.6.0/include/bits deleted file mode 120000 index ed2f0a7..0000000 --- a/05/musl-0.6.0/include/bits +++ /dev/null @@ -1 +0,0 @@ -../arch/x86_64/bits \ No newline at end of file diff --git a/05/musl-final/arch/x86_64/bits/alltypes.h b/05/musl-final/arch/x86_64/bits/alltypes.h deleted file mode 100644 index f07dc5c..0000000 --- a/05/musl-final/arch/x86_64/bits/alltypes.h +++ /dev/null @@ -1,468 +0,0 @@ - -#include - -#if defined(__NEED_size_t) && !defined(__DEFINED_size_t) -typedef unsigned long size_t; -#define __DEFINED_size_t -#endif - -#if defined(__NEED_ssize_t) && !defined(__DEFINED_ssize_t) -typedef long ssize_t; -#define __DEFINED_ssize_t -#endif - -#if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t) -typedef long ptrdiff_t; -#define __DEFINED_ptrdiff_t -#endif - -#if 0 -#if defined(__NEED_va_list) && !defined(__DEFINED_va_list) -typedef __builtin_va_list va_list; -#define __DEFINED_va_list -#endif - -#endif - -#if defined(__NEED_wchar_t) && !defined(__DEFINED_wchar_t) -typedef int wchar_t; -#define __DEFINED_wchar_t -#endif - -#if defined(__NEED_wint_t) && !defined(__DEFINED_wint_t) -typedef int wint_t; -#define __DEFINED_wint_t -#endif - -#if defined(__NEED_wctrans_t) && !defined(__DEFINED_wctrans_t) -typedef int wctrans_t; -#define __DEFINED_wctrans_t -#endif - -#if defined(__NEED_wctype_t) && !defined(__DEFINED_wctype_t) -typedef int wctype_t; -#define __DEFINED_wctype_t -#endif - - -#if defined(__NEED_int8_t) && !defined(__DEFINED_int8_t) -typedef char int8_t; -#define __DEFINED_int8_t -#endif - -#if defined(__NEED_int16_t) && !defined(__DEFINED_int16_t) -typedef short int16_t; -#define __DEFINED_int16_t -#endif - -#if defined(__NEED_int32_t) && !defined(__DEFINED_int32_t) -typedef int int32_t; -#define __DEFINED_int32_t -#endif - -#if defined(__NEED_int64_t) && !defined(__DEFINED_int64_t) -typedef long int64_t; -#define __DEFINED_int64_t -#endif - - -#if defined(__NEED_uint8_t) && !defined(__DEFINED_uint8_t) -typedef unsigned char uint8_t; -#define __DEFINED_uint8_t -#endif - -#if defined(__NEED_uint16_t) && !defined(__DEFINED_uint16_t) -typedef unsigned short uint16_t; -#define __DEFINED_uint16_t -#endif - -#if defined(__NEED_uint32_t) && !defined(__DEFINED_uint32_t) -typedef unsigned int uint32_t; -#define __DEFINED_uint32_t -#endif - -#if defined(__NEED_uint64_t) && !defined(__DEFINED_uint64_t) -typedef unsigned long uint64_t; -#define __DEFINED_uint64_t -#endif - - -#if defined(__NEED___uint8_t) && !defined(__DEFINED___uint8_t) -typedef unsigned char __uint8_t; -#define __DEFINED___uint8_t -#endif - -#if defined(__NEED___uint16_t) && !defined(__DEFINED___uint16_t) -typedef unsigned short __uint16_t; -#define __DEFINED___uint16_t -#endif - -#if defined(__NEED___uint32_t) && !defined(__DEFINED___uint32_t) -typedef unsigned int __uint32_t; -#define __DEFINED___uint32_t -#endif - -#if defined(__NEED___uint64_t) && !defined(__DEFINED___uint64_t) -typedef unsigned long __uint64_t; -#define __DEFINED___uint64_t -#endif - - -#if defined(__NEED_int_least8_t) && !defined(__DEFINED_int_least8_t) -typedef int8_t int_least8_t; -#define __DEFINED_int_least8_t -#endif - -#if defined(__NEED_int_least16_t) && !defined(__DEFINED_int_least16_t) -typedef int16_t int_least16_t; -#define __DEFINED_int_least16_t -#endif - -#if defined(__NEED_int_least32_t) && !defined(__DEFINED_int_least32_t) -typedef int32_t int_least32_t; -#define __DEFINED_int_least32_t -#endif - -#if defined(__NEED_int_least64_t) && !defined(__DEFINED_int_least64_t) -typedef int64_t int_least64_t; -#define __DEFINED_int_least64_t -#endif - - -#if defined(__NEED_uint_least8_t) && !defined(__DEFINED_uint_least8_t) -typedef uint8_t uint_least8_t; -#define __DEFINED_uint_least8_t -#endif - -#if defined(__NEED_uint_least16_t) && !defined(__DEFINED_uint_least16_t) -typedef uint16_t uint_least16_t; -#define __DEFINED_uint_least16_t -#endif - -#if defined(__NEED_uint_least32_t) && !defined(__DEFINED_uint_least32_t) -typedef uint32_t uint_least32_t; -#define __DEFINED_uint_least32_t -#endif - -#if defined(__NEED_uint_least64_t) && !defined(__DEFINED_uint_least64_t) -typedef uint64_t uint_least64_t; -#define __DEFINED_uint_least64_t -#endif - - -#if defined(__NEED_int_fast8_t) && !defined(__DEFINED_int_fast8_t) -typedef int8_t int_fast8_t; -#define __DEFINED_int_fast8_t -#endif - -#if defined(__NEED_int_fast16_t) && !defined(__DEFINED_int_fast16_t) -typedef int int_fast16_t; -#define __DEFINED_int_fast16_t -#endif - -#if defined(__NEED_int_fast32_t) && !defined(__DEFINED_int_fast32_t) -typedef int int_fast32_t; -#define __DEFINED_int_fast32_t -#endif - -#if defined(__NEED_int_fast64_t) && !defined(__DEFINED_int_fast64_t) -typedef int64_t int_fast64_t; -#define __DEFINED_int_fast64_t -#endif - - -#if defined(__NEED_uint_fast8_t) && !defined(__DEFINED_uint_fast8_t) -typedef unsigned char uint_fast8_t; -#define __DEFINED_uint_fast8_t -#endif - -#if defined(__NEED_uint_fast16_t) && !defined(__DEFINED_uint_fast16_t) -typedef unsigned int uint_fast16_t; -#define __DEFINED_uint_fast16_t -#endif - -#if defined(__NEED_uint_fast32_t) && !defined(__DEFINED_uint_fast32_t) -typedef unsigned int uint_fast32_t; -#define __DEFINED_uint_fast32_t -#endif - -#if defined(__NEED_uint_fast64_t) && !defined(__DEFINED_uint_fast64_t) -typedef uint64_t uint_fast64_t; -#define __DEFINED_uint_fast64_t -#endif - - -#if defined(__NEED_intptr_t) && !defined(__DEFINED_intptr_t) -typedef long intptr_t; -#define __DEFINED_intptr_t -#endif - -#if defined(__NEED_uintptr_t) && !defined(__DEFINED_uintptr_t) -typedef unsigned long uintptr_t; -#define __DEFINED_uintptr_t -#endif - - -#if defined(__NEED_intmax_t) && !defined(__DEFINED_intmax_t) -typedef long long intmax_t; -#define __DEFINED_intmax_t -#endif - -#if defined(__NEED_uintmax_t) && !defined(__DEFINED_uintmax_t) -typedef unsigned long long uintmax_t; -#define __DEFINED_uintmax_t -#endif - - -#if defined(__NEED_time_t) && !defined(__DEFINED_time_t) -typedef long time_t; -#define __DEFINED_time_t -#endif - -#if defined(__NEED_useconds_t) && !defined(__DEFINED_useconds_t) -typedef long useconds_t; -#define __DEFINED_useconds_t -#endif - -#if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t) -typedef long suseconds_t; -#define __DEFINED_suseconds_t -#endif - -#if defined(__NEED_struct_timeval) && !defined(__DEFINED_struct_timeval) -struct timeval { time_t tv_sec; int tv_usec; }; -#define __DEFINED_struct_timeval -#endif - -#if defined(__NEED_struct_timespec) && !defined(__DEFINED_struct_timespec) -struct timespec { time_t tv_sec; unsigned long tv_nsec; }; -#define __DEFINED_struct_timespec -#endif - - -#if defined(__NEED_pid_t) && !defined(__DEFINED_pid_t) -typedef int pid_t; -#define __DEFINED_pid_t -#endif - -#if defined(__NEED_id_t) && !defined(__DEFINED_id_t) -typedef int id_t; -#define __DEFINED_id_t -#endif - -#if defined(__NEED_uid_t) && !defined(__DEFINED_uid_t) -typedef unsigned int uid_t; -#define __DEFINED_uid_t -#endif - -#if defined(__NEED_gid_t) && !defined(__DEFINED_gid_t) -typedef unsigned int gid_t; -#define __DEFINED_gid_t -#endif - -#if defined(__NEED_key_t) && !defined(__DEFINED_key_t) -typedef int key_t; -#define __DEFINED_key_t -#endif - - -#if defined(__NEED_pthread_t) && !defined(__DEFINED_pthread_t) -typedef struct __pthread * pthread_t; -#define __DEFINED_pthread_t -#endif - -#if defined(__NEED_pthread_once_t) && !defined(__DEFINED_pthread_once_t) -typedef int pthread_once_t; -#define __DEFINED_pthread_once_t -#endif - -#if defined(__NEED_pthread_key_t) && !defined(__DEFINED_pthread_key_t) -typedef int pthread_key_t; -#define __DEFINED_pthread_key_t -#endif - -#if defined(__NEED_pthread_spinlock_t) && !defined(__DEFINED_pthread_spinlock_t) -typedef int pthread_spinlock_t; -#define __DEFINED_pthread_spinlock_t -#endif - - -#if defined(__NEED_pthread_attr_t) && !defined(__DEFINED_pthread_attr_t) -typedef struct { union { int __i[14]; size_t __s[2]; } __u; } pthread_attr_t; -#define __DEFINED_pthread_attr_t -#endif - -#if defined(__NEED_pthread_mutexattr_t) && !defined(__DEFINED_pthread_mutexattr_t) -typedef unsigned pthread_mutexattr_t; -#define __DEFINED_pthread_mutexattr_t -#endif - -#if defined(__NEED_pthread_condattr_t) && !defined(__DEFINED_pthread_condattr_t) -typedef unsigned pthread_condattr_t; -#define __DEFINED_pthread_condattr_t -#endif - -#if defined(__NEED_pthread_barrierattr_t) && !defined(__DEFINED_pthread_barrierattr_t) -typedef unsigned pthread_barrierattr_t; -#define __DEFINED_pthread_barrierattr_t -#endif - -#if defined(__NEED_pthread_rwlockattr_t) && !defined(__DEFINED_pthread_rwlockattr_t) -typedef struct { unsigned __attr[2]; } pthread_rwlockattr_t; -#define __DEFINED_pthread_rwlockattr_t -#endif - - -#if defined(__NEED_pthread_mutex_t) && !defined(__DEFINED_pthread_mutex_t) -typedef struct { union { int __i[10]; void *__p[1]; } __u; } pthread_mutex_t; -#define __DEFINED_pthread_mutex_t -#endif - -#if defined(__NEED_pthread_cond_t) && !defined(__DEFINED_pthread_cond_t) -typedef struct { union { int __i[12]; void *__p[1]; } __u; } pthread_cond_t; -#define __DEFINED_pthread_cond_t -#endif - -#if defined(__NEED_pthread_rwlock_t) && !defined(__DEFINED_pthread_rwlock_t) -typedef struct { union { int __i[14]; void *__p[1]; } __u; } pthread_rwlock_t; -#define __DEFINED_pthread_rwlock_t -#endif - -#if defined(__NEED_pthread_barrier_t) && !defined(__DEFINED_pthread_barrier_t) -typedef struct { union { int __i[8]; void *__p[1]; } __u; } pthread_barrier_t; -#define __DEFINED_pthread_barrier_t -#endif - - -#if defined(__NEED_off_t) && !defined(__DEFINED_off_t) -typedef long off_t; -#define __DEFINED_off_t -#endif - - -#if defined(__NEED_mode_t) && !defined(__DEFINED_mode_t) -typedef unsigned int mode_t; -#define __DEFINED_mode_t -#endif - - -#if defined(__NEED_nlink_t) && !defined(__DEFINED_nlink_t) -typedef unsigned long nlink_t; -#define __DEFINED_nlink_t -#endif - -#if defined(__NEED_ino_t) && !defined(__DEFINED_ino_t) -typedef unsigned long long ino_t; -#define __DEFINED_ino_t -#endif - -#if defined(__NEED_dev_t) && !defined(__DEFINED_dev_t) -typedef unsigned long dev_t; -#define __DEFINED_dev_t -#endif - -#if defined(__NEED_blksize_t) && !defined(__DEFINED_blksize_t) -typedef long blksize_t; -#define __DEFINED_blksize_t -#endif - -#if defined(__NEED_blkcnt_t) && !defined(__DEFINED_blkcnt_t) -typedef long long blkcnt_t; -#define __DEFINED_blkcnt_t -#endif - -#if defined(__NEED_fsblkcnt_t) && !defined(__DEFINED_fsblkcnt_t) -typedef unsigned long long fsblkcnt_t; -#define __DEFINED_fsblkcnt_t -#endif - -#if defined(__NEED_fsfilcnt_t) && !defined(__DEFINED_fsfilcnt_t) -typedef unsigned long long fsfilcnt_t; -#define __DEFINED_fsfilcnt_t -#endif - - -#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t) -typedef void * timer_t; -#define __DEFINED_timer_t -#endif - -#if defined(__NEED_clockid_t) && !defined(__DEFINED_clockid_t) -typedef int clockid_t; -#define __DEFINED_clockid_t -#endif - -#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t) -typedef long clock_t; -#define __DEFINED_clock_t -#endif - - -#if defined(__NEED_sigset_t) && !defined(__DEFINED_sigset_t) -typedef struct { unsigned long __bits[128/sizeof(long)]; } sigset_t; -#define __DEFINED_sigset_t -#endif - -#if 1 -#if defined(__NEED_siginfo_t) && !defined(__DEFINED_siginfo_t) -typedef struct __siginfo siginfo_t; -#define __DEFINED_siginfo_t -#endif - -#else -#if defined(__NEED_siginfo_t) && !defined(__DEFINED_siginfo_t) -#define siginfo_t struct __siginfo -#define __DEFINED_siginfo_t -#endif -#endif - -#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t) -typedef unsigned int socklen_t; -#define __DEFINED_socklen_t -#endif - -#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t) -typedef unsigned short sa_family_t; -#define __DEFINED_sa_family_t -#endif - -#if defined(__NEED_in_port_t) && !defined(__DEFINED_in_port_t) -typedef unsigned short in_port_t; -#define __DEFINED_in_port_t -#endif - -#if defined(__NEED_in_addr_t) && !defined(__DEFINED_in_addr_t) -typedef unsigned int in_addr_t; -#define __DEFINED_in_addr_t -#endif - -#if defined(__NEED_struct_in_addr) && !defined(__DEFINED_struct_in_addr) -struct in_addr { in_addr_t s_addr; }; -#define __DEFINED_struct_in_addr -#endif - - -#if defined(__NEED_FILE) && !defined(__DEFINED_FILE) -typedef struct __FILE_s FILE; -#define __DEFINED_FILE -#endif - - -#if defined(__NEED_nl_item) && !defined(__DEFINED_nl_item) -typedef int nl_item; -#define __DEFINED_nl_item -#endif - - -#if defined(__NEED_locale_t) && !defined(__DEFINED_locale_t) -typedef struct __locale * locale_t; -#define __DEFINED_locale_t -#endif - - -#if defined(__NEED_struct_iovec) && !defined(__DEFINED_struct_iovec) -struct iovec { void *iov_base; size_t iov_len; }; -#define __DEFINED_struct_iovec -#endif - - diff --git a/05/musl-final/include/bits b/05/musl-final/include/bits deleted file mode 120000 index ed2f0a7..0000000 --- a/05/musl-final/include/bits +++ /dev/null @@ -1 +0,0 @@ -../arch/x86_64/bits \ No newline at end of file diff --git a/06 b/06 deleted file mode 160000 index d2f9454..0000000 --- a/06 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d2f9454b34fef570cfb32cf5b17d85a90dba81bf diff --git a/06/.github/workflows/is-tested-enough.yml b/06/.github/workflows/is-tested-enough.yml new file mode 100644 index 0000000..6f53f32 --- /dev/null +++ b/06/.github/workflows/is-tested-enough.yml @@ -0,0 +1,16 @@ +name: "git notes Built-on: checks" +on: + push: + branches: + - main + - staging + pull_request: + branches: + - main + - staging +jobs: + is-tested-enough: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: helpers/maint/is-tested-enough diff --git a/06/.github/workflows/release-checks.yml b/06/.github/workflows/release-checks.yml new file mode 100644 index 0000000..7ad21b2 --- /dev/null +++ b/06/.github/workflows/release-checks.yml @@ -0,0 +1,19 @@ +name: "release checks" +on: + push: + branches: + - main + - staging + pull_request: + branches: + - main + - staging +jobs: + release-checks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v23 + with: + extra_nix_config: "experimental-features = flakes nix-command ca-derivations" + - run: helpers/maint/release # checks hashes in 0.nix + some more diff --git a/06/.github/workflows/stage1.yml b/06/.github/workflows/stage1.yml new file mode 100644 index 0000000..40146f2 --- /dev/null +++ b/06/.github/workflows/stage1.yml @@ -0,0 +1,77 @@ +name: "build stage1" +on: + push: + branches: + - main + - staging + pull_request: + branches: + - main + - staging +jobs: + stage1-nix-plain: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v23 + with: + extra_nix_config: "experimental-features = flakes nix-command ca-derivations" + - run: nix build -L '.#protosrc' + - run: nix build -L '.#tcc-seed' + - run: nix build -L '.#stage1^*' + - name: trim verification list + run: | + head -n3 verify.nix > verify.nix.tmp + mv verify.nix.tmp verify.nix + grep -F stage1^protomusl verify.nix + grep -F stage1^protobusybox verify.nix + grep -F stage1^tinycc verify.nix + - run: make verify-nix-plain-checksums + + stage1-make-ubuntu: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v23 + with: + extra_nix_config: "experimental-features = flakes nix-command ca-derivations" + # run: sudo apt -y install make wget zstd # are installed by default + - run: make tcc-seed # using nix + - run: make pkgs/1-stage1.pkg TAR=$(nix build 'nixpkgs#gnutar' --no-link --print-out-paths)/bin/tar # tar <1.35 had different hashes + - name: trim verification list + run: | + head -n2 verify.pkgs.sha256 > verify.pkgs.sha256.tmp + mv verify.pkgs.sha256.tmp verify.pkgs.sha256 + grep 0-tcc-seed verify.pkgs.sha256 + grep 1-stage1 verify.pkgs.sha256 + - run: make verify-pkgs-checksums + + stage1-make-alpine: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: jirutka/setup-alpine@v1 + with: + branch: edge + packages: tar make wget zstd bash coreutils gcc build-base + - run: git clone https://repo.or.cz/tinycc.git tinycc + - run: cd tinycc && git checkout af1abf1f45d45b34f0b02437f559f4dfdba7d23c + - run: cd tinycc && ./configure --config-musl --enable-static --extra-ldflags=-static && make -j $(nproc) + shell: alpine.sh --root {0} + - run: cp tinycc/tcc tcc-seed + shell: alpine.sh --root {0} + - run: | + sed -i 's|unshare -nr||' Makefile + sed -i 's|unshare -nrm|unshare -rm|' helpers/chroot + shell: alpine.sh --root {0} + - run: make pkgs/1-stage1.pkg + shell: alpine.sh --root {0} + - name: trim verification list + run: | + head -n2 verify.pkgs.sha256 > verify.pkgs.sha256.tmp + mv verify.pkgs.sha256.tmp verify.pkgs.sha256 + grep 0-tcc-seed verify.pkgs.sha256 + grep 1-stage1 verify.pkgs.sha256 + shell: alpine.sh --root {0} + - run: make verify-pkgs-checksums # warning: CUSTOM tcc is expected + shell: alpine.sh --root {0} diff --git a/06/.gitignore b/06/.gitignore new file mode 100644 index 0000000..a7d9664 --- /dev/null +++ b/06/.gitignore @@ -0,0 +1,20 @@ +tcc-seed + +/stage +/tmp +/downloads + +/log +/log.tmp +/result* +/scratch +/pkgs +/trees +/nix-checksums-stage4 +/nix-checksums-stage5 +/nix-checksums-stage5-custom + +/ZilchOS-core.iso +/ZilchOS-core-raw.iso + +/TODO diff --git a/06/.oldgit/HEAD b/06/.oldgit/HEAD new file mode 100644 index 0000000..b870d82 --- /dev/null +++ b/06/.oldgit/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/06/.oldgit/ORIG_HEAD b/06/.oldgit/ORIG_HEAD new file mode 100644 index 0000000..2f59c5e --- /dev/null +++ b/06/.oldgit/ORIG_HEAD @@ -0,0 +1 @@ +d2f9454b34fef570cfb32cf5b17d85a90dba81bf diff --git a/06/.oldgit/config b/06/.oldgit/config new file mode 100644 index 0000000..1bc5cd8 --- /dev/null +++ b/06/.oldgit/config @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = git@github.com:Dawid33/bootstrap-from-tcc.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main diff --git a/06/.oldgit/description b/06/.oldgit/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/06/.oldgit/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/06/.oldgit/hooks/applypatch-msg.sample b/06/.oldgit/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/06/.oldgit/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/06/.oldgit/hooks/commit-msg.sample b/06/.oldgit/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/06/.oldgit/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/06/.oldgit/hooks/fsmonitor-watchman.sample b/06/.oldgit/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..14ed0aa --- /dev/null +++ b/06/.oldgit/hooks/fsmonitor-watchman.sample @@ -0,0 +1,173 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + } + my $query = <<" END"; + ["query", "$git_work_tree", { + "since": $last_update_token, + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/06/.oldgit/hooks/post-update.sample b/06/.oldgit/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/06/.oldgit/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/06/.oldgit/hooks/pre-applypatch.sample b/06/.oldgit/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/06/.oldgit/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/06/.oldgit/hooks/pre-commit.sample b/06/.oldgit/hooks/pre-commit.sample new file mode 100755 index 0000000..e144712 --- /dev/null +++ b/06/.oldgit/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/06/.oldgit/hooks/pre-merge-commit.sample b/06/.oldgit/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/06/.oldgit/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/06/.oldgit/hooks/pre-push.sample b/06/.oldgit/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/06/.oldgit/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/06/.oldgit/hooks/pre-rebase.sample b/06/.oldgit/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/06/.oldgit/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/06/.oldgit/hooks/pre-receive.sample b/06/.oldgit/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/06/.oldgit/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/06/.oldgit/hooks/prepare-commit-msg.sample b/06/.oldgit/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/06/.oldgit/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/06/.oldgit/hooks/push-to-checkout.sample b/06/.oldgit/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/06/.oldgit/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/06/.oldgit/index b/06/.oldgit/index new file mode 100644 index 0000000000000000000000000000000000000000..38e78b8f0d5b2b8b50d715c27bfdeff44f821c17 GIT binary patch literal 8324 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 VF{SW0@9vdL#lNQh%3QJc{{WSgL@NLQ literal 0 HcmV?d00001 diff --git a/06/.oldgit/info/exclude b/06/.oldgit/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/06/.oldgit/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/06/.oldgit/logs/HEAD b/06/.oldgit/logs/HEAD new file mode 100644 index 0000000..90b2104 --- /dev/null +++ b/06/.oldgit/logs/HEAD @@ -0,0 +1,4 @@ +0000000000000000000000000000000000000000 d2f9454b34fef570cfb32cf5b17d85a90dba81bf Dawid Sobczak 1744959465 +0100 clone: from github.com:Dawid33/bootstrap-from-tcc.git +d2f9454b34fef570cfb32cf5b17d85a90dba81bf d2f9454b34fef570cfb32cf5b17d85a90dba81bf Dawid Sobczak 1744962847 +0100 checkout: moving from main to main +d2f9454b34fef570cfb32cf5b17d85a90dba81bf d2f9454b34fef570cfb32cf5b17d85a90dba81bf Dawid Sobczak 1744973869 +0100 reset: moving to HEAD +d2f9454b34fef570cfb32cf5b17d85a90dba81bf d2f9454b34fef570cfb32cf5b17d85a90dba81bf Dawid Sobczak 1744973918 +0100 reset: moving to HEAD diff --git a/06/.oldgit/logs/refs/heads/main b/06/.oldgit/logs/refs/heads/main new file mode 100644 index 0000000..6e6a380 --- /dev/null +++ b/06/.oldgit/logs/refs/heads/main @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 d2f9454b34fef570cfb32cf5b17d85a90dba81bf Dawid Sobczak 1744959465 +0100 clone: from github.com:Dawid33/bootstrap-from-tcc.git diff --git a/06/.oldgit/logs/refs/remotes/origin/HEAD b/06/.oldgit/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..6e6a380 --- /dev/null +++ b/06/.oldgit/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 d2f9454b34fef570cfb32cf5b17d85a90dba81bf Dawid Sobczak 1744959465 +0100 clone: from github.com:Dawid33/bootstrap-from-tcc.git diff --git a/06/.oldgit/objects/38/0dd4861a9837e60a666c58e43a14ff12ea4603 b/06/.oldgit/objects/38/0dd4861a9837e60a666c58e43a14ff12ea4603 new file mode 100644 index 0000000000000000000000000000000000000000..a20cddbe799bf8763d7cef49512db4ac143795b7 GIT binary patch literal 578 zcmV-I0=@ls0V^p=O;s>6HDfR_00ITQ^vsfs(jC-jJ2fpcCzV09_Z!byqgQvGm}l0V{gY+tUmN-cswT+Q z(Z$zQFE@puY^vvqb@JEeABpMg)ZD#h|B8*pH-L)FO-&V&N;7j(bW4jf^U`(mGAs0o zGZ+*v#R>i9wl2BMaLvwOnn&_~KBY=z)gU$Aahrdb^@qDDtdivTy+&*H)C7JnsG8*b z+ybD>bW4(xb&FF|Q*_IL!2&b8AmmXm>w=%vDOG=q4%|QDn&Y_966)NP)U?FXoDw~t zD;T~U&Yfh~z4@o(ACt=FNxn|*kG}OnjZeuh&&$bAOaZwf&QyQHmbPPVcXArKW(0M+ zs670e2Q@7%2N*(Nv&?uNZkp~8c5C$l$?%xcazRgpeG4EFmXVrMkXlsCaC`5g2xb=3 zWn$NpXJ5+NeRbx^oBa?KMXAY|1*t$4POq=SP^~t>;6HwfZ||B@iTT$om5bTkhaMzkvoR=` literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/49/27a2d50ee572da5f019e227e5df1afdc6c3963 b/06/.oldgit/objects/49/27a2d50ee572da5f019e227e5df1afdc6c3963 new file mode 100644 index 0000000000000000000000000000000000000000..8b3e413dd184bbe99f63399ab51fd21794cbb029 GIT binary patch literal 786 zcmV+t1MU2H0i{%3Z`(E$-Rtx#ZtVcxT2QpC#Bvj4K$#){+>cD^45B28ei%Qa*6AAQESr(6v7a;D(o87IY#9XO zU*PJ^&E;E|A14dU3!D{kJUxkK2`>sZayM`|C7H7jZfb z9jn9a%Pa^iIv@?UL4d8%wS$irH*e1;-`6tP3mP4Dv8NBA5#f@lRVRA%w}CNPsitCU z&uJ(0`gMB!?$z>Q`CHm^c!VoO76jEg7c~$A)K!MYjP$b3fam)sfhgd2APAIm#!IAL zXk*~dGjJs;2=~v=pb*{xUTPSP$748}o&uACS)o?o3kXhwEyFMzZ3*<3XwN_@AQm3D zJ}UhN1}*hnuk3Zewo%WWF4yiQCFuv}%yy|KUn~K_=kFO*UVqGl^;kq(fp>p;- z0@4;hbA6|zX1RT${QHs(bH11SGv2AkFImii2$_f{+|&VbthDQn0_!M zeGMKOvv0_5T=ohd(rgCgFF1Ptarxo0^LwlEeDH$Ji4>}7Nr^1S+734C#_rg#dptm7 zgPnte?P8wJk4dA}%Fn&n{G82;>M>##bU zNTICr_UG+rx~Z`c?I3bkRsZi@zsWX>pwKn+=0n$;;1~XSvk!iPXRxZ#0I9Er Ql{hrr1Bai3ukU~?=7n{RrvLx| literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/4b/5eb3f8368f574620aa1908fbac2a9b95600f4a b/06/.oldgit/objects/4b/5eb3f8368f574620aa1908fbac2a9b95600f4a new file mode 100644 index 0000000000000000000000000000000000000000..f11c8aad164e8c724aae4285a0e00202dbd0ee1b GIT binary patch literal 980 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 literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/63/45cc24f98d393f2da3f9e307f5a1402f95b015 b/06/.oldgit/objects/63/45cc24f98d393f2da3f9e307f5a1402f95b015 new file mode 100644 index 0000000000000000000000000000000000000000..6f3a134cd9b7c189f2526f41193d888bd6461afa GIT binary patch literal 65 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 literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/9f/a1dd951fc8994e7f4beba5b94b2503cac13b3d b/06/.oldgit/objects/9f/a1dd951fc8994e7f4beba5b94b2503cac13b3d new file mode 100644 index 0000000..603ce36 --- /dev/null +++ b/06/.oldgit/objects/9f/a1dd951fc8994e7f4beba5b94b2503cac13b3d @@ -0,0 +1 @@ +xPJA_w!̫DAd06Du*y7}-9o%] }1aBO'Z!+MԆ V1J=R9#jQG¢S1'JNt釶Ž>k7}]?t3&3&8[!:g^qy %%:\k9-_RXl \ No newline at end of file diff --git a/06/.oldgit/objects/a4/39d0d9d17edd5cc0161e7a50b4e1b3188b3db5 b/06/.oldgit/objects/a4/39d0d9d17edd5cc0161e7a50b4e1b3188b3db5 new file mode 100644 index 0000000000000000000000000000000000000000..ecde869d02434fb4c0142b3232ac674198a81173 GIT binary patch literal 1460 zcmV;l1xxyP0j*YTZ`(Ey-q+|?+~i`;3QLUNV!K;|HEo&(NYf%o2Mj16P}Ip{Baxa& zC2_m{_Z=n6b-FfPvE_pulXuU(KfE~CF^osU$q&6BS#2s7OT|!KL(EO)c|8~!3&!## zf;3=C6q4t3EEU*{Tev|;wCY>P_%#AoD==8ZIadNfr@+CijKu=1b|@7oNSh4^pg^vq zS~>v19ROaVf?AbaT!GPbCD05YM+-dH3ZdjyWMq@DbVULM+Klu=f_m-_8W)EHhgVh@ z+yw&d+(pPVMZ;C%eke%gZ3|eJjavle1o{*wCLslX0MCyupT2+@A5W3vc$`efvk{+( zy@U^k^Lc`^#e6o}Pxt5Z(R4Z-$1{?`7#A~6f78)$I7#=$3x@>H&tJWS%-Zr1V?}N9 zFqg3ib+u#_=Ex12<~SIJqi_;ZuEOQ}Eg#~!5Tl7$OlOm1zPG^HXtogJ7{`;vY%vwn zWGXP;Pm^@G5PY_`NauSZ!Ra1OW(kgmle<0`aw4wHD%Q85Ldz0;qjJp?)18tVey<5YX`jWE{<{=P`pO7{l)Zadhu z!e<5hM#LK{pB1W^GFK-WiB00W;kpw@kH%0grQ%e{l@UD8BVLIt%p6ZBZNUoB6p33I z=Qscw=}xj0N@|`5mCn&6z9M2NX#~0!Vrx(mrP|%s7R;GtxAXmIf6{5KUGcrLHd%6S z-I)&uEWvB0>OA*$dVsksq>|hcovkBw%SSQI@!IX#LZ=6C=3 ztWWGH@;X7rjls%>nZva=niwZX(^4f7VvMjvg%z1f8UkwhiNL*`%|tjx3N~Ww1Kkb> z^fCHKRBg@LmlQ%~wa$q{uBa4tMY#-}mz2Dn@J@=H7Td^VAu)L?v~jxA-`pKEj%|72 zoM_B%0j)hz5Fog`oSjGP;*X1nl@0!{uwAFdiA{++AHHN~)Y{p|x>Oc4n~+xWTIaep z?bAR_>+LkG)9)piN_sMWKRUlSd36T9qtub#hXZhgB9+C8`j%Z|Wu#WFJT6sjL4SLF zddaASPSVJwlk0j*E{O!+6=g_SuL=m#ZJ`Pq$_NEO4;~(#9K)OQ;};LNC2dwAPndA; z*=KUl8+}PMipXNr>QPT4Z`Dd|j2kMVyqdm(Hr_9oilSN-yfm1nt>#x13hHoX{;X`? z3cBf~h9Ht{=XV>tk^R7hHd#J!U-W6DazE%RA7rai+x%k-)L=q_JWS>fwlB-wx9jWXrr&f@QyH5`%}QOOA~Wk}f;I-@7=ZSTP;8sSTNL^3 zClla1IPe2O=9?Fdpm5?vggC(=NoWd6Y|I zzc0_tBei*G+a>VdWqVumA35*1@a)aY=*jEXr$?6;E@@Pa?uJIA&?<`S)X4Y$TX9^& z)m9RZr?Dw>+QF&4JCl^8IBrex+)>HOt+2#gMB&`+&g(@ofi<&jXB%%F>rut3TF~Q6 zY!y*+S}6>?eMl`vi*a*U+A6ZTyJPpLJv=;&j!$15J~@q^zB;?O{GxuJ+PA_sB!~a) O>QY;x@BIxpt{xi-_{d=Z literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/a7/2fee58d519bf613769936da06b67b9de33629a b/06/.oldgit/objects/a7/2fee58d519bf613769936da06b67b9de33629a new file mode 100644 index 0000000..dec1c3c --- /dev/null +++ b/06/.oldgit/objects/a7/2fee58d519bf613769936da06b67b9de33629a @@ -0,0 +1,2 @@ +xPKj1ڧx@gJI!YvӞϏqu)=AA ! ZJ0宷@HEċ'#ce1Uځ&h5'6VFylPYr&xIB_kSx/Wx{/;rz p9FBQ{Qe1kjsq1!Kekht{{^LdwQxd*dY85Fl8__FfcPQQOHQm$;sDCW_b8wRYCTz!(ywKH}bsB7Cu{A z^LZOoNkLJ5Nq$mkab;3|1yH5?7mI0kuDM#T3(5X*dsD)iq%dQ4Y$`Jt)HOFpnPuqZ zRV1dgt=cu=v)z@bnLw51rltzTsi`S?8TrK}x~UbZ$)zPgUU3G)63YuWFV@|SIUpui y6|m*uW{Gawtx%(jD~pp8b8_@D7+lmEXB<&+h)vk>Enn73?u`6420;La<5Yth>{{pm literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/db/42ebd40db62eaa1e868c31d924d317dda4c4a5 b/06/.oldgit/objects/db/42ebd40db62eaa1e868c31d924d317dda4c4a5 new file mode 100644 index 0000000000000000000000000000000000000000..07090dd8d559aacd57f512b3db16b133f4bd4fd4 GIT binary patch literal 1425 zcmV;C1#bFy0acZIRMQ3&#_I$Gb_Np!Ws39&N02Sh(n4Fnf~bfu6!6HyAxqNG2HLbV zDGxm&(~aUr2Pmi@2&izxQK~Q;>KKoSW9ZO>1CA)$WX_^aL6HfHV@;t6=I`J4-Q1h+ z-VjOzVY2xGHiOGDJWLiqz%YO#h=>8Nzu`8i5d;CJC;wV7UK#9Nbl!o@V)=2oOg4ZM zpcr9$!Hn>r`6JfqRk|-C>cgK4US;$vU6?agCWz73>$SgdWA}0Po?{0;_<7~f!mGqq zgAvcym+1qtNGk$`0WqeMfysy$E@2ct5GvxwE8k8xEI%C**snfhwOT<5jJBizLNOJA zN^w%rTRj|+*%dx&R{pqRAp@@%2ubXr6h3oGh+&uuz@#Lw%46~y%i5us__WkA?A1hF zx?c$;;Q%N`AW9h`LO}unWGY-rYIOR3ZtjXZ9fiY7Z7eyZ4i{IhaicU`vV|Fcg@UAS zTOZp}pijGh`?ZT+(D`Y#`bat5x9=>?W|8Ris~5E~k=lp;`LJ|E?2#QG>0Lt^`vFoz ztLcCQ0Y!+?*l#P*Tr%?85cDxKXZ^4b{F%#(JAo9>17Oo6C(8oVahE+a4yYZ48;Zb* zmKK&j#qj|}1|gAS{%ksL) z!e7s7)T;!Z-F+dKDb5FgRCop?PbUj+4ijvt-xT*W{)M(u!?u!frkU9k$(b9aOTF;5 zu<4lGlE8beZ^~ah?ixEVf0pEc03?^=1ZlX@{Zy~b-^zi6c_&w7#y{8HlM3KDm{Lwi zQId1K(fs=5Vf(yB2WzJXtzC$hRv$rguu5r+2@C|}c4;S$a${?4JTD0c?UG}6)081o z1~<%@^fhkpH?z?!v!>CnHdHVinNXTn6-|A@_q?O zE%!=mP0sJxyr?;-JWV7|GX~_7w-IX{BMU67Y!8ohe|M(6WU8!`24xT;B4$=Gp=u4+ zJ*Z@_e%sBD@{4mUSb;y}&>$w2OJpF10ZI5w@OYy;B0&G1llj-vOUH`pyVeWMa%o(V zECygXmWUejCdjvFOzrm#zctpfE;0}8E9~3%2hHLL49jK4&07*YF}3`G)-o-(q(pmS z`GUyusqr~riWDV`gNj{{>K*%}23zIYV-_pqFG~*#-C*J%Q{ZN=2RW_wx{$UJ+ef<> zyY7{W-#&Le)Sxt{c?>m%Go|`WaXsg(T}qrXwC%jJW)OO2S|tty5Ga;GURdMNBRzL| zuANs@wez3xmpo=cH#Rl@+wt~UPcEQD3=t)8LJ2AW6^>$JV77?!p*mgF5gYU1bCugp zNv0R`{C|p`RT(ae9DtAvIVO5nlV~qw4*q&vT#6GeN{iW^f3#!J#XgyT^0dzNZVjL2d@0Uj;n7gX z=CYP0@2SEbjgK~OzuPuKa{`LH@7Yt_QsBXFdsFMQE>CpqNq@HK{wDZ9bjJ?7eNJw6 zrSSs~RUN74Zn`iTobx6>4n*0twCPl4!hM_zR~`rK8pZb_e5UC}fKn--0C9r+tmJRe f@L8>XIni-N;Jqlm0ZY0WWuKMltX}#*KGfI?6tuHR literal 0 HcmV?d00001 diff --git a/06/.oldgit/objects/pack/pack-5358506a18ff05f1c00c67a067ffdd111ddf7303.idx b/06/.oldgit/objects/pack/pack-5358506a18ff05f1c00c67a067ffdd111ddf7303.idx new file mode 100644 index 0000000000000000000000000000000000000000..315d910b7011fcac8d8b3b460396cd9589a44d7a GIT binary patch literal 50940 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�Hjk(3JQ;(QgXZYqcFe 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

sf<^pPTEueq#i4j$ahZ)wJjZtnuC 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 Bb?secS&)jO=0RsS-3gP}VH zjw_7g*L$l(9B{9^{PJ(sHtC*p*)~wcZLS<89IE=2k3R7uyH3~gvd8=?YitmVQSSf+ z8g7Y-MvRL<@nnO%j5~z$so+mVm{|Dh*z3EjAp0?saL(?C`Fk$AA1?z`iA-@hu_NAkIRC5ZHM>wKo{>3s;eS>em&kVudsjb8H z9@M)E@G2RJ2TCix?U1v5nk2zFLyihJ4(YxfNK2`XwqpgxMM#aySa8EgBf) z591wexpFYqNf=jASn1FB_|_?qqR|xGC{(Xg4T#K^db`O}p;VS0=(Bu&sX&yx53;Ps zqK4~B2$-;zH{;vOl;|#*{R4r$9dK(M>VC&@elxUV6vC-f#GTj=u)jAI^?tHvVb!}v zuM6+%`cuaZr(~(=!C~Jm^>^FXQH3W9wq3&Qq!>+%U>#Y!*NT#U)3z8ctYkzCaj|SV zvi(NCb(C*=2JgD+QSxNai(}wj(@S$DzFCFA<<&f6bxQiT8Nh7;YJT0;^^T~`8~_vV z*cGH@U^fs+|2Y)fsH{3Oi~~#0P{-))xaZIHuP6PvNwM^8yx5bn{LBvm@nFozVRRN3 z*zja&ij-cj)Be{fjZ~la*Y_9ml!RcPfX_>lDPI4Ku6s{qypQN$zVz#K$dQb$*(;P9 z*)dKUg99+RaY3r^8`jW8D4j+od)ap@_+{8&DLiH7WNIcJnAaY})2=iJ5t`RnI%FN% zKu_=n-QlDbuHl z7OtRyYBewHh;IY_4Mzh)z6^|eRN}L%XlY%kStI{kWQJOa!b1+L&7m{djzjh_)SB?` z8vWU5^&o8e05DcZA9%={kV$k9D65g|XKVz8Kl}PUD$7n`%$K!6z;+lw^>np*qCl-P z!1cKkFZ}Yj^+?!-I!OEcA?z9nO7u{2eH}h15Dnn7VJF_BG746fS!pIowagiVBFjdV zLiGfUMzvH&8iP~Na`jMa5n#~^7U(ghpZdDSn`IK0S0=sTxS!}MZL5Emz4ennm(MR2 zsZj?`2G{j3V$NAxt#u^F9 zi92oZ#Xv-73)Ppf;Xp}NvGMhObU!a0aA`0B@ku55XlT&;=>i5Y8}J3bzAsNys0SLx zamiWirh4m%QHNG42OZJbb)NlLoTSpAV?8zS?eslr65Y+!RHRyDd!UQ#uFggxEKask}Af6 z{8jbH0;pa05uUq@;>LADVb_eQ4m4k0R9aI^_dt?>|HJ{xWOM!Cq97wUqhfj&Tt!)V zJLR3MS58g)GB`>iszGzmpdgv#y1%d^>Y>0(EM91FYrzNU1)cQcga_DQTthFk`cG30i&i2y-G(HSq4Td2V}$%n zVcUZl{Ck@AX(zGL4a-?1QIx){Vil8}`9U}4kPx4bJnz}s@%ZWH-$P02O$c;&&6XWh z5bEwG?-tfxrfV@mjMA&Nm=fOGavC&=pPC9qY-# zfSw{@Fl_?()XF0T^FAMt;4K7TkCBs8E56kL9#&lS4-{Q^2V@#MzQ9tZynB(?yy9ma zq8b^ECuh| z_W%|phQUk)bwT`OX`1i^vd2g;IKY3K6l>rRCKM`@a}N_ zKc=5S;9ZPBC4*#_LX;1f`7G-{ymSX!tJN2LMaD6YUzg3z4}=Pe0zF^AibekKVLw0T z^`Fh4q2+2Vs5b>#o5rNEbOA#+pXc>L4cldG_D%*Zz8gc_DV23>5$3K8dA&-56&$!* z;e)$_A20V2V0C{cmFc@UY zq6X+b|BZ}n&pWu=6ciNKiY`FBo!T#zbnPQeCvnTw-(JtFY`9zlLb4P=XPjcZK|kfI zP@Y)cbm~J1Rf2g;R}%d7NaL8AKx9VxKqTQUgLdnE&mNDw3p#qjKth+{=k?V4&OSdX zNiB1XZ&{2Cx3WuVjHT3>tJ}AFo#Gi85*(EaCNgbxd3$YTASpRwqs0mPkEuKdUDi zZO|}6awZnf`72V>OKyRBc_8#A{eGXep66gu^Q(;XuSKo@Xo^Od4+$14W#68;I4NTw zZ@4I*z19Fa_QMRFL*Jng?=k6qscYyDE=o&GSgol8EWO^7wPxCE+*rdlg-PjIsysVm zPlKbFn|pXuo|Vy!JOae)EsC`*4A|IAtkdK#3E+I%OHSjnf_l;Y&9$GzgfD!8gVfur zeRYJ0)h>L>&3hoIJs)SvWj(&CST0{HGm!@uWnwpgc$0Rt|3s9itK77t=}J-mU>u58_JS$kP&YW_W*epefir zD0~MzbP(IZ^0o=pf-ozy)tSaKW+}h*?;}lIibNcJDWbZAnJsDOcdEuky^J-@k4?5f ziNMMq6;etUbjpkPxfy|zxgG83Vx6Xgo<7$b?w1_j(|1L})z5=^cFusT;@Uq50(sGc zTu?LNpveIi3=K66Dme*p!b09TNiz;Yi1hlYTpCDv&{La*Ru9xrBm#t}&mWY);<7F} zVJ%zKt~sh9Ol7pQks*mjTt})YEG9Y%vLxlOqTKzAOt*-v2NSO;d&Or_35TpoMX~|R zj?E8USvfNq6=9@<3HghB3Um>g6d}{c3saX1AyF296Zl6A^V!UdIfe+!s&(?_B%!Vt zuoDfxJ{izVMg8N3*7tPMLT8IjK~_|=F;P`xTS&ALoY&1S4MA!UTMgLb960QxL;YeZ zBQs@~>B9XI6TfYr7fr#fn7Z2!rvCRU$9!(R*r8E)&?;E3-T~GGK}YRcVfw4!Py0(Z zd3#=1g?FQAv88>ls3-RKnI=ywzVTlaM@(P8VqkHCsH1v(HkN>(})KX1UNVru;G2nscvWN<qO)~L zyFg{p8a_hw3a36-U^^iJ8>+VZy%%vkE}*22YTj? zQAOX3S74qS#QKDeu@f$E$>idu%Xd0&wD}?x?{ZEEcpiSg^K;3Jg-$!*Rs?!UFi&m7 zm^xrp=t5i+?-IxI>~aPvW4=2fRv@;23=~-N$Bmy0#%o6Zpqw`IX`;(X&klcnQP3MtoY<6OlRj4gKK0$Y>| z^n`sE*MKaLgLN&QE06|A51bfQB#E4}5(wObpV8PnQ*`P_mdyv-ax0hDLeW}4-jb!% zUBWUXBsEJW{VT|=ul>hHM`YX>|5;&s>*vRy@(Gdo%qnFu<-%ogYX$C-8wM(Y*kAx=Vw!+Eu?T*TEo1E%=Om)FgN z48e4*rnLQmU(xm7c9ocwoOapUiVZe2B_X38KvJT~`eu9|=x1NYm>8a$y(!x~4Pn_k ziPM!}H_X>BAV_No)!6NqiJgJ_y|=X+uq#NGL~@N6D*k03D1);gvxl;9HY(iIl|ce{zYC{Ln55|D{XnTZ$>E z=Z&F+o;wsru{8P>E2%@0_#jI*XDMqImU`Lc5`5I-8LW3+j*j=ja?al@_ddm#T>Z*9 zXe}X18?)8mtqy0hfKBYtN)5BBtg{N;n zHLuU39GZp}zNc3u`5ChoYk|PfNNt`BmmSTlt0`s>0RX+ofiy8wVVpKC&KsPFi9VVO z6wkrxEomrTa1=V${;_q4V}80)#;vyKMQ&xDH^D%F=y$n?+w~G;QwlWwN9%RU6R;L~ zN!qdVUaQwiamqq5u5ixA2IrP~7~7P+i9K1GjBSp?3^U)Coy=zWSLdxOJ`nqKt>(|P zwE)BsZNiS(k~Vj8Dz?C=6(YKa`U-fT#7rCBc}^Toeo|HvX!W@3F; zM=P2-y~O^JoIH>^AIkI+9)-ef)I_vJf*o*^iV+Yits^kKC5+}ZE8n?^CuFznO3u5Y zghG^zBKm-*5N7fK^;mTf`utk%p{&E07cv*Cd91c7lDKBt_o>Wu<9*&xu!Xy$T*+IUeHxK9+0t zVGVegx1vWhT+Vy+#96ZfEjilJ(P$VucK9()!FqktUfT=*Dx1N|r0*Fs;T?^hxQ%F# z$8oQpfUlS0iN?iWi~bnI5wec@Dt`NLQ%jPbY`8bcfxg{@u-NC z7{tBC<@*>%O)Rm%0_1nhP%58k9M5dV=iCdjse~!hO)8DO@1UyM5ZG}9CptIe{`tADMfe#p{^v?|Rv83e1j!63GuDGyzj$L<|kV5&jBNn8`%Em#Zq z!OR<<|DzTxTAy~TzkLu2jPf6mbStuGPJM;h4mhV9ti;@enrkp3<(iX^*zf6t?gvxQ z`G=I_39egwo*D5?@_01U9m|l@GTJq=L|u_s`t$KmJ|6PKBIGc6${FgoCIjRK`8t?D zhrWhPSh=k_`<107ogIH*j$EtJ_bJIG`a-WIw`HwtKMk%0(+he>numUr^4<2&56GTh zuH|3Q1T#Pn)koOf7wQ=N-cbs>%3oO;SQT_TdvraKzoB|N=r%TJXv85|dO1W5nfd~B zSU`_5NIw6YT<1YL`CoD!@a6>i#G#Qa`<|6`Op4|E^Y6b!&q{`Xy12wBA+QS^3VE4C z;gi;?XMI+y6nWQ=sF?^vb_UnxH9GD%?D*0Wrk{sXLdNt!z@9mv%WSN_?)?pMmyONs zeNMUZw$T^y&y>BSf_)J3R0dD2B>E*o9l5NvM3-f6Xxj2|6{EI8!iv?QSuV3x>duAI zZZ%V@z{T^XUj}DoU283qteTXLTd7N{jORp^TadwgfRFc&&$8e>L>+laIfXS#0YkT)R z`q_NVDgsqjF_rTCcA71R$LBef@Ya;)`O}X~pz|$d|6u*93T9+5M=CR`=5-lgNAyg@ z&BE`-%8k4cyjF&V+*$}%?7I2CTj!qvv-9n-%?1yT&+gv-DU1R#*cU~%b>_n}un5Kp znl=iB+G!yMr^k>TvlJ)^Q*;J@Q2Pn#``5l6PT{?8u=U5Uih*n@uXsw^5!^?sNPXNd zj<#W(L-LaZ-eH)8{x)u*dh;c~?ilH2Uj1o`wP^Oq^_5CYQ>%p!9kc6%Fl*zCl=N{c z3*yksJs|Ar-vUYqN(vY#1Z6MZ%v7YCFAgUqP^e$85rrv9{L?X@j)# z5D`D1*poR(4y<;JsqOX9uaZaDwH6&29y_BGRkmj*4EX^$^Qx1Z-K}oH0*({dA}Y`C zuM-s5y{&mtPoM8o-ZKcM5z3aomspr=A(Qc-;U6&*r5#1}Gir(csJjQ#57Z3rzxbHG z2HIJSLm4f?aZ}>)9cTBit*}+dT0~Px*RyDpuNGqG^Z#olcYX*|yeA{-NP5d?P0M~_ zU{4qF*G;O~z(}}VI2cw5*F=VZs0Nc0?oAa@L!o~<$NxM<+j}PQVLuL)Cx%(8fCO&f z221E(7+lOPeh411_%Oy;W}fA8vX7zv>ac$6xH3(|jIGIJ$PKhPp}^$28DXMYiR_mD zAfZ>S^3|K6m1NrF`CH6Bu(@z@Lkr~uf-nRWJGM4Kmp-;hTxNuhiPeDAd-ZIQXS?Nj z3B%FX>CdAXAz}Jutr9SdCLGXbZOu7Nu!PZH912iWkeAt|=-|(=6DB<+>tWJJ%@Y1c z0Jttd&v2e|CKbh~5sU$z=k+XmAePs)8XWtoPEY1!idh^IpohwFZ=vH*A1U;guW2 zqmBkIAeMG=3Zf11%o1F}Uj=!&M?S4@*X=BD@yPP(zL4@Oq|a-^#)%IT#2uS@rnqG; z_~Bk&iwJ}lfm@X%!)qW692?K~92b$Iz{aW-N4?MP@Yu1kVC0ooIWWvv1FMWki`~6& zGy4t29QKeA5Y(qV_LSHgL3V~M`N=bAW-3KDmL-Ij!1TzBuaN0(JRoDWwatr{r-Oqx z(T^L$etJZB`{C!=A3;pDvPPFNv||BFClwjx64Lq-7YF52K5!YvUgN-B)PQ~^Sb-B9(+jFY@Maane|_5+x@{I@ zCg2e*`ltnqPpxEJO~#5A%F)9%LNq)GT1fty7)@rk&4k@@RLQ{Gn}6Fz!*m#;90k7W zIil&BLYCM-+Je3TkD1KCM15rw;=bbN5CzYxX6WyS>C4~$!-KK3RpnXz6!;9nXn4U8 z13*6kl*|rjLU7^WRPg>XC3;4KfrpueQ|f$emaS9q8r`^?y&zGt3+1JUEZh*q10tL_ z+Vi(>{)}skYleZ_SuYdHuy>CjwY(6gLEI)^YNo^tGvqz&j}=f5OvKE~Hi>h41_C*< zROk$|RcP}PlZ8}?WCd!r%O@N@j{ZzK8ikd^7Mv3z-++_ z9xvnZl)OEs!U*6;EF z?LO7>g<6}rYJSZG8zicW4Ymf0m_>F0PSxm&NeOLT-Y8eeuWEYF0+uo!+$2OfTW5nk>P zpRro7Rfs$12*n9Q;uH$^C|(5*%`HAqOXVLgAHZXISqKtZz;RAwqkcWFpu zuvM#NYKfyXNYMw^Wz;m}!NMhM-0k^ajuBol80NmEbXsJc7L_X=fjLg^fxtGqNG8C^ zn1oz*!eNX_q$T6kK8BAz)O(I|w(B*!>l152MfAy(a*N4`>+yTjS6f?wj+@vPirGha z>Q1BDHR|Q{>*3c0fL>9rnV*9FC;+wE8gZ^u z21S>>cF9ctuv?{{26Q3?E86Au_m0SqIsFf`;_XbpU?6&|L}{b_7Vw`rg8M_@Pk>Aa z(BAHRh&=|6N0&XUts~C4mt^o46i8bFO6CF_fW`;b0V@69Y_y>7jv3q!+vi;HC+Z;N zwU_fY+?oFp403jS5+?42ne<6Ossg_z;|HAJa{f<(!Fp-GnjEp2K+eACzPL^-S*42M zD1cz#zQ9i-ehBwv`QQ7v+kqZ~AJ62BZ0>MX&`3hc{uEZSy~i{FXRrp8oI`0 z=X-kV!$}zte4@q4N)}b@IL@C`XOknAKeWzBgsW#o;Tf?-;4jq1~r0W0pe!tV1UKkva=-JSnjLd%)((eei{Ox<%GfIj~z3m`Z` zkS73;Fan@O`!9$wq*H1UK6HWiz|3E7B}Qk21|*6Xw3eXHxZf4 zS9&mbxn-Zvcg;axO=TeU4)6|>j;{yh#edmU)E5n=QYJSY+XqX1R~s`($Zh~znBjHkx?&ifk0 z$ptuNapn18{pkNq9%QC>bu)IeHl;VQc5rvIwsZY2f{>IgIn&G1-Nbl_#3zpn?-mcH zR|kMGdGLq42#2 z&}jf8Hhf$sG6=vJgjyGNDcVG5X08d$uVn}fwjzvO0w>=Imvb|7Q|Fp{JI}69D&L{Z zJ*+fdz(y4#Z>HinB8Ddb;R7`UMkO_qGo*jsP0$`g7P*U0f(+Htrv8T)mZYnr;lu%V zQ^_{RUado+K9A`oDX{*~`x7`ghsOOBF1QXr(g7X^;`;xZD2$!m>LF+oRB%E-JTMpJ z$+bR_TN3RrQ0-`4+NHHnx_~hlC3$Tg$0Sg1lWl-mIlgDVD#1=JYA-hFF@_IVNt@Cp zxBky1-;_)KNcwh=G5k*m$wVLHrH@}Y?7x#pG^-$t0J#KdtN@tz$q6zEpYdVvzmtf8 zZZBCD-4{$!ONgVxCXnMGYH(jLL?sD;L(~LBMFh0>->4b@(31bRj01p{q`zSy>e&Tv z0$iuC5Bd9pbESlTZ~xAN1EI%(d|L+1|7Wqxtxt0)mtq3J@`6;JLj=VEM6STrKxzMr zl*5VUvd*Nwtr?KUGSOO>1wAOcDYC_%C@X|^Zeops?~`C$^8pgKed(f4HNNAKm`{L4 zOje-KM5Z@ja>!#(9Q*!Tw&VDd{qkRcoY@bon)%On95eKIC8E=j@wx`<9wp|MO;qPb0yaaFi`d~q($fDIW$zdz>DFuum#ywXm#fRR*=1zewr$(CZQFL2jV^ZCwsmvw^PYRo9pn4+ zjr^S>*YjkoSSx1C8IzS!mQ9*jR)&R9T862SMYfrRy`_#tLXug6S(>p`ij_r%iJetk znvqqOQI?5WvR+(5T9U0*oVDriIh$|~kEK*`CI+rpfwnv2&S(8Q_hMZdoDl_b z)>oDBOWe$5cyr~upd2{*vwd|{LNoCQyu{NiIAj(xG=BwkZ9h4Vdew5A@wa9>?8qN5 z6=a?c#;mOzvt$S3RfLOGoDlFe8YrpzC<&IP@x{z2KPo;oHnuEj;`VHyEbv%6Xi%BTe%m#T!KbNl=blL@EFmE8BjKZ9 zZf~sM11VSh_9N2VwWeL87Jls0-cxZPqlm%K#fpj1N?IB{LQzrip6NDH(n*n8AyHD&uWJ_}gqC~1)Dz!oWk3(LuK&x{d02FCPgJfj zk~%UG)zRUe2~%qk+Z0#cK1_P$hE{h8a2fT^1|G7_3XbtT_e?^>qx~$x+cw?*qjjUYDbMa-Q;bxeB z+o!?ZK$F$gZE@I9e4c96IOrcE4Y|#A1NiJ*+r@^cd5k1P1X#iYu+7eYnn&b`e0hc@ zxio)Awgv@<;vg^$*~i_g((zjH@$y>3n3RhQ`l(jAd$~L0(@bM6=@uSV&7tVg(et~Z zt*g`h;q~y+K}$^3k)KWF35`0s3{#}Vc$mt@D43qEW$Wv&k2}@o*XMfb?gsbU=gUIr z5&7HY`bcf8@7BldS*HE+@rTwl`P5v_HF;$FOJ7dUsZTpwoyVRp6`d*u_=VymEZ%>X1AF;rA zw(o`m+F?38tMV*PkU(VHXiyoMNamxE1N z!5HfYI&eUFg;jg_VqpK&w?8)XrdR?-LURZ!7BMxrC4svI+&|3Q!ChuOwqX-qK)d_P z>!O8~htHaccoeWhapuJ}md`A!?9t7c6}2EAoyh)V(TyNp0}M;H37JV}^kG9k;i`{$ z5)#)aHy;Li&LwJ>PcrR0^h24>jl`I;@+IV?n6caIBH*Y=YPCpbD43K@ljSE=v8?A+ zASjb3lxS&vEMJY+lH^yYCM{BL&C%jI6Dl!(&VewC`P)O}qBh(VWe*bR!MReJ4Y`Gcq7<@;grGg0;AKt|8hJ*;gc-w{|oBwvnb}9H^ z!>JI*gNHB|GGsaZ`EF==j`I_s%FfQdEG7x=9R(meXQUdT_Ro`rmvC0v)F&zcORYy6 zUxgsTn-hF&!sr@TBqyIN7$h4du!VjQnL=6)>rhZe|< zHa05*71w$eO+I!9sjfFnQxzij%G;UGs0^P=p`Jq!JJ8BbO6-=G^uCnkzQeGFVeo`Z>X z{~M2CMESK+;sIS|=Poweh#hELvg7zch9)<>@_P=jx0i#jzL_EazT3&**KcoZzEV4) zB`-FhV;ralK1P%4Q7-<46Apv3UZsBPS?-i!8BSPsJfIP3e1Wo1gX+_GGht)gCp+*s zO3%arnGnc#Mo0`XiR!cZ8I%3P`b^N+renCr41hy9p9Cqe;T`zHw!1tRNBlj^Kkkbb zAteY#OasN%7i1jtzf|S^jyB-bnhfHMx&ASTx%9W{l(%ew93BDnsj6{|8Y*dC6*UaZ z+~O&w6f(D8E@|JRzP=zU@*qa=7!0|pG*Ch&7-> z{0g-vbVf&FCmD#LlBQhF(k34=&)`=)cqIuh;h_SB!|` z?_cwFf?M~6g~@?BFD613o?G#IfYeb%k=0l5N9gI}jLs)bs}Fxer|<+HFZ@fM76$eS z5)$a_RvhfrtK8lTDUK?7J4J8WE7U6@yLGuaiM=rZ_0w3uH zynC6y%vcQ4508aN6(qi-KT7)ykTAX=BtGx|lDY+2?HQ*HrIFJcq-32>wSY>I*Euq^ zi%IK@(m)!>xEL%4z{*}4Zt=M@MeZMR#274%nHzl1yt<{+2WLVflSO9)Tlf;`%Rn7c z@|R*xo8A98_dceAtHp0WHD<5yH*+Se#_;g^$uaf`83q+S2b;(aS0$UToo-fBU{oVP+j&L^OrKnJYvGrH-(3}y@$77 zKObTZH@{`$3!kEQi%3($_2&H`Bfp(sL9)7%7boZ1Ha@`oaqBd*z+3$(Yf}th$7r9pvkVId&{iVn%;&MB zJEFiT^_Ty|qKm|J0LQIF zoi&|hN{2>7B{4KdHe<{(XsQnl7o2=P464)bHi+POBR-f8P8{j8aUlzgk%=d9(8SZB zI_FbfmyrEVOgX`P5~FtCV+3tkBEyfQ4VC`>&O`Z)D^z0;Iv(svdAmL+q`DWVkebAT zzWmp?OfvCi6i0e^jHXJvK_4^EaNLa}=f;i=OL~A*Z4XrM3k;k4QE-@z%Y2Fl5%z|Z zF?0Hv0!D}n2Q?#TCu&MC;8OHBs*zEY^rKnAzwZ6;V zp+=jm_b{DAidL1eQQ+8(HRgG`l_q$ zV^5uF+&(L(xy_&eqSJ4)@=5GR>ea8D&YViXY0Ym>3=i;il@7Gv=yJNaiFOrR-a6aM z?`|M3`{z5ZmJ@tl)A#IiY%gDoWzpxcdtR4TnxonHJ&Eg&Q95y(Dtqetx=Zn{3)}51 zwOTv_I!{F4csL{2%o!L>-vkLVlhY!zj7q*KBpAn+(~+}ou%u$M9M1cZY5d080$tPw zunATXrE8BzX*T&mtq*>(kI66Bc{1aP?agl7|80x_6rW>l;Gefg>2|s&8!xF4+^dFn zGYzt7u)A9wFotr@xJ$5@I-gl_QMX82S~^>pjOm28`|j4X2I_w5x{a9`Tkm}7k#DzY zj3ZEQ!wHJ*#xGPEbQ#)SF~WiG*5_kLAhAIoh|Zn3 z@9Vt35jjMz4R3A3hW&x9dUxWyC4kM;qB9yJq#SCVG%8k+YG|$4@j zZE`o_KCvcrepEFqYk`gWQAt890Cn1v6R+ga%SXR~Y=O@L#+&@;l4rWG>20e$O2cQx ziv7T8MpmRb8gO*nPAh6f$m(k6;ZPQwY1K`Wdm=t@xiuHlLEYO8##Z6uid;5{%D7d8 z8E#zOs{3VS7IGKqDP15%v9V7*9M}m)1<){FNo2I=G36<3r5EUR$9cCy!1;K!Cz<%P zdwp3p`&uYXES!KxU0OqGFebdCsQFHMc?$3jds+D0`4ziKOc*}QO;*DaTX13R=xP7> z%1Ty{o>~{jKwP;Rjss?3TyCaw;9AhftTnOMe-ul8RTwxkGPiod*0ImDDiiua2Py?m|QtqRaJ)1OB=VB?ohn!L%= z7BOsc4AkJ91Ns&TKf_Ud7Jh~J3F@~#7L*k}^_E(ba1*PcNrWE{E(t@w7ef-SdP6}r zhfX(1>pu}TVVJf0lcT;G!iyH5`h>K1*NerlJFP7j$G}+Re<4HKDOH{IxhlO1Po9zw zRFrp9rRx3I?Dl*b*nK7#Csm_Q{nPgh!otA6ybHs&2gA0z%`P}N`$~`SQw08sAqwc6 zQ>`!qv?xX6vm!c&dmvNuWw5E1AY3IBLx%@c(u#jWMHbZ0&h{Qdnx00wGm!v;qz~}z z`->)v-=)&!eoCBM)3|mOCuH| z0~C0K&^B>V5xqFHIqolRuX=(J79KIe3zYme8pS+>Z&A?=1k1HnZpd721@LH%n5>x< zm)^AV_^{?gXhSsT+9b|TZTXhN=D$4J*?9f2>{hj9={m(%j*`a%7B?b`Wzg4ZWmDnz zoix(WOxC;~XOKUZw|sg<=!n}6c*eneBa4Dh)e;yJZ;7-|f2Nz{!O%O<7RjLwFpwJ( zf>LYue8O?Xl!lE z$gW=+Hy-)zYH*zPcdeKEv(E5VVXVBfuoa_ygUW1z{%KO((xzm=_E_6_7kk*6=&5o9 zCCZafA*+$GPL>{`}v{Ml8MoL!7OK89*6%~5V*o|RzV+C=A;fJ zqh2@a-W#*L067ZD$U)@*-gJiH5|$iD;f072Z)p@JlX%J~$*{{o9=`4S&L3}Yd1bjx zsH?B=WuK+ij49&;m#h42nx~`2%FeyS7aL8T&_w^=L#K{z>R({pCDKr*kbXc{B*dY1 zL_gplK>lyA;Tde)c|2?}+$w}E3rq-se!p=i`TL3Nrg%SZjt)~agulZO`=|7YhO0R= zBS=LBL>M^RtPxEB{54?fg*`4zND4+${82$^EjfCE8o((1gPBR^{I z=Pn2KGk8}+r@GwUJvet`*1iKq$ouu}*aGM0o-@lY-p{z6&Pl%Ar&8Yt_QqLSfJfby zyT5_C+iZjQ@3NG4by3lZR0O4&B%aXQJnO-25k(Lx$>J7y2@qm$?hDJCHr-F38?00V zFxF5D8-oV!ie#JC<`S{C#o~Gcc{QpFj4-Q~XIK}dJFE>+Zf@!CFuYxtxpkaW7DKBA z%}^j-my0NC@>{GGw93f|nukZ0Gap?HJ->jRAsLg+FQ%SY7Y`)g;FYf+Eu4;k9-Yun zL|z)pjlS21?G)Nr5VGogAHfj*v+74{TM|ja#E$Rj7S`q&sR+F3)wC`ypBBhCYWZ0X zF8!!4yUQ9B^44^le;lRRbbCOssq!kohe=fB+^;pqGFs&cPwch3e^T*| zib~@&JqO2V(`P4F#R6Zbart1 zB;*ONI(k6=VLMZDa)$b6pxYQqc`3mGyiMY+Fn$@(xJBk}A!;SCwkMh=T5Sa;SFS!D zPwGA#zFYAPC+1|}4QV`bmm-X3xfw4NvA|D$*)XaNeD_5kWd&bGoIy|jJ2beB;}5eW z(HJq_5Z>i*Ov_Wdv(G&Z@5qVO*y6mCZe|8}9rda#40VY#4FDlLa;8k8D35FBZEZRf zx6k)RhTWb}#%M4>)F@&MeXy(pa6@~Hw!g6M$1kvmyf)BjLpfqRxXc7%u19k&GqI&} znF>N_*`c8uFxt}P1P2R1Jw8-@BxC3u76L^HA^~~+6mPEMdU!Ulxa_h+5ndsMt%qI- zJr!o0b;AtQr~h-16ncJX)L$&4di&MqV~Z3*|F~RLCjo=E)5P`a=~}(IH|8r3?!-BLeFJQ#q4gJrt38jEMOJnX2b(G-JBnc%&D+hi1z6kX|W9LaVPJX zgMWH9t6z7Wn+oWPLIkmZ9zrt5dBHMF`%;Q(*LY(mDKg9Gqn`>mz_h!=v^T9+(w5-L zEZlP)EKH2_=2iDVC539RF7@|0oyybf*0ftUGSR3Q-)7#{ZDUH;>-~FCluokry<}>!z(nuiscnYR`-J5J^kiA!wv_kHk4y$WKiXCgPBRV z1PZuOXMg=?Ufr zy86rowQ)CG4~3-_B0lWXx!L< zXBAA$tF$tT9~*TNJo#CKjz9j+ls$5cMg}(0H!FA0$F_OvZ(v6BcZCJopfm! z>xw-6H29m1d38KtI>p@k!v6Kr&d0uF?a0OFc1LgN_q+yHNC0*Ic)?*xZo%KTK&0LHtpCE2~y$eCF70_lr-HhfR06#x8* z`JV%2*C6A}XVr59-!tByIA@x3Zdg#vl`(J1M`#EN1-`+t_~lbYrgzYkAq^hXk(?w~ zL=0^`vqh+RcYC0IInpiVyoa@jUI-v#|EY?7_o3#U&tBMjGA%TDc~pF|^Q1>@n)?Ei zn5S(O`Y^420TE#jE#8LJSQG*c4n^bE=s zDhg6{5^@}%(^N)AW|11ET1f^@x+WP8c`}?ty8JEP~)vIJ2OFK z+2VCkQ`Yu8Kfwgb)?bHQhd^=FRKcw=_;wypeo2Psb}l#2Yz1xEb$%2tU_T^yqmT?U?m`#_JxJJk)8XDH%=3!Cd`L#4MK6D&xB?dzBTpigrIUEU;rSk}$DtRsri`#C&ZL!Fcgd5I$vu;c% zR{963(i8}n3SxKsMLzK*bEV7vdnqRfJDEW-a()UHAZSl$~_@Vyu_u9+D?2M=ft=kz?EcUa_I69t;i~cBd z-zEgmM4&@I7)p-x>~KfyoAN_PtvEETl|7YXswd-X)Xl^@qk77-CiV@Jumh23sXPCS zcaFNFh3x2Zw@`18EquK5b!*bpCV<_Y|M7D8WYwg-2wfKI&fJ`l_|h1^P3(N^Het-J5&vcsC%D)u_x zb3v|3KKAjqHpRv%-is4ITR7E+ZgInn66mc0bt8$)>Rep`!!GW4Gj$I@K)7*1p17fLihz5Zb)95l zcR{2Fc5spC7U^4qGZeVn(Qs$^*^r(;d zuSxV2=bH>q<0rr9r})HECWG?Xpx5}@Sqdo8{s19SRTkfa@RRJ<%cKbvrRO zzhK-|%J~{EJp;)n??JDsBwK>ko8c|jv@vylAR1_|Gdx?N=-Nd@V3rI&zEV^4{#(Q1 z53jE;wugEw#>-5GC9)9{v#Q=2=Xatwxcx-&=>?bVv?$ko%Qa&%So_J8B0BJ2Gqh|% zQbvD6DxC(j!$q&~9Hfc>B4fk8&Gk}b9f`t1XoTM>x6yggL>3-Wz-a-dkD~=4c+kme zrb?4&ZA`o)FUH^8F1#Zs%X%=0gem2~VTG$)g}|p31mUo}-m7 z+FNu(9d>2grnFHQC?M)i9`ubbjVN8`P+O@CViauLO$t>p6k5$m?jVKeM6NOoZHY;( z@>&I?P;29mr(D>#S6I}VGEbO`s%K_aai!o%-rSvhW;~kyBE%fQYQ3l?5G=y+xEcIq z%=u+Y^VO4<0$Bq(q)gN7NMnqT8sqZ0msxrEVAAf@_%Tm!a4fW;#kPLYb6VSRU7?PF zoH+3)A%toRz3gsn0nWy5H-s9-9?MTq8f(-r&|1I{`bB)-&B_y(*~A&+CTQo`*6ZP1 z&sk>Exj40JQNQw(t)oMewaK2EN!MF6gTb4Sjo>EZ_8tETY(BA8OzEc$E=G9ki&9Q` zFMc`m1&=jD^oMr{hFvXjmpvZ|)luZ`dhqBsqDhR}{le=7?rd+!q6zw<9q?cvjf#87 zF~T$uveH0AM8&?K-n_>-Op_4$bJ{bOHney{j6{wiy4Vx#g%gGnz*M){D%DE1v9H>TC4Skf+Nc7M-DI@MC3CE_d{0$a|F zG|kh;8sZBQ4WokCMl5`HAy1L&c<4cj(7N7>K>FfvAg*9W34qTM3u5;lb`pE?#>x83 z;QM#dY1IL*g+P!5@74PMqFw#VY%?`x1o=s>`bu24U30o)5NZ14I5MaDK2>kS2ZrWI zu`dOOZC-!B){zUtM*cQzbfnSP2Nni~mf!6gczhW-isHleQRWc#oBY$~C{YVC3oWs4 zr%MW3iOH7W$aV%}KHB>$h^G+&N({71M5J;T^pPG&w0R4%pC=whO#Mz4Nd~ZO5m!J5 z0Z|==?mL1EEM)#?jDP(<)jI?~6 zB-@x~PIM3gdqL=AmLQm-;MW&WGeDyiP-~Ec{~`opqsiQbEl`eLw%>T#8Ze%M;j&DyqnlA<-$J> z+4b&@U}zVWy-lfqK$)UfNu&uA2dq+l`m_Y!Fuq(s1@r-3zYu|s3?u+T%4rJ;*fR^W z^9%3VQey}T8X#tnxCkRENr6iCfk?UHb+t~Py?e>JdB>RkM!R~zUMHr1vwrT>wlIMW zt^0Xnrm~psSEKL-vWTV}(xB#;cwX*Ch~FJ|1+f%Hm5(LVTPnf!>jMt|`4I64XlR8P z(=8n&fFPVmOxXJls9V8fRK(6TP92#!XhrA zF^QITj8IS9w5geSa>WOqzPHtKQWyabS9#8FQSlI=E=sY`{BEEbg~-3#eB_8j!~e@};Bb<6&MgRc1OZ=C9@(JyVLnj^Q|jC}b5q1E!8&7cWPbi%<8KP9H359W_<ZRH`nu!jlve&t=E~L zJ|%?V=svz#^crK$uKVb+`po9W!gDRc8|z6OA41ImEi(RhI=R8)8-X&Ze^fV`G*I{b zD}M@&PqTXk6$+&4{&zaTw!#(lAPpDsI8jbST`gkw zYcPT& zqnrO2=4G_a92Md-?A%b?9J>zhWR>}I#(Nxg`=6`p8wdUy~yGojy?pcB9<6BHk0=f5~uNoeGC zH7Ymc<)tHf1g6hrB2fm1EjmE1)fN}h^(kaI6L3ci)qnH*2{iwUbfMGh{~pKxQ{_@0 z5~8Kv0m}0VH%$3HlfWcxq>oNS4Q7sOk)jG+g4J*m?Rz8X7PFXix1Cjs{zHC5A>b4? zyG#d~qwgum`L*-N`UNBa5z})Y)ISxNXEZD8MZAT&`u1%=qsK}iqS$a?KTW_ulp&zo zjv#|#fuRn}f9SwPK=y^A@5K=ylr%aZi#NHVY73BGt23uoyYfD|%~nZ^V2MM}Q`zV} zMJTvu34cGT2HcoiDl9b(+?oNb&eH`>eJ;_i|Ej{crS8E0V%EZf+XnT!2L`5R*<5M8 zeq`UiBG@wf7OEBSw}qjha}SWiA^$^K{z=+kaT7C%^qF2l7i}7pM7KPBM6b5NAul`W zbnz}K|M5~lwN<huI&14r-^WbJMP|;)lWVg zva@bfiz4|1e;XTfd!&{9bj3$s&-bmP#r{SD5jB}=CL8extI$g3Md@jYNl9qxu7|y^ zaXeK%915BydNewth67W14aP?cAghtILAbO=yt1%t2)*gO#6oA{^f z9TZFvC;tB?dp1Zlur#u;F)=Z)02o_YBqi9GWF#b5m}FVlni-gx8Q3HwS(s((#U+`T zWm&~p0c?!YEi5cDY%+|DY)nm3607f#Lt*K2W{q^A_iG_uderNl^S~(ymT68gc5b6JL;s3jmnER)auuhD+ zh1+AX?ft#m*B5rXOV!&aHIq>AS0R^QRnhPcx3tNxpi7EeOe_^-dF=mI635r*!8_oo zK<~i+dr3;r_Xu$Zl(@IstGKjCcz6`ls~bnyhnVXJ%a^3P%f$T8B`I$LrREYCy}ZD8 zR&poj8CZ!@TT>cgDJ&jm*j1X_II|BaD3eJV?41r;-~$_V3KcL1tmghX(*_t&Amu~~ z_;UuvK~g?u_>RyRVGf2;`4N@U!N!dcizcD3@GkAHfCgj)wJ`MFLF;R=(_g$-5d)vQ zp6NlserbBjE7+q_^2y_UxRmtce?p9Rxkj*PQ^~@y)yYU0-$E|EUO|5?<7VuD`rXk2 zH&>pky6Yfo{*-M{5Egr8c$Wbfi0CymdIHepHhEG~<{u}uS>DpJZdC9g)1T@8xW)R_ z2uiqu=M!StUJb)PBV8ZrK_!C6ix>tf#xyTdSR)-PJFJ=&oX06W%G`6b$;1&_)0qLV zPHZ?u2VGOguxnAQjVy~5xFEkRzuSQGA^8jgc(xn0r98{8IW#x6RHdtNrD}^0AECw} zjhj_5c0>x23@ne-5BGgBbPCvggVnNkjmi#IpK8yb8W(e|I|T@`R5;0smJV6P&g+Kl z!*y$uRPx$^Q6Md+Ejh@5<~>szrcHo0w!}8|qbdN+o(U}oQ`%}}2_sSP8 zPxRPmB1kW!F-YC8h?NsEkZ;^Uu_kBS`Qb%_MCwdqPD`Ssj0r#)Z!$okaYxxaE&vcf zm!{m0SZA4|l7Ku?04qz1EY$qA)nfB|z5l`zSGsQN<5|S3d*fVOSpXXPZhP&QpF4XH zj4!bllHgj*xprr!+}GI}KN;+av)MZy7@i%^6jwJf$Tl>O@@{nbHL?)X@^tk^=@(UQyPm@R{5X7?-0nkcw=)KiQrQ8D z?k#*gKR(WgP~P<$H2|&=qq79LT_eb-^pD+ju_%YDbKWf!Rr&Ce%T1Z;o=5Z~zwQAkrCw zy7Lfgy*`WxN_;$e5p!%BKmj5e#e|eHu`(4sL3I)(<&rd>^z#>oAP|`0lyXKcNI2$C zTlqv$K&SBt#B=sWE{Z?NJCFUAax0tmtE)ezBOiJm&RINzfmA|=A56=ScXI#o3pZOR zOHuHCensel5UypZGBN5W%)L*OTiwPfQ39+T$ztbW%j$F{y)i|&qkk>;?)#t4r@6KC z&*g{GOxylBdBiH&QLFZRn^vugF8-%%^&y`+IQF|mK+1<&Bmz|R?}f=4hqZx>^O5&E z5j|wo4>et;z5L4FW3|IN$RRhVm}}9bMb|?ZUjJ_lLVY{>j-Drta?U9>7$e+@Y-|=B z3mt(b-Sef@+et-f)^%}fFGMrSZ_sk@P?Zf;>E+UCntf6hTinsZwvM@9AlH3nTYKOE zK*vzc(RQE$p&=w*KchT8JiT2$Bi=kiq`|(z9Vk60Z*MoRNG}H}BP=RJG%CXF9Zp5B z7%)KW@R7pu!QHZ$|LcxHAtNn4H!(_2Hz!>!E=@-ZdK6<>1rS4Z#h;Wf8)3pL$6 zTIGh0SnHgk%oNNN@|Zl4^e5W|q-JJnqLn5eYh8nSsF1hM7WE$;{YO_$F8z}=NKb5s zD{De@Y3(lf+c9$r)D*tC)mYX>iJq=zA|OgC`uEna*%#ZwU+t}lTidP1OKZiKoEoc^ z>~^e9qnLO&4Ce*aET=2BvJ&6*_Xwp`X}h1ndvd00m*3sSIL=sQ>2p($aD0AiWpeW| zjzd^6Ke9rj)dz?!ERkO^y68$fDC)we65=nJ7{*wSlvH@Gg z`MYrP7R2&htT7TKb(no0p8F=27X}9hd zF=4e>26FF1ewA45Cy5j1MCryBi#n=DJ;ESVeud@ZU3*$<8$UEO59T{QN>@nt-DNe6 z<0nJh7+H9l30N==|5lOeHE28?+uWpEUe9YRgB=8E{8qigRT#?`cWeiR`<*9|YBGZV zXiXK3U5|(pWz^i>^u+Jot&=a;HjUc!Ssae112w=(NU%W_wfr2>K4dnl7?zdJZ%C%d zO2CC~xb>91#MkF9aS5SEygq2c2!KMD+pE3&jY|ci(+}wf*E5%$fYBI|yLBn&2r^Lv zykd_}F&EngXEh0a61w1VX8?{{1T`d#(j;=ZgTSGZRH!JJHF&J#L#{JXs}z0jWkc-H z`Ewh){fRYd0lK#z=AXAznxF>F^K^K_`#lPVN6?O^&v|FgUrd!L4K|ga zY}f+azj+pfs&T3nF<6OU0L#A~IC6G@RS5Nr7oNp4rVGel&YvGW0TKIxinLJ-^&L)_ zkQSCoJu?- z-?+xFh;F~b)>O}lL;FDi;k=cMZ8Z)Hd%@!Bv5Yj>{5llhkV=H1!5|@Hs(Xe&dDvfv z9q(5!UfpNobBda6gF+A}^%4=AbW0w?5bwXo#d zdKe_;cNYE#hytgyv-1q`+f+>Z)E35zV3qpT=cl04pm)qvNmiB=2vI(S_$e;%K1droVU5O*B0PlnGMR%C0AcmY zz2Ug7RO0DTl}rm?Ke5WF7Q_$pTL7P0tY1&QluM~xM;m#0Fuo(Ck+?&UWDc{TjEsWL zjM`b{2BS`2Get>_cG9J)>+ku2n_G-_oW!v*OJ!sve~iNE=33I+QJT`QbWnl6rR1T5 zw#FZYoq6u?kc=VsQ8WKDjzqRfNPG9?WRF3BY zFb!uQ_9q?|90!@Obqs3Om|MykIZL8ojZq{i-1Ffrs2s0kvzp9CK_*@iAMCJ7=M@>lGP=gm6ysFU8B?__ALsJK@gr%hfdOe^kl(P6Yl7?@&9?w{cD* z%L&9RuAw{nk=ZMSHT(_tr?4vpWis16`?Y0Qq?Z_e6EYDU41J63h)1ccTRwm zm(Ntn9sPUajozKp}5yL>d}J)Tzn&$tXnyDFj6tM8w2N zM4G8d;72hrQBgq=Au2IiA%RA5a-JqZApv0?L7GNEF<}8=YAR77F;S`wkdWy7PqVEG zE#g0RtcXtf2CtCeq+?j+lpgNs=vrAwnr?-J#O6w@lgiV-J9=0kjDY;Ry)688B;+qSDQ$pe(rFsZz`S_JTRC;Cx6(%XRpHi|BnQc|7G5V_4($(j}LveM`dqPH@>XDzkHA zgOvP#0CGi0e5Om#8?^ry(fTTp2JLV!XWh<=AN0wPQgPtwaRee-yDmrtJK%v+KxjF0 zXmzxG2dNO?;9%e&TH#}FAz|(>Sk){jA!?BmkQ2by@N6PcB1#5QON}yc3|R;T`~fwP z(*K6SrKzo&)Xhx}kq>vGb7l&$5mEV0{(-_`8M_v1|AjpKK91;4hAwYI>San7_7nf2#S)8<5h4%jYfB1 ziMV%3Rkyf?iNCX|c6kDYi3e}T4rtOR`3=cNm@B0Z4gV-Km9YTz!jzNK(~S(HwAAA4 zbY;LAntoDRk_I3FXdRu+*6O3-;*52kGLmEyV1o=^%-UTX^Rh|+sotjZP5KA3n3|9l zCPV{b7RrCS<=fxWF$-DMKyxR=L!eQ&u_l&-5m)*+J->sRSVt`nh~`JTkdj7de47b@ zOPCTBF}CJ+K~8*ya>^JXN+L(wOc!6ZNK8LT`Cfrgj>Pr8ZL6kFg_ij$8lg+!>WhuZT<<{y}kk+yI2 z&Ax?C#B3nTmPn*WKZAjy{I|Ebn_J*E9Oe1flS3Bqy7N^VGrm{KVi&eO$gw%yd9D>+2ch|Ii?&+E*dJP;O{GEx^Kc&h(*GoVA`)$Io)h%ns5}kJyyYQt7#>ZP^N%eRkgIC%=BYRLYA=OKC3yReFVBV z_<3FaKy`MZ6f9wA6AB8DlYKPEvS}3AUU5@X(vRDM-vI%OL~#@3Gn2DPAoDkTbT=^q zm;EiL9Ydtyr0HX)KgXV>443weU?i;?Bue0zgRI99P}kEaNf8@}iP?XN2y_Y(a;g)y z=kXJgixAes99K-)GC{6_a`}fG<^X}_;z@Z6@P807Us=X4LIG_&bb$HvEGh@r_purb zXTol8&rq*lZk7y#A)8j10nsw<)x?^{;qhfjD3t04`zD4IyW~hV@VFQWB}MnLn12tI z1k>>>q|Lm^4jP%s>cWmZ?m?fjb?c4suQ$k#Os%i&?;qc}a2`4wd;X}rl2hE%VJ2zx zi&#*KoQ}vZ@3O;vJ32SChvGWRsl9Wh}8zLlZ;F$(1X{5Cr)>rY2xVwhfyq_Vu;H)KAko~^govg(2uTPe&JI|R_kV(akW?jJ zFuujr-|J!?5NUi=pGk1mRoyOXcE_yZDhjezi_m`t;lCvT+*tJ88Ww?krP>w_qCEi~ zz;te+W9-lnP#plwV-gMxHue@45zT`CD&y_HDRs4xF!CxBkeO7=RraXISrRaV^hja> zm(&Mb()wgamUAHKo{8!(k0=PvE_iD$F!vNs3MdQ$Nz{FwI{7%z6wL`7E|?+yKkSa9 zGik@7OT#BQrsaHQh*zMkDvA7Q$H?TpeElK-11zo4Lp!G?}aIEs$aY<~p^Iv|;Ry8s!n z3}6PP#ByNy1f7_!xo`y<$O#M_0+8+h3Y;o5OqIQhVE#Iow?}sa(=wXFS8cV8`o1vG zhgFmxP5N%2&Pvv@>kKHLxL*;4N~dHPVDlj*0wsh{f%FWBd{PEwZ7~aO(pD4n-s#Ub zos#2ANopMUG)ncv(%TXdfCvs7cpP^&oB+Yd})xc9k z2MSIbTU!O<>lHQ*OCpOdQwx8^@bTY&$8XjsNh~|vt%t0Ug3wJ@`@s+|M@4(mump-h zrSucxN3xZ-xvha;N@i^z*U1gj{RjmT1Ctpg{C->0JSEY<+5h3~ox&@Nx^2-F+qP|^ zVpVM0wr#s&+p5@R#jMyiD^4nR)xY;WXFr_tefQ};ufAr+8X0}e*3o)vJ~$(R8dwCK zJ;{mm2}N-s6{2<=1>Y5sydeoOj6{mqP2|!3(Pc6<39u52wy-F-NIyB4%--nY%XUd` zp>K+(w=oZMPSnP>e=&nV%6ZkqM*h8|wf}9Pnaj^Ro3MZdLiQQ6_hf#<^;$O7F#zdX z;zV!iTSwi|&=5n)l9~ zo+L7%;?2nvK`w+1RoQ3edZDfPHun4v0W?cB zrQKw2-s!lx@8~Ik7V}3&HE@9$ci{eD{^gXvg@c3(D0TQquT_0dX&Vq?uT z+cS;4BD#e6C9N4w0BRKC#oyZ_6Di!`vdA;r?)wWn`9ol>--?TmyNjRGV=aV0(<<_G z+QUjU(d+J7TsS`-A>uk?bo8i)!&!qHx@8zpwt+r_ffpXw;B z-c#fheVF+kjz8f@bwB;%yL6osFuvgb19snp!xzVZ6B zkA8c9hxB}FhXh%h*=`+w^`fZsqR_3d4)*&11LgbF4GFQM@?ohiEuMJel>qmV=vc=s zID>t3gMVt}U}hFadwzI!gnx3pgKy*zOLlUGcZZ0gtF%Nc$`C8o%mn02z>Ph7xv@lA-xZFHd!Pr96eUz zugpj=y;XQ9;~$d_Q_{8YzUl6u(g&K9s`TjTg9Rd!UWTEOM&R$xS!bIfO!Tp;2LQK- zPr|?ar&^WAIr)XYX*ShzGx=#hOE#nR5@AVeYa4hbS(joB&2Y2HvPuYqa3jro zMMnb7XSysC7BJiMI@P4=%IQL^7(gR*9W!Cj2%$POuTX2~Pcx%VrjxlHnf`El4hI7@ zSH~SS3%CnF&`cMWO*yVYUr`g-!*9b{cF}kH|O-e-iiBiu|RwmiTwwopA zLk{Q2=Hkh~_(72|%n8rdlwNrmWTiJ#udUblU6~dm;M_Z4VM5358+h!*U@p5*pobRh z*|^kYmFn4iJe&iZ@k^93n&R8`{^r@3%^RFJ<-nOxhui8y3tpiFn3_B1#kVXPQQE#d zmAF7YE)nr!+QVwmI+OLmEcEbkKRDXd4__fm3~!4xRC0q3xnyc#y*Z;s|8FanU>sWs0}To~JRMH`3j@Ri{|np4O*=mM)Yy4M2j& z9JZ)B-IrUJqvog`k9(ldsngj)JZXBcAWE7-G~dXnHsJ4=WBDHt__NNMbg%PZYzPe} z3>LCFr%OsFnV!E@;kA&r1B#dXq7Z{!_}|geaHrrzBwmjei#GR~MKmZy^r)nRoPF8m zlT+5zAvBo~n@!T-=w0&JEzW$>H=!+cj0TJpqMID0ELm)74+k_cRGxOZD-m0M2O%SB z?WDehueK^1XhlAn6vMtQ)Hl#zMhr@mx^2|Cg0}0?br5YV=jtO|;!)52VL2JY?%9YV z;*5O`{(^~zRX5X(li4Tvp&(A5i2;(Uv=Q`)Z!0N)mbuYXceyQtQAbNE{Y0A)XQdz! z=Ob>K#xHWz5X06-Klzucrlkk(vNoIbRM2>AVe<36((D-~9`ZSiLS7Mk>+1E?Acl6@_(!_>I zI)*<#u|>9=Yj^XMx%3a0$oO6SDe{Tvve3YCE$=!mw-?qni5o58UCZM;J0D?)VBg2b zgW>zi!+W@z=!Na_?#dcy9N!G9iBul{oCtMtl7=j2bYwb+dou_TtL}wU*|G1>P&f+wZ$noq^u1E3zbMo><-Brq-Qak4kQ+< zh;xJbcLBu#pJ7?m=&t0Sd|uKVL0-xh1eimt)8O5nnj%IytS`JPIU>o24Xn^zv++G~oQ{2V&{^RlvRb@jz<-s|mQ1g21^>X~){vi9$cCbxpHE`&vb zT&Wib_Oml*DRz9esgw3a7e;>pX_ZQ*Hy{PTX=OHsHip@|q^y-p?Z*;}spHk+*j&45rb+gySGsvDAALD08q>|JPelikaw8k=8A zFkneEx5R)cOUBG7ET=?ZTT^MAu>BA*GT_F4gb+{73M)9SvZ%^W)S$jzCM0-Zuzlj; zqPMWEV@lS6RLC-_`1hi%m=UonWNxdigbmfeF7=${91If*a+mLLn& zNYRSPB=7V9@^C+yqj%kf0}LR)xvzY4Cop603|b_aNL#%i2Wit=rVwt3axlUj*B_*f zMf>;!BrqEo3%!%xY6UiUleY0&C|jA!1EZ>jZ3!j@M1bWjGy~8kiwU@w6D^@JKpPLh z|F#)DRiOvy&Oi&FfP`cK<1?Mvj`-w%HX#4Q#u^P1VBiS#c>)sj2AsOMG18D6^3MkH zf7t9FOaYAgpp$_%U2s5~iJq|Re>M>R!^WIU9blvdjeiar)cLRPdDbQEdxmfF}oxVOt>A z!Ke09$VU|9;n?~ZlmtM@4*qfiG6w9a-WY93{m({`{*P7U05{6;5;|;885o=8s{SLN zW0y8acfPI>;n^*olIum=b;^;}T2hFtiy>@rvP7+GUL~2AyE%2?HDxbrN{b_psO+JA z!gbS-hG8=44|hQ!=?`OyQ4{_l_C(E*U0kq+T?jk!dpPdlB4X=mI{q4Ff{33=aV>=! zuL_D`(@b)KJbsXt&-Lf$RRg^ z!NJ{6`Y{CoIbU8Zf*$Re7OAAKQZCJV*I#wkBF@!JiWo`dEKCRswLM_y_w3x^-)#Rn zG(bhEIF)<5$_Kca_J6T^5-JM<%C)B(;;U!rbi7JW!hwkA;qM-Q+2zdiKO75u-3{g} zVPw#cN2~7nmQa8OJ9?F@lZr%{QW8A9V!y1{C-2e*zEES`+sR;ILu=_yhotX|s7{$C zH#ox5ahIDwF6YwIvy2%IS%q-LVl8Jf)@y$_t}n=OV_s{R^K5i8J*s!Fx7`}8Y`GE*MMxCEXawBd5MQ3YIU*zSpdHK1GJ>ae%XZPz6}pY0oD#fVL^+7_{ggb-J>GYBd}Q-3|-%lu$q=A&rn)zu6Z z?1sF!cy~N^t?AsNGP>26P;l4fFu2G|tJ2hClA;}=42^F!`2|pE3SHvh*Y_m>)eic( zM>h5+rbl!}V~)NE@1R#O#@!S~+fa94jiA~`%0raq;TZB*(+EJp3%+^|x&aNme8!)1 z75*=d4E{e{$eGd|V0edAc?K3O1iZg_0Hgo8zw4Pm(7St~!_rvB1eadE<3hi2DxrrL;>)r% ziN{#ZkHbV;;!9bg)xnx^wnh?1&0S1QcMw0X_joL+qlzKzuIVHox5wxg*v*kO-+%;n zk~YEe-97|FxV*gf*-rJ@QZA=pCUwS%D!cmTzmSaF40q}Qo_7YWWER{c6Y3GI+^Dz7 z^Bm{*scT^6YiddQF>FIb2kcm`tB~tJY>B0nDud4SAapHHrK_k{tTNa*CB5-j9$@4! zAV8^agnN(mIOS)oF@9>Rhe9#1IChFfz)rlDMO9BvqM=G6GjE4~Ly?M;nCFgR?>1GySUmx00Mchd{f63v;E%k6ryf=U0Zo>C3 z^NKAtV;cRGB_p$%@ed@`oU(5IbfGA>~ISI zqsTH~N`MLDW(pEk^6`^)K>Q#S$^8%H`X&z?)d`r}F3%uDd2Rbk94dq#NJ@}9mPb*18BaDwcl6>2 zbxzg86DgD(x{9eVleEH7IBD<3;z_&QjJ}M{f}Q`n7Cs4vQ*DE}3>#NTZsriRMkfu~ z?;fR^Oz#U`jpw)&>1Fj)sboITrB9`+vHxQG=*=J6eY+x8bNMeMrRPP@ILpvKpt1g( zdr}gB4vVzC{@`Ts$^#>)ANZ_8ga+&Tpw47q@p2hb09R=M5uwukUn`%q`%h;1o7xo5 z547;yBNK5Y-4MD!BgaG!lEIpk`{JeDgRX8KF=EGP_1GtyTNVb@UpO(r`}E%CH>^wo zP(S_m6FGxKNiATo7|SGCY>Zgs=a7Az<6UIOHMLavjy;GR*ABT_>A~tgNnZ8wd@p;p z`r^~Px5)ec<(3O5L_-I(J%3lU?DyWd$$J$kGTl(tmFs-7pQ@Nud@~HHrL4GOp)fx^ z%1>J&N?A~0+5@cu_CNop0wKy!ENN7)vHB5~i3n6W?N~;sRxKQaOC)GvKYsdMwRiE6cac_^-jvl zVUk6Oa>~{?#Z2wTwRVi*wq|usHGw$@+3xa zrRb&HKcHWqKue`P(L|C}RcdmS{RxjkZ{3=|%!c#f9~R@DJ~-?s_^^_>f&3k-9O`On z1!abMwRPh2x)+Z6u0~q3#Z@Xp zJQJ{7Kg|}GbM3pDOSZsHRocVu1<%y{a(v4 zsJ-piY4BT#FIOl?i^-+0u7|a!uP?!agXd=IQ$F1uM?G;cfWq^}&A@bX-{&G72iDJLA8hz|bwY?h zq=A84pXZymN$%2}Wv$q836ID9E+;NwInMu;*t7k(Tk8RUkY!Z$Jun5} z(`Z?~8xNtGryd>-AI7SF?k^=RfQD(>geAo;@j>uI_?g~KN7Iwy1Nwd=4^`0quc5=t zbCZ)bhKZ*Fmo)hAZ&Sa?o>Q^jZ{8jsZH~!BBSA&C_LGMHsEXF}{)F04*q%^x2=IOW zL-agG_4Ab{KLbY1BE=G*td*2mlbxrLm7S3byL@-DR8|Hhh1b>++N|sH6l)93@|+xa z0mw#J_>q#Sp`Dbe0>8ZQJi#XRM{GFsqYESZxt$2}%W$v_xo!k{Jn7G&DcY84J>lpB z3TpPYfF#9UrQAv{-MN!$=Q98n7D0hDR5M#>gkH=|B zPSByc=;Qy^mu}=JM@j4;WDBe~(xrEGpBN;3EM$XhvOIi^^BsM1=p_@>ZK79gBBK@* zVmZj@Hht*&h;M$1B-nE`~bqV}iJ2x#UCo9De?5X|g_&BXG`-p1xnG>(~ zHr+gFmXOMz8`5FV$|rP_!_Cl7L~G^vD6}~~j7D-Sk#HZp2g~3JM=Qg6|ImLO*InjL zysTvu;n|Y#b*#cF6|jYP6IR_UhLC)iGu-W3&$uVf5|6sF`o*A?@i2U+Kr~tU-pgdz znFNm<aA(L?hjoK}imNV&JXn+D6V#yw82rxp@8R!gl z6U8rpPn+2Yj_hZWB|BebXv(z%1Tac1Lc{Gv2VyjzF zeW;KAJ&55EXWBMo2?#>6nS4~tMcGe|!*aef0i@v&6lwpUNvsYmklZ2u)fD}TB~6%I zhJvCOLWfPI0^cfSrQ-N1&`PX}n3LeLK?}+GCun0se(?I%1cSAaj@1tDX*j7s_w{ZZL;TB zN;!Q}bJozi*|Nw96LH>;D z!qdAG^=BO~;YDXs9QaDA0<7{9QB_6q{;fJe*c!NMz>W9FHkc8GOe2dkI?;3{oy}rSOr1v|qLZowL$=t>ChU7ZSo zjB+slBPWTOn$zBnHdWAkeGI?i-a?C}TjhAA^zhklvaTdkB;T2yixH}}ncH!fiX_ai zmtMv??k{o1#sYq)o!sm1qvq!e*S*xVdx|Hp<9Ruv6dd4M<9qCZM=r#Jf5Z+)o4S#r z+FcR-3eNRxPAhHZj%0#nP9bURXGlE3WDq{IujzE8A!MnOrmI7Z%BQJMd5VS~bFqg1 zeDe1VIZ@{QeOBkN!hi-ui`tMoZsQXw8`qQER-;KJrp0bUY^8Sfm6ScQ{Vk_{c!Nqq zZj_-5p1ZT2yBuoc#9S#aG#ueL-Z>-F@wvq%;3Ocin|hSVN0yO z3k3E7zh;Zb+xHmB@X?yUZmJB3@F0Sutu+0=B=5jXy@M|Q^FNzWiU#I01NS@>SZ>11 zB;s(XOMSxg4DqSN)-9#rFYh+KU4r~g2)L~32cco)k=BIekzFe*;`uf$mI10GSeSM= zo$X-<7TPqmZ8k#91}C1i$*v>#&09cZ}s7Ff-*|h}ZU0w1s(wP99CJ4{FV0m`` zBGx~eP9f|u&i^A~{oieY0*w`q$9!p}e1QBL6p$7}Pms8OBS^TBeFZ+FYYF;=K%&zq zF39+akV~Y{mgItCcGg3Llv2dSNY#?0uY?49Q}C(Mi4ot#l(iWxEG*nVKzuY?A-SY+ zGh4i~#}Q`Q`^D1Z+5SS!%&M1T355{D9MDHu5=ICo)sq$rVfGXg$)>w2y%Z8;v!>rb=5E^8%AlT@@W4;WQUW{~8d z7r`~etDBDDD=rq;x+B91k6|eF%(wm{e`>S79p6ICZyHlGzJ*xI;BHD+SQnCMroG+@E;7m7p+e7NH#S5l0Kww3^frB0CB8bPPs=MqBcZ{3SLCPsP_ zwJ=wh7Q1)HdWL167B$M!=gRH#X3Ff8WiM@(hFc3I>~AJ>u~#%1mXV;iR8a~&)RcKd z5wTNiQ%HWSkN3keq=JZLO@sLY2O|U@+@0Dp_70cw&*A60cYLozh4EpZn?b#7`iMF-=F#ck&H>mqZY`c}xnun~apFE?JCB8r4Ty-tLdD_lLA{Slj*BBC?4!#?%(! zm055$2GxE=mOvWswSh=Q%6dN~;v%z9YA!{OHYqg9Y4(H@jT4#N14HP<9zP@Xw%i83-nLg-;uwFSc9h38Li1tTNe znPP7RnCK|FR(|y0D481TR*SNdWt{2*so%ILzD5lWXPL#jEPr2l%pB$TY^w{Tt+=;3 z+Padn2saekNsY=ls=C-J{p5wpyINgJP35(y)2aQfXWbM%NiZN822IP|RH}E!O%nXg zZ9KAuKyhX7K>mRlM@yX^p&&?>UWT$T9=FM<~fb zg`Nm0#FG>c@=dOO*F$~4dq9OJ_B`_Z_bT5B-!*_j=`4>fD?43ssTi%8?z1Stul`{< zQ0hAX96!9T+=!>{6jkxk_zGtuCHHmr)O7MTqwh?DlXjrj5<~Zf5jlS<`<-j~j-dQ9 z=u+6$!}9MDDes<0E(??j;;uWt3plOY2DfXhLL*>;MKOcEwJ_4E5xknb`0X%EmKKyE z(<^m+{Ow3Q3Id{1d_-DE_-vdglN`U}|Lw&@|0ClJ_a_cD&NW5`RfaX$ZSg^RF*#Yz zHMtfeNyTweUVp|neq?BV&BqyLQdC^l>vK3~YIuLim@XAChKy7?4uUV8EyLZ6O%`8A->`claW%CJ zkmNpNscd!A~xCmZF2l z>*(bG18UNwz;QndfPeY77xJz>xc`qod56BO9gxj{?AHZU<_Y^@;7}xlK9ZlV;Djaj z#tvUVymc>|snqg|%n zSS&-iO`EO+eb?fdQr8J@Po0lr@cg1JY*b3vsY&-fYo$oYG2Tc2QCbBwkdDBn+n9nf z03LsDmv&4(_>*C%HI}msPwo2{k!aF_=I3wr0rGBmZYMltUP z$3L^maJ7xr;+1BE&2Qz}cr;QJUbKIIx*_&PTzcvx6&aS!&02*t2xfZbv#i#T>4VY& zCgp;3z<=AcL*VLdTk?hH2V!?;GuRoEO2f!ufAm6R*2BlrjqswA{tPWAmrZq=Qsd1! zEa1XLu*~wSXbhg?m{nIK1O1^vVK&GNucv|!AR&>_Cx&SH#g-X99^Eo$x=()I`tf1%xe`b&c{M8 z{P*O6=l;d{Eyusz@E_uiUqjFI8^15kCnp=?uV*8*snrfWsEx>#saa+%wZ&U-M8wCJ z(5dpM*l#$Lli1BFSA25>r^Cl4-+Z`o5D7nyTy~i(T)tSKDYtFe7tYI1k?dq{`01k{CKdvZ4X#bs+X=yMP^sq|CVU#vlwL4zY;H)SzZIm;STP*XH zFgS>D(*@jb$)V(;V`@%URezLxA=2x75rho}WEuVzy8amHIXUd2>R>{9R%x1)S=Fq> zLHyBBG9psb+}z0Zsr$JW<>G=j2|A{`yL~Z;zeaC1Nn;(wM`joPEsJ`j`Oe4TA(k(wO0Kl*vZHh8!Kg(5aZ7SF&aHDOr5h88G`lr;w- zWQZx!te9-5bitIFr=D=Y$2#z)P?vsp)bp7Tss+mT`R?SM7p0D^hSvRrl7MXaauUTQ zjB^=Dg_(+mADnOhySOU8^4%hT6xVs@2i9rUk6{Kl7vV)dBLQ9SGN3`Xb}f zsAp4dG=##1WDe|>MpQZBs)gia1Oy>SYA2`C|7vFh_i2B7Sv7V8Z48SV!O_+2Sfj}l zhwX%beWU1rc$0|2?1V_Az2(83;>hX=w?M^h=YlP_Z>|voYzBG;oU+k{c9qiz+B6SOHZ6WX%Ci zw1}CzAt1eyo;h)9GAbMD=!99fw-BI^R6%9TSd)hRKSoUML5B@(jrdaSXtU9kdC$dr zTRDCuNhBCkN)dIruUk=V63vNgP=~nYf zx|ta5^>X=h0v5pOPJFRX323*%O#^FFK9UpoD}BmM?4zMiq$A{#7gJ1YE9ZfC3UGgxcPd~*$m1p| zsFX*kyN)jQ+=Lo4oh)${^e%@QW3iY`lM zKq*mfw#+O)EA2*WAHa@CTLqzo<}5#S_$wwJ&k%<;l@o~yICF*zOE&t2<}fHFt(&pk6uHGX&0!$~@iYmk~H1Z*>G$kF4p z0xKgltt$NxwG}4@_$#svR(PsRSqWjME?@2F^c@7nbq1*s$#b z>(!n~tIrWzaodYXp_&j@mbvA&PRxzy`)|c>&zbMfezV+(EY#VP9`(y;qZ1u>G>_pl zBdjRbUr}8XOSAWw$#7_mSZ0LByNw;6kZjZly!$_)v;#ENvI(exgft=3Z!yU3c( z>tTNK)cbV|D?;*set$xtDV`;F(;FU(u5=kUkWjjJ+)l9+6(?Yl`r52_hU zTi&>ovz3ntS=)mvll1qN<>`pi9>|~_H-$v3tqb;2v02j(P=oinDz%x1n?*5y{9Z3Q zf2n65vr!PyD>60)7aP?|CmKrg?vj#}=8IY6Ts`MiHu>IjoZKE?^2&&Ml{DqvVEf`l zmaKip#fC)usZs*L?Cw=90I~BauNF+)0@bu{kLGrY%#o@(_4r7wb5z0@NR_JTkZYO6 zu8FiHHlODe4e?D7_G@q+Q9rsD4CSwBeM(&JL05stGNE~zcf8Fh(zeY{y zUlramXTmDD0hAG&ni~Y*6c%<)_S`6k%^T1D^kqD_>NC9{ba1<7dsmCkq?z)hMqY zR|CE=-X(PJMc#SLz#m`(fpFv?eAA>f#M^q>Ci5M^woUw1BB1zv|Lzg5jggHKHHZfk zElOrci?_F2z+q9US5e}?)bH#Cc|BgIcA*phV3X1T3}M-E15%LYoM?zE(8VEa5y%Al zHsh7!B1$lMsE;``exXGUU{Qw%KS##<_en>ZjVNw$LaDvEzLd3+y|uKtu~e14v%Il> z=f4+$zqhr%wUT+Gy}q%%bptAvhP}JA`Hx`xpkRL~`=H+co+%aIBH|3IYkE&O8k23o z;>1!#M;H3i^`b*_h(&WqX!S6R7#G^z0UAGGzAuBLa_c)4~Qh3t$DajRC$z zx(fda+YQ+~O%LGLZUU(DAk;5}fYt0&m05*FMf_PvXdB~{y*Mx?8#8Km2xDSn%tbd0 zyiPZJGZAvD&L`Ock&VAe2ad2aWe?e`n(I}5v;-s$xVHKa2*`g&YS*vyAh zL|6ZVg6?PWr84D4rUlv%Qd2IEM7Tx!X&-@qp48!fDN-f_khl(wJ`R%4Adx|wz^#Lv z&&I_9&|WCOE!M-D2Rflpy>R*wleQ?d8cXL z$VTPiLoT^Hxj<7nY_2e7G1BCkB98>&k4g_faWu-h!u4S}rmE>p=;=gwE@Cb#sO6$l zmtmTPQy;QVjS&y(t45P>J%;q8JXE$2mIhC(zI3s-ZiWFnMP2>M^kH+Z_`RgIrKH30 zy~!G3Xes+>V2u}=ZtVTQ_UN2N`<>|W?X7Q)3}4{eq`mX+Xp~p6R%u}Xhz%S*8zL{heK-9G*dN>X;_>GxSrmR%` z@z~&#@mDuBi&ln;7TZ)+a@B8y#flWJKg&Yg44Kv~E_;7cA@?l?&jcVysQxk*ul$a# z{8na{dSw?nKv}FI*r;$2lm1Ge@^_3TG~ac&?r4Lnu#F%%m^xZ0O9v8MIr?S78)df* z(c}@L8T@iYc2i5bs&b6q+f_qsB!ty)lYaA30ojLNAn%RH&txx1~RM) zn2+z82*?fy!638w=k9N&ED{uqWLy72*4U+-=5epsePfAEsnU^DsaK4DK<&T5o0LSh z1sg33aGK%vSa&2HkJiADAouXvn!7V%42w$9+Hn~Dnd~O)jJ-fSkY3sOS0b5bl?nu7 z*1QcAkk>&XeE|w=pzWFt$nh9*kZAZ%x?rl?HEehv{y(uXJU>5w={U@kTyg;0s9o=% zZyXN5X&E`)mh0bj^)1^Ygzn&2WRzJQK(GMz&;^`f?w6$Fur7ogmVaTu0zsa)3^y>U zD^?0EjLIRDQl?-Rw%pa^iD#m-?dC-5@4G@tULppZ>=SP><8P6bU&(0||A+LCq~>Wk zGlNwH>V)ed_cRl8KELcwkZ--{pgn=_th-YWUaLfq-0$|OMsR1 zFF4gtEo}C09SuE}eD)qa;VBiXS$+RbbAfD^p_H>~^~mh=YxH|S=$3TnUiU_2pl?kN zvAQxg#zn~TngDDn*mz);o%!C|Scl2({$+77`3E5Q*4D$%=+k+|GxXL5o^lX;(<9n7 zy(zX{P)@hY8f6AH{~0I^h2oFvByKa2{O=F$(wY^Tz!?SEHt0g=&5ynMGz3=(PB}~)y$Eh- zgV9M zTx%?TMG0mLmV$gUBUO|zp&uwQRK$DN7In61{dpxX{}5alJ@yJEbWcNfgB5}SOf4o% zOaDtPMu`tM+idAmtx2&a*_JF+rKpER0?FgS%$d4LiVs6mC9Qbx@FWT(*S;V-lc}6> zBVmk4zBv!MZ9OZWc}`-b6A;Q&j#b-T$ErjLT^~_qN`5~H2;0?DQfadHaBh(+q+=ZB zY7LqdrYqCGr5-PD%~)XpMcVJJdF!upyqBUhc<;HPjIkjzsQh+8Go>4$vH9TC(W!+- zWP^mXh&51sUA+09_%>Rj?E4Ro_uMxlf@uhcyzx~LOT{7;jW`8Y7PT^OI^dgu%toNy1pkI$Go(PViSw^KbNb_P4k9&+ARo2SUkS5qWcE zWuTU{Jf)cCPwsp=9x4_lJz*?S6Kj1|$(2JWdQzZ^%SahgOG<^&t>(-w41xnlf*4VD z(ZUj~J#*~h8~zoU!^LA%fAqZ52nUZi;Zt$b1UJBek{>h1U$Os?#UF{+)kB5>qZ*u-p_YoRB4t zoy*Cc=c9ztU}5UsMK$#E@Igp*sns*0f0K_;H?ne%&(c0b$!OLl6*XrK>)ZS<(6}6gQue30;)X~SuaWL;2Y7o_Lz5fasWH5&RX`Q zqq|Hti}>=dyjMfI@g({}t*d;tje1$U@LuAQFOWI`etrER%~9646Y0AcZl#AaSN1WU z+0n`zQ)ATPNTqvnLYUND)9}cKPRS$L(lc9HHQuX?-SfR`$Y|so17^%~j-vS=wa&}7 z8wFM=Vpiz&(OC>6`j7=Jw$MM~n$!Z{6B1Uc_cp8}s0y|VzF{)WW!$66ZG-rHLBw0x zpCi;Afk<=O6w(zSYOZo~O03(a_m5Q5&BOMBraB(J{Me0jj_*#q^@Ax)ge>ABTvG{) z-)CB)FfY{&UbrgguAjSjerLvJDBwhV)y~Ej2mo=oh?XG|S4wC`1Su6zU01T_n!&XS zHW(4YgOFXNQqe~L>mZ}>N&ubqUjwyK zJ3ZKVi`mY%zpfOvNy}F3biQt948boxcl^X@A|%bM`@!vzTDFjWoJ#+AIv-dZ^8*?FpvnK7yn;3 zm{p4MJtSkO3|Xf%+bqdQ3+HjFZzO)lY)W+73Vfby55eXAirpwURNpHXgOlJ0BmtHqWwb+^#TRY=0 z%tg<6QBn;d7r+}U#?e!%{qE;i(Ijm3ftPXVapL zhu1up12lEsNgR6!26Xgug~Thzeh5n1)|yd^_I&y=q`9*f`XawRqD|NLpcSiEy`R71 zL77flyy>lf)XVwJ#=NngLS9`&g6s96{m{>^m+!ZaR0@6{StJ|Qmf`64?Aq#7Mcp%h z#jVcSkH0V)zXx~QylB1X$U3}!`)Ni~27+O0p=C?eq&wu>?2FBt-gdQ=bXhh|kfZD; zhDN$vCh$HqY}1S>F3owFVO^S?coIl%m@Dlom$-JyFjtRR?+GplV5tbK#=Ju=4IPE| z-wuw?1UwHabWcZ#9dhl#z@WOrp)kdiIzhS@&j*%q1&T#ej- zxPXSH%yfvc%a~DS%vqm;t&0Z^+0rG&hMw=QEt8<^;E0gyh+a!fj$89($w$buk!SHN zlQ;{$3DA&1Wt!>sbCCjkZ@YuMd_DE!2l~#uBu$VCwo&-e}PRMuSi;D_=RqIz;((L)3w`{_xqC$*=@|$&P>J*8 zS{%2yB%?EN^e}GR`F8)|=H14M(7C=r#Ie*%i!qJdz9f5E*jD;$?>KS8F#xyYt<>0` z2idvwF6Y!U(=2N6!0vS7&*oio<50{Al0FktsYX5kHWSp9%0->mLzAR>kNzOcn0CfY z>$$^S@s_*>CR+>Y4_sE$>%Nt5-mJJ+yVU&vY=v^Xi{&R6nSPPXIaDZ6A)srNBijxP zY4PwUy$I(>B@Jw6ChYkL$D359*V_mV$J+?St9a#`gw+3n(}tO11u2~(&i?w^=H6CH zRr=ogXQmdINOA?-RTaT?_QFcm+U8*lOXLS)Tfs|3Ipel9AOI02+T24_N8s?r!-N`yyNdLbrfVSx~m*L|4U4&#)i#{DD-r=y~4}plE?h zgf)Y|ISAv;)-lt>!JyNYiU`yBDAs!YhmU?OTq(;h z=y)+&noIO*hc_z*-|bJ%pFj+15)vc}l$HX-Jx#mrF7XSEhRU?xSZ{D6U@GxWCd+Yb zM1QvjY=iKp6;^Z#aSn!M&C)FfjD9b^quTz0IM328yvB(&1YU^=1M(rjpRR%^*G1?X zOqs0A!D57^DWr|YpJB<@%puq9wH6jur%YV0+x-VaHGcbDwl|o`XqZ!d-;8zVS#RvXWb7!1=VR)Suz0G8Z!de(X!DLwm`qx3!)U3cxW9F@*KAGr7mwMX z#2ZBaqp?6(sq$-RqT~^`JY5b3%Q&5UR^D(2b&(zib!)vbM0`F9?Z|}>za_rT8GbNw zr1nuL>w$-+fxFn3xjWLgb=S?I0G>w+i#g{%%^Pl{JTQ&yNlt3e)GttvH>3LJWw!#7XB!ipJzRI*wB7(bCx32A>XeR+T5Xni0gbMluq zx2n_kSLzhVDK|*TO3u>E;qAzm@;(sf0cOH|F`^p}j+QVKs&4VU3iZ)J<-wK&wmv&P6z8owr1%Fmgq7baL^7P}^y%u0)Rc ze;9kqu(-M?OSo`%x8Uv&Jh;1iLU4C?4Q_$LEkT33ySoI};1=8h1j~2H`}TCt*FE#h z-#nEn&bfP^v+vq#ueG9LQT9-|*_nxSaGn`T+qB}-PoVv7PtYyK;Z4rQ$2v!^V}QPa zE74^uDRp`NfL#7~(EiL@9Q>t|*y5OLr>E zA3n#K&OXC5P-ROa-{U62)@v^DP8}^pPH}=yxq&ohZjf*c_U>p2s)6IAnpA|suwYh|sSoz?OrGmO+~3xiZM%&aqvN_7(vR6?w3BhzzpVNz?e zgM;-ycU6f=$;yh>BzFQzSW4E$PS!OB2Ii9fHGjAMGfZ!*l=q-_*r1GpU}IuGMMqTW z2$+CWDQBpF(+jKaepgyy0Zf!;Mib5!kj6A-{jMe0?5C*|_wk6&(pwt5YA(g~adQsc z><$xWh9O~?A5m{%o|B%g+OwYelZ;Klxv(2MYFX_uV^OT#%L80wOIm^@40YWyMjQf7 zC}94@U8}Vta7c4+3@WbLAwAJ$5EkA_4(^Rffcj)<&`(}bWR-0xW92S!7XLV@{IBfaF+-Sy^kjm{35rB8^++*)PTwG_ zvKYT1I9(6;Q)aDMO&645m7y~90e-v86GJS;|2R;NW8~B5M(p#`{E{VZhna2zgC<6` zDMr5$4NO+dW60L>8#Vrf?Nk|mgXI_YmI_;cNW+-mn@!vl0NAio`kQQps!^tUS}FvD zqUed~R)h5=#R4C!M3vdnf6Kyxfl^PW^%7AIw?hA3dS3 zYiX??472FL94v@ZWqU6Qzc6TLs&fIAwbB?9SImqR#6_NdhSW=3NvLGJ*>u&NV zP#m(VaSgxJi~%ObpDNXo-B516Xa)Lq*^_CO*{l)%=>EdJF*)Fn`P?yr#_8t#0FW?n zU*Vp{I6Gi|=>HdlPxGa}?!H^qJqCQDx;zv+pF=hql+ zep-L@Y_H0m`jI+ITZx0mAnT<{*HbHI&X*)sl*LJHN}tN7S(+F_!;xEP9)pPTPLV9U zeN=*wSquKdy1~cX!IqvJERJ%Ud5_i#6G2D~!^KL{ZU6ESc-R7%Hr0!hlP#(uilQoq zb7`Rtky5e#A84lZHSymvL3zwi@U>9!0rImRfsKXW&yj7G0Y%{$Dt0T0o=>MMll)f5 zjT7&^b4DGV4u{YO<11_&SNZS-tS+R!@X|r zGTlI^9%m~F(dL$siLw$sj9f_-=xqL$Dk{8Ls$JD=J{Mb*=1(lWHPMbps6T>46)>D! z{a>#A4wx3!Ta|s#;vAY$i9A!xS{lPiwtSWf`roic-wPFv_fTEbjK~_Ic^ay#Q7J)eS%$eu zH~EWRw0)OPJl=ZRb9!mvs)a`eM2scgkTHNeOO+g2#v#T*44HKkFVaFFAQ_K#;tm_V zrk%L|{Lu_>ZA@Kib=FZ%dZVJ*lZSo7r3fW3i2hw}@I4K=WsilK2Ym;FAiVut?Cj<5 zk=+OQoZLJGmmoGLBPQ_C8>wK&1UwlUrpo5xjpXOTj@Fq!kmm^@)(7Yz%E0~E{gCMv z?Cqx(RVZ5PWSv;3t7ctVSeTv=q?;J(q*mGzlx|gP=3JU=dseWN=}-Nij5qCFD(L<7fBbOi(V07^%UlpG;QH!A_hvmZt6u-RRG zl!D=oxEd){Xk0@~_X3pd`1o1}2*BX9q~)(+w`^8D8mA^|kRYdA&B-I&&;@`_-8Q)v{WJ87}b#t9Uj4|x38B$S36zJSF(m;oycfL z9s%k)8PO&Y(Jrbckqutif2TpjnwqJA!TDu9az2>wx&48dS^OSuMR$wFPizlqZZPcF zNuB*>4?@CfMOtHgq?E0DTBR zz1xD^1=8!UBx8tB{&4!m8>mnsoGp3(=sgx68dHBx_oIr5$(ZsO(CHq^_$JIQz|4nG z0ag7ozoLuHW*Q-s>S2&3hr8gO7)c>bW^xylVAqRn!$U@Dt&(TK^h0`k`Yx#6BX2?T z@B9ipVUNhPj$G*7KqnE=dKFkA>x(`hfa~TGO@*2KcPc~v6)*#R?@-Iur#r|xN z`^jV1xBD(IQmPBzCT7%c^$7ndUMyQWc}Vi;dV<<#1ZB@@erRf;w46|qN3Dz0M3p1! zRTXb)TJf)oNI+>?02s-It((B49;U(&H!NZ(7=qj2w>=v7MPgGJ{O3JWK?@ViR#TO_ z+Y$VzV9dNB%XDb=QqngwxYet?U~yzZ68qH&PXulq3WS)gl=6vNIjPH<&WFG|1~hwF zSl?Uvp9X~Oz+CG_T;ne_>JM^b&p6+g%gASPHf8e{7;gPoZAOIQlc}y%7YmbzI32S| z!p6De-jO!kev~Cm-1C)8zwjG}`9|Uu^#DbKst2(N8LaZ}(+7l3A{b|PykRH#fBdkS zs;WkfugNGNV`A5hl0^eGr6PuGLNfp7XNR{s7&Cbui?3m{s?5+HPS@JD9hWmk)D*ly ztMn)en~+;-T3tI3DX3GHxHUm)ZKjRi6kb*zp1HD)&0=f1U;4eP~nzSsP;pdmA=y^8n%fqnYg?P5!>JA! zdeWRgTUx&WAAg+mNOK6G6nOndJWeQ`^uH2`|Bg97YO&wR;Qk4vi`vFbL|iiZoS^Gy z`1yl>)G*`bB^e|}ZOS^#PAqN@u~tbrcIk&VJ}dcB;t-VEw-F(PABVafaMLDx&`i2iTObqzA8=Y0e?@4EV+w zN3<~wAHI%=4f+zWpCSAKL_9LfUDcdI*se{T%)J`)7(>@=4qitD4> zJn6}r{VFKb zX|}A-b+Va`tRtX}r-ya|B*n9izrlri&az&mA3)uhMBVb%59yCe&&_*Bdg>?ZzzFZx z;QE#3(kG5vq{jlnw}l$D4*3AkyuNo7){%?Fyha=@Gn9#4V6fY3U@eaDh&tqtD007k znmQZ0_@AL6d0_Y-&|C6T+7ir*+M$}mDIF!?6%|57$#(j#Aa!)Pg=)KgHK7PiSM3m& zE(vKirO{kdC#v?)r_OvxZ2nf*3M+flCFVd%tfsK3cLdXTYwfcM>bj4Qdk~=>IL?cd z$d~C#LC-8?sz%<=HT2HyaL3*9jbDQI(aInWo3}J}BxSo!{X$YrrJvGoX``#@RPU8@ zyu$}(v)&qyXYcu!w_WL6inBi&7e0V$Woh-pMU}Sf7F2~r7-*lDLE?C69>AE-v8P~66o0bv+S8L zvVk80TB$_^{j(j4e`lz+UT3K0tinH<#N_l~u>qV$q@qIEj*j)7)3MY=b91YhcnD47 z@E+=KvWy~%xRDi{N!QyX<}8Y>an14<Hv&b5I4?vCmHDvsFP2P+#$k?56m~ zR->C#D5kCq@ZwBZuHMaa7%Yl$b@9G&mi zPU3TPSIQO@J=CyXN!b(T1&Ijy|$Z&ubX z-SMK)K}4lpe@J)pqu!225)i@Vrl@QdQ}2^B}@aZmO`qN zk?etjKm;3UD%WMn))Jt;MGZcN3UH_?Qoe8_7{{9}Z+sgSL185f%VE#S&gsdnjR2ee*Y|!D7F5$9#o#u(7RM zKzgTeA{L>5uB3j?L#mlLGZqMW6mmTiDB+SPRuutd3z6vn?X3XpGyM&G#xl(>6>Nzc30XYOMcSY?CIB0p}r}2uO3V@fY9kfKTixPr!(ZPwKJk!%i$m&S=K&L#2Af5guxhf@dQ+pbVSP z1Jo+WVds8`vrhSD!IU#p=$MwNPJ4rEgC9_I)dofuIs}#Q#bn5SVV1o-Jzj4cFW2ag z>S!WGP$C^3d>dZRwIf5<^9jDA!a%2jJ)?wK;?G%Sso^rT>^9wL(E93k?{7~uK*AR{ zN_C+`5EdQ;*^={>(p`WT4fdo!1CG=c^6cl@3h>`=n%+T4GJ4t8f3vdhEJRU9)8d%c&XV*@?g*da&inOa>d#&UZ~t&OKapPKt}|1IPZ# z{6w_*2@}p2p#f4SNaQ zH%F|ml5G%;u)b!}MGqV25k#mQ5a0nxPDiSPC`cb@0&2B0pL$|#YJ)#@n_De1*Mh#q zB0>Iyhy^Bt1WG(L&Bdu$|1%Frm&$|6fivB8A0E*n=2c&$$2-(a93BgVR0bK7^;!YP z>Hn>O|M*2cONV~w(kF+u*o1DZ3)0MVOXjCr%UKILpN=svA6NO#v*^2P&92(3^C72X z8C?xAu6PieF4X+Y%#1|ErgUC%?3xemri3JhxUsL0GmMaf=hjqldC=qI*3O{MbfotE z30h8N-bJfxN2h~c+nT30ZuTRQ%FTlLl~6AhW}cOwt|{`1bgwPibQO5?#aLeGM?gGf zM>mrIG1qT;@z&s!&_X($G95@P-s(#lr55 z4jebN|9JL2lv%#fb}p3VC#o$pwVz@Nf^#%ugS9_ASr)AuZ?@tji^5yOvkM(iWm zz7u{DemKH<%Vrke%AE@1OMb8*Tln5Q>1xM~8CT!i4YD02v`;l-mXX#a%fvr)#acb+ z-#fr)scY%1{F0dJJSVV$&gK4w*<-Y_M35QQF|q=h!oe~m@|kb=Rc~5CE@ioZITig3 zF@NBik@0$FjgKkzzrL)rm0gf9$HWS{ql>9P;fy=@WKCH5acDnFwN(>gC&AhNsjlNinLKZ_#Zr&QkZ(oNb``YK^ z#iT*Nt>H&NT;I(?Yrqewu8uF+()x;|`dx86q-+Ce;@#V%WFTIG)rI}~06e~(k6V-Z zzpCUN?!FB>E>D{HT^1bqLxg%N@}|8879iL7s>cUtyY~d_rG!9bmX^*C@b~nP&`0@c zpr&y6w~B9o9Ed4sSbL-mT$1~f-q(}KZ+`l0Jp#R5OctJ0^pRg89O4sU{?}_9NEYk` z+vzJkLo?+Pjb2Q=PmzaOlgsAgoo*tI$4le;X-RGo*VeWP7rR}0PpHW(0Atblx# zqZiP0{G*y0WY+WQcF@y}?4Ku)maJIsbJ_!IVDK@`ZQNFUl%BGh)CHd;!OVFY6OO|_ zYQTjc-+QxnreQ#hj3NU8Ob-@6{}Aye9a+>BgGqtFPpkR%PvhZr_D8z@=+1iD*@`G3 zz)|>{rdpW?z+Rh)Tk(Wr6Tz=|AsS~ZUfXZEofJm5_S0&yFX(g+G`jW-kgi>nDGXDh8?r)4-0{R!A9JfuEzQo^0o=S94chus3{^G`w=m>ewfE>0J<(|E0*!tj59VkQ@ASFt&@Lft zP3V+)!xY<)VW-7OEe_fq;e^W6d-q@?f%XW587SjF4$rQate@|R(Ahe=ZY*zG&EhDA z$>v_)klImtdIf1lcZ%P@c4%<|dcL*n63HzFuE6w&eoIuNkb1q^#30K;DBZUZ0K>e^lE zpaPdLrB=9Hdw9=Gi zG`uID?;%2}ahCRAgMmKSe|=j1KTDN~h# z|7YIfoaJB#qv^j-YZ@oNb-V|byw1!MxjfBmVmO`s-QTBmR|jG_z#V687ZCT!M~(I9 z&#DZWv13!W2LoIj;F`Of#27>&V99i7^G$#O@e9GZ+b05M&zW>h(%ya4IU`TLtZ6`D z$7l<~eF7Z}>=8_l00iLG4%1C?i)d(!oU3@vUH(}a#R!^2GZ^{IJbmvuMII#!-U)@{ zX2IxUtHiK!zF$`tdnWQ;Y82jvPbrwxT_e`wV-smiC@%aS>?gYaedXiA{oRv&r`Kse z0%N`^)$uoD4>P~6obzoFypD>NYmp$)jbGQfUOQUa*S{-Af9j5&$bKP=Yd@goaI53s zjdl9z z3G^qkezWnG_z`AaJRrmEsAfT1bTxU2zowa}?o!qfx9trdg@G;_M0SDAo5C37*E` zKHHU>!rbJ{P71Vaj4HSTnd0-G%bDzjsNNUjH zfRi4G>N=P@9N1~W|MP#d^Fr6#hWP9Ppd}1-O2*>Ece^s{>b48-5fK~SgG3Zyie77c zz+EH`P`vsi!B<35L6@;wk|dC$-^*n}UJ$J%lRjTl`dL8K2^-SeiED?-Bd)2%$_+dViW@Mxwe zZmh_AvS@x>)H>Mc7}UbuQZH$FwuHCr*?G(F$7UEKXZJz={7N$SR=ecRg!#O#a4StK zV=pgK_ZiBDQV}&3z;Ti%UU5k5P{3T?>40wY_(7K(+QtyZ|Gj!y<(d90A#xz$LSwmG|X(-WsC?_L?_Z{yuTvnB<7DKcc{k65|9fIi|J#&71qg zP>c)R;@{?74Pp>TH zhf`q@O$mf`UwfKYpD}Pl2t$qnH^fiCy!R&&bNG8TgM~qtW71A7Y3I02OD7%@uoe`$$ zq={ZYjUaC52{Zt~p!ELht^W6@R)BB!<<}1S#I#E>*+UhVdv0Htoa503IbR-mT%gJy z{V)ZM?!IN*zss3{sxGDdnS2pGNUC3?bL#mX1ir`B_z4mE4rsZ!e7>B87(_9c%+$}C zPa|ldAvL}EVY}5Si3v&wKseimNPY8~DznU;TV#tss!;w%s)#MYte-#xrUID+NKK`A zi3{fsZ};;xtZ_D_u$j8FBvr-Rs4%P?BY`rf5KnCatGEH6Wuzv}q)&K%go3FQL^KU` zmH||I$y55TLP5a$bcONDqezMrA%d99;%69W!9k7wlwhWix<~HsC^wJ2K?3}ohF3A{ z(hdy^QZB9x{LX3YL{u8Qy74Onm+;xgfcuNXC{^S;={{_ZK|XZq11thk83L`*=<4|M zg)N&c%DHipO1m9jRvaapvb!+@6Go(iDYXOlu#vn(tprg|FgS^#!HwDEA^>5|{eiOo zc2i@YmUwcV$)Bn4Y)D{^o9y(t!Nt!$MEep7u2UWAFBmW`8uwcF0mam&y>VbsCV>fe zn|4(vs3=p$9F{vG^2Gq{F{ne^+7;uJTz&I%(Dr!50*pvFJs;UPxh|Z{Y?AErAdB0f z<*@#B&vtgYQH_@v8*=2DacZ}f(m1y#4(ZN9>&x;k0i*olqC1{}{QN=3{I5qRFZ_Mt9p(O2$VzgNgET!vSBw=0vuw@crMu z-Mys&HRO%j3=uN7cNa;R8nb>_@jOwlELBX9K!$4T#!kSHNr$Du_y&@?oPj7{Cp~bd zX>9d4B&coIibW3NEDQfoTIbrx(Pd&5;oS{fzcDR~#{XF~f zaw(nPwqVd{!WYgM!d=d6*5O(;o@3~Psqz>d@#Qy|ObIE?y-U{KSv^5v1aG0+nR=Tm zs02Xo{M0(^u|&~RU{niKD9~XBWa!tH!h)l?QQpEMP)T_Bw7GOD-nz32)bVNqBPKAG zo}eV5s&4TM{I}!fB+*fW{9aw@=MHBdpS=0L^rgO`tRH|o*uizr@v($;2}LPDR`gp^ z+2~Fh<$yk%;DK&*SByYaaAn)?kE|6G2>)y<`D|4qPvB-LeA%;64lRPvJQO1zoVM9I zE_0&(X|6}<4;*gbXGZHlmTyLy9`A9DFD@~eS)G=Ki|$m}a=Hn7pS2I5g1sOmDy=HsZ5qrcY~ri1D0tXd&7Q)rF zum;&1O^Xp9POC|DJ{AxiDFb_kIQ z`d}4QCNlS0F5M0tf5$i@`QmT9^P9s@=GM1V6vZSgsb%NfJkGb~W5 zlxxP@zM-tBblh6jpSSn3I{4taT;eL!}lPs@t9(X|H5%U=^C!&}&YUf^9CO zF+IU`qGoGp3|_oofdv)R;&s&t06O4c#rRBsIuB$NC1IqzWs=-!ZkeDdf^|X$nvvFz z`9`t9<{r$RITH&!@)sYJ0+bT&@LTh#$M)M8!P!9baq-DI0u4Fq$f(oeNsF(%SUA#o zKXX`v@ha$0A#W3Mf^T@;X+XC6S(wI2Jyy$vzHMMxtRKe9>n^NsAr z5Aaaisd)UI*EiT>jn45Z{)M~UF#=(HCIj&u$LmA1^ISAL+Q_4WH7>mfoeVIAegDXpHS zak|WKnvU<}vc0Ayc9!X8QIuEX+j<24EWbGie05LEcu>-2JDXL=*i^q=E z(<=d#F1*-J=MI){zd$s1*diPJl2E<){U-Gm91r1vZEeQHS~*<^b3pQ_ob=5?ZL~x7 z15l8#JZO*;Z$bj{GJo3-;#~O=1XF#Avn0Lt6$WGkZ`Acz4oj*XdUpK>vq4MaD7I&i zMFy|;H>a+zI35@PDgUtrFmSd~Rkb#db$ku@vwZ@E3}P^)SA4au3q9Q&U@=*MiLSp5 z9S0O05MrQ?KlxDkP~`vO{%n8ymb`Yd>z<&4mF7v;U4@B4x{Or+%LH<4Y}ULQ8seWL z1q?LEPTmd8Ff|}LtQuK82ysb*o`1XMf2|h21Fevc)Ff>CSelyNfHYZPI_v-}QgzZ! zlgHsL^ZJRzjE&9bNWmJV&16^$TywD2K6(Q}%9Yq)B$U8Becd2(kBf6aB^kl^@cMqW zM4-rmiYcBd!n=cfx8DuZNH#?*U8`T8m^A%QDum80Vk>NustTPSlSTW!LCRp` zcws?P~ZTJBcw*}d+vTRMLK#JB-T@%7|NlRN1Bh%yz_L`I?H5X z(d##sYoT0zIAty=Q8wu@gq{n+=J_yUbc~Qepu!9VXe>kSO5=J)be{bb+iKI{ zo{M&@Xh3#lMFEMaF-at-SQb*$NlsPu*Gb%NYE9d7!JQN_z5A0&1#O)rjDrpWH8cV! zB9V=A5$!4qC1bD0!rVcWY%ujM`d|iAD6kj-U;fh$#^=Bw2~27F3H_2DVa7@iPTM8a zJ8W!f6lnKa%h*8cEpV5X{B+Jt#D3Vt!FZ$Gtyk`qG5nJ+}?$elfy>Dge^m1PxR-bmO z0@Pi%4rT*YR4NK2R5l00ij)%GE z+J-+)_+VIQHLp~a)=Gc&u_=gug&#O&uSj^uW<7+ggn#qkQBK3`8@q0KK!#b@U$FmG zg7LnwX{BmnBw)UDAOC$vJP%?UyG0YN~RUjqiSnFo(a;yC_ZNO^&0VvUotG!;F9gMNy-QM2yOpKuAE{{$@DzfLVJkZ$RwLVa#d3}+&s%Go%Mw)TR(#(m4;!{b9*+M*?JS@ zlT`cn7M?@Xz=CQDZXQ1!CuSKD2K7lFrI$$@?I%`f&pk?s*9bM$k#jZ9Lb*QomY zPm+TP!Gn@KCNl?iNex9t0_Dx1ZbO$Cgsg56W|8d(Jp`R-TW93}te=VOcKfpXHPc9? zuCble_FD6>)|X=FmT%bi{>V9y6|GIFO13N#pZK;8I}WUdSA%`IAp%-yo)~!wlqa(* z@r(5tdv}K<)BXJY-IYXKM9*ZWYft);6?3pKC5DtzCavGm*1CvgTssL8zx#Qsnja2D zZ*_j!$!t?z-GRK1#Zu6M0+*tUv`X|Go`sUqUd#tAmwlsbB@C0g-_KL?w7DR4~(M6hA%$&^(3zP$lF)q-zw z4EDN?oW0-d!CG1*T`17MzYh>}Y?nKMh_nPQ)>jMN5URFe?#o%^oXeM%O2)mAqqXc7 z9=D2T1W+D0X=PtMhC2qllg0<(GXpGqB)Y95Nrv_4^9~rkqhC30 zvu(}XlTSCBt-8X<87ya&ADOkA5+|_O+DTJyv34zjIM%O!0KtDX)=jC=`kk*b)!8Qe zP`9pK#Bc;;uEE@m zhUl?li-OI8*Lydxbp7MiyGy)y;BWmY1J1!brk@N$pb4N*;+IrfY%qIF>K-QtjH~P&_DWBDt^%RHO6@BR;E1cM}Jg5@7&css*#FQ`%$jaLh>Z$cAX@6 z#cIY|#%(oa{Sxld=gev_BfiwA%mMl19~8N{gjY=BAJyA`UhAy`Ygdh9rg`omM_J^o zdsGPhI^R46err)I8^<(+4E?G|oYli?O_CM{B1X@ny!telJ{|e3Dl5}9toR&tI!bE!T!`M^ z;9Au6=rKlX3l{D-Aj^Y4lG|!~F%(u*JXkbU&~LP6t-~!FoLF2!T+b_~zgnCnPs#(K z3c!F~S_v)1Jn^eE6nQp|FkWj5Upo>qg2$R7h|nhwNqw`pv1I39$t8O6z02sEgB0ZO zarE#L$xS+(b*V3rIi0}hzH?eK7MoW=#7NIBnT0GT z(aVj6z=_{1tM+uC(2Bkp^Sr^W*5c|nmI_-2@sgGg714)1K4KQifGHbL3VJUJBZ7Gh z+=};n8kvm!Ex@uphlphW%?!ZDoaX%pQ3UFF5i#WxIn`WdXoxcC$#{bvqTrQsb2)-J zH#Btd2B#T^m73IKMp&oDMwAuk7s4Zt2@eSfkCUlze^P4_*cp7IW~^x$@M5H-T-*(b z>C9waLv!q%SbbvKmAz(533*2B<*OUu~#lRl&(f%@cy@s3~uA%TOe;fvD(`5+2o zHZ7yTF+%!L(Lr(%EiDn@;hve6BRwOdGHSj0y6<|+7pE(Ei|mo*t8K7$OR;heEh}t+ z8%-S}JcQN6Nb0U6O_z(-7hA+#(kPUb_UT{Ws6ZRa<)*pyMp5 z2OPhYbL(HV!g8r7Yb40&g}b2Xz&a|QGdNlzr^6^Y(JaNRokn)cV%l_Euo%H=Jjxc< zW?AJu+dcW^<>i|n^%BA9K-+8VXc&>(@>)*IZE#|0=^X(d(!UQ3lg7r`*KlO4TxMx} zsv*?n+R4d|2INWiZpSu|4Y*8Z?khS)l__Fw~nF3Eqzq*LWm5RuM3 z{I}G|9JUtUG6XQEy}V-5dS}t=J{d$WN5_vRrb2$6>(3=)e=%t!URinOm}lsk`Ztiz zTcswnaQEN-0?ODbi?_{n)ML-*I%2lM7U7pVD7`C%>5ajFuy~OzEiwS!ivIXhq?I@ZB?ws(vJ-INer+1S^r%8~lflDugJ1!)Q^d75 zRab?SUCS6IraGcc;Pmin{~lka&^wpbXfve7UB3yF0YEc<8Q>MD6{ywakk~8wO~fj0gGF^z znX#u?@AR`s39jn8Au*w_nH?E$T|fUKuk7tBuRp``S8hNPuG@#rAAV9Y^YioN)@#Q`4L$5Yr*pWV0*p^8T1M>^*9Hc_4!L-%nxB;Ru%>6#|y}G zCbwv|PG0>?cp6D1kcU_|LbW_V9C~e`ego+MJC_grS(mTD03kceh7HCA`czaokvbhE z{u}B4)6Tt;@H%F{?;=!*cD|8tu;7f9;HVlanoD#3N zRr2liI{>@NiTyU_gjZnU_Ds2fm-QPg{?|3OiG{blNZ|8{d*BO9~7 zV8Z{1f>=Yea4f#jwf_Y4YJ6x~6->pU4osOVsTF`W9m6>E&KAU1z1L(|XByW_$|zUq zNN5QIzp_(VC7^#;dens4Hm-) zgX6rSjpV&L6PIHowf6zno$C&o&@@S+0wjET3*PW~*<4{i(2?WkFWrE}!;LZ|4b z_K3!D6fexH;lI6n)nr;t(F5~fA1$eO2JGIn9=e<>lbKt>Sbi8IJ&CnGhDx(p{(7xG z<IG}4MSZ># zY#jU}1J8+b%h$Am_(r{o-A|ET$YAT;?R$L|&-A|qneck=PHXM%&vFwIB04s^}1{w;P zIm(CvU!Kpu{Sc=0vFxr8BPe~kxVhZ49Ys$+p1q`*xsKan#k2y2K}TS%MimFX$3|gt zqRyRYZ~&$Z=Rpxe>b&>JR>A1UJ_OqDJ=l)|g4I&i7Zcgr%-Z*K?;RHNy(a|*n%-jt z1nb4<{V0kFPL)-hMQ=`G68l4&^-KxN$$d3GQ@G{#&bw0BWFp?f($zJ1Y&n%>4PI>r zQotQzB-9}HitpV4_2L?J_!dHpsZryR2ymUv&TZaV4*=Cv&&mpK}3! z!0*E`{*^Lh-^pdX%1}q+UjFfb{5-^cL!XY&~u zg0M7I0R$1mAs%J?wYDZ{XEE~)S!S2-gNa#6*xSiLD091I!clGsEmRYVZqtk64y@Yy zSjHxD5^8uBkOgT&p3Lq+(n0s<25niJi_eJ`7SjEZcL+N8 z$agR)e4BCZl5>QAGo6=AikO6XXJA7RvOyi}^ykx3)65%n#;UqFbB5FJ4C;{~-&!5U zB;P!4qg8RLrMvr|L8jJ3VT9oTnByw`>c zZ^omb-MG+^rELon?1Dazz|@mB&ikClJjlY0%}w*kKp?p^jthY&*qb)(Xd)Ukj73a~ z89rS55I(kdKX=ht&cD?_tl92XFFBn%;0%nFpw*0>2-44p) zprF{rOmlid`j;jtKw%M%6L08xLZq^K{g$!_tFO{3`*eZ@Tj!N9k@stt4fgz|vI5Ip zi{t=C9v#yJSJRaVgYmd)dR#VYef z57HdsKd&QF;R?q)d9{zRqD<*r|2;NiWR+gYkLUi98>0R4Q%fmQ5iL#^dQ~(WMi{$vNgM=46Pb ziw%J*DZnnN1Y+i;2HkHC1sC!CJr+Y>{T=r}FV^KErL9o`QMu1YLybf1m0X9#_{A>Q zGNQ}5fQPS|Pmo{k4bswqFe;3bwSM(gJogSggUGk5hsH8aB)x}8Y$b|LPY9kdd3qWr zbuQ7z8NgCiLtMxG;##i+{-uGAs~kPCk}Wf!qsaw(38r;VX~dP8PyX!7hDhhNgFGj* ztUcotNzR0U9N~LmqTsc9ku0#8baxqD-N;h)czAp;J!VPNTj)kes^;@8M9_?KBS}kc zuI4vgIVXMfa2suhU!5!I_3ZrqK?xw;ifnmk zIc;PU(g}w~vhNVShe(PRFWOVuT!?8~#OK+B?F18_MX1!XKt#J@HlXR!<|``E6FRgb zyU-Q?V3>~ZIa$J&(Ailgw#p=3S-A#oPC=qtdHs1Z!5`UA%PeQ{=;lXh5uT3mcR%qP z{1hsLCfO{d@reb#1g_k|_&#T=J{sQB&rb~}ub^)<-+nkudMzWSOtZJxv_IUkTgDn;m8lV5Wdp!9-yCLNnvPLk^T=^dsq z1)jfhlhcJt!E4O)TQVUUl@D&_W3%g+yu3(f7v8zwLX+jc z&f0v)cR)M;@fJ=hMBDJ62F$+JrNJO--7=D74BC;^oHp& z5%`&!vf zy35Oxlrpt_Js5@VrPWd(_qJQ8(c|ly?JOvCQ9WB(SmHXpF@g;D$k9Jdf15n$f{`u! zeX^fHl5IgE-^QE!mMv3tD`R2qWT?OnA^wo51qWvFcW{V=PvsKkc?+3IJ|z~|Y(n)V z=XwXd*+3Ec;$vmLnEq9}aeM^*dC2+&Vmkcygl|qDcqo$=;y#+AR-w-}`A)cpDxW=C zi_w|Mc^WU)szV8w1=LfG6y)PDE@v^Gof>d0wsk;~Affq7p)t=5e$tNjFr9-_y~UU2uS?tY+nFCxkc&5@o;^&JEJPX`SUgu!GXqEX9 z--&eCRT!rJBq+r`p(WKSd|jT8OnSfYBoFH8-`1qzyZ%r{>YE;$JNZXjf-D2^9fH^iA^o1-|MNz)~)zA zh6md%ilUBF{Dz}PO(em`P1>V6NVlWh1s_0)Hg;H{P{vPcA*;@7&VKl`sPIk?j?!8& z)nZz~vxv$|dT%Gd^M|kxEX-bM0iM2{1TWCFT(uk4(Wcq4se;EnzljAWJo3mOwd-kh z6}s~t+TkSd0EY7Q-JHIf$pX&8mm2@$U*tqtoImfo$XP=R(E`@ih5g{GX89Y8VKXMYGxGy~;$#l^+T?J)-(?F>`6 zC|D%?f1G`FRNT$BWjF5b61;IINN{(TV8PujIKdr)JHg%EHMj;%aCav_NJ0YhgYVwA z?whsV%&hslS#;H@>Ql$|-fqC$0`_=X-&fFon6Xpv|17;vRd>VwyTR9GFG(wv$)B;I_g~%XELO+ zVG#u40KjkuU@0J*8{m)gfaWA_>_~jvlj5d_(A4cT0%no6QVrJ9(al_R&)^Ro`MAn+R=DNCyD<5O81@C``!J#7d z-#-`}@^9{D`#k=M+`dyr{kE}brU=POkKbVfizUs@SjA_dOc~2yCE7Y85X7l#{Y0J_ z7*8_~REE4`j2R0nmP8EFChwCB?pN)rYe<|H`+BYc(@!r>@HVuBa$B312+=5CfxEhB zzbcQTFst5)dQ{Ss%2ZT&Y_djKlLZSUq$EgHlMNY`9on39c4;t~p`?i84P}43wpj=< zdJZ2pw<}dbec2dX5=YmE2_kB3STt=eLc+tcuf6^W#$`0@1Sf+QMQ!P9-4CmVBoc4Y z{j&9V|Ab3dL|wcS6E-60yM%vbc+uqCA3*ez3V=WC!ntCj>*|Tle-E&Rc5ViJs<=8( z!|jgS``~-)2#>afl5d&^X}w!2+#Iw2*5h*}!uaKoMf;NEv(ThfKA(pf4`x}txe85D zDxh1s?k!G}x{|4?xB3pZZnZaD4Oc3;F<07SxNp7dV}nb~H}zn4v%*+2bSA6g}*l$iB}XG^-Z2>(<- zJX6a*NpwbInH1KuQ^QwdyEgkvqu8RntiHCxMp`4<@Ul{hhkwq&B&@< z@({_YX0qzY+A5fGm^-a@nEN8AhTHB(opPJt?f7$a zk^6`Cj33zyc`1TTd-#H1^C81=acfEJ*{NDWYAY9(w;?sx<$X|t5E0E!{0FPY_oz?G zetFil(^w5rdty2DZ}!fgjQL;NEaRptl)Qs-pzzkG`tWn`+KEf6=Mf#MPhl`hA6lG9 zm+)t%_U1~tZPw2^dE_ov9cM}82V*mxI;JWS<3$>fDx6dI%;>dJ--L*U2p+@;PYx;> zJR(T=278aUYJX$&^up2`4|b*~S8%Ef+YFv&7;b7VgUKwQ_0M_uZr2DE^~~Yp@VY-E zd>T_s%>yg^>Fh-CNR`3{0o~(X9N&3Q59iYRZ2G}V6W5_96u`KdYr-B>h_o-0VPI>8Yj z`Of?E7r5W!;`#Bta5nUVY?%+jc%JkG9|g~#5KSe6f06~~)*jq@WvV^=9w?e3>z8ANF zWYL}H_wF8Lij+TZNDVA81kdBEz__z%5-0fMjZeLFN)Ccz7!|=e{SQ{WA$(~`9F5E) zuUo~oK=W*L18?ITmfEqjwE5GY(>bkypVe!&1^4B8?6~7Gl2lj{%>phJUuztv41Fs9 zP@r2YZR4F+m#CaGU^ZDJ>(Dvf#roSkO)_#y9^VGdymX9l=!aWY*qe_%nKcC%80@xw zh4Tq=s4h@~#C#>9cFD1ERB>vN{0U{^VMoVEQ#fP9hOyl0qsoPfINv3c^D($BisQ|y z62vy5W>cRC8)w}utPGC{SHAsFKn`8Y%0K^UaeO!0*tEaKWPiBXc#AZ#+u@cf<&aZM z^|u1W`OEAEr)yK~8VTu8FI^Gd-83|kPOf87{Qbc(X{WHV-i5IA%J!E8o`&ksk=ZF% zR4bqB*SG7EoE@!f`ak*GRFbj;3>`%pwYTmM854fq!WFy6Qw^N$jZS2bCZs%-g#G51 zHgL#F8+8blhc4QfL#;?0@I6ny==;KBu>BL1SqSSt$a+&5W7=niGgpq114A-=W)A=L zp!JsPkw8h{XVWjOLt@B0r!_lTvV6SZ{+z9xh2pkEBx4uW5_=`&0`%oL7Jsd?I_qz6 zKo_{4Ek%{3GvtqT(>Lz`^_j(0!qDlaSDe+RZkY|^mUmpgcAWePvaDq4mhS8FaZ^Kx zej~N8{zVU!(tTnTvrox6@`puc*2S+So55s$!Wbql8tur};%kiD86Raes4UJa7_ct; zanfkuBJ{B*f{X(F@oDh&JqUDqgb=n3gG#ZaATAv4YCa+b&&-uzb#?M>t(Ylytk3QP zbO>+Wf`JT|YO0H{d=s(C!+0&Xy-ARFBPV1Y{|rSx{BtJMu1K;OJ6a%h4gT-8zBRwg zYtG`{zVjGLmm|=sHgCP!JsOIxLeow2jS=hZI$}tw6!WW8 zB|YbPd(5#MH+7iE{N@OL%scwRN+K7+&wbCtgBSO%%XX-0a2|^(zLT{-@H$~;FXL*I zE~i>WXF{$|u2%W#*j&&O!Q4K?3=pcY`pQmxx71= z8rG!MChL9G8<9&&@^Kh`#4&`?mYt+7NuB6-rO|*eqI*Ykwf=rwP@|R~nv&ifzh`TU zhMg*}xkbdIZQX_Crw0Ed;c)D;smz!rl+=DyMw{0de9~m{&Otme#nD7}_e;n%6vA01Q%-Bz0(}My{?=q-S310idHw91n9}PE-w%(I z!XI1ymeyUe78+;$@wwGnm%mbD=T@@DONy~&ZkKVoJJdDTNyT{_88CbT4K;jaIEJg! z01oe2PP*`=r-9QaVRTY0E3Xf`FKF@JwS0FvRtx31p_cO7D%Q)a`~w~1xRFQ1B7RBL z)FaR|c#9LGjweO2l6kD=_>^1eDd97`MlqdK1GFmo#&p~$g;jdT07ms@TNXXmCG5(i zJ1`5)KHIfJhXfFrHs@Yn84RPYS7k*nF;Rj!Twss(;cEo}79zY0{3cd8MXj;}H5C;t zI=XSzF;*5ixO(wF@BZMn2YhDh4;V~Dfz^W*{QIJq?w4M7XQnL0`rb_PtB4{J63y6H z$544Wy%96p^Z`xG{W919gQjpBs__}e^eiL%(t4VM#c6?-&L~={F1sP5qqB-}kJDYs zQwJJM(%`?IXlr&I(7;*}y&3AaiAN5`vVTp2s0CpWx1j5Q)q~kUU!I1cilONK)iz;g zc6BqhG-v;33={D*SrsYk<4*4{K<4vs4(xTnn;`o)?k^6@IZWU)%0&^>@Nb)Q{6^q( zu`0bzP~Y$EJYfChd`D?oZx1xr_b3 zs*Vyqai6!0fSC*8rC3Wzb^_B)@?u!$b)|n9mZY8b2~*?K8H9RDEm6CO&8sJV&WsE^ zJ%(t)kyIVpPV0ksue8BL_hwlyISrF;fS%8*K7P#%tlB)aT=2sH)Hs4KunpD1^}iYJ zbLt`>#FeRbGw2qz3b&E~+iULiVmJs5#>f#$7trRhP3)lW*@j!)TeV9`8dxTVl)5rz zG7b*wG6L*c2hPqV5X(JAI-pU`SVo{tZ+3vUhoAB+`-g*5oN9iMhR1kxXs!i_X&t1} zA1N#CYGvvV=W~03rI+@`vcG4wx_EQCFj61x;XmtOF*+;O?5Jcijhb?|M~d6HkjMQt zqj#{!``a*BF!pgRhhYpBsUs4pqeHUXnlHm^xh1lg=9kf~C_|r{+}xgq1Fi!>S|uI+ zVD6s)y^sWCkh+SnlV#u>HDFBg9%Z{=QXUX;DpV*i+z)IF%mW(z_u2V_qqKj?zRxH2 zYN$W-Jkfl0hH3Nsd$HEqOr_ydy}`-w4SuLdOW%u~+XsFxTRn`#^bSGKb5N~G*AHmJ zsNNJ=>f!=?AT9woge`CgpmTkSuTN1InBnCDX*@poHA$uoVqt=fIf8z^yS$*0e}8ki zJ*M!6MGtdo=wDT4LLD=smY_iroJ1TyeC6L%prztRNCMoN_YKYj-e=%o z0MQD3xATsIa=~?*7a1SFm5;`{QTq;n zm2l<0%O`O{@LeV<8R_U4f%{$*B;Zn&qvCS6z}F|eG)>^hk!6Xzsfzyb|L%X0{;htbK=~8 zo>i8U6I0L%2%oP&mNO&9oHKrQf$(BXS`I--z(F*Ax}M@5MvXq>5pEEsK?U(%!>ic@ z!vUXAT*WwwBfT&~;r@VDwFn0$AN0m=W1TVv(RnL*hHIZ0G8N$;(FYUUK|DuRG+2mPyA6>eR)bE{#p2t)-Wpjk1Vp~G){+{3pxf^(7QVX4V#c>*G^IQ$zwq4g?k7O z0ovIjlJj}>Zt>2aML`H(p*oM@LIKqFe_Fkh4vl1u7CD*O1a<%6t#s~`JlxA9hikXx zA2cmbtU~QKnoU{=Fvx2ypa0LRCo3fS<4*DR7ejlu;{G9L)>q!Fzt5{jTx9_rfkQzr zt9L%P7)IUskwmu4!{MT6VRpCrXYx9o8uS5zSY;Ci5N`lm2(k<&B7Uak!s>yVvxovH z#`MM)CV2DlLGW`>>c?>5DF1I;Fr`0}M155FVVg=qaicRg&tH}P@UjKtv}qM6@y}sf5*Kl_EP}Qb}fbTD1&8t z?0X3tO;YSPPNhAQ)|o+;VL!B=7tQ=~Nlsp(&ioD>fe6m<`t!PL1 zi__DJD$C1>Lw~m!OhTC4pp7fe;rFw;_L)!acSC&n(PK{cdp|r(r-H_NMq#5?Hy4ZZ zS?Lj}_QQn+;#K? z+?cn4HNYXjpe=3HlyTk2w`e&2_6O+-$KBfCyC}sqC(5^UNzLVru)S zAROI_f}pmttt}N215-P(IqI&iGV=G%@8feCpMs*3{KaUc`-h(T`u+R9bwu!zjQst* zc7IWMCE#ah6N1=yMpRlQ@7MbkIZ^2DjA1bQ$C)Mp7vix`C$}proyWkIXSPAGZ4e{9 zX-ihyx2d;EAH)HNv*jde2{~0%h(uRy+uJY?@PPo=$U{Vq`-0|qu$~`lX1E- z#FDa|VhdU@9Y|$x_b>#|eix`%rr*ZbL`}C3?QdU|PiKZ%8%ufeTy)+HS;&@w`w9Kj z9=ytqAD^K1tDCwukT_!VS5FzKMRPV>T8tEB+t}A@*(GUrQu+4kg8kb8PPQ7OKaTwi zcX)*Hj#QW4)yG(YCC@(b^Wq@8=o(dT6CIysD|I~`Jv*&54?QqbN6lHPEuG&+%`Uiz zp^#<@6#tB*n2UD_fXzZ)|5XuQ9Si3^m^bOl%VxmG`>%OBsE+7!sa>qxGeO>!ek zGVG3+`>o%{Y18|TiU!!i8KJ5a_bZ)a{3mF5LTJ}QH-hI4A-6w@{6~ijzPa7R4Jjm3=D1apm6fYlfcA_pn#6PKzZfi(zo&#ZPJGRoUY%TEBnI zuH^p8)gnEM{c)2akihjJ@`{^%R1AylP@la!lynA-}lWZAn2IArlsnK4MHYt zsHztFzLg*DbJ5>0CEcW-N$jBYbp7J>`KB+;eL!OW<%-Wx@!lZEH(*R_Z?_YA-|>QD86P><{FvZLg-y|GEu+yBrd*ogE9TviJ=F0(044 zzi5VN01ftz;vs+*j!kg0l<`?Gy>=cv3SNAX5g_T z0KboGSCkM1u);_rz7jYxg7fof_etadIYLZWo&v z(&d?$c@<|03Yb6O!uW6*IA6bKv7|#M5Y-4|mY=ZL$IINy%zyFp& zK77A&aXTf!f+EK^#$H&<5-*O|X{exX2{U-Donh`sJ-a-F++^@IZTG`kg8dn{(D|RG zm?S0mO(k#AI?MMceO2_B+LLrkC~c~!ejD92Ga5x0#4_g?CX>_6kewR2%Lk|5(A(G? z#9L5d&#ID>4e90p*{{s|(!ZHxaT-6un_hKSLGIhB1)0m-8#s5NLA!`(2B+Y7dH}Xb zeHH94&b15NcI@HgsSSnNbchEVw>`J%-vJm<*d}7kIb0qr;4JJxi9l*o0UfV{!;emG zW)-V`p)q$xCNnTs$mSetW?8Iz_QW1#d13Wu7rx^ zUzxbOxr?=h7mJgvr7Mf8l`+R_ZqP_v=K{6ssZ2DXVMAV4+uGJ^>Ye>77LiMExcT#a z_jz_Q|HFOvKqUsP`JrBKK?TqOn;+_m@(N}w9K8?^?b6C_fS639ZDW=Qpy;W6R)k1% zz(IiuSP%^k5ayq!MZ-W||Cdb>080dY8EnTo{!L#^VsN-2?ueoCcGy}lVUPc1x1FDz zQQshva^Z=Kyw!e<0%|gQ%k}@U+X-$ShD+RaVD|QTaDAC_7?opEp+hIhJRO;b%u?uc zTYH2(BEN^TO=OUJMY9+R{-K$wP}0~d5&bDzy)VZ^+k{w`XO}xRl?5i~sqplRune&u zwNzBg!zR8lEUhqT>oN=u2jM(t^F>-XMUXTgQ-cnDk2B86k;IAPqKVos9 zJCGq!9a#=%?mIy0wqO=I*_G%U+O-gc75Y-jp{W_`$!^GMy&~j{!rx~&!YihyO93dq zX`kQ2qe?4!9Y(up{28O{YzTyVSvTFMAZz`xDsaw*EFa`49B&TG+M9rfkqG9ja zQU+H@r^N|z#KGCLBkxf)ZZOZ=+G{mF%X-gjpF!)|>7;02WXk_b#ct*xwg#3dY12kd zIrSEAqiX9e6tzsl@_YZ%)>Is{a-BjC_CYHj`&tq-Am-^X;1KvsMAZ`EJoaM9to?Mp zKOp*0n5YXdA@D&%g!78nFsh*!g!4O*GB@mwfO$w;WRVXA_^>@vGcFu7_rS+&pi{OtoaKg%nWbWQ;i!7_l z8*VERU~Q;?`S4Tu^vbK%u*Qb8XN9dh1<6smvNcY6UAH|;D6ON_Baeh$>6Z<_-e(f; zPBOIqn2#{?A}GJb-f0@9=x%2Hnn<$^$41dQWttbxJ=4F^Mn9|+e+*YVzZ9a zogwi#`LqPF!;y6~uzF#0^R3YafzcI(&oVjP+O{-HlQCEWA@g=kiY$c()MYtM z^2A$_Lxt>w>vnb!q@=8_(hPO|0v=r}iWZ$&zE^(XUle=F&6l?;$r8WKZK?U_Ia;1-6xH?d-!`x_^)pf3Ij-jZq^#LdeF+ua+;<| zAIUPgg?G~%G2Z7NvDR<;o~15Zck)(U%n2~pS4_&d3@1BmbH3I6NzrPV5y0e1Jo5M* zx1R^u=9B=j=R3twY;{z>s`Ad5uQthR<-XY2n7`3k2I8h~7%>OyB6Diy6iI2}YftZ) z;DY$#%T=R^vq7zE{C?#O_k#g5@p(tOkh~7t;yljZoN|4C^Nw|E4Yl(SVDg)Xy*HQf zR;O*!l}KrIGT=zB-ud_Mnhmp@!SfBj_uPk$crNoj^Y2tZS3uWEf^ke}t$bHh*82{9 z8~QiriFCr+E3cAtz=AlMf#~K))!5u<LT!}~e@Z~zIz_&pV0uIXie`XB`-G#mVA7q;t8x6N-Y1*gt=YRacXjn_f zAAQQ;|PtixbZ?UWT**x3_k_})`SRs+iIk=Az7-o1%zdofJM*Vialn4Nak{W3Z zo3OKdB_}LhOS&^KLGx%Rn-}1^XKK*@=xTWC-)N~AoV0Fa$mgw(P*ns>He38Er>|f)Mgb;4l*6Vh_Nm%3` zlQCHmkwxbvw8Y^Eiv*#Wi{Myc1?e%N8oMed7k)kcAI)rPKzDCD4sfODjXtDW{xjMU z2Mu~v3@dP%1{FNv_dJVXub^&;qokRPr;?x+qT8mQ*CgVj*F&F-UMV)U*GY%Nlr~YV zp}W$IPv|O@^jCxD%1&6Jggt9)rzE3>m#1||c%o&J+2P4ep8GwERFeJd(VBj0b+V7+ z<^$N~N3c`QP0mgBO-{~DkK@BUdei_9E+^TvfsDGYB4*f{q+XFXbLDhu^e9AJ+|_l~SJvnXkD2XDQZ{EG~l(FK+XxQbGxq05^m3TWSM z>i1-;lp8U(2zi^l`(1IgeCEoSdMeA&!FcbW#w3N*hWv$AI^8H8!UUPY;ln2X5|7M^ z|4xo><+jud!>{U#dR|L7d3;4knK8mei?z{`l_FATumVOOK?_?TM*roJpI+ps*G zE^-^_qNltj=`9Uw6x4MMNl|F-P!qkpu_s^sA+k7KmxFE_U9{d2`fg2=RwsKOzg8AM zZI#6`+F%F;cLHjxZ0W9Y+z|YdvJS?WSP;)lhOeZ3556{$7?cw zar*8Y>~moAL3^iWM!y1Y_+iwb!6ms#m!5U4{?OS(mnwrkb1rnosa6%amZxTFc=x7! z5T54x3zt@8>!(!>m~usHwY$U5W*1x;gWM|zvhF<6nZ!BT(<4))aP2{={fMmM(gZCg z$RTd>fin+I6RO;)#=BXAJE3W{59hJ^CH$m1I|_zw3lr3=TI)_$LkvSDH&0Zh)d?C+BNu~EjPA6)9*&+W|wLDW&^<(%JrjcwKIxJl0v)jfd7ne~1;G>pgoyQl8z zJG8hF10k}Mk=5*T(sg!wR3DEa1yh)qI5{KQRj;@=buMd7W+%=A31g$TGFPxS+SyQV z-c0G`n2k#_()D!-36pLIA-8(vtCwy^v94UKPs6qJyzAC=aw{g@zp&+g#lDk8Ze_zn z@FYO7Hnh%e*)i@(k9^@_PKj`;Bu;5}ZV;R&xK0EE02mJc*0@NcNgR%qc;HTOdTNi$nBsif=b4W^r602BWVLOv;-r5k+avN*WnSo&|tZ)X_4nK<1? zdXX0Jf{QnKoaC2IS0e`zcuV-Wfy{m!&n<_KPmXT2aV_Z9xHE^-L6zdxTdVD4&N|!M zb8Oyi;X&U9{A6goj!VLQ(Du=Jt`qTopyE>;&0UE)-?+tdjMz&xA0-#l%_H!ABtF%Y zV<12nvKYsnC!}_za`p6=Ju!o7!$Yl8E?&XDjWwCXQT*r=l%!ylc>NP1;EXo#ClPbC zQZ0;@mTB%Mao6v^Em8_HO7LQnO&L+K@Dx6|BZoYxV2gr1L3|~2brtv5bUWv1RFHv& zo;|3W`I+gbd$Vw`vBPP=$i; zTOG?-+_=cPNavG3ZskAX>ES=@zI!6tA6Aw=j4I@sKR3ahNt8Y>y$!exVaBd(@p5I{ z>$GN22orPT#hOSU8XC+JKEmzwEV%Sp#hDYUY~10o)&9**NANI0?rJTIa#)JU;8!!4 zcKp`w7vk001;?Jw|sXx8>~Y?Zt)*W|fKr1JF9SG%>` zT|Z?_RX4n~G4%FnymEqIBB-X_S@ zBj08C=kIs}W9;-$G(;LBBe4uMU8KIH31P%dq|ugr?hO|JUzvbusol&fjP&5bfvL5g zBKgdyO&p87KWNa1qNAEbz?pg65#IFXFyd}dIQkEY-jDk8hi`G_PcFR3geOM9snAVq zlC4S`4-7Zk)N>B>dagBaq;rdnQyXj1wBCVzxtGx+6TE>GW8=7rAc_5S_zO%c}@;V2n?TPWx8GkmyK*G@uS7G|G1B04_lx6=5Py)I2+PXQ?3P2gnRAkm|`nq%%lEEz+2wtX*QJ(JsmlG zU_8^EBE7R#PrC%i1I$J*VB_b&5D0LTZRTA!in*o*2$l!G!8Q(|<#^20+Y5rX6VRN} zfzDgX>5ef|K zQdxp-E;;rZpe1xnbv$$fl}@14$$^tS8}N2EZ-9*{fExcDxw%|xjwv<^lG(3pPp$C0Ua@GTs86t8!r7ct zAFyMGeUCNWAZcEzp!t-emhcjxrEfQ5hHd`Fzv-F$V#1aV*@2%1$I{WrT|j362_9Go z)c;ge0KUov*O5R&G21kfKv%Fec5tOY0pL~_a}G8Rc6JUnE<!kJLE|Yk+_m7PK(9h!;4MQ<0DLC(3QI@+Cu9)H9Ms}7-+1w)C_u7~A~GvjdeviNreHGs z47EH$L?OVPf{~(6IQaRA-|cViqrhZe#Csa%6pnJI`0U*SziIlnaVAV(Dsb1|p`T*g z6v!)@XciKN_bI0!21`g$EJyIU$P69x`458)d3>x`-TUr;HoMr9Zrsn-=2|Kju2(Tt zf4c_fydA7FDCk4>mPi}vY2`a7L&l%8b&TWTy_78NClQ%w@w|u6zE_YqgGo{S@5k~G zf2DfZTH9WxL?XkdKQ*}Wp!4bZSZE#cUh_1O4SHLO79xH{#g7FMF1#EIUXsdtExS)4 zjt4%49Vr1s@(ixO(iZ)1)cO$B3fdi zNWyi!VlsO#W&!6fP`rIdC8++6$%gx4{R>5qqKPZ1B_M$#WMBw7(_u$EhK&T0tCvIV zk71ly<7H1Ecs$zpF%!4f4BCtRvFM1ucfY!Kn8^^5+;9oEtN>#IE z_rKLtJ?JnsP~RT_~=j zMW4E7KXc{oPhE&rQ>)W#(pQEizb~ev!U%WYiIBdn@?RmI--GFeUAsjYy8eC^_db9+ zO_0~{=YCSh+ky%PTFfsbGXKt9CEt`B?|F1ZTxpeWkDgo%`XX$w19wC9aRdYZ1UeY# z@q*ughMv+<(^2a

RIL-x{3W8a?*J8Aqh^)-S!myCqDLhT_NZXiq^yEw444;kV%t zy(?z7xU#u#Oof7i!Jj2kwhN3=0g9YO&T@VO3O}Y|NWug_6rwP=F9fQS&v+!DF!BuP zAsi^p?{J)!tcPu~xW!t!*6?F4DH5@r+g>+%;^GN%$Jgk-+c zC;c4mw-2Hm@Y&$Bn3H{TICWvxu*#Y+oF~mK7fJ$C1Hh3SQgWBD(0`uMmP%V+eYpM6 zRwLD|p;TME{|Fw>sI%_1MQ2r$rGJ4VJ+&gNtn`WzbS(h%8s?;q7?(>ufKcIQ-R(15 ziLlodKfx;G8s1w_FXAfyu5zx?E6SGsVAPg5^X0S7S4hpXbo%u;mJkyN`s#*qxeXO4 z4Vdw{6Z&FCG8h~b>!9A#49_pK%X{8DpD%`YWkr5Aa>AHH!E$1d{zKvX{4`*Iwt(B^ zQONiB@-l#nJ?O2Gb*<;FNk2OV)H+HS#Wt)AQj1SVifcu%3t&eA=TBf z>Pj9zN1Hpg($FZ|3VEfv*HTmL@w*VioA;ZGe&7T+_mg{v0$cGV^#?Hy`KB$X2q3@y zZ@1~qx_2ncW{C2ajPan&QNzKr&G?Sz+jJ+3!33BAxJ_C8fDZtj4t_BC z`4>1j3&=tMFzhFVZGX2>2X$Iegnkr-t!UB+Z^a7k6bIk1E!3-FV>pRq8s$Jfr#+4# zZKhGbgdG|c4%q{CXSYt0uW;lv49OP4UM8~1$*P!^*CnG0MB*_MJD>D-Tgk5O>Poqq zp?e;zJHEnQ>N%bsE?#sCDHz%^{)LV>+$-g!4Z%l=V7a%iG+h!#3U5ugIp><^X>(68 zuKV^?A%F3(=P~;N9nkw}>A?2{$Hvt^3yy?&2oL3JFd(#})h9vd>H-J*7K$tVT8JxU zNftjQ_Xx_ugeDO8K3snD7$a4$vCOCFm&hy35I}KY)9Of#huIMRnCti@poduBw$H#9 zzB?=IhCbkOR>UJT0wFkNsc&o$H2Xv?^PSZESeRBP3SCtyyz}TcBc&*zv8yn?>gx_I z=;H3u4>3*e{}QsmS+4e}aqG<(#aL8E&369UGxl@1_IbzjO|ZY@hUitPp^N8o6qHv@ zo2GW=0#eStX1^p2FrAdjjc;yHoT24Yqi&tjG;HBgdxgk3#az4fwS^`>LB}AZzO!C9 zf^y+~H(xv}*4BHjE!Y76XWEW_RDi4>cBW4V!kmc5GF)i8^vDr6T<%7#)WdT#`7JB; zVb$G6P$_|eQHAi+a&kvmSr|W5lXu|zQ7gE@{$^O;x{6RezmFOp=)wt!%Yc5!zXk^A zWSC^9WfW(h=LMXETG+oz{yxAdX1>`K@N}Pw>elxjoayUZThPeo#VvzS^|ndyG*iBA zZ-NDJo3=bAo zvi(3RH8N~JY{*MWlFu6VzzbqNb}+WTkDJOjrjwB>g$GN&92&Nq+AgapW$k4x_d@5M ziL}`KRX@W^A1SMoaGrp$9mJVWZ*u|{fa95sJI0O{4BUJX%^k9Lgs3g$Hzc%}K^4as z)Gcm!+(wc_)1KATZ+Ch$CP6o3BaA{@gGFKh3{ zw6}i5Qe<-%hz=aPPh#}bQ~owogs@A#$}Xt%s+P)q53U3dZ1~T*-F4~q56yARC2}5{ zsL7dMj@`9ZVF~v3ILWW_FE>7mbzNC?k#Q~2=HM@opC??r#d#PtEeRyenk!BvB9iu9 z`HBlmIQtTQu=+?y-tKOIk@~-r?|P8t?;?7M5}dOOT*4&bJztl4OyIhJ`WlVM6riX- zHK$O?U^U=<-1-#F9`t1EVC!)C39TYbl6}E*k357DSN2VPk~7W@C80jRp`I@&CE{q) z8EBg4tK2b7cK(GR@B%6Vm}+|VKW`Ubs;h4DiAnFH)d3;e4*#?LoCf!69&mzo;Z!s3 zG4h3Q;zpV7Bpk@zA2aJ1CJvb1{x7YGjU2(mBkZ|ZK6rFv+yiIvOC`QyAC0tTQ<0XI zPd!*I?1vPN|0-d93RR_frK=LI>hpouhn^c zkS7oPSNhl-KdjtpGoA)<$rh@4uKfGytK~Exwk%PuDS-deWSG*d(RN;4bKf`(kVoYL zl=raQDkuXXR@>0b1+w;=@|VBkKF|1;?|X&bP^{rTj;G?`dS-cn9V?X*0Hq0E;Oze+ z@^_M6+iHn*`W?+K3T4HFVq^^ms zu8mrOtc#1Bn(m32^Y9yGbADK!Zy1*7uyTr7=@)x7dMe2_W=3XKR#s+&jwZ%dMu~|9 zdMO!6*$J5ixoJB2wndgv%CQErCJ6?Tiw9#dtjm&h^lSPfgp&dpao_Mkc)?0;$FRXb zI0V~20k}g9*uGAW3+}uIUp%@2tc@T7Q zIP_nSX!ei%D3og8l-Xux0~(j&nIl4Gav!{vwZcq&M&RGxL;JT9uA~D_A|*!AA(R|P z>ab>Kx*84xoRn6wE<*bbESx5T!xpjFv-pi`T?BqJjgzkwPvXkELBi>cj8c0^YNRa3 zK{Hzvkz_N_Wu-Lj1HdG!yFql;(m6m} zO}Nq1aO_|Rw`x+m@^-*6P+RUKSo*wq%i@6_!^aUazr@i5A8#R2#bqYHVsv=7*bBbs z(taOQ31uhCY*w}Nx>=twFG7g}28pxy5UGu0T1>V+X4eykVMAmnCVBQx#p?D|U(=Wz(w4Ae@huC~rw4QShN6-8GYMknC^2NbBp;|4Bxk zo)%FZ+d`0XnJu3ME0E&%6j)~Und;}6H2#n9yy@i7ZG=1Z>u!N&6PpCuQy z)PjtXMhHE`hV1acBc)>K%)UEaxGOik%#iFME!UrHpxoovrh14m4aIn%Srw$FfMK4a zX{DG3L*Z*>i}2jL=*pPV1=AV6JbCr7bbfGos#M*y*-v=G;kmY;$T&>`QIy>=tr)VrD(w;ijH#5QjAZTP>;#?EH_JJ*8Q7!D)5>E^Q?S=d zuHPrrzfasiYRwW4)P7vMxm=?lwP|Q~J4LCbz(8qt3Irv1(__s1~ zgBY#HSuw``cJWG192)#-* zF7Fo@Mn$Ybg8(8-C9=cTvSWDVaMqAvsghKSVMuBu1dkpvhG$&@!7E9HlcJYB7^a7d zw3dyuF1MD7Jdhm=8$1-6>GPFzMzgUkV`YGP34!xFDw)jqn-9ILH z@j0vbHkH$U!`x(K6sg7OJ1n+N-FpEGN|m>V8RLptY&Reskcs;$l0pp|XZD#9OP@)V zrBxT-iZ2r5S~IpiE~K{=F~A1)`pn)>L|1guLGN-3>^_oC!R~m(G#-gyMegVlp1)=0 zEd2q^RGT0OCis(`$Zyd}gVM4oo#{oDzo8D}PPTz(V}C9>RBT1Ncu60}UOQkVy>|;0 z`wyy`MOQ3CIPa%NPDW3P695yqS(RP+nA2o`Ry6{B>;`!7xC| z_)YO;{4gAe`o)wr#&69k$}$CF-&x*ByUV@;$$|0ijxgeZaigsM)v?b0jAg!ZhQ>ab zTHfHm>hpf%d!_t#L&5IJ8V$h>fCET^Q?5;tglv_U6 zj&xx2veORTF_+}a8cVKWeCAty6fM^*etG9bT+Z{-(%MUdA)FC`T``ZXJuN)-V~q$x z+ql;$xiK-at_L5>etLblKUp~y9)#3dTEACVs4jz|_v{9w*gE$}8RM#*cN!W!5WXa; zG6wU}Jl9j8ipm6p;}lm9tV3{552xvMqwenx-sN`j#iyjGN|d`LT-khJO;FD-C{LT# z>p7asx$|?u%Sw*G+}$HxAHT+LEpz|=)BAU`keoj`G>8bt2H^}kpxOxd2~Bec+XL!h zZlX4-9}S%0(mtr#xLAnV)b{|}{vc{&;OsnYW(#5dT2wI!RX7G<*cEU!lZZ2dXeZcR zp+Lsm*wUx35`lW5WCFhft_X@`3Is+s@f99M-AL{=6I5i*_-=h+1f9UXs)VBg2) zdA$xxP6`w0?_K+k>$qs)!``FYgxIpi>i}5wub-tTJ|z=#jj&06Rtgm_vcxA)iZ)ry zgyPfKB<(RE6;3pq4nGxtxLUv5h!K%RdcWml5&4N}=j(bE4|&)c@B8uO8=E&!+=AXt zmXe4*Z*qDBf9ZGDEoWknge}^ct9Mx&Zdk<5+AqM!OLJj-1x1s?>bJEiepo(RrErWJ z$;$2h(&L*LA{)hrbnh3sgyUxJO4MM(l`($tF{Pu3IUpr~K5$+%=>*n$v@?s=^Y6*t ztW_rLx!I0E9%Hc)`^PnPRUclzNjKxuVCSq=$;8>%nLFX@$L(bU%$k-(Y$;jhRxK`* z*}XN$_(r+}O9KYl-E{KU^sj;Z;FH1&n)71Zaal+aE7 z%U@zJ=v~Jwb{91(!3w0fWb674tp>itF+zi*+Amcr%nqu+a_-nH7GLxzH-C~6E-t&O z&iGuz8BHwEDMqRNY;TVLQ8j*qckN;~^1?Rg;~w%_s?5hraP%{<;kmRU z_9@~{={Wk}{u^A6vc5GXK_lZ2i+i%W*d%HK@R|Y|>?L79DTinFYZXEH0TF@{QI*Ds zBgiNxf_*bCe;dM_Dw2Kc3H4s4&uX^f#m>6qyex@+Hq&+5QorG@A;uqg1FZE6zm5Bx z+HYT_Z>s0HWg6ImG6QAHlDQhirj1jF)u1fm8B7PcN*4DYR4vkdjOol$sW^*FA$(P0 z1lGk&Ax$=Seh27w^CE8oaPMRP=9psQ=_e#8Myt?-NE=hJG0DhBDgO<0bBXa_6FK3H z)+%g0d<(GCDsW=n%xOA*0Ki5c}8$awmMJAloEsP;sPnNxXGJgvO$S3~xUb6Ih0sl&_y&sE zh5HzocvFoM7CHhAoGc=~E!kcjGSZ|lpZcd8{4fjI`DDjAEANpMg~}TF7?+e?NQJBC z52HF4LX=8ds6NRTw^lFSj5OOYGS1~MtZj_3oW-Id^LulAO{Z_MXEfa+8(P4efPJ{( zIW;ySlTJ*QISPA}FHF-*Na-2>^yuUbf<$PEA40#BRi6QG|LXkIN(bPn!++IbC0@9c z%Vs@&E2VJtoF*Z4H>g*Z;Fq`b9-JiESol=r5n4aj#|qpCrFXz_Kz^#n7I(d+FpOHQ zl@zzCu&Qs~sel1eT}60n8)XT+7JGh!js2PSE?8M_Km@JO=`W*j|0OtDvehf+4M(hi zqj`?oj{Oa!QCym6WlGhYk*+E-7QFPcMqif+tp=Yp1hpk`{V#H0|>Prh@y_XsP1I%-pp=wIo9#ovq+?-1VxxZFDk9O%Mrh@13Dpxs z$HyF}?rg8dkiZ>uBBe&~=j`AT$(KJ>F1i(uHLD$4YV@eBgzY!Rz`d^h8BSxdg1E3oz2LQ*k_xY*zG&ord_2OjGwG(fv?J}BTFwSLO{x|u+uJY zb+`uC=<^$zb%)6Ox9suMMEb7weoh_~n~O47y0T+3h7rnYeiO!qu*E?Rt6YLeYSn$5 z^cfNnQkw6Cp|b*zr6?&e6MxddEt(4;`UM*M9Az!uJLRqvmfvRTH$1MRA0WZsic(_a>1oZ*biG2(q2ieW#ywy@;gy zZgJh|?8L{LcEjcdwgE$5y!5wuYih3I_({X6c0V3_M}3|`Yx3B@R&Kw}{X8VTIuHt!!Fl8oh6_I@s%;wIAGX9=hU@zkxB>|G1d->dA61rz5~-2%L^kvV=4r)nU8v zxcmo*8`KC}E>Y~g=zF2(+xzZ3u>2F;kh)NL#Q9UQ6&Z>UKjgU?%4|yor2Y9^qv{A_ z7hx)_lqMu%dlBk`T&9_IYB*WDP)S}g80GU8YcA0Xt$u1$`OYW{oP^$4yeN5U%C2Z5?75*Ag53+fa1s^}!%`T8TgW3w<~{5c}zG-Zbv znJ*Q}XQ$BpXM4DBJ@UMQ-xj^b6DZ zYAQKC(id53X#FtM31O;!HvfuAY|-^}ufpP6_5x-bQXVFq00YqoepYR;L~;!?T*+XU zl3&@B(VwXA9cP!a877BW4zO!lbNWmB4M%x+#u-`oOVH!dphvJ!u*gS(H!pO>1HBb{uD$uw~JNS+JxpGLw3TF2}9|i zF~^%LWhOD)D-CS|gL5c1`F$T_l0Ntt86mo#pq!U;JT%?9d^mf1;{nq#r}mgMGv?8N zTTS`GRk+>$!&&}!hsI1PDrA$bo7cSCz3o$ok~}NxR{=)+M}J zD`zYGvikrYR6FZ09sVr+wLpg5ZKPH5+FwXkRzV*}FZYqO5s=EE794p8GclC})Iz z+kS#pRYD7~WsarObQBWGl1khak!1JBeP}R?@k%tvO|5B{;z!Ptt9YZ^;o!G}_|&@r zq?=Bwk1=ydzEvzCzX3mJ<8WW_Z28NpedrA7JFE8Cpz>8S=}xTjQZ!t0yZsFCgFwIu zh~2zW?!iBtN|DU)Qu+`Ee#;#kBl}kZjqxr0bxBTvJaHNhmf-=mg#jK8kAQjpi@p;6}w>rBFYjN<0VVF ziMWYaX%2Xboe3-{3l6Z1cLDo zq6GAxQGZe*Z)ZfUE5<*rRCu4vr9@FnMySY^z_8&V;R$NB?T@@0m0vJacXMbmK9*jUvE*YNxO zxNRLnPMuV$=`(N~H&Cs?6<6gAzZF8cH5gGQly);R&qY)9#!k@BC;ksr;(E*Ymb(zItO3-Z1>lpm zAy!gBVp1Z1lHdFG?cS;ys;o!QqkWtGNu`Dx@(5fb1&s&hGepupr|&@ezkJt!I_M;|j@d_n#(cI5nX;D(3pYI%|3h33ae+ESZbk8W;%>aT#5mS{+G0x9d#R}M!%Ew(*%G-2SxUNQ(E0;k3PQ|5Lj?Pgz@?|U0NN%fV))!Gs z6AzDIUFQ=anPy48&JX9p_`-R&wx@{3mp|_}#@9y`yDA(}3cF))Fkr7$R`>k-Zw`S! zCU+@~7{&&}`n%HHZI(1S&YZ5dL7;dHxOr=TI3P1T%oc3cW12YXs)3FNCR>8)xALI7q$P_VEW$8(&26C;=1m6=gU>JEg|CC)fa=GAyF*f zo||i3nkQw6v`Nx2miHOF8oV|ZQBe5KwvCeG&(aEQV-4ipO#2EX4M0^A0>nLl!S}7v z4kDo&fWa33G1y4s-v*~|!XvMPUm*9T;j3`Z9;4mCR>onDHA5+5C=j3in|R=#G%t2v zN|=kVJ?*9)=S0M%aVLR5yy|Z%kDR^*+6h>}V-^l~3aEly_wlVpVvE4+hp0fC6(UU=(1z zTl*IWk+`m1$}L~QIE=_Z&Z|ZI8tc`){XsCO6d8VT8ypB=<4eO%p`L+=SH?KI4{`3A zi8k#$u|Hu!a$GRPJK#V7yw_%`7B=tko*nJC21lgXRexcXx82o&0BK#rTpdG&|F;8J z(#hVQU)^dLA>0abj=7V_v8PtxWg4G9BIX%(D4)Ya_Er3vSLJP>+TwVfhI|SEz95v? zz-m2Swi&`%QQ_ENadS8s^)Wac*jX>rX#48W1NUcCs$YSdng$=nZntj7XrXm{5@?9~ z(FVT<5NiO$UVz&~|8p90?LE2Gn!&2EXdrVnm{_xyEu&5LS;W2v2^oZ>0Lgv^&cc5^ z;2m^fwnCCT;_x&BIgU~i>}5Y8t+q})vs~@M;{cR2Lw*QPXV6)|rv&SRvVk-A8Xl;p zj1z^FjcbNP_+NKw93+&<|9a2Hc|mc;EkjWP=Q1=HlkI3&UaV_YsQpa`4SDqSqC+(9 z!zm5Jj|2Gcv@e%%%WDtrM7VxfFNo1kGMy{xgLt+9c)$VKKPX0?5k#?!c+Ck#F;Vk| zs`b=c{ch(z1<~+v`GdJEswHdW+m>A=daJIXLMCN3W?}wnD`fZ-s!(q3vhM%~Z*_ZS ziw}YEw63k#_1-cr6WF;lLNZwscWmo`05>de0@gP#+lsqZ+S=6{{ zn-vh$_^J#0mWe}r1J4Vcvk$emG^2SY$A2D-3ug>%^-y zcc-eSQuF!G67t}<^3B}r;niN*@(}$)-b{hF)t198N5K0>h&O@-^)`UWwM0&He)aH0 z*k?I2eY;dgHQyjaS&k#9B3IzM$$)DAgCXfp1FS%OOonl!`kQXOU-f@0KDPkwiE*Vk z!I+e^p~DeeRjBqOqB8`qKTZS8j~Vz!vMtiLm=`NpWFzPYr4+9e(%x4Z%9t~79&n)o z&w~pshOLm{=6`#SnB%{^#|P!#-ZR*ZFkl_X4_sE=&QVr@7+1T9ro_}B(o4vD>i__I zvO-@bt?UZ5aY9%U5C;*SLAhnU7GbT}ye#cYq1qk&AeciyN%cM3=Kx4#tXD}?+bpt2 zr1Q}+#CTM>iPd1*nmo*(?tw#$nY>R}adoU|*}Xy;M^JL~A3hfcjyoXvT+lP7G7 zATIwbLB=!Sc;0ByTpM_VyF?@%nPKtnGrxz78DoyM$#WRzBaZ6IOX)RG;`^fF_AiOF znF7W7_x<|>UR@9}lr}jz>@4kif7eZ-rs-=$sf+4*s-lgcAikEM$m3ak*cw!vnY2LB zD^ua-93*1Jl@L*BgTWd_B?sMPqVd>3AVZQ9pw~92f4^k8N^@MN&obG1SHM^SNaJ~r z|Hx12q1(~0Ro0BWg~{gigFtO(l(CHbODk%UrM5bj8g&{sdrD3RbpZ`yE}N0|y1GKI z#gVT9?J6FXo}IWg?OiyamEN(j&L9(xN6$ZiR>Lnsat^~NTyo*>sBrUdgW=!q`R%Z%X{RpiY*R7;hD{UNuXKx{&sHtb+e|fO_qF72?x^UAMZ; zt7NydhlF(#=voxybhd)C79dQb9f`^PvYhGd!E0}6<-7-(+ zd#TBORCqP;8zKo+#o%A%Ew6yv8^9&j+oU}Ot1@1oAl9y~KS|^R253Nl@AAb9(kl-V zI~JlTUo%~uOLAmAdy-A=rx3SjPOyQ?X>m`;IMt+V3IBax-^f8ShM|KkgeTRA?XA?$ zbEDt&w!XG*00)+*h3ikPl0S=Dy5rHQT1`T$GQVzZRxo$ney`CyiAVk1e%WoUipfzr zF3SQCB)2ynKg%tfG8w-n3#d#g_-Fkq41MV$enC_=_|P4nwc*IPAZhGBNkkUPi4&>Y zdkJnr9Iq~Ud4zYSCRSon=Y&$t#MAa;7u(mBn`ALQjmZC8K8Vi|1RIg-L-!TnPH1kL zbSeI%_@z-*&Sd5o!nCprch=%HX~4Z<#2;km-8sxMaB_lga;tma6wRUEMV+;E$SCe6 z{MG!BH|hudU#iy8BN9V;iSF01FTDH#xa%fXX@ z`UR3837O6zxsDSfPnnXa#9UIdq7LcM;^3WyQ4jC>ucXEG_6ttz%{L@B##&DPOM1hP zJ_(9f{p`E3hXj(P=?-IX2+YFpEWOQVO|H){EWC|7*KEW`d)%1_^8M|?y~H?;$oE6u z{zxCP{xn_V^e~@AX;2-Y`ZobjTGg*D(oih8!3$^&8kKsLEM>u@vbHr+I?%&5qCwt) zI?wwC=}2sFp^+#Cc_Rq(2>f5$>^|*O${RVXd#!DF$>|qX(2UELu!%AB`9nCZe_?!U z&O}$FRYq@`Q82_-0tJY#XwePxsYpv32Itgl$pp=&rCEJWQs$-UEedt|m~;pJK*~aZ zen>44%j62#&GCjb!=er>Gcs*R#4XkQo+rq59V`<#A2)7=V;mxSz+gdQ2dv1$l;z&ejwxyyTd^6qhKRHK>GhtH+u0M zs@HhMJcM#4;U1(gSm^+hr~v(K(bj57iQ}={CVD!pd{ph`0B2Aq5zXm#!_7#PtJ(5j zQRfsa$(0Ez!-BsdnsOrFX{W;suRA(7pXoHZ%>!u3iIKfeqjb!E(&U`?(|URSUdV{( z$qBWVn2$Po+=8VU6}nFU=_<@$FOlhc4E1&3##M5Nb?&3|-BVk_PI0Y#d0FW9v629a z6Y1WXt@)aD$@u~@u4L)&vNsnJHHLd#PyEr=pPb)UTjDFjK!@BZm#4Gn~>zg*CF=)S` z0w&)7K4DF>A9D*hw|Zj|0AEIsbaDmfY07G17|s@ITqB-oJaKgQ^scf<@q7A3xe7}e zfdoeyR{HWpqRCA}KNP8GQt$}exQlzCVuHsh=sQI=`BEvnk#L96N}aOCph_#cB{Vxc zDY~q;d0bIk&(ntw$(?LigN=i|!Kw$jCb=FVc?f3D3?I$4ImyfiRsBQI7}Z?$Ii2FX zT7G8qd>e|%{Ippsl&^eIi*BAN)z%e;#B979r&3Zv4aYiJNCmrVgRvh!mQT!{RZ5Vz zV6A6BdE_LoCu~621G9~S=)=qVBe0=Rsz4@@BNk_F(L^sUTLkYf*lK|9_YQ0zED&jT zJ%<~K@W&ZznTna}H49t#2lxUBX#2`&VFw=zB}dDPZI8mk?9CZW=oMM$o6Xet-dL3v z#?H66GIaUus$C2$3SFIwU7elqL5NtwBI#I&Z%2{h%dBRwJ~eX5$gnzHJJrNVvpFfV zUQJ!YJ5mp@eV2b8y$+#jZ%ju3`8Lqc>_A3q0uPIShJ8{vKHrQJyGq|djrdT{_Zvxh zfBsiNriOX|sg4s=&MneoC|AuRhtMVH}M+IdYlWH0z_I9l8ZRP?+56u1E?0k@4~T0t2BPIU_ex%6IVNy6?r zFT1R#Wre2ZiDPA5_n)xSiejWgs8mJ>2-kH}+T(A=gmtixKAJ*9#@sR7T|n9sVrv{j zHRA#{{G%4}2hEz(hyr_*%+^CGye5O_R2lv5%llo25GA7d!^NFpAb8t_JLV?5PE`5z z{hsr=@60BW`K!TmT$#%#+ZlSe`xg~m%DDdl&Fm26P3xO7-sY=UBX#ntx_z<_5%xHfmIjNM}tol_EXk(-X#P{i%Wu4J97M{Z#@MzCk4m?ZD#j)h~tzzY+PN17*UP%C5h6M*?HP;BXA}+LQ7R zHwdoKAyAiP#@dHd+;k;`cZoy$YWVW8dU_pUD7P8Emx zVrkvd=P&K-eu_u$E+?JqcFFmV!3lJ)A8UT$XQPm?*_Fu(Z`5GY=Ri(BIDhVLt%puwT*DVoO3CW8&7xYQchb;--YJ6}~hf7!> ziQqP-h7pP#jCpsI-KLr}>cD;ig%x6g&xY8+_?aas8ANt-}?!{m={o7`ug!yDxTp_wIfVP7gZS5zErU zFB)oG@JjcAF0~N8V~FBKaNU#Wa_gkLml3ya<}2DET$R({Nd_Rh z7xgQ;X*b;3)ZGWf*HsblAI=!9soqIsI3IeMpM3N@;0r@vf}Q0ztVG+t9hk^hP(&RPRnl;{+(BUm2a=vQ{4 zhrOg}`PTr&<%U5*Qy^0d4xUZ5wl^q%6M94?LJU+2<+p$vEM2Fph9*cDGmNL>`4FI% z_kK#-Fepa)srDm8ohKWrMu@iWuYM8??@Ce2-g*j!|=WuN+F$_z%O4} zMLl(2M&b;y3tQ;iT9_V-L((A)E{d?l+A>BbKsx${t?-%WJgwQ_@XX=Mvew+$-hRWl z#CRT2Ow#Pp{Y0yF$B9o-aaL%U3f|trY_|aXd!@zTr&76boZXAUxX?#Pe6Z|Z`oAK} z|0HOWUGtFtF8AS|wSkuYQkBXJpYbVyQM( zg|K8Xchp`_Ku8`mt-vVNF=nTtF~bcEi(T&f5N}+T?X>b3H2y)L*d+7(7s?o*u~>gs z@16ek)?@Ftvi89lX~ylWI{_wdjwt5$Gf&;Gf0aT9za#VOsm_eAoh(~yF~mRm2_3!h z9UsqUaUf6Bd$`TyQfyGP^&dyp^K)jtYMdJes@DLC&tn>~vwP$Sok-n0lly^I`K zfUsVuVtnct`99U0si#Wbu__E0S!t^R-)a{e4Dd0vtaWmIx9yQBf89tmpP#GjY}uLy zkwDJeaP8Kiz%%`6)IH285aDW9XO~|bMD7a}29SCIfB#R(2CT$z&wSP!B?Wu-+Q?-3_j}sA`BoM1Ji+KfitiSu5uOvb6UQ~_USAW($J+4 zvi@!a1sWZqKJE}gE6xUzzNQV5ADlvp)@|c|sRYqJTP5x`AUTt{tRr zidwlwR>vwZb6pIT#Tl8(lE^HchSll|6hg7$;`UHem5tHrN55I7Y1Hz^vTP{4l7=c| zO3$A3J~FUve4kmi)zPvS|Lf6*A`IVESkGvJ_!wxAQCL0Y65=LXZnM=*LH-1BL?)B= zlFBU@`7camoln{`xx)!l?4_V*eGEPv3Az8Jpy$t3Hh{@SJ)1E^xJ`QIX%?v8SRtw$8fEA6b2|5NVV{4)LS#KwaUS>|<1l1>@ zHAuIq7zSdVatBj^z*m7nHD6pTM$B5_}jt%rsC`aCD(J9Fs^2(d+A3-DA!_r68B~16+B$f=sZ`L8xy67Y%>%w%7DgAwDZMF2bqqBIwD0_LU*>i%;5Ykp_l3Rb=UiRhxu#ooZqeDF=+j%GXCrBUV{#_zez$r$`heJi2u-HQ?+$ z3qwsC2-Bt(yI~O^5+x`(s|cWKs%2nlv?b?@^QHIfUl36+^oL`pm#oD<7b1(FfPUPp zehoVz;tvh=4gSXob&VHuJGAd=1$B%eoUy;zC>>fK#Q0FHzMAX$>>v`8vzviZQ-iLo zxEK8A=17^sk<#!G90EicM`fCN?OifPHLzZQ7_NuwNAGV zW0CKVug8TZkIQjf7T&Oeo?%%>)9CiQX;T&i0Q`pLMlx9ke*xNsw0oL@Ux#NJIsEtV z9F5RkR?+Y;Yw{H8DS~ojj8Xp%M6?XW_j=QeNy!7Ml!B8lDxt9EABY!WUtl2GIgnbj z&9FoM_U$(E@$=!qI2lApx|YmQ*n*aGDke118_c0-Rstn^Lgxdne0f0*4vEETbkpV7 zE6lj)Tt;~jc*2>5$_MC*s|KX|#hs7@lTOzb*esdgyS!gldv&{NE*nY8b>4n(Mf>HP zbY0Vyv(7m#geLM2Fja^-Q#+TIHSUE(N8<$MObZ_0%`1h5$@uXj+caa51iA%cL{ z`+rX4(1@tX#hunqy4`lf@;};&W<9^{J^guYK<+C+QU;DvAf@nnl$OEO!d3=AV1AAI z%)Kfu#Nd@yAQwwg@prbc(Hz ziIlicrjN4e>NZIHWK;&Pqte!N``tDev}}pc{-TvxFd`-W23Sh~QB(31qj$m=1q2#N zMZ`qR?xl+Qw$gwT;rxD<5`v;pDSbFSVyIa6vk=KxZX6w*QJWKHu6zpL@BDTU9qf-F z9BB{H*f1;hlr6NugU&WSi0~fj-Lo4$YA=2==1z=tDp{gFAp|w4ao%uz|;VcjKb~&1_in>~#=p&gL6SGQ> z1;!@@p>ARF#B~^7AVHw7|Ml4cJdTomo!-o67_#)6BdNWsWRs2xMi|C3x>*cFYHj5f z?X(+PH2Kv?r$j1`&+;+X+6XgZ?4eA0ecejRu-~1}kk4DB%;?o06?cgq->U@@3;#e9zU?wXlsq^1D@}d3Me8&q z0NYciXX`aK%>5v;jDg7gnAEB8cJMa@i;#Tqe<-s#->XUj?XQf6ZjbJ#^bK69Epz@v z3krEoWBIntvzD+Q72~t?yDPVj>nh1lNRaePiz?<5t7RS~dXL*^=|8hwT`GUYt=99z z`JGjFAmg8B(b@8aAe9*Iq$H$dcw|^wj>#~l+9$)aCvHvbQtjyKkn=d2Bx7O~0yMqB zAF=@sOape7_D}9Kryes?>i2bFH@R`p8q^RV4kPI7Ex0Q|!1>}p*8gd%`D`xqPT{wS z!l4;OJGZsa-0Xb;_Wx+BF|xT`&XuG))rrNTv2R?GlwXqY_!j$(13vlG&!uuMt~qPH zcF#TY?jF0$9AFK9_m0%j#K^+l#0gZMsO_7v|Gf*#Ihi)Tn+TRQpp4@6>=LkyqRx*s z%~nTZbm_#Eqw7aLz%-l^AOv1FK#1_4z4X%}g?zPJPRmAOwP3tBZMcx9Mf!GmTe4pe zG)|8=T`uYdW@72e$)?H4 zSHaH7@Sqo`saDJd5N&mk}q5 z8{w`6%hiWbE>EoCtS!C*U3(&NNws_$nzViDz}o+n^ciLDQ(0PydaPD_T54>HMr=u% zwpKdil+($|Hjy(70?8M*tcOe&O<@nusrD^d7WR^rVGs$1*f$I_`UOA09En#&BA)X-9RBefBt zX?A*4)l^>yUEfp@Dd?}nqa_C^swry5e#?SkJErnYx>A>Tm* zV-ym#F)*jwu-ILA>?|?7MLm?=IAn(^Y6?5aXweV&KC`tmhvEroOX7v1o@5NA?z+A6 zHJ=i@W~y|0X{}WYule`JteCpNVFbp;5GEoy$8y4>y_cAV1@GCY%*|YM(4BAs)$aB_ zHYIjaCp;+IEL{!%3V|r4NdLFEX7k=2ZA0!T&(2BeaYWrmX5+wBrMh*_CXz4or-m>^d$ z+2V!=eX@I>3FwlG2fYE>NiCPeI1(r(GB#?`WAG~`P?c^J`0ne^Sizcl%7Lew?_-xp zH1!q7HW`(-bfDBI#ON(p|3n~g(H?V&bB7ez+SU?>3%hQey52Sxfdsg_nf~O?Y>x!Y zeDcnt%nL)>l$Gj_gT^z-kCpu#C;gQn?vh~wGeuq&^F5pVjNF*qh`iW0NO-j!W9po* zSSpFe+k5_^;NejEYAYa>+A`=B@7`nEKez|9^%HwT`D}Rjw;;HsN27%|4>4~NToEdd&WZ@Wpf;vS}$B+)_ah_1uF5_ zn2^ri@oUV6rKCj0j9L!mA`_E@rTj4xaUw_lK^djxs?Gh(d(HF8Wp6w5Ve5QYuD>Q_ z8(Jy00YhoVUoFyojO)``SLl`Zk;ER#h^3E%gW1LH)TiCk{=Lwmzgzo!y(9 z^+T9vKws`3?_tP`){zPR@Q~4WTwV}te=m1Plfy#T+!WTm@umJRWNoG2ltpcuTmV;; z$fKd|+=ydcP=j5zXN!pq&dHH@b`$AtanFnH`zLL)ZLR4yw#TKMY!);^^)%pyTkX4Dnm4WR#vc( zxh-M&6`hjmn9!8*xr7^fI(Djy@G~3`ICri0Dx60cZLGne)dyk((vvW#qDZIq(`;~| z8@k<7({ia0%Lhzx@9pXAr;iqiXFx;|2!ZDbu0AZD*RbfrJUhbs>R;9cx__bXbTf!$ zJOa1ZxozyNOCnTP#^85XVLpw+_8)l`fPb@N^gbvFx)hTePe#t7`^CWq5MK6-#uLO& z@&`b6LqD(whW~Cmc0l)Z@-h`n_;e_A)vom+XiIS-M_Mtu@?70Gh|IiE7q<@wOFRQP zt-&VzocyF{H|{4QMUNdCaR*FZ97{^&F@q-$S&E2F;_5Q1wb-BY@k>R*txR{9KYP>9 z*8@+YRE1qflNY#PW-3Xx)ktIvF}rcbDK)>7op0+^BOc9nCim|LyK!=QO=R!0mDMiP zgLYxvQXHE%_gQM%cxyqfa~!`E(rt09?n)9;m93}Ra7l1Bc}X}E#9OZovhxrS_qu9G z-oWhL>M9b1Swyc)R_$NBvkAl&#U(5!@4k83wJrB3Y-Y2WFI#hh$oW{?*@~QrF8a~b&K+kfF5$3m}XcU zRa#S2DbEmM$1mM$WMcj0nY7)9u>Kjxn@&dcRQ773@Zf4Z52)l)w?qUoDeBo66Ux|WfFo$6X1Lt0%!D<*ijOUWT=53n1i*ktOsuCem`E6JwpZq+Oc5(je#p~S{M)oZ7wZT6!cT8-0x z1xn0Kg4UtGPy!hxok`t#vQ(vf+V|Wwq;(qlG8J4R;Gu=|fksvLOQ-i6gI@IAad%(~ zfjXx&qF+y3oE@xOolux)>B}~hJWblVxRMCgiL4hu9oy+IqKkE`V_|^kIl4+3QV3H_ zYT~^$1$M516B=bIDWzqC_&c#q;RsS}?6KqHMm*Lhj^mLSxjbLe?&rYZ4BMQxHG>U+ z8>_O)Sq`b2ntcq~;yj7-qJOY-;@cEB{rKwairjq@M|Ru`P1fRBh< z)NzarZ*o`k3V+wkQg@G9Vu)9@QRxALt~4Pm%TgMR3N$u{y{9H4Y-~KWl~G zNuk1nKlRChKOGxOOG|0QrLi;OXKTvpLjbMxplv3NyW5X0<+DLC+KLhDbca4fk*+w?ZbKvwID$3v!?3LGA+uT z!UFSN)|&mJtp21Z8v;^Sv;(PYg02-zLJ-e4H_Y+O0Zq|?phADM8=ll?TvjuhyXQF< zu8PN)ROc@;Ef#vx!PB#cmrfN`3946S-)GzXAryShgP=$xLz(Jq7}|~qdVec4>TAyE z^`VvVk{;c>x%G&3=93htO`YKbhhr;4|F?d)#=j+K%Z3EG^wMTOfrhV-n21>Yu`S+T zeiE!lGC^#&a!9JNX`X$P{NgOlPfpZa1MT!2ivC3zfl6>j~0Xp=A}sIM`F zh;6fXUpEz#WUI*ep2^WsZfaxFMXEw)!^-N$S-{e~NwRsnxt<_71$)MPvg-?nR_T2G z+h{U7%>uL{$E>7-LlStE(U{{H(#RQ4S&uOOSxSOH3xVwKB zLzEvo#B2Y$^B_ACRd0c3jktf*N)4}?l#-N?s?$ws@`vXxgr?)`cKPhyFS~gX0iK*T zK#nYytM?S_2aqWpnH-y>qcX+bEViuwEtAuSCzOL+9wW;E$Jigv;m37 zgjhMC-xW1v{1lL>C}?9Z+Y{^*`HG2FP)>7X2uO;5VugE}#IF6jGMW@dF1%Z5Ov5&g zeAfCLq+Nb5gf79;CA1&ULc)jDw|Y#V%xOZnSvu|J{Ihu z->I33=@vjE&oPXxs1YaC9rJ*!(PtH|876%dqOP6|LByb$+E5Y-sWJ6kao;w}`J>=F z^4}it11J55+?KpBYRpF_wau;rHt$#4-|TD&;>+X&3H?Nnv1R&}$0Qa}POJJGojOLe z7~4Sk`lqB@uCXKwD}46iPSWCc-DJ zRhjUuJB#vz76M#4+%Z(@#90^JhjmjEuAM2M~r2eUp7vWHIiJs7}Y* zt|KfU#y04vmQV;caE7{#U7957vyM++CdMz4Dd;7s>5^{@hO(c2_`U74nL2_q)L3H2 zWzml@q zszgfm@M=qgp8cx!EnkPkqg_&)tB-Hhu`cp&{sR=IwWq+ZKK2i%pBB!T1Frl@7(Me{ zC$H9Sk^=iK(=CPPW@iMCc-KrxC;?KiqfcaygW}=2FwZb{)7u{|oam^~E?8rwgf1zf z(3uUADRnoVo8~b*kE?`}&UzVd`j%z-RuqJON=DfWxdaHhEK!b5%DPbZoL*?Oz+{in z_4yR%c(;asO*p&rWM|GWtAa#~AxFtOHaXTVaot+MIFLBBX`mdti67L)6fe{6IN6kFNaWL=r^TtxdU;RxZl-wbjiz`1ksGqlcXb3>}dYF8lbahW_6AjTC1aCZOw)3RKOl6l9^AGq~lZnicLEBqOu?^vH2p0&~3B1^kzBV2N5CR`QC5HYf zN)6`=*`(IFherAX1jEwjcJHUm>8W2 z>{DK3*HASRJmCWk;&Tm_ZH1B#sa6L4O=;gnC?ZbIX{sbeF@gu;*-t<3nupw~LPzjU z{UZ2f9I*!JMqtm^Gwp3;PZVC763$Ojda6-#{3oAw7^B}u1uDpB;INK&j%cpEru<;W zB9J?@P>{_=V%FK!^!wc6$$71`j74l;!SbrG(ul%o9n;!;5Arj5Ti3zt@SL3`ZvnXb zv5PIwGl8&xH?odrV~@&et{1@oQ3eL>JYIQv`7kTfC`C;!)d1G=v7vo4_z$ht5_N7Et@d{L^Pu5wd}O&a9w(}jm^Rgp}G8i z+0d}QP(z~ET?8)m+|6&R={S8=5KTqbC7TxFuk36y)Q>XU^aU7!$Ye0NKl=AGJ$Rk5 zIBA*5OeWAx#5KkkzV8S!_J~)+2Th3AQqWYN;5%s-am2TQA3u9CM6)OHbbmGQnH*u6 z&ryHk6moNhxbo9fF5Ini*_zUspxY^aLuBWn&5XX>1)2=|5m61H8Vy{m5oW?ATnJ&*sb+7_FK? ze_&m5>_VhDB$ZpvW+A-o9cB#t} z|2M1L$Xn_81n5C}^7HTmJ$;pA6_P&J{MlJNu)Y#S)LiAHW#^+3w4WYL=CpDbONoxX zxxM%ZHBYrHWk_}MD=$tX&(G3kZ=?lc^RdFD@E^HCpxu^FUBg(8jp3B^J(GfO@j2KvxHw83qy7|G z%m$55)s7gd^5E-C4e!1VjsPB5M{3L2jXB?}s+lYHcZHegI6$nd&~Te@UoHuOi*BSY z!?XL*!z38h7sr<&_<9CCIClgy_&0lSY(y_QG}d2I1y==u;1S;7SCI1NQ*dqoAOs$2 zt*m7Ei9?aHj!U43k&Rh5M@K+ks3V(JAcdhWm$ai;v}=HBbzqwACkrhreKg5!;tTrB$GtEiC_ocOC*{4R#jrcNmh6oOmO^LIYW(B|R*lznB;-U4T5}55 zF~C3t32k!SlNl$NXqrf=y2z857pQK|Wn|dluOKldKx{^)`KyU7~k# z=UEW#s;SS7Ho*N6H~H7=(c|tnr;Z*u)A-)DKJ)EXH2BxwWFe;nx}po(RjycibUaeh zLS=JoNw{eLsxe*-VPx^M2?uwdsus2%l6?GCs-c6tnEu5W?v}z}@tVSSVt9x^{GQ2% zJ*w$}9CPYQiQg)uf4b#(cmFurp6SY!hC;;KIXhYY#t`B2ULkQ)NCm}Ud3{WOSb0qr z%$aJ!?1 zh!~*`d0T(;*Tl}Le%wQ!>^YXr7NoIhXwB-0@;6bX4N>16lqL=*Y7v#6)TYPq^&lxE zJq;vXZ7mIYdU7Y(Rg9yk`|QqkBm2Tx$MvoH*x@y@f2q7!&Pbb4;VAvK>6C+fCaU1R zA31K9*m30J(HskdI!R_`J??p*GpqL&Dm%*11r5gOn)8curN#-y_87V-&rxS2ufR{p z9~uo{&ymZ;#8t~B!%Y(|Fu-w8(?m%m42|G&kuNVvn@GsJ2YGa!1=CNzaE3NV%#u{M zF)V(2Nl4y#d`o+Sjdo$5o4Wv(w(g&&B?&%t_fa2efhi&8Qg66*bEd;)(O&v6YpqTt zN}=YAqktnq@id6{tD|68j_z5HtH*DW18aBbbZ~p{?coWVXv@gV^3T#{#&UiK$ylpC zM#(@0$osFcc2omK4rUuOKR=$Rv2@^bw_q6FtaMG4XwMTwnu)lNv zKBf`y392@aLdo!5!3gm{N$Jub5f+-;rALm7gSp|Pv*F_Z2ZNEWbZfMWSe| z<+KZn_e~)vRlgrU$n#?@!m9A8Km2IIJHNGp^}yU9J7%yBA8ZE{Vh;VgM2{Xxkrjj> zcr2M%5Ji+Mm{^8sPY7e(jUHdti9RB7`1fwN;W?s5iIO1p|4{bUL2+#D-ss@&?hxGF zC3tXmcb8xxxF@&`?(PySxVvj0gg|f&9^7uT_kPda=ljm7TlYVzn40Ncz4}>?{3O(6 zk7p<6TcMmQJ6#&NPvt;Pq|ZB=Lu$~G8rZ`zV*QHbYpI5QMVKfpS|$TM6Vq>Sy_yC` zVQlPLFq<5<3x>w~nEe?Y&*sZVe6gDkvq!!k5B;v-A|F`Aj$i_@fWG#SUyP3gr~MaG zIl06jFFCXN)}ZvdI@8FoRw=s-uln@-^aQbtFxAB3a@|PPj5?RZ^x}Ley~tKTCSJFm zKAcCMOSVx)oo+;lb&>bAjV?POzr-lZv1|Iyj`u24;%!@7K@ zLl{8LdRYUZ@ogsV)k5ma2%b1mmc5dxm**AI$ci0ionLUmS4SSZnQqBA0*^jBnfr)v zYm;h@N@9ioK0T~T-q7&YCgdoZ`^r>tTdn5zM&fU+d{mAO#)6p1jHVo%{%Q5=6`w$D zmyR8wtl!XqIKV~y3y}Ih%{N~`6&&xbJ(;%21wi}?ft2qd7|JQJp#ImvWRgAc%{pWq z(d$407+v(MTP0AXjCSiXp}PHik0I}C@5|S;X|Vh_`ZoOv^g|ov&f)VjfIb5bhcNqo zw|`DMTRoKhsU|q7jtbri{x!&d<^D71}c|9kJ}&hhfh#tzV--OCM31*C9*I zfzyZOh+zeNl8)HX#KywGjIgq{7-a4=Wu0Y?04n&7U~&jm4~Sm+Eo|TqrjYs?h9YM`-Yo+ zkh5g&aMlfxiIm^lp0qIv_5JKJAxV^uP_v4~b>iM`figk^mA#wQ2aA1f{|D4&&9x#X zLEoFwGe6baA8l*3tjvD8VQ+CApCCV6k5ZHnn*t0RyI)@cavq$iQ1+qR{Ut&&HtM;{ zZaX^NSo| zT%VM{`EL7FZ-x~$qH=I&Go7QAuyA0TnmNeT@{-~6H3Dg?nY+Qk8*X`7iaQH#xEO;_ zgE!W~upB#_xm$t5C2xzPNY8}V80?SUue>wv7Ri=g(U=0{OW;1sUo5_X<5Ds!1@c zU(OT^nn0u&`u~(D;-9eP>ckAXaUC$ZGMo94m;9|yrZkIFt4%isOUbB}t!`CgjO0Ca z1D!Q{l|@tHcu}brbxhELL-i%8HSNO0#H?{~pK`&tg))x6JmpI)L5}|D=_%z3Ce|Ir zu1eQBYW@I@YR~6*aW?I*%-2dUGGD5RZ#aJ0yX2y8!g%mL!MGpOH0yAfyI!~w z>8ZTw6y|$7?M5fKGhf8@lU8VOk?2=!$}OGr=nl$7!V|Jc{`l-` zjQ?i?nR>^!L+mZ&RG0)S)yu9!WFH(qyY4>IeEKQz5m;5h%CvR>)zN}4jlL9*_-Pyc4HF7fM5Lj=?|Uex zb--L2BM7mA1~Ht*jBbruFyB*38ywR-r9>d?Z8^y5GyvsVhNW3)&!hxbi|Fkb;=yjI zK{HGhvlLs=V?N;*vLdd$El%|KCwr`u-C$|z<}^gz87bLq>qoaJ|5h>=g&m(Pb@7Ow z;R^mAdea@MU!gMZ^vAq%SyfiB2w$$E3q3x)BjSAjc?rAbPvq}SvXw?n^<&70aA1uy zhdskR`=N&>+wqmzl|{xY*dit^F5I+adoLyukyjTwHs=Z!f+rwXIvz)99BM&Hq8Oid zprSN^X!dV@OkZJwPYuroiGJ$mI@M8C)tsX9zrlKLWCe=Bg`H1vTRDaOI!P4g{%-P7 zvIL(Gp&|h2(|?PIl6O{Tm&?`JM>yYdd4A$CcRy6m{v8n+jHHYt;ag1@dmVB4Zv?5R zzr-lLMnv93Lb6S`A~xWQTtP7}Q537>U+`fNw4~I;mDQz$*}-Bk_+UDiVK67G8yFo0 z2kZog3qcFsfprJFA(Dd0;9tOqh#24m1Z*%r0y3BZffHN;=MOeRAOWMpQi1moUjNq$ zE`^l>=OWXB;}B`V4~SggMnpmg#0F+0BbfOVN|Rm4K!D2LUU?>F+AqW-c9bk~^ zmzP4y#i3Ap(*bOi^uL3beq6TeZhDR}f%o2_smjmPv!)!CckXx{|!+ym!rkI!+ z%3&TzsnSWx;o*d)DLm7JOook0GQ)QT$M31UKNyNp-cUOeBSvZy%)0d33+VutPQOFs zbpA~u7L5rVM{eA+W>^nt1eqGxoF?`O-xS&xq5$6FLNM80Kxx}0Zrv{d2?1R9mY+-s zZeISyj7`w3O^e286@I;ea4@(nU0LC4BF$7d;GYxx9_v>Q6Om&3VUJ?qpcr z+tYp<5zjPJx|7yA_3nM5j7YS$!X)0#CRxQJG|i_}(r3_@_qw_EK|t(X8TN>D>zkbH ziY7~kAj^WjKY~dFj!Z!D8$`l@DRzNtr94@nzW;HJW{2RH8ywc+I||{PcKn z1U^=b4HDtLfWSf5S4kWD@qDK+|#r&M2jXV_MlUwDDg3#F1yKK^~d$Q{w zA|3z{DD%%bAHq>6lQ~6QjKxEnt9-cosGTy3O+R(swW|j3 z#trOHGFP_6`C)PzRDbnqqfii2_4h~Uk8N1$i);+w@~zJ4GSeSpIUvJmxG5-`nVcAx zXEuB9sx^IP$TV$j_MuU6+{9eec#m7PtZkyBYGE4_mi}m|l~?G_kjlA9q}IRx`F0lJ zm>Fc6&)4rf4#?JIPTpnu^%L%nt}#V|-E{we*d$;C4`4n4s|cYBD)~FnEBIeLK^=MC zTsy-3mrwJR2_4@-RkOo(otS(2jY1J5Th{w6>uFUuke$pz*&h z3$T90ig3l$&#AMuLtn$<$Et^LP`i!&i;Q1@a)tY*CIcy#B%=21nc0nBcRfRFwzb$}3;RHcljp4WslMTRXflMDr;*ddK zB4ppaeEF{SW0I@`WaAZ1OYGN6`G<5e%gw*k9%Tz*xQ39Z?wW?hBZ@TYs>z8%Lg(Im>Z~#2ZFwihMntt*}^kVe>!O`-9gsj}m%(T>kJpB@t4DGB0ourEL zyi9HEqP)#bLgLL$0%)z_@}kYWf#j4?7?AW3p7SY0Jn~^t}Ljt zlCQ;{*Klc3H4((|WAt4FJ6x3Hr#F@^*V#Wn$FW6* zk>N$E1=`C~*InA`Yz-OF@)TZNeWzPdf*soT*UYM)mDlK)i+jh%9KBZb*VX8SlT+?+ z7F6{k=&X^@0HdQfwe|!d&x&+A&+z$A=2czUITWc~C}+IR!oRSD9(mxtD_?nooURbb z(D^Y8T3Cs;SMG-J&Y{>g4XV>IfXp&Z{x$i6xydTHxhq>S2`Qw@$fBSHwat>Rn3xKU z{S@hv&{A%q|8}GZtpGoi!AIjbES7~rNTPfC8y&23jg18>uGa3XCNS~FY4JBr#=EEp zI8I#)ELaItFRDEfB5=Wlb@vkNugb^!zPa^M(mr{Xv(|6*Kc_J5jKY4o$zCDZ%;Apm zz4<66u2JWte`5HYukxe&c$%@$S9I-Kiwsh+W`}b(e(7g!?U&v9z_;ry#&CCidCwr! zMxDhUqE<3%mD;dOC9X0(3R%tUb> z=$paXox21d3Ljk&Ir`aIF`XoWQ|U`rRx;XzqA_zmVP7)FR}&|?lmww*n$7On5^C&_ zN%d~EbY2#$NZq~pgB(Rij8!|b@im8e|ImwC7*Mx{{edkLFW|D~ewMOwUTp32-o;38Zm=TK;W_!fcMfZ(Yp&0_iao69B>Zl*<7PCoY;H> zzqd8Ll;7QP+WjCOAV4ZIK$a1!D*37d_^QJZ{F-w5DYN?&+R|qSvrA8}BYgTm!zF5; zM@4LWvi{s{tZlU~`)P{16Z}0&g0>p>{HNDNAG->=d9j$Pu^zuR`DZcvb0g@4D*WhP z9_yLbKo(@aKc$V?1)Z^$VK)jJKoSA6%9n zHr3*~DH@DGg_lxenjdjWeh`@ORrLw9b*kX|s#%>p^!eM3xX65w1>1mpOnp0@ zmf08LH{9LM%AGe*g#_&tD7Ga!?1{BO5vuuYW@fy2q80lgA>lcb((PYO`BSkQ_!1FH zFvFoNYVbMW{vedlv74rt>~lN$H7|YkSI1gC)()unnQEnM?|d^}ncO9$A(E=~u-vx4 zm4#L0fVK`ozVR>|nhC%I87?{$un=a;ZALIQ zQv}VZ4?t7YaTa6aB)g%K`_L>T%}PRvApIQbti2GpBqBOzaDE#6Q>K`cvPPO(y<=ou zBH^h1R-VK`hMh{rwX{*K;E!dw`B^uNO?bDs&d-3|j5y4Q0lW!4nW?|)AjMbZmA^?t zT#v{w(d^!UnMo2wA|gPQB>lD4+x!B6U<~Mm>T}TFl+(e7HtG?ap;qyX3Nmt`*W(C& z>kSd34(28;PEzNhClTUD7ii_nZxjpST4eh<-0t!GID=NdPZfWM? z^CtDu!ij;B_XS~x=Oa}Sx`R{kHv4`Y%>2h3Bo_Cbm3=SEw>8dk@bRyYd*WY}8lgx# zlldz>(!}JG%m;`N2eUgPhaT-7qHNv7;RuqcP-!p6&L{*rOsR!M$fEV283Jmf@2#i= z;szr=@Oh9B!M#1~1U>5}*Lk>eMJ`H^H|Gw9YrM}U)F&6SYYO%?7ixNj&ORv2&I+Xl z>g{sJRZxPqGZ%S{YHz-(UEn`@nkGHq^lh@^8r(4@$oN7yeUNMVzaS$YUA#?UE+;CU z81$idsCPTe`8b=5*3e6U)_!-W>F~0>snn0Rgk4(7#&yh=sej_amwi+<_N{hz0Nnk8 z$i*KO@7AB$)m*kKW}kf$$aKsV^A0&K>(#*W_(fI5duwOgo(Ub_?mO;L9=6`mHZ}vu zu@-?t;H-xIFU$yL02RxsbE;=$r=LvGe%!!)za|nPtra5#sF4)eVG|>G#|r>B#0nzz ziQ1>=TxZRNuBGVo(&Ohaw^k7Hp)u;+)NU=jKQrqF*=ZTV}0m&V>ke zrWT*Xi4jWrWUHS8io8^gA7j(=q)a2^O)B=eN5mp(T--4 zw`Y;y*rG}Atdv6v!rS9X|gSPemmx`+(^5Ms|$24HP=c`*eMz*=Pl z2DDS6p7$FXOadf_|LSQ@6ggwR<&`CR(#dIS%Ni!lj7Fk=?P=QBos049ep5Gc7mn4I zLU~5u$?Ewl#p8(gsv?3*oT$K9Lfa|*lMPpoGy9vH!fy-eyB+Y=oS=!9t&c~pUrcGi znCxl|Z1h7=;3?*h4dyHkkl;f$B(OP)dV>YKG$go-1_K<$f!;vKB@55Jft9-su?Yzz zU*qSwe*Fd|lkd{12xu$o%Ai1kVK4*MjjvRcUbkeQeoZY9@&gnZpp~Ei{NTUqdu_{$ z`2^#a=ODbY)UJtK6Wextg1;`h=?%ewrNhrEFrqxnI$K8a8C)+b5c&k`^&7g0=d~#OE4hd6iIkIv^FoH6Yn6i>C7oKw zOsQE%KiOLC^dEOC>4y_r2s9%x1-C_>CbxQFQ=3j%6zuom;?E3e3ZXUTwV4|^|M0hj z!x;w1EYANa0~rftf`0~sADC}MWPYeG)L+J4tp3m&zW<9Dw$FeX45+K?094)SXJ9Gq ztuRIp>mzx85J5(*(ctImQ<#}EIp?E-I%<&m>{fxnWBX`Fs#ox=bhnc<2(KOLa1Y8J zSd@Q}k{>G0w;^gT6=aOwE+^c1l=!ut!zMU>#fC}6F8dvS4@u92TtpNbt-JGGzzWO@ z;r2vMhzDrr1Dz)y!^U!(e$=2*IB2SGkC4HS*^bE?Ts_E&)G)$N(F<9@3k7CR+tCG& zkCDJ-eU> zZ9oS8rvQ6_1D+(nHYkfMkXp+6g^DR&*2J(WRUj1Wwg?np(hz79Xohwn(LmwuGx;3p z7rY}~88ZPQRDf1EflU_%e$)w+@Sj1%2jm(W*Fv*;$&`eJT1P!{)O@c(;MRHmr(6H; z^(pGfrF(Z^ODI%%|9fjBStNwY)W1EG?dG;h>OFNSe=zGK5$Cdr1ba8>Tp}2(cE@6QHL8`Xc|nvvuJh zYkm`H!mq;w%2w7WlJ9W|fDQE>`)*nOLQ%gxKyBr_IA?F4vOj9(-$Iks&vD4T3s01V z%)!Ga_0~4FJu@1UxNpuKUis^p3EfPd{gla*+8S~2kRZlfST(>97dY_$+C49Db#PyL zAi<~ro#a+xWwXK(Vv0Q@AFN*g@YrbxQhxD32U&LjTCV!N4LSB9B8(u!V@Ne1x&XKF z-=d4}p<}`PCQbg>a6KfcyRYE_Ll`?%!!t=VVI z4jErKF`VNadcr6?Aik0JDYS=AK|_>ZpFuCwhHdi8%MTg?;%_9}7k^0XT%#{f^6ch!T~j$<04mTd5PPxy$LB|(M*Plh7Z`7~k3PoP0%7beAVN(b0(Eo@ z(*x{J;LP~!CLt(a77K0#GTAOQ~*|h7=Wbm98q7|Yv~y) zuLMYMfL?27!gAoH50#}7H#x%)Iv$JD+g0I5ly!$xQTQm6 z!qEFhrBJ7}a!&VhEEe->eHGtpJ@K<2U21O@eqio77$i-^f)Q`-<^_C@FW|Z5KcDhY zIT!am%pP8Q0dQ)=3;A;S2heeqx&3zxp?qnLa*}uH>dy%(hHCtl9ldFtS?^I$f`tEQ zt|QwbRYqHXM30VwmcC{7AUQ;X0%<$!^M`br00brQYpWOg(=5a0x->Klo@)jyjCsaa z^2h=@TV`?FK_nw|s&r&W8z+SlJ#E8wEX37&M7dt=_s3JbXYB5C@(vx?c&6)Fr*BgO zXp}Ec&xf@f{4`kvn>dCJk_s|o1LF<36%gy;5F3Q43ri(Tu)bhOuhiD#s99C9Qbau>0r@!1W%c~wxWki zj|Q386-unyf`gu1?Z#ki{c!(r|BHse8m7f^_f`232f9xk$j-f7{6p=ROf>SX#aRce z@stA%gw?}_NXx_C&)}{H&5ks|Rn`iFuVk(zA=MdTU1|M4oy49(>MA*d%%4cwNtsqz zr&xMF;A^s>V!6$RQavS~cd*TeTQC)-l6wRP8KZ{##fgeEX$|Dyk%tRHYCrS5(`Jx; z0q4AXcN~tB+nPj2z zZ1HjG`EQ+&Uu$u2)yRu&lHkMTWtDJVgtCy3eC*Sya&aC=#ehPlLjEAV-j~b3#oJkb ziSyarVU1lZSaPb8O^9HiOYBo~tL4(K1;MkrnOHCpJgN^94N`=F^VvoV$p<3b%HZ-y zYf!RFJ$2!Lg_m^tCb67_=_ar%NHW!64pK zx5C^@%SyM2p3fytWSQBAZDY6WZ+{pf!et{678a(i`9E~d9KVfZENn;n!a$LiscOso zWp%bB&#K7Gl4CG{Jr09I&n%by7(u^+YQ{R_PCl5dlNA)N6~3{Fe2((|9J&4*?;I~% zh#>rL-0;}Z({%N;z?w)?_8g%YDHxFPJ7r1dKxII-blYL?=S)vujlO|el5P(Sh{h4R z8xX7)`#-|=!s+SM^A=xPiZa7}?^Zm@<5uk7ga6U8r)S0+u*22Bwlv;17tcTwg12br z#48(EH$bi_I6gZllCQr_u@V*4>&Hpfb(g0?diMxZ8-Fr&g|*kbYjo?p&~i3CN&>zk zPN9XVT>G(6&+(5RaWCDhc_q$vTMA{)*5T)-^b^tf_Si_7xid^f^t=e9ORhe)fTdP4TxpNinCG*%@oz;Ehq!}npf zLSxA7Qve`=&=`|hL08n3Fpp<>c5YWY6p=;8!>sQVheenXcDK21eop)4#v$&T( z#4Y6Q_%h9v$?dl9L-9!d|mRz*Y^J zSegJ>tsYp0c8Q2j08IcVm;KgOHBYd zFN5P?`SZh3sdm!s=Kb?{6XM3s-rYGydt8yN;*1rc!OTi33Y`*1enK15!6-f!p)Vyy zm^b3R&uPMk_6E8@yRvwLBH@cmxrgeUWfkb`D8}z91|U~e%%p_G&9Ln zs0$`&{JNXOF10kG>W*FIJOQVLobQF~8_#@5shk4CUBEK5qr#Ss?N^+qsI=%K$4y}> zS`bZ}Om-wdV{r1A9rm&B;nt$fBWTHQhN4P;aX?Sd3)sjoztO-5XBJJnX^_z@(B{oOjGh0I_wsZFL@Y! z`4rHPV71$*P%}!Kc2(ropw1D6?T&<875{^SOS3L%D051qxK8hey~!59n{IwY&DQp;r~x@;Trka3&`5AmbF}O%_5T znvUw2GkIA=P!Q1kA|36RfL1GOUFlp|RTnVnYH}#%0(&DduBEgjqlTvnMgxY2Wb?}_ zd_F^t<%pkMOqt%dlLoQj7gq${5hpTfVB!O+D)q_QL=fXU@CNkU+tPx?oy21KY|;S; zNIx`=I7um!#yYs-i);~>=aGC5KkX&Y*@x?k+FFwf9u_3gBw%nM2Zobxe>Yk1cBxJ1R3>^B?1@Ay+gJVHTe-Bco`jRW0!{w>_Qa6zxH zYyW+MSDyt=SUi9*4SVd+06?XUk8i?)2ey9?{Lu(YS_od~NLuLFo>oSBv_8oknpmFV(OkFXf{WgMP$u2(UvnDeYQhAcJC#=w$5N zfITtNk?R$FJoHEdBxw@RwEvsgyR~mS9f$r|?ONoE%TX;4)1jF%!#{K?IwhEj(Ggab zS;cA@MHXg=i%3rV4rOe-@2pC{0YYGkrO^;t{~vKj9#Ews#ZoJff@_ZcW4W-Vj<2e3 zRqUHX9tp4dn|!FWAg@y&FPn!erNoAJ*aVIs%W{)Kz@86?gu`z^%y$FY#&Xx+Iia)^zCicMU7H4$O+jxwFA>w?)b$?E`JC zfgyKV9gt>5W(EUxX-Ubxpd^=yRkR0yS)ZoQ zYgIU5mEcj3I^CaInjF}^lkHRUshOWu<$a&b|I2lIwf%#sC`CHQ3*EP! zAJh0Fdv6A?7^ZTKO9|moMTPR0EFTu9%zm)v8f3Z`CY82CFH-E|P=HGg@4EBoVG9o; zy|hq@u8AcU$tu1;XQ+fyKaAocs|q~%pqIX$iBM^Ua52s;wh~kLIi36^@VB1 z6j%PcynooUzf_uAsMv+Sz26+L1Nps2sA*^W2;rfosJz97EqLr_!nM4jngyD z29tx~WZn<>aW6hVS&DqTNB$d6-#E7;`-k8*ySAp#(<%LhtL0r+t|KmiZq$ZZ6}?Ku zG=5egEqBEby=&r+%zm@iffn}fv-^m24g?E6{!n)N-XI#QEiH&;3AM4?3RX%8Z~Mooqm#hg{yXI9Ep<5NLYO>k6)L{d;UNc|P8Y zD7)dFE9X&K6)~dlZD2c~EQiO0QpKi@TUHeT{8=)G8ii7NBDU&xVYQ)DFws13N3ak$ zR<(#SLw!kiD+v_pWf9|;BJ*DS{e#l_%tH09@8(3<1-}bB_0NRnLpn_B$k3F1Ai6Yg zS6aBh$BoKi_D;`|7~1&tRD0AexW0_Mxk%_dHgzm_$>DNVC;QlTp*qZY`<2{$|3k(1 zyt>}RzS0^^HQ8g`Qj*0CZ(goy^u;89zxjMf2z7#_}ANeYoVI^pFEM*g?8Es_-clyx#<@<>!# zJP|HnE*-UAEr=@Esz&5K#)h1Z92X3tkwAr`(PxENFjN{<2gd~thngEA_S{7jHp8X7 z2N1TRA{nlF2n)=svCS@$+_9r$xT{NO+M09?UKs`GDC$Lvk$?9F*T!&HmJ&o0qQ(voqPf~q(H;}F9!VG1^&AZA?uvMwz` ziAL2)l4QL(S?$a+#2YGH*&8B>k&P=Q65B)Krbs^wKD|?HiIBzp5)Y5>Cfi4Cc}BhA z;MHlySz|5!xjsCg>1Xv+yjdTWEwXqYb_^Yc;YWN0rg1hlYc&`JSzd%M>*y{Jc4E|$ zdI;EXvI7~SueUC6qeb`q~BoxoDbhEkDqkc{2JxY8`{oU_jk&S8}1%y&9zr@gwfst2xmr+ zOYC!WZ^S=q!-cs(T~eW7XCJiKCJuR3-Dh&HV>oOASXP1T@?uk#a@#u|`G}*x(FWsy5ndYmsA>>ESFjWqVCnyU5;;eKqk}j{Q+ov{2da zQKy%FExm8oVn*xxge4Lgzj!4$GL|+`7k_eA@4ZHE&Ntkby&M~qVMK86kT*p%S8kWz zsI`<${PQGvDVT0$?!`zl65X81*&p2Q zxZ_y?^SJrrPOMed*!Enj!|aoT?jx_CV}j%5t*3vSp-v6_oGV|tsyt<`(By;Hes9A@ zYy-`p%zpM{^AJi(&&2%y@YQ=QV5Fr^s3=#9COTdVw9V10XtR3Rp*DU||1c+MJ2N>u z)w(8e*T`UhS*IYNhjG5E7|o>cDs28WPexv&QbV&@?nXbJ`}VuKp1&MQ3V0X#2} zna9119EX%HhP>rS4q_o)4)l>Cu$**<7A`3=K}DFN8~&H-DG=qx%g%kevG8 zu-{R0Y1ty1+cB+}5Nqk_CNJ#rs4Awx6L5gBIPT!_a=WqvU~x&T-3)S=3X)iH&p9?O zZ``Jo)@U&Lx6&x1QdGZ2?>cn(c1xxVFbR)-Bzz~Yu&cT)+&j25-c8>8m7~IXt2Kh+z8t99v}+Sgjt_RtL_}!}o=MScxn>cpo|g0!DEw z2X4lWS!de3_(+=ze`D=UaEK~bJ`QaBSl{#Tte70NKq&LBAm&RfVewkfs za*fR&WHl-2wR8(=Z|y9ow*tX2g1jf&Fqi3fwP2<_5;H1}cOP^)4h}z{%(Enwd%D8% zygN{k4uiJKky}i4UIJ^cz2{P3_5D4gYY`l+w&Ygyq`?bFXZyQV@NUeE+X`}Dd1 zm8`bRF8=i2W`PQBs{j^(L+d%wqGZ2?fr&62U(|pngQI*+t zEndhjE?YXOV;Y|(u9+OKbfh7EQK00K&3~Jruey0Eta+eWBbC{N;kge|l~;|Mv&OfH z>gU(2Z&{re#D|X>644W2kugQV)fL2J<%Q}Lv@jvAw(ow3UQv(TK6$%rQ)P0kY^{Mf z+$Y~{BjAIXhJ=)%>kEq`iSc+3IzG+RX3f03#M$eA5`7Vxn0Wd0$W^mhwsk0YVdC@x z@rNwddjlc-JD|xdIPR6=*5@rI0rXe~5+^MF>#d9El(Q;nJMbz#7#;ltdoOBA%~JF8 zchbZgm{mxar^KI-Pag{<)jJaxHZfm2D4{b0-Ob-|va%h62x;Bw_LZ&74^2W`ebS3) zfLh4OXnLS;1b{DPSHv5rprdg>mbnrZ9&Cp(34qY|Sly110#RPCr8U?-I5S?gAjru@ z)=bu_{xv25-O0lNo8pM07%xT9M?mKYYjry~I06ovrcGAqk^GHW0U!cqU{)QURgh<# zsGmpXoMgkH8+@K0793nJZe(XAD{Yq`u4HAz6F)Z2szz7C!~$p(K*$xB&?Rj%QWY~` z;}y|ZmsmpHdEM<8fR#DZl@_ftYT$Xu$r$w0(^FBGGSjrvGmVql?(pZCrKQ26NV@Kz ziUINOd#HiHWK6%8`?GnU9tGupR`72%Cg3U~RuQqB4Go5%arcLb zs0o!*tb~R!hzW?dPsz*#bu)EoA{bv))AE_vNsDwSK1IzhFXP%Ehwp4{?r!aqI#d=B z0sqSPp+p85-*KnE9czJLe7UmYT^F#A4%6Do<- zf8?Y>fHj^3N4tYLF696T|H!K#D3>39NWi<;l>(&%Rg`$+=L;M<> zB3L%NJUiJ{XDrgyai{~J2!2g^8_gvN88c^#zTw+wg`2(yi$x7LNOquILIwBTf8G|t zy($3dHIcI!pXX@*Xi zoPr=4lIf-<^2_S}Xc$Hl-Rsd>x**EK*wl%N1jj39c+CvTU<+c7!6T@JA^dFIWFYDV zvsd=kj*XaJGY(sqQ4`5=zO7_R4_z{UapC=l#|r8PeONK_%%NdO_HkPCn=zNJ1yKW% z0}zvu?0bPvEqK4BRqXL1E5Dx$@g3m!U3j5p-K6__^V-=hT*Gt>04DdKU zP5f~V8xZSdLn_U8F6fk<+B9Ux5kY2~=~)yZjO|0~Z+_VIYWi-MKHV#Le#_ z8{L&iIgk?^)4hxn`XXWzVm!n_XqZow*>)wqAh-InGz1@a*^|7pkzcz^F5g|MsocWs z8py}TV?|of-Iy;CJe5$b)J^dtkfU$(LNaG>CpHSRwmzH zxyF1A!M9$|4G&l$ed5pt;2gtgJ|>)VY$&$F%?e9Jmcu^~{WCXm@dlFRk;Kf?{1pWP z9hc-{?`zih_jOdSIj$l<9pf0*rE(}S??iTff_P}t?1=CDSb4_R>)zDCg4DdSYS7ew z(}a&vaS9#zLCRj@iEe(Q$K$)0dOr!3A@(un_y)x|f_Di#&$sNKM)H;G5o{t7Jw4US zWhOVKF`UC)>fKckX6YZ~Mj}Z?f{6QhC(};iJs{f$ljXndB4}$A3FY(~3RwSUa60r@ zHIowfkn^7FQ~F>Alng>|kZjyYkOOQBYA$=QvJT#cZB^xD_=E%J(2CKI`-yl}EJsnL zh@t)Nb2^9NcfpIJHV8K*pC!IheoM?zRKA@!JuUHB;P}$*jwe2PeB?d#QBjq9FK7ux zA1W@mv0u2&0F zG7ejaQSKO+iZ-`%bmXTKAfBWJaKC7(?Ztd3g)lM{2>dng0bn!-4{80)7;e3?c%f{tQNE8UL0?=z}`6>BZfN*WF9N^reT} z^?LtwGA{-3+vkg;`MKXuO%CNn4SLi z#qii@j11jrXd^WjPewvBSSC*P3(VqdQh)!2g~ygj-le#VQ=p{=-4{YkyL(Y$bLbDG z-*D82@|w?h%`0nbrn}&rQ%iNu`K?num|CLyWrzs+Wm=G9m5qDOO+cNkJwNqjd-Mrq zQ6qTJm9Zybpy(G=%KpTmID`lrN|Ufv)by1lfd#N_BE74jT*eJ|ACJF2F1B!nE#57I z8$O_S47|z2#U>N9@xpPVF(akq&~W;=4HKCi@=zMrCCY-6l%X9yJEhR0Vya3<)o1e1 zssV{_AEwo0KXE{!gty7ep?3a)u%IZE)=7 z!^?+f7tF{b9*Tnw7csl@<9NCo!c7mC?i4LV5*U|M-HTcFBkkhvJ^l=y$Xa+4wjDhH zQ294~!x{(PFxE_T1kYiH#ZPp|SzE&x3Wfp6Wl@#}6@+KE3XCWDJT&d_jL9YEZbLM9 z@9bRZtL2V`qOuYXS6WAcreg!SKGo+uaWkVxaTi-LF@IIrI`R6i*W1!sl<{T~EG*1n zUluwN0Z-^Kt~`fN;$A?4Co&@(fe6DN;f0u7PHljQsE3FkN*T0BrLfjRTdJp~Q67(c ztpGS1LCOqCQdBkq&6T&T{5boyKNq4OFGi0a`7?K*OE@4v**{d<_Td77mc~QgTzP%3 zrfA=rSvGEdYRz}O>YYrQ`G9OG6}MD=kx+nZhv=aNgjm$*3v|oR)+|mna6^>5TNKX4 zJT|7AD>mjhCZ`)F*i{V&5fj{iHLu>wK}{e^$>AmzJV=c=NG<9D74~x=aT_@=zZeG0 zi*N!3n%!p@K1B&m0Wx9z5uYS$38un|+U5XJfR8B09co%!xv4Tfn4DgMPEws$mX}$P zSL&Siwl!h4SEQValU9o2tzteEXDtW6E(IqVQ)%hcV0uPYLTw&tx^YE(R$6I%{A>Dc zl9y|&S74l&Ri&Smk&&49MK@G7F&)i{Bs9liG(+$Xw-TF3@_hSkmEQ0BPxpgTqxay+ z?;6$E7nj(Hmu^U|YVsUG6Ts8_qX8okb}^Af{P%-jU5M0(mzTT9Pm~rwET_3yh$u5P>Eeo*j)CO6Q>fv+xNyQ6I21My#=tYrU#dLR5p zfUa}4$2sUAj{SL{+r5xBFr9+>)%Ni4_zIQf*X|V!q(uRx-#J1jugw!%G*x&kjjR{}=T(?!9&k~V@ zoST?xts}T=`;=RY?jeUzP`Q=X`a*d07%Ns%d{P6j54Ze%e7cP{e)78q)&8{JZ|J!% zEtCLvYKqVgckDhxEgZTC%`r8W8Mj93r&rMat(3+IB$V>gOrr|Zz>5<=3N@jbUoa{v2YnS}ue8`onScq?{6S#vGG%BmMP{Jo5n{LK($($_gd zwla}!s#`i4>e*UrKep<&)e=)xz4klRq9O@!yEcugX`KwR*dJ09wx~+?A6~M^L{T7H zNi1YC3VxiNEl}s~3LB5K^ll!sLfL9vn#jpv&a20WMy3U<)w3_hR zy3zk!HG*HX-}Z79*ZJezpYdz4YxlKg+$1`twYZi>6%s=0=FfqG#DzEUxTg_sKLqgY z+BEtemuGq=S^SW^+YSxV6SXa8YNF$;Rzo8Ml8h27DLENW7&>JaY0RNSrn9FI2fCz+s8_KuJwKLR2|0k>HE zO))GZxS5n%jc0pMxXM6q-$9r@i38Ir*PKdz%0;Cto0l+|2-dL^&-7GX-!$tE!)_DD ze`V-Ei-9;r%lVg2=T{E5dnWE?N}0-PiIC8!K(D`YKBt4* zUFQ8GYfiR~+}z*P4}B#G3iQAYPc8P-5&;9$)FG}mSZ%hRnM7Qhcr1^bMebYLUq{_E zoHAIv5iIXAWuL{cI$%|DMO!lWNdubx` zi#@bOBb@R+m*jZ$4c~72R+AX5>@PKU4y!t6<=V4uLC@J8y_djQN1!f{DQs%PeKDt4 zkniblJ>5&9A`No=RNKZP`lV%cxabZln=r~4$3=BN`85VjE53?gzJmYL{E|Q1vZqx< z&T;;M?wO#XW7k1VnOj-%+&?@PIf#iN_${d(fy$ifHT1h6)I`pufZEgrBL;t~ziP43 zg=n32Y!TP>BNzUg(|_Oiw}{a@=3y|oMBytfC+B|eU4O@BUg|7O0q zH}S4jyeDXE7Rig9>Lap~)V!}>V80~`O^Z~wqoC_E@?Gs|NpSg{ z+h?(z?GSq>yJv3QtBW!Ug;XO~S2I^wo$RinrjkJ0HoYf;U7q z-72)VGB@paFCS8h#{7L~=!Uz^`4#dL{?oAekFNU&j9$tS(${a9wbx~Ko3~#%Ze7pV z-&&@@ny10$MFFrJMbX3BfVIY~>1_3J?wc)~2zpz6{{wsYo`uZ)-4xutKn?0@J*%cZ z!>nGNKT}NF`&~+l*<& zH+@&0&Q@+I-fwlq?MIVsw#c8W12zyhhMKhf9&^hZuLgI+nwc%ToTi1nn~r!Dk_jS9 zwd=WvlPfw4Cf$Coe!D6;m9h>KJpNS9wKNF2J>U!|eoD~X;Oz)}a$D~9w&ir=I4wNv<4g!s(dbyYyKBsF(gFvfL;RC+3>*9k6?OzAzT82N!o)9Nf3;T9#fJ2$XCqF50^fyx zn^m zXJc`;Gu=TjyN+*romdA?>ZA;@sM8 z-74H6xCRIk+=EMScMtCF?(Xgo+}$O(yGw9)cL)x8eKR zR^7ZTeUJE&dw+hf9V{Z4tQ-?k= zoj}{u+f@(S5+^6bT_G4Q${%eNXqt`km%9z278^&c7_F5UGBDnVUa_LBbcD24y8y2?`&*NXZuoNR;%Iq$P9k;*~SrrV5(vwY<;q z^}>r|X}bQYP5gAY+l^r`f*z3>3nec#$Q0QzyvAayg-NwTNd|dKQtFu}hK|DaM}HAn zY)R`!iyd2Z4AbC)?ZKy~>;H+@;kke&%2D0ed6H<3Ll(Y`gN4IqnfxoC z1Uz_>khKuT$n)U@WM0HI;=P|EB-5nw31oto?cOTCmJ2&y_Fxi0 zez=Ce4PeoEg5N&jp~*4Vze5yuX3<#&k$}W~NlUa%x#?C86faPi077C2hbz%X*S(KBv>c{JWLzXzbzB{ zs*JNfZl65{`E*{6_ic21;6Fv8f<}WpoGGP$)%#AMu=?(ZnN}&Ipo$5 z2^4VanUP-4!1(-poQC$6mdrj6ik|bC^ZMw>tmL9Y5gS$#NF=8s`y#~M`^6Za2o80C zBR7_@R~el;u0K?g%2ccb>=VXxlhd7HkT5G7+#s5=d;M<3xb3A<5=4=JeU=y;%%BjX zZ(*!F1dJ3V0D&AEB^a_VH6&0pmU0kfTT0Jz_si|0fPFOq5$9L7J_L$5Dg?+JQkgVE z`FPZ5t3w)rj9Zo_wKMt#M0hEIKmo3-9DnBFXpy7NDkkJdlx%Pq>M9yH1Y!)aLGHqg zr3*$?aWUm#;vPMSu*hBPCi1jk067uA{|Zlczvg*G7hrXgpJ8t;op7QpQzNsd+jE`& zU}_TYplj0U_H-8U*5+`KtCnpX?=;*$uN1uKHfuN1C5TSTW(P{|dv`531V2yKntcnq z!Ta?)GohB)_`bQtgAOK+o*N>l-ZX5U2VUA31~?-UJHM*_-f=DN6oW_JuBRr2Z=_rW2U^8M{+9ZuSHf~ zRj^tULMrG^$|>Z{H$&TD69?1xt~1q{83(Nk9(9^Z%@tUPw4LOOI^Slgmr~-h^b4|9FtamK@P<^o^Gzg@8<%3EWUg)?WiH01 zq5z;b{Qh^@6%@{abF6{u+dun{BH91>yVn09N+!Z^Co3Hw`zuaffE%GS6#$8t32(uo zSZ5|^X(xd=jOstl@XCe{*rduLO~W14>fBJE_ETiENArMyLrRhA22oJ9VS<*mrZ`N{ zrU^#9pG-~;g__K@Vl>7obKR;!-Aj+Pv_{;;DlO7gCU{%)H~aw?^noq@Zz-rE_Uwd^ zj@K=2!xXqiKLb2JOB_SDzP~>l_N}@+Ipr}eDot6m8eqHpf z6WlXm={lcR*=m;~H=xg0GSodai)t`OyEFc4jIUvNDUo_3`k-9Hm+C&9vXr3|iw<5@ z-U|z@&)OT=4^tY*>?URvGbmQ|B#Qf{MFLE2mF#{m&HK=R^dZeaeeqOeMyQU5ZazbK z<3wgbISbiCury{~b6C59;U8QiE^U+yDklZImJ_`+l^1opH_q#eL(Px7V=wpD$L9%B z26kC#!Nf&Oh6y&-$Sbp^RJFtad{Kh&U6Mi$&P-<#+*K@_XPwS8ZlSA*3A%2PR2b;t z$tt_iFZ$S#Yi+hqzsDK5j1`FMeQro|Gql7Xwx4cZ-~Tw?&YCJlSYr*G@&C#&nnp2n zqxw>!Eb3zJIJ?G+DTg_DGx?h4GV#>h;)YQ9aHV4x!Wy9#@cQdM7vOE+QmOuL!$ z)C=kSQYd@fc1u-gPqtfs#w}JRpulZ+PffnN)N&<@)-Zabsh&iHMBTXSbc;4{GGc8= zE2WtAVsT&eykark!@o*-p4d9J9mR`+V>WkrOr`q0rB!jbJ_?UvqyqmQ0iIry9#}#YN3f`CDEte?n>SpvA_yGjsS-AGX}T zAnY|bF)kp1%s(+M|NcHr3V<~`g3S<~rQ#8?St-QC-nhTk{S1h% z*P#S;I42KHS86J(MzbzuEnKLl|Z3ZV=qf zOs8^u1P)~%ZVF-`BT3*LC$JE6M8FR4M@d2}Xs4Ne6_G}@Lz;xd!P-}ktDmbN6*=9Z zF}*Xfx~jdVPZ~z-JRPx{fZX`=V_}G*^B`*1g08f)FA!HAr(Vr9PDJ9Y1jFc4yYbdnouK@_bIDiWk);x30?3mF+S|(v5TOTeyQ$h4BfY{F z(oW+UI0BEAi2M>G9lM16S0i|{9nErrafEU(_*FT-3s5d!Zfm`= zWfNce#34O5PX#`cicTrG5xxWR7&Xf-fq|ek;y+fre}+aSx_~w8Sikw&b4TyXuT()F z`pETw_S&8nAY#fV!yWJrkTn6w1eo{;*V$F8aYO(r)O#QZqtxer{tTW__vJ?d70E;b z6**%4J_$20A@8$deI!{Bu%7p;6wK}o2%*6b^5Wpzk?QyP1Wnk7SFHi4bs^36z=MeX z`}nLx$HQ`mO+w_#aK3;XPTr&K3>tSYuk9%WqC;DQ$>-2x8~W!Q?JaN`ZW?1A=jndN zMot8|8Ve`Z5kWx%B2OA}kS8!xgD`#PpO7?V_cT?p{O~c_KXX-Jpj}%w;b_cT6 z!q}cHx#pNu-Ly2cE<~lRycrQ4XwS*#tDW2(7e>)20CB6WlO4B&fzu}4xwji3UaiAo zq@5{j5^m{#+c-Y+PaCIwinca|kdY{`4IH7qvX6cvYnqn(dGrTq8*l4=kmi$ZDvA>6 zUCFND7bIUpk@6W70F-0KQg{?@3LSw*!wj|+w}rk@0wUdG+;FZ7idzl8+joA^Y>R}c zAU-8jwx=?#Vi&rbriB}Ce6odhTh2qK`8Fk_%(=lwBH0{3zuMxrhe;oF{R5-jCY`~S z`ITz>sne#tV`}gGMd@$<;JwHHIU4+%H%N3Uc8{Q|TTmh~6^n*F)y!W@oX380y(>&V zeZIJODlJ6M0FSCpjm_?c+asqx#hA-z+=CvaCt8uEm@xaT#rF&4GNl-Hetw*YHiSPT z(v=vC1_ai8!-I#_vqjQoX$^~4IbUy#=ABXbzTLWHnH$FYuu*9?ZpZy+Sc(&7BHy2< zP5T@Bn}P5bF>)SmO|P8EHhMfY?ZI``r{W#JIXbDGc#wL#5QJ?6XGHhi_R9L=!EfIc z8d`|d9G9%UuusYX-RFpkqjSFum^J*ZxN9>xGG@Apf>8I=2koS0GNluj1o-oS` z_u_}Ky2V+Rm_RS^Rg^I~F_Bfch$xH{vbaZ=RTq10&_(CzAl$_iQq}vcOYLCg@pN|e z)!U+UkvjQsrKHR5xS^hRSobL*R-k4rr7+s>L#>8BHSY6HkYdN}?uF-)OiIjzS*z5` z`k#b1Abf^(6fOUY=I$sc3-dVQC9>N|i!5|41?|D|3i%#f0kTKb?p-d;rm zP5zO?`$x!F0J096OLJ4^T!#|7P31Eu7ung4crTwq$O$0(29h~1)T|Ai7Mk>%%CHd=zf1fg(l zSee_Sekcng`#|r|#NtqWMNC43?6+dp$F;kZ2-AQ|_mT=pzZdPXXS-yj6zToe#1`J} zS+UD6D7}!hc_U7nDI52MK~Fo%hrgQnZ8B6#Ot3Dfgk!)TeN(K{pTId66qU06zI@UD zX)%ad?=g>_9EBySJl{!7zZ5jUAC_xh^ZSs^O_0tZeI`B2iVfS#fDSeNAQk7rf0L~u1gaFx6K?{NRtoxX(bZh+-5edjS?X+z z)l?7MOZxxJ=0>YH0mlsB#ObsI5E^ZSsz^kj?azk8r;pbn$BDJv7joK}-Ju0@Gw5l*n& z&ZG!-;3e}V;j;g}aG;ZIaAHu7El=@Prvzl5tgVvrF|hRn){)B3or{Kd~v zlJFeT6-TMRc(?LLksE2iJD&w_npj;|JyxqkcRN)^sx7GB2&8Iy297ENu&f$XN-tkH zi(doevKz$RFtM-|VpvKip5do7#KLB!b)9p5$UdCE%m}zcS8IeyyA810di)H<$>}I(Fp{8!IGZu0w*t6uXvX zw|>2NfNB@Q+MNH}|AOLKqZsP46aFeKx|r;kZoI#)?bA7hl2?#J(M8Hv+R)5I*#%ZI z`xY_Kz_qAZxfo>l(cD3)C#{gm$ip29eNHd1TVUOD`9^9dawsTw3oNYuoD^}X4M<|<*82H z!hExe4FO!Rl{7s958AK<&A04;p^syZbk3Ryu!KD@?1XVJtom0lR`7&8aGZKcC|0Bd zV@#s@B=mg<7+D!n9a%Xg#RNS}f_gU`TW||;w8KNN;NKvJNt;i)-G|j6qE2%Q1{wwk z4~w2q(PI8}NRrC3X3V#4Rl)NlYYHRJBS!9p8k@6&x$5$sqw}!&AqyeQnwwF@BlFt@@f__)!I$4j;Fkqb25d2@dv;du$r3lx zIfz@>n&l7|nuxX~&E3DYV&QIspOp>_7{s%01Ha`-qt4)3@p!)3J2*E7pB1|6M$*uJ z6H#N^>?Pf+Q|QyKUJQ8a!N)bCXiF#ql(yG2ZpFI;i&goyn0x`ncw>Qm*q3DY1Sy!Y zz?(P(C{t!2iYZy5 zONiii+MM0RKW;rN7KQ`AP|snQ-hWJdrkV87&hn)%47kF^UCD8<%~EB00Z0Vw`3sb$ z5P5C-Swzmr*j{l$@YGOAj4W)?kOW<=xN4HOG{uG>S-u(xmr?)rTTAm=Nl-^?d1iQaSBSn26dvmtoiLXZ{4) zG|e@%d8K*t5N?5wkE&zvIjR(414zfro^3S&yY4*>6jEO~tRQF3mdr>wGUYiDGot>& ze04H8cJ1XaCPxZycw4f(Mf(O_4^Ef7gdpJjqKjm7w1&$}#S@ zGRHE7_5E5-!v%}_@D7XfDh>a~YXUs68d%LTUIO~i<+Q0y&)f6V3mY2UR>um4m1AKu zLM-)4P4Al9WwCk%AJuLM6nIDgxAn2qRo!|f0Q z-tc^&ESL}XAGC{GJ9d1i%U}%DwRf)voa9Li=TSAP^*T*g&BMssQ2K%Qu}~=?6*bJ$ zOR72f@lM3{TCBh}h}O6LmSNZ9pD5J$(+U+ZpUMUBpmpBcKUhw)kIH3RL(DR@lX#4X zZ^3_-F~xiqs)Ux9=19X;IQ{aKW1wPoWc=M_L|4ZjS)7BAR~3KuSXIcADhZ7ot2Q#j zwEl!`W$ktoX-52hnB&DdFAoJu+1ss&ATgZ&n`7%b-Q6o?Vp-^8fD)ypC{QIO82;2v zJ7f>JmgPHqNsC*XUQ4?xGB+<=ydy1q4x?tz9N;`6Apmg;#;?jZk5vQ{y+aN(sO#%< zr0wKKX}pcqnCrhlQRUjO(O_<-Qq^0|k+(z@c|A(dHLHY4Ns5F(ldZW3mriHl@cQsg{isy=bXGSU22_>QvmqU%rx(vdq^J;x0lY&wG8UwyToNzr zeNp^wHHU!lo$O>%;hYz5tD;ytz^_#+V~FE-))&)AZ+GQ@z{M(_n0KxwPx63{6Y&i5 zB%XL31|LDCx&}v2gj=@!=*$GzYNBQ!NQCkNKZQ%TY%1=hsFX zyTP)RNRd+X4ogZ+_^csQ7gk?PGdc9^&@LvB#pF4u>k2xdM021&7oMJ4A z)?{O2zSHzbm_|M{()e&3_z*to-h}hAH$;?dI1lvEZY75{kIxTFAWXq}1_54zKp{8j zl%B$-eXvC%n&V~ZQK@sw0Ok(JuXSReqMs-aD*7lx*@v=rEMi{vYao)}aw-dP&K!ks z0FM=#y=C#enB|!B0{VX6lsJ5zQBFsHxYyImh0BMe4jIW`GETw@r7%vC zfqAmF-p(GJkTZD384>)w!Roz7y2G>sSzJ+mGTQep?v?Q%vH=l+37=y%!;$lReZ`m$E-uHT1Yk(<#m1oD_x z+?(G$xpw%xKT?EuEOLNhLKjHt0&Q%Jo^C-o< zdSz~IenzVAhR&d)MWc(}MWVWBY4Am4VR)9E?PMVIy-sN}y(U7`MIr=E6bdaxYv*Vo zxM1$x7`kWeNl?sM*p-1d7X@9});~rw*p{tN{gdv-QcBs#Tm+~&bYZnX2ow9UXT-yK zE!*U{P0lEshDF^UDne9;W?8$s6DIbWuf%2Jx6hDa6V6zvDruUDDmh!`p(Ar#uR@m$ z*7UyS+^u+swsgwsR)1O?StcM^S4QBt1Xax+eBnvZvBE2Bf2~eJ4$M8xKcz&pr5`Wv z8!?=of-hL@y^|pDfbnK{W$J8hoU!ST?WFMkTlOr;h#<8Kv~XA5FLb_QzInS z&p{Pcb1Ys=|4{!bPnx1MM+D>eSVPAjaPPi&X|gB}{)F3D&DR#=QX09!WD)5e7aR{s zo>E;CQb{S|Q6>F6Q(Za>BZDGIv%VX3_+OC8r+?x|9#MVA*~vj1MHiuhrrBR0PBu5f z&p6k@|E5CKvV1{CxGt7!j`R7Co?ZngFH~bM&q>J!Zj^?8t&L%qBj2-fnu-#rH ze^K6M4j6Ymp<|V}6*N_p@Jj(}fCW+3ub|z2xE=ita29;Oy5-pwz2DoowlHnq1@4K0 z-~=S?p{kTm-cnlwe$ORlj zsQ=WMVpPqrDAx_-_t%^mz20yAs(NA0?cNYbdcE?3U#Y>A#p_!;Gt0YK(jirniI$zB zo16(n)_fj-^&1rcYog`&A$w(vw7=M6ZndhPuk`6fafl2capA zV84Vi+tCSs0q+GqkY%7Z1HQ(%E9D$J}6GI?tmIL8F1{+lg;!1L28Z>|{lbHxJpeQ;6hmdTGBDxyl#Qdmqd+XNpcm<8f(qkw*qi%u`m`V)1GxV=Koq z#e|Ug&^oG43m?7j+?yRm3{+l!;-f7~m~T?kXypuR67o2nh>|o$yz@h)dMH#XFz1Pq#Y(f=NH) zH(RxYr1p}ir*hYQ_hELP49-vhPNAsnQXru}=c%(lh0^V8Kz^a4Cw$X1X^EKK9>%(L z1v&bl@Qw(19>!uU2lZjr9Jy`(D@gqkZ$& zP9gLJ?M@F@M_Hk&t9Xjo_#YV8LsZwizKA8Z>~HZ1^PhvRc<~XkB;;;*mnKn5413N< z0PoO@gG<|&;6b27vh-Y6B|Aa(xdWIYn$KEV>xtt#f7RIQiNE*8*ZT3-8!}!&K(;{F zAI6{rP-}i~W9^ZH0MA7nV7~wsn57`-3Zbl7(p!+|@Bq6?iWNY#1)*>R9@q+!9a-$R zOnlo8js3^G`!`0++uJM*#GB4~-uo^xGx8dl7panPuHMh4%1BjLLyfghb%a?c-Puin z2tf4xgmy?E0;&kHT{2+&D1-ITm|4!DjO0H*389YE^;0lnM?%2UN_BtN`@OTKaUs*f zx4a%v@_;hh=^LZ3XJ%%ykM{_(;fLtQK9Q34YTQYGTj)d2-Ni<2B!Otoyb}_?=0F02 zjTMLqyxGD<-nxx*?Sx>p4g9@Kbk!25lJB4}Wkt>;RGxNhcD_%WJ~7d4Q5KbKr|+`s z$_%U%r1Dt05r~*wCr$k!5S2s~{Upcf#b1Dj5BNq5EI)yDJAuZKQ?4}gZJLh@mh?~a zC7=i&W+4qw*#4sb`%f;asuIMB2hR|d1~HnzedE2WOG!tW^~s;<4rT(RT0xpt;xj(h zJ%p;er%CnG$Gdi3rmSJXLA(=^dF2U555}#ELxjPcXQ|8b@iokjK*VlKbdR0OYhotr zZQQ&g9YBOA&y-eoJMSJdU01^p^}Ep z90R&HdDqUgOj+O_JEe32QaFn;p0K6k%5x|SM^n0p)7fweYSEi(hBkJh5q-P*kj^B> zCfP;T0Hey}&JXHxdlT=2vK}`|M#fX3BOm|rv3*Mh` zhVl}tdS1S4kn7b~=a5DwOrsKD#_;PlL+-hvL9~}9HQ9R9X2?Plut53bx|`5G;v?Ik z=L@ukTRuj2d|f*gAg8U%alFHWorW&U(2aFqDBE$?8U;(#)pT*fA>r#=R!BW$t#*Vh zL!|zegS%p+*pL8K$#G4B(4_nZq&RK8otpw|8c_mY%Zv=*qh z^wPyKV4x1JfAxt$k*`25FwKW2;Oo@^&>TQ);G|AcR`x@jt}<=#ipRCyWN{_Zrk$)@ z;VOY?#xW}0(o=zs3?n+zAMswWf}`h0VIW5mxl5t$)F?j0U)MdjQg1i6-rz4aPU0-i z@g*HhaCU1#{9Z^CHXW>AV=vB0%R8&{DO1P~w_~TLW}=#_T}a0Dr7?KpSPx@;*E`m% z+3tUkcjZ@)YxXHq6mTU27jKSkvn{nJ6kh-kzcosKZAA`>s_W#n^;Jnc**~wW?kEmuu1_3O$2QbDKA^^NX@PvJ~ z@P1v8Ei-=89E~4+u=beM*+zl>BuLJE76ROF-Ap3N$|?w5o;Vp3mA?{|wLamj#wTrg z-b(EZ55~y)9>@I@?GZ}b^}O;CY=eESKwMg)1NR_()AKMR=CAdmFUPhDOJTeKNW4s4UtFIEem9~)epGR7%hgg9cmWX8Mmmx{{JSuWYMccq@xqTXNDj3lTms&#`la@{K@VIa9*jiH~?E!A^3<`$ueyE}OKrP76gS z5eT>yCc2l1x1&$G9xC%~;J8-4dVO>mUQ~1fP_<-;3bmZSXg0>*rs;|>qSl&N;q28t zN7gldvZ8L_!pg zO}C2RnUDzn9M5TPZu4I`?H_gb?jKjmhsP0v^~rUgT>UVL7_J@k81h@5MvwWzN*kx| z4JiB(;H57+C9GY8Tw;ybz@R`;IR^nf?u#_Bp5I|jZUWe+Hb3AyQVDFfU;;pQ&>kdL znLYs&r-sNXTGu;!peVk0{kOZ{?T-bs;~9yM4Iux|&d7>ov^^Z7W`@{Jsc;xs>9tI* zbx)Q&$QO`sSvPt@iiy5g09KeF5kZ}BLw#popNosG%arCeKo-WqL4=65guyCn&^8DI zXmX%8ZB*!$=F7W$juw^>UGK9^i|!@4az0d07=u%Msu9MC^lgV=?s^HgEI!*dJ61$Cz*cS zvn&~zbx+#=5&cT+6J5gqm7hstof)PI$D2$~UWD7YeY|Y42ll~~WTM`(d*QwY+Q(2G zwg@X62gUMi^wHmJub$c4JKKABxqI3%RxM^%6^R}WnWQ8vFRkKR&=gLnt)m(kmPuMNeR3-C8jY&V_X%3Tu3x+9Gk zXkZy&1KPFpEswVF2e~=0ID8=i;6a0DwSbf&PO)Qu5gft~@8M=YC`Wqjg5dmTeY(5X za)zk&_TVayy5DHnuHyPINmVkg24%ktguywtaU%Jl+cxOK)#rKHp5QC%rDIlSh+E>+ zE<=<>m$8@F)lrkjwSRA-h^JyMId!c4+MnLN|A0JT0zB|-?Mod{V}Q2xbJ$)Zrr0VX zOuRB>d4f1)jBltzas?Vqjs4{%Ku+`MJnQDjy;7=Kr6!3b5ft+!nvSlF|?@*0s=<` zj~cPE-tU)UDXTSRdGH2|jr=)XYrlNHf!69#Y3&xV&waeMx$-WMrx!>RJv;*Xg6?!Y z`XAHmdP(@bNW8!$|K=I2^`9wq>>$tq?A>8J>zrJHNy`7ZwTSi!5+?z!M8Y;yAPD20 zKnW_9_=~6aPw%l?qs6f+pE*kH3|+3+nXQzWyM-odW_w&*ze$+H45k%O2}_ttnfpzz zPgKvG-wTq~rySo3&2*wj-O0#C4-{Lc-nsjS*nM!HJ;)4ItX>8m?j+tXjo=6jIK(Tb zN->rP8YUL|n+4V}dVBVJq=q(SVxFmQ6&J%-C=$m(&)903xcR?zQy!&WA^$v%B$PI^ z!uQ;}rmPAqbFd21NLFE&jA$>jC1ROGIkAk5Wk{kUb!;+YuqAX-L05}!0y6;o77!RR zT_PgZj<1pSPRvytoZ3hXP{4R>nX7C-_z zK@kQ&60|bw5gKpYUQ`9Rwe$;Z8#f%iHW1jRfxC%Q4w%ytp^K;76mo>T2qK(;Q4piz zu6$xPIfuE5TEN-h2fSP3hX$H`?EF&bsuMtE6wIQt;7x&tqB`Xk-GD=F!e-*|Y*VXW zNVYLzL#5$zA^i2!p5E4TCAgP>cT!bJB~z?iI+mxxF+nq3rg|Aaon#8AQ zfeBmarD!>nCP{{3FVy~DLOd{30k@d${E?w zaqtm-tpK@<(E;^Dcx4b)D(v`b#3%JjjH53bi2$JHoyE`-^^wN`Z zzVJtfNe6qjc7xFD!LCbXr+6oaDal7z==&*qUz0FZ$@f)#H4BiGbF9j(3vCK)bW75+ zRDXhuscA1$^2x>MivU)N8U*Gv5sS30I`Vf2no3$1$<)<2cKhPvQJ}YBl9Pv=L%J5Fq zc9N-#n4J$>@JU{JF&lq^CQ43j0^e_IO?Q&tmRmjJtBnB%6%?8rDEN18Pf5W}ZbxEl z4-7EX&r@6hLXi9$_b4_=0ZO0ITeAD}LoM!4OmOx5oT{bdGT9r6{vT~YLyXomH@8w@ z1bF>lL&KMR)DKdX#wVk1;wCB8eDjFPDQPK5KQ()&hu^O?=jjRwuOq1Z^Du7c_CyT5 zzyKqf^y(IVksyXi`j~T^Q=dZ72w|Ed06!Wc;1GNigh2d~3jS z!R~h@QdUDQ5lGC4{t5jX!)`4O(Cq$GC;;o{l+IK<>0c#TOBA+|#i=$(IXGgUW)wg< zw`WSu0lf!H_8KKPaqwmmCWJWA{v06^jsG}#sys5$=#F8dHf;${iG z;R79Lv4S_G80i`vn?3hLbYAzqMIHif5|C;B?{13K&e(qxavKZUxA-jmqr+=E%ZwFG z2r*9iUn~qw==x`pu8)c}=Ek3;)DK@XwL0IG*p#%4wN=dRVL?dmAqVBQMDKq3GMI3c z;kH=3xO-TDX$2kc8T_mks6W~Pg8vbBN-%tXq^b0dDLtkWc9iSMT&gXgQ2zZN1OgMF z=;zEyy1ps}EGMgW`!K_P>D3&;!4rBkq&47oPi<*w7ycq)C5|hxW%BpBJ?(luO#SE z`~cqn`%&b5lezei^WFp_r^6j_Pq-H#e0%@*qs$mXF5JU@3QUJL>N1%cfr}x5)%p7< z3|@z+eJyo_g{Bf?1H=UQ)~>vBaXr!KK1fm8_zMaHOwPv^i)|QqU@255^#(w2AUc1L z_FiRp=)PM(KrF0JvHezgYS{@kdtN@-e+T;G|1yTH0&;7dXlK!6DSwj3L+z(8|uk zu?$h5t#v;hvU~l3^x0jO4%58ddj1+7X0Ib@*PUqLQibGlBQ?S*P|k`$bt| z4QFF#&I*G3vRV<#A`eXp>6Cj4u0P-5$@#H~#qA z^nJVdna~+zer@i;E1K10gU05@XvHZFqbwEPVwm+T;Udxe-Bravw_`fCSU03f=f>Qd zsBuL8Z;9o;b6*rCIkx!r)Z)jO;ytk%_ltCr3-ccj;^+4$3(alM!NtS$+i_VZOB3mU z8=hP^KfA;%a|ou1H^Y+O9dF3V*@zsUsfnyR9v)>DOabJYr$!*|28i<5HvaeZ|C%p$ z*~^7b<|3Jf9nQYqCB5L;d+)tHJ5n3D30SE@!nlN<1D!m2;9qlCg7YOb)Cq)kMRX+z zxSNLw$Qy?Xc>fd-F_+;7CHcJ@Y8Rnq^(Q7i#=k!H=lyQ)pE#FVYd`q6&`We~yaS1Q zny7G5f{Wq>%(U&G;VD# zjTBy|zz9&bRr)xipMigjZ-j+yXoN{@C0t@Hqc=P=z)k|j_yBL4!!-jVuEQ#cA4S+m zPg;UnOuiEYL5lvJ!RG~xG!UVm<-6}4l^vmV;2PxBOn1ja#*62z=k4L{ z2!n&02U00|NGI9YQ=A_=^5 zQCHi6r4yMHXKwKp5}ZVTtX=npR+ zT#-Fp-k)zX#4o)c`>1hnXz~l&obcm|c9~KHHG-K5Z_vNqrLWaQU(MGMi#lPnhHdZ9 zMHDAU2VAW=H}6Clwdy0s?E2cB_07+-OT|LReIIq)N(yXW{3shcOsW0=7TV>wDlT;#U1MI!OXIAt2?K#?mW{<)Co9^_EhD2uL(03VZ>AB7XqG$JPe zq6WMjkV^oB)cY@&fCT#gG?CS6!+@a!^O|lLJqcH=b4I}QjMPYY;H6x`7%;C-A^iFN z0-pGRz6>ys(*Y?1%TRc>%)Vs2p=R7_11eBzfK3gfq{F33Q5e(_<#=pF2Qex-Rhvv4 z30h0?IHPX_uops~O@zfbH(pk~-J7u-L8usve`o#PAD^KLKKh2QQ`Pg5#!303x@Rw%$_YbR)1)~2?lP_pi!vcP8McLa$T4(rMx@tKc z|38#2)W}YiCO9Zf;%I)j?;;?oN+=HD9xh6OZh4LZ;@)p6P)y$;R?^Y|*+CK5atm2n zOKFn?64iXqdoKTE)iqr-an*Gd@O|=gqeS|?nnd%2;_WE9BQr*#XU7}3fWMV83lRu6 z6*SwvgOIZh*XkzB4=3UN57OeFV2)?19}?+P*OJ$=oy0cG%VOJS#vB7!6$!WVeP6Sc zT{dYdw?W;iM+ur7zODzP`Er*`Rm@h;de?(a!ld8cl~#? ziTACve$663qWmZ1aPBAD~wLMR+Da{owR{ z`iJO<5b!rt=1$b6+U1I13lu6No~ZmeL3~)-BOx-{d4`d8c&7qs)SNXqB;jWw((oA; zZ9zl0V(6rNYNmdoy22H(194++54!c`2cGBIjWn4=z?8fAn!VqU{MaAw6uDbEyK%C4 zwrTc!el8qndY@mo&7Va8e$iqKQQHv6D{?*;T-GW{MfB2@kVwl?h{(9a= ze-WcRdIpjB6*P4J67K$8wrdA-bf-a>WH@;6o1{+yxoyI&-TtoM5Gz_c=|2^@J*+rF z4_E}|Kn~+f{NugIL9-BeG8}^W#<%=Z`VP!6H~*@KLHot&45;z%D=LT!ir#u^iH=ye zk0>_P-2G(nW0R&atPcgyxD7vU5(T=`2bsH43<79CZXtaz2a9-+2%~MhF5CzldCpJ~ zvcIMiFZ0j`35e(0 zP*I@O!9U;n*D`jO)~663PZNncfv6}wF;1gMD;1@vKtnSTFO52ZpddXr9yuF{AQi8e z5QQ2gl^`{)ASFFci>QdII36FFfPm^J0QWb9=2_%9Ik|OYBy0qy)SWC$SQD^sKu{46 zlItgpOUv{#fMm~JvfDf)hQ*VzqA)!;?EI*0QY=>fvr7J}BoJ7-4|kZGM`hpf4F`hK z>Tt6SC-o_XPz~Zo&kptyGgFUAoGZa;a&NOzgmyp~!B!%$GjxN{A_#+3CmpSnS-T6I z?bgpY<)$IOoJ-augNi%mU&hoGsnbUdN-aE~?CT8#rC^Z7LKUrFv_WiCRLtcSKK)US zgLG};Orr$&M9#a8pAbUj)NWpIkfTLfby5()&0Y%PEK$F_O2_*v|~wi!|^WIkG+;B??^TOYeNtvn$Rq!B1;##e8>ffR}k)d#WRr5nv$ zC~386!eE#WHe{inPawB#?Zj!nor*X))w z_1A-d9=P2h+tVrW;%kB+uUu$y1eeE7KEp z#n({1(>Kykk@`j$?`BD1YjZg6wgKjWxNb!heIDG(7be9N1XHMX1p5Yy(i4vX#T)-J z@6qV}{&LfA+;{QFe%9Ad0Z%!{4Mm>Z zvZ`WOf9hARzb7ddo@%annX)rg<3_*kzmhmEGCw-)SKS|9V zIH-R7*Sfr}0O z6gBA4yxslwBlmON4gIC6f%>lYH9y8zn8x6w5BP-S0kjaAUElcE)DSSeH~$m9}_GQmwxs*5I<8&SA4%c zNF`*xq3mcc8R8*PhyAT!kTYz*WQF!~uE!5US{g^18M#9A~5J@3Vlmkb$Q zLpy^Ht19~^w`)b3oqhvq83i9cPK03dS{GF1)e0?=HksWftn;7_v>DM(xw{7RsTO1< zWTq$TK%o@DpvwO~VmhGDm|534HJtCgvI`F-m23a^O!}ypgZ&!BSYMSU2cG^0%^~Z} z!`jK$3?SPR$pf-Im0dqpwd0Lv*om1if;ddH)(vkTDqD6?A@zvt7IY91aDkOTpI?HY zf}rB7F(Sl@?wt~(+aTGgRPPk!27YCA8YlD`V+1Rpr=i=vuizTHt(!hwIgN*lZA;<+ z+hWjcGo))`D*8DaXbpwjc>GwHmjx#^ffcsQ-VGi=1Vr%x0+N(Ah8EIb=~1OugQ-^n zGB8{(E=0qo=zGOaSu^IDUd&0yJhKM^VFVz5+{Ksx*n@zaMc7!3JITdH0)PWXhz6K` z3a{ySoyGq@WhiD677=4VCk2z@SR&*MMkwle(s?4Zv5J?p{<%kRi{HK00ZJwOuNXNc zA^_7)KEBYa!oi?_tUS$X{~CYYj2W)1QS#LtC3G{S6)hS#@&$W?M47opap@t}uH}A;oZzS>Uq*uA2p(xxQifV~dYX2k zc8X3h$c?>H&N&bwQrJOc$PD(`G3f-V81ya5PU9RgkQj*Q@}2aJ#Zd5VZ6s_O`gavL zhsLme@+ZC2xrj=jFptUgjFdv}-LQ-)XqcmZ>k8@4Xg1h0Gc2Gqvj#$#mXxTf{3Rj#`XbBA%tz*+$Y#%Spnz~o2!Z&K!;X!m%ZY8y!JDL z0QqhTo^C-0AOb-`?QCrwX`<&9j6waFj1O;;*auUpFI&x-KGB*M4a9l;o(dK!#?~e> z4kpsWyF)%LlRyJGiTL6O4$}JHG9~@|!kwLp4BeoCt!Z%KX)GI#k)@Q zDt##(Xt%>VJ^YRXYsav^JCCLEg-h(d*BK7Av56d(WB<9GFK%TsF53}g_($LnuSSip z_jVmA7{ggKdGRy$sAKWT!DG}yyrCt@6YBrERqr4$u`oKr%I!c-z@yYa0Awy5@8wG_VB z2nhnu_x^kK3)tIG<6;~B)tDA}s`JeNGaP7^uk3=CL@;QY&kQ0^>4Y-tLnu-_Lzl+d zmrl>~-_KdAbNTTQy#09c2m+(CRwYAvDrk`c8Vt=ASaK?pB8iL@ENGw4J&2B_1(Pe> zKJJ31bD{ZT);~tYPV$tv%evbnsS|}8DDr6>-uU@GFECS|?m|W@{XefgE~CKP@o0^T ztv_`B{KBoHkm~Rif3H1j=(M|x_bePq!AV-jhYL5gSqBBZZ0v_Eh$s(W-!ZW^S*Z(9 z7QZeyi*{0e>F96!RK#F7L1fszJH_pVSVRn({e|576DkOZb&<#Uz`Z0$(7l0RFh~DE zLVOKTB?(1-zJg6LW8LD058v4x(KbartxS26UYK=I{S?%B{It0f%%twN14T1;`5&f< z-E24HkF`$z{A!r|KOonIfiu|Y>Jv2ny$dC&EqN0`+(dc8B4b}`sW(bdqL*BiubW(& z|DXMlN&sySxB@mSqY0eD2Bf_H3n^A;oAG@VX8+YfseC1S<|Sv833?GFE$#BjsbpcM zw|}G5bdglh*i*~(iBL6ZfGwNe)yz(!Ty{OuI{Ei5v~Na*r;D)6RPK89WaAOWkr-7&WPf~0>b@vmLgKTq>-{}fO1-;6Ov(H+~$=Dh6eaMvt-on%Z&Ef_9{eYrIoQn$JqL{eAPv|@E73x8+7qUaYwrA1T*XDN! zUJV5pK>=ih2d5A-fE}OrsBeO8e;?qvXA*s!g^BY+t2iaf1=B5R9^+TcFXYMp4W*ZL zL2LublcNwG!%RB7mioM6P5WuUz>)v+6cZyn0lGO`s)7#%nK9hX$$vJa4ynxdX`JOv z8nS$1oTmU8`d+kN2TcV}#k&eUiS{HRR#^nI{dWh+rNzgO5HYe7lhQeQqlHi)RvF5( zJ@6P%z3?V?3it0197C9VJ=;B8&qjHToeKz%W-83cDO?5)uoL3`8ZjL}8lH;6`OE^i zAw0#|HY9|7+vR`07$d%Kq$)%3P)Nm0+*PI?RbX1;T7Xp1OCk)7q2z;)QcT6RFo#Bz zH=r(K!wr^#dcX0yo4=FTJB}mL~%U}BNMq&x1GOxyhV63*j^0D!> zTdHEFhj6;*>3L2TS)0roe;Vh@2N|D-=#|7>=5~dej(~-)NX4LvkaqXzx3h(OXDx@= znnFYj{|J9fmUPs0jEid=GN7HWXl*S`AkaDoJ|){%@kb8brq((x1~%Z=BT^ zsvcf6eb2s}p2-i}4bRS9lk%lEPH3xGX=qe`aPl2PRN@$^iNft zAzVF<*7vOXVG`qgyR2>U>xM?|+6g_}_jpDk9wPH^i#poD2`?h+M@z88(*fQ+2n6$P zN2Vak{F1_Eb|o79hr+o4`x+4np+p`uQOZ6}m2$p4?-*2P<6X)R2@BI2+rwuRAHUzy ztjoIjtv~LN*rYJ}(YHI;va{y)<2<|GM_!SOQZ0SS6JG8wEJkYFhiQ5RU>*sQqjt(DGI3e``} zwd+)-fvIKDQ2JR-E`C{pKyPKgMLz<&#yIv3#4tl@l1%q25S0qD-cjZkMTI3mgQl+y!zA8tL z+k28i&%!y$`1YcN9?M*a55=J@>)RiPz}ZTlRG>=QsBD}&yUBi;eM7I<*ts(&mjh6F zao7B{@fRX6HM{A9O13Z(O$tY{OH9wLbS(Z{qM2Qg zpI@z%nD;q8NlP8xj2eRi3!Ba?l{(oBkPnnv3NPR(+?uMvf;usXMt32z0k8D`i~_qB zh~m#Wv0ET}b+;98$?T8wSIPfI0v|y^MCrU;=-Q@{$-msYGZI%l>k|BMcr$>o2j0@lNPjD^~xscg3FXnsJQoGV%dRLHd-D-OJIb3BQ-wi z^)8A6Kt$%gr(AU%k1YOIICTEJj@qoJWu*JE$lK{$U>>L*+GPn5AnqhCSFP&OX7V`m&!(dQ=^sm!?`# zQ4CxWw4L)E$CCK;#6rNkhuQ1hjBNqXrF$J9$R6zaH9z=k!DMxJEX=1e3H8F6bp$wZ z!7++5{b5COP=gd-)3uC*XNPE2HIc~yvn;)4rI9v@$HcM=m6C|?wQVIRIn z3b=%+AnX6Ck7^@7n)B-%;N#O`eqoqzzK&o9t77`WkHZMlRLNF}v&2x=F*^aBNV2G(yoHIGzo7dVkbUng(-T z@AF$go{c5)cV+#)JVl2F>EgnMZ-GAx05{jneS)bN&X0YQVY1S(&2&u&5N9fkmu>jI z2Jq)&FR}gu?{3FDSIj}=SkPo=Z!-W13TAw#yqGeYxH%mC94Lexw6Wg$yD>v|up(%Ki7z3u-&jhK7veSH4l%Gg$GiPb*WUZd~C8BE6khJVU>dFiR+QoZC5Ei zE2i+@U;A$`RQ=H%Z%0_}HjR+Rx&wh&f4qj-YUP?&Ld# zN9U7vi>;+rVH|{03t%7ZB^NPLXREPn0wlMSZid)Z*f~tU<6b6iw37bmHSoRCVL-FF zs&d3*CPuKS)R87*jO*M~TWl1goksQ5$!i-u!JV4ja~Xj_qKQjJoI3UDSU-NwJ**_; z?U*&@M!YR(dz^L`R!CG=Do%G*8aDsIp%6y7x8^Fn;Y3lArdNBSk#+p8 zHgvz6!kg3lAck=)S|Gjzl{BesXT5zzn8?10UI8eN0*kl!Wsx5g=>kyzCRN=C+k%XV zRBVxpj}NTI%l`5*{u^!z{P$k?b99z5>8560IjX-D$Xxr;lCUhkixtg_=nTxicT~Ap zN-%SQ&|mmYS4_v7I&RH=jWPXPj(kSW@gf zh%eURr_Zp;na?0QQbU(rsBl2S3l;};{;N^TQ}{Ds<(Q1q;qz}l_AYQm4pth}`TqfG z(;17)>?K+ln{tSIOWdG0+aC=#`^sPE%p-<62de@{{Eyb}f48l?wtgQ{(eMtyp}^*( zyYD<>FBU;x6)7X)@vv{BtuZ|1aD}P`vMGXNwhR~tLfX~p4q@ZqAP@*~9K!3bSN80b z{VQE)n@@dG0Pu*Wr`N!E$59O72ZQScjxuK`d%TN>aq*k?{NTzg)*IigD^IZy6@B=r z$s%dqB!!It*}PS2dS@TD6@L6U89vW>Ds`bl+|tB}2L``E^tPCS*FIEezXbK}``xzg z4tUe|z>NWU!`5+mrYO{aQ{i*T-ZR*06fN;9f&qmLjmhU`pyL0oN%UR{?uK$%mHRet zme>+U?=igzKwpr(}i*!)tT3>Hl$ASG0C!0-OEZAoqS-yP@Fb65qRQ z$Xf8f6ZmBKu)KWpEL(Q<#n@5&JR1L!c(L2o%pn)dA_qD94lu5xB)MVo$*n8Tb-3M6jjHH_j(_qE!bj|k}Zo@Lz*p4!R~nkBEEau6y* zlWXoy6`h&C^%i|as|Fz=!G7>x)nO%m~sWGcW}sw!PiC;n)eIYF(QJ ziIj`59=$M_yg=rJGo*28KBj+fqokku?SAU1FZs+R3!ixpt3$eEC`I}nlLQss5pC{p zgK+V2Y|Ay}{f$QVe0f!gQfP0!BESo$aS_6$b$5IT-m?^o9YOe{doIwE#DNET`84ea zsCa-P;otg)Q=;;&<>N~avs2V1C$;A8D(ic zUUC!vT4BD1w05`$Y2}b5e7gP{Wz9O}wc7oN+-0qYV?j7`399=X{M<&4cV-vm4ZM;1 zH)p=|Wth7{N1?KT2%RAhenLe7x&`Pyp4Z9>sJ8&}tqnOUg;`Y!+Nd5AM-Zaj%~`VQ zt+xO?XNrvz97BK&!fcSrD6*{;C#gfUWb6`O9M4yGdWtt`gN}y3QMubN30{*!0Mz!c zRA1sDE-bH5P2k5gbjeSFA`ppJbGmf(0`ZBGiqZ&-g-6us>#b`#_-Nyh7J0OA!g!r2f1XW|*d}ne-DJXbmhh0qDm+8U+go487u(1BEs3l1Ih5x*t@D z=~sK#NsF9lvbjL^UNR|S1N1XNy`6>y-UZ?c1Ux0lx5&PMNXq45Ts{l!(zoPRJYT%I7F2oe8{^=i`zyvbH>syge-HD3@X<`|t zh(imEBu2qlXS_0a)eMXH!4ZY578^QjHk_b)8XO%htP&EiVFs&1N(ntz&wyl;BwG>? zq5#hy(E7#&hK61X>Ch$F%v^FiAk?(yVJj|0u;3lu(~76e`TSk;?QIV+!)=2KZ(8bO zOt5ye8&=3Jm2s%iH(LhRd1B~b#7)`tCF1pi-i~^vVoF)_{~2Nm#qc<`GQ&C3?(v@S z<+d-JY4N$`1`O)&CX)piQ{exX$NK+2#?;m9J`9`jBJSec2sf8!?H7w<*V#PutZ^im zQq@L(My4)O-p8k99MDiL+8G>XzPJP7&KM;-SKwt;XmdBZ;$JE$D~3$uKU z;L_3tZXTc@#1!23-&?9D)XCnRfdgK3!mnNYUT`lsJ{)6Wqa`6qzkW27^;#Zhf5uCZ z?=Uza>)qKIYS0-t{0P`f0F>0_?Ee=^N;?}4)Y^cMa1IUuDye^kz(HxBoP_rq+lAVg z46Q1B^l`r=Na@X;FAsC$Qi4v*Q4r3-fO`91AAPS9eI@Y~pG|{!N!L$Ugrzn0@nL*8 z#+g+Pw8Mv7@jtt2GB?h@tFJ?3mX>g7D;(Dk+n6Sv1wbVu#KLFbAP!*L>irPlEZX@g zzN*gW?xb_Z@Vkv~7MZdB==7PofO88isM8DaCHwF5C~X5&(}d@`6_mY$=Vmjb;m5!Y zSMV|=Z?R5OgQ__N{T@&@`~)3QEIx^MeE3zI$Z16wT3wV#APp16dh|9nH~4O#&pt?c z7hARmBXa1>D%j!<+$h>u#}ctj-vinHzb_2^2&Kg zw-j^`8~Z4WmRWh`D%CM&$J6}Rv}vSRJJx7HEn*ybz0vLHz-n!imiKeIQM^nxs5w;u z5ySY=V_&OlOzq=~45MW~He^6j{whY7zzoyV37?^R2?K-+YYuX@6&F3t9l4S*HF_B+ zCHuGFBsPUFQ%SBDLFk1t_N$R_FQx@O{p0sEv2~tUH1{Y+{np(v$UW^Ys46xP81lFh`sQ@jE&|ezy!V>46BEBcnBRx z_L?+347d+SuS}Jh+2c^Tj#VjgrU==mm9z`<#8mDiVnDC&VnDyc#LSPJN<|3I04aYZNd9Lzr(TJ>|3roJ2+Tr1 zs3Q|0Tx6g>;CxO%t_FQp@yo_@@eWsXWVaB0x8meBKIS!-`b~}(?;NdLH(Sbfj0v6Y z5-w%})LeL*uwc%votqFmACkC0-wYoZAG1It!9AjZ??d#2F0%`>+3dQe8rZ5g@$8&h zQX2e&A*Hz|*d^(!Rf+hA1Q{6-jstd>7gN%n{^^r<2F9H*uwn|`WiH_(e&=X2x64f| zr++3dc2k$cjf-^#nXs62*w4Y?KuPF7S5s-Ysn@4VBKr$N;H9%ZKPhNn_2cVmzSN@j z>_G-90IRwE{h(tzX>xal^-WUV7=nU^YW#|ip$B?VTS|_owvDodPKkkt$H#gDXUW2Z z3S8`ief2B9Ns!hY`r=>K@3gW*2+6DWkOIrOJW^2ftX<|A_+bG(nzd*c6R9ri_Vxxv zp!a3ZF%*~iV}^iEjs0vADZUgHx+LpBHMA5rrw0&O-P&goo60P9ENlUjNO!Exc9 zFAuY*#bR}2k-7F$&}XR61sLtUp0xzO8Tw8~tzUdfX&g~w*HbC{h2yYdh?Vd^eC=Mc znI5Tc9)2NNh?=1Mvfj?rTt$Z)elEzAqj1{Zmdn!V>Bb6fJN_pMY_!tMXWP-GnL%qpYuG$bD^!ctS^7Ux}Xkdb)+=N zG08G|JqQD+wPiD$C#3~ggpt3g3|cvbEOj+rL=6?N>EVoVqQ#REGGvv8XE7L{x7}t# zhbF$2*6A#6VGBOWkq`ngE-&kLcdHrv(MT&>j>CS@HssiH6K4zL@FEacvATpu%nI4! z9Q4gw+R7$>m@4g=ezVcQPRwzE-_oiA11Ej$W<{pPGn+W{J^x?Nk7bU$891_k)28;XH z^|jr5{1;EeJp)2Fc}yKp@35rE2)5k24%I%dHU-Rg&zeli;jN?D>y1#k)wL8D-1~oM z@AByq+C&$NiTCX#%ziq#pfJ{;DaE*{Ka*2Z6gmDlQC&i)D0p=G+()okxF4yF)aVU= z^3}~s2z?HBSa30C-BA5UcD}KhMkb==amIUFfw~9%3z-3@M3e#eVlO4;8Iz#3Ah)5&I}{ri^t?|2td`C;5kVf6 z&7w9289@&FyU0HCC~(a(56qmiA~L`LIoeH!@Xg#D0xj)g?VDWE%jsvv+Gd277KHtM zg!+24uYE*dUUgFPdaVMI`ZjLBi?NNJho`xXyM~>rOvU<2ayVYPfuLGaPf`ORiR)9; zaRAQ0q=7J$MnWgx_R+#pC*}CFv6*CycZsel=+~^*^O!P-0E0NcC_X1s2ehkrtEQaW zC8=$IBOeH;V#jwM$19WC)tcH9b}2i{wLqYqiNKv#mTt84notj${12ne`fQV?n_|lJ}UB@ zl6n>3#`v#Tlv-M0iGkt0G`%!{Q=O=KOPgvl}%V$Lnk>rLA*KADSoL!IHj!x% zCHnU+bRh3*mfMaT0Ay>z1)qF_PJIZWT}kdEY!SXe4odzM9$;S+*oHsgBg(q;^PP~> zW`XapI-P?jZH`_@uT0QTR8x&IQkf;|tn-9rEKCY2FzsCK^UDjzbKZhZ0ZR9O1zHbK zlTh)D7(s}!Xo9LXla4a0naqO$qx&dHiwUB(80x$7aE-SM$_~!8|4j@4uZ3Oy04iI3eLjFnIHCx{S zK(TbtaGfOe6u|7M1QSyu1Z`rfc7bkgW_nGQRxxa9PW9+JLG4&~R=SYZm__*}YRv-b z<~H`S!OSRGZPLGEt9?c;WZ@V4MlBLMAjwRM{sf@rm=Y~(15o*e4{CR&5&l#vf2JvE zvOPq2(!1WpMIP=wIm;5|njH&tg|T!ayNIZ+rv*p^wx#*m@{-<>(uHV5zT$~*Iac+` zc!l#ND||ECu;xpXjxn0_a(P_DLUhRS_G6u`2?Y_?^^uTb*Q%(SX%uF=Vt7=|26Y6Ab}%ad%ikyZVe32ys0G z$GROhKA{=tESKp&?3v!u+LQa(=j`dP9v0~~=vMo&Ea5bd_q4JcZi?4kN>e9q_P}pt zJ?F*{rA|8Mh^>P#Xp|Vw!J)u@#y0@G`9w2Es}XZdq9^_R*UB@B2lfp%(p~+K&xb2z zqd{w8$hU_u9GH+vXDvJeQn|0ySDO6Kq1DDagM}E8s0{1Ac3pO z9WNU9W2ZipH7OMAi+0W;Z~*BEd@C1d^uN9}`n|TmsjH>V>Odw!=kiyLGfF4Ag!pX? zqv>^jqAUeG>cqrGfxJJN?G6?6uLl_cEN$%?fhUn~>gJQH81?nO?__s0h^z=|!mbe( z`1PoJu&Ws1_5Q)6ax{pX0%{2ev;o1%-#~lvbziW+U<;>H80me2!R;?s5HX z2jGA-;NIz+Y6gZ$sIPZ@Cr^{uwD73>%~kV5B!{o2Nhd>>!PG>!H2oSp_nVDUi*5B?SX(wrp_cft| zm<5RF97_2BJOYgUc8)fuysp{q!Q@v;CZo%or<5V12F5A`kmnjaZ1$_j1eh0i9TwRF zGS_YTNz?g7`S{H_-Sg(hi1C*RXXd33R)AZ=UW zv3ups=<(g%BeaQpB^zC`z=f89P+dK12 zuPE}pdBriNnTat)Ihy@>rZEOkMMtihsSxyktRjz84Spo;N8J4WN@}D@Y0#Q%Crs^ zC{hqHk#>=^sSm0VZ3+U0JzW|cbSy$0ylhNb98403v@}SUGG#>yG?EZOYo}=S|Fc@q z{r#PWusw_Q~^kU zn@0=ac@9(WqqpWmupVrm;x^#w=H{+S3(WtqCAqt@UN@*l*{SDC9v_%d20AqW&qGkH zgR{A_vY%fBgq%(UT{m^J5i5G*l^I{DD9g{Y^sZQGZAtiJWVPme)9~qx)&_GT@IQJ zl~}{#7q)|CdruWF9X+y)#pQp!@pvKMDNHEMiqd-|ltq3K5CQY5q zkHr?H(qBu%DNLP$W(dnpcXr-7(f;LmzfB1DVYUs6fhoZ=VOECVIef9DY7#r#m3EIR45&YGC@1~*4#B!T)z0NxN16$==w+kfKsap~H8hgQaQMlz0hTzj-YM^H387Unv4z z_OEIW2AnYx@YNvy@UB9CUOK#;^v$j?O<2L_-`BMA*h@mGU2w7qaU!xf>SVxrlo9-@ z`NTbnZ*bei3aLT4WYxXnY=GPRAlBpS&iLgWpV?RO5tQ4ma$!Ew6=n0?{WZ&_s2%Si z{EO#b6XE2u=mjAEIag%XzS+SFoIgmER*^F*2s%6(-LIpRk}f zF(9tzeTbkZ1t)NoDE~0;B<>E=GI=s$D=5omI@k*TLop*tDF5(gc9lDY{E>S?bW+i5 z^Mm&I6_M^P3Hq$6YcL5%#^*k$K-&$r+&?0l7Z-#NeiYZ@(N&29&A%Z{-LWj0eh2>% zNR8~uT)fgMcS?2%d-H~^H1dMe5p}R@%WLxbF!qQwx-?m&iMxy2-~S_lUM@jS4)RCT zwk7gYs&ehtm^|M}sZA~|6QsG)kV#FW-B}O1U%R@@dq(XcNl8AQqbGRA#vIoYvF|cU zku)!arh;oWEK)Mn*gp+iL{zBGq#BHt&7?Pv8Udo@cF$ZcxF8tH2gMAt?Hj-p41Kij87+|7ijsBr_( z>aY~E{2+>&wbb}yk`DNV9E1iZEOBjuVt(SEXHQ)(^K2h%)ZMFKmTLl(+RA&SlEcnt zP~wV^3%1Us+@%D6~A$tnrbn{7cwEOgP8ttJ>$er&~Jd9b2!2s zdCR-iH1Az^^y>v|!@B02@m`A^-gWKN+3-NiLH;SAVSK{20(wImeT4{i6#ptTXyR zhQ&!s&8IygnfN&MK^dqGTLi7fH)I|*)*q}<3;Tm!AbJfn9xGq%pt&_s*9nr5XKyY}3Xhf;;S zU`$+$xyAyeJlq?}5Hjp`Mi0D9uX1QCT7_ADQ*@%?F7XaJSS@u9>PeS8$@~}aDbF&o zkwB0@dKdy?@q`ciw*rBpxOYJZ2w&=n@u%MTr*m%2!C(c8RTtZo_H)^c)JI^?Gf~{; ze`895dQAL8C$Se}EJFV`Ck;F^ZlVaTup5oeYtXoO!GXi<@T|DkIebD*Mval)Vm2r(>k9Mnx z$2ahe5Nc8C&51aqX!DuN)H;&Vxkq8uZ-i5;2k59-4M-Y} zqCY~W(CRnoW7UX~xwvwd)D&X1SJ(4Ta{qeJ6)<8^Y~OdAZ#uE5VDy-fFv6zVM`MkE zZHLQZal0VjqpzXXJ ztiM4TRvI&JSdpZlVv@VCbmH_~FE7{7fG{@)`T)D{U_vpNkDEK7XVE(!hOdQiUe9Ng zV-fC`W*+T({V$|8m7h84nr&^FKBr95^qQb8Xj1zfq9l$qv|BgWog8?c&y7aoUR&LKF=zh9}g$Ve_KbCE6&|;S!-ewpF zy~|ecrfOqz(s{6Ana!AqZi zConh@-H5_N;(h>MNrX&K*D~rqu^T8vVRm%$pI<+12%Yy?-f=qG3p>HcL^iNxwT?HZ zaq5Zl5YmkYV5BFd%l7X=8bRn4TD*bg0Mp@H7rKn94O56GLZlAI_jA96@K(TA;DEy_ z;PinRgP_AHZ06F66^>%J;5np74Df^}fTrZd%SA;cWo*k|!pBZTu#n06xXT;ZBn(dA z6oF(3ZbXO04UG?uTRab1yg~+w+_UTFOe_3yU62?3^_pH2OOj8v_ctZ0IRc$rCq=dv zo;xlNY?}^O=gLuhN0t82EO`)D*7KJ+{GrTTH6nkS+r9Znc&9$Gl}gr`2OGL8<&}#j zwe_-UC~Cw+{|wfUAvwBbcAobhcZF*V`*Tdh2Z?VTaI?6ikkfp79CsS-$b?w=u?|?; z7pzIo%-;{I_EJ`C@l5g&j^Jzp*C>^W(Tp9(&Rfj8ifE zgZ2ZT^R!cjkHYd7O%20Y^ljmja@LgW=CyJJzl9<4D91RTP^KXv55!~zC%QR`_7yaOBfM=ECN`o9-qimHf&rRUa z{MKC;4zUyT#k< zKDsAtJo1FYF83{>WQ>Q@4-;N$5=n0T%?NL8-?3VK^%zM(GZx(Axf~violWRy3(Iel z&ojV7dBHo4)$?u&k6t<4!fXZq>FJlmK^$BCu==ANSD@qTxw1Bz8@JrpuX4qQ?pU^* zGdlzA%AlkKEPo!E{gqEW2a<6^A&~<`f;EfEjdmF2D~)G;Z)~H5!Ym-W2j3UN?4-`~ z)|DV;sU1=h7P#Uf^k_ReK`7P`x^l+ReCu!+P+TTvns(^P&NDD5t@`uT-nP}QB$rsvJ~<R#{2T>Q4{i0!FqySC8z-*m z$h45y9L8_l6)r({&=C_=(VZPhkSxwQLnZ3u&EJ3EPg*DuJJA1br}@xv&A9Rm=A$Di zruo%z!KS^Q={~VsCE({365cu{lxZ)ZxX%)p29yrm6T20D2&0V*g`>H+Vip!?(eTpn z7{dmSNo(riQJ^4Lie@&iTQGQ+^Ie#tzuYCHdS7IeUrJ1>I=Nhme?%b$|E5 z&&JpIbl>vwt0Ud++3;!gW3H`?Yi3b0e4zzg7X1MA6aH33qGYOu>j9bdB5gRYi)X;~ zImXnCN|j|rwT%d=oiruJ$TWW3h=B(ChZ9#yyHM0OSk?U^vnMyRp;|;gee5P*p!%3X zP7v^TN6RIBvnOEt-i_VNn)h?_hRvX1V#a;g0u2mKVjhVe>uHU%)2ByBjU7=F`4(uR zA9}%VniU*Nza1iyBL-$}2wOWfM?<9Du1YinyvvAGEL#v1i|(i&az0eLs0FOElKZ0K z;DF@!7F6)fhcz(+Fr8ob@=)u+f}p8DoC>6d+a?4T)egz}kOLAL4@E z7Jpr(`@u;_+@B-PR(&o^Ta};L^~*kN-_*?t$FXk0*XX`(P* zdg3eHsP;6wh^*4;h-_D#S+bqU5FGmn+XKE3oiiBt{XFHEdkEBBp>l$U$=HPt$OWda z0Hobib6|!Sp!7yI?f$1U0;q$53Fg1lbzW>spVw*FmYR+fL2)c<9i7As)o3xiavor^ z7L&FrI-V0sHqC5bos#M#4f`DyMllv<5sneJmr&H8nWBa!h;)g5{IBQUKSq+EUcS#; zYvXU~>V(zRPw_t$d=wWRs zsBWahzAs=%N22zLL@Uqg=Are9NM0sG6Ldi3YDyeDor?L}Un$0zAD;WcZQ6c4_jdd} z)0kqwwJmGE{9M2wI=aP*_s6E1#pd+U;2@a_!CkIntUkHXp{uLQ+GJ@WE_yEfBS`t1 z+(z|G%1kC;o})WPgg;Ti8NqDejYSrGIk_*)VB<1B|il?d+F<6gspI+ ze-fiWpG%3JmJ)CHRIj9hiZ@S5uYfhzREJDzl~!0iT6Nn`>Pn{CB$3BW^Kn|2_@a9( zN+%U8^e5iuGx9WWwx2C!yB!i0n^XM2gw=6N;+?&)HsV9RnH;%mkB+xs|Ec^7)4m+nj?+eLi34xa^uw z>lK!8%6mVKeja209KSgDW1^aHN|ex^yMN79$8~f~spk?x3-99YcIm!2A#Y55&h(9R zyW@AlStN)1x~Ff^ftEKN1ZGB7CM`vZ#eVT&Dh1UER#|E3;l8;BhFKZ*38p18|K@$) z*wub$Ro=r6Vhe{nLl$FmHn@`J6)OoxvhXKE)GgJdh<~iDwLfQ8%!v3a*wM1#WH;=G zpLS%O|9&xBO2L<%!Tyq=W`*cZINC^(X5V17vsST6zhv0bqghnDw%*A3p1?-yFQSHY zwx8Itjcz8do6lb7%$TcLNSDrH!(t~C7gEI(iq&c=+#Nmie4X8yd*kf3y6og9om3o| znZz)OM7V)ZUVfHc$5EKq!=;^UxUWc_faLW-;(pbpLk?{ zYA$O>uaO#na3sRfDaCWE1W>FNQ@}%WB3~ z*2oCLFj0um|25d+>SkY&vjP06nfgQakcPe;hC0S{i&DlBg1uF%tn6whWXihv>M0h)0+w56vS_DWiO@HY zy9=MUr)U2YkI<^dJQ{kmBFtr&rlAixSau)URQ^}rorT=4#LyS1B9<KdZCYX|Ud6rhy9|^@4w4Vt7cxi9ipmmnj?Q`v`I`5jGaggS92! zdON|aWotVCglUVrJEt2tCk4##xOq8zJc4XV5Vy;ntfXO?U$0$h0z8{@k+kZX$&a)N zNbYmWZKszjCh;j2SBRVX?eBCZ&Ya%f-E6y2@E%Y9Al;pdj7TOkoLA2f{>ANVU7A}d z4}ujLmT!Pbr7H{(_Lc+~&sb z2Ud~CF2}BQY(#~w#k60;KOcSNf*pPRNeHeAc%E#Znu$czk(|1z2xe@o4 z)lbHl_*Ovig+Xg;Ubyh(2*UOr$AU5KMGA~0*{xFS1+!=LeX`PWE$S^hA|d@ zEiJD`5Y2QVS#8Bie2e&w4}bLBp?2AT->-l)zwytUY!p}pojbD|*KQzuCHCc8SpP%< zhWm14QOvi@lW*UQu(#wy0>b!7W+j;y<{3hDK$|%D{8#69oxgmK@0?9gHC$L8=e~t1 zHE!aEoSPNReJKk4tl0Wv^~d(cOS_ZTQ`(k|F87V!ADfAt?T8|g5W!0g0TXZ@pYOYG zQ%s7U?)G!?-}%;DhxP7Y_d}@I8PO$Wq!-MsA}brlh;>TG@k<$L_vDx7-!ch*t-tue zmSAu^n;I2p9K@wQFPim7E__no03prW5GZJPfBa^<`UCNO>gT#jc-T%hx_`P`1@IAuS$9*yj;b%$fzU( z6Q7tOdEd&Z8{Tw{G8^G~shVX{k#J7$uIg|jA9Yk-@3wg6eBO`9#RK#3pIn^pni{hf zBV^*EJMI?ImysVLAs4gBog70f3yY234cYZJv+wrp8RpKjhC1JT_%6pJcLTpKl)bLIl`2~q z)>Wt+Cnf4*k4xPh&GL4s>QO$I<$277GvdHSut>{;AzT=C>XsI2(KGZ`2!&KePW_a`AM` z%!E$s>(nnZQ1tWfvHB>S!V{-ECVchqX;&f+fm4=s7g73#$9-g_%h98jJnqwZ zUKR7UF*)g`@3Qj6OE)v59EO58CyGYI-C_XQ3Ra|mbAbe%jz%cH5y*m6jqR!9Mp=?=gLg$2gH=+W892IIcwF zol|p*1UGi~pXT^kk&P)>)Dae;1MbDDZ9DZxYU!ku(U-%YqS5X~0Oye@M%~{c&oW*(rdi zjs3jfP#0=7And~cR~)&FZ0XsLd9d$smE89jiqu9Ry3a2{WfybqO)%tN=t>Oop(OBK zjCt--vHmP-Pq+W9sWc`b>N>>N%_ml8pC5ezZiCzof)JFwS2Hjs5NDdTJQ>ynP5)^% z(Q%1nOK)Q~L5!rtaARru%aN%3`-Yr@4xf(ZDi?;2`@?qrdvC3o()7xn5Z#Pa+7EQ; z&d2VoNppyzOV!3&0MLXW)qcHJ1T$5N9gt82|MoOMPS`gXv1KD_E0USt!~dQ7KM&aPRB* z72u~pQ5s<}`{D{H|m0MYKwo!dZO6pKv%Ri zp7_WNUKgHN6iX>xnHR-RCqM0|rnuF_zdg{v!yZ=3gj%g7zGh?qK4J&LjQ(4J6GnnvItwF)U~g2yL- zFm&)JH$ho|ruZ{(QbCUPd_QQ*VbL*&h*b_^3mFK3kz1BQSHk;ww1-0o@Ok2R2 z|F!p5K%~PfOrBpbv%v6@_L{>r9=)rwriSbx^v7q91OBqg`I_5x5bAwvJ8C4&6T0kT zhgs?!Vm~FQ^t*COFwuJYFVe}c&X0#}c9qUqEO#O!_P?J}h%bV+19lv-x4?6T1FBO# z+!H0+Y7wftAa-}&9^6Dbl3ezz%R#YgI5(8+l86UaU#5%E8Sw^JZX+(J>YP zej_twO2YDi(HaqB44Iw^gL%u#$UUW|W3a)etGW>;h?EAk%~mePj@~hr&yUp%|03j7Y_d`{A@iNhn_5sa ze~bPj?uSI}YY#uTN_6Jp4D;n`q0w<}GE+xCR7VrNo+1{H zhX>)I=4d)z6J0u!8^ySbWtDzJj1+rQ4RcmEoNw|k-G3>M-(h^eU zYBjVDw`Dc43Tho|XAYuhEBhnlawWvpm=`fB)*tMFF@irXyPoPkI_kQAgJ^a?f$X9M zQy=N$KkWcP^kL6TXiTAtV zhWhIe{G|Arif*f7-F8;wn77v{R`t%;J#Zz}np!9QMV zyCK(78ce1x@A&u#gy3Ew$n*XVU7Yg2%TXOIMsPELT98xWkNw`)_z9`AOxM&fv*0JM zXPtYo&1$g6|9waHA*WmE^V3ww(haCi1q$5%sZ*0MmoRFkz!DI^;}Z(Nr@mO)8QZv+ zn0hl%6O(%?s|bpV>NDvp%gc)D%d4s=sH!My3+Q^o!X#Wn6DIrt$EY8Mkb_Y5#@aZL z0;*FhRb+vNZ`ey+Yn01CZcYzRIQaaAiKU=WdF+YdULd;#4SgiF%N(VZk-95$Y2946 z!0q*p@4&a6F`Qc(S3fuo{2!-UvoM8*RLT2K?sr|)Im0imm!7xY-e?DmGFNTUy?mXC zU2@qr%Wfu5I&N&63jG@#miTEXLx<=Hrb6xq&)_-Lpxt1mm}se9ZY_By3Dr;hA3B=e zRVh-r?3@1!YYA{5OHc)=MVP03R^t~f^eiBPf!_;M#Wo=NAVyuzw z24g~#B62G=C}xUABt&s>g5qsWnZ%y(M#H-B;`}&9Hm+XrgrjpSoRj24IP$S<%ojza z9211_IzyA-#(_{^=$s>FbLT2u20@j-&_$4YzM`VCBVLtG0@) z;Y;0`yGj%}`Ge<`B}8f*erW_CI$io8m_*Z?&OqdZ*1I6*zzt$Rw6Y*Me06YPJN3c3 zVo!f4fwGmpuvqrQ>YCMY1T`fx>f_63okP8VFd>|4`1u%Zlfq&{U2JL~x-_6!<&x+Q zO|8x%FE~w8`n^I>T?n7Na#ewEvcdh_NUbGmy9WBMJQYT+|nS zAdbjBsOE*}f^Z0_*v2ybOz1bmkqm|`#7BG%)^GJcsDk>K%z_jLM@9bOS$znGRza0% z$qHq<@5s5-MwOWv*&WZNLDl9dIOU(>(7HL(j}qJCbts!}2pUtGn|q)E%)ovqk~K?zjf_T7oDD;SG&tTuHcGQ2TAlG#I|!h&v<4VI&{ApX-gk`0Pq2SdjgG}?9rzG|dC zJ$$LPX-pM^CHO5KE-nLSE{beqb#c8nWyLVe6&|~A;uwCmk^gJI8LoX$Uv^+mQO|RLLmxrf%|d?uJ1LMpHOC9#E&Q>UZ}I``=lQK7+-X7& z^5zPkxeHoM0^FB>Y0>|G>67{j02KgQ015K195ZR+KWtOa@>DWtn5dr)9YWAnxj>rI zgqY;Th(lqKr(-Sv)~%WY1$m6iaLzJ6u!72M_~NdRHa)Ds5ucVut)DO>5iz=AzSr`c z86x21OW25nV30^bOo7W7Zn!Y-TPORo&LIk%bU?KSG=r00b7k`3KCQ~J>az=dYgYhn z6x>=K$BjR%gM`ca(bnPi;K^+@b~ItP=(fRkmu}9iVWdSUUR^xex$p}66t~IY`x`hA zS(VvK$dG+O;M3ZI#DAW0#nRMJ0TSc^oHwM&XhT`Ff#oH}YH?C6&j|n{pY8|{|Dt&Nh_lqGUY&mNz zweXkq)F}ahvnnz zAKlguKJ1J?v6j-kCz)xxE-x}N)@)0@ci)r1b7G**IUo0Qu(3~+{y~jm#5;;XO6g^gK%y_ zxUc)23mg=7!ma~HRZg4h*7+vuUZ+FFNevN&o||x*6ov}%@qO>?wl_*t>c_iCOC_)=paK)&FL#8UY7e^YuTPY7OKkGFk zWTA#(7zJ_eLDd+HV`9>3)CdUG7zGVvUxrfPMPD8<*{Uyd$6R}DyFVWnO=ESXpMMwK zP}1>NSt5ZNj_85Kze$woYONGmAk#-*r;cvvm8uzUWg+z0qryrY7YygDgDFD`qvzZs zzX>{&NKkSORPn%uxf?Sq!wvNv=hv{`p(-5+8!i%v-6-=XsA8mS1?4*`iM-^u+wOk4 z=~sKH*jiX$Uq4Peyb6dJS+F>xI^Z&P$gL=?12vba7v+d7&HdtUUXFFA*4hP7Gil#q z^5$R{2vc*f9AvEq^Yp9%Zv!)>F!=eCEDnuP_MDIc^ntM!uN*HvY)5b#7yG6p>_z;r ze!OUk=O)pp@lLcA{LC#jp+n}}E%KyJ$#N!&(hEPq&2-(jddtR(uVB*v{@6VEt&vHJ zObqP9Y!bcJNQ*ty8JYCPa|gn(qO{RZ6pVKlIW{F7l@h}_El|&&5eiXkV<>GgL!e$c zA5Xd)b_~v=Nq15Ps`i2)be>wH3n{P2CdK}C@b?D9Q`u`M52pF#OB)s0I({D$9Rapi zI2>A1D@qDlVB5aB1t7IEkX$X^cRUFsdz?nW&nU;+_N3ISXC%z;}#EQ zSEwnww~{bO&SA#0aF^fbf%>glUU;Pt-ZUJ-dsptheo&=L6g|E(($&Z@C0!}i=5ZmV zX74S1F@1#Bk9gxg4Qn^w^Xzs1NU8OzSrk6FBu;~%(P+YC*&<9n2U^t@soJHxssySUO0-+3|)X$yWjon5(vbR?HzUtXq@Y>w-(Q1r;3 zhG-gpg4N28CtO1W1KT;R<29+<4e3Mt>-;m!1FL@}`D^{MWp z3H@(r30P8+U>x9HYOQ!eu$${{5!9{KD=Ln|C>@v>5Xt+i{a93BNXs+U9<2}AOF~J`CVkf zu$yP1(xuy?H~16}wx#j4CJr83J_>p(rf?JEq%(R941}tg!=f2A6|RyW5&KJ&a?x-P zSGu@u9)wU!hs3x-R~Pk}es}TavbHis^Py#HHfNlL_RS9B|EScjMaG_YwF*OY{RYo=s_U55gY^8U-kURQ}gh#usC#e%N5$1S1y1al( z10l0Bl+}L6Ic}vQlnN_)JCo|dlZ^RAeo#C6!0tSpmcsQf6mO= z_g$9lZpGr;@!n|M&{=GiFYT6(>Ui1JgnbGl6Hq27E)l6w640kniJ$ypEcK2<3 z`T3RKKhu^5INd@mu`hr|QfbE6|I!0m0X1?!J)j)Zn-KQLA*z&9aJE4q4hLxyx(SZQ zyV)$9^Cz$lE%4Y7N~X(r*G9i(mAp4-&zMS8+~5{2qRD3|k-^aYdcb^YfZDAi60v3o zLp5h4%#1HhOHajp+=i{6HLl2Os8Tv0?jm>QX;0K%TuV-_sHf>!?<=FWG$`3z`eD06~&PLuceRAXpL++FeurJY&xe2Yas zRw@GM!7z&71!+SA7bS(V*-GT!oeAsE8rYf3ZZ1;RcH9zve3it_JQJRCp|8=lY9-93 zSbCwfWJ%F^@-?9?z~k+cDp;~AA7_4||A`qO_C~W%5K_N`nNIsaQN#ZW$+BLmJK?_s z8UIiMyMIvvv|MzJ3n=M#6y(K!fWDz1;Pu!tc&z5^~g12bxyrj7kz_ zV^js19Y|Xpqu9($@oqy?F22og#-{$Ys1%x&67}j!buxk(rIB!YQ0NYLPfNSrM>!fS zKb~!9j>XIDwY0o-nxrZxGWDgi)^G|Jhb}7`?FGWVDrqM(Lw?5Gz|OXO6RIHF(jf3_ zVm8lJYF0dYfOy=3qP_gJfEW2l;HkH}?}5?%)UP^{`0p9UWg$q=L1y?=H#*V!KaC@2 zaVvH}u_(U#!t|$_Keg2W!;Ct^MOweN?nVH)3(3Y&lmTBpw8j7 zaW{bB;`JW+@=XuKF>Tb+nbz-ZQVp~}u&(s)#JAwL<(|RD(QJDzKEn_N!b##1Pwf!_7kYd84@|unV-LWVXV@ z;)t!DvAZk#m&<=tY4UhA>)r!RD7LjaeF#;xG}*e7+8U5@4ZPvmJ>b5Oi?B4?(iopu zi{y`z@Wa$2{ZVZ5#W$U_KeuJ&di-Yj19_|QuK0+ks89(y>F@WRl>Lh{1A2b|ab|^9 znPHbqLeNt^Fz+mRYIyR8oT{ySy7mC}?=PLRqQvxD86%>grr(@KIHy(2%yb;%4k`pE zCS2PF>1_pMD8d4RF83zJRu73KT9j%6Rn(#rXDN9GjWZkjk5vh4F-~ua+7qR1Z<;LI zz3}NQJEgc5o6dN!#g};QMsED4j}u+i&#>>l`O6YN{v2qCd8RwUICDMsz;bi7;C{?0 zM8ftsxc?0owxa}AZ|DZ-R2h$6mw@LL*UuXy6>on1fOeeJdx|wi1~*B#WD@h~iAOV! zjX^rRl`$KRzy|}MinypJg%AFDs|Iki8@8QOX1^_lP3tyymQ2>_6L_rsT#xe1E&KI* z?{L1vXOJ&)zsvu1<>#M`&*$0BmnKZ#c6WZ6>)_pykj^zCRd4L0$t%xFtIjki{HNzb zMt@{Apq*%6D3{ZHZd(gT1?C`yt-qbtDb|I25s70Nk2nI zv=8=mqG=^;xM5?m)$sJX!eqais1BDj%L@tyAsT7PB_(l=kk5A|`GS4KR><(eG_R2Caj z7~^47XcZ$m9cJpVr_-Wf^`%O0e}?mj=7c-2sUU5Qm~cxd7R=j32!niQ39O)LGu3On z)zH497#b-Sy?*rE{e8_gzhUMS`8=B7%E%p(e)9;LAbB?_gJl2}BBn@PA2JO2Ire4q|dw&JEN zIGH*WI+DTxB_$kRu?qraddLtqor)YaS0b%tF>w`o4|Ox8?17TCP=}NA)HX~Z<0&XS zWJM~JSrDBrV`4RkGRla6FVAU*SLw$8`7`WV2o{h(Etzp4H9Dk~QijNTy2ZvE18dzDke7_lY zzs$~|!D!~^rn|Ek)859#0(zP#mkt%U@n+nS z*8-At`qtfJ5@MdGDfwP`m_I0FA=S%67IA~`(y*N$CLWwG>$C_a+oOqBM# z%@&jn?wY=p<25vG8nHgreBpFN^4mgT8z?WX-8`N{g1Qb{WuqwFq-z0YQSYF*--e7D z!VnfiuxycHh!(v-$57IhCHP~3GSpfBslBhEtxE2oGa&&qXvdqsOtklVe%(MywYZ+k zQ7Gr?CI8NpsAAefOKQLPTw%PUpq~nA`0hMOB9>8-k-+!D+LnStvUD}SqZrK4NjSfH z!@KgXG3+w3HLt&4UXz*TF0sbY2s`j}^2^y>b|IR+r z4S&}#5s{D2A14pa=C+Z0WuaebGaM1gx>1_pPKkBK+WBY;peTu|;g#&{0EJ#1xP^n& zJYH|__va4U`P*^E22Z2r5kZcwsf;YzIfV}A*72cC_NI{A0_dTAcmhw`;T>=C)~yvG4%=q@^!L=`+{=b< z%(fj4kdrU|ih8%fd4b?X4Wyclts-a4Cbpx3s1ze#<6yZj+KZTer_SVSNo`RHw@&Xm zbEl=0O{&L6oLoObUYktsc){$N=^6i?<%SIeq*J;A6Lu1_=0*&OaE&TA9%`xqp$M(| z(v@oJAG(n0*DlSG^E#%y(IFp6LP#YaS3MpV$aS@pX)HPsD_u+`6)5E8zmHbmbjTiM z+8_#N5`}A!(Mlvf7L(`z!CDKd4qU@}3!nUbMWOs2cP8($-e+?g+|M7EyUY3{up_pY2w%Qw}?+8wM2Ite+;$Vn!FkGXJw@;Kr zEACg*<H77$jrZl>#oe z1o^+Ulc7aBi1bUPhFU^S5kY8V=h-R=uv>W}Y77ejb!zf)m#ro}g5ec8OZmksdta|u z64AX-=ILK-_#93$(LG& z=Neko%SS??lQwKFc@mMZiD{wse~X`M9||GS>~IDaF5M=_Ae|4i$6fJ#Pnv>KAynr0 zMdw^j4hzvJC&W0j%(r7qLk%Xs)o_0Lgrz?op(qpFq&XY1=;KM}-d*2XYU*X-rm}L? zE9Z491>!x{>s{yax%C(@tbHjy8j_M?rV&p22=7Mp;BHnyGCFRpD<&>hE=i$K8+{rJn zufp6L2DF^4%*&HqJH6|im$rJNYyTCm3o!^OZ^rD3lD5o6y}A{_F}x+pq6^J*?UxeBHrdJE=q|@H3IX+)mZ!oMW4%s$=YxA=F4}$mY?|BDP$HkFjBSzN&Xip$JV0{ zFhMU=m_>|m8Bln7A#AImiGmBn4TqzL@wkZ0(#KvSMLpL>gJa9i3r682m;yA=Wp9k8 zM#ZPgz~J7|iS!%q7a#1R{squmkm>KvM3|X84CI!2WyG2amiftl18A2)I@=vU6%aw5 zk;^CO8Gt>1AR3vU(U_(b1fXvL-?Ps8OOK^qrK>TdelzjTW(L7g2Rl0eWYGivOm?T} z7QoL_&}Sm->Mj;Ex%oG279xe{-Ua=;kpD;d0_^ShVDqp&e=juh85P+v%n}Da<6rrL z^d70jE>Gd#4zAsY-4FJ@&457bXaV7{gH+xH^#e8#{f~j>GA8MAQy`w_u9y6X)ma3d zH{A^X4TSZAbbNqV03-+gOBVH+os$LQt1lJ0Z}^?HO1Y7}!~r$Hwbt zrzGU0=BsD+_9)d-%LJ934SdZODT zu|Oh@U`x-y{D60f|M6jek}!y}0F;+s%WrZ69h*xo#&_$0tB(cURaLg`>ifwc-%;k9 zTie=m!~5#|zYkNiA$&Ukt1|-*#0oP08B6m(T7wCikPpD9rvXg^OZW*HRgVe{1)4w) z%UACQ8vvfrhNM`pi&6wg(1wNuc5mu}j+-L8UV{2E0*9ajnfq*-0|bu)YEYyTh@^kj zZ%DfV5{zVv>+$4xq3SnO9l#REl~5Akba?9nb?V?-Y*EQ}K?87s|NGw+HQ=QEZ_iP0 z3a|(K=|-A72J8S8Ss9ZqDNX@Ua6jyfT+4lw%(A($jt|0UbwPB?p@I$}8aV&%o6V9s z!AQ$HQnA_5HJR=f|GlgL9Rgt;4EQhKOyX85`riHB>ySf^f%N^f$c%>;LMDeE6&baI zq>YK`wsURnRxt#2Bb;?Ht+;c3k)%VDKP3~(|BOQ1_-!C=p#ml0D7&ueNsY7!BsMencMqA>5!HM z1~i9W z3SOXS3oxV&acY(fZr^j1P9Fw)xpL>)ZJ?dTob{!$b39!syiuyChVO_?e;XuSzQ)lj zNm6-fCIdYPzYahK;te{_XsMapg0;@bY{vfg7X;?OeirX+57^HrO<@`5RM3}(?hzo-q4;IK1=MND6pZq_3* znhC|RYIKI5$h+rB`j12ee9M#USUuIoQq^>|ZfkQ&VoY)4PydMHSQ`Pn9h0m^$|o0F zr!l<1Rgp0aAMp&(!kY6!z&_C)!0kQz%66B$4&>$Tk;D)+Z%}W^f?LfvgY7}bal9I*oM4tU< zCOxyqa6~mbRXtxpM?)o^g)2tcr=GKfkOkyND`Lwv0Qd^|&tVj2_RDt;>&**%JCnn( zZQ+3C;W;;JerVrI2IQa|;q)2+r0e{{<@~Mp$F8B{Ds-mE9Y2o2s$uy$j@e?~z##mp zy*dV*9w07ULqz_4mFk1!{^z2=6Tq$Da?&M(axu*cI_EEoyWh(%^dAX@$@d?2Hs1~Z z$tV7|LF2B1(RteGTMTb`yyVyqA#v-g_*)CmbLJ$?Uygg5GBjzYj1SazB~ zB<&!J|4_%8CiV`6F>vsvpNbzKh0ryJw`_TVZEG8(5KV(<8+~bocyWI(bEg<=3I>As zGBevSR4o%s(@bp~(m@?C(os$*2N-`j^~j{^^i$D<$a|};9Slx{XAm(rGs{nzET?+; zZrU-Eh5RuwMywo#!4K9s40ES|9Sjns;7YjXJmiRQnld!0ZEjXi#UHWee<4U=`U?Lg zXLt8tRCYoxXx$@Ld;pT%chfAErgy32AmtcniCBz&9)NzHeu8rjK$wxPPN$uE!v$Fy z3O)R{mt%P327&qZw@f2X(ydoKabR8#n4VpFJTmNDiN=TWL;mpv0xOp&%FM$!*uV_W z0aZ=pG%|-G|HnjqlOh*0xrFui0vvWL9d2*}^st>ob7reFGh0fs!+c3%p5$3Lv;!k3 z?pIISn~u9LNh1h)XH&Pyu)GIacJku4Y?b)e%9>|n(7z&GSmdC8d_@jXaFXl1|3pW# zvK-7YvUnGC52(*HD5~~w&ZQ{=>I8+-NL)@Z9_7@#I`U)BF7G;<86P{MzI?E}gW@{q zK-T^x_WU=m=l@OVfrLH$3+U;Slm4ozL)s40IU#N{qmnVn9JpIBRW~?4EQH zwF`Yznz43Mz1f@(?{Nba9eiLcDc9o*;r96bMlTwQQJ07VIp$a>uL`XJ_?CfnFI9+X z6|3aU%Zd0+vz3Gjr(1^_{sq}2Q+wVKx^1;Um9gg#Eb zRwu2UO&I)clm^)OlixNWe7C9MrpYyTtxhLkiA%zX%aUmh%nQgAZltE!gPcXyY--|yK~O$+T{(Wlle&M8kwGW5MpP);sO$#1^Da_Ot8 zkxh42ED(S$qno5ah+`AJ>s|O!=haUK*Z2RZCrPqBodxIvj$<9tvIHt-YI;Gm6TP|5 z?G(dn(5@l<5fq@_u|oR!p;p?G!x4576fXauK1}cu!hK5Y{w}&;;^93019jc}jG9cJ zT4AN#Q=i-ieyYR$N+ulBY_d+)6RdTOR}>*qS!8+kj>&Rlz0-AZ&Wl;=YGmvcXxpwP zse6AAsu5ZXt@r4&cUoX?6qDU9apCJx1v+!=7@tKasUD;jacn?a3hGpP0jn|r8aTw2 zk%&o$Lne{MDx>KPFleBUrcMS|_GfM{aWr>gjsK#cp+tnAd^)`&PvoJISUgowA%;3< zS9WQ1zrMs3rfuhX()kc$Fsnf2OEc0Z3~bYXs99VxyW%y`<=sYOHckYO3~VS?86P5> zSn<6VJ;Q9M)}PexJkUxj*3H49K7dmqzz}NWZSgXFM1bICg}`;6E|@;FJ>w*iqwn^5 z_2Tc&_UUNhob*BXDy{y<*i#YePkvPq`?jfG1#W|9_i zRYW^^r-GSvm1{a)t4%Y$^fkZ0>c^8P7E%*+AIcj*yzr9!7(WnLQudDRlm=R|4Mvbp zI)+4LYn6ft`is`tm&t*PD%L1eHRy5(qfQLht){Y)VrqHXI2i4JGs*jmd#Pzbn{wUi zaPQ{04v@d|V67lW12q-II1XX?^nh+qpcUaRrpBl*$pZ7|9qUb#LYEoRgr*KzXO;t% zSS9c;H;RtkE?BT0vLH68x?`l#mi>mC;d;$)i%{vV_yZbiN2<7F==D~KURQ^V_gTDQ zckk}#OlLZZfgnw#J8c@b;u1|wWM>v}freD*kNx{vUbt!lYB?3-9MX`Q)5`jZbbCdG zWhNV^i;D4S>S>u3`g(~P3b9%$HbH~AVSY2tpY(e=>pj!nvq(kji+Da=4YAx&TqH|qR7EV1&WWcf#p7+=0c_ysbptPWCy zot6!G^l(a5j?gOBG#r3}D6D6zTKfjD04Jm8oV_=WtzM+p7Y+nd9*pFF7xyCTQsLe? zwVsl@ce!6?VuZzGHI4ql6H<9`<8FV2XlH(R?_Nd6VoS-SsV-exDqEB+Zs z(o7k+b=?Of98SWie|s3jvawFrV%N3e0#i{20@aLQBxLJV1x_Qp`Tf67WiaYm-6eT= z%}l|RQ&M#EGJN^Q1W_nMZE)?}eY`E_5ERCNo;8N?)-&3Udo~iekeTV#X%aj*Ekubw zxpqW0gpD)A&BQPL6kEZdA}OfoBk7}L>0qkl1EFx3H;G`@SI$yi5aVEXrSo%g;W+o( z7xp9^c&|4-cIE>t_LVwM9Ku@`BQ3|wTaX18;%R>!%KE;Fn%%n6QMh}|&Zf&B*zAMp zje-a?{~~*Et>?PSSGd}tK_bkFSt*gyMgqpXh$5k!0uqvr_R*B=O!Z71fJ z_3DRE%ZiUw2^z>>=n#>mp{J({n(Oc%IJhth+IyeNKUgpdn&^o4f=Ept-LUzfB_28& zwArOiz-ZwB0dXk6j<^^DeFSbh?^&h)$@=zfr1|KVfg`JsLo!fEkNX$&93tksc|Ihe zTi0h`cnB6ZFYei#hOwz@kS+E}wfBtSIEj4S;redc?Z3jtCffA-a9Hi9wfC;mA@LweB?;~ z{1&y_1>Z|xQ~Uf8!u|!O$#JeqNcc#aEICP4y+f$6bl;g&qqA3YpBuIz>i@83LB}G@St5Tfkx=J3H{%UhZ>HBX{BGF+)6GZCChQg*@YHf4 zHLxeb)xlbLLPf0p?RpSu?lJs32+n6|-3ob%KgKWTl+4H@Ik7`m0^d*gg8yN{aw!LCiz1uD)FHkDM0-j^Pe;6xC?y49cmep|6wc0ks^J6&-F( z_YG5+w+=Gu=`1|Kb+M3NTo>%@^0IR?f4eA4528;^?`SJ~D!oL}{2i~UP= zOY#^40iOdwzm85t4Q^yi8ebMs>{kvO4w@m$hn@o)@^TaNv6P~2U&5Mnx?Hd2XswVf ztD=+;$JfQUX>o1xQMdAwPM8Uk$*+yb>H66@?H#OmOIIRf)@sLn3r}oBy)q~8@Q0q= zFn02{K>aR!#?NO%$~6cyIQnO=8x7&w)J0N_tdNO@Uqjp_%{}Z&5XRbaE#IO9cz>uo zpgn)iDRCm=?)JX0yV;hb63VL+Y$21&1$My^N${^D#*$6gz&t+fwAIoHype+ z=$>*k*6p^YslYyA>5Fw#l51o5+oG$V5)=2d^KCqundil)ujyN-LgnNrM4>0I%UFqg z7ZC8HA`RC_68cqig_@J2rn6K(j7GLGG^YIJe8tI!kj_=LSp=CLCZF<4zjR(M|3Zxu z9>TD&i)%Z*?<`R9rgGebCuJ44!dW8HD1_7FnWyFdDtt1bDjX$0^0gA$C|vbRvZiYN zSW*7V37`YKWB@PPQ&C-;|Tv^C1WL@46?8Yz=+0P>Zg{H9>`Ix*xbb#p9J2 zCuT~NbRS2|#vmIswsMN3gACQq*n8WR$a?GQd>HG+9q6xr_RH6)h9#{nq8M);*p`TW zx{p{wr)Vw@Aq2ZT2E9q?92`WL(@LO|29y`U5P5P!zc?TTwVEi2gohlNC_g&MThqVU z=6$RGbZKm=<;;K4QZD}LA7u}VB{vv&knN$J=a54qf#}2=6EBsDHW<*z?71M)o8Mm1 zDH%u09Z4>_MI{OKGc~XvG@|s%M3u}bHyo0IixxrOXpR}W+Z`Mq{fnrGN<5g?iSh13 z){Ppso|dLF1dh0w+K7f#VG;T8uzh$RZVCA}OR7QJTzji8^sq{_752<>Pk+)^K?Tkq zUdub+MZqaZN;Iy-;I~?Ilu=OF*+&W-KDiyvvUaP|JBrufTTdIP3drBN->De5+@1>$ zl?Pk0ue>_khiEsCE%PB%C$#7|GD(V7pNw4ZDDGnve=T46&_A@MiE%X7``C-YfjDLw z9UxFoqZP_5HQ=Nm1RBMY&!Gos2FV-Ex3)(#zE{=0vgBrboV4W@{!wovTq-R3kX1Y~ z;el(3Q~Mx_)=G_7$#~jCIIsC7+1bd`sA*=sY+wa>yR<;G(RCJ6Tta`Ffm9{B9DU#) zoTpL$vR(aDKxd|wRZ~vWL7hoA&tO}jV|a!-0zK*evWA(W|7l=dZ_>#y=y87zRf}SQ z_G>z6rE@hR!p!8J0}&yUGe!E0W3Xyt56h@TTue$Uxpa3IM6{MRDV%c7C{RmWMXT>V zaCqKMS0q|H`V*9LD*4y7;9nbAZzXAYG(~i|^@TY#cz}oiRfu#@J`21mCN6C9QtbkJ z-W&h{M`>3Gn*zga$bP?QlBl8EQ5A?9W)nkZGxtDjeRS^$H-uDhXmQ(xB1 zMJm2}uN{pJt`qTctM*L|uVtf^_W(^2BSmO(#B)gDku@#20JI8R8^KNoj&SCW8(~^= zzgv8>b+xLq;8xB%0Oz}vq$Q0q5@)$NM}+Z3GV zt>4Z-)2$fm!xAQ!wLd}s{^QVvP5H1W=NW5}qurGe>EL8BdD{pN8p2v#jmc8B+&d$N zP0BnB#BV(#cg^U-`O~ya>EX7W^vSiV(pwQJh(Dm$Snoc>m$n$uN_JW@WlrVr7>q8Y z+Iu4gtkm#P@G+3VzM=UNL?!A!(RL6WLBi}BGvuV46QgBf;E_vGcBVDdNtnOFKcr;L z2az*Sh0)feRn9!<9{oPxk4?&=QNb-x9)J`Fo&6){TCNQB9wz~V9OhIHYg2RJdrWx_ zM>-p}JCD~lcX?u^3bbVV<DPQR%r^3q9>={crMzNIBbp^ zQcA~UEhHIYiFHFnv)du*h+d*=mpq!xkiV1D3o*!I5B)OEC2eaSCzY1ePr4?Gn0GPX z3z4ylb8&qej$8G$7J<(x9*qii4tkN~Pr(n)k+(>>TA{CdUT_P^zNV@y0tn{)Y!VQQ zK`>y8jX6_+LaWSj4P_Z^R+YSRVHtT^PR3y=Xvatjo)lnKud{*M25y1tn!IZiQ$HQ2 z6-58KEhR-t%KdHmzIGSgj#Ka)_ZNfS>VaFkdW=jOAmk$Gy-x$PKUSkol4^$@U@dS_ z-oYPuj=e<1bkGz#N?Z9xd>bEycePMNy+Te!YMOI=1C8o|cgZRy6?qa#eis=L0hZ-q zO|ZrBl0P=LTR_kUM1Zeq>uyisYOe<708REVCQkZJ?CT)2XGjstE%XDE_+-xz*@ZBcc0at*giwD6lnMUbtFrgP?Q5QvHr{Yh!Qe2 z2x1-zu0=m=*pt5TQ{~*v28n5v2EKnt76->ZM$OIwkuA>xI6Wp``!0z=lr0rq8ZP>aF9 zWe}oie&>gQ3swFu8B! z@Arp`>=flP^{g0f5rzux*dao$^Q)GqC9GUzz2o^?%wGu?JmxquILvRyuQ|-O?ZmOA z8ze)R3wyol&R{HHm5k&6ZCwg*=iz{6ykvL3&ryaAKNAL~ve<)^xDuta3s_LYw}gOW z=-(yVA*kphAGyPa8YB^lz+jYEkd1}TGW5`xqb2UfsyZ;TSm{4vw_1~tM{vDU!TQw{A{+XLi z350<=@M`ik7n6hS1EN0&uHOoFft{6P?8oKJQVNpC*Q)~4 z-DKq2D*vL3%1x2HBJcL*H<2&xk93{$!8%%h!Z=+xs{RUYa5d)=&@p&gAqcsuy5ts* z(E3nxf-D14*!p+SCwTtteC9_TAi+5ZO5an?f*dyj;VkjwrC#5Sp( z-PQvDEkvpMeBr>~*I&?x4b6Kljv{&{=4 zK~xeWDv^8RPL|6Ii@(ff#S@kv^2Oz*{JEve+)xu+}F#{q(?b} zkbEqp|FTS3zagM~XMyJR0mndiAg=zvqLF95_t*m22h;$AS zs$M83`r`@yn-yl8Sf8v)6J1F1njt2B!`c)xo0oQnT}Yr8de>3E;t2NUH;l}(Jhh(c@wqJO!&Cxf@$9xp-`n!$6)9rG#Zz2fxVac1LR@#Kl>09d*dmo z=H_aGqdXEf-E=R-<=o-W-+!gc6L@E^g&HkH&M+w@sm4p0ePRmmc4hodDQ#H@0dS`! zU9Sn462?2sQ5zZhr}I6x-8np7NhWMnI1Kc>hTZ8wNV_^xBKx3MH>a@Iq6j`polOOPiCu1tjG}IPq~kQSfhna4Yx?n{(p203 z$h6GPT+>}AMT`d2XlrR@c08GAqBX~90NF#ug4yep+^d0On_12Wa)mTTXOGJR;XAZNb)_0LBW4NvtHQX;1Tc~R8~679;V=`d{JelBU@QwAi@{$8pP zPHo3g_$_11q@L7oYElbUSH6VDY7Xb21xd#RMBabk(!2+(fbAknL#C1B2#I9N=Hkz= z2MboUuFzn zcJ^=8)H^Lue%wx)K>Z_f;INv+ zvUd7lEnG@m9*hp}*PVUjU)+2zRzFXVVSX)+G66%yu_Kn!$Y$Vi##XA)$rfPu?2-FF z#JW1s(Uj9MP)s)e-9mQ(uiK8K!C~+@%*S0@GB*g=|86q&?Qq6tw*-BTZ%2)b)>O0Y zwoag}2t_Z2*Rn8ailf=u{L|zI!HW}FUxz(vtRhtw+AAU=sJ@CV>I1K~8$HAxXJJDm zW4Q&nd9zKOriw;AsPIiq%7=q_zSGx+hJ8c~BTSn-T@0NKrd;ixJq&d4 zuIY=YG?$%p(y_V5ouBe2cW&mtm#tF_`?-5*f32EI?w#AIFH9B6(pev**{nlCp3dH! z_P*}lU*8-5s&nOALg&eI1vyR`9%c;C|A55GL3Ta?3kA$rex>SGvJQZuk#cqv{bMYu zx;y!;va&K#HKD0ZhAj~t#VK47Rf!sXj+sVL361#<4do6^@-AEvFaj;Y55%NQWH9a7 zBVoVQ3={~r0wd%cLK%?ZqI!@v7Q!qr1TaPcHXLd-TUSX_03QG_7EQrYH{aXA(lWfe z&f7uZ_Q)%e25U8MjGVwYIrUetg#N9usfp<8=z5x(6gdVZ+P}%P0On+_c{XnUt??a? zs+}qjQ6{;^C4{+q=1=l^MdJW+5-kZ+T@%M!Qyozp%%6_*3BiVcg&ElzhUTV* zmZs*-9`y5EL!&errgx|RS(O@-`r!CbS=MzwaXoXOJz4`ZKPqB=OqPg?kAaRwhry_U zq=cFT=qZ|{_W&GV3ecjuRW|N-ByUa>7V1A}oU}?KUa91YP*Os3WePz7unV)O|cUS|WNpOGLbs6G{Y{q9Ux~oucAhJPk*KeK|7-Py`tc z+6hS6mtl(%X!)~g3V37!xRzcdfkA{YVNn9V!B&J3xS>sq1UEs#m?2@u7@}dlaG8^+3l>5ft)igwdMj`O?Iwb+N zfH1POQAuuq6CeTnj|lm;lL_Sbs7&_}5zBMMFpO+#`sia<5_M9N;n-f9C}2+jkQN4$f6ZhAmm-5!O~F znSdoDOwRFSe?oqYQIwo)d<5wFlikNBu~xN(OWwh;Cf@rMmz130oKct@2^dp6hJ@Q} z;qt0L0nI7->K{RL0=%0UgLmma132~%NJUpitE3eZdKe{TzL{#WYJ`stkk*M4iBgFU z5{XJk^vV*|h0<`5aPWx;bO;i0X%MyL@)J>jlaBp&yNc%~kFqAo`=3**I}cz#+d8_E z9-9DC%_F$)0(>)?lw_0uyzs79wN5G%dwX2keNIv;I5_E_1tGs1L#8k_;_Jx621Xpk zVc)NkWFX_CUwiYo#a~tJ9;*t`=f{g0cM_3Q3jx8tqCrlHXvOS1O0ENs-d6FsI`N@` zUCNs&OD#*5-c`ZMvb{e2Vw&D##obNCif4-|M>-6D#6s%(FgJm!RG?Iah?t2zMi2=K z1!f{J2Q*YL1zeHrW6IVU%jx{|ah?rWZn3{EY3Cx~x;SOF0`RHG3zAiuo;;fy8;$2$ zP^y-HBuwH=7Borj*1~D;-f6AsO*Cpk`t&SDf4ci3H?zZxqHRCg`@aIerVTL%$Fd;= zuF<`SRBXci^(S#|N(~mq8A7uRtF6dInk?W?o=<~Zk{isSmdXwDvEGxug4g6FT zzFWdi5%FW}bdixl)c&s8@y#J7$quMy5>Yi)fms$Zz&JJfmIMSv#3J6^0MmBRQvk_& zI47If*=AJ^nROg{^onD-Ghtwq9c|g+T#ls_> z`d?mW_-!_Kcg5ApXKKzLqK)JV9Di?+@r-Y=9shuTN=Fwg$BtT!IJiw-I{k3I!o}Ta zyRw7*j2bt!_|a?o);3@}CtaoDrC|4>rO8klzdZm!jjqRI9wimHvs!bacwfBvGFOKo zxQi(lyp4w!TlNSVrES4|1mZgbnD_p3@;=idfTAGt{~B)euTvDvmf|m1MUDXk$_ppB z3(^8`L;Zj5sV-nNzCxvi%gJtMhvmNuF*6Ww_mDul4YR;tzy!xg-}ZomFuwkRSCp6k zvnbCXs?R2Vb*Nz+#nX9y=n z^ksAYT}f(e8ww!O@^}T`j4%zsSH)%gG<F!-kW>2_wv`sM6*gRX`A z-P_Tb-@i8&l=A>K9g!N&fL)8TPq}mdKJuK^gv3VbCtK0Y0=-^-GE;JLn14;_U;ts+ zNssHmEvaxIPzEXzBh1U%ka7D5jwzgY6!J*!7`F!t#p!;H)8HkqKKJdwj=`;B4y7foyeoUniqZEnS_ zZm3T3-cd~40jRk4=JVgAr3&`X5xhZvd6@+J2}Q3FNhK-WD3UR2Dj5g0$07`_T1#l$ zRMxjqhRm{88 z)J3rz@2g97_%;SG_2whm^9Oxpf$Q8p3Xrr)AjeTBddy8v?20W=^^VqMApZ@9kN#4T z(7+#m3~rM&ZDbpg0H!Hs{_bZ{&svGQD>!;OK&X@|r_Kf{+UZ(Y0@3In6``UavWec! zR;2G$S4$S5t{V=UD)efjj4hN9K-a;Ot|EIXQr<7GQ>Yj(6ybd~lYY^@!TH%+SmTh( zt69=wb3Z)1I&V%hR`r*A>-4f3nxLAyOPs7|#AqFxfTY?=IIf z%3;dcQ45CycMp+sS-BgpNhlCZytdUVa*2_S2NLcM4Z)A@zRhSq_2Di$UA}vrQ zy|m`pgmw;BXEZh?` zCF5S3RZKk<{0#6ts0XHQQWlUQ-lN8xeY-$&NQ4g4CWFo^uYPlZx}`doTOEcx0ivqv zzy3pH68Nvt^COJDY1HNEEcalba8XH^w2?*k4}bG9PA(a`w@!%pqlvWwdXogf1EQU% zP?T|LAd*iXNl3a2yt|;{ibTO-8G=tnJW16mPdEOpL^hr*;N09f>yPdzi+t}H*C zL6qJ+dBZa7Semkp{uza%;$$rX8#5Oq9H5kfX|`|FG|5p9ioe$ggOs_%$$ZQ%aw8Wx zjc7t?dbk9lkxN8~k{Fft&wjO%Zryqg@jQYiFmeC{#Z%Z{F5Xx7OWmeQ06}rk(?&L! zs%8L7N}+I8b2H;Jhw->4P(9;^Mi)pG+tCqR)AysNBiBsY8(0!vd6Fxz6ae@e@B%OI z9Kc!O>gXp3m{8|vC>yOC{NF`F9H2<3@Amhv7nHOxjJ8$qmOV38Q1$wO7xa(51uhiy z)|ojrYMbepk)W=j4vfQsIky862JqUxjsl+k{cxgjC4V~>WS5eTHXbnQ#JM5tz@Iy>By|fbc^}^<{}hbm zmpMWD-q^YE<<<=3_muTU@mGt>NKHt{i9`~oqaI@bacmRJ%-Y8b*a)y$beTtYj*wEc zPN1Vhch=b>c>~pcci#(m7YfMKv6+O2Tc9YZn<#Z_4r-rAI*|RE%o~JBFH3+?**66Y z+Y6wHzL#eF}UKNY|*|@RhT%GBN_3N|b;xl(PU| z5>ijgvK(ol$8P;S9-WhC8?Ux=WxB8AgtRnTxD?8~68ztItSPU|D&uLKgpsuj&0jUg zm3~(CTPCSYglwXO0m)U)>W(`%J@9ue;W8epU5)SeRkTB!2@K5bq1teK$1R!^tNNxB zYkw^aJ{OYfRlny{j-mkpH9qUOUO@Q*dJ_LG55TkO8maK`=yi)gyKj``34hN*e%nvl zG!_B{by89a`WkfHwFeh`icMC77b+h8?Y5p&>!}r%LOv`lEKKlUZIGwSEX1F1 zP1QBkv*nasSn`;%{XI($cM0J?QKQ(WHypBcRu5u=2@T8V-OD8E(P+}448Ufqfq-@d zxls;*4*>5i=Smvoox31+2h#vMHJ!R5C;Qbtv_3eHo*d-jUIl1|ihE|3x|H?C5Y~|9 zUn8t>hVM2SOR3)GYFi92g@C z;tYN|F&CNu0|cBkqKLx6MO8>UyeDNigiMAJav{Ig{njTzJWX|B(H_i9Jj>nWXX^9u zXV0#kPm22^WZ0t`-_tX}^K00kZN7?%S)h6HsCGU#tW?XTF?PVZB=m=E$kLM;WGC;& z#}=@}t#mO%YNK@OIp%`2gPU00jrDK}^hbqG&E5CW`M1S`oo?kY<}PUsU&*_W(W_hh z)5$Esi1b~T(}X+paShTED4o1?($iuo+-YS+KcXhbp%x3UNrOoUwiN8o(>Do2@!x3R zYb}?t61P)L&!?x0(2iP?23LfiN>_0y1xRUh70rM8 zRd0s#s*h7whR8XgYAR|IG0}Dq21Lr4mL3)SKifVnbjFUu5KPOfZPNxE#} zU;FiElOsUvW4t_M>Y!#r@7V;NkWZ;uFIELd*m~GDASQ>`AS5y3|LiS;rdo-pSG=We z(d7l*H7DSHG_^sF3YDFRopm~%Dx!b_9^RxT3ofTasSqsPSC>_-P=vSXWusIQV%Qy% zkJY8>Z`MTOpsKA@z~ju>c`mp$P!18@*Bdad!{PnO3i(O#nB0Id9$vO&j(s70OZ0r8 z?`#-hg!+ScvWL4JHM{>iFeSAxVQ>u?iQ`nf*C=tji;|lXh00<~sPVxcPJ{ra~NS=GSH<`)_-LcyAI9P!wr+Q8!Af1G}d* z%Ukl*)4Ja*B&L`#{J+hv9BfZ-$i4Wc?cowk;ve^n;(D-lCwwxd9QAZQrpkSDT|BgZ zEh;3y)=#gXpLtV%MQ-FaU1;gvEFI1qF?W5h)oNG{E=o>dn7&Dg?%4u9A11*6Om_c) zcezV|e|5kkSBUEL_6A*2&2K8!8)u_tFN9Wc&khUW@6|`70Lec$6n8|r0ks$h8c4u} zgQQ})vYI~Zel?n)go9RHbXGhy`3FV_23Z@&n{JgA5%>Elm3Dt4CxrXQa$lYm5?6m@ zuJf=me5GBrZb4yT2W`suXx%wsqMtdDUK{JHWn4}4BbiEnEi0Q^;&X%A%dvkl*>H`V z^W*I-*TsT35{dqsx-6=vZSdr=;sSG7RWVuO?+t#X@76z3ijyUBVNecTLe|OyJdl}t z#xSdra&ra1Fbz!jqk(H0$wHq~f;M?m2o7^}P7flUH$jPG^s*RaX@b%!mTRQ-9#(@_ z?iXne@aGWfVTyxKNu*VpjoQAQp{js?%PKGXpoC>=JCA zB*|Oq-rp!xiJ{~h=h~uYFMH}irC)+(82)V84koZ{Ux~Zt@#PfRk(ZK&UH4;c&+mxa z4L5BUHEuE&B*b&}R zb|5Bw%3hOGT}cLa1Bdl{{~|!m$Sa$_Vkzr@n_w}FgukiNjxMdm(=#$#X=EK!AJ7b; zpDE>u#8!6F;@)VnVs~{G;kl(bo~AaF6Z89B{2p{3?keo-C!@|o{7rwiF5gjD#q#v` zNeq;InVr1ZinC?=ATi5ExzM8H09ubx0afZi?Q{6{y)@^~!|P7s!L`)M+h=k*8?2xA zL%l2>P{p0ZbGduiv?bsnJ)4tb03s|FZ3X|tfq^9Cr zdWfyqPK~_nq%{nP`7HFj%QvZv=4(~cnysOdsv(NWMCXsD54U%55l{}usgn=s*3I*O zbO*Z3!E6O*D4mvhf>SE$;F$wVCJgUa-bOY*woFsVy)R50_TrAN^G-oI@($9!F&R+Q z?s!JVFIfhw)l$2hFh=azbF5X-;fs6>25o`HE=v|=QrFa}c$aZ9;v1BmTh*lIDethU zAY&l)qz1!*1-P!;g!!1cx{K-7I=GWDglY)9-uyB6IK9_blMnK$2?*!qc8ldp+gcP0 z{3DHOIBF2~gPHg>V4&ypDOM)c1}H^q$LfaQCg7@LO-D}7nwz{L+ltD&4-$V70h}Qg zXCD}LLC2nU+BBn=*@{#CNV8bYiXm!U?R6a+&KO)8d0A{0)kqo0MECSO?*h^)wc$b_ z$uaUYXE+t%)hui>ye>Z<>svv1nBM%3H)cpBCVoYqWAcq;m0&ji5jg5ZGYfCOd@|l< z6bn$Z0+aH$N=9N@)DykP@yD9K%`RAl8qKeB5lk>H^VCX3;T~iV1F=Dt)rY(*a4L3v zmpl#z)VTfig(n%o7ErL&=odp)XZfX!G68EZdZ4$EZA`Kn@SEGWV0}?weIRuXAM1Pl z(TYZO`TR*0eOX6V=6_Es1k;Mwd`lj`TUz4Cl!_I%MuSk9^wvt2BOi014A2Fm8(5Nk zEAl{?KbKNgV9V(o)VKP!(<}}uUG*D&f;qB^vDUrV^mSJ~rq{-0=hqT`i=wqcOVS~A zs6li4=vn^P){$W#5oiq71KKwJ&0o5y(jxQHrl`+D7;n)?Q9EaFmSZjmYi6NkYtCaihHfAPBp%v3PN^n-TCo(-yo; zt4X$PnNPH4Q8u=%QgAYM$DiGCSC0~qgd7HJzg!-Ec6gEJEhuj$wsEg_G3*o&DcxXA zr0vb@#%i#Mp&cHP-B^e!*dJ9NElbphcl$XKbS-Y0qxp12`8eK58*OLsG_zHA|J_FD z_HwjS1FnEWy+=tqh|niO5&PKh@WR7)a^JtS_=xGC82DMj>_0uEaVRh7Jh8zOD)@i~ zSDsGU-_ZZ;cG7@gq4Gk2mz4T&44eqS6If*px!a=b2Y<_(bPALUlQU&Q+omnJQ$zrA z9D+JM1|%f>_SO9-@BWnokau(*SSk&h318C7^Isi~+=N&@+nMIMCT#8gJyztSMVVO;?T7!Xt6Y8 zSyp1U>oQqSlcSRS;JH(-=G#tj|1^xP$ovW{NE8(O48?l36#W^e z?-%M08FGiDIgi+79vYs^hLH2;GRy#$$%( z_aA4EvVDMpFI_FjqntO4`0B>GK1)t|qKE?t4CVK1MofVcZ|1P7w}Z78xrj#(pKyP+ zQ>h9MVN_KIz#r-w81bExyku(8S)f*E>iaCo&hDNy;@{z075^!!VA@8yyl!f+!_gzp zwENJtCJ~GW%kjD!Sv%Yb@~v^dKrmrWgUi?RI%O36Ou1j0hYhKs#-vDadFYtvDZ*rI z;Ye9ln}40P=e4Ex>gvXh=}CRK-W8k(WOGVdl+AzK!Y?woPfb1e@`MUGB%k;-)IA}_1xDI>Xin82AWbwT#d>q-K3n?c~tIjqW0w!?Q3+} z>&W5+SMRU!Kbj`kx`1rSRjtdQ>na^q1`sP?x-4o7WmRZL*HMPG1naY6sx z2O|nIT1572VF3gFoCe6-@xDY*%HKkSi zC9tn0;Cp(cJ;Ie2!bR3(ZPWtK;wIqjU>aoWAYkaRb$~Zf0$hFx+jR<>gZAIb3Lv%Z zc0GsEE_Dblu84vsMX>wk^%z2h)6$ej;;5a3c*n4P{`&lUCj9>X;uPx*kC4+qIe?ZF4_9pVJGobE zyV3lPg-z@DPPQVK-yzR0WQS)*k(hH4_=O!R=yw)aHie5-r7-dYv%kZv&;ks0L;HKP z3jEyWLyR-yuciQ8mzVB4>mH2xltl}4kJ4`h^XI#-t6-QdOR&0KM#B^7=|FPS0xzIF zwGbp0t#IAIFF+Cj`e*FeS92HF^OPih*NRCN-LIyTjJHADW%3O_xmS!Qb}B>k8}d_q zHK}GrVeZYs=<%>9tZAaOX6~`U>kNukQ}^=Xs38voxO4?eqGlRE^aUR?is}v;j}WI! z&MGf6Xm$lk#UjYm_p3|Sz)OT~7>?j6A*)JhPkz;+L}N~RR@@9(y%U(Ct&LK(Y*GE* zN`Z6Y+8<7PDe}QuA}4;5D#xy|>Y<)L8U4_WI}gM-m2yZpDro5ec23;~J%RKG@HsMQ z8|Cf$Aw@;IMhP%0IP8pHhG=s#a|>cMZ2iY`I zH?8YAIxvuMWPkM1e}AUx=&=2dE&`xiKm;HC_o&C9K;hi*(IH$!Afg}|fh!Q-;4knz z1JKN8G-)+)tv)a)6FW@84lr6mCh%KB9S8w%!W}4411A^+c!LVG7-&N`To_n_1#*$U zAL4u5zXpI5Oy3u6)k`+6i;zVoJtma$WG*V3FfC1gmRwQk`U$_!&373C84rH{gz!1k z_XkD_<(e^_1Cfi=)}@W&lxx@WB0N@Z7EL$=0Xuyl`Gq5oGo260g$qY+JqDhx zZY~!EzTPy6=CuFdFl<1W0A9vV>0O^f>h1y35P5JGM*hQwtOu|ZWunCBX{1iztrOE& z^Su+Mz)**=+Gq{ea=^F| zyxBmWG&k{q9x+^8Xl%mz1j-7XfEK#}{ui7;!~ew7SWUFE6soArA(Q9MbWok0Bj11( z>fxw5TWUbdv1|SMhAP2B0$5Bbm^L0#w5UZcp%QqKLmbC@2Lu2t`X9O0iNK6z^=^o? z{-OBW_Bof;4tA!S$1V0y1JIuxgv6|W_vQ;IiYBt#rh0SaNBsSK7=ehje+ovYH^F%k zdtFf;?c{d7I&c227YmQ@I|fcrUP4gVHJJ!4x%8^kz0;6honKbFlo%eEntNS!t6ngb zW`hnURf9;felZs(Jt_{_^vxport2@M$&>q8{E>CdQ^&^kt{+y`=h1KVOLNu6ZwHk( zQ;^&iOPWQlxaXKp!-C&~fAwXa#=?^dwmfo3R$ZK&LB1}?MkN8dB1JLlGGBh+Po2RJ zl026;US~mhQ1r^KbA27d99%K~O9@0Y#)331VL~%A;`TzSO+j@^mIjOtFs=AdQHO(k zCW$Y&Z*0{=FNTdZ{XpPHuphH%M%{|w6sc%Nrh@a-)sG#g1OiK1(C!zaw^I1apLQ`Z z4Ml*FxXWvjK9Cnt4Qqp?yWkkYNw3|@T!#bzu&<^_Pw(t-U{y1$j^B{yu%$-p zWcv`8bAwCxK3*G0^ah9smOPq2lTxAikCC&%q=ODfDG$7bk`^m|ehFdgVTce@#%s_7 z(>{#&L4#B2NxGibNsLf;SsmQ_s@$%Y#Y@wJ>(3s|vqL0rdb&pr8;omn2jB&{A*_OC zU8^*uk2v|`LY+Sm^nbm@y*5hf^nCXJ7$rAX5X>zoLd1RTcS0b#4`2ZP4FKr!pg4-B zvqR;X^!x^mwcAUPF61>21}xDO=2smLF;x^sFiKCeLWybOm;eY^5$P? z;-ZO3NkEGaz?aS5>!TGTwQzLOitDZ3;Mrk6I2P@13~MZVdP3;-Uk5!t$6;9!E*usR z8^eM;XOXmG)(8h4J)(rq>tzgM=yAB<4^^;YCpXBXEURQ)HC9&KXFcJsoHI`h>mzt? zuwi6)+qc?-ueLdMrU57xs&))w@Kv;#_yD&!$e3lP&k#!HAz@LdjgHjS8=~N!O`lp% zeJA89(kE@e*HEPGd86FkA7`AD>fi+Q;S>wO@eg7Hu9Q2Q^oCK5VD+3tz zjOFPM9PEmQLmXLw+oPHYYy5nF?p44dM3mzoD-jaL%7bc}V5S6<7Xck(z%uV)=u!kg zD+n?R7L`K$aT+}RTu4abdlY6=*Twp&5X;IoR87;9X^0v2=KWNt5-J%tLFA!md zw@`TptvympPWsPN1Od6wuKGbTv~*aPBna4MJcMGX4)dR4UBzkugxyP7#vD}u&D2P`L(6D!#ZY=)mc2}-ou@-WlMWMw7Q6~` zeXdcYmeIB$OhcT*pkYyn?mM)9NIqhxyYh^bfI5ReB)Sj1Ka?)-3n)I=Yy)JL1gebB zef{gv$qRbRNe31C!jYC>Mfzz8HNgUoXiO)Ip#;N> zg@yuV+hwhrq_SsTcpe~B)8#{ z&OHRN{}Dfi1Q%-^zT;4~H5P3r0~d@Ia$QA1^d>G2S-t<*cgG;5To6*WUJpCs8vM$v z*iWQao}G0QuCuw5XuSM_tYIWp?5IVB%nPRXf>OPA;=72Yg9;a><&6Va!>a zwL2WtAla8rq)C|u`@IGFj@RDQhs~XfE*XK-q(GIV&JNyQ z9&hKc2Q%;bWq6T3^(y4>eB0LNGJIGhqM`#ZwGe)5if-VcH0G}~;MB=`JI`!g<9x_f z8F>}byiOAw9KQMIbdS;JIQ6CzI@)|c2XZ!Q%_Nb+MM09$01>ZBcx3Q~&H-L6bT2D!y)Gfqs_Ugh$6Od_@HUU4HUx=0|orIN}_ zpQ};L1-RLEeTM}C5;&0`66AtwAxtb1Bq;(^p=2;9#{e)-NXd{^XnKQP=x>)l3P8P)jzP-Ks2*_YV59c9S~WcX(+$?1)9uPU4{P3D72> zbm%ZJ^9pcAB`Q2srLsaagmn{n36u;9=ud>7sb^Y_$0x{*Iul%^HHgglMX6^thwn#0CH%O;$CwYBkgGxpC^;`;J5>pjc2o8+h z%E(ZA?~sBlmwb$2&s%RN_S>HOc3FNrXPUROn}@!XRI0@AIVc!$hE=U3L@36WaY}81 z_3EV~@n`nkQf_fc--2rp%KlAI#=873E)X1%wY^=}wX+?hJ;Cr3$Vn>Saj9eZ(?G;J zjfQ(-X$t6JqGhyT(E3Gf<^$WdrlGDI+PhM=^K5eO!{xVc)ev`QRx}&$h zA9@Xdm6v3u3!SUt5!lu}MqQ~FO6A$S&J@*~e7WgrL&up{?NW6|YkE3bm}}jhH!NDE zwT9-s`E4T{@Cf4X%tt`o6{G#K3>+--jgxGK{STd_Xr!jKIeW}$f4DqY7D_}+^j`pnUapZRu)u=&ORcN zT2*?6uGV8fQe1+0Y z0_Dz6$!|RoA9K(>S;;pQ!g}wJ>L)yopM?#p53RO{RvH8uWWiP%<8A3|!aJh!cPt{7 zb&yzR+JSt2Z=r`C2qa23?3R_3M}$hk@+_^X@(_F62e;3>rhn@|{q25eE?`W)%#YK& zU@9Ui=17Wt%6Zw7GDX;xQ+vm@&iy)nIxh?yIsp1e4c$*?U-3hPr7cI;Yng@8O~W7H z&%!GxZ5KP;uy_+v5%rW=xfr1A&cPjw7>!VuJHo%LZg!=qkE*oCq);rY%Leajm}lOS zrS>A$;)T8~TKf3RGiZ~I+)3m^OV&yY^cWfHS=cAX^~IlTu=D|W}9 zg_ubh$+(B@u|Kpuy&u4IH)Ay&pzfLAy#g@4jBsGTU%L&9%))+91(japfhXwaTuHAE z2-zhlS>oh>{HALyq06l;flR{J@R&?7^7gIz#(ND)VuHf31ClNbsNo2Kw*O;*Nd-o` z1)5vV;VuP`>R9;FLnp60Q6qA{YPD~;$oznhJN;L&_Lgu#(E3VqZ|y^g;dPOz_&u#C z+wNbn_5_YFeMTP+=bjm)@ZB8M0P{#t+9}0#B&Mub*RzdOMzXu(s``6a;RY78rDVk- zJ9vm7=e%Tq4Yfo&CCr+HurPuBtUwkl3?#iR!e-*xoCssWrGI~#-ii+PQN5~Y&t9% z7|e#PGsKe=Pp@JtDJy8KmJf70+g4}P`&{xUq79^q-RX{h?Z;b4a&wpMo5$(v6NIy^ z%kV0TelV`6kUWvma25p5N{H5F^ZKQXu2U9X>Qj&z$l*EOfr!75NRvQtUpUnp6$ynV z_Q$Xi2!@AZ5xldQRPSaRMPqm<72C&|O7Ccf@!cPl5LiigHk#~@gc)NE(uQ%mD%X=T*P%KE{lWb#svr)ATjQ^N!lY##^r zYEiXX%~AxbeD7@3ihSH#)YmFfFQF{ae96m2~t1#T&fR3x+@$rCG^k2S~K1K=;UN(rV znxTAxUdO~u!_m&fXG9^3Fb8Lit&GUsuC{0lRTOZVfcYVX7|nhhn&_(~^T0)U>O)d; ztw$@)yaXOxie06f(7S?Eb6NXa)@jQ*XbTX%%?GvEMOz=s#6pXve}0(g#%4HVjBv|BVNN}zwObSkXO zf&s;A!>H|m#O;jL;^4O(-eWJ?9S87gw9q2cDM43HcRluSvy-(c% z4*hrnM*#HABqBHkCNPjv7L*8JF@Ui9zZL^IW1(l&C8dCW8~NP{K{0Sym%a0~*tQG8 z*$xQ9|GAt1%7hWzNv9)(TY*SBRqYF}9TI$32S2qLW0_(gpjC9ZH(TFZ1Aux)%`Rfy zuj@K=F!{RLp9)MF1`f0bm8bT#jAM|A5VVo?{H&N*%4cdL!)Nf!qS|nKxJ<uKYwrnyVfl7xq7SQsC!~wqG-g<@kPY1NS*)El1@8fdp zZU@VbVy76LoO>O-)ZBfJ7fBRgHVHes3K2rE+)KfJU!recD z88VU1u+d;$1^T`N-e+6s@uddy4%GDq2UQXOhiFB#2KsgY?t9Pob$Ji6`T>j;lxCKW zqTT+Ibq3xRVg8c;Vb|^+NFzjza#uQ$(>R4QW6L%lBpyvk3yqN5hs%77wOiaeG~3XY zaSfIwXssqv*d1#_0Z}Sq7yd^A5|9Nb6M&I8U&R}iq@RVM_dQ&;J_Lk~WS&6!$wicz z{a;r=(3kLLX_mTvNPm7$vTZm?1YBfC~q#1hZg}(wLXQ>vNtC-HcZ@{04 zww%~{oY?#+JICv{)}o!Q24v?W!{qSR&f%X6_pXflE=%t%ty9F>UJndtrr)Uaq2zz> zHjWp3(2lU*=M;Ph9jfea^R8zv`6d}Gc;y(r)W)QV|5h6Ag| z)W-H3Ao}g2#Uzb-OB8vym9pFf;F)Y?;TZ%QoJvQWU%30f5IkumVu^=K|OQ7(mH$6r-nr zE7ZB>{A=f`^-jwT>FJtRXA1$0W|Y!qur5)Pr6C@*O5^ib8a}1dDsbp!VQYQw= zN3*ll(lb)CxK{&J64)qMY8nllU}$je4ww-bRNZ>yg91mzINyMm-!cE}!qos&#td3# zKf3_x1Y=Q4S=nwu4{rt8aR2Ho|E{j@p^|d4TbZNxz7Dsfs^g=Vv|F@oMT1-kX0<2M zx`X9}dAV`_FM(XKQZE@ZCqY9yKP5Al>lv*ATKG^;l`T1NZy|9s*qT_A5cxkSE#;tt zw?t*|sDod*HURUzNEr;-^I@0>)gTO^NP5ElYO&nM)PramEM;1Dxqe}8T%x98ye3#& zGYD5qgcK~mS3i!=zq}7}0Z4}doU+=0NF9k3AWwI8k zn8hj{oU0LnCN%>PQFlcR)3~nGt?Y&P(ai<4M~9P-PAiUUtfW6b5exR0D7>Z5N@B}v zj6Vadp7^d@-AI%4*ia(MfJq$y;r(tMP@CZ7eJ@bM(_MrP=XtJ2*|K)>d~)&N*lbn9 zGiGG7#Ly`0y@wWnc)t_yDEsQLz;%Pz_xFar>cjWrQm_c&wzB za>E65AmFb3J92%d$ic!+9?04FQH`Q?3l*Q;m3*E|!9II8O?Bnebhl%+^*KM%wSKTV zYyMn0F3HNs^Yi;}qh|jdMQ7LYz=Qq5l(MEv{>|8=nXDIsujPb{43TBzeK-r|6ut6# zQ9_0TFL_b=#b@41L(B(VI`1=aL8rLP_ym;&eS&Q2H`xt+4vX!Z?Q_mXKa{?N!8B`N zpA})49bo?+fKRhyz%9%!00YO#TXD%$k6l$1h{XyVb`P@vfOmbJ>3zzLa|kF(4A;$% z2gKqqC`#i0Cu8QVnC$%zpJ!{~5bf=#FnYjQRypdzjGK`nF2*EdntW~yL7le2P|^pk znEvG)&g5Lx-Lk*s;o_=A>*=IUWluqboJY-j%euv;ZF?RhOCT7bkzG>e1VPz&6CjHB zaB3bC8XC31#!fgcZ-X`D-YL+8{5H$(Vx2#S4Oti3y}+3G8wq@ux9e^6cu|;QdJb(B zw|aCeRK%`$3BLADrjfOFMAecnd!nS5i%Ufe;!n=EEPc`1TdnqQ@|vCve!8H?#&}dy zlRT3g_Od_DJ28P|Ril`9;3EV9$DYDI!AFSZ?ttFZg}iHE6ol3=VVa4+dEo#C!NJ)r ziX+nP?%wG>>=6+j8VbHnMUqx>Qfh(W3;MUnu^=}#G5@b;Do0IMEj?Bvzb84)ph(F+ z!9bU$JxD#MT~WjK{39YvP|{nMTAf;kh(!+AQq-CuC??6!&i!g{!Olfk!i|t+bgbgDfB>0f3taw3 zC6$o{Bl@Q^mUdw&@gwq~8UcQ)a&uwG=HXG(*`0n-48gW~Gi>7$`%=|L<^ScfYNkgE z6BRQM z!GgOxgamhY4esvl5TtQ;f)m^&xJwA`t_e;Ec3$$WweQ;N)V)>re^>R>v!{+{hz8|Q z!C{(#Z_fjrJJ0|S`orW?g`(fIUTyzTrnCCnRAcfp;__0x>$-Lb4Mzmsoo$8ls4#*( z?#VNJqr#u0r=-tqmzEnA0xd{MUcz?gD;#sTa@J-Ujodd-;mjJoyO5!;Zv#ru%HLC= z_8bEHJ8UGI+BHr{G?=uiR(yZlEnng_tpW>-2Pw!>fYx{l6ZD$OIN~4S-zT#_a-#K{ z8ki!oej}%XOL4^?bft>EO?Y z1+=@qbp+yw%OB`J`>481P6=&#roMJm)*sY7Dp1~hUT-P|Ix6m4?LbEbI(U*FnUG}F zs-ki9iRU=$GEPj7Mz4QeobO~(3j^uzSIY4uy zu;pHK{D@@`iylOfw#noUTM?zY?A2PZ}lF zXa`*;KZ@;lricNhcq)Uykw~!*j;Ac)U;3a2IyE_R=5ImVgc zdKDJ_HYO(5Z2N!_epN`_N#h8^I;mkdvbzL9q2eut!HZ{JfJxeVN`bsY&GBu5`hmQ< zIkwPUmH6dMB(2yFdm=WCCXS_(uAtGFB-#%t^7(S6a#0q z{K8+Tf1a<&%j=Xm2x_khnWI#lW~~D)3D{8r>(!u$^II=Tj1|Wu*59NdJaAQ&!emVu zV|@I5+6SUUeFmOq`vDtHDYfhlzp8S#5u#Q#V*W9&`G4}%`DaHrwBX45=S5&lrtkqn zlFh~0SwUip0F53ZJ!ovY9Tr|@+RDRN%x^s|W-?MTk|WNe>))LeQ~5v>YFBMub6oTd z?|GGy($W$dMuw$ml>_lIcIsV$Ak93$d8ae`+nw^3nf=W(m$i)LcrMU$icS# zyh@eFzG}TIPP(e{TdA`11LWDbO_p9|AX*kc@m*0LjBiG=zo}4sh!8Fi4*Xolw(3n3 z`}s-g45F|?xT;C<^FPhDG26aZx1IKq%}x=r?|*PbrzfWo-bG78uNae!Nw)ch9};cG zP9h5xqD4OG4r7MmqiEj_gw`64;5)sK8Nk0OnzRjY$J%e;!HSycpEUjqaVG1Ch*2nk zrA$sOao`~t{wsE4j?MjdLhzL~k*>St$-+|NT)AB%T+(=D|wQls_+@c~Vd1pJ!c5dS~6Or!*X@jHU>v70Czc`J4b zm5!(H9H-B{oi?Gej@6abHqsyj3k@T|xMK0MgvDq%NqZdWNiOH>1Tn^%jyububb;!0 zh+)*GiSM$U*vby4)eSQ0z8d6COok7OkVPDdD3OZZ(tRuux601 z)9FurJ{Sv^R$6a$8H5=Gi|D=CgN}NA-%5bm{@IiP0q(N-$NLeEK^y)0ernGTX{8!> zdHnyEVzmq@kKs!+dh6wIn@_T$%O7WhHR$UQVE-_Q18rCLu;ZpJv}J)4MO!cL;{d61Qgp+@AbD< z3Adw(;@hPdkPIg5#wKI{Ah`PbVE`6K#czJmXup^8c07d5BU)7tX&hr?u` z4gP(w|GgvvN->P@A}58SSeYcGdZv8C1B@Dkj?#mE0RDgj`W}bewGWX9pjoe@)MWL~ z7h{!;q*jV^(JU>nLV_II5ipOS{Qhewf)9VRqVxTRR3jMJm9to*C6n z7CH?wZSVhV2b-|Su1~hT4#kBtk-1GE67W>XcaZW6hF{r#*W{Z8dJ_sQzYhThQqzC} zcuN1XfMo7}3b46^uLb@L|Np9>AA%mY5eb2yAHpevdyPk4;aiyM-wIUPp`Kble`^Xh zvV%CQrf`yaR9dG=$1gU|^lK zaw`y6`=)!I9P^!axV43El-*Ueq)}lud{Qu7XHcJ1I11rPt_o?368&P3y zA&Z{Pc^&2-z0|bQjKOD(nyRMfPO~a~UB-=$z2v2sbU-gP8ofxYp<~f}ukf2BEcoNo z_kAJy1~X1bX?O)(^Ew#NQoYztcQlL#M6$N6{mKW-XPYO)c?e}4sk6n-bvy&4!_Yd{ zlJ}xX#6z9Nq6zfTEE09Pv&& zN!6b|I_D_2eYqzn{ z{_0};4GYb(^UijfQ-pWKJJC@;Xr6m=#=Vdldkoq7Njay8R~M}&8(VA5ktT9pnjRLN z+R|21yl#rP=N&#>UAVBaF{x^3rA-2%xW^LCL~jkaM!03t#ObUwtu1a-7bb9u`(RU+ zGVAs#C5#96_lF4;>~&1{Z(WA5_nDfP2151wCY*wt$0yd~S8G!1iGTOh9aLc!el=t2 znve~p7=sd>8g62Epx3L^v$I1@aW?l^@S_{bVYb+C(~G`CD(*sBa+lIZDNQ z^ivaimw7Pm(8PX;$>c9tx9^!~FZ&tn;WuGP?Y9l)38ATA%Q1{>q6d1N)%bSp;sB_Y zj})geG-MW1FhmpHP*1km_Mgp~Ls*pEjODM}1E#V@VkY))dt9_9+g)V$)4r3pD*0#e zJFhpBB=;DX35*?T81PA4@`>^Zq6& z3aw2n8>>6h`KA_p&BNjQQA=lyiNlJ*88LgNZv01_KNQW9XJJj; z1^ee3`!ofMM#sYwGH)wce-V1CkCzi$N~|wnR%vQUFGH70&(bw8Q`#Dk?-h-B42oeT^9(H?A&)JyHM4 zb38dorZhu4H*vnLbtPFCTNLBR(PJhX+TMPzwCfBVfp<<5kV-IYD&B!MD+i@^{@$PD zamw_r)2e7n!}2WQ6xGQ1b2%>%$6UK0Wh~96?I-M^JW6VV>DBryBP<1&PRy;47jP9c}{a#ZBsD zbC>VbxVLi;OV}Fz(18@8_d!tjiSzSl++BO^$x$Njt&t!)#bbR@=Sp#xm7iE*riObs%FQ+kCTwOAGM+tJLEV{ zcFwpyFVY!AZ+4e|_trcv@i8aZFDavsbMin)!@D(#%(PwPgKyPNO~SZ8&Q9B&zYgi) zs=g~y2X|EYl9Vp%6?4h8ehkOnrjjp43{^dT@+q7BY>v#0#_qKcp%OL}XU z4EM&|@tfHfT4>1MHWTXAQ%=3#hu5ToX`!974;}@646?;NdQ@pd#avyE>y>pj+$cw+gv%^uv6bVz1!sA}{>r-X=o}>2$I_ zbrw}~d}deY5!vf^eG_&{g~Arwdz2onU%UN{M=nk>kTM*7vT`{PS`6=kJ~-===5u_u zwvs^XS64#&iXK5(#&7{B3c_cxCDta(EIA8=lGnZiW$oA#yS?lg8L+ zhs8hLl$LqXyUNg+tyVPlQT@wNA5nxi+AuCBZ^ou=*RcmfUUEWEt&zH*1#hTD`#r+I zUsiG6f1QGmF)rLi6ejbCR6$XP+n!Rz+JOIP%8pK9tXLqlgyj$vewtn?rt-~nF8^&2 z!!$Ic;DM7tYB^OZl~%dL1`Be?KCaQ@aH09lQ7?UM(NR6iXU-p%Cqj-zb)(DuZ*>|8 zhzHiiIWd=X3MxP9Foiq}b2cr*isj`RZp(QLGnv_LD2tqChV8F41!y&j77*i2e>3jD z)X%Z1LxCXxF%l7`(}f2pogdj8S6#&Xf=CERT$eA&-?CRu=z6m~JnXsn#S6>4;H%{a4bseFL}+2(u8 z*5f*%b<4)DC>%opX?>%;T}xAaN=2ox>q!S3=dhCzixUBh%HnT!s2PQj(q)ZB0 z?pw-df0X#DS|8fJ&w*@XoRItja3@oyjucUHm<{#IrdeH4JRB(~*@jfQ_iVf#DMFf*k0j~tgsh8(Dp{4rICu2)Y02EltN zk1p!{31vcF(pS2tOiK`diFN=ClqdEe^Rco*UR+>;y#HaL?8>&G#~etl3vn)N_$kEb zvzk0c8lsGkoj#L-j}`vzyTYtcCv_gFCf5wgDfTrN;Ld3o1;vLR-8v)P*sR;@vdA(py7 z*EJDw@N006M8^xByZQVHGRd-gY6h0+hF-hgFijrJgzu@SA*PPy-~?-+D@8zis&ca9 z=x+#RkByQSr0*#v*!#V?Z`9SiC`z~1?w;Cf4#v3GE?juJh|p36kv6)2$ToS0^QJ0r znoom%gk@5aPl+7wVhpg}p_tlW(0BwIlE=w^`Oev<2Z`}WnD4AA1*?%w(VyptiQi3V zP>r1UTk!YJD7=s_AB_E7J4}S{FPFn1ZI{u|T0i5JdJmRas7=BykC z&V}C3OFSRSrnc3X*3~ag;=V1`^b=hD@Gsbz8l1vggkN?{hO}{4U?BM{4=J48ler1K zF}}@>a-A1tGFw9$^Gk!olh(_oTzFjfQT|l8n(q-OSj^NSgiP^yUQ80(zjSwZj)%7T zcCW$CpZ75vkHYZlX6G*?A+ICj;}MFM1(B)eB$_F^<$Fc++Wbd@n{ssq>v3tE`=@xN zcUyDe$%KV}{5QoOb@SsBH>gJqxaVrN256`1$*{2{A6`5VR)h+n1bo^nq#A0uEDDM_ zqp~ktDLMmZ-P;;L)n$ogUlo1}hI-pY@9D_QMl7xQ!y%cN*p(Fdv-^~kh z+dRE;jcF4EO7UJoT@HXq8qf>wAw;LTuxp;qyZJ5nV=GZi^6?q&9Ma=%fwdB)vUkJg z1a{_b>U|$QgT*zjPN5PpR09_n>E5TD4}B{MobZsl)xpg)(a!Sz++r|EtOAAxmn8VHX_ul7f18f z3d||4D7xQ6TaYC1j2R8pXp@^q)za%Za;wN~RNC!9B2}=ExN9g-@jQa;nt3a6A^#;Q zU!!4-`A}ZUE_CQRpp@pf`+)@>$c6YY8RrD){1INyVfZdV;_>^WlHTL@(oRjiG5ccN zot=+`etJ9M2C<}5{sM|u-xU}GR=>bpUlFT3PjV}Jbt%t zNB?*+Fk%@^T06HwP1CsZHU_Cz1(QyO!y*ZZCRApa&a_4Esq1kMul(x^)DGo_$UgZA$J4B2;wVZdotwT~$Z&PM=5f0;_K}fD2yMpFd!{V|axo6)eNqt&B%e9lyFJ0vd`4 zs-co1C}r0BfL6*>eYOxNjY*2!(o{4Im01`z?4;}HS6_=8lp8P`fN@_^(`O)#@!}Oz z13q`f^w`*Ysk`FY`SB^~U~OcV@!dvkOp#==i8f2km>zU#hDkCl1t%b|Cyrdoi_Pgu zMWoF|YL?S8Hl+xHmhV*tBsw2oQdW=$UnCWWEyp`R2`2`aG*Tbo?xiGD7Qah1ZN}LX zTl=7_4ES%5^EO0ZMfV&H5#}Rg?IRqC%b({}lHn$5BTpjK%7SFarWsi7V_|BDrya{^ z6+5X$M&`dfjv$u21>2I~LV*_fS><*hDu5_c{{HS1|6ro4efWJf*_e^crNvtoNYHy! zSn|J~N8@91P^>^xx4j~bAM=vtIUimWMb&UBrgyZO=F+QpTJR|FgujC`om^|^v)I?H zM9y{NCPwH~;}KXCVH6X$upgbWZ;;a1_LrHKj1ZRfS&VOT(u25QvPJ{4B?QkFAVWT^FKqi`A8YPqP7ux2 z+e6>c${c$>s(bdVmMM5NISlI_qp?Y;?k4@E5zqVuOM%?dmKSN9AqXxt94dCxpkRJe zdRA3v8G>%{U6k{EMHm?_rj&lxYTAK_a;c)<n^wLnyVU`%!)vwZ=_P*M+i!#?i&5uLqI?t1#UdYkncCvZYN52u9GM+iwfp_LkRzY9eQ;EFCJg|2bc7h>wSTQkkI-V zMJD;_5Ss5$J%W)CNETi(k9bwijQ5aVn0C75XzpM~h&c=n@Zw_~yvK$LC1_kWKHviJ zs-*jLr4+@Eg(<2y&U+PPv6At(X=la&NGce0Ds*ZQ5dbE$$11p5s%G`$3aQGFQe|xG zS4H_vMywlPyW-K+Qe3M{&f!9rKR%j0p&WgY39JHe$u12V6M zQ-7HZzQu^J=V^3Nvw-20&mcn7#Cv?1qcbqS>C5#8b6D}E#L4=;LysBW6S3ivh_$VN%>;GalyE!PRU z*j5<$S2ydgKh|H)f1wpfJg>ZbA6XDWSUlF49m9~e)3@^wrp>G3ZbBYfMs~)kszKKW zc^;2)JZzXCw!EbR4HqxzgMe5mmnbe6S;CW%8tgKeEL+V}r(bS}j`bF{A{Kr~x3$l< z(A*-O&*vh~rv`8@x4WAvl&B`!TUbW)4-gr8&5uSg!%|DbH7jz8i-!M7qH(`s8rJ;c_zZ-G?>+K zm!2)^*vsF(*e=xzc z&b0;SDIiu*$~>5TO&M++YEPpms*-(lek!_!jneal5NDPj_@~hS0oSKHMMR$P+ujA4 zhRKVhtJ3$UAnL%*o`Ff6Jcqcs)H2C~!X(i#B@EciBN1F?#rpMWC>;?vGlbV0P>8ZF z?@vWp>RAduZhI<2I63EsNRAjWS^dWE_N{N0AYFaW{jlbq>}`8%eRk$2sQuGbiT8*4 zp8-DPk?=IJI#Qrvw7SsvIo}@p6X|2&&+q$%OqWhCQ%^<);hvD#`tq)gupU_|>i?_V zs=zS0Nhi;!G|ebiwYiPxfP7Iak#evtEjKx=p?Ei}DoH;&r3R9r#iuQ&pL>U0TJjG2 z#M|`PyJ&xR_r!S*8%j;XH02$>0|e;J?Hko2s0g8d;hC?yS1k<$HdB6eh6aWv+Y*0c z@(A=K{$X*H+TU%eD318(ld<-oZiXC!p1RdfEDXuT*KI0g98Z4_D*QEnof9mjJMAVsaQ z@NL2Yu9HsYZw{kAiM5GDFO@V9T_8;25mY3=nB_iM^ zRel#epmt9>(RPgU!fSK9fNa1o(lfxVNmo(iZYlB8{5W-e$69VuNE)EVdXBQ)L zGgc-OkR6f0QnEcw8E35F>ecEtiqFb{?Q5kJgLHg*(1CKmx4w2D+7)JGYCl8NUqMj8 z*0aF7L)A|qnM2j9qlqAa)i5yYO9)%wz~q!T;Dom_U}TC|uq5RQn4gLU{EZ3=Y(ynr z|AT5DA{b2Iy9E&l{1WdB2S&d>`|Js(HmR7*jYBoSAX%j!o(zDs0pHC3HO9HZT9}Z^ zlt+>2y*UP_GK&Qt<*@#avFdzM`jJ%r4qEb9^!x+oGq<3~E;`c~c`S(RBs(4eG8gb|z9CPF*z25GlZ^yK~qUvoN$ffd$z z7qJqsIs4aXmk=SCpIh+O(}w97FQ>cLaE8wDrvEl_2w zUG>RaN%eHbe9(>$#^;A)nw2G+}5-_?D9X=vRHXPj5s>wM;-1WNyCCWlas0I z%itA+@`)#lYJ|14Tqkxn%8$W}b3WV~s@{X}Ae;b^bK8J#KwIH~_8BmY6X3QM^%F(J z1HD6oKG=mwA$dLeUEbRD;bxC8wRM82Zn*6Iib=o0gDeyga8rTvKY3ivN}L>!)wNc% zT!~#6AW$_}A3~1)@RpPum1-k7cFVqbW6#c9h-;SY&T$AfqHxDZ?1di6b zX6ZgY;kd6(siv zN66f&cT6eyK7WDZP@*@zKtxJ~eJ?vp;}%RQzJ5CjCrv3n+liEreI>PNdJLa*5I4|HRu%CDgqq?EBMqr6TT$G}$n0>HH_@ZZF?H{VC<59~8 zVdoiTu)sY}QljPq!g^82eWhRiOZoSDj&ADH2I=7f?dmh4Kalh7c8WG%Y#6Az?a`h@ zn4Pn}RxHPtgbI|uPk>2!BG#Jr)J;ru56SHEe4j7lTdBj z_joQ*b!{;7%)Z$O*Wv(?u?xR!(PA-R^Lq8Ksis>m zETK8|KP&4-g4$T(A$YOc6|2ovle8~tJlD?(`MWBEcO7$XexVQX8!+#@=S*g`KtIq@ z>=cVEx*X z?kOfmmk}Wk&pSKLt{vC+GcyS_=Uqt=@lnJwO`S9ms*O^N63+*YeL73R$0gFn-UB)X z15HAoAL1S(FzZd)DRK2785&y)y2`$AE`wHQ#F!oLs^-v7n)cTBa)H}%qyIo{^RhKh zT&`lS`}ue+ZVTNa?&KNl0eR|b-iZ5{UclAYhc~2s%+}3X-!lI$$p7H#4vM4)`kBP! z^kVg}XkPl~=c{%%Hv`6`$7g_{>Zb8<2rM&Z#3JEWdAK-siE)6-Fvs+9$O;LdHlX6i zbjH)T&}yBeUCFX3yn7CrqPVn)K^)T54!_G>6_*3zkj@gTi@%L6AK#pP`I?+r1W+5i zVRjhgG8!m6ror=3D{U#PySbqQk>duyHCJdrpl^P~;$qR?xV_Jv04c=R6MB8q$LLA9 zJ7-_T>@`=NB#ITWhXo$wo{MSm`2LRJDd0;{uw0b(pQkXUAxC2BE8KF(fL%U##eII8 z#C~b6hq#OdltaQeGYDiiX`xg~S4Pf}1)qk_UO2W4g4AuUfHA;4!&gbp3R@I=Fvm3Q zS{j-Y1CNo(IFC(25+1WR77kqxz5u)zdV{_U<84;KyC86HFCt%MriaN3&;Q8^0V ztF4dT6I3F`T49O61UJ)3M`g5AIQ<4iu9FR;OTh)kHQj|zpn_;FhJ!p2BvxR(eBlwo z!n+ZvU3YNE2ZxLiJ3LF{j{%ab3lqCh95@f3X1~mqe02PRPeU(2Bh4zON}-g*DApVb zE5L2H8ah>Gww|l8W)Pu)x{h^neHfMN72lKK!5S3`<{9xAlum1qRvMg$#DTSc<|lh6 zW4x2Zl9Q(>LdaO)mEvA%d={YA50&%b;;qjI8Z@*xG&Cn`o8<7RlOdy0e`bL*dlbaV zd=|p>#wR?j-@L!yblCv{+9(fR!&CSm3E-kaIZxZMMIqzz-@z7A#$M%s@Be>uG7<2U z5TjLO>YR|S=^4hiCuF%E>io?U=_h5UWX5Nhr5Tw5dmgGjenK5wzRd1SdJ%2{KH;tyHsqY@}6i*^jhlTlCqbPLv(#kP_XVUf$fRi^D5 zKb<3}t7p%~lVhOzc=7g|A5u*a;0plSoWIqx;L;qM8tCbF^&&WheC73Ya?{-X zxgb6QdsvDAd36q*C}n$^4L4lL0tH2(QAu9P9*h#rxWTi5X>a~sZc2T>Z7i!FE9GWE zs7hifu2H|sP93#(wiVrMgYN9qq}bC;i*MnRk!#CO2c}h8gnH)WGwUj~O*L1isdZRY z@so3QT$t-il;>GHLr-2*D*@8eA~$w}jXA#NXPBsk4zdZMIlujbjUSn=At-xG2Y+HK z@@9fQvs;*_Y*Qlqe)#38I}sO4_{2NCe);>-bbva~h*B1soU%yMmU@2S)ODN!Nab%p9CI|u!B}xy1=_%s33B5in@$EzK z1$ynAj0d9oVBw4ho}d8!Phmddo(GoYDbCS{u$)tUrZx&-rR_sOsS^u z){J$m1)kkHQ*BSG!!fj37Mq+C`5j_?*hMS_oHT%&ji70;U`=KI*Zja%rAkgbbEgl+ z2`OTtexLNEtdtxZ5&|O!_VL%Fb-_1OeAK^^rn5R!m8~za$N<3sa=$eAJ0%Q_hP0J! z*Spp@&&&5q%Oj9ZD48@PmhAHD%=VM%xk<$}Me&JR9QXN&*Pqx!i)Axk-nFvGxhbDz z`bfF*p^w?vY3zK;5|HrywNDnyHaJqsL3-|lTbz=FyGM(!>HNb90>n$e+kONQzzSTE z-#GD__7O#n7$@@6bSF$N`{*a;+FnuID>H%e_K~R1`XGSp_bT-@yPfy=I1&|97~a8~ zL9kU}rdD zXmUx_gm}B|w`byhb?`hK7oIE6`t%i$2BMJ%s}5{Vliv1Hpfcg>*Ir4>`i|Rk{zR&;~6m|3?&-B2B5`?cE zk+sp8W+SEs8}ab+@JQnAZfmL1(yG_GyJjY3J;Znu^+`aFW9scz6OQH{W}iaNk>7 zvoF!-hmR#Zm8kk_BK`J^Z31t|G>s#lIG|5d$7;C?q#Y=(Hp?E*pM`xf*@b(9yIAMD zVhaz~2-ExX$f($>A;}o;2Rv>BH_ThE?NS^R6`2>=W0qZJk5)Ps5+uLn#zh-t#+e== zv##gh+!;cjsT)D*h7O8^Ds!K4-_TkIMvHfcbpq7A!#EH+%;#UMBa^RpqYRZc8)0LR zOp6JR-$F(v^f>+n%17HpWq3n1U_!<=}z~DSZaJTT=~2fh^VCC;Gw8`ZX2;UgC4l@RZDGv{}Z*W zC)`PY2{pxH_>?Znv7$_{SJE-VByQe#L9PEBWafAYqJ$MGO(c z1n)J6rk20qv7G?fZ#iQfS8@^Z@Q|v=BnLqRy0+DpQ-d?M^ogYiX=Ek67*-eZb(GjQ zj~nhY)~KMk1zYl5tabw{Y;6#&wTW8JKEuvUSbwnCFlrl7?iqL8OSX1((tO_Bn+Qwh z&Skpa%3C<;^r9!a>0+z9ThgOI!#m>1n%w@P$UEYn`vRxIhi%scT#^2N!9S7{BO@CB zAV6bu00Q)i_Y~8!$zUV5fILnJmRkYd8>hS=5@64iJyFARR4|9%j%bJL$k@_abYz6O z2iZFJ`zp4VDGu&ey;f$zVuVI{pwXvzQ_{sV5_BXvc&@iP!$|^U-A12!p)coOTn4%p{;MEYfA2JOhEx27+qm1b`%q|8BiCoEbEQN6zdXj{3h1bF@dfa?i7ntQn9{6gXzuTk z{>x+hPf$wk&~cEDcpK9x#`)-|Z<^aP?KplsAw|6CSFAJK++06SkG;fIs0Zz*?Hooc z!wzmwUK4iE@e{wzDNODw{a+VU_!1*sCSEH8S?>Xr0s*FkA*k1cIfDdSAsEyjA)rEo z`B2fo$!O@{I}~iN87gMI4(eAp@IDS!Jqd0!1b7)86a0b)1J1*PuJ6T*fUo~X1_M#Q zMUDtj|MV6Oa=nI(!#4g^A4cUTW)sZ*?-xI%1$4YkjuX%|!dSp=?p1PkZvQFz0Yo(m zBX1iFKygS&Ihzx`$=V581%^E^AYx&tik~onz~$_3IL*JYxcr=(T@9nJdEyFh(Fyc$ z$ISxM!d`JA-g1WtB0nB%k+*2ss1fPa7je{f5C8rfUs15XsWsLzDJFAkR>Z1q{bdM@ z#V6hb?jOLV5W$nFRByH*14)5@?8s-sQoQKUl#_L9LaP9W7>u>oPmMIQoeD`^Vy`}bD50Uw-NF`eRnW?MVtCbd6;-}ZK zfQ+%Qrq2X(^mB#DfWBH2`j=rKYKFXwgPlgAnUYtl`89Ngo4LM#jK5P85Sfy%X}8DU z1;iP+{f;{RK{8`BMn9h_&PionM4b{am*&$_ncI}w%pc8IZvS+JGSscWV+yGTPBh3# z1?Q$gDt{t!;&XH#=EiHr`bALPx^To$?$40?PLu0_4PX6K}o?Q{z<5H}~+}Qd^ zDQFGzVlFBN$%||{8jkZqSQAp-V6IxT@asV4k{$=8Av8l-H!&^83ZA3nKCs&PtHkl; z(dQ`z$2!x;>>t&NAa>XSSc~bUTyV&n$jPbYx}*8qKR3}Pt*!gfy~yPZ^77*&Gh>Dh zO4eD9?+3`ajE0(hwCG#eFIVuPA=pzhh)>`HUlHMcpD@p0c$3ao$=F{Vma?UznX+G~ zK3m^6PlMbL8av(1(;7-L0(v*azbp0)uV)6i~Z}?lfuz+_6qlaWd8Z#O(rG{01cv@WE($2OC^6@ zLC*#*--Hj2i^c`Aw+nW)t5;8x#^1uML5B7h%yqnfdW|RW%?t5!{U5=YyrZ#Wm^>gV zEJxL3_@{+!?8LG2d89yA9SoKJmZruCaT|05S(f1wuVs8mKn;P4{&C^`l*c7Bb(z%o zv)CwAq)28~f=xz8Hm{CYHhrr|ehVe5;15M+0xh;MDsfoTcbZ*wJiM$lADN-Fda-aP zMjk7rA;~1($+Me0wP=BDDXw<;v$`@HTPg9ikS>vwTR=Y)wTh3R0`>oe`Hn-4L%l-( z>eq|toyDHCk+aBz$Rm_>{Zoa;e=%PzRGHm<@b{n}NeTr$>qCEX`{>{R%vXA|9>CR+ z!f1ez`89XiLN4pzRF*fqkKBttIHCd*!exLlx|5?zTiVbnvmWQjmRnHNrVI>6VhJ@K zjk%JQl%-M*WISnZW?Fh_f@V@qWg&=i49J$FzM_*Zqocyhdnd=#lRx{Owi#K%%#Hvz znMI01Ma8;Wn+c?b$VIdVlLXMgbyOUL?fdL(OLl`suv|lF45qoTF$t zYNv>2BAa1TN-+U_pn4)L=k^0b6n^eV(mto0KN|^z??gPj1sD9fANKjAd5Yy{y-qlw zS|CYckx(HaSf_;ffJd#_C3&>DjR@;!Zf;uh_`rW8Ly>D;J#|Qmf2MJ-d6PYJeD`Mw zX6PIlI8)-u{|SZ?agKqK5IVKSbcy~`w|KEBxWSQXnRNlq#P0;JRlBTtuJ=Z|{?TaP9sm;Bx`#K7`K= z&rl&|+16s|I?SiR(_EP+vBnuklPvULX9A;-N(D>c)k*FC#&GDNOXi*tZfOb4V)Gk4 zBWmhg&AArmW>HBW$zW$8iNrvR`3ilHI1-l!hV{o07OQ(5%Io!`r%+ zCc{N_jQNRJ^ptEpWfcr}Hm!YC^je@9>-bc!o3CE`fyC&&dHnER(nmz^-*;7*D^h)D zk?*ah4w}DO)QRjgM94Y6_#2#VoNPfwzysJl^B+l?no7#~0*nV8%sP?;=$R}6=FpIFt1wF?z>x7t>& zk21ae2oKnUyB^n^$<`bisS^q!BrJ$+y$Ucw60Qq?swPmI5SfN+zTfn>VY)D3ZHMVz;!I>_fW43R#$1 zE?5Ou_4L&q`X~lFGW8O)Fdn%{cG*@P63P1MQzJ6*d5A_^ zs8_iXi9c&-`Y_$ru#`&rg)*si!zeH4Evp<%Gd1H(I#RvUqZepHty=I*GXNsxN_U~- zfNKiGdrHH2Sz7K zL3C?U4eeJxSQA2e=YmAorWhI+C2YTU4ZZ0m&RpTd6d;l|sA-!#;PUkkBp`S{5w|PT z3SvxzW&cYXn9>89GJpuyU4!*k=;oBG9b++v^&#R1lF0rOY|f%3->Yeq>-!!!bCgfR zIjmuFg-F=5A2JG9sZtN`CKA7oU=f%{{VD17h3L}m-1(%}z)D`oT!aBd-5##!#1>-_ zOeN9mngDSyC_KlG_B(OpUYoyzbhak9`AsnwkWLlt6CipJyPnPdH&uSbajxxP%k0l0nS!Q`AJGj9|hFg4u+&2?3tAa5hoL;t3NO-e~iu%e61c&aNo zi_WSMV$5*11aaUXzjV&gj6kh*`ftK!8KAl=ysgC`dTWM=m^`0h17@<=D$$;rB z8L^#19gD)bNZcq2rYAh8vYIb0Dj&owwjEg7B@M(mS~d{a+R6LHK_~ZnSK?+Kt|Ldl z?$^TbDq8uJFNYu09x`27aP&E4V^YDn=WXXvcZmDUBZe`?4?G?V#xK6gO9K9RveNBW z0k@0o3hO@lC+OWna;jmc5J5n`uTFnQgr_)ZVMOhz*iGhbiON)CQYYshO4qxUm|{Cn zZUb`f5e!%ym?K)ClK+__);SY@;#K2)CQElqhI!{Ch9PT}{(FveXa>-U&g@O-g)C3_ z3^I-es`^#{bA$^UizJ_BNtiQvGQ{nS?UHcqHm&%>ZQ{G8EyR#X7XVg|=|usac+fD9 ziiDfZ+u>x=2y@1#^-jvC^`}s@IOkN`qU4qVLKcB5PN=B%@fQ| z6M-N6bo9u%45?CbKfNFgBVU~wNEZ}1mZ<$%(OQR|oM5keED6?xR#DYs#8A-o#Dh}r zCvTBa0%s~bQ;X7@twrxq9EIE~A6mel{79Fn5U@=6Zrtz&4K39@9p zxW7ePr}?gd(ZjOX-}})Z2BE0XtjTgX=G6F2aGxpIt!TYL`iv|RS!SdSyZN6yv zl&Fp=sqOonP|cZA1>4XSnJ(4(N(cMQ-2>gNj)p%SepXgjGMA3k#dcMkgO1NoOho=F_C7sB9uDo6;a5VhA#V%$M9p9~0(*aZ z$$8IA!46IPsxp%eSNZ3UM#q3@^*8amhmuPux$Xx4Ah#=|iYK}0e=IgdQG)@C%^AT` z!;K<>4@wppC4%A#EIo>mILOA^7bhfb51Ds5W+||dS`yZMc|8wb>pw?+SwQ{DK0`Rq zvYpp2o$L(Wj2O%bV68>SzCndEUmB|KDNvq?Z^nl?v!zq(>he)U)!l2iA>L2g^QHCl z`?-{Sz2_jun-Z=nUMfm%!N?o{`j%=YRdqp%v_(_m20o#6;+wy(k0cEdkga%CJ139# z+Cq_|hi>t!jSD8i^g&YB6|{t@vh>7D+_K?D?tCC4h4XY{O^v+wFYkMV#m>N8OC5bi zf}bfm)Onj4dOb%iI{IV=bw%ms3V$8rF+8b{|8*ChTC@B|SuW@JE0j#@r8vngOx}Sv zo6txH&otfi@l!a{c`wlFCQ~ct>Q5?fw#lYI6;iuhzb`)#Tf#d?kyvwd$W_#hYNfO# zS@EGdX^g~S$H8JP%uf?{;DZi5=okt36`Q+=ga*iP$CmkgPG=Wt>J5r*b(yL(?xC?N zqX$dUHszSL=@WhJoiByqU1cB5u2A`_k-68oTG5dQA(_#B7Iuo+z9EZ44bKYJe1e#m zQ7?XNc>`{}@<8b@fDbpTcM;t!k1H%WwD~6V?Kt;)xzkZs%FhbFdY+GBQK#!nQAP=r zj7z~z& z%<}y28s0s2I>pU}KURjcoLAfy%_@pJ!R<~Flgxg_sY_E=MQ1!stmkpYUNP4w?lT&7 z>p$n*D9+3YzLVZ%%46-oMFMaQgfl4S@6HGq0whkpYJ$B^)ojmPHqq+^OOpnzRb5aU4XmKf3a1NYw>sfF#6 zntDz*iGdkyKWrgeKkP}<+UsHadzJZlA2J|@7dTgY76zI{bIdNOaK|RL75Y>Jc zz0diglhsZ8u&~m6A_(1zq@+xf6VI1JY1}KcsqB!P!*X2}iI7E|)Cy{@u(N0($=5(| zyUO(|v05e(-1~>RUFPr|{Sj^|Ws0fT`&u2=`?!#~-K#|67(-lpAb}F-zc|TTO4F%M z>MQF)R`Lsc{Mal&Axxvj{q-F$MLlv+fPu7KT~`tz(Xfy2(+CpB9*y;v-2FWUX+~Pc zQ5BZj{qj9Xkdu*i`5uA!hIbTpl(-I%$4O!}u0ti^@_GUBJA+3nGyN5s(nZRF|( zStbzX&6~NO5FysURDT27`e&-wV?UGZIjdTLgr~W*SV@08j>PkH1tbiuj4h%j?!djq zX8y;rn2NOk8!xD0Ci~xiLwX-=?*g4j{kkk*N9)TUMu?p;#fWpoJwL1 zQF#j`6+5XUuGxO^Ns=jcF?Gpd(mq6$WZ53wFtg-R)N%XLEnW8AOim4 z$?kCfK5yKMtgJ`Vr`7l9$*I-gOwGi6aAsy&^F75F7c~fB9o4oW7W)6t_D<22ZBe^+ zY}>YNr(&mKv*Les5?_{4_b}ActnEferf%q7@N0#F1gEA%? zHK!A@OoJ>qJ%8}}z>;3n1O23eQe2bORqU7#l78Uu#FrGV7N4-Hu($cLLhSc0fcVZe z73}GHzv1aKW1sbl271qwN^G6rYI1FAUQwJT-srw2-Zhh&ez3LgDKwHVV~LvvX7BUgd5kpt!3nQ*#a{#fY5zT9LsjLXzr+hNGP>wxbO zo(AtH1sw52n)XHX6j|5b(h0a|{Q(6L=|BrKj@KX5j}hx=0A)oZhQoRe>+hL%Ot-Mj zQCPJExiJDk+^Q#&!tbKM8dj#`1TfLzblITqJo?Ap3~@QQHV`y13m{7fSyJX&tHfv8{qn zD;{rEsPZ~jc8bN8O2ZGxLUPprcJ9IPROePhPzWC$FZeN=1ZUE05lj)n6v;Pm6ffa; z)C#F1vnLWQ3SiTak<>&T+Rg4qfpZ?N(Tt!EXm#b8^dOUy)~sXY z^%l*OiG$s$Iacj6B-IOxYR~d8GE)+%@LX`9m|zhmC4{pJY42Wa5Hcxd$FKql}p&%$t52&AZE-ONNxLp%?zw;Q-N-X+$M8+N4ei9O^D8iaYGq{5 zL~R6xh4;z&NxLi%#}Xt%^OD8(8IS?>^@B6VC@Gq9*NT@7>K}y8<{@*lt;KOFUV1tw z)uSzqIPm~{C{)pZ`D`={|NgvKCR?9skdubjEGviMugDibTD&Z&LvPg_M6i5@SS)UF z#rFRiYZx2D1Eel=x>K1Z0dMGb`0x&q=?m~bC#&j`Hv1e<0|)@UeP z=Z(To@@lo^?nwshLrj>FKdN;$toBZO`G$TQe<1j|tucoYJe#1}nYSlwsr^ZUd`t26D%< zEEDRy>tN-HpsDli(YOXJCb`jgkm&DN)#_*&#mjM*9}rkNJ!R|-7z=P1gK#8FL5ia{ z9RUM%LQ=!rpEFn@-@j3Z#`{ez<5c&5XM4?@PA#p0qGsj2ZJhhejM`WEhW+z*7F|DO zi8!0z5Z0`PQ^Dtk@UJ79RlgIM4O1Gdwu)71ML3us8&fk^iv2;?c)TUaHny9zi0?I~ zXp&SG+U5-;AWHnx!SaLj{NKEv-ykLxS`p)~I0bl|tDgdJuKnBnS(nGk!BX7Nq^UBK zc6!RuKS27_jze^5KT(Sv9<=I6HcA}kwu19H2$BG31{H6M=`RR2 z=Q{M@-!C6;Ym-CeuYz-`8G~Pwr-v&L{nC|5U6+vQC10Ww2IE4Bx#qKD4W zzkGcozrGq;v8hMyEn|6ShN5&?JJ(oCzQ!-UbW7ELD0B^9gtL1#$KJd$t_%L~JmXjW zUJjB*Q<}4@MA^9SL?{?2d6~|?K~ek_%2yv_%3|c~WAnR9I)?rkD>@=GFS}`tjF}*& zg<(!M(l)vHUMMo+{t@y16P$>+ZGLsAPZV^t{N^Q!Lw?FPbR5~a@Zkrch9Vh z_IK*kNzsD&iD?cfHlNm!Oao`_DSJ$M)mRMSsADwrO=AH{r&nTqFrZvRwm4nLl%_~n8D5DXqYNJ?&Ef@Z zseJOFsl+%DX(MA(6_f7p0M5f-oMEfJ2zQTdFXT;G0(9fQU{XS3i&4aTRB*+hl|jGBt?*O z$9-Qg|DHW^k0A*#v8fv`C)3Y_H5`AMj~}*YqsHNh3Q-@(1H?k=72 z(_>BQ&lV%eMIqI**!|Bo2C3%npWVJWsR!;|gkL4O3Y&$QHy@j#4|A8UKPC2?PJHmH zckhP<&EWR!xS-0wN)=M5!??;WEs?-Jv~)P>=3Mfk{h=vI@LqF{Em$>8z_G^2X~L3w zmF*I6ON*~nQ-y0h5aZBjM(sQ?#n^iBf<$AW6~*WJwA!Ase!x}MQ6otag*Vv&C$Q-J zjIwlc_-!fHXI1i;0PFXX)0E^vV1p>rWJa@LQEvCt*2ws$4?P-t?M6|^vN(wfUQrE$ z6_mPkJAJCw*L&YQCeIjdU))Y|+aV7Iuy7H2O&`c#em? z0*qkV1ooB_Qiriu33zNNg`o^siDh`=QzfwU)N;?0`BsOq69-~=(e_WrXB*eaJ804H z(ER_S-ufU)m_?hb=Pm9^fem#2#ZNs@fjK*%6AHn7WR@5fgj)vlA_lhJb9$p5oqUlMAy4R70eomGJyu1U^RD&m<0Q-N~{H>Ze273oAnvf1fW}>Di zVN=R9(5+02j{)XcEMy_s{-fmqO5Olko@dDjK03GmJCX`C!YjlQEEqvUJ3!E^WcgXWns}YBJ2XvJ5feMmcqVYOEWfBIxMc~9rF$Dp z2a*c=I=k1)2^+lX>MLJYId;obymhs*uRQU!(}QD+k6h-5a;JK+Y&!+~z!eu#itibG z(JVK{CqyZ6IFJb}UwlfIT{gBbqbJTF$s!adcOe5FSph|d0k1GA4NWCMYF34AuD}Ye zrfBVW86xg`9WSLlGI9L=JnZ*>paMFvga457jv?wTXD7DBkGZbQsqdx;bFKH-AZa*V3eZumvpT)6v;!TX6)k+h+Wi7vvyT`lb+ zun<7q>wgwxim^fLi@>MRUF=(y=>Kl>#Tr4k0ZbDD0r7)^0_NW?yvHaUV^zto4kM|j zs|cGpN653)rKt=)?tocXpbsxxwtcX?zp9g|?Y?gRWP4UjQeFTP8UQ6Q0sj#`Y9kwv znVsH|79>paIx0r4lhwLPoh}B`1`d;`UY928Gf}{j9@^yP2wB003KYhST5*My3(zRE z@3pMi2hubC^G63Ddhw%59o!>$zedZwf)fQJsN||sRdOzf%GosI^dZB@DJAY;6&Q}x zxA-!*V@+>)cbgtwwREz?irpb_h^MA_V5HkDfODp#i9#YB6~ht`{^E*%vPcRMnsfp9 z#Nj?naZC#`A<{>rWOs@6acBp$7FvZF(SswSX5Wg76xm2m7w2+26eTTh`Rrxjy5Cb( zvMOn(SYMJ#hYqd_(zy;V2OcOf!+-51ZPVlnz7&7MkastxJ|10EUdnWpp*I4iMLAH< z>X6>DxRr2E9#w`}N-RVx2jY$PApED#Gc^tk@)tAUS)SHT^djp+RKTtwT+ce2mnq2s zn^MES(z8F=3pa>O8)>FZqP0ZxgN2;-xJeyt)R8KRpxEtKuZ_sj;7FY6!m8mPNvvCx zju_dXwt)b7OWY*MH?Mo(WlUdXQUbek-1!C$uBuLcM$hriuC$n@WFLq_I1h3gCc8K- z>AHL8D#u&Gpy%lMF($&MO-{+e>*xVY&fl`O4S??IJfoES61}{f-0t3-!e6HG!JNV< zQR!p{V66TCV2{(84&hgh_{vp05L9fisXyw%K&uPfKGCS(h2#u zfasYns`&qpW#@wC&?pbRA7a8T9(62XPz+K4<=B$UH0`9^guH5Q3$ZRrrk6B8Uh--p zIs{i)FJ-Vg8D%lYHNhY+r<7|wmK45t^rL+9Z>rBYXRjqh#unA2hO`<21CzS6C+6f89YdHHxZ{ zcChvgD{}uHI!48U?jV`Jv4RQ_n^b^L9R4X(ZU_9Z*az_g_#?DW*e4o`g0Y(Y9jWwD z{*m)}!1aTbY>VzF8)yp`PIn*Je@E(XGk+`{X<8dVR@X}UWng47sX7i0Bzy^e(GCO9 znnrd0wE`VByQY?36OPBq63co8k;m7W8#e@f1ZizNxQRw?-u`M>U#AXR#7<((NQM;} z4u;O1x#&0YbHM4*z02;=AeT7_Y3P`pT+NHsm(FS#0BZYrA z&h(LnO;FLUX+<^p##?h-ff=JD;5zpj@e0!gMH22&u7v6DxpFBf*0pCX^B)`5uer7P zx_4-=voV-tBq*o-hMG<69vi*A@}uNeizLk1hUD$wmql7FmKUeD+a>iP+Rtue8r9bP z>4V>ObN6bKD9OMUqXbFlu)6`WU~#WUnK@t1Bjh4nF7s0Y-nH<~1v-K|KBo|kCFZ>* zzr5>CUNJRfMdDZ0L(9$VRQH@4`xXx^YqhhE5k;aB)!gT_AXq3;5h^~l(!FoMvvJ20 zbm);$)FD-`+SlbvI^zkb-f1a!hF|=W+m_NjEt>oRY4ts8zt* zsyAWn0Firt0BV$wNEj|9w?#(H&8@E&KkHbJ*F9!p>r*x=Yt)yC`|`!q>(mJS(v#L4 z46{f)0myI2@xjS;nachbsUH$~95O!9Gq~SyZ3_nXu79I2H!(e_GL`Ekuy*A@GM*L6 zOw+&~r7-R6z>I_ik*e+4}f8NMdw5!wds;tnICzGl`4$E`|=8cWU6xi@Jf35F3B!LMp2A-G$G z+<@&g9%tK`)lYK$X;;;G*<4sW6?~h%zJ#fW5Ix_^3rSg4jAm7nd|V_5%NEuxVz)n9 z*Ykuz_-M&DQG?-@^?!>|k)+bPe7EPS9T~9`Hl5N47<~m~NH>uR#)jut7a3QQcco|}Jtjw4j3t#2@UO3kR3W+c7ec4WN|BpJo={QjP) z{vkm9o$i2)b-Q)$lA}5D(Xh1bAEhN|T*2O0D#6#@*#(Wj2I?KZ@0muz+!9o2MNb6W zLjrbD%Fyc2fJL?LjlBqX?s{7YPz4#XNg$js1oC)vZo=0 zDh4Ix(ZPu+6Vy0^O1FhA&x4N4s&=7*vTOIG#u^e_^BqP1g8 zykAxjlomuD{Temq}rW@{DjE51?Pg<;@X#DdRbCl=g$uiyo1^w2?zuQeSig4 zwkKCsp)CompXQ?xqf}jZ+K{pcd%;gGO=%4u;y;!*(o>lBn+jdKsg8c93#VUC!{g!pG}(voUqyMa`~(@OGGC9-?n}N1!{tPGSM}4USbuGm>+qOx) zR{;5*bTDB(U6HVIp&yv7it@rYHK^?Bo6%I3)FX03S_|nt9cp+yn(Am-PVQwz8>eDR z|6A<2lzJTt735&5Nzig5_yJadJiR+UO6nob6TL)1N!5pf!}+xyt;6)5J>@*su8Bca z7|~+xR51{2#^=N|B^XV%!nz9H6~McVWb8g8yK*ubscP{opbA&aaXnL2DF&i5o`F$6 zS1yTFg^FxRA*@4PP1k7oY=?}O|5So;9TW$hL#i%k5b@0M-t!5>c&QHB450o*tBgCW z6QSuw)({n@)A8^b4NJ9~x1Ux=GGwSyPMS0Ip)f;;=c)W2{?dyxmH2HsJQqc<(cc={ z-&w@zM8ob(Zr3NO6A9rr$d`&ffKe}PF1{SOM$J~W>0pUdR8)=IXy8}}yz_#+B}B)Q zxA6OM#SuYYZ|9Q!0HX`hh8QTQcjJA2taf9TGllw;&mGYdgXQbQ$Ji*W?k>48Ei;&1 z%lx`4n&_um1AzkA9x`?)FH)S5^8o6C-Y}}4o5+Cc&r!L zgdjYqu!a+Y?7q_83JcoqVYVG$J9!>}H+iYsykkzNI@fsGy+kRPC6AV*qW$i~+w{QC~m#3j4 z&9+-*7N#z9jvUKT0E9pu8ssBdP~Iq95bxvYZ!^@X=7d4vR35*er;&XD)5 z_xToO^^r}9f{Uy#zn~9uv&*TDdtaS*HZ|FR+d%*^GV-GkR^{9-{P&M$1UNiymC`_w0ZsY)Wp^tajhoR@F3JCNpDf&v{+nPloJ2o@@Xn> zDR507ZOtm}UU|4^xltC!^9Zh!odfa76NuQ93R^ z8$fh2Izfq2CGigo3q09Q4efJ@jjg`Cu(lkgXrzhri(#V;289BrM!Jx+o}w9br6q+j0Q)2pGxNwN#(s>v{s0*)_pKRB9w* z=mRh*e=W4)++$(KP!g0^=Df%t|0XbZ0Xe}9=%`!}w|WM3nvmmY2L}v#Oijp4QOilG z)>1P_jZQ3&*Y59)P0%Wh$W2Vl12LmS&LujdC9tAIHZ}@nvB(8mGE4=Kt=)1jPT2F9A%2{wqxn2#;r1r^f^m;J}s1`G?BzpZmdIej3R8G=hkEnLo@>j{VZu zkREqToD2TYYZ%ZaTa?0E}D#o}gZhVPuWT?Pn20%E_t`A}4v4S(7 zsb9&0;a2yGKNtm*I>4vpIj%x{?ix?T8TZTefwBdF1Gd&(__fa-7~a*iPxTE*c%0-z zp%~XJs~onUcz(TiYrN~{6Rdl5@OtR3r=PTV_t2nx5WbxAITFkf1wOw zv+gwoM-YW``ouvd@S4I>G=tHb3GoXvTi$q3>1OX&ybY|P;>Dt5{vt&v!HGQXaKx0P z^aaeo#`Q@94gjkO5f|%vIK4qM6DM-6;sEq18K;zNg+Wx}qu@t(3w(i}UW$_&yAAMD z%T0af0Hb^Fnz|~^spF=UM+oy|VOvFBE@$2Gk_8dN0tTLT$!)G{7>Z732qq(EM)rf4POr?8AL& zt%Vye(7FYvyJ;xHpiA=%H{&Ai9BF?h*fM_0n<>Z+$}D2Xp^SF8XhGg0I-M%5BTQO8 zh_lh4x-`J2**gecm@917Wo+4HE0-!@@=-2Tn1&9q$#wLPl|+<{f$=(&{s|4Ox15#o zlv096(kde<(CvRRyyeuN$IjNeiBi_oo+61B zS>_ILiST};MXS-wf1Kd*2v#&Wvg^m)3B07CK-ajRu}YBOw9G_7ijs^>_R+4^t2n%M zpTk8q?#(V`pGaPvs~mi{$rtOHvLg>(OCS*ixDb)=BeA2E9CerLZQk`su)=(U3SLQN z#CV?8#g1WCa~0z`n3L9rRt0uIl@ zoSaL4cgW!8S;RCz$1|@4^nRxgUzL_JDOZRp0;Qy+A>6OH{^OpSyAg3=ce$*S?{$k>uJ@=s+KY9ja0go8Sj&Dg3Jy%i*!FHM(FsChG z?ia#r)*KsBjzR-Z6{qk!@Z>jpIDxhBBso-wn?u}G1WUzHgS|8-rj!+P@oYYa1Vc#| zm7yEIq#(gp9o&wZ_e)s&!09$t`qrLvweee*B*nWir&01nTq>v1tVEn$DNAax%Jme_ z<1h3;2dx<2;Fb-?+}J-3OTUYna^BGSkT0B#HSWBxD8FFrk6JE7yztzMKU#10N1{(* ziZL(*wO;h`QvO-br1ZdFM;y-_qpNxrsr5!p410ceWH4|4_leqkn;&xDXPTQK^?Tli z0fH5*Kw@sT-W#?*Gx3JQ**Wh_t0o_41@on%Dz5rv0Cy=9@qX`V4iYPe@L|zmft@f5 zIFEb(*6%*HoMm>pC+n%-&;?8i*^WU{Rma{tQi0 z7Z^j!bhQ!zh7`#Yb$=rSXl7I29u$`*YuaT)1-(EvO7ahA%yp%P+{GRj$~!;kJJ4OC zo-K(1^`80cnn~E;b5bM6h=mhHkUu^%G{I=Owz)EoV#E)aoNUhi1N(wrUi?k8Q!H|e zSi|}$%3pn3$7?(FBkELi@LT5;UX$QcR`koqowDqVeTc0^uV5ZnkRmv2T<&x`IEFF{6qH-GiBJM(Yh0qfO} z;PCIGjq=)>@j~Z`GNINHW6IT>egV0iy9t*r$URG9QXCvGsl}lD6ok8 zrFX!XZA&jU>*f$QsC=kq{NXqKa7ps|;&P<3!1R%Gr@zL@c0GX>pJOxtT2PK5ePH;a z6~BkL(9h>sB~)HNgra_uu@p^R3Wgj#eBY|(VWNF-FUek4JUo_FeJ*z#E${&z+0DdB!lR6c!0{fQCrL0*ZodX`<-nk_?PChri>kt0 zrXcDhV73HtOvT3q=;Sv`rLg^SK1d8R7*hhGqe8xUUQeRA$211@aN#r4tPN}7di}hW z2`=t+z3f|7+2LPy;J+qcYJ~1Cb|@pv^Zv7@{foXMPgq4}k~^CCi?lKaK7%q}ZT08e zE3`u=?0p8fc^%H0&uMsK;<=P5@ZoPYu%@{UTPf*EICB{l|Sj+;L!Y7yC zVYLmjC|l)BVrk%er#NHscTOlZD>SHCCa9Mun?%`%{#D$j_#~n-yD{EX(OaDFEhsZ5 z4K6_vG*079d{+{hmTO3Q-@_lG4_Z~}j{Q%A(Hs7-A2(h<>x+y_$=~UVRIcQhe@Mf( z`UHAR<_$iuKWqd)bIoDA7Vn-*!tY8KV}$8n&}%6CE$b&wC;@ggK+yQgGk*+?yQXstEASro+u!^T9|Y# z1BDBxd~6`cCBLQf56n!I8)X16#~8(tW~qInnw+1h9G;Sk`-=fLL}%C8>fzOAVa5Sj z;4otiH_rZt2#M&QAk=~goAq0)+is(h;L0~zwB~EAjN|#PoZS`hfNk}-x2l6Qi5I1_ zyOH3hV+MVRt3I>RstCYjjJxLXzsvaNR*3Dks`qwCgHCh&DKEENnnC~LSf*rD3zyRI zZZZS!}G zLTZe7!FjTC-!~{(dHp69%O$8IUw5(C`3ct9#%)u^<|6=g_oT*hJXG=pjoWC`QUV$) zC)HPzCH=oM{vV?{@7#h%dAJ!xKjtBBKU#$zh26NH1|aubTU(lc&zOf>0NZn`P>L_k zkzOTRTo!zZouCv(9c)V_PTTVspoLuPOE>&K>jQqY>~xN(wA(5nA$TsV`DEMiY_gs2JsaCd}JiXB#@`6kyZzRy{+r&Cl*85bT8-BKHPluR}TpG z7*OEng>fUqB?e&JM)iBjDr843P$&GJ8rfC@YpIauNA zxm-0jS5W@MO&(sN?GAA2r6HfibwiR4Bfslv=05cWm!^dOL?6%FK;X%p;Gtrkc8qbW zTwZ-WUR(db<`Jc&VZx?~m5rEyMjtI}Iz4Y&Fg3Mp)nfK( zv9!gtfryrf>=LEhoSIeeB^Q7W+f9;T;Pp z@P)%A(N(K1i2tDRE&Xq{74!G{(SZK$QO*;EFKk%GPW#||z<&rx(=ASbvL|jXgE8&& z%gR^N{gWrwb`!FUIJS6sI-VH;G`#U(5#u?_Jyn@ zl4BO%VTo}aDV+atKb9y3EMVQBEg8mEyP`R^a7gV+ma+Kg5n;~5cp9iA%!Uo1Oj&Y+w3s(493F| zgYyYmj|Pzwvtfw=ef^C!i^7HIi0srP6gFC}v4!rJ_3e0*8fj;Z&=+%2PcrOf_R zNG+IJQ?OzG+w5L|p%SW8jMjQSnY(QQveUJGQ}5~6wh9U7b0ud?s?Lsk#i2t7rv6>> zzA-~tm!B41L6bZQpCo-Tl=C{kooza3eo4+3I)9YlG51C(XJ<)!%TRavn$Y$fhLmgP z!HIy#2iSP=yJNzC*(@kCTF9<<_1=Ze;eoICH@d}OqMs2~+*0yvP88JhaBeRMC-5!L zJ0Bbh`f2{72YI?oYNob@(mo@r8cApg@z}*K>+@^C64Tn?QW(65fwrem$(t7Nl&%1mAY7vWaj3~9r2mLiE+ z-|2W9e<8d4DZPnBiWu@P%Vc(>S#T$$EYIat6#hKIS6n$!+kL*db@B4{^$@rul9xqa zihKs1;?lDGH*kgjrb=Q@Sw@el75;wM5~_s3@(1DrUGkpY@ zRnHgAYdcnn`V2}qUdy6;8L%DKO_jN3(CoG-+YV9>p!aON=X@xAusGkE7QClB#}gxv z&5lDwuuGQTwoj{ZT5&qXx7en1MjRJMSkFqUOj# zY#3=cH!ENpD7daQeWn2BV-o{lm1L~^jNMep`5bB=iL=U|cax47f-fxv z``Tk7PdcSEgbHTr-3IC*g4dXt5!O#(6Ax^;-Ts|YxtzNRq$=UIMlP0GKjdlp(bN~E z8S!Hh=dQccv2Xd-Z>_5@^-D8|)Fm+W)jK!PAeQ7Ju?W$#_^`jczhrg8jfrh`VM2t& zj!H^kq>9tIsoRPN)7?+o+|$uL2C?BHQul&<9JNz*ezg2BW11v=5zJL4ueXfLNTDS` zfPCtDo9ZexL_ZG)KjxxIN6WKJxO0T{W0ed;^6 z*Zy$t=BYy}vvMhC<7(ljMxbB9Kf5h|BGLZR&Bl$VMs`0DAP5HD)9 z>?BrEf^`H4H^S4OHyKXy7Us&! z6On_dv4x$fBhXE4@S(pD32*ybQ08?_yih=Pw{GGCFssOB&vgGI*o!PJ!Ft86GY8WR z`?BVLSL$NwVDZD9!OqIek-^d2kcFKCNSFW<&ha%mx2m<291~Mzmg=p=ZgR6RcnH))`xePab)giRPo{%OMKV~~2Hu16rWid%DY&~iEnVjHA`5CzcKe=8tD(R@5VvaHi36|>(! z#22pq=^1$UIubP8NNz+F1}gMzpkUf^w5RLb9qMCrX3|eGIW^2oTzmy6V6RpOCK8Dl z0aUqIM8xER@JUYVLs(|1qmS`chR_;HWBfM}D_(h*toTXq!Dm|GTg%&(k3BNDxW%A>bU?t%s_1u`2W1m~F5(1c#mflSU0z_*W^9?^l1r=rC1R$D%FR8KOFl8g3%S=bqd6iH<@ zwpp{v^e)l}QXcLu*Z41L`~3IC)AZXP)^ujKCAzff(akD%rP^=HS}e(Lq6pL zQY=#p)F2_weWcZokccsME^E+_K{!o(eRp+_PvG}X`fT$)EBh@_I?*JYY_WOQmxn#ae3XJ$g2eS&SvW29TATY<>?Uj~V^LCmWQb*{y{GPO#kS80e23l{ zi^i?HmJ}cV2uoeDRlzm-J0ty(~7%_7Ji<-A1 zEpOAa$z2vk>^uG7qgDK;s``|V5qcVwk~DPNrQO5BHjHMmvh{@b;UAL-n&Ztzc*$BY zDxzb@P8*wk#I z9RoS6Fcq|bq{5o|Df{O!mx!qi>zti-T<9_19BW8DZbr>|b7ZW4r|usQ04Ay&Qk?yj z4&G~;z8_nTk6&4_#oTB0M&R-YsbE^50f+bLhAxlT6^CIrxykUG@H=rV3BHKVvr{5T zjujM&h>`IV#3Nx(cUv<3mVqa$S!w^dP;n-&ycCCKysjp?n?l9x>GjW}QBhcTi+vr2 zL$0E`IyorR_XO>)8GAjvnjMugndTG;ZiTtl^@G=0tC;0A-x3|xXOBklnJV0Tyj-VI zN*0_<(zgnlL_XREeD8^?Oy@32e93G#sEdbGC-cQBMDE5JuNq|| zSwk^DCHkE+1)WL)dQJ4B6Vwn^r=Ew{BpxJ2BA=TPlb#!hk-kj3+EB|zK_*fj4)x(b zSu_y$U!cO}u75Rm`(FI!5@%5;e0N)cZXqz+1!}h!>grmzIzd4 z!S9C0Wl4z9DL>^G{Ma66YN0?4f(HjTICMyTdOwfX_h9wo{qZT7{;Q+A#HzkOIa4GV zR|JIZe$OV{DkaydCahh*^sc+kG1OlOMyD$MC&ElOdK-3GICYsAk^(JZb=S*Tt6o86 z?tGn0ce+dKMO}Tc71Od@2;@mN>M!tTQF8cdf-v56Hm)$8absc)CBkUxrC41nrVjN(~dT64O!<%&XnJH?Op(eYso6c% zxjTAI;$HFK{($>994l{b%M3`CgEs~yI#5EoD_HkMK0SvA+NRdY33wAfwo)ZRfTTb* zr~ugluxhfqBB~kI&^!zjParyYafHbL%p3!SH4!8hINFT}f&@aOlWPM2d`DrziDzn} z_{$GxjCjv43mvNt4`#3+$w7rqj1~>NJVgt8*bftmB#&qkqQ3Xz?TPRDsdM|TYuwO6 zkOGzn8H`9#Wx&nJ(#_~Z?+2J~YD?<~?FOhv=0?wtIvs923S1&d$*B5lq#=Qpo+s^I zW*Me~h}K#wW60yD@OixKWC9~PJ@~Gv&vRav{jFl9A$_J#1dNnM%jgyc23fN(G0k`^ zkTCmXxQK7rP|&33;flx{dVH+f?N_1;P*leh zks;!#h`u8$OMkCA-7j6f+$aV%J*`yu~PDVv0lHB&j zkr>_D{{*qam`=?LksWVqEpgpG&xa{=pPe=4Dud8@h2_e(D&2BN$F>TX0iVG`R2+y$ z;g-kW2|OIA9pc@aP@DhN`>53J!8S0s$u{!Uf*Xd`H<(nqx@eopRJzAj=%hBYk!)A2 z_uwPV7@+C246>D+i~uoOa$cnqj3K5Nb1c*kjbjYjn7x3NC2x zaGGZ*hB1Ru7|QR^A)p8j_Y77*k~L(ROSq~af9fN&B%-|o(?FV=dXQ@B%w@lwGo5zs zj4o9}(Beucn}+=p0zrw|nOPW!(^=xsgoCoEZ{sGTcAJFdpw@rxhxB>KdBRnlp#>?f z3|l!NcT+={;b4$)mNYzBG9`F9pNQ%Z-lwN(KfC-&Kow!B50bfZy9AmcQ85-AH8M0t zmE*&Q>cLXAK+4e|EPec~jR5Q6Va-Pv`2mS6d7*U$ihhnH8soWb>{UIZUP8vLEefX{ zFikA-sIe39i{;SvI1N$%fVJk)N_MWamgBFxJGeYJaj}C9s*qFeSDkT#q1>&Ey*pgbxHSk{UM_{5E1Jd{Ox;#zc2!+&ly4@i+7p|k zjX`6L+w8=XlMfdBFzE|KlDFtnZIs`3)nAoB4E+ZFa9Q@Br4Sst&&-}DHWWkZM|JPA zuwL!VNBZC`+e#qheQQD{hgOEB2157WH8SW5n;b1an`1p1T4zAN{t{+skDz^~H~%DC znXusci(G}E>I+au>tBhIj#6O#Cu8vsOiH*WoU{*U{d_F584X?6|02D>p0Ju z>LH7J$l3n1D5%y6%kPLM{VP|yAQ6B4+=zj;zV;FJ5o-6q(Kw0pu$mwk4?L%ERL~beFH|lGkwiR4@VXgybJbNq(yG zi{IUt>rS`sS-&h;R9%x7U&tI zWEI%KD(*aLKMtyN9v+8X6~63!y>2sd@50j+oyEf;h?2?EN83)_i(A82%M9={RrweM z59|4=^X&9}uT3Nh71Z|F?eGm6gn1HJ?xbZ{9EmY*Q9>jXn3#pK}F zf3x;dW+e)9okR9ByO6|Zb?`3Nz}FvMr9G=vhY?Zs}an0|Q5sZC{*k>egUS0ZcraLI~oQqEXA8qd# zomsbai#|_m+qP|0Y}>YN+pHKB8xJ*3Cb;L&V6w@L|@rf6BqzU z+f0;OAR!8#IW~qihO34{WH%;y$)!uFJyIXpLm?}jUnu#n1P)l26Rc1HOF8gw+c2e{ z_X_{{tVNnf&PTgRDD2}pE*6Tu;w7_{XOtHd4|M|o zK)ga4Fa9K9{C9;hLbpIK_31fsvvQN;jB?X6RTGm&BZ%+SPfZ;w0~Wuvi4SXQrbh9> zox+js#45NeqJ}CuMzJeKmxm1J)iR3Nd(0I4>WTM_*7N0vZE!dVIf5%0{_Tj)NTV7& z-*2ZoRNCjo11@x#><95CgG|9j#)f{ZzLdacmjL)EEarZAIcB|UCD4@YdB z%&Lqkg9Uut?%M|X(n8C6hcQUIVh&UC_6#7 zV6yDK`JF3hXC~%qYrhqr!CL#m8Fdc?Y(bgzoPz~^!Zu#|9z$m5KYPmm;YKDWZ;IR= zY`p+kyzM@_HcwGqKhuy3@ONm#s-)m1Wp4;I8d^O!U|freZJCfV?IJdK+YI~o-4#`v z4g88gWL)qG+WEV9pEbk(x_E|eNOvx zsg9rgp__0Uu3`J#%XM!{;h>cTRP2=O4P0s4r{9KB+~=2=ATRFVx$jL+OQ09)zJdUH zof!Qr!xaCz({sGpH)R4;0D=z4_!dZ*$-n;kMl7l=0Pp!i*YJEu{s46d|0oaWI zK-xb93F7)YZ=Oj`{o>%LphSv)uRzioJ$CZ2GVJwu$X1_r>FqSIE?@e2nL+{B%#m8Q zK>lj7{g)@GISsr%VHpUi-{toloy?WMdKGc~eF7pW(#$E)__Gol`TGFK1$&CE_kWpPpH*@rh1%Fir(B&mz$kD=Uj4!GlWym$jjm0MzCd@ zDU^yzdQwV`PTuVC+48zrkDX&8$j9$XJpZz{RsS7rDIkatU*r=|%Jjcj$jX`g2PfvW z{9|~Thwt|b&0=(-#a|0yijfXJ|NT=s)#v9;yxD-RIPx9cakxW%at@cn!d2CnY|@BP z01k&2>8?ItnFJns8$8nCb8IC*?PqWL0xXF{3(fE9w=Uwn19$6q%>X|Yz_nQI zd9JtX=vwNhx?+-#ZhhyKPUV_9BNH=TRKT$>BK{`>wcF>Ua|4F|^-=c#(FldGD9!z2 zA8(Sxe(XzBscpySqI}LFE1D4A-28ab@=h{elsSmvewDv$nt2Kih$_ekj^i<8F#qQ` zUV!k=asK-U3l#t7gM|h=<^QjC2!SxXkF&L&f(L$X3qTz}@yE!g9iLA6-#CaUft@4R zSZY)3Zy)4Q-iZwP{T}q?pEoXG{@vpeEF+BC38|zGYFwih{j z>~jt_8}JuTqP~WK9I9S)*;r+%c*+Tz$a{jg!q1%^*=M(T5vQ8 zifti>60@L#{l0hoLQLIgr2-k^CCG!f)c4Dy&N9TrxRj?9J$ zYJj9b0Ey7N89iD1a2-x*%AQNzLMNQkUka#Gcz}v%Rv8T41d<$9*p*v8H1ctDP>#JYBj$TBMiywv;hoDOyo|$svy90fzka1YEZWz3Hay+iprI z2tOK8%FjF1!@XDjfy#*6#UtrnjS9<@c@SD%M+xXHkYIxU%-R1X9=HOgN8mCpz=CBy z-%B3Q@UNx({4}39Br)d=V^OYbG~JsmN}Re_u#x{+D8vOD6=EG)IZUq3`SOn#so6u5 zgwKV-LBnvn`mGaHxwtG=2QtqY1l1DhPDIv80#f*iJNkD}{1pF|n;jovWSEt!k(6Vg z2i`=pVv*F5`(_4A*BY7}b^HAMR+O>)d=(DzsRoLAvJKLt`R_O~ASjMpn(;dZv6AZa zAWDzNZC#hfMlQ@~*_^mkNFDG*4R3t{|58a zW5skb(|oH0vQ$Ir*Qyy1|y^=*_Oy zT2;7RWc_CNY9%G!@o%PSB2os^&au*mcZRe3a=0h^ibhV?e$lu|$gj#@MM;uf*VE-R z{F|A?N5Z++xg=a>^IEg%HJdX5w~1Og|9_Q8kJdTwo??rsuNulpANq{k=Xw{I!D?SP_X%mwEcCuWX~W8nX}L}F=oHO&_Fy0pet zzm3c=l4w%*>h=UKnu6Rw42B1T)ZgHBRyqAd)n?SQ&dgE!MLRT>bm@**yM|V|HUp^U z*sb+@EFG>eW7x@_x}OfPu6-P32l?MhB(n=^{={fCS^iFEtE`CO-~2(C0;2=$Ur#9p zKga%c^w<-trVr~$i&KSth*|8y`AnS1ti}mgcx=t!yyGdXuF)?wmdQa z%+XM&cKq6Rc)VKj3|>2>h-tJXohO5x1P9YUuKMki1M*40$;L7hM#Hi=TUA>(Gt~gt zl091RF!BemzpGO+6n{>m^hn1xYDWw3xTXv^h79?nJp5-L`5VmYc|g#_2A8oJgfxmR zNk7K>*OFQp%~Hlw0lhm{TDIz&bvEOOqbG}nde54I6dqd482OrCS(|7w+=EnIa#37XpOvZPT|2eL+XB_VU}v~~yn@Oj9s3&P3$q;vpz|I! zqWc-t6F8*h<*?R*^0E4icD8avA?~W=@yZc+$`dzB#&Pzi&@S0Rk*}+=IXREYD|hhe z!a-8XXW2=9i#RC#rz2O+?oVv*7fKxtvq`%gV^+KU&hK3xaJotS6#>py)MR(9ot?!_aE zc9IUJ8dMT#ICai@{OaRKC5SNv>2H#WHFp(qT!;GuVV~V2}x*5o75REA3B*k z)vd8$p-3Q5ImjV~I%}+hO1r9>(e@EsBGqixPi{Jz-d9JXP=ae02%mXaLM)@a2&;>! zn&d1C?e?l@NWdM;Js1Tg6+A*3uV9QfM1U;y=tXS)ga1};@rItWy<0FLh_;PiJ`7a} zFPbY*kNehfi%d$EzdnCFSt!sZXj^$2-9FKq;0~0@5@l^8fSm0>mt#wYQ;EPEfl1lAL&pA{;=x=7NgijMo7SgiK&2 z4m8&X6aVvy1v|!UnV~q-fS5Pk9-#9bT@XYXLDS8uCj%aLP-lp$;KC%GM#C=?z|d%3uQ4VBlq#z;G<(akvJx&99az`cXUS zEx~=aZ?kKz#;7J$J5A`FLqIczg97Y~FghZ`FM;=wP#67uo`YVICQ$8IyGtehAULql zsD+pyOemKKbQ-m)-8Q9Wg?$jZYZo0Hy1WJOFQN({C*>Rcy2+d)wolDQSErTLxUP*K zC(EY35BNO#q&VkPD?j-wBqmO7Ko}ZCOfgUT@z)jTKC&&~Kj@6CF*1MjNWel*=iv(k zyi+63vkU4c=DohJKJ{IXmr3;GdK_x!8Ja*KGzm01*Xqyl$=Gojd-U%gFJ#DFm=xoI zF-%;V4QMUwIqG}>)RR?4G%E>vq2t+$c{T$?wuofXo0|xUHMun^#wp4UC3;@HUA;N5 z6XFWFSB`ZOJP7Fgurm+PD_D~cd_kNWs>O4^cp^#|^q_H3F+L8LgzWb?c{!Xr=&ol! z;A(i>zm^W=0xxwtzzEymO~1wZW+-7e9%Qjm4v9%Dl5X4@O!r-sy_5yG5ixrP8BH*x zHBZ7U!w*Ut>Zh8IZKi><>SUs0!ereenLWsYqRd)FiLb7%TK@Ekt<2Kck{tq1mZJqj zF^da?wU%aMJe3)56sPTE@i)_mV>36?0myPfK@3Rqt|vw!b+*9Zujz6?Q{ndxSHry|Cv zQmZ-*xYHmsA1y!pqbKMPOTYDO%!R||dKn`qP1fw~KF`kc;WK^utK7m8)0|_SsZ-s4 zNge8>u|gHOz?X87n27s}dHC>+I62goD(9DivM+KDW8rMr^S6$No3TmVP|~YvO_*!V zL@jWns7LH9+>OM~wYF&rN0=agFy3Bohhs;T({Kt~eabU$`j@m5a&g8olq2e3R^rE} zBTFRb_GQ5z)YMy0j`_3*O>LlwrBmq@r%TbKiA-edto38|&xoSD0&PvIdYlr|32I5- z#+7jg&r6Z898V4M^IA1|t77TvhbXmN$@mseo~3AQ#WXfcknG}k(M4!YQRZ|OIc?JB zIU6gang=!Moyu(2b!XEFnlH5;K9s+W#L6XVhF(OwDi!O&B| zl~mve7gj^1y#QTdejUgyYHMJLc>SZ{D5(npi z%h}JkPgmAi)m3B&f6CoVH8MIlser!_|FFdfNpatI4R7vMK zI}%kTi~w+oV;5bqsd<~9O=I$USqMb4bNi(@`)ya!Yp-O-I_nij2=WJdT@$vggtLlJ zR}0|DQZ@=&p=cR>&_Qd&zD6}F8^r-)biB>vmwGJQ+C+4vUAnwkygor*u3TgA0sZbF49AoeXzh)qon>h_$70XY$L-nC&u zHxT`3@FJA8MgQ#M4i>6-KP$FV$sJ@CA~W{;);>u_uUD?MZF!72K9bvgAyW6l6N3nQ zBu&P=wq_~$I=r`qoe5ufPG?WnC0Tu0qL-7^L>Y`|LY@eF+;CtLSYsOq-Pbtf~qfbTg1@!GR*TQ z0}ZAQz)H4PaiwW}un&#`Mpq^ZR$0VmmfgRd)q*{&YAf~q76tHHK-sz1#R3j&ZuA$G zA8&_75_?gb?!2z5s;X5YfsIyOC!kOI(y+1dRDZ%o=phhDED$eb;_F{qVBUBuv<#P* z%D|qo9zr4}KX3_sD>+2;xtJh2403l)4!o?)+gE<_YD-QQc zP`CI|88pt}l?GEv<45oBd(TKMu%~hq9}mRFc;e*+9jl1r&s)+gl%|d{1p$S3O{)vB zLjJ5=l{qMQp^fJr?7|qKEozks&Lp^0Qru$&7(oKE6=Or8sk&*)U!po#*w8rr*5T9K zSJ6-20@u!}I(sT~YM(@CI8!g9Dfwvb!dfo+YF7fbMzM;4N#3KT;O+Q(mM)$Z;1M&) z!M8#fRNDyZeXc{xr1eM!WSksxTZc66Z1uK=Vi7JdbUX~7IkkO=flzp#c2?i%;sB!r z!jK4MHQ2><7VN$@>MxP#_WoCWQy@gE@_b2s)_5bFay#uv-TPS#k&};ND)?CkH8m7P47FTMBb_CF>S^taZ8+{oDCW?mbf*zM!BSxBW5#cGXqto z9E$-o6b8(Wa19|8iSj5}rv1v9Z05uSgMRcQBpou}k=WIV@B-o1?B-Tqr^Op^YD(ME z2%Pb9;KlcvBH!M>{rdTYhcs2?%mhkH1XYAD^c0>n(=h3?pCl*>=6nza5{>mN$}|Yx zm+G>IDsny^76Vz=K}qa(-4`(rAsFz|&_*DV?;XWxwMUuLL>13BMs`arT76L}jP^wf zHIMM+Ye6rpB^~HkN+N196Cb^QksJG&0_4(o6aHw7KSQ&rc-D^*@rtRhmV0!Y5LC{E zu)bx5!&s3_ACAJ~dtuZ!7Lo z!Eq)hdm1l?&@V51Erh&5ZyW93b1EB9Go)b;wNBZVgxQx$F6dv{e3s)oY+eAx*i2@& zFlwn`wz_g@PPJ>DAC4|2!)Ma%kSL|!bI^gTBjN=k*!f}?Y)zGw)c0%ev)|NDalLOn zr+WQ$OGU=p8`Z72H+HnL%FhF^XrSAcep#0*KfMa((5Q(q#A_CD6QtZ}uW$+R-Z7?j zv@NiJhKJ0g4t#--wKr({;dtO!MS5@lv*A)>>J1oJvLXrkt`6wSwT@{cG*%?Wn5Ce@9l}+lDU|S56+3A z%76|GvVB97QMn}xQ7s5;kV=k93M;H=s4!EmtT1!V(rOG7(=M9b6E|Ou%*kog^+PJu zQB2KG%hD|}NX<&g(#+AW&QCV@m-1%%6r=PaJKG}b4C@TNG>7;s5FHZc6#Y}7EsYH0 zSWVR~Z}NZv;!~7@dwL5ZP~fkfPb1F3Sznx;KWXn9k}8tStSggBG7GI5g)2+M8oi<` zf-=1-D~ybj+dmC6t1OI43NmU8D~yV&kTQ-g2@5L`({2n3+W%`_)MR69I4Wi(Gmbsq zHdVi6Tc*q(2ws3zD{e{G=Sdj+c;8=6tHA9}1?IB~gcb61N$+$f4U-W!Q3<3$4~JU8 zO+oZt$iRBcJ*1=Ld4z@67=zb~x24LuK? z@?T$&Jo=gx&6rwAMHf*&si3X*wbbeFAlKF@mD=BsK1+E17oSy*WWnqJaCM~xC!7Uf?w{*>E5lD`d-e}2wHZZJGI9Fk62#+xUR*4_VDD(G;@DyuJvlL%oKT!7s%|oM!Y;hlUrXwlX17Kde0|wmLN%Dk#!(aobsEq*3d?VF{RBTpjr|b68G3bBsU^!ML$^#xzyhFGi%;`YxGuqf zuD%#&Z`@H9HZ2ZtE*|`jZ$%+%PB-iDEYEPm3`ZNzy7ml>gw#x$0NYcgP%(g z@iSyVX^s%Vdl$eJ@lCI0K&nwnJ;fA#Iwf{p0@1>@13W!$@stnrz;@}4FCR#x1Co+d z&J=es4K_qXm<~j}+8llMZ`PD}b;%mMl}mQZ-wC;qd7xH=Ttn2jO;|7M%Ohc3is7Ui z|JGTYy-&1tLDi)bvAbu~ofQgm7;q5d>F$O)4EO~sY#aQE-JIV1lV3Uk)yAq>C^8ePvkP0OBDs74ro?)LTG#dcT)&VHIte7J}~k&7oboixI7O zqg?8NNPT1Xdbupy4UCMk5B&5uFH#H1Njb zhlnv22fsGSI;YMdgMoX+vHk=@&)(+g<>z*n{&t+xoNsz%+qZM)9JN9E+Pk9#6W$A9 z;6XVWaREcWduxHVlzr%6kmu2K?d!I%ZchC%ch|p%P-yw^bBpNl{i!u0c!n`>=1M?X zV;h6cna6-UJ}_T?E85y0L*f8u>Pw^p#P) zL+PW8M>u_|<$^DIPD3>(B$f3jopaGEb*qzPW2m(kIJV8iszrKfS@khl1Yn zvWXUzNUFY5&P5GOsvQ9;XzKyr=3t?LbKf7&_3`a5kZ(eZgrKw>O6d((7JrhFzVyC^ zcyMO4Vq#ABft&F1&vDpV;t0D2-*0^s#34o<%qgLAubgTGbidhsW$d-m>uKwHKPdf0 zjTro7n_JuJab!q*B-?WB%V#ig3mJX^k)!T-``W|c&=cTx`*z!k$!O61K7Jn1<#V?l zv)a0tk2umf=v#pnt*a6?^UWmtm(vhNNJHQ<&*ZcQ@*eoi1`2BEtzc_DRyX0< zx7Y!s9r@(E2f#JLW5ag7`YO5SswN+*VfK*;m2-$oPTWR+ise_L2P&EHtR8nBkjSa-9jcF?`8l{tz~M z-?cV-iqTOvZoFZstNR@h za>s5ZG&%W*h%(A=zqhTNKYO5Sgm{!?1Ea{Vn7IVQl$1XQej5c~5#|xdy>uUaUlbJJ z;o*+j{rx`clnAQ!)jKV^%|J~w@{}%Em3!5mscBD(#y@-utAQ^p2M|Du6U5duqEZzn z)B*tn%gz$pT2ViJ&6Ipq?4DJV|9ywj1Q`oeuseg`sk~q>7_=E(+@{8N(ehDod%h?U z>5>wXJA_YMGUc7!+N+uQgc*)>fpI(UQ-34JV<2p~daz9~X0a@cY3zteWn_@?rl?#MS^M$Al$dH9_HcmJy$7cAuOx%?VnpYN@Bn= zj)>3NTt-<7T@x?K5PwrBBMTR^UFLw$x6qvD6Vm-`>VcUf;VqahQJQ)}p!i3VfOf}N zEQz;-6RAO=o&{MfA3c#78nMe3r+rn%U`Ud}{2e8R!|+54W+1R{OeroMH1Fq5c^`Cg z^E~Oe*fo8^baHOP+y|KjncE-WgHRL9a$5v(`@p{5MZ1FpM&;-O=TxL+oEAlT*OLCp zF+&^dg}3K2KFJgJ3vyd&);eu8on;3*+z9{1sh(10^!6TA)@*;#!5(2OIC3#&iSLq! z*t-EvO;wpo-H$_=9NCz zViudV2^TG0CL*BQzsG(QNsKJPPxFTqs{XXFBExzE3c&%*c8;9}(jZZ2XcgKoGo>~H zAr`A5$4f2QQmO~&$gSMKGN)@RX2Pbco)oq)X^6LTg1Kbc5G6we25mq?kS$ahc#2vQXfNkL<&*BOA@4L{ z+8)ZC;y7DOs74#f_hQy$D(4fL#JL8Hs zOqM5WH_RtIIHe!Krz~x1ETwHKA1m(wLH7lux<@--)24cKIrmkUgNNxefBOzOuaHUW zmjlB?1t zoGFekU;V3|yzk>RZVW`;_4U)!=+~XDtDA!EUQMc$>5mMzyh>{0y#vCJ$Z5spHYJdz zZG*k0(g_i3HHM=XX)k8`K+bd$t&B)7mVqZYymbjJZoo6l_p3KkSUQ{ zJg#OnK7##{4Tb8wHWbCyHVvp~Y{LC`Uh z=kEI&U&W1H9(xFH{q8gSR54-8{DP(iPVpxu8m}-HDoHVZd{dh+_!ctOtL_NMN*OZ@ z=46zR|05WpB|}w}AeQ0dYgBlES=lk#Et*FmwS6$Q71m=0j}u6Q)Y0#*125aAt_*FM ztRmgx7~pykOpAEb)*JkdTE65P@M4c9hOM^pE`19@zCXDO-3g@3Nq>ZV7SbKk$;BNb z(id)*TDG<~R?QQVb)tTW5`~RHJ`-<8!QN3#%NTW=Sk^baDOr7S;AMuSqsam%p5O;o zRZt-Wbu1&Edpz$OP(fF~pN6iXplS8=g*g-g&()_J>1LZuPoz6SMheHnPOtnLS$1y% zM^u-Lir%q$)%V9pj;zZ-=U0m%)sR$DD9GIH3ezIhl%P^I4=1?OAMl`VByAEafzplD zRyolVo%;}fyr5E^xY7{4l_mQZs`_>9OR1R-uQ&^bjp|&AVn;ev3_0K)+BCg-)4;g5 zjMRvo;);YR?BQA!vmA4ktwc(_HYLj`a7=>4NeGKdVB*$oaUM-V++2p^_xGakCnw=~ z^TNgvD@q3_YLR zcj(J6555v@Q!Q^;#?H{4rZ{`{5$>>?VTW@7OydxoHpQygWIRgdR1T<5rSNxk2)-z9 zykP?9BItc{T<}X%%&?hW3Yai+L~yD4SktH-l0($u3{dO{;a&1EsWz`bKZYs@da~X% zUozyJSTbfDE~%ZF>gr&cgRbp8P!FL2X+)BC7i~G^9kK5nHe0Ho(b+a}Bk~9w#+;5# z$oU7hq*-4~aGls;uh7Pbeu=He7ONUHJl2O!BKrC`EeS%n9eEg{Ccue`sqE@65XjaU7_G(lBIpMv?gn{$WaN_%srC zYD}!XwiH~jI!=5+8bmdcDRxcKFODy)vHfS5nuzmdvk=3ER#YbCY*@^SIQ1fB1?3Rs zN5~-v-|T+GFIHJ`@!{QXDU_a)b98-4+Rx%i`JO3+W<`M}mkBL_YTmm%kGWJJOv`XZ z=L7&I9>&RJLV_pqR*pNRt>{yJIoZ{>Mv8KLn_E#aInh zTk699n?$NfNO?|6$O?qMmo3iCP^{D&#BFQq`&SQI7Y8Etjne00OsQhvmm~|oY$&!N zn-qI}Wo=rEg$Q-SNk;W@NjYUW^k6to}nL$E;|- zl4?>Qn;sdJoEEz3?C{U{yL@E5MzZ1k5sD5frf52t_|oX$;wTp4K5aK?nI;zEZFmV6 zis*2Swcs~fF`4>wCYsU#S35u;Rh-3Dkv!@qT_V~kT>;wzT`wD`lp!fhnr=mi2A0YU ze1|BuK!N$`sBh<=Em)wX5iHPZ9|mY+77aYzi$c&dit_BmmtaQKo=v;s7vW?H1&}Ta z_iB9=7Sh%%{9;`kmCtQtY_41etN%Nad!nNgTqHmr3j!epcxmg2Hc^UfN1p z#96Z)8L=TAQzH@+EmI8ITKi?5Lb;pVEwndzuxKCySVU*>EZT04+L0sN<c_l!1SkbDG^=ScL_)wUrE2d9dkAMb|XKw-O}x0_#xM{)+N#fXe$Kg6g#l z0}nMXd$!s$Ebn+LbXPKT^>~M28Tku3)GJsf(iBES{?#8aPwb{0WW)hBpjXT{f;jSLBn-9sT-HI=HL{IPDtP1|< z-E%>TjQN*++=I2;^Ke}+m3q(1YXi$d$BNEoz{}QCRfIoD$Sr@-Imu;U0sm5MyghYE zGc8GjeZ3FrLFML!9TIQ7yF;k9@oIP42|~g8bu;?mdeZ4{+|E`a4WP$QI!p);3Gzi4 z4}0<2o3nT-)|ho>HSeIdJag?FYw(|{SU%0!Z>eJgBX2#OY=#%JtI*kN8K-|7tk2SO zBR7`j;zbQiO-_&HReyKh@x2V|WgiUlE0~VQ^EudBLl#grHZ(b4rYq^Jxc8NDxSR(o zTzIUM1ck3dbh447wyhYklIVtlLyid6ql4mh%;q_UM{)9f zA&wI&$m*)-8xfaz#XNW}8megw-MbVE)TxuvCU}|iy(oCYo1tWuqzBRF1-ZOO@%g_$5|t=^V-N>Mmnd&jJ9gbx%&(3zOJyHMMD58Jnz{X zF3y0_E3G2l+C*p5hb}?zc^}2qO)tcUe_0F|=En8w#jBl0AY(X8Qe#H#2|Z~N15y7*!eRMr!gG2?;22L-tAI*l+@?W!b9;7ibOz9 z`>md*gnZeY-cL3wQC`7jY}=eU{V)>kkb(SjNTrYT)6%i%zhF>Biepo97>Je26{TA=X!NTf0XEZu5|CTL}l zCdh^yU63JehbdK%a?Js)YcRaejFk}kj8t#uF&R?U5t(8y^N3djOw!g4evaV@B`wT;U6=nA%s?Y1dH7lUPba573J)eJPW1~`%L z=C!^vLNgf+OTu3k7C9};Pm&?vNnz31yX6MvF&QkWOlpE5zNJ%EC*Gk$!y5V_2ZPYI z(%k4Y4!%i>?JbDF_asA2vZPG^SrX<~i;wfJTm#;zViR1eHi6$(lqU8_TrFJOZF`(u z0SoTXb(Mbdx~wNX$e=6G26fy|7=J*ZoqvUAl8I&CvSpY7u!ST8m2VG+Z=X$>JCH#o zr=U_0$E^%*D&{#Cd1v*?u4O%(hX*PhSP3*ZqZSD?G7KjptgBj|WPSKsrdV8rmqZzJ z^Pb9gPA7h5#jp~pZxFB&p2ko6YTtU01s)tk9%gy4=Bu02QkjJEuMF;3bQ4?K&4&g_ zL07^q7FpCF`y~D0O(kk!ZJSMUtAV7tDQj+`7CT^$wDkBU62|wUEv5=ZIFIULOGrI@={gT{jQ*`_4NKKt^K; zP}V*KA*rZOA7=|lzi0%?dgQ_vjKy&PP8gbjsxEc#iE0|FaMf$}sMXGW@{(io97ITr zG0XUg??2-3$F}43LK-^EVUxLxo;(~^S)S-F2*pI2c?p_zq-+#Mc!@z9(YyNKT0!iZ zT-q||wj;zhr>{5+a?*l*)VC<;y+S$VXSSRD4EoKyd^r$)3^Z(f(E0nnVp-?}h$S#0 zG+{h|MZ#jO*gdwp*YoHy4e{pn+Z7facJE->wQ*iUT*!uYPDHoFkTyMRT_Mh-80Yx> zZa*q_X7W5QxGpl;jdZfCbm!rA8gAWzXVmgYNKJzMuE<28b9R(yluj8c8By}bF6#^p|a3Tbyv@T6^SdCWy?V=zPyyf`54$<-2xPxgTUk0oYIa{T06 z5qkz|+8sI3zJpNS+}=Js1c-Xf*zY30?FhXiIvNK&VD#+DeY--;F{tCtkvrCX1TQ?& z>#Y;Q?I}vfII!2J1O(d|rQF~EAG@l~ciiUpGT(_feHZL^BelG0)O`|Jhma-DC<&LdQ^B&-z2DuDwq+SYvN!X4pWIFZBsU}V@Jv`@-C)z|XQa@R2q@fIO`XShNP zR2(uBE3fT1uZ#id?*S9t&a$MiZmp=Y@olR8(K~`kPHS_k4WcUj?HAI!w*DW6Vs>X4 zP*S7Fj^c&8T$8O8kj3zU8day%{z+AZ&Rp`fg**>fyI-%kV^|J!+fizxVtT{6`Qp0w zUxysMT0>)3?390y3IM+Am_-NFVUesUKBTT1Iw?qHhL0eBUh8s`mryo`+B9$y!L>)G z?m>EX%78inpDdNPvJP$4iK1=(fLYWCDIQukbQGi4RUfZ&is(e!7O-zC`aD9~_MWlj z4bN_OX-kBth5s2_+_j)SEUlWcf`4dX?}i*ywe0CtRieAyPs#oWx^TirliXkL-_1b0 z-tmneihsXq`09gHf4)bqgQfx~Wm%Md)2CaiCC+|v;X$w+AMXjF4!yAG1=j2|A-MI5 zy3wsG6C6q4pAZ&?Rks1XZC-YRaJ;fF{A!Hfl?`c_*YF_K*vGggogak<%eX`LmfCh+ z+13lK7%cRs7a8Y;Dl4t~ih)@S*`sfCk%`vNF|`PD^M2etzYo60MhsmJ{1P~dxo2!B zzCFkHOpN{zYA~nAX@6O6YXtrKNZ-~Z6X3wzzYUwzl&)0GS$U+oIy#P?i+?b1l+uW3c!L~Wh?R@QnA?n6Qv+a6Qv;dN2efy5;kcBPym|-f^R@mg8k7_Y9nY<;3ITUTPE?@}aYoaThX1eL9^XOa(mz8;z z_wZDN`>#2dUXt?dcxNK^=J}p(pNLRJV};Y}UME5KO`p~mQ$bj5El8y)&^_A7uM@Jr z!);=j4GKfq7>`Dedh}b!Z^Q|LVzD!3Of^Mltf`#kb)sJpjtkykHuU{{-$=tt6;?adZLmlT7GrqQTXPB3A>?h z;1^hJRVjv4EVs|-bsFQ1J;O`2jDHfrc}@8~;-GoX_)!`XrFkn-A1VZM74l}0XDw0- z#(-09ojNGVT!H+<&;^XP`j(B72OHW+w9r_oLV+9rDUQWdrR6nM) z9dPK++YMzlklv=y39P3Eu>eOSF_&ZDibShyv2y;QdhF(lzk70+@2?kHP4$P^JEmD$ zYtKwx2>f++3<67%M>6sg3DhNXgVSX#)G4F+d*SO4HU+*|2e&ZkLLh{s4IW8oo6xY8 zf;K6Jfh_9~#gu+msLyXjn$W2uyp;~9+!UAG#3qz4hyGnxIhd-9l~@ z%M`X|RqK4Vs0ys}!Se<4Y1!7;Vk^_MScKkaBpuPOTBs~%d$~~2)P)24o*)ykc{B6I zTEH09l|<8euc$Cktlo9BKzgWYe?D>Cx^ELj8&zkVI9E{fDVQ6dt2JvX4~@`kT-936 zp}uS;Qm^IP#ZQ{d#5uF4)(r5fIxte>*GUBh`SW+PZLSA5GfF#{^ffsa+;5S1S5)g+ z>7WVJ_L_vY45w*;f)p8Dd(UBKoebV($TWag68oH9Qt$eG2!oXk2xPX zQ0CnzbTlB1@N91bUCn-V?Ej$+DdkTcn3-DKJ)t{4CAb{1&0itRuh#FTMlPOy*osxf zO=RY25%G}CM0XOC3Ac}P(l3PjaXWhUjQDm;gW-)E8oCcTuG-UHk*uAaaK^Kf1o6#H z#fJJuSWQJM})``PW=-)D?d*wMfXdlZbw;tgb@S<24;-= zX*7x(rUgd&nfhtpi~A{xdgxh_Cat<}Ogg65nu1{-Jv184f($1!D+rtv|7&VBr+(HL z9p2u_1rGA%>CwfpZ509JcdcBT8*B_{r^q&)#2!XbP2eEd*qa4%&BJYMWW-o!IF}Cq zT~tDce4p&VOlN4=TDV#mqe1L|%Ie6%`!MVTuY4kC+}JC5A35wvR1oL`-HcvM3xjBe(&8VT2?Mlm@l>*vrYbTnO9?BEWZ zPMS64Pea549s`MjEX#oLgZrR!Vk8W=`~&smWto zhS=Dal*NW@AOIYs-oY;F6S(?0caZ@D*6!k~qo+%g04iE=(C-Pr&mgJ(rm)L}^!9Y4 zF@aHhagl4HT;M8PJt(0$gRU*?aar7{vd1HDlC`3AHuGmr@O>D1-_qx2t?KOaZro3Y z4Zfz^c$_L&VNheb?8v}_uoiFKtRYPeS2}bvio34dX-D*UhT1}pk=+7PfornJ&TC>` zF4^F3dy(WMTgG(pp-1lC*ZyUT$A3WluPR8r^)M*c-|Xp7TJqZ@9o+=m!sb@i@Kkv6 zr{8>yRBC+nWG#(dR^X0*5Q4oE<1fS%V?U*%``@)5VjBge7TxeE?RV5O@!{&_xAger z-mknb)P~>-e&ey7o;4(=L{*zwQl0VYyU|4}y`!i$pYBVn|1~zjb+8eR*Fj2=1L-rl zq4pYaTE8jycENs9IZ@g`7q};MPFIG%Knm|d`6-Uctw3=Fi3Ch_8CDTa>Sc-Ok?$=P z3F;9D0ErSc_o^&xZfXMU^!eG#G8(Ij+S}A;%~WyuLSH9Uq>pw0#sWUro3OVDh8AAb ztG`&^?1cM__tI9YX2V*eydSHer;iz@+!G`i1)+CyZhtDV?lCu9YinFG@XBu9!O|H^6tuE~vBkOs>S zT8iP)a)n=yWP3uPM2cD{8q~iqmd!705P$3fLN{Lj(qi$-oXv6PAY%&uGEP_D@%R%n z?fd0}!1wK24!E?8DOWf_ja8eaM)oguO|eB)+5T8!;|nJmHp}6H-T7HC%1US*OadM% zoY59$bTepq7QYvpx|I0lcP0924C>ZN{3JisEx4Nm0^Dwn4md)ooDDpE`K{IFo!*?d ztLssXewIuaSDlYx2v$Q85gMA>sVfky`37Jc@;L@)AFO%bjSr>tjI$x-I-Kcv&GBml0%u16rizsJo zjg@EpYeUUylMFE_>N{?x+*w2@gB_8}9MeR#Hp5rymzlH+kP0|6DDMRIj}0rH&@N`) z1d-6jCq*g&!@Jv1vb2;fs+WCF`|Z2jMm9U3kyhim<6sTh6>^ zXh+zUW+hQ)AM0kmL~WplU>ROssg=)DtkUyix$l3Z5q4*D)0kNnMIT*f{{XJR)DJA# zDlxsq>pO$O+)-QZp9K_YZC-e7cq|RtQ&S|5GrQgP&PmWJ-cCLU)(vTsWqhz2k56>b zkO$b=DP(AIjnTh{cTlT>6jv{A-}b5S!TSf})AFq88i#6loNZ9cO2a?^q^-5plLhf8 ziw}aO+jQ5BNe=}JMK3uB9>kN~>~5OXG>O@5Ya!rWJSe&N1Aaj1clZ(hgCAh+sT2>x zFwDRV^HclSeM9GV+hV80CxrXNqAk((+BRx2huMfBi=ElXv5|!d;{;(w5#hqe2n&ZX z4_Ov}e>7{j*)p%DI*229+C&RAn|a03g7dx7Z4byuX&Q!51=~t+03|R~M%kU3sy}Ek z?DR(w9SQ(df6Z`ZGfbTCD>8y@N$L!e&ZwrDBYffNNmqMp4Vsc0wL2h%F_54CgW?C@+r|=ibqXG ztW`S(WnP;3Q*&yML^dH~R;_(5GR+%2brT|tJ7+An)LKji*?#02-_#^fQ95F%mG)IH7?M`{XmwU3Nm5lHeX7ubV?GtMLK0% zN|XGI$HA>gGCd?ZQYigb?lnOD;H5~0lcZ8hKT``|&Q~s`puQurm8X?E!&?%Ts(q1l z>RuzP6S=kjPZ=(n@=d@t4fN^6Papwyy^A(-Jkp65*3v? z4InWm3UCLs1QlIWV8xaBF;kZi3$PWu4_bgRhDumZG0&;M!6kq=uM}8Qg+kh=2i}5v3Vu zjs=Q6idRg4h{cR7oNa)Vk+C_%l#iHTY0eduz+?)2?z^R7*z(wz`#X+L#+3@AkpzoR z^72p%Oeg+1Y|i!J$0G}V+gGntX*7`m{5pR}WD{`D`+D2&dETPZtr^FdFFwp z=BxUAev$u-y=#mS(|N~n5z04#uCJa9ka-|bzCs{3|NSpeV^ejT+BJPx72}TggnD%9 z`KcT;;VCxp(7Gv!GuB;TNp6R@kW8fFb0bKSNTy7AOb{&8pey8#^kDeZwe0Kr>)z+@ z-@pzHlTE=MoPhlY*4A$JY zKQ={Lm{fWrL;?#(3>OTBgU8!Hy~p0&)$nHU(0lam2Txw_{_1nTcMVO;@IcNM&YD93 zcJyzqe)PQ04};%(_XfrL)_eMK)&JgmQ@2sD_@)5N*a!O=4(^8!gD<6p4Rinl9>+hE zTc20*IQDo_V4J})VZwZFsEvNv4Ry6FIC<$f&a%D}X_FQg6I>4Z6X%2LA#D`i2SgLk z`(UVNJ3DXa6!Q5ehP_u1?j8DTShdPU1CysTRxI{G&b;V0JZB0ywMb$mNr~PkB}042 zXM1)uo4bTrMT$m@jv6VnU<1yPX4fS?BN*wFc^cAKj}R9b z2A!T1aPbs)BqR<3MGV&9=LDmmaA=4LCYNF?=8`P5`&ooT28!q}Jscio*VD(+sCWag z1C)CnOIakr&3Hf|!Eyiri~NOQDnQ16Mxzub36Fdg@G$1|AB-VRMGJ&X84hi4DYjt5 zsT|l^v#IH|Ndp}2wr5}@jy&$G$v9sxZ&kx9%2QAh*o`yU4!D~``DNQVJaP_>&+WQ$ z5ww(a0s1?rPhZQQg`!{2-z$*6RqR4DUs;_LwET9Jd;{uKhD5t9cmY+CS(2kcGqXTy5l5nb@6ZZ+nM z$OHbnwC{`!2^qR}9&J!X&GQ+%FTT+jQ|`D}_bU(Sc|GYXclvC@f<&8a-u21$suGxk z%~lzm_GJ+pX@5-amF>_-Fo128WPYB6B`*;my>;B^X^ENsJ1)&0(!U%zkD;-d(~Zq3 zh!_HdeR6pzh{-c<{O;ygPqlwt+UB95opMNOppH+Pw8|WvR!n?R6jS=?@pC{jwmjJ2 z6fOA{rKDawU)Dxy$&>@?X>b*nQTyvi?%symB?Ho=M+-2r zkMH-t(?b~6;%`K@ov04Cb;_vHLgH++$X>u*{D>hKs+4npSe4D_X+@H`)iIlFY@}yc zz-Zqs+e00MA1M!xlTueX!JbVDxHio#E`f?ZsTjE#*$3giMdnW+<`XErtpUkB0SeY2 zX1+&{#?UYI^us+zoAiPmF8Edg3KY7a4jE2QT=o5z1GB`-0V$Fr;aIClIKMiAORbaP zCK`E{md6h+mLP3pRpy42bg8zJSEpnvJw#TB9KXXRu{Gi62B{1kR-U|H_IqY;lYFC5 zWKE_`07hgEpuVmFcmY+GZE~Zz4TS&a6uE#B0tEPR91s9!l(prFC1-bTpME9F zGwUk5TrLX)8{H2WCSfyVtkpEzuu-PwUUf^IscZ6zh}ufFqJ1#US$Pktxr(OKKY#r3 z?fUO>y1AdOnenfiz5ioW>2s<_DM4+MHVK*;MbvCh@2;h|P}eTOBO<#qt5_KmXW64D zovt_gmUJ)agVkhGYpYouTnbZdQ9PPM(c9Ti z-!31o_D9}}n^(uhn~0&BcXc)IYnAH7N3>Pzj@5ckLIZW@X6fE~i9s1I&*JxvkK*fm z`M8~5t`9ZZB;C8DP%@R#tdot|d9H<{R*l##p=!6%c1@$bT1)Za7FO%CI{()CH+MPt zz5Loeps->#CCfI9FlcF-h*PsoYnX;IV<-Um zTwm_>IcC?nd|4yhc={gJwZyKmrgUl1v-h#9kQl_rm-eFN@Jg=z)xI2(Kl=Xh@#s*Mtg5ZSJ}2?73yNon6(UZp!A+M*COi`dOLEy=>t4x@5>sc(D68 z8s7}xPWREhSPW$wd$XcAwPTbJym;yy<aE_2_I$0Y9exOjN zCNn4p8Mj%hp(lauL)LSE-&_hY)@In9CdV^|i%!4V zBp?jeg@3338l9yw%sU~)0PY&%ea90%PY&aZ1w|Tup($EzKHKEe`ndjFZ-3n{?-PVj zP@xy665bSQ%!YnhRwNAqA>)9s%!Mlp68)Z1gDk{&ssg-)mwQh$z6Fa{)cv?O{fn@}yVDP~x6px>c_4f7@E z!L1+pzVEk3R|#@J#W^H4{!apPrm?mJX72>jS_|yd@G^AL!ihTN5DF0bs`_$X_U_-$ z|9f-`a*H?Y9+035L}&|1ZIla(a-u==(GK4me0fyci5J+v6{aszuwojv zJl-KknOF$bv3>EX*}OU)6l3*`ABBI3fXB|s-!A+7U?84J_z<&KY2#Q6X@jG~`q=ax zBsKWRAQm&l#FPlo=)B>Pif7lamaj<7+v{U1!h@VU3AlDs@S<^q`|)(BSOTL??1&7! zMmi_}!q@7sm$4Cqf07$vxc>L$e0!K{NK@A1DYOP*(E?S9wFCOk-j8c8ICBueAvB8~ zTQ2*?YYUP)()g+EdP4B?C31Hd7)>3^EeRhX>_s9lwR_AB`m+WMjJM*#GGEIUm@&2> z@k{VZYn{JpU(QdsMuD<*px0OeA@-15gv#Joop^Eq0bon*k>0yGUI~ZKlw0D3@>TG5 zzWh9%rS}Klz1RN()F>YUKwKBQ@0bDxrSR z(7T;?e(rREOq8j4G`Jv6k`*d*n3({9+O;j8ok88JvzW8dFsX_``hKY#Kh0DZw(A75 zWO$sr*2#3OlWD_8t;z3WxF;*>s83##Av9TCM|rZ0qReDX9mUCSm1My*ubMoV&eIgz ztf{j@8K^;EvQ2>c5Kc$}4y!A=7)3`Fn!icvYDun0JXv^VkIXE}zGEsp04 zmylSDWUuQnax{>3*WJ|a=R5Fl`w@(! zwnGHL^OHgG2+fI+a^cN4b@Pjw>;!;*c$_=JyqHNUFEKaONNr_HAOcyFTXTBW8(av$<2(yg6QI000L4Q7`?Fpc%0=`TW`}a z6n@{YINA^eBq!?)M8(h$5>Fr`F0V|E<0M`kJNVMIWBhlHW2*!&@Dv~WI~RZc z&WWNmpTTkFh0MV^TJquXkyf)KfX3S@d;u~;6|1<7765^o3biqUn^0xzBISkQUp=?( zAlFNswUAf=QDR9NiNNS)ys`v~0-t&1JdxC4g7(Nd-t>Zdi>ZJzC$zFDCT4T(-T7j& zgJ6_ZVwnns38ifFMW^${Xxw1|u7s;*8w-FhouL;9zF=AvqD12Ovf)P5TwxqiaO%9_ z7S5oMbdHMakgxhM*5kSMe)4z54bF{8EKLWPN~=xF+M+c~|>TRUh6vuAr(@~31&?%m)u zwYNj}^hW^Q-WpUkLh--V8kfR&H>auP&Np4I^TqJirieeH8SuR1z3qmwIhKq8gA8`0 zoS_1MX~Vq}(n5)2qtzP01O78DrEtKcRvaql@IGmZtm;IYgk7g`Q=znH>wOH;@%5;h+nyOI016e~uEIN2O*Ao}WPpjYei}_dpatMYlHD_j+Z(~N^31Oa5oW+-IkGs(qe zrOnGfP{HZ<`zCeEa6|11)}xLN@rnnN2I#EO)pY!D*-Tr}U?-&t@(NC4vChBwg4UT! zRb`?aWd0B1!Kbf46_{qGvi{z#r)KaPAFb-W5rn6yIV-HHez*zOVwrnAEO-&%jN*<_p-LWJnE&9Y*`S6B~p4dyS@JLeI82w zuwE{dKR#l?_~djlX5)aJCC5044&z`l3Gg&H3>e}W!;|9#=@i_@i*NIri`lPfsC2Zz zCrVe#lo#Nw!EHu5jV#t&N17)e z7qYZ^hmvFs1*%f$Do|z8V@yf0YIKzGcPQdWWrHcKxPwqR^tcX2P`Zec;Z@Y~4o2g$ z*>#9MYT;a%U!{K9teQK(Ye};e`!0 z8>1jXf~Q~$eCvn*n^2PGvj0(d|4hJ7&TH^L*Pm}L!@a$l)u7pjZGqb#D4iGRf3Vcu z!|J$+Qad^BV{I}Twd$v-Tg{x7>*wst*U;T(M%T3zJhq>?`5ZQ&BQC&`M2_47yC6f)L2}o_p@s@odU!t=OZG4CM|UxlRe0K~ziN5EpsQWdd=kilV{< zgw!HIaF@Z|YIz;Oo)sXm+863&4tr6hz!KasS!dZCin_{#M32l2Ve@QK%t}<6wR{$V z3UsVQS#3K|Ep^Hjb|(NT;e=;qt1!HMSp$zcod<&T_0kW1n9s#Pl%GbVvE+(Z2zgOU zQy0%smpmRiJQ@rYQlgqel?pwc4r|dZ52a>j$uRFfOBpOSeJx8Rb|S-P9HFO%@3qT* zb~ZXRBB0`=AvGapYgjck-uKS7l|d>W(Y&j%4V)5U7=hM!AjAXrSI6V|y5i6HW^FgO zQMmB@FYW0rTt|!GVflR(JOsDl;>z8{IhPQ(*zHZTQx0LN{C z4s5rVX7nh@q;(r7)6E6xS{nS5j(hAT6U>IV=5GBb_AdyTJPBgnt~QFmR4v(F@zP49 zL0ScTR>-pv;m>e=W837_hau+#GmSmo+M9g&OCl7|(hOoGBc$}4$QE%EX5XYbK zr?_U(AnjaQUZycpsbfstL$`-*Ph)KZb-*gvG%A%l-C(A;Khnl&3zz z++i6#u<-X8{qW}ml4w&r3jUNo`a2v3-`0|gdmSxenJi5{dotevMs35z+a8*uknc&$ zDA_7ZZf$f|4jo}dr^ha%jtd@~9%tk8td@eQqtk&31TI22gCHoev6>nhk6uGI_6=av zrUu5N*MN=v7R(lk)g|fG>Nu~3@8Lia+^d-B=^SLjXJ(ue7OSpZuCALJ)!#oN_AOsa zw~2N+x9bRF(#qVB++a^Nm7-rdq-*%~V{|(lUJkED?p(3R%iWX0|p=3 zE?G@%Ob;^HOo1)}$THAL%5q=Vwu&pZ;XgcGUn-uc^FKZFi^qK?MCnMUDzu+8d(xq2 zFC){sU12b&jb0EGJAp1Iq4!N{U_z#|`L6P!AK+I=eg!oa9%&QgRiZkd zhoYlRJ-Ea8WzNCSR?6xG9}0~&_0SIEmpP50%hzq*r01P-FCbG5G6w&-BH+t5!JYCG zdo6i2iYd7XVvj2f)T$X_Qg1@o;|c<6E)ezt_Fc7=zbq;kc&6O3@KH?QU(Gsk z8NHkVc$}?PZExd55dMsR#he={O^M_7B#?mSBoLeq2^}Bc3u>xry`I!d>|L`jO(Kr} zelu%3=Y&)o2a%H4>z!wwd1iLT7ccVQY+fjxqke)yxGHhzAq%)mk_(U($_@BRc<@^T zxbs%PTGi;F5>E))cqkAxG^SK*g=IqKSfYJsg|C*AORaW*Pojn_Q%xHz(gp5X3)6J+ zr$wn+boou@ym-W$oNX7Cah~>|44&>>^;bHbC65+cNV{zhy$g$Lw5TP*5+)o`c2&4Nm17i)h80`%oj&w4v@!0jy#>?aw2SDde`6Xfzo4xthHDK zReOj|z#B3`aH2sVYDrQnjgI1poTjV-+r|`S_U=0S>i%ka7LcjHD*5akI4sFBUtHPM zWwiM4vzjfg^3_dFK|5nT+}_@%ljt%{?(Sf6xs{OB?e}U zh1y?r@LuV?ln-6%v(D96moZ}0Ci@mT8>$R#G8248F>Gc%(tie`yBN}p`KFVeU&@LM zcPUe62oV^46K7Ygg z^BFvNdv$Oeb9X>Go4xVY=dyN$@JV_52ZZCyoj-0DL{({STQv$7Ck47B4wui#ND6KX zs~>)TeFzvXNf^?!1ZRSkG-Avey8hc2Z63Ea!PVVW5!}8oyBX`lolzR$R~Zw4tuYY)O|c2&TJ$?}G2-m{Q;Lz{&9-2!N>)WZcX4 zq|lpvN#j0f8mydLZ8DLKQt3T5mU#MAK{RcQFI z((6Diw1`#0WkD!?{q$pYD53eY=PQC$6lPZo%mBKhlO$aG3ChaAQKL-HxAcDF(aB7Y zJI8xIpjgH20-;WLoV(V^bfJT3Ll(>CS1jUuoXHtQ`S~RZdis+;3X5-65q`(c1`*mU zExkJv0E}S}ASo zXd(fCtobNFpAb~bS8@2)>HPJP2$qHPS6)`z8xR#HPKL}1*H z48j=~Y!Sr^J{!jiHqIs)n~xV_5>DqcF_~jvFnONMeO4x2exnNzY|< zeRM<(J~*eW;kmp3%Cdl^S&)U12%~h0i0K&N<1C66Stv4*vRF)}d_&eoAmqi8^f+Fr zQg4lMKc95Y`6T3+K`4+n#1l+qn!+?(#EXbWBI1zFGLZ!f&f@VRn~%AGXbfR2U>bz? z^GREMovJIp0z-wmtO~`1-mGF-r!&9jk$#*wj>gXNT2Q2xHDpW{&iSkJpWJVMIbNRs z^5%@1vZjI8wN>Cc4)9zNcQ6=`Z^zHqZED-MZj@2>+%~P|`@ZXxAB1d(SCbpO&QLd; zZarKF$q)}?G_v;a7;5bE%IKd0;$3~r$W0FS`hvW7_PnDnpg+pFKc0V0xHtdzY#%-S zHS5PBe4)tegZ#QWubrMG|K~3Ghuh@~_1;FglR>9hHUSivokr=U>Q*8H6g9b$6)UV@ za#j?Hy@h^mRku=x7_6w}&5TS77!mZ{SoTJuWrf$M0vukG24%WNLD@7gy)ng1o@$%! z^3$vNESZJ$HWk;YTb+w1yNBR(}s6?pSLVE*PBYw6n^EZ&}ft3=j| zZf$ZO=VEWPC4F!2;4TYG;x5pdNku#$wl1e<30?lNOlaL<{7CMR*dFmyaVB?cZ7ECD z0LdD8p$gUNZPPk?T{8~{0y2pM`1j+p<(s#s#I-^+afjr9*rS(~fd>1QUO=OzsP=~jzGKvYHb~3ogbc{D!#A(UZ)dMwKijo5 zc>_#PZr={>*pb2HA=4zmh)Mqidm32pRx7RTr9u^G@!|FPKIq?8C95?QS?~F%Lx~+u z^jC9_RFl?Y>y{opKOkIH znOyaq-;2|K(k49F9&7U!+z75jkE3_pm#9whg%N?pn zSGMc}l49?DK!RL0ye)8y;psyqklyt!K1)?&_R$;N@y(K6u%wXMd|jPy58AJ(_N_U1 zx8@ryJpJw0Wc^w$$XeNU15-l-skz!{pV;+rt+p$<@tmDLu}s$`jqVcmrobl5?tpWm*|0Dx@35qg;ZH< z8!-@m_pca|f)ntrojXnmr3a;XX&zcAv=m#bo!ynAmDZBhM@#>EXXJw%cKZ^7NBXY$ zw1@DmLWhuB2vQ~tGxQsjtR-y{k1;Vurif2uoXnh<`FHEGc8oc!St_bik8RmfZDVEKFPU zL0JQ~fO&KhXinUGsE)#W5n|H%0Ln~IhA!4A0o@roqdZ9AarIxJG=lP`8=&KFm6(wCQb0>J!g{I(>O%YOd zdrt;!6E~!y$yI&gav}{7P4iHCIN}Hg39Cugzj4yXtTm&|!p5!P)~rwT;O^sxXxE3f zC?e%s9ncvO)C~0!=13K8i88lyqpetTH?$&B5?1a@s%)Fxd{>D*!P9FF3zA|a^4&fyrSAhh+WzI$b$Kxv4zH%ant^wXE6Ve7 zI$g--x^`#fFxetL15|$0n%d^7P{_iMo=d#l#lA8VwT?JpbpJE7YYl62Phj>LoX*Z& zo#j%`{e^Lhv-)HFH&%lVJzJOT#;C-0o9F#+4yV`Zgc&rhn{>@?We! zj|n2SoxX9_1xWjYWb;D!5z-hneI*}_pTE=2Uo{CZDX>0xoPAQkZks?5J;PVL5ESex zh$iXD2CJ&n9((J_aild2W);|_yNhuoe|&er#A%!s32A5c&CGlA_WCO6v`V&IBqa9O zGF|za4C0O?THaF0covk_WEno=ctjB11ulqmCHn}Q%@U>};d^wT96N4c6cOUs z-N!;2(l#h4mx>w6Y*yJBaV~4AGFJEOMdQ);yd!psTEu%qPsd07DU9Byf4W|a*Sw~} zl1N~`Zym2qEX4xJ)7xNz)}*yh^{C}lK*Q8?yme?N12;FA&79Izh6l{&n1toBX}HP4 z`z0!=jbIIB;e!kMEc~*Bu6Su+4|Fh!WkL8g@IAMPl1yGfD!$_aib|af>qy3idU2WZ zJDUA10pwMrdWS$*fSjkKg=VfX&T!6#LuI=k^>S=rwz6QDePY^U<+^IDsN#+ zBdn5w_K7wHDdh?emgSxAmE89ly~~30?!rl`JM{<$ZNb2AWcS0e3qo5JAe}k2qt(uJ zn;-QAxF08quCC{Q^PMo@8mv~tiWfLXtgAgY6(ZL=3O=Gd5*v*I7SX{!-@9iJ`(~;2%>9qXS@W|G0 z{of!Rynr@cS*|WRjh5O4{Q(IGIOVy30eGC1RoiacI1qhaeZ|B!;H0~f;>58X2hMI0 z#7Ti%ina^vgMfe{M;052BuJ`J7Ww#+vXZ*4b15K5A~}~cGiQd~t=L$pF&>1*k_8T8 zrKOc=W$sg1$0-*vF?kSlk70iL<>VX~8;r7az((UVBkA~%jQ6qwoa`U&j`t7f@DTTL zg5%wEcsM*Dg9DNdvdMt4bUYayOtN&}TY~wg>r2S3Rns`mtcn(*ilkn|?i-in7MoW% zjE2!5vP4IV|AWAwg|Nap2(VUCTlo0?%lT{_z2)Mb()dmjrBIvcYtaQkdCRzlP(drY zM|Qoi1`WXX^JL_ zqE6sKh0s~jT!mDYN(vO#%mxtF8N^K9i9!-)Hf85$cNwp}uS&h>&LD%3L*G0!bvF6K zTe$Ghha~vJXc~W&X+$Bdc)>za)iD=Nttdj1gOag#m+=B4F5DAz!RFk6dlYfSlbM6Y z3ZDK2LIP(Yl#(8tmG002Ej$Hv3Et@ftyDJ3gG_43fQ!{#y0REV^az-Q z=`r*&|0nQ=j&mGmq9m5)PRXwpMH7wxtxFe$r0oi|mU@G&E?}8zLJ??AqzO!3Wm$nY zu5hI*+pM3&$vZeFf)y_9%R?w7Lm+xld65Vpd6&ffCsl?SsS2mcGuYmG-1Ry;u)2a7 z)Q%;rQrk&KI}frZG}$YOD;NzH8WsEokQRrBv1(?G zmpQJx0#GUB5P7reuE~4W)g5=QJ2U#u^2@0FMAMvh2GW2PuC}|m5_*6WKQN6@6SHZ z!t1?tux*1sSHGp%6-%xBx*4jGG(i(+=d_y*#JYfuLTU{py(Ytr(JstC{C9aebz{Rd z>oRIL7b=6``W(f#zuO7^Y@wengCp<*`&F?=v~Ri@J8;}!YL&1?`hp9u)I_jkP#Y&C zouv0q(&<0~$E`VWXU_w#JoATB#OxZ>U}NBcHxLDRvZo8B20;kBabFD#C?yXX_EG7Fm$5;2a(TQpAKk1(|#Hbh&vj1A$8rx z6HFf$pCQw_QkMv&x^h-!?FhL-W^H2Dn&;}cv3(~PIT}l6^J-a&X|QXyu`IT!gw*hG zy}TRu-YcW`2Hv@7mdjHk&C3@;(6hu<#iZ)|z{baJW2HHV^>c#N0VkGGTMxWStrpRfO(+|Q?r_v5u{84KH{ zT;U{V_R3&V(-rL{E89EDG?N7{xoT9yl4SfVQ#(i|l!i?d#$n&ijh-9R_-)I+y=<|S zWGUZ_kHh`_U^Wc{_J2l*hsVVYG;L`#<_VMfr9G{%YS$#ChrdLp?e^8|cbKMxovRi? z0lFYDVU3QIYc5JKUrv!jS*1`;pC#AKc@Q5>S4nQV@s*vVaypg!IXO3%Cw1)6mMq|W z@yO(l{&aHOq?<^wX5~jPj4{bdlY2|58OYO2%saJviBchVAgHj;AZK{JOXhd@04vEV zu;ujlCjKB1_`~`iS@tinw)g>foTXQ7Q`<%m{#^fxjUnR%a+398Nhae=sRJZ41Q;Nb z>6F%Ux;xod^j4h|OiTZJ_awh!2qgUgKJV@B?LE8u?0M^jsmiPnrbSdq$HFr6A}h17 zQnz6?HA9)2R83l~t#@#Ea5?+{k=GYdWQEM(R*$=)*Y8>u?*%^V`L1WvfIHl=S!6pt zE^Y2~dAA!-7k50zv3uGR9G;(kf=OBCYR@#sNgm74$cnMavzs)|DAzKR7HlHF3cV(- z;TX12(!!Yjy%G%fZQlyRC}e%kBPZ~=)3^FO3LGn7+_(BR^Zd|uY?Ou(wOHubU7L6P zz;!sa!p&fAZf=YukBT}Ry&$&X8urR^GYa8(uGe+^o^SW8hzHc^*?}9_zUTIR>N39{ z`cV+t^`79o$5^-5N3|dl!V&Iz6!RdexRiMzm{c-L*U(WI4I^D6FswS5@oF%ATX+`p zICE&1x^7>1Hll=QSwS!2wAbreUVypq5eGrLzGe4B$Q{9)e&4eLdlQnV%#Cqc)gj=g zIc7}%VNQI*U9Rd-!oTfSONkOlC8n*GnC4kg!rA`ihe2mnXd|0;31gH^gn3iYJQsyB zSqESX5_$_+QGcXa31TW$x#pw2tv~jjD%tiojP&VfR!TMk|%{4Fs4;6_VE@EZ^T<_tN+xXR)8w@^+*3dXwp zEkqK*XOj%tTU%SO-Q5EkOR8i#25e_2Gf)%5FxsP?~ELYx9o@El5*+nC4>Yd|~{ zzByCgt5Is-kBt=qvBKEq^?dhN)t?E zEYoXI4CbmPa+dyMhRT*^CkJ0Xo($3K<3dlSEUvg%>YN|!9}geVY0@!=p@FHh^(>C= zz&lv>6Z;>wSZ+UT9P^p2mFRuq^-!x-4W)SeE2jD$-I7EFjYeRz}ArUq9D!V*~;j)-imChxM`5IAG6@ z{oYGJ+v~gELobq34IT31!{{l&fk^16yE^%5a`&7vzw5wN>!(DjnnjcBs~|EWY(mqq z08EI;@xM&bLmXpv6sX%oa|S63A+%{dH$_?xb|eniF?S5)Q7zUrO3EyY4Vh}ynHz%J zJLdAsO5}fBy}D96SFcgy?#g-=VK*1}grpkDSnQzZ#d^i@@yA~fF?;m>;Fr%wqoHnz z3m5(O@tw`)gEcX_yZ2UpuC$M(e;u9R;0JD7dPqsxTK z)Tk4FWE&omibwGS5i501md0vBNtQ_?(>)2u3nR~Mni(%tr*lo% zs-J}9Pwca^^V8wIcA638k2Tb~XIPM~9!eYU)rn}PbA-QEnkaQ0KrHBWGh$xB3m6wT z5=e2lc+kTmHTJso9|%PC*6kCEO?aGZliw%0p@?a+8k;1e`s9U7Dgq^$d6mh@`sGE5 z1qG=^#Y#Xy>B%3NB>1>;vr{sQ6m$y|^hJ*nGmSiR?xch}FxH~&5m?&sKL=tmyDiv}v^RiP@bQGKw z^7C>kH8+3a$Yh-SldF_Bu{c8^IX^EgGrhDZb@EN_oXIgfMw8{)L|Jl6i*qJVkz?Mvb{i7nev%fyeLleW+z1k0BsclYj{-@T-@N3Bx^ zX-uqRDaKSA<Pr-Gg(q*vmj`Ffyw#Z_!5S!KR|~4z8Lg}JvQWB!Qyx{5;!~_ z4SPq)(P-2g4C4N5=&Nvs$3y0?K`)LElWzaG?gW$D>mQIgr%xy?Dw{{SobgDRlp4&D zS+q@<#8EFgj2tsj`ZowHIv^D;g8-LW83#9C?=H{U?;W7MQy%Wux05xf$GSDlNlwzT zD%c!rMEE8m-XMHs2X*EFs#BpF$$Nd^}SSwpuON@18(aYR2cXOrh=vR#k?h zjiM+Fyz)T&>_%$BRiRahrL$)-kYxf?s70A8CSG0EF2}5rxp<;jNSDFI)law>j~gC~ z0*HjReQX?Ov&a8&R57uD;PJu;cd{~yve*E1h zm;jYP#*E;qnQhIzHH}tQE~i$rMcMhNr8t0aT@)T{Cw1q3oo+JCT-I=Z2q6`1hKV@T z5q}OZu3e87@hvi3BF{U|1gmBc67E|zN!{5Fwbvwtw45%K5#E8mVGA&qg)D1_09&uK zmL&s&2^uUpKC{y4bn@-{`E*Ld%~MF*ULc-V0=>!>jf=9t%MB6bs!U{B8T78uzMEX0 zJ$d{!Z`L0akUy}0b#r??erbw&3oOq!wrHHNi`bOBM0!839GfV!^498r{@*cQIky9Q zkQ&rL%;f3ofwzW*Pr*O%X`xi^Pm*_doMltZZrwx_R>DtGLxPHsKw**Lwh$3%>=}Dz zJT3%?LT|GGr3zV8DpEARz9zocxBjWFqDln`!Io;CfE9~MEPzKS5|0490Bc?VF}`W@ z*M%*gGjqQ4o$ovTZvD@-AMhuPYoUcwhGHs_<$@ARF*4esRAI>yMzUBcExF;E5=EJj zF=la0HD(#l9^Ko#n~$fEg*ZfEE9!7|90b=s0>hgJJG&rdnBYWWrc;tBnwVHx9ZRgO z5Q#)_Dv?RE#1KSeh9tF87-Ja{mQkEq`slywGV#zP8c%Hv=bz7aVK~)BDP{!9IM1v^ z+-Q>|D8s2h$hYSxliUx%Rh+2=ODm=4BQ58?E^*&3u!lYWWR9I*z?R(WqEpMUMk1rB zG%{gnrZ|>TCPXQfQm>+aVor$WSxiVw1oFBniDi!jhWmS;g8<_|9KTW9PH#j}u2h&$ zy0EJAXxhm>j*5xRYtgiIr`oPIQPGqTg_zIj$m94NpV+&TQIc3~3A0I-s)VGHYA#a| ztJF}I5kUpT-czrs7X=%^MT(V3dQ08a#Z8P+NJG@Oh9{q=nl`2dursqDFtce@x8U~n z!S2?ETYniWY`7m6-**2l=ARPiC-Bt-s_8V6#bgi!<0D8wPK)(_GrGQt< z{jmgBE{x(co3CG5OaOP>lO-6O?UJL*AHFnq-rZkL-@L55FPNi0SspBU#{VpT2T`$kl1IPQFp8E1!# zgiRG<_jT}bGG=5e3?pC6$b+-s!3OBTR5h_h9u)~^Q47mr(#;rgzXg9^#b^)+&*bEW z-yHYXD(rh)K~F$ENOqA$)eC{03b}co5i4ihG@bmHf)6%g3s^e+gk^ z)KM|XPqL$`X~BtLu)Nj}Ki3dID7&K6r$?tJ?&nq9yS4P1ev5*rX)FIno!>n0e(*mY z>47M-M|hl#Q(bS`Fcf{Bf5k0SVw>bR;Uk4sOsY^RlW3_ZZ`)Kkj+1xCf1 zYYTHu2#ck+=34UHQ#vI@8IfGbvLX#g9z(Bc5FC1aFX(!fYOnf%kl_|^$t#3-RVZ!Y z?s7F7cV2VUc|mWT)}QmOs7w7?W(C8kEH`w`Yenmyir`t{n57lDd0jH7tEY?we#1qZ zbu2XC0*Kudju7I;amH!PwYdNmAGtyzflq)r5H}i@apF=b3;1#YHscb!m-q!F!o|fh z1+8|w4X6G&l(L{~Eo2Jwx-b}3YQ~M{c`f9k2JHN4QDCMvg_2xaGY$Y(36NNQlewa? z`P+QpGkWtUOm1A7iOBiE1=TDg)i6A`5R&C(d?+x?^<&KeZk5W-zP+dvdHmbmHnt~s z^?U(;h11)+Tux?V=jb8q*M#R$ z?R6%kE1c&?dfRQp^U~}Mo}fg?7)qmeIblgR96H|n4*Z0Q>ePVVAXWg@k1vSFYwoq^ z7N=Q_MCm3;D5%XK=XBll`4&zf)x3UVx?9ns55PP03zV>E7`J73oQ+g%Z`wK({=EE( zvrvicZjK41&=)bON<&+X7F1eo+KVE`afsK%j%;V8SN!jR9!+u#B^a6%dk+Nh;yMLtl8=B2f8J_Dp)t@N` zb&5HqerJWL^BC)tJQ+N&M{P?B=nw(IW+A8Eh|Nt_B_vZY)=5$QWYSber&X#+PTT2&WDUHof$_=Qkmr*pj z9EVY~bT=z^*@kb%k! zyw;KPSP{k70$NZ?sh}XDtzk7W79na^-vfaM@(8ItZ)^f1A-4Kio?1_ZAzWBxIWbKA zukV{_TDKWDiCKbFB@8c^LrXvx@VlY2mDN9O68i3)r={0_F&ch3oPCLO9nJrXXwOXJ zdGa)1jbV1m!HQ4$yi%+-J{XNp&u2pyodwgoXcpeiF296Bzk3MiEIPloTa&w+Aaon- z=g%87*N@t;;#W<5WPPs|C}SkCw;OXo^D1EtZ+y0)eahb>RT7iED5fDIR4Qf%c({vR z9}-3KoaMv4>*>uTSZy}Xv*7CVV;J4d!e}xLuV=IIa55S>4Hf->6@JGpF6;p1`LNI|ziLBAxoK;J0IKsUFvILBHcIR!2< zc@N``#f?mij>-y&W%-#Y3W-U@`8lN}sR{*&B^e4uscET2sd>q%#azXyDGIuo3hKrB z@$qh+KCbccFovI_FOWA`gvC?{YK4Ncn~$S=u&u7Y(d1YbuV9En^ovXKi&Ek406Cc} zCr?4Q7(*r}GYN!~^@{Vc>C(?hNtwKi#Z@%P09{%^lM4V{H(_wFc6b4$RnczZMihOn zzv8ZmMEfu{5C|a=TM+~aT7n}?q}?{HH6C9Z7c;gz<1SQue8<=(K)ah%v$c8?v?NP%^suOM$f-)Fb_KoYO>)$)!HVKO;4~mW2dgX;FkOWM*PRy3uA|gRoBJfUorH&*fo5oakwv2Ra#2t+BJ zh6!QuI*B=QDf&$y8z0_b{iy~l=6)Dt>CtWbTkf9iFL%~wXFMI;+x_~`nvEy-j{Pv2 zPW$iCqOP4H=ocsd!*JMV3?3|dvHzyOvHeroz|2}q9!K_K@c7ilwfBM9C$6=&4T~UbG)Rf?&!H zDa?Q|@}~k1V{WJ^5a_8!pe}a%3=qrRd$ijHd(;Caa>vcW$aDNKQbV8yP2E{l*Q>%p zap(cpE_xn%PPye!km*(_usS{+AjgzSbnc$V_T-lmn%nvZN-Ar0 zxk=(kgx{4BsVQE5&VNUWNm5On?mp|QwBi4DrihnFP%5sZ8&5u05pa~z=OLyNxyUd- zPF1gJd?BH72@%p&5oABY2MAJ3fXv5-bU!@T*Yt;b_D<=6a+xvB)Uv^oNbcLN&_(v$ElW9gMtUekAseFp@{Cr+LM+dMf}3riXSHx z*-f+E*ftxIEUh4T^59W&^9?-v3ciI;;mNDJg0-lp{3pN6%zuVFOuUYbXBV;3fuwlN zU9%pipI7n&u^XxzH|SxP@jRkE5l9V3mD9a)CKn$Y<~=oc7s1SbuwSQOk+#E|`0F9+ zv>Hr;B>?M=h-lGj^04EyXbDK;&n03WoP$LH6XFn`VnuZ*;IahTryOj+OM{>U9z%!{ zKY&a&n}yu!283KVq{VpCbQ5fHw{`}HQDIO)C<#@zZD(HAhc^==-^6?*=BIv5j~(UT z=1pa2s)Qm5HYNf0STmFqF3{*!y|%Nzdv&t6U9Fa5{-X{n2iyC#oqAcz&^#py`W4>5pn&l8Z?cDU(hWs(qhbrhQ;q(Y6OV08N#S!q_&lahwO%HRNhX$Mvm&wu~$7 zwA+@_k_ppD@gcWp-cs}VpMJP29U-Vx-}@T;38s)K#ncYqUO>^Z65CDC1=6%Z3#1nqd1$e_5GZP7v6e`Jq#C8j$Cr}j zG;)*OqWdI?nseryxp4f5TBi)sSvn(WZLd?+&{RmuY!L+GKjHlK<=GpUA1;=d(zU{=UA_>O{8V2dyeN4ra=f)8y^@vkSi?gAQWjjV40!vd+*>ehlit4@|%{+&9*A`xY%|kEc(C^c|H? z!{RQU{yITbB^4`6#ebWjmRCY%`|!Pq=}LP$nBADPLqBMINYfdRFL3bw#*AQEu?k6yhG=m(f*HzYlFFHb_#cc^8fPs8*6(Jn#GLQ0MA+BxB=`;>@-Y*TEXkK(ERQ9pq^18}8ADPGN&5uWp4~lXZ^dIQm54d6*)?P* z^3fJcZ2KW5(ldQj_p{ez{ez}p8vpc z%pHjpaV37JnibPB6^Tvv=QP@$Cm zoIF9Rhz2BdQ()m$U>&((vLJJwL5;Kobj+%-hLKJ*&jd`A19;P^{_X( zxf$KwO|QC>{>7dC8V|3#v*GBr@S@8>aM~|G_fWbWPewfmd>eB91!LWRK++>IXOM1% zuww8PVzA@%pw3@?kZPAu^CoE(*OvgB4VLTf4<52KKByA^HJluVR+}g@aD9xnJ z>%`~fiW=nZsAwUR{Z(Uu%%Gv7{HcnP3Hl@QV}EdjA)A74nf9|^o@dYksj=}qY^qXQ zxW9h9o%Nn~*E<1qF56>rfQEz@Ol2*w^G{%(WU5}VCH@cEXDu?TP^Vj{w^|CRfmA@P zv+Le>uBO1ndCik4d;x+$IcGda7nrRp_%;QbqXPf5K7~}e5O`ifr`zqqWiWwSRg5pC z%3#+LOj&D=#`pb>=OP3`jMcIt?PIA>Su+cPG$|Y=U|!Dtl&oTw=Pj4h_#B-<0YpO2 ztT&5h^7YFrxb6WjRVuSuBP6vf1YvbUr81Tk1!;Hmlzf9ZGP+@OjgHz7QfW+OGy5}~ zy-Y%cG%P8Q2&_;ERQ!opz02;a_iDcQaDDT6M&9owvmq&@svD9c6R3@o#*12@*RBPS z?{N9){^4$ZE^}w#TaFcI`5fGjv)lZIEy=xpi5ey8AX z({H@rk^V`g;1h!mc${nHXkwqBQJ-RLWRzx>lwy!*WRPl>oSKx9mSSvSk!EI@YH5*d zoMLEUoRpekZfTU9W@2t=oNSS3o|h^=;i`FRFYF{t6yA_Uz7^60V)DgGntQBc5(!> z7R0np<|1~mZcQ!#;vit(=@W$-c${nHSj|2`!#>T($T-Ou2og64NQ_!lZ+En5{(QjP0iDiQw-D6k_}QPrpr2(6y>MqlwmT=tB5|Nm*H0LB+sIAuY2a zGcR4Cv_Ju_IgQC}@+KyAglP|$)DRqAX1U1`%vuP6PUa$R7)L>q3jhMMFO-vkQ61cmPvx75V!EhSF-c46So&h zyPDmd*`3Y-ab8}o$t4WOn`zpA9G*j7B2KlcXOHXflj*9!JOHD2jQ;SVBeIc7o~b<_b#h%?Tm7H({abP}_o- znvv$46h_#5^TbIQg`V25_=AuW9&jy|2#KZ9*2C@D-DTR_PrSDS3cBs<DpfoJcMNapYzumHk2<)t8vgxbK*Q}Crw z5bowrA(xFdUTO$Boep&SCr~Rx`CO_3F0Q}9x+yqaTP|D}h5>4J0~kARrNLY;j8;N< zmqvh>Igm_0s!G$$?b+t;978=X+c6Ej{ga%?088k()!G-XT>aZIs~-G7AGlVzENUyD zl8n4Y&ho9u3+LTdoaybqO`EG``?;({DAl@jJ8r>S@mp1_mQ}X1ytS0s`Tgwk-FX_| zye-7WHVu||K~35{G>_R)O4gOlsY!quJ@85hKcUkn^;_3&$xfzU&Mv;D-KP;Sd3e}l zf|nG&R~lPUNauwOP-`y0zo2`4JG+^@RUnn~w5r}~*e!d;y)AFNwQ*0b?PeS8rAw#; zoo~*12nSGDVF26dvwvZawj=Zxw)9U0?i!0Oc${sH%SyvQ7=>xGX$SQU3PURvg=CU+ zGNxX@BDEHain?$ilw>Y(Y?=v4ip7m97w#;1gKpgW6269S;Z{qbE$H$;=R4;=FQt#t zTm6U#$Hcg4`VDM*Shyah*fVWGo4!j3^|^3~Z8L`n%pL65J|;f5Y>Q(;8iZPtpwfHb zOr|umP$>OWF*zEdgooTqd5V~Nj6&rxWErMmx%ySR*KS?6m#98BjLb`n;0a7Vr_b>q z(5Z@q43ICQD&XT-B^kUt>-3K=&QH3X{$=at^stW7OeGvOJYB^+O4D%GN-+A(&*OCf zh65%OsK*dx!+3@+9`8fS{;EKV{JqdEFNFNN&?NsY1)Sb1SgqA+aMRp_LXKq=z)=jB zQBge5?m#)87I#+)zlvMyiwn;D4Xu*jYC9{;tCp-SnQia`Iw*_i>lA@Vc${sFO-jTt z07kJD#_3kvO2ox5izH2Jn?%8l;7$izyD-gkU0_4us#~7DICK{O+_Zr#e7Aw1|N-I?ROTZXWM355=^41S8Z$lg`?^MwM zSOe^qHI4=RsZW4Z|IGdS)?)I_XCB-Ad%o_Uy#28myvr#TowL$brr-8wqapr$#6ZRen^b=9_I|LDW9diA^Di@`kj1jr<8S+$1(c$}?QTXW(z6n?IMh1M`b z=!`6k0Yfr$CYvi$8Zso)ZrgMiS&~5;V|y(-AzAjnSMmigx$KtmWLrAlcg~T{&6N*G z#6iSR(`iB{5l>FAKo0j27Bfw&`~uF;Zci?OYq{Nq+37S*;#xi1WDUF1Z8chMqwREi zw1sV#m_5^^lw#J#J!~`Da@Zs1;;eNN;Anq^yczxIDE@36@oQ+qXq4+7n76G)%oCJ zQaTLD9fZsm!b2W+IxQs4%B)(S%Qm$3Cabi&yt3hf^UTAhQnFT|zop_m9`VKFG1~(X zNg{6#G>r1t;o3@mOC1D33s%i*;RFAxh}{?eIG^ zX|8RO{3tL>E^8O4d=#lr-^FJ6@Sf**N7Y%-%W$0s{*DxRxbKM0<9k=#X+ZA;&LX(J z3fkf6L_){M<3F>YEr?caXA3;~K|0k9k>hlV3S z=;pV^UGO)63?M?V93zlyyGaQCIRf#F`M@Zz9|4z36UZz8dZkhU)y5%6{1B6S?oYuL zUjPv#5n;kG3|*50iS$*(5f9UmAn@h1Ao?b_(|&>r7pw*x@!mL7)<%NxN$JYRgjCPU z&us31`2h$uPiQ3E)RV(rlSJF9M4UK|(iJ4J0?5KZ#fCz)FOERDAMVc>6*Oi?OPL!0?0v4EK?#e zTfVJgSp!*2ClPxESp6zu%KQf-hkbh$R{{7T;1pnAon^#?;DMj+Cqmh%?DxGj04%{Y zVj-}brY+xN#@2f+#@GxO23jt+ve2v)Fk*trq*uSg#c+UF9&&$Ko0dHNtlW>pb`I_GN^~vek^-aIF zRe{$PnfYY>A+;49W~1O1C9GDk$u^t5fTE{PR8Q5l!PQA$hl3)fa7THZEZ~e`D(CH@ zdI31db7?D8b!~k1$9QmiCRtpUd+PLKnrm2tKYc3T8P96xVmSJEJe<5OFg$%-u{yc6S~%P;;&LCr2VGNnybe2< zJG-j+X$?>7DSVXwWf{0%U3Z6Uk8+{f4Wt2qQ(4wai&IkmCSfA8u`CiZ5pSpwvJ}dE zhGND%Z^M{8&t=V5v7BamzEp&(E|z!IubCI$mL)fq(;_Dfg-=8o!xoH8eh{dB;Q;&$ zs#n+J(FypyZ*C_6_ob-kZKlB%D3^HAfMzV~c5V=5sidmu49I`>`>cQ-fFj|e^P<&) z@`cs4e*r!KRb1*GiDh`4ZIH`K!%z^0u?W_v=t|ruLsJyd-O zOcFC{(llpgJ84p3QqJ31P6Za+Owbg;ER$fF*)(GUr`s>q;eF4u{eTR8Hbs4R%-peq zh(|m2BS#(=J_?BCqq|b0S*hK&5-p>Z)C1z_)>KiiU>5l%ggz~y8~UOvU)MflcYRmB zN6zF^Bz`{VG1~)e2q+i~QHp4x>k=qit;wHgbz_lNH;;?jL;#wrzDt;o{sSrsryUn! zs;WZVxBy{KY{!DpaB-fDY?bBL_CY1ox~|6*;&*_$jF$vZRc$>D#aqPq+i7ne{*~E`u zQa)A~>Yi*}pL6a#=em7`jg^{VKlV{vnP0Ko;8>KHn9On7pI~yox}5^)`#ny1y*I~?f;sx9v1YXFau+PIr2_}n&Ib_x{#pvig75gfh(Vt^?nG-J4STPgT90-LcC+|&99xTs^G znS@rm-G)wY2vw;FU5he3#0N%Jnlj_MZp*1d1cZ#$LZNy&N|vm&X6ymlaKMRtE^|o| zgD*#a+KG!z)21HpQYXU_KmxjE`~B{Ixw`wj7`q>~hwDDCzs9#+nAiDok+WA+rDdu~ zVTO>4_|WEuWyYR9U1p2YSd!;MDCLfGESyo!jK!76lUE78_-VEe=qGf(JT4w?8-;V) zUj0ABJ?flX?{v2{F7<8zP{d}CGqT?4yn`!9HB*4}tHc$|%s zU2obj6o#*tUvUaZY!{A85-4SBB}9YD#zzHoSCf$KI3FX}QS5YVga5vSlulWp+D#() zJbBM~U!T-3u+lQ+*rFDqnfgiP7Sl*zqC&%{-@?#c4(_4L9BOr_?@-6GthU8lwr|@O zWo>SEyPRDT+Ge)n*q-Is*Vly6&Q+Uty4F?Kvz?Y-D8X<(n?R^_qIwtykq$FzGP%Jb zmf?m7fxjy$aLQv&6j#`jKk^Fk@RMz}TBdacVU0tyj*6>7ao0Qres$-I z(QLZkm3dU5!KDAiU5%!TWq&+g4IlHzXgU}_-nn<9`F?k9^k?s-*6sf}#FbfdWB*vo81GJzPML@*@A?al6hnhY!Xd6tGPD;2EVpc$`g)yGq1B z6oyH*SPfX{6O1T|!sNEO&FTswtj&s`g%&oG$;pL{lQ1*7rIm$Xq2v{O1$!UE(zmeH zxI$8X=l{<4xbiuC*?kC777%7TK@>6K`4RO)hzWIqz+;5QbQHRbCDe0mYP)gjc`ivI zaBK)6Onl-PTSo{@FV4?Uu2e0@mQ~L)R`ImR%v1m*Am^&8%}QjJfD)(#*(!MH46$vx z#B^Ujo|}cXvDqyLh$YBUx3x8*xH~s*+RW(Tx8|>R_+M)db<~%*?wL2n>XPmRpsXxn ztHa-|;8M}D#4`UIn|FP?U-;5@CLJP-7lq1k!4(KjOWeM+m6Pf0`1EpuuXxptt$q(e z78P%<2mAft(?G2Cf_ugfM8br&=nXVz23yqz`!CUDa|-BE!n^%#UwQ) z*&;PLE!o&4)g(1B#n95s(%jg<*u==vIN8$DJTWCP#VF0pIL*M&+{`F3)sRcsPC>yf z$lq5Xqokyu*h*i&xG*QPBvmiJC|%#kz{nWN*G()f$xqJDOVc$rF*X1Ky^_Qtz4VF4 z+9sDX3QK_1SSuu_DCn2u7U&x%>O!Pv)6_+IDa7})~q|5@+JUN_M8>Xg{xtIfNpn@hB05Ql~Furwo z0i{)4Z|X)6eXf7SToZ}*VQoG`NW`rOg&R}?5fJINO>3>!=Aq^V{vPm zMJ|J*G@a-h4ExujoZ zcW)0@>x6}rds&nEhZmc~{QOQ?6sPX_uT4A*l@59WduY zNDEx}4G4nC7-c@1s;4xD-|s;B$iX;0zXLZ=%`!g%y;7;bRqYmN7*G*#50o|_BM`n} z7R>h< zjlWonhv8(>yUasXJA3zEALv&n05BNz7=wq|VwwNa&+yN$|6J5Loh`?Y!^N`y_|)6J zJ{pwW?7zvZ0VEJxA#r^WmtK=F;OU0=NFC)*GvF*t9aIC58Ao}oTKQnUUwEvzlrD7D zrwT9Hcb`EprIi$>#~ArbK?V^wlu-maDm_%iE?*A9-(4nl=jB)jB;=Nz2BBlQL8yG8 zysI*m(e-MtsyJlEwT+I0j#XSa1Z1*R-L8&bd&n`N60Q5^(PI2-fvtu$MAbtosE1bO zy97nnK^Z7_&w5qnC?f$^a~y_Q%h}`u`4g_DPxILT&ct@m-4}jDO(E!bs>Ga3tm({p zUd(&j-TUW!R|Vq|#%S1IKF^2B#Qpj3C)Hl=@K>x0@eEUuTf&~rYOcch@O<3nt7-Rs z)DL4`a+paXj!5`J(Vm#%<;Uz#WbYPL)amWBx(d?&Z)K|S0tpJnpXS5S_-nZX-Yo0$ zU8a`uewDdVqAFIFg_ueoLZqwxKKmX%ftO$mWIig_d^wG8;Nb`DAGOt9H*JMHc$~Y( zcaLv_1v_KWWJ`8c03)0PGq_H8oPASkZ`v>v{k;5&+kn($Ll z>>)XRBpxBLY-goYfBX_2r7+r0j(yKL_i=7oC)n6hbKFh3D5=a-QZ8{K3rtMrIIS;m zbvYZ2K}4kAVSd!>g+b^O9`-0BgQ!2CJ-Gw^0?%aeG#X)BACzLEX(s=0Ohktyq9ekHg;5gJiiuy# z_eB&9M92h7NS}2B>RF<_^zSMIz{M2SI%rWQXrr-(IEGt56<<0IU#e1DxWAZ<WcMya3`FVGFmEqY1S{6d4mFBOR*Eh5A#dHkA6?J=C zQHRH<2lLnlb`x2Z)?T@|qrng7142skx}kVu?V&kq45cyMeDbB$1W}Qb)Wj~D1h7H6 zuj4t}0``LiNpij~y{ZN+Dw7|!kyJ8g2R%5=eggUp?YsMj$p|c^hcsE#`gwjp+->La zMw>-;sA>e?gW&&Wo$>YRiBhjC21RTJIVbb=Mtp=5NHtf0^wstccq;{ba{d9ys)w1s zLwKBpQ_F7KFc7@+D>jmgN<}2a=`FSc^w6NU_Rw2m7!7>hxUQBhG3+lL%QH%xa zdsxv~-(tyNJbwE6{eh%hGT|G9v2_hsWqVITAJ9=QvwktV4wBS-0%{hk$7v3~L7M=~ zv*d#fHTxu!>kT-Z<|8oZypeD-g1@BKkG?xs!Wa~4_pdG?2lWhI$MAaaTl%>O{%AUE zICWTb-ik`_y8l>d&!|JbR}oDixb*9@tg_ns8}bOrAUi7M2}~yaqCYrH|9{WV_;H1> z2=`n6;`%mT0%=hQH5p`aWBh?X8yt$^e%a*FJrbhlhI-j?t_;+kiv~1xZA{cAL%V~= z6dj}#%EPhj&~2{Hz{kOROV|$T9pO`*bL4H0Z@I)N&)O}pqe)Y-mhM%<~##PB~RB6UP z6-Y%TR*dIKk_3og17ld@xj&i^7!DtAzf4fbI4NyLVW>^UL{f~A0|pglyzK|`OCSYS zuK}xk{V?mm50}?%EZe~=?bh@o4=%Tx{aI%KiW;jp^ak(~`TTX=rs_+Ge$@elcJ}1@ zWu#L>^$hM~Q0}^bhPJoIv{hD@X~`D;C5aYIR2wd!jx4jdWZZ7{JJ3N%x*xBxLJttM z+DA*B07fG}@a@6ukC?ZTA3%=ZH&yOGOzyAmzKwRiIKXoZ)WP{5P2@0?qgY973OIj*9KF#$T4rDIH$pUEyb{g1oecZ=R)grd z@osdg1Su$4c@mdG!NRgKgSwlN;+3uyX{yI+vc1@@#q-@dSjY%V8d92H0YC_hXUxg$ z>WL+2O9<6^X-g+nB};0U;OG}!VXBRfEWn~Uc|B9!<|3v# zMy4dg$^V%pK~m~0DnKd2$=jGjCx@`q^ClT8=ogpd7p3Y0wNHM_A_-EG4*2iq zBqd?nvf@77my;?v_RKtfJgE>cOD4oX$8@Av(lZvp(--^Z11 zX*C5WF(#h`L2Pp0!unFp0=rg5>y}P!suOZB7?#$I^@efOW5ZDtlW25AMhEc#$A?Gz zqr(C1AK@X6akL-xkNN}B8<40Mk9&+oqw#Psj-$g0@cDR)3%jnnV)-mVvhuM`B&E?t zk=#2V`=0fZ;q=8BOKMTUQ+6Tp!h9hn(bnqE>Kwr7KGuHq4HplTJ_mD)l%vwlnntdq zkx`)^BDr`DA}(r`zn0IZis!~cyYAAm22x(v0@j(#<&4dH25YXpDu}#Vi9m*VJrciKrVyN zmP5=_^tte>2))oT3D;nMIZ*~=Y!jBHJlX>xfionK$T@K1YS2ZV%aW~;R%n2xmQ4es zvWmnEjm(YTp2t!_3|zdH(pQ_F-P!wsSY*WJzfX^WNtm2KH!i;ft|OJ|v$T3``MJpK zDU#`*a(!3jdG%n~_)e{)qo4 zVT9AO%U{oLrrz~ILuNTVCMyW9jFuX0?I&o*U)iMVpyqaFgC%jNTaX>tu3L_$&Y-)K z&)F_iLE3F#%0b>5bl~jbkIx?`B^pg?kJ#~3XaqYxP~88#GPS+D0&M;dRKxqblg0pP zBEjiw|2U2goK)AYnBf9xja%wfyy~_WI>9n?E1pYkSt%sDP(|skiJSOz{ac*_GCXn@f-njR~{h7NB$pl&yD5t!*e( zLFn|LMlJS$E;rZ0YmLmsye!s0%NYa$n)b!B3+?3P>&QZa*G>3UgKN&hTA{`u6hhIf zonRQt4YIa1U>p5$kRo$h%ch0>F6|EnG41U4Nhj_nob-4UCoySv*q}4mkNe$rl*jGQ zbi)_;wR1U&Zm&_Y+BkTD<-Q5h&4^GfJJ}Fsnx0*ZPSfb^3`E#DXsep>holKU4A#f4@@V>$FJ) zfrUT(7;j^R3RlK!`1R4=YiBYX`F)j^X*9M;#KC#lJ^ggwZ zHl2}qN@pyUTn*!BKk0u|CDg0trJ^ZzpQ5uOeb8oVhic6RiwIg_?QTOk9ba9ZU7V-4 zKTb!ZVe`-RxTzff8hCs*Iy%1{HiN4Of|E2IUEJMag`8fVTpV4d>9F%PC_THnN$-ws z&QI@#9{yP`2)H7d)3=>`(p zeU4|Zu9-!``~SxjNop#rHe*hRC>akJWCB1zydb zoULxLb1Lx(<%Nz9=)IFlm3az=Q10uI2|wQfKWwEI5T5|7<|qCI z**c`FO_<$Zl^X5dp2B3bNlNvgCMJ>_Z-Fk{?sg#@cay`9N)!f^!WdO5wJz*hw% zCsVuj{0;trvEc;-<_s1cS^0wRl}fW&y>eUs1BggcXT6^Sc$}qIYg6OK68+Avm^Ds$ zmt`dDVM%7osSq#AQpE)d$W5g};u_72ECs!y8DVcQ|NZtze#?ffn-7@L^yyZg>7MS^ zGYYt*VOhk-D0%$Mi|C2SC`<1o8FTaC7zwp7>V=Fb9;anO9{KXwkJ3^`u~-L;DYY>@ zMo}txk#H6f$#GJO7`>bv9K>86ASAM~pd3q5_#}=osGz~p7xWAWgbq=hQ4)hdXW1l; zGs1)pNNj7aW^16U`Tv-oDy-5PpjIelE>3hkkhun)Xjw7V;lI*aX*O-NY9k^fX3tS} z`X+Y_>M&}NF0t)CcTDD*#PSTU7ckQ6bq&WOp5t~+#!1&T%pUid#i`ZrJEm6~eEGD4 zXp(;~(If{aEzPW)oc^vlb2gT%2cv$vOMk_W|iGF4D)LNs2bI+;u~g{;V~ zRGQiiju1K5@cqE2eZ~UIbD7mQ`YiA)!=ubK`X+T;-?U8F^#fv1-!dVtUDvZMMhyQI zj^CTLfW%$R(~Qc;ag*VKU>VCOFF1_^+`^5xHjOlha>ucquI2Vzvu6a%BUaD!Y|nHZ zyYCX4x_#dbJm0KjoUtCI-CiGHUckA&h5yZRFejLjgsZptStf-nNRCZnukL-G z&;9btC}tOFUdkIHLjfwkSNjOH+Rt@e(efgbnO}-;el~s4p_sHbAZrz8k91Lg_AA$3 zt;zqG9~&*AT!L4f&Rk7#W>HZ)j$!o)QMP)TqYe>?BO(wHA(9!K{>helCFbH2ic^FI z+Rs&2Cgx~egiAAgnrDSXH>dYs2d(z|e8N8HbJ$5+?Y5S#(1Js8MH7fZ&I^HLNF-9n zg&>KZqO26?{OT8UJ{%&*nK73r5Ly&S%Qt;4f8tCa~FW~g)c?)5-*(2q-1ozj1$o#+2XJ!V_le99?O9kjg&55m93 z$L;y~!*%$n1r}cOzcR7s)+m3$bRCVkv4^ET+BDptwrP3ex&jll<>WrQYn*AAWDI?r zuCv*2VE0MwxKj(<_N6M*oY2SB1*xAEiN?_KvXxv_*Hdi)8t3jBibu+sVtG@XO# z+nyzPgj`Sl9Dx%s}S%YPk#afhZ=*$gcz#ZwU zhaI&3e0cvLjvhV$a`s@nQH8hI{Rb*&5XJlmUb0+ozoP|52W~qyx+}os(E3NX9A)O02REB zK(0-_e&3>o>k$Jua?<0b<-k~NFc`O7%d@*?V0D{b>NE7vzPdE;ZeS(U<(;AVGw_uO ziBhe~g5`P#(?bRxrW}1e{qNc6>-F9JXn1{lW+Gz-l+?9b9oDL+E_P0~s|TSY`ZNm4 zl#XEVNokUgCRy<)25I&R6fzVB!Z(nRmgA9X-1U#(atCy*(r7wW_=2P?OGdIV)^RG8 zm+o(bj1n61k%|`JQ$F1g4zI7iT%3>YzMfrP4mxkOqIJ#xLj}4t6zt*6%|O-a%g+Po z0vqxw=?3`PoG(XTu5U;8r?=;4_tow?7~@GK!^J4FoGW%=QfNR>s{kr_fI3_3qNzpHJX{4jmSMGix9rBWA_ zmzU0#E>DRca~wmVE#a`mfF8qz-vY5nRH)@}zDEx4_`4)5ftRlBGWhUFNQ?vc;E-$k zz=kuNXD}e{vj?N_-Zzc2WS<|);{S?Rea!ARo|G(zU*jpnK4BV*{c4d+wuGvhA}H}A z$F9pT>{SV}vAL`xm2|yBm?%xtwcECB+qP}n-Mekuw$0tPZQHhO8~g9){RU@rs%AB+ zsLCsIWn`>7%&!jxWRKtI%M96DR|iQgcLrbf(H>M?pg5hs2(tW22vXQ6PL33-WV*y} z=i2;KsFjmp{8OCWL$BIL5K65~b*<>X8a?9E{}3ik-lr2`4tF4Acrn=vk6Feh zDhQ;nRv_uACqp<%jFa_1P}o+xa|Jem85$N)fTf*hpeE#h2 z8)(ETT3Q(@CyWV~vPV*T-{PEQi;&Lh&5H*%u<&>KHV2yT%wpnR+cQ2pf>|Fi~@svj*%v6~4%;wWL_2otT zmm!MAs&M+$Gh%zq#&*sS75lSjw();jVoDO~qbJMmF&0cmb+ZZ>s}JMx?)|NbjN0Nl zV*vF8bc?`L1_x>XxnBihV^tTKwyA+TeE0{VcRBmO6!~1Z&^gVe7mOqxNXyR~Ik^2h zA2dSr=*&QWr|VQvfzdsNvBW;n#a7TP;i+V~(e778A1DJRfJlZOTWtl_T$fvW+SgO* zg@o`O+^H)HeJ?3TCBG+ff2rEj- zta$b6ecj>zul%ecb(;lFaLk^K7DnDUDte1i@p+rd z!XSfcFKp&@+k#%z3|G^*Io-Ko$f6BQDF!ywfu{8ai!2LHg_f!sW!-S4BpHk@s#no+ z9AqVpWFr1EbdYX2q?GF!55HP3FU}*-)|gzdKA_e=amKhKjX?w)E;Bw8O)yj(A` z0TnB(d zV?V%8zp?ue?i=%71}YWV3+CdOveh-4%uPzgJuIjd*;OkuTbSnm@&9aRF^u~tyBKjU zC={_Ih#938MG{kzl1Y^Ze;~eLI|;GK{}D1G`imc#DA94Xt(`y*UU@r2O4OVW3!G4@DeaBzY*fqf!AI-NY6hp*?}mExTI`< zsVU*c#dI=M_BUfTih({YbSk;A#r%ONt#5aRrIVdiD2uA9^rm*d@+L0E4cF`Z*};Yd z!jYjyo){k!)wBJxAJWVX1M<=%d<#7*Zy%F5%y2D)!SO?flUL)Q+{5CLW`fa75gEl} zJ(ppjpU0!iqy1EG{bR_d5tO~D-LDj>ICpl7UfZtSY4iB)J1(wfmji|`roTChJ&&56 z!FktC|H`ZM)9~|_JWkJ*x0QJVXQf~&>nosK$IjV77BkG%)y+FCsAVcn8+qzjw~*_Q zK>6`gcg};A^+He2^kxB~tKAqfP@u&lzd!Q2;;wjf8-w=;eu133t6BQLQ@sC6!k?;d zDUxiIOG-fHquevpyHqcwR9x9)QH{DH!T%9&5pHz(dga8IwE&-ty7rpoeLdXb5tMe$_~XK0^e9jsY$iVRTFLecX>ac9OTBhL0Wqo)oM za~v4iu#EY}M%8A-ELbAW7{l}FA3@Ak7(^&!*9?ZUe&Fj*RCAfB>qL|> zY)~e0{sW#2a#D!-QtTig&FR50bUI z|EyPm8N1d7C^s$8r{D~7OQ6t})8)Hm^CtdU9p$JbdiB3ea(Y)c)TQcd{%d!j?XaK4yGX;XY-AL( z=QrU5aQRkWk(@+nVVr&$rm$11Qx(??zD{{Cp?g4ziFU3&R#G#I%BH%*`LBLPt;pSU zuGrKGmR_h>M^$gLts^kp){QlC+e``bjz5|#>1WcRO=Q$+2Jy&3tYFxrTJaii9X!)o zbs<9#dzFQ3Ft=R3xAabT- z^{{r$=NKyuID>@AMCmxqsiBBgJTmX#6t>n&;bTjG5g$ROFUk(oPf|mxt6>= zeFIefl$M~51fD_Ii#1z&7qxi5o+Hr~CCY zl@~|m7Rc{uxcA3v$t#$1Qrd=Sam{Z>||ohL>_Zk^A8 zY3r^hGPRls=RTTx}eLR4OO+Yf~FLQzJOUHdsQtlVmQp#Zh zNEHSu+x!LO4%n>W<5VDl{Et7+2=7l$=Qz>)^vO8sv2vJ1vbG4cJ^lJ5Y6t@rHb`Vz zO#7LepJyl_$px9VORFljqVM+N?e^lVc_^}1g4hmtllR&F*tadI?cQYs>*#eMJOvp% z?MFr%8~f{G@w0!_t@5fo@@f=6!K%D{(@?AxX}Wd^BLm3YR*SY--w5zlq_)9iKcfG2 zwB%bd4UnIci}TU`5kx+R1TnT#1gb3U>>&kfKcjiJ|xKqZ7Mk(P9ZM4W&y6D83=Q zHe+lQ@!2IoCi4mE(@jA0)sVYkGrw-UaH-i_myIU#XH|&JR!jBEQ&$YXuciJJUyl6! z5?@}6DeY*F^Bw4qJ0Ev%-OS9s{3UTum$kfKF%0{vcny5T6<1`&NNZ|(E*gkrwustT zbG3eZq?z^X!>LS{#f4|=RhR`+OQI-DvY(PLp-LscS*%^4Y?49di2R~K^M3z!Gn6qk z8QT|eHb$VI8=*&f*HOIq*yOH-ch^^fs5Iq}{?vr)Q7ELut~tYccmxi+kcuE&ZcV~< z@-7sLUWi~afe!(t)M?#B7b-mz76d<1s)~>?_|H^MDdIFH3Vq;`lfu~sJOylmjrI!= zF}3V3<$}Ppo17&okQ57gkdy;dLp54EK*fqjYifDUtQH<#Yl90GJ%2)!i8YsdiZe8q{XgOX9ToQ#v@S%uJBvX0WIfxD<`2J53;4d!SOBe(o&R- z7QsGtUo94+GnVceT ztOS;^t*+KiIbdS?vAmStpeMr^mP+8-Srx^2O)IF<8$cIzxT6%dN(!`9s#OCW_WL0KS zIf1k|aU>G(|8H6j^(%S?!x?5`{dRdNRGRazZDsCiC<7bc}ard+oKdaoRfX z7d2*$8vu!}zPV7vVpJb8PS{v{h>oG7X`fhEXl@OC)fge}-k;Bohi;c{TLFL0FUVT{ z_i-R$!o~dYfoKGFc|Ak0>01JJ&8~8dW|UDDJ7ZC%X%||*iU1geAE9vn@F*lK)uI-1 zl5~PHS*9SCNi5xmif^&%TB`!di%q*`7uh7wKywM+0cY|*$l=^)p0CV-D65HrYK?W?&3nuqqQU?m zFkrISjeD4p40n-GE!F2+%}0t*JrZQCydl@wAAOKd53|W?w!I?Jrkx-?5Y@peen)WV z?4Q!5tqTg=qbHrUoz=Ceq_WBsiziAUH*qJu%zQX;%KE>B$ZaPuGPnqzNq2B!VSARU zVGTOsFheA{-L3etX8(}$)g8Kfp5l5dsZ4}y`l%N0ZQON<&idWCkR>| z+S0g$*3@?T{ekrg`OBFqMk7H5e_V^y7g9s?Oq#;-_Pu5eFxKXFaV$|6bR)?=Ai_9R zu-O=fYd}_06}XNvjAMm_Ld%7HMNnSHSw~%oEUf0tVNf=9VfI}&#Th|?RXA^jqUzvD zY+p(i2hW_QV#Mr3V`0EsO^;c^rr4jG2+8`!fH?@2$#J%&r+2l=3VdF|XauHi*z&0- z$B#;n6o%a}Q8dR5zWMgk=;+7TAHERz)F=Z+yv^X3iE@(1sA4$11oMcGD2x%8-X;opNngJxL3+_s)f&&8zOXP?!m&UXs@D1}p^9xWp zG#M<6I6{zRF#a`AL{#CEOjxiBHpa(MRUtkylqNHfio#9bFmtnTv}LwIsSvutS^#za z<)S;PcR9GT)gg4ji~0S-RB&V?oaMRo9#2X*&=1?aD54fnQq(x3?3DKq+;)6Wx2rou zXc1VJ+gON?cUy8{N{};Gg~uKSM!FV&HRx^&%iQ(uE;pMG!P$vp9+jx6P2C8rh_!cW z4PS6PUV!N;C3y^lKnOxN*0Z!G981*y9EmzTLI4~g9qlD@W9Bxj;3)}Em^z6erhI!&# zrLm6d`r(tcTc1m#F37=08RPvnD$#2%X7{d&m{N_n?9iK#+!tMh0vfinSZAm}rCgmV zhm{A2UhK>&NuoOS3m_b+eEGk#5ALpy0tjRi7a$7ps>tl-Ye5RD6{8zM^cF}+J=-|X z<*WxjBM9!3J@xT+yY}zb~B6I-M5IhJqnztMt>Vh#BKb(g?GbCtyj2j@M%M*Fpg_5lUFV(3QzfU z7A#}H4$cq$c%gU3J<52&Ux!nItSvGlM(8q8Q3W&`M16S$I=d2fio5wTDA9BvD1;ip z0;$qLJwKBg*^2?UOuPW6h&-a21TV1L9-D#qaEw+L=I7(%PxM#io5RcF>&pYcpcIEv znalZai$u0Q#p-Dmx#|EmzVMC{cWic&CFS7ArXVYkGFOLgxWBw(kocn2aHxD;ejfLx zEZ#2nK!=2)lkJe6ViHtq@~Z=3lH*W?=ppbciv66uUq9x4nnQdKZ|Po>@^8$c2K{U9 z#5XyFII2Q&y{_|G?5Hy{F;Y5ZA`&(ydRdSlMY4VdLbYT;jx|=x${Y7r&3G{f=JE8O z(sKn4204W#s@nxg8FYjD?|TU3rL&EK+UJ>fASBeE_>hC_O-Q_$y~yIQp0)h+iGuhO zrb*LyRgF{NGfV|l`Mz{5a-GO8^wiHdTNj*JWP734!WA)pPK*YYSGt$K??+=?&w0`A zQ?hA#;;E}k6DX>ob=Y8U0t=R`T&JT=kGj+6Y+fvzA5Z&JJ9T(>KB0xQh8RvUD(HW! z{Euu8GYlw`Gt?8clCv@sGc*z_va)|!-93y_p$U}Z29DH!)Obp)t9_MBbCJ@3Feu7Z z4i)nAax>Gkk~6BZ($cfEU=;DKU`ryCqL`qiP^?jxmdVMPB;|f{^cgz+$<6Q3$^eC4 zMw-5+kwQjF4!&|0k`+RNMv|dIik4cIik5ngmW)eUe=-06aDeSu!(rO}>(it2ylZN! zyXFrrsT$azA^%svmGZTK6py`Ma(qO2h9(^B#FQk!p;^m;Un9p)PHNIXXQdDxC}b%r zsaT+ABq!(VVJW3xX=q{UU@B?JILAB>B_(hy#UNim8SDX|YeKk_o5TZ#|AT;!>-)a86USfj9(~P@b z+~}l0WR!Y+bbD>YnMX3a<&yV{w5A`}R@k32dW$e%NgC{43v3*Z@r{#sb53~;h z%qSDw55kZ`U%ktPda&CMV8(;^rqjQ3y7FWf;m2zu48gDSK;_NA!2xCC5+sXx92oIA zB}O2Fcq44l#%o9h;QlaOzPZP~el#>#t3}z3^+}YhSBnw$U0a zYyEs?BLxZx3{5xE$jyQno|rv)FE|#07Vj7kl5q6NMJ`@Id~ivbM!$o3ehSoZFy?UQ z%$6R_jf;CPIAoW9*2m~>IpoY775y47Z?fh1^JMOZcr%(xZDzj@_LaZRjXfPNym3=I^@P=Tjv73 z!CPVnw~hSSUqwr2j3V>+V2DVS9~gpfhaJnD%nSD7AOTCO5iGOITV#~4b>bGmJyrMR z)-neOA=x7U!&AU88N27X%BK;ENicrSU zxl_36Y^8`xxa7LQAts+K00kgO7o4>~qMgh1gkU5byA_GG^d&z1L!#w`~5w_8BYUBLR!f0V%Y|J-$oeD}n@>)htf&u)!M4CuJ+( zL0;RuFfo+j6N3dq2J%z#yBB63CFkFhSO0#B+h~Yf(11| z^zZ;cHBLJ7p_r+OkOXL3&p>#r7!R(%$I3swpw>d-Quo$>!y_d7@$X@>+{bg^bl(Po zG>*Q4lJO7nx79aIBG^wA>!d@bns-zFk}?d$;l_=Db!&9;Wl<0>B0ESV75XeKjF1W zy4{#1MJ6wc3WA39#$P!wOe=Cm6$OTI*+O^HCM^*U$F>q5?6u5|>+(>WSbDmp%2I6G zG@{KZ+r3iLwhf?o9`6!JO72-B*#{mXVMLRZ@eIJMb11GBPB)}D7JvDi$C%seM^$8_ z3FKIiN5ZKS460;E8`Mav4KB|R%%;xnEtPkp!HQ;%7N2~}NSoTWhX`QIzcs@MfRK5{ zEEN*-GZGAfvvrSC@LDeS)gBJLikDfT)=2};*sTXJ#pL6u3&b+5i7Y{Fe;$Psc!koQ z#_Z${xRJwq(UP&=T7~Ug7wSGg{~Z&B%5mgsi=vE|CPsUrTrm>#E-X3_} zcKfHzJrEi|nXe~IrixcM%c_(g3UL>RhA-{w8|)9k$7wyfWOne}l4#LffgXt- z-4uQR-@6Cp^=hDi0}kiO6bx3l9B65-KsMt^QVBEF*sP#jCc3V;Z{d-eCzZq2r%f}D zm`(k4mLkX>O~_x&i|?y|VaL%d8C#w*6ss@f@OsUiHZnn_w}*WQc+)G?RZg~nNO%vO zBk~~dQN6m+01c?ROd!G<#?Zpm0A;t*N@*L?YWL9txxyD+j49L1hhjRq?T=#EJ}uVP5gGyhZOMNi?}) z|AsYO!qJ^?qZP`vF{?8lF@2R_*uDkVKJ=FP|ZAPJzeuRIAW^4>2k#f(b3w*+VZx;*?>%mGu2~m?Q(O~n|o(+%fRamaU zz-AYx8fsE5wnzDj~1e&Smzt~57*47+sq(Bw6P8UDC`Xh%^eHjmOFvOKJ$3l1`7v(4L|c?GuskLd z&Iva;XBQQdOFn7B6R!PB=g@^CiwdHvXC^zzs9vW5ehl*=IqcQ9ZMd>7cSLxXE7y{+{;>mLN}V zyn=0G2eYQ0NX)3j05o!=+7akV(2$%fW=#rhJ_o95$8NQz<93dJ4rV1eoSjZV5xU&` zjMrq*8f{b0^V=o?`;7Mm=F9D-)Hn1z65GMRKK924sDAs7`3Z%b!};}Z9^4P`>Zy3z zF=fK9j(qDeo3cmlHQKK796_9*hd^pG&AxgsVd=^bDXrOVxnEeeoIfxMUn?(9cF0~@%Ydugq?7p< zJ-8_F+naPtQc4YD8it(Z*F%)`&{Q9}b;>j*)=pmn^mC zC_U2;7_ZSnUL3scDKML2s{!Tssw+Pd7&CKHFs2@}SS*+w-}A(NgkN2MjaSt=@qfDB zkgi3t6Y+)pSJ&%awx^Tt;d2M8Xpc?}2Tyvr_3Y;OZdj(>6h^5Z8{ensSn$eG;K4oBBCrt#nK`#Min)4O)?r=$;q_Wrh61Ag>Kt%j&^; z5hil*eVogK_2qvS3lx~{sw2vO8P5K=BoILq@8BQvT+yk0(R(G2uH1R)A`;~)iY!Es zmnuB(fIGG%2WRL}$jPWeU1WKM1+;%;_`Ej#^4P)G^UHRj?!GVMf8)s8-i8a?Zf(?+ z>1Pa6Jwy_b=v6^{bNc5PE2agksUYk7`EQ@+2!-i zy{p#8bFi@JqNsA)8#!s2xyoiMeIGg3t1=jp>i)%D#_ls{cDn(8_*Kudbe?npwavFhl2Ab!mxqK}QNkVm)&S86V5ABDJT@pDgpY(J zMXIC7p|A!<88+fy@C?eoh;##_By1oS(AC6Gj_z1O?JIINy3n!nEVj-CcGYOBC!0{v zU$Q>>8T#7X@Qemadsg@Fu0a$e`v`EC);&9mrY^@$80qn7b&8$5*Q~wnowE`S89=`p z;&Tsh;kr2%GcW*eHki&H;2On$MPEF+7K5m{<3e2pS+kE9 z^#B0eNuUq=fJ3UkcBk?>Eni{2(G$;DqmpUREpkl&J_|4xo5o+KE_a2Wir*lV!$`q6 z^{@#5r2{CJP4+J}I?I}6-F%P+^7nZoDHQ<83@Bbbhf^A_bkKjQlb^-8j9}GW%Qzq!S=OKLu*;brN6` z<1cVSb@sPI3y%8w3O>E;Vv}rVM75XfLWz~bmUDCswU{h&X-q1sYGQ$lHO8v1Y!zqA zF@Ai#D(_Vw!U9VV_z<8ij=!G)xSRwI=T!qXP{2?K^1)b$+2~DT*&lA6&+gmLpPzdV z{(5~nQzYgplS?u~=4g{BmqbHY<<@7P(T>*I)-@l|KcbZZ3J174dsgkVFflzYx8cw! z53pZv`0o&eQETZA63~PTOwNlV-0K@?X`ba5D(HSZ=RY;?N|OhP)MnI3%B$HW?rC-S z83l$2i;->-xX%+NK%ABX^{C5^HpBl`mrz&5bQ77R=}&bHNoKSB@6STA)iDoqx96JK zto}B245vwLQ5X9#ry=u9lXFBWJl0gDr(-fOSh2&R`Cev;SZO43$5I54sxDnnLf7O@ zs3K1Q`oc4VG$xWr!4518aDw$ThF*is+jnI3gu*8yGw(BdDE7aW)>IJ?u{z_(lOS=l zJHuj=F^VY9U%d6z<0ctg=9*k|;&%i!66r7VFeFNO}%_WJ8$Bm&U5V zGNbXuelr!CvoU6gsEK4T$c`#$s;--%+b^u{u_UA5Y~#!A7v6q@%!i;FRkaUSuxB1iJ^6mKb-~ZyR?cZL&VbOxc{kF2 z&eu9OHr|!>@Z{n8tii*aZ4-ey9^z8u;cH`j3m?)unC&0?9OcUD{?*jx3f z+HM?70A5B3HQ27`NO?P?JIe-qub5cuYr=g0;rE3($6A;x)v-|hkeBCXles;+Ld_A+ z$D$%w@EJ*VT&%}GB^Hr?k9QPY!14u){1`vh%;6pWkS{e|UNnaf}}59?)7Xnx#k$O9vKxPZ9yK zI;*FSoY)&yJqXEBq}HdY#7}!;baVhHc8XBQ=#+Ed$!q3rB}gviYqN!Gg}x?xmMAPyy@_XbcaF)*P3n){zmoSdB0GU$Ol{x zs^*vvsgP7f$l{l8RNszw*rm?)xx?U!bxGe6T5fuCaXJWc-TOK)?xlCwFYpR8o@$J0 zM)LFSu<=@hx>{15a<1hM`cZM|Wgs7JmlPM)W`(`kv!F&9hMxEv1RMx#kfr9dU^zVD z>!8d)Tq{Ok|JQY!SAJ6fLk&pc2m}d%i=g@Gs0~zPmJH&aQaXLeKjd+qM1V-O`D)D{ zb+qNG(4Q)~TDq7{z5HUX9a@-l>EB$jcGypNO%7L+8M%NIrDgZl_HXgk?IYi7?yj7l zIDR(9JC62P>0VV!Fb#N??;;BgY*v}A)eIkuFkFj{c;hwlSsR9Bs38_YXFP3W%C!B# z`w25tpv&qyHw;DU)6l6vJ;`+$rs$Miyc_Q;zQ5^Uop(6T*kQ@&?8UijD5?fKo$x71 zZuIao%lq0RN6l*Ig~s??;4DUX<<>1`YW zdL%oOAx6bCGBN;`!55zHj!=By5fo!}`v8imvdnu=Kmg2~4$?}iEheOuYQH&Oij0^C)jjCT&uSRuXlR06{OWR2!m;t6Z1p%uMpSq@4st(xzc0at|=$ z6;y{HQ&9>INbl8QAnlqI=@21MqKxhZ_;omX;N+{}4Bbyep^=C})@rT>+ET+0A^u8~ zp(+)lu><>#7VWx6 zU6XT_{uWvTifep~i63|h)r3dww7yv0)%a@Zf!+WMS;Ix=8;(p_0r6R{wSLd&i z?XsI*o5mw+c>+Y8HluySw(xN`$Zi-jdxo10x{cP^ z!|}uM+Pv9YRIsE-2_%*S8VlRD%RLQTFYNOp#l}oGr7|tbOkzcpoad{P$K~r$wyT4a z(e2XORs5Tg)<0TZWRMmgDkv5wHWNe`g=8uSWy^IF4w(#^N)CeBP}$Ic#k^f!_uoC? zCaK_L2`;HV92glm;wje_7$wKJ#eqjC?Uy)&B*e3Y3Ou)r+aY zAm?I1OX(h2WPIX{XNOmKk)DJMvdM90cY8ZIXAGmEKnI;j;ZEp&P^>v-RcHpf zATFca3}wPr!6@lE|z-=3h}Rp)AEAwxwh z4IIJ?bnW{$%hWU6fPtkY9v?k#@A@`Y1 z7@=*h($U04YSZr#Zm3r!hE1Mi0oiZJ;Gwib+-EI<@vW4_Q~iVtrIfVmLf++=K(9@^ z+Nx-DoN_ltx~dKt)rzc9+2pOHMVWBX;&A&E7xKoH$HzB23Y$kt=+>@$p%dl3bhbhj zJCvY)(<{^kujjze(gAP#giwrzO;{+VVN}! zeIBeUxH}lr%19;ocpo01-#zL4o<0F`JkL;{Hit9?;S>>2N3-jm;RLJA0UGmwxi*8A zJ3b|5-{^8fKG@v(oWdknB08f7sz?4ULNIWxJk@zK9GNDI8<6)1=^Yx%OUp^rxcJBC64Dt7WB&#j06f z!3*yorZhVm;2mbK$KI2WdCc1lj6UE!EzVFtLbPZnB|Bp^4;(x(O%MCIh0L*pE zGkT%eGyM!fs2;;)_vL0ZsUdSa;*@XUq3QTvYj^F45Xht}?MXBuYmUt(jCsgOI~y9Y zP%vi^RK2VfIWwT}=C|_HFVg@zzfsn0p$mRjFi&y>C?`&^6$C%L4LA9O`{Eh)} z)v2S;H039%Z>(v>dIrw@9+%CncLn6tsLM8!-IM??&6Z?)Vx z;&g0<$7kI*Jhu(YV|+muGSowPUq17F0oq)(SmJ+&+ix7Ug9N{E@Rl0rw`0NtIiQHz z)XpJC8=5OvOT0<&`YwyY&pjvU)lMl*+ukQ67eb8ml`sY>`6C=gLLr_mo2x~+D;#eX zJB7}>1HtHtOCJGSxFQDRY&`MQ3ZO+JvwT#my!Sk^ANQ&HrjG3AHgw^T?(T~1NNsR- zmEcUOQgv!orVUfQ12OyG9djt%e)SqHL+|Mm+II1`wJZu!zAmyY;F0lb(T^^1`7q{^ zh7b&m);5(tI2BFo(>RUO_yTYuXvL?a{Dv|ut@Qg#MCaSp=A9VE68)qQq1J$?%{8|j z(rhRt*ho4@f!X?wrf)p7$$)M%Jj~aheadp|Wb1Mk^PBrMu`(Qv0JG-GsZArXm!f?! zw)$ATY_Mfhb)1S=wXmo5=8;}=qX&GlltN!aY%zdM-ef`sXb|;QP)=KUKS-cM$Ro1# z@^5rj*Lzyw@S5heVk~q`HqZQmnM;^o;uJE(+Lb(PE2S%Vwv}O)^+@z8C|Z#vaF`7V z_YMWSXd1Th^Y_^MgG~wwmPYBMDO5{pb(untt2h?hL!sZ6QqYtamULNRXaLOd38Ui;0KhT8}Ifq;L+p>#Smj$TiP z>e!M!+OmIWU&%$qe?eNzZ-18NC20A@u0sq z3(90TC;As{X_3M?KMn?2T+$+7_cbj7#4X@&ju#LgVDJCJ_>1D2B3V|0znV9s6A?k# zS=C!s@3dCmv;}w`gMiuz{tRtWgd-p8P$TKp{VTl*R!&`q$s?-;+I%&?G1L36PI_w)V7ppo36zw6C6N zh^?cTrK78Zg>Aj<|4ee_wvHAKlD;=XRKfu0YH;DVK!F{<>s06ZEQ=G+V(6(&lJ;f@ zr;JOI^l!UCC-PdW)!eDg9vEQ+fD2sYrMe;D-_=XgCT^<*@ux;#Fgt1|r+WKY_lkg{ z5B4G|31?$1Ag9S9YT!U>3)KgyJbdZ8n*XWwHG`1S;?w*K6v^Ug%mc)d{k;I{cm^M%O=RjH{(sT*-;qok^s&FGKUeXXA*PqznojZN*3 zkDAwRd*!lar4MgaTCt6~Lx084FVEX!-OHvWP%darFB6L2o1deWDqvPGt-<1@VE!a^ zhvExf%fw86M74EJm~|lYUY7RLlH4l=x)ZS&*RymcP4gv>o-Qx4w+qF}#<&+gp18>9QFY2L+!EJNs== z&$`+=*fpMTMXEo#jZ<(vA$ave&$*#1MVnO1;;wX-S)ZD@I>_?=3i6?UczW{ccrT=5 z5Ud-~i#vQGQ<+}MpWtZYfLJX-!hE4}CQ{AL3O*+Ay&7r5eVO`Hvr`RwTj(|%rI62} z$`gEZr(Eu3p|YqAnIjtR8-P6A(wy5mP=z{DH33?qkw1h@*NzYX57t%9ql9Fyu@7|A z3Jj&h0)F-iCbbf_4-=*fNN@)D1gI4KRp00RXVPqV0BejWCuaM&pmFBh#T}UA!z6mg zCv`hKhXn=q2+|RklY2wcLc{bN8b7#=8I>?pLXY}(9D61bTd`b8T~LJf7J#-}aU?DQ z9kB2$w{s>U#}bRe$p#z;#{hq;RHz@QjE|ydHE4AOVU4|10v^g@BYk0FoZBM0Ds3dQ z8Z)(Jw+7%AT-6i2$p1#UzLIsWnr3ToKVd4sTu>dtGFM21oqfv^G3X`O(`}79uTsDjWPX9B%Z&^1nQ}J1{?0omt@xWbF;=* z#E=q;JbjPXcjFrzf8I1cUG4(%&tY)zZsE}Ka3F1$Mk;8jddyTkN>5P0!$vYx`Y4Nm zKC7p0WcNeeKKVpd76xdt*U^mu*?55P^OoOLngIp_0-6KqQR*aMe|TS1#+f3i=FT)F z9LYT%#$9X3{Oj;L)832eoeG30C#iK@+hoINU^S9_EysCDI8_@;=`1>O6SzRtkn_e< zK|pzf370dP1{CnSl!z5-iwtNe}D_6+yqMQ0--K$;suCF|5r(uOhXi3waNO11ZjcX@G_4-+n3g?rgx~j!YE(r*q z-4l$qbDFHTa|H=QiA1W8<|Q|4w|&cka8~YhjnFJ--E(70HU1h}fHufVA`$j+HO(To zgR7uo^}JoVT}~J)ieWuPK0CFs;Dlp^w9ayww0IhR3V|RgMUyxg5PwX2=?(X$7y1I| zdAr4)gyn*arDMNbUOgli%sF<|7zg&LvmA^0OQY>^dJ}DF=Ce%plVycDP7;Gn>_+3T z^{~-YBO{eCi!#CN(gsr}N#L0jLTp1Uo74F4jYoto>S>bD?C^N1#_G;MgTuQ{-f2{| zZZK%xa_BlDNP#+_O9gK5*{w;3QEH)rN9hP0pg0U{c(^gqR3%B_)HNfn)8oywqjkp= zEA?@)ZG&}`KbyMo^Wi8wBy;A5nn%GD!=^GxLG@p31o5L53~3s3SdP{A!_jzUe70 z-_O0jLtk5fwrBZkhZ4i+T5HKp_|BCe1^N`sqA)uyZ`fCz^$hg5M z)R-3FF^g^#TVPH_ic|t@gBMftN|HSsm9DCrL}@yNUAtWz5x=)y^RB{p#A z@H61;Xe`hzCad^A7+6l^ZQyCj$n#{PA@xzvPPMGlp>6Swo5tQdR`R6yHEqR&ip_ zRT;RNhf$@`6lY_mN)1J}wHiZF0{DCuYYfT&Qnr)0LK}T%A*6=0$ga%*c0<#2%toce zOu$mvbUJ}LKQXq3#p!3daC{-*EI^Pa%k;%l$taIac1Fr!D1w!K3q~iXDKbnrL;Bsh zW62acSrey29`f8}2^%YRk0nZ1=#OS_oW2=yZaxxgIt35WH9ptDIcpl?ifaGLT>7 zKmD9UJ^+h5-@{nvLD!swf%J_HhUkEHwvP`APi%Db710!mNlNQ=#~Dit-+PL({ul7* zh9t5y?#~y!Fe}+Bu-7YV z#^waP`3M1=ZO7b#bGt)h#+Yu$=HD#(nLX|8=?)3nELn*s%*xX!p+p5K=9QM45~^!$G`1Z`C-N`2fwrZXBe)WqJMaxp>^k|!T;;)yn~uxwmwW~B1n)H zx*}4gh9Zd6AW9MG(t;S2AVrEu6I7}QNDI;euRxG4AOb2%3+1I4N4JUpU!EnrCCExq#6R z`|jGSm!Ts5cAk7*7979&SHKU@h}8C)uDE`eY~QHktH@8oS9*3sF!~NmCRKp?>l${B#YPme zj415NuMA($Nbw>_yg?}q7yaB;?N)wpWT3eOC-3VDX3ugU^d!fY5#)|Sn0G!A{1`Uf z)o)RkRCim-nY$dQ?*q=ih0S#C)7TQM`Vdgy-jjj6il4N51o0;k0|Y%&DB{Eb{(@bn zx!Bgn2^EA7NFTS7lr+SMYK1O@Gh3pMm-a<6$Mu?K?kAvo49-e&F7|wHjp?|EX6B{a z5+cCX+jH!OkPWC|z6H~dEP-Q-1 zW~Bsk-U_2mafM5jDTnZh1P(aS!%1{ap867b!_EX)Kfw=XI%6o>anstPQQ0eRH{&@W z%GO~SzWAdY1lDVQ)I6&8#nfSk=-pYAnFLZX@bfmB@LKdLm(5c%bLkvuCk;}hB5U^| z_r&)5Gj7}q1cRBF6K8udZG7xyFSFs=mvC|u`Wip|#-6srvu+aQnDnNd)_($G7@C*> zF{TAN7Jvn0whJs}&DqTE5;sOj@V^yn^aCAcX&tI>W zmwd;k`Sp$+z#6kXLWCAg;OyiYZTI4^edY4T4dDt!AW?M4}f1iUFBo0@t{5pm94{N%h^K ze>H4Jv>IgAO=qbF4Fv%!TY4BNF)cU0+7qvyemZ$9NbKP^#x*f3^Ke&bR0q4lExw{( z^T@osWU2VNq~V*nQSwe_I7OQ9z~AI(OfJKk+D@geZ$y(PTqB#L57av23-I7^=h&*P z(in9GFv5Ijdii+Q^Ff$CvM8g$`o`!n+ThORpg6%Ar9s|}I}RLxppFm#u``rb~j56v`t^23Sutcotovng+9_mZ&wg>>_ z$z$pcK0L4Z__5I9&c@f4BPng!C)DF;b@iFYRt9fDT~BsT>?bvd4lF1`6ydd>+eOPPbjz3L z5E$ZA7{8g_B$g=i9Q^UAzQlo;(1`q?yg9Fdnl~`*``4Y6)1ZS$*8!WTfU+7etJ7%l zj+sn=;Km*D{_a=&2@6Tq((4lG1L_YIWUb0`3v3b6J!v-SsTOZi6;5$P%@Ak7%q#D> z+4UrMP9rQ>VCRbTVR<|+bi4_53T^UvrUw>@;b*)PJWjLP=e(4Xe~0*vQCvS86Y;#u zH(t1|w))f+e3a~4#aZ!=18)TT)?JH5K_I{T=BsN6Q52cOMQpFU5Pu+>vM@FtL=U=G?D1JJ!K>e%HlQfdN$voiEdq}CrWdt>=B*^o5TTp%ujOtD0}sT0{kXd_m<9 z_sT0H8X~h7X)~zHCG~FXE{S~l!Q>JiFW)`>m%dByL#Fuh_9oS^bn^`4VdJQ?Y~>lR zI`|~-3#&kxPSAp;)c(NoQ7fxoX>Dk8eX;^3<@1?v8yMyibu|{-VmC3<;E?9u+Ug!u z_@hqk)5SWir5A(|jL(P|)ok-^5?d1B@tMs^(Lm9qF&WR1lOgCa)5a);KC<6d&qO5! zXh1=4{-E{zp8a}xRla~nm-0~ZC}HK5U&wB#9|kR{62qdja9^+Jl$KCsGC^9zT-Ru& z#qqS5z>IZ63B@0lzKj!>4~mY)oEYvMANIU5s7Dp5l_S0*u{`HuWa(Vkvh-xp*6@C0 z>l+&vP!M;tka&GNd)>uU#PMR2nxSVAv|mY!5bNl_tpQ3JhP^o;Fg;G-Q6VwM*TEUr z-Z`dkbTW_(eEXeE07uf;R@~l^*tm7c@Y}%CaTUbScGEuFeE>L;cWDt2M`yIhcJrHq zcan0Yy%{_VV&?_0-IrP7Uo-0B0Xj_m|8F-+KqQ(!3Z%4wbVwQE z|MGD?-NnQ7S7U}9K!8JT;z^|QP+@m5OD;6F?6?mLZhSXx7C+1A zcY;@+=$#$t)x?fX4@mliNRZQ)2cvc)wGaA7;Ba-#{OEH-cS9ha1?o)g>}SFlL95{T zkDx88ybuC)JF`ev79_s5$|p5)tg-%I(2gX4nH%hJt5C)v@!aY2jYGzl8oQ#Zvy!vQ z&5_ln?-FCHlS^S17AY<@)zw+H?_zCH#)twh&y-U0n%G7cL}@Zi-Nx1xQ5}p5_C>-_ z=!L6rLh`Vk(lho)&-jHd#IK~uZ8QelxI^zfv3Nh7_cI#EbhIYfVef3?D@N@3J N;!Xd`D=`/dev/null || \ + PATH=/sbin:/usr/sbin/ command -v chroot 2>/dev/null || \ + echo chroot \ +) +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules +.PHONY: all all-at-once all-with-make clean-stage clean deepclean iso \ + verify-all-pkgs-checksums verify-pkgs-checksums update-pkgs-checksums \ + verify-all-nix-stage4-checksums verify-all-nix-stage5-checksums \ + verify-all-nix-plain-checksums verify-nix-plain-checksums \ + me-suffer +NPROC ?= 1 # for inner make invocations, one can pass -j# this way +USE_CCACHE ?= 0 # for faster iterative debugging only +USE_NIX_CACHE ?= 0 # for faster iterative debugging only +USE_DISORDERFS ?= 0 # for more thorough reproducibility testing +SAVE_MISMATCHING_BUILD_TREES ?= 0 # for more thorough reproducibility testing + +SOURCE_DATE_EPOCH ?= $(shell date '--date=01 Jan 1970 00:00:00 UTC' +%s) +TAR := tar +TAR_REPR = $(TAR) --sort=name '--mtime=@$(SOURCE_DATE_EPOCH)' \ + --owner=0 --group=0 --numeric-owner \ + --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime + +downloads/%: + @echo "### Makefile: downloading required $*..." + ONLY="$*" ./download.sh + [[ -e downloads/$* ]] + +################################################################################ + +stage/protosrc: seed.sh +stage/protosrc: recipes/1-stage1/syscall.h +stage/protosrc: recipes/1-stage1/seed.host-executed.sh +stage/protosrc: downloads/musl-1.2.4.tar.gz +stage/protosrc: downloads/busybox-1.36.1.tar.bz2 +stage/protosrc: downloads/tinycc-mob-af1abf1.tar.gz + env DESTDIR=stage recipes/1-stage1/seed.host-executed.sh + +NIXPKGS_HASH=21f524672f25f8c3e7a0b5775e6505fee8fe43ce +TCC_CHECKSUM=05aad934985939e9997127e93d63d6a94c88739313c496f10a90176688cc9167 +tcc-seed: + @echo '### Makefile: you are supposed to supply a trusted tcc-seed' + @echo '### Makefile: since you have not, building one from nixpkgs...' + cat $$(nix build "nixpkgs/${NIXPKGS_HASH}#pkgsStatic.tinycc.out" \ + --no-link --print-out-paths)/bin/tcc > tcc-seed + chmod +x tcc-seed + sha256sum -c <<<"$(TCC_CHECKSUM) tcc-seed" + @echo '### Makefile: using tcc-seed built with nix' + +# Stage 0 is special in that there are no sources, we just pack up tcc-seed +pkgs/0-tcc-seed.pkg: tcc-seed + @echo '### Makefile: special stage 0: just packing up tcc-seed...' + mkdir -p tmp/build/0-tcc-seed/store pkgs + cp tcc-seed tmp/build/0-tcc-seed/store/0-tcc-seed + $(TAR_REPR) -Izstd -cf pkgs/0-tcc-seed.pkg -C tmp/build/0-tcc-seed \ + store/0-tcc-seed + rm -rf tmp/build/0-tcc-seed + @echo '### Makefile: successfully packed up pkgs/0-tcc-seed.pkg' + +# Stage 1 is special in that: +# * we patch up some sources on the host +# * we have no shell and execute 1-stage1.c with tcc-seed +pkgs/1-stage1.pkg: pkgs/0-tcc-seed.pkg +pkgs/1-stage1.pkg: recipes/1-stage1.c +pkgs/1-stage1.pkg: recipes/1-stage1/seed.host-executed.sh +pkgs/1-stage1.pkg: recipes/1-stage1/syscall.h +pkgs/1-stage1.pkg: recipes/1-stage1/protobusybox.c +pkgs/1-stage1.pkg: recipes/1-stage1/protobusybox.h +pkgs/1-stage1.pkg: recipes/1-stage1/hello.c +pkgs/1-stage1.pkg: downloads/musl-1.2.4.tar.gz +pkgs/1-stage1.pkg: downloads/tinycc-mob-af1abf1.tar.gz +pkgs/1-stage1.pkg: downloads/busybox-1.36.1.tar.bz2 +pkgs/1-stage1.pkg: + @echo "### Makefile: creating temporary builddir tmp/build/1-stage1..." + rm -rf tmp/build/1-stage1 + DISORDER=$(USE_DISORDERFS) helpers/builddir create tmp/build/1-stage1 + @echo "### Makefile: injecting dependencies..." + helpers/inject tmp/build/1-stage1 $^ + @echo "### Makefile: seeding special stage 1 (and patching sources)..." + DESTDIR=tmp/build/1-stage1 recipes/1-stage1/seed.host-executed.sh + @echo "### Makefile: special stage 1: executing stage1.c with tcc-seed" + DISORDER=$(USE_DISORDERFS) helpers/builddir pre-build tmp/build/1-stage1 + env -i unshare -nr $(CHROOT) ./tmp/build/1-stage1 \ + /store/0-tcc-seed -nostdinc -nostdlib -Werror \ + -run recipes/1-stage1.c + DISORDER=$(USE_DISORDERFS) \ + helpers/builddir post-build tmp/build/1-stage1 + $(TAR_REPR) -Izstd -cf pkgs/1-stage1.pkg -C tmp/build/1-stage1 \ + store/1-stage1 + DISORDER=$(USE_DISORDERFS) helpers/builddir remove tmp/build/1-stage1 + @echo "### Makefile: 1-stage1 has been built as pkgs/1-stage1.pkg" + +# Consequent stages split up into packages have it simpler: +pkgs/%.pkg: recipes/%.sh + @echo "### Makefile: creating a temporary build area tmp/build/$*..." + if ! rm -rf "tmp/build/$*" 2>/dev/null; then \ + chmod -R +w "tmp/build/$*"; \ + rm -rf "tmp/build/$*"; \ + fi + [ ! -e "tmp/build/$*" ] + DISORDER=$(USE_DISORDERFS) helpers/builddir create "tmp/build/$*" + helpers/inject "tmp/build/$*" $^ +ifeq ($(USE_CCACHE), 1) + @echo "### Makefile: unpacking ccache from previous builds $*..." + mkdir -p "tmp/build/$*/ccache" + [[ ! -e "tmp/ccache/$*.tar.zstd" ]] || \ + tar -Izstd -xf "tmp/ccache/$*.tar.zstd" -C "tmp/build/$*/ccache" + ln -sf /store/_2a0-ccache/wrap-available "tmp/build/$*/ccache/setup" + ln -sf /store/_2a0-ccache/bin "tmp/build/$*/ccache/bin" +endif +ifeq ($(USE_NIX_CACHE), 1) + @echo "### Makefile: unpacking nix store and db from previous build..." + if [[ $* =~ .*-using-nix ]] && [[ -e "pkgs/$*.pkg" ]]; then \ + mkdir "tmp/build/$*/prev/"; \ + tar --strip-components=2 \ + -xf "pkgs/$*.pkg" -C "tmp/build/$*/prev/"; \ + fi +endif + DISORDER=$(USE_DISORDERFS) helpers/builddir pre-build "tmp/build/$*" + @echo "### Makefile: building $* ..." + env \ + DESTDIR="./tmp/build/$*" \ + NPROC="$(NPROC)" \ + SOURCE_DATE_EPOCH="$(SOURCE_DATE_EPOCH)" \ + ./helpers/chroot "/recipes/$*.sh" + DISORDER=$(USE_DISORDERFS) helpers/builddir post-build "tmp/build/$*" + @echo "### Makefile: packing up $* ..." + $(TAR_REPR) -Izstd -cf "pkgs/$*.pkg" -C "tmp/build/$*" "store/$*" +ifeq ($(USE_CCACHE), 1) + @echo "### Makefile: packing up $* ccache cache..." + if [[ -e "tmp/build/$*/store/_2a0-ccache/bin/ccache" ]]; then \ + mkdir -p tmp/ccache; \ + unshare -nr $(CHROOT) "tmp/build/$*" \ + /store/_2a0-ccache/bin/ccache -sz; \ + $(TAR_REPR) -Izstd -cf "tmp/ccache/$*.tar.zstd" \ + -C "tmp/build/$*/ccache" .; \ + fi + rm -rf "tmp/build/$*/store/_2a0-ccache" + rm -rf "tmp/build/$*/ccache" +endif +ifeq ($(SAVE_MISMATCHING_BUILD_TREES), 1) + computed_csum=$$(zstd -qcd "pkgs/$*.pkg" | sha256sum); \ + computed_csum=$$(<<<$$computed_csum tr ' ' '\t' | cut -f1); \ + if ! grep -q "$$computed_csum pkgs/$*" verify.pkgs.sha256; then \ + short_csum=$$(<<<$$computed_csum head -c7); \ + echo "### Makefile: packing up $* buildtree"; \ + mkdir -p trees; \ + $(TAR_REPR) -Izstd -cf "trees/$*-$$short_csum.pkg" \ + -C "tmp/build/$*" .; \ + fi +endif + @echo "### Makefile: cleaning up after $*" + DISORDER=$(USE_DISORDERFS) helpers/builddir remove "tmp/build/$*" + @echo "### Makefile: $* has been built as pkgs/$*.pkg" + +# Dependency graph: + +pkgs/2a0-static-gnumake.pkg: pkgs/1-stage1.pkg +pkgs/2a0-static-gnumake.pkg: downloads/make-4.4.1.tar.gz + +ifeq ($(USE_CCACHE), 1) +pkgs/_2a0-ccache.pkg: pkgs/1-stage1.pkg +pkgs/_2a0-ccache.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/_2a0-ccache.pkg: downloads/ccache-3.7.12.tar.xz +endif + +pkgs/2/01-gnumake.pkg: pkgs/1-stage1.pkg +pkgs/2/01-gnumake.pkg: pkgs/2/00-intermediate-gnumake.pkg +pkgs/2/01-gnumake.pkg: downloads/make-4.4.1.tar.gz + +pkgs/2a1-static-binutils.pkg: pkgs/1-stage1.pkg +pkgs/2a1-static-binutils.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a1-static-binutils.pkg: downloads/binutils-2.39.tar.xz + +pkgs/2a2-static-gnugcc4-c.pkg: pkgs/1-stage1.pkg +pkgs/2a2-static-gnugcc4-c.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a2-static-gnugcc4-c.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a2-static-gnugcc4-c.pkg: downloads/gmp-4.3.2.tar.xz +pkgs/2a2-static-gnugcc4-c.pkg: downloads/mpfr-2.4.2.tar.xz +pkgs/2a2-static-gnugcc4-c.pkg: downloads/mpc-0.8.1.tar.gz +pkgs/2a2-static-gnugcc4-c.pkg: downloads/gcc-4.7.4.tar.bz2 + +pkgs/2a3-intermediate-musl.pkg: pkgs/1-stage1.pkg +pkgs/2a3-intermediate-musl.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a3-intermediate-musl.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a3-intermediate-musl.pkg: pkgs/2a2-static-gnugcc4-c.pkg +pkgs/2a3-intermediate-musl.pkg: downloads/musl-1.2.4.tar.gz + +pkgs/2a4-gnugcc4-cpp.pkg: pkgs/1-stage1.pkg +pkgs/2a4-gnugcc4-cpp.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a4-gnugcc4-cpp.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a4-gnugcc4-cpp.pkg: pkgs/2a2-static-gnugcc4-c.pkg +pkgs/2a4-gnugcc4-cpp.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2a4-gnugcc4-cpp.pkg: downloads/gmp-4.3.2.tar.xz +pkgs/2a4-gnugcc4-cpp.pkg: downloads/mpfr-2.4.2.tar.xz +pkgs/2a4-gnugcc4-cpp.pkg: downloads/mpc-0.8.1.tar.gz +pkgs/2a4-gnugcc4-cpp.pkg: downloads/gcc-4.7.4.tar.bz2 + +pkgs/2a5-gnugcc10.pkg: pkgs/1-stage1.pkg +pkgs/2a5-gnugcc10.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a5-gnugcc10.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a5-gnugcc10.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2a5-gnugcc10.pkg: pkgs/2a4-gnugcc4-cpp.pkg +pkgs/2a5-gnugcc10.pkg: downloads/gcc-10.5.0.tar.xz +pkgs/2a5-gnugcc10.pkg: downloads/gmp-6.1.0.tar.xz +pkgs/2a5-gnugcc10.pkg: downloads/mpc-1.0.3.tar.gz +pkgs/2a5-gnugcc10.pkg: downloads/mpfr-3.1.4.tar.xz +pkgs/2a5-gnugcc10.pkg: downloads/isl-0.18.tar.bz2 + +pkgs/2a6-linux-headers.pkg: pkgs/1-stage1.pkg +pkgs/2a6-linux-headers.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a6-linux-headers.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a6-linux-headers.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2a6-linux-headers.pkg: pkgs/2a5-gnugcc10.pkg +pkgs/2a6-linux-headers.pkg: downloads/linux-6.4.12.tar.xz + +pkgs/2a7-cmake.pkg: pkgs/1-stage1.pkg +pkgs/2a7-cmake.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a7-cmake.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a7-cmake.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2a7-cmake.pkg: pkgs/2a5-gnugcc10.pkg +pkgs/2a7-cmake.pkg: pkgs/2a6-linux-headers.pkg +pkgs/2a7-cmake.pkg: downloads/cmake-3.27.4.tar.gz + +pkgs/2a8-python.pkg: pkgs/1-stage1.pkg +pkgs/2a8-python.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a8-python.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a8-python.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2a8-python.pkg: pkgs/2a5-gnugcc10.pkg +pkgs/2a8-python.pkg: downloads/Python-3.12.0.tar.xz + +pkgs/2a9-intermediate-clang.pkg: pkgs/1-stage1.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a5-gnugcc10.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a6-linux-headers.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a7-cmake.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/2a8-python.pkg +pkgs/2a9-intermediate-clang.pkg: downloads/llvm-project-17.0.1.src.tar.xz + +pkgs/2b0-musl.pkg: pkgs/1-stage1.pkg +pkgs/2b0-musl.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2b0-musl.pkg: pkgs/2a1-static-binutils.pkg +pkgs/2b0-musl.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2b0-musl.pkg: pkgs/2a9-intermediate-clang.pkg +pkgs/2b0-musl.pkg: downloads/musl-1.2.4.tar.gz + +pkgs/2b1-clang.pkg: pkgs/1-stage1.pkg +pkgs/2b1-clang.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2b1-clang.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/2b1-clang.pkg: pkgs/2a6-linux-headers.pkg +pkgs/2b1-clang.pkg: pkgs/2a7-cmake.pkg +pkgs/2b1-clang.pkg: pkgs/2a8-python.pkg +pkgs/2b1-clang.pkg: pkgs/2a9-intermediate-clang.pkg +pkgs/2b1-clang.pkg: pkgs/2b0-musl.pkg +pkgs/2b1-clang.pkg: downloads/llvm-project-17.0.1.src.tar.xz + +pkgs/2b2-busybox.pkg: pkgs/1-stage1.pkg +pkgs/2b2-busybox.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2b2-busybox.pkg: pkgs/2b0-musl.pkg +pkgs/2b2-busybox.pkg: pkgs/2b1-clang.pkg +pkgs/2b2-busybox.pkg: pkgs/2a6-linux-headers.pkg +pkgs/2b2-busybox.pkg: downloads/busybox-1.36.1.tar.bz2 + +pkgs/2b3-gnumake.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/2b3-gnumake.pkg: pkgs/2b0-musl.pkg +pkgs/2b3-gnumake.pkg: pkgs/2b1-clang.pkg +pkgs/2b3-gnumake.pkg: pkgs/2b2-busybox.pkg +pkgs/2b3-gnumake.pkg: downloads/make-4.4.1.tar.gz + +pkgs/3a-sqlite.pkg: pkgs/2b0-musl.pkg +pkgs/3a-sqlite.pkg: pkgs/2b1-clang.pkg +pkgs/3a-sqlite.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-sqlite.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-sqlite.pkg: downloads/sqlite-autoconf-3430000.tar.gz + +pkgs/3a-boost.pkg: pkgs/2b0-musl.pkg +pkgs/3a-boost.pkg: pkgs/2b1-clang.pkg +pkgs/3a-boost.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-boost.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-boost.pkg: pkgs/2a6-linux-headers.pkg +pkgs/3a-boost.pkg: downloads/boost_1_83_0.tar.bz2 + +pkgs/3a-mbedtls.pkg: pkgs/2b0-musl.pkg +pkgs/3a-mbedtls.pkg: pkgs/2b1-clang.pkg +pkgs/3a-mbedtls.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-mbedtls.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-mbedtls.pkg: downloads/mbedtls-3.4.1.tar.gz + +pkgs/3a-pkg-config.pkg: pkgs/2b0-musl.pkg +pkgs/3a-pkg-config.pkg: pkgs/2b1-clang.pkg +pkgs/3a-pkg-config.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-pkg-config.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-pkg-config.pkg: downloads/pkg-config-0.29.2.tar.gz + +pkgs/3a-curl.pkg: pkgs/2b0-musl.pkg +pkgs/3a-curl.pkg: pkgs/2b1-clang.pkg +pkgs/3a-curl.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-curl.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-curl.pkg: pkgs/3a-mbedtls.pkg +pkgs/3a-curl.pkg: pkgs/3a-pkg-config.pkg +pkgs/3a-curl.pkg: downloads/curl-8.2.1.tar.xz + +pkgs/3a-editline.pkg: pkgs/2b0-musl.pkg +pkgs/3a-editline.pkg: pkgs/2b1-clang.pkg +pkgs/3a-editline.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-editline.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-editline.pkg: downloads/editline-1.17.1.tar.xz + +pkgs/3a-brotli.pkg: pkgs/2b0-musl.pkg +pkgs/3a-brotli.pkg: pkgs/2b1-clang.pkg +pkgs/3a-brotli.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-brotli.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-brotli.pkg: downloads/brotli-1.0.9.tar.gz + +pkgs/3a-gnugperf.pkg: pkgs/2b0-musl.pkg +pkgs/3a-gnugperf.pkg: pkgs/2b1-clang.pkg +pkgs/3a-gnugperf.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-gnugperf.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-gnugperf.pkg: downloads/gperf-3.1.tar.gz + +pkgs/3a-seccomp.pkg: pkgs/2b0-musl.pkg +pkgs/3a-seccomp.pkg: pkgs/2b1-clang.pkg +pkgs/3a-seccomp.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-seccomp.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-seccomp.pkg: pkgs/3a-gnugperf.pkg +pkgs/3a-seccomp.pkg: pkgs/2a6-linux-headers.pkg +pkgs/3a-seccomp.pkg: downloads/libseccomp-2.5.4.tar.gz + +pkgs/3a-libarchive.pkg: pkgs/2b0-musl.pkg +pkgs/3a-libarchive.pkg: pkgs/2b1-clang.pkg +pkgs/3a-libarchive.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-libarchive.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-libarchive.pkg: pkgs/3a-pkg-config.pkg +pkgs/3a-libarchive.pkg: downloads/libarchive-3.7.1.tar.xz + +pkgs/3a-libsodium.pkg: pkgs/2b0-musl.pkg +pkgs/3a-libsodium.pkg: pkgs/2b1-clang.pkg +pkgs/3a-libsodium.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-libsodium.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-libsodium.pkg: pkgs/3a-pkg-config.pkg +pkgs/3a-libsodium.pkg: downloads/libsodium-1.0.18.tar.gz + +pkgs/3a-lowdown.pkg: pkgs/2b0-musl.pkg +pkgs/3a-lowdown.pkg: pkgs/2b1-clang.pkg +pkgs/3a-lowdown.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-lowdown.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-lowdown.pkg: downloads/lowdown-1.0.2.tar.gz + +pkgs/3a-nlohmann-json.pkg: pkgs/2b0-musl.pkg +pkgs/3a-nlohmann-json.pkg: pkgs/2b1-clang.pkg +pkgs/3a-nlohmann-json.pkg: pkgs/2b2-busybox.pkg +pkgs/3a-nlohmann-json.pkg: pkgs/2b3-gnumake.pkg +pkgs/3a-nlohmann-json.pkg: downloads/nlohmann-json-3.11.2.tar.xz + +pkgs/3b-busybox-static.pkg: pkgs/2b0-musl.pkg +pkgs/3b-busybox-static.pkg: pkgs/2b1-clang.pkg +pkgs/3b-busybox-static.pkg: pkgs/2b2-busybox.pkg +pkgs/3b-busybox-static.pkg: pkgs/2b3-gnumake.pkg +pkgs/3b-busybox-static.pkg: pkgs/2a6-linux-headers.pkg +pkgs/3b-busybox-static.pkg: downloads/busybox-1.36.1.tar.bz2 + +pkgs/3b-tinycc-static.pkg: pkgs/2b0-musl.pkg +pkgs/3b-tinycc-static.pkg: pkgs/2b1-clang.pkg +pkgs/3b-tinycc-static.pkg: pkgs/2b2-busybox.pkg +pkgs/3b-tinycc-static.pkg: pkgs/2b3-gnumake.pkg +pkgs/3b-tinycc-static.pkg: downloads/tinycc-mob-af1abf1.tar.gz + +pkgs/3b-nix.pkg: pkgs/2b0-musl.pkg +pkgs/3b-nix.pkg: pkgs/2b1-clang.pkg +pkgs/3b-nix.pkg: pkgs/2b2-busybox.pkg +pkgs/3b-nix.pkg: pkgs/2b3-gnumake.pkg +pkgs/3b-nix.pkg: pkgs/2a6-linux-headers.pkg +pkgs/3b-nix.pkg: pkgs/3a-sqlite.pkg +pkgs/3b-nix.pkg: pkgs/3a-boost.pkg +pkgs/3b-nix.pkg: pkgs/3a-pkg-config.pkg +pkgs/3b-nix.pkg: pkgs/3a-curl.pkg +pkgs/3b-nix.pkg: pkgs/3a-editline.pkg +pkgs/3b-nix.pkg: pkgs/3a-brotli.pkg +pkgs/3b-nix.pkg: pkgs/3a-seccomp.pkg +pkgs/3b-nix.pkg: pkgs/3a-libarchive.pkg +pkgs/3b-nix.pkg: pkgs/3a-libsodium.pkg +pkgs/3b-nix.pkg: pkgs/3a-lowdown.pkg +pkgs/3b-nix.pkg: pkgs/3a-nlohmann-json.pkg +pkgs/3b-nix.pkg: pkgs/3b-busybox-static.pkg +pkgs/3b-nix.pkg: downloads/queue.h +pkgs/3b-nix.pkg: downloads/nix-2.17.0-zilched.tar.xz + +pkgs/4-rebootstrap-using-nix.pkg: pkgs/2b0-musl.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/2b1-clang.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/2b2-busybox.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-boost.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-pkg-config.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-sqlite.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-curl.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-editline.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-brotli.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-seccomp.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-libarchive.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-libsodium.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-lowdown.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3a-nlohmann-json.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3b-tinycc-static.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3b-busybox-static.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/3b-nix.pkg +### +pkgs/4-rebootstrap-using-nix.pkg: stage/protosrc +### +pkgs/4-rebootstrap-using-nix.pkg: recipes/1-stage1.c +pkgs/4-rebootstrap-using-nix.pkg: recipes/1-stage1/seed.host-executed.sh +pkgs/4-rebootstrap-using-nix.pkg: recipes/1-stage1/syscall.h +pkgs/4-rebootstrap-using-nix.pkg: recipes/1-stage1/protobusybox.c +pkgs/4-rebootstrap-using-nix.pkg: recipes/1-stage1/protobusybox.h +pkgs/4-rebootstrap-using-nix.pkg: recipes/1-stage1/hello.c +### +pkgs/4-rebootstrap-using-nix.pkg: default.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/1-stage1.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a0-static-gnumake.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a1-static-binutils.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a2-static-gnugcc4-c.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a3-intermediate-musl.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a4-gnugcc4-cpp.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a5-gnugcc10.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a6-linux-headers.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a7-cmake.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a8-python.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2a9-intermediate-clang.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2b0-musl.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2b1-clang.nix +pkgs/4-rebootstrap-using-nix.pkg: using-nix/2b2-busybox.nix +### +pkgs/4-rebootstrap-using-nix.pkg: downloads/make-4.4.1.tar.gz +pkgs/4-rebootstrap-using-nix.pkg: downloads/binutils-2.39.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/gcc-4.7.4.tar.bz2 +pkgs/4-rebootstrap-using-nix.pkg: downloads/gmp-4.3.2.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/mpfr-2.4.2.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/mpc-0.8.1.tar.gz +pkgs/4-rebootstrap-using-nix.pkg: downloads/musl-1.2.4.tar.gz +pkgs/4-rebootstrap-using-nix.pkg: downloads/gcc-10.5.0.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/gmp-6.1.0.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/mpfr-3.1.4.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/mpc-1.0.3.tar.gz +pkgs/4-rebootstrap-using-nix.pkg: downloads/isl-0.18.tar.bz2 +pkgs/4-rebootstrap-using-nix.pkg: downloads/linux-6.4.12.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/cmake-3.27.4.tar.gz +pkgs/4-rebootstrap-using-nix.pkg: downloads/Python-3.12.0.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/llvm-project-17.0.1.src.tar.xz +pkgs/4-rebootstrap-using-nix.pkg: downloads/busybox-1.36.1.tar.bz2 + +pkgs/5-go-beyond-using-nix.pkg: pkgs/2b0-musl.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/2b1-clang.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/2b2-busybox.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-boost.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-pkg-config.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-sqlite.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-curl.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-editline.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-brotli.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-seccomp.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-libarchive.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-libsodium.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-lowdown.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3a-nlohmann-json.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3b-tinycc-static.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3b-busybox-static.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/3b-nix.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/4-rebootstrap-using-nix.pkg +### +pkgs/5-go-beyond-using-nix.pkg: stage/protosrc +### +pkgs/5-go-beyond-using-nix.pkg: recipes/1-stage1.c +pkgs/5-go-beyond-using-nix.pkg: recipes/1-stage1/seed.host-executed.sh +pkgs/5-go-beyond-using-nix.pkg: recipes/1-stage1/syscall.h +pkgs/5-go-beyond-using-nix.pkg: recipes/1-stage1/protobusybox.c +pkgs/5-go-beyond-using-nix.pkg: recipes/1-stage1/protobusybox.h +pkgs/5-go-beyond-using-nix.pkg: recipes/1-stage1/hello.c +### +pkgs/5-go-beyond-using-nix.pkg: default.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/1-stage1.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a0-static-gnumake.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a1-static-binutils.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a2-static-gnugcc4-c.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a3-intermediate-musl.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a4-gnugcc4-cpp.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a5-gnugcc10.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a6-linux-headers.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a7-cmake.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a8-python.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2a9-intermediate-clang.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2b0-musl.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2b1-clang.nix +pkgs/5-go-beyond-using-nix.pkg: using-nix/2b2-busybox.nix +### +pkgs/5-go-beyond-using-nix.pkg: downloads/make-4.4.1.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/binutils-2.39.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/gcc-4.7.4.tar.bz2 +pkgs/5-go-beyond-using-nix.pkg: downloads/gmp-4.3.2.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/mpfr-2.4.2.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/mpc-0.8.1.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/musl-1.2.4.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/gcc-10.5.0.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/gmp-6.1.0.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/mpfr-3.1.4.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/mpc-1.0.3.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/isl-0.18.tar.bz2 +pkgs/5-go-beyond-using-nix.pkg: downloads/linux-6.4.12.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/cmake-3.27.4.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/Python-3.11.5.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/llvm-project-17.0.1.src.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/curl-8.2.1.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/mbedtls-3.4.1.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/boost_1_83_0.tar.bz2 +pkgs/5-go-beyond-using-nix.pkg: downloads/editline-1.17.1.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/brotli-1.0.9.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/gperf-3.1.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/libsodium-1.0.18.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/libarchive-3.7.1.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/lowdown-1.0.2.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/libseccomp-2.5.4.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/nlohmann-json-3.11.2.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/nix-2.17.0-zilched.tar.xz +pkgs/5-go-beyond-using-nix.pkg: flake.nix +pkgs/5-go-beyond-using-nix.pkg: downloads/queue.h +pkgs/5-go-beyond-using-nix.pkg: downloads/ZilchOS-core-2023.10.1.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/limine-5.20230830.0.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/patchelf-0.18.0.tar.bz2 +pkgs/5-go-beyond-using-nix.pkg: downloads/pkg-config-0.29.2.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/sqlite-autoconf-3430000.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/bison-3.8.2.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/m4-1.4.19.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/flex-2.6.4.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/mtools-4.0.43.tar.bz2 +pkgs/5-go-beyond-using-nix.pkg: downloads/xorriso-1.5.6.pl02.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/nasm-2.16.01.tar.xz +pkgs/5-go-beyond-using-nix.pkg: downloads/zstd-1.5.5.tar.gz +pkgs/5-go-beyond-using-nix.pkg: downloads/cacert-2023-08-22.pem + +iso: ZilchOS-core.iso + +ZilchOS-core.iso: pkgs/5-go-beyond-using-nix.pkg + tar --strip-components=2 -xf pkgs/5-go-beyond-using-nix.pkg \ + store/5-go-beyond-using-nix/ZilchOS-core.iso + sha256sum -c <<<"$(ISO_CHECKSUM) ZilchOS-core.iso" + +################################################################################ + +# Separate one for tests to help readability of the above + +pkgs/_1.test.pkg: pkgs/1-stage1.pkg + +pkgs/_2a3.test.pkg: pkgs/1-stage1.pkg +pkgs/_2a3.test.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/_2a3.test.pkg: pkgs/2a1-static-binutils.pkg +pkgs/_2a3.test.pkg: pkgs/2a2-static-gnugcc4-c.pkg +pkgs/_2a3.test.pkg: pkgs/2a3-intermediate-musl.pkg + +pkgs/_2a4.test.pkg: pkgs/1-stage1.pkg +pkgs/_2a4.test.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/_2a4.test.pkg: pkgs/2a1-static-binutils.pkg +pkgs/_2a4.test.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/_2a4.test.pkg: pkgs/2a4-gnugcc4-cpp.pkg + +pkgs/_2a5.test.pkg: pkgs/1-stage1.pkg +pkgs/_2a5.test.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/_2a5.test.pkg: pkgs/2a1-static-binutils.pkg +pkgs/_2a5.test.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/_2a5.test.pkg: pkgs/2a5-gnugcc10.pkg + +pkgs/_2a9.test.pkg: pkgs/1-stage1.pkg +pkgs/_2a9.test.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/_2a9.test.pkg: pkgs/2a3-intermediate-musl.pkg +pkgs/_2a9.test.pkg: pkgs/2a9-intermediate-clang.pkg + +pkgs/_2b1.test.pkg: pkgs/1-stage1.pkg +pkgs/_2b1.test.pkg: pkgs/2a0-static-gnumake.pkg +pkgs/_2b1.test.pkg: pkgs/2b0-musl.pkg +pkgs/_2b1.test.pkg: pkgs/2b1-clang.pkg + +pkgs/_3b.test.pkg: pkgs/2b0-musl.pkg +pkgs/_3b.test.pkg: pkgs/2b1-clang.pkg +pkgs/_3b.test.pkg: pkgs/2b2-busybox.pkg +pkgs/_3b.test.pkg: pkgs/3a-boost.pkg +pkgs/_3b.test.pkg: pkgs/3a-pkg-config.pkg +pkgs/_3b.test.pkg: pkgs/3a-sqlite.pkg +pkgs/_3b.test.pkg: pkgs/3a-curl.pkg +pkgs/_3b.test.pkg: pkgs/3a-editline.pkg +pkgs/_3b.test.pkg: pkgs/3a-brotli.pkg +pkgs/_3b.test.pkg: pkgs/3a-seccomp.pkg +pkgs/_3b.test.pkg: pkgs/3a-libarchive.pkg +pkgs/_3b.test.pkg: pkgs/3a-libsodium.pkg +pkgs/_3b.test.pkg: pkgs/3a-lowdown.pkg +pkgs/_3b.test.pkg: pkgs/3b-nix.pkg + +all-tests: pkgs/_1.test.pkg +all-tests: pkgs/_2a3.test.pkg +all-tests: pkgs/_2a4.test.pkg +all-tests: pkgs/_2a5.test.pkg +all-tests: pkgs/_2a9.test.pkg +all-tests: pkgs/_2b1.test.pkg +all-tests: pkgs/_3b.test.pkg + +################################################################################ + +.PHONY: all-pkgs +all-pkgs: pkgs/0-tcc-seed.pkg +all-pkgs: pkgs/1-stage1.pkg +all-pkgs: pkgs/2a0-static-gnumake.pkg +all-pkgs: pkgs/2a1-static-binutils.pkg +all-pkgs: pkgs/2a2-static-gnugcc4-c.pkg +all-pkgs: pkgs/2a3-intermediate-musl.pkg +all-pkgs: pkgs/2a4-gnugcc4-cpp.pkg +all-pkgs: pkgs/2a5-gnugcc10.pkg +all-pkgs: pkgs/2a6-linux-headers.pkg +all-pkgs: pkgs/2a7-cmake.pkg +all-pkgs: pkgs/2a8-python.pkg +all-pkgs: pkgs/2a9-intermediate-clang.pkg +all-pkgs: pkgs/2b0-musl.pkg +all-pkgs: pkgs/2b1-clang.pkg +all-pkgs: pkgs/2b2-busybox.pkg +all-pkgs: pkgs/2b3-gnumake.pkg +all-pkgs: pkgs/3a-sqlite.pkg +all-pkgs: pkgs/3a-boost.pkg +all-pkgs: pkgs/3a-mbedtls.pkg +all-pkgs: pkgs/3a-pkg-config.pkg +all-pkgs: pkgs/3a-curl.pkg +all-pkgs: pkgs/3a-editline.pkg +all-pkgs: pkgs/3a-brotli.pkg +all-pkgs: pkgs/3a-gnugperf.pkg +all-pkgs: pkgs/3a-seccomp.pkg +all-pkgs: pkgs/3a-libarchive.pkg +all-pkgs: pkgs/3a-libsodium.pkg +all-pkgs: pkgs/3a-lowdown.pkg +all-pkgs: pkgs/3a-nlohmann-json.pkg +all-pkgs: pkgs/3b-busybox-static.pkg +all-pkgs: pkgs/3b-tinycc-static.pkg +all-pkgs: pkgs/3b-nix.pkg +all-pkgs: pkgs/4-rebootstrap-using-nix.pkg +all-pkgs: pkgs/5-go-beyond-using-nix.pkg + +################################################################################ + +ifeq ($(USE_CCACHE), 1) +pkgs/2a1-static-binutils.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a2-static-gnugcc4-c.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a3-intermediate-musl.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a4-gnugcc4-cpp.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a5-gnugcc10.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a6-linux-headers.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a7-cmake.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a8-python.pkg: pkgs/_2a0-ccache.pkg +pkgs/2a9-intermediate-clang.pkg: pkgs/_2a0-ccache.pkg +pkgs/2b0-musl.pkg: pkgs/_2a0-ccache.pkg +pkgs/2b1-clang.pkg: pkgs/_2a0-ccache.pkg +pkgs/2b2-busybox.pkg: pkgs/_2a0-ccache.pkg +pkgs/2b3-gnumake.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-sqlite.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-boost.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-mbedtls.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-pkg-config.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-curl.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-editline.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-brotli.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-gnugperf.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-seccomp.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-libarchive.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-libsodium.pkg: pkgs/_2a0-ccache.pkg +pkgs/3a-lowdown.pkg: pkgs/_2a0-ccache.pkg +pkgs/3b-busybox-static.pkg: pkgs/_2a0-ccache.pkg +pkgs/3b-tinycc-static.pkg: pkgs/_2a0-ccache.pkg +pkgs/3b-nix.pkg: pkgs/_2a0-ccache.pkg +pkgs/4-rebootstrap-using-nix.pkg: pkgs/_2a0-ccache.pkg +pkgs/5-go-beyond-using-nix.pkg: pkgs/_2a0-ccache.pkg +endif + +################################################################################ + +.PHONY: verify-pkgs-checksums verify-all-pkgs-checksums update-pkgs-checksums +verify-pkgs-checksums: + @status=true; \ + while read expected_csum pkgname; do \ + pkg=$${pkgname%%.tar}.pkg; \ + if [[ ! -e "$$pkg" ]]; then \ + status=false; \ + echo "MISSING $$pkgname"; \ + continue; \ + fi; \ + computed_csum=$$(zstd -qcd "$$pkg" | sha256sum); \ + computed_csum=$$(<<<$$computed_csum tr ' ' '\t' | cut -f1); \ + short_csum=$$(<<<$$computed_csum head -c7); \ + if [[ "$$pkg" == pkgs/0-tcc-seed.pkg ]]; then \ + if ! sha256sum -c <<<"$(TCC_CHECKSUM) tcc-seed" \ + >/dev/null; then \ + echo "$$short_csum pkgs/0.tar CUSTOM"; \ + continue; \ + fi; \ + fi; \ + if make -sq "$$pkg"; then \ + dated=''; \ + else \ + status=false; \ + dated=" OUTDATED"; \ + fi; \ + if [[ "$$expected_csum" == "$$computed_csum" ]]; then \ + echo "$$short_csum $$pkgname OK$$dated"; \ + else \ + status=false; \ + echo "$$short_csum $$pkgname NOT OK$$dated"; \ + echo " computed: $$computed_csum"; \ + echo " expected: $$expected_csum"; \ + fi; \ + done < verify.pkgs.sha256; $$status\ + +verify-all-pkgs-checksums: all-pkgs + $(MAKE) verify-pkgs-checksums + +update-pkgs-checksums: + @:> verify.pkgs.sha256 + @find pkgs | grep '\.pkg$$' | grep -v '\/_' | sort | \ + while read p; do \ + name=$${p%%.pkg}.tar; \ + csum=$$(zstd -qcd "$$p" | sha256sum | tr ' ' '\t' | cut -f1); \ + short_csum=$$(<<<$$csum head -c7); \ + echo "$$csum $$name" >> verify.pkgs.sha256; \ + echo "$$short_csum $$name"; \ + done +verify.pkgs.sha256: all-pkgs update-pkgs-checksums + +nix-checksums-stage4: pkgs/4-rebootstrap-using-nix.pkg + tar tf pkgs/4-rebootstrap-using-nix.pkg store \ + | grep -E 'store/[a-z0-9]{32}-[^/]*/?$$' \ + | sed -E 's|.*/([a-z0-9]{32}-[^/]*)/?|\1|' \ + | sort \ + > nix-checksums-stage4 + +nix-checksums-stage5: pkgs/5-go-beyond-using-nix.pkg + tar Oxf pkgs/5-go-beyond-using-nix.pkg \ + store/5-go-beyond-using-nix/hashes \ + > nix-checksums-stage5 + +verify-all-nix-stage4-checksums: nix-checksums-stage4 verify.nix + @status=true; \ + while IFS=" " read ref_hash pkg; do \ + if grep -Fq "$$ref_hash-bootstrap" nix-checksums-stage4; then \ + echo " $$ref_hash $$pkg"; \ + else \ + status=false; \ + echo "! $$ref_hash $$pkg MISSING"; \ + fi; \ + done < verify.nix; $$status + +verify-all-nix-stage5-checksums: downloads/ZilchOS-core-2023.10.1.tar.gz +verify-all-nix-stage5-checksums: nix-checksums-stage5 verify.nix + @status=true; \ + tar -Oxf downloads/ZilchOS-core-2023.10.1.tar.gz \ + --wildcards */.maint/hashes | \ + while IFS=' ' read ref_hash pkg; do \ + stage5_hash=$$(grep " $$pkg$$" nix-checksums-stage5 \ + | sed -E 's|^([a-z0-9]{32}) .*|\1|'); \ + if [[ "$$ref_hash" == "$$stage5_hash" ]]; then \ + echo " $$ref_hash $$pkg"; \ + else \ + status=false; \ + echo "- $$ref_hash $$pkg"; \ + echo "+ $$stage5_hash $$pkg"; \ + fi; \ + done; $$status +NIX_BUILD_X = nix build --no-warn-dirty --option substitute false --no-link +verify-nix-plain-checksums: verify.nix + @status=true; \ + while IFS=" " read ref_hash pkg; do \ + plain_hash=$$($(NIX_BUILD_X) ".#$$pkg" --print-out-paths \ + | sed -E 's|.*/([a-z0-9]{32})-.*|\1|'); \ + if [[ "$$ref_hash" == "$$plain_hash" ]]; then \ + echo " $$ref_hash $$pkg"; \ + else \ + status=false; \ + echo "- $$ref_hash $$pkg"; \ + echo "+ $$plain_hash $$pkg"; \ + fi; \ + done < verify.nix; $$status + +verify-all-nix-plain-checksums: verify.nix + @$(NIX_BUILD_X) '.#toolchain' '.#libc' '.#musl' + @$(MAKE) verify-nix-plain-checksums + +################################################################################ + +clean-tmp: + @echo "### Makefile: removing tmp, keeping stage, pkgs and downloads..." + rm -rf tmp + +clean-stage: + @echo "### Makefile: removing stage, keeping tmp, pkgs and downloads..." + rm -rf stage + +clean: + @echo "### Makefile: removing stage, tmp, pkgs, iso, keeping downloads..." + rm -rf stage tmp pkgs \ + nix-checksums-stage4 nix-checksums-stage5 \ + nix-checksums-stage5-custom \ + ZilchOS-core.iso ZilchOS-core-raw.iso + +deepclean: + @echo "### Makefile: removing stage, tmp, pkgs, iso and downloads..." + rm -rf stage tmp pkgs downloads \ + nix-checksums-stage4 nix-checksums-stage5 \ + nix-checksums-stage5-custom \ + ZilchOS-core.iso ZilchOS-core-raw.iso diff --git a/06/README.md b/06/README.md new file mode 100644 index 0000000..769549a --- /dev/null +++ b/06/README.md @@ -0,0 +1,212 @@ +# `bootstrap-from-tcc` + +## What + +Bootstrap a modern toolchain for [ZilchOS Core](https://github.com/ZilchOS/core) +starting from a random trusted statically linked seed tcc +(+ trusted kernel on trusted hardware, of course). + +~320 KB binary + gigs of sources = a modern Clang + musl toolchain, +usable for building much more serious stuff. + +My goal is to beeline for bootstrapping Nix package manager, +then bootstrap a usable toolchain using Nix. +But even if you don't care about Nix, +this repo might be of some interest for minimal binary seed bootstrappers. + +Separate packages aren't just dumped into `/`, they're properly managed, +each one residing in its own prefix under `/store`. + +`x86_64`-only for now, possibly forever. + +## Why + +I wanted to build a minimal distro to understand NixOS better, +so I decided to have a decent trusted binary core bootstrap as well. + +Could be of use for bootstrapping other distributions. + +I'm aware of https://savannah.nongnu.org/projects/stage0 which does even better, +but I'm not as hardcore as them, so, let's start small. + +## How + +### In brief + +Compiler chain so far (`recipes`): +input TinyCC -> stable TinyCC -> GNU GCC 4 -> GNU GCC 10 -> -> Clang + +`recipes/1-stage1.c` is the most fun, since we don't have libc yet. + +Then I build Nix and start the entire bootstrapping chain all over again, +but now using that Nix I've built (`using-nix`). + +### Outlined bootstrap order + +* stage 0: seeded binary `tcc` +* stage 1 (`recipes/1-stage1.c` / `using-nix/1-stage1.nix`, no libc): + * `libtcc1` + * `protomusl` + * `tcc` + * `libtcc1` + * `protomusl` + * `tcc` that is gonna be the final one + * `libtcc1` + * `protomusl` + * `tcc` that we build just to prove the finality of the previous one + * `protobusybox` +* stage 2 "compiler ascension" part (`recipes/2a*.sh` / `using-nix/2a*.nix`): + * `gnumake` + * `binutils` + * `gnugcc4` + * `musl` + * `gnugcc4` + * `gnugcc10` + * `linux-headers` + * `cmake` + * `python` + * `clang` +* stage 2 "build with the new compiler" part (`recipes/2b*.sh`): + * `musl` + * `clang` + * `busybox` + * `gnumake` +* stage 3 "dependencies of useful stuff" (`recipes/3a*.sh`): ??? + * `sqlite` + * `boost` + * `mbedtls` + * `pkg-config` + * `curl` + * `editline` + * `brotli` + * `gnugperf` + * `seccomp` + * `libarchive` + * `libsodium` + * `lowdown` +* stage 3 "useful stuff" (`recipes/3b*.sh`): ??? + * `busybox-static` + * `tinycc-static` (1st time only) + * `nix` + +Then repeat stage 1 and most of stage 2 all over again, but under Nix. +The final exports of this flake are musl, clang toolchain and a busybox +that ZilchOS Core later bootstraps from. + +* stage 4 "rebootstrap with nix" (`recipes/4-rebootstrap-using-nix.sh`): + build the toolchain again from scratch, but using nix (`using-nix/`) + +* stage 5 "go beyond using nix" (`recipes/5-go-beyond-using-nix.sh`): + build some stale version of [ZilchOS Core](https://github.com/ZilchOS/core) + with the nix we've built, culminating with a bootable ZilchOS ISO. + +### In more detail + +given: + +* **statically linked target tcc (`tcc-seed`, you have to provide it)** +* host `unshare` for `chroot`ing and isolation +* host `wget`, `tar`, `gzip`, `bzip2`, `sha256sum`, `tar` + for optional convenient fetching of source files in stage 0 +* host `sed` to preprocess the sources needed for stage 1, unfortunately +* a replacement for `musl/arch/x86_64/syscall_arch.h` that works with tcc + (`syscall.h`) +* a bunch of sources to execute along the way + +`download.sh" downloads a ton of sources, scraping hashes/URLs from recipes + +`seed.sh` seeds: + +* unpacks sources into the stage area +* FIXME: uses host `sed`/`rm` for preprocessing stage 1 source code, + unfortunately +* copies `seed-tcc`, the only starting binary, into the stage area + +At the end of it we obtain +a ton of sources and a single externally seeded `tcc` binary. + +`recipes/1-stage1.c`, executed with `tcc -run`: + +* compiles a `libtcc1.a` from `tinycc` sources +* compiles a protomusl `libc.a` and others from `musl` sources +* compiles the first `tcc` that comes from our sources +* recompiles `libtcc1.a` from `tinycc` sources +* recompiles protomusl `libc.a` and others from `musl` sources +* recompiles our `tcc` with our `tcc` +* recompiles `libtcc1.a` from `tinycc` sources just in case +* recompiles protomusl `libc.a` and others from `musl` sources just in case +* compiles and links standalone applets out of busybox, notably `ash` +* copies over protomusl include files +* recompiles `tcc` once again + and verifies that we've previously reached a stability point + +At the end of stage 1 we have, all linked statically: + +* a `tcc` (+ `libtcc` + `libtcc1`) that recompiles to same binary +* a protomusl `libc.a` (+ crt stuff) +* select standalone busybox applets, most notably `ash` + +`stage2.sh`, executed with protobusybox `ash`: + +* Performs 'compiler ascension' from tcc to GNU GCC 4: + * `gnumake`, intermediate, built without make + * `gnumake`, statically linked + * `binutils`, statically linked + * `gnugcc4`, statically linked + * `musl`, now a shared library as well + * `gnugcc4` with C++ support and linking to a shared musl + * `gnugcc10` + * `linux-headers` (clang & cmake dependency) + * `cmake` (clang dependency) + * `python` (clang dependency, presumably) + * `clang`, intermediate, 2-stage + +* Recompile the world with clang, free of GNU runtime libs: + * `musl`, final + * `clang`, final + * `busybox`, final + * `gnumake`, final + +* Build a bunch of Nix dependencies +* Build Nix + +* Start over, build toolchain, build ZilchOS Core + +### Building options + +There are three major ways to build it. + +If you have Nix and want to skip the first half that bootstraps Nix, +you can just `nix build`, but what's the fun in taking shortcuts =). +You'll need `experimental-features = nix-command flakes ca-derivations`. + +If you want to do a full bootstrap with all imaginable speedups enabled, +try something to the tune of +`make all-pkgs all-tests verify-all-pkgs-checksums -j2 NPROC=$(nproc) USE_CCACHE=1 USE_NIX_CACHE=1`. +Dependencies: host GNU Make, host zstd, basic host stuff like sed and bash, +a target TinyCC you supply or Nix to build you one. +This is the recommended way, especially shining when you +iteratively debug reproducibility-unrelated build problems. +Consider mounting `tmp/build` as tmpfs with 8G size. + +Finally, the least-dependency way is `NPROC=$(nproc) ./build.sh`. +This one doesn't even need GNU Make or zstd, +but there are zero intermediate checkpoints, you always start all over. +Very impractical, this is for increased portability only. + +### Reproducibility + +Reproducibility is deeply cared about, +but it's a constant struggle and one cannot foresee everything. + +Hashes are checked for intermediate steps for both `make` and `nix` builds. +`raw` builds only verify the resulting ZilchOS Core ISO built during stage5. +I try to build on different machines and note down the results in `git notes`. +Commits require a specific (but adjustable) amount of successful +`make`, `raw` and `nix` before getting into the main branch. +Refer to `make all-with-make`, `make all-raw` and `make all-with-nix` +to see what exactly is being tested. + +For hard mode, you can try `USE_DISORDERFS`. + +For ZilchOS/core, see `.maint/hashes` and `.maint/tools/hashes`. diff --git a/06/build-using-nix.sh b/06/build-using-nix.sh new file mode 100755 index 0000000..21d25e1 --- /dev/null +++ b/06/build-using-nix.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# this is entirely optional and for development purposes only +# just use `nix-build` and you should be fine + +# build with ccache and without /bin/sh present +# your nix needs experimental-options = ca-derivations +# and you need root access / to be a trusted user + +set -ue + +CCACHE_HOST=/var/cache/ccache +mkdir -p $CCACHE_HOST/data +sudo chgrp nixbld $CCACHE_HOST $CCACHE_HOST/data +sudo chmod g+ws $CCACHE_HOST $CCACHE_HOST/data + +if [[ ! -e $CCACHE_HOST/bin/ccache ]]; then + nix build 'nixpkgs#pkgsStatic.ccache' --out-link $CCACHE_HOST/result + mkdir -p $CCACHE_HOST/bin + cp --reflink=auto $CCACHE_HOST/result/bin/ccache $CCACHE_HOST/bin/ccache + rm $CCACHE_HOST/result +fi + +[[ -e $CCACHE_HOST/setup ]] || cat > $CCACHE_HOST/setup <<\EOF +mkdir -p .ccache-wrappers +for prefix in '' x86_64-linux- x86_64-linux-musl- x86_64-linux-unknown-; do + for name in cc c++ gcc g++ clang clang++ tcc; do + if command -v $prefix$name; then + ln -s /ccache/bin/ccache .ccache-wrappers/$prefix$name + fi + done +done +export PATH="$(pwd)/.ccache-wrappers:/ccache/bin:$PATH" +export CCACHE_DIR="/ccache/data/$1" +export CCACHE_COMPILERCHECK=content +export CCACHE_SLOPPINESS=include_file_ctime,include_file_mtime +export CCACHE_MAXSIZE=0 +export CCACHE_UMASK=005 +export CCACHE_NOHASHDIR=1 +export CCACHE_BASEDIR="$(pwd)" +EOF +chmod +x $CCACHE_HOST/setup + +nix-build -A stage1.protomusl +nix-build -A stage1.protobusybox +nix-build -A stage1.tinycc +sudo env "NIX_CONFIG=sandbox-paths = /ccache=$CCACHE_HOST" nix-build "$@" diff --git a/06/build.sh b/06/build.sh new file mode 100755 index 0000000..5f896b7 --- /dev/null +++ b/06/build.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +# This is the straigthforward bootstrapping way. +# Prepare a directory with the initial TinyCC compiler, and a ton of sources. +# Then exec into it and let it bootstrap itself. + +# You can refer to the Makefile for a more refined, totally optional approach +# with incremental builds, better build isolation etc. + +set -uex + +export NPROC=${NPROC:-${1:-1}} + +cp ../05/tcc-final/tcc tcc-seed + +if [[ ! -e tcc-seed ]]; then + echo 'You need to supply a statically linked TinyCC as `tcc-seed`.' + echo -n 'You can `./compile-tcc-seed-with-nix.sh` ' + echo 'if you have `nix` and trust in me.' + exit 1 +fi + +# Create a stage directory +mkdir -p stage + +# Download all the required source files +./download.sh + +# Inject initial tcc and our scripts; pre-unpack and patch stage 1 sources, +# in a separate file because it makes sense to run it separately sometimes. +./seed.sh + +# Exec into stage1.c inside stage with env unset, +# without network, with EUID=EGID=0 and with /dev/null being a /dev/null. +# See helpers/chroot and helpers/chroot-inner for more explanations +# Alternatively, you can chroot if you're not a fan of user namespaces. +MOUNT=$(command -v mount) +if [[ -e /run/wrappers/bin/mount.real ]]; then # NixOS wrapper might be buggy + MOUNT=$(cat /run/wrappers/bin/mount.real) +fi +MKDIR=$(command -v mkdir) +CHROOT=$(command -v chroot) + +exec env -i "NPROC=$NPROC" unshare -nrm bash -uexs < stage/dev/null + $MOUNT --bind /dev/null stage/dev/null + + exec $CHROOT stage \ + /store/0-tcc-seed -I /protosrc/tinycc/include -nostdinc -nostdlib -Werror -run \ + -DCHAINLOAD='"/recipes/all-past-stage1.sh"' \ + /recipes/1-stage1.c +EOF + +# There's no next step, +# upon completion stage1.c will exec into recipes/all-past-stage1.sh diff --git a/06/compile-tcc-seed-with-nix.sh b/06/compile-tcc-seed-with-nix.sh new file mode 100755 index 0000000..7054e28 --- /dev/null +++ b/06/compile-tcc-seed-with-nix.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -uexo pipefail + +NIXPKGS_HASH=21f524672f25f8c3e7a0b5775e6505fee8fe43ce +TCC_CHECKSUM=05aad934985939e9997127e93d63d6a94c88739313c496f10a90176688cc9167 +TCC=$(nix build "nixpkgs/$NIXPKGS_HASH#pkgsStatic.tinycc.out" \ + --no-link --print-out-paths) +cat $TCC/bin/tcc > tcc-seed +chmod +x tcc-seed +S="$TCC_CHECKSUM tcc-seed" +sha256sum tcc-seed +sha256sum -c <<<$S diff --git a/06/default.nix b/06/default.nix new file mode 100644 index 0000000..f4c36d9 --- /dev/null +++ b/06/default.nix @@ -0,0 +1,144 @@ +let + # stage 0 + + # these two use nixpkgs, but are fixed-output derivations with no dependencies + tcc-seed = (import ./using-nix/0.nix).tinycc; + protosrc = (import ./using-nix/0.nix).protosrc; + # in bootstrapping builds, + # 0.nix is different and they're not coming from nixpkgs, + # see recipes/4-rebootstrap-using-nix.sh + + # stage 1 + + stage1 = (import ./using-nix/1-stage1.nix) { + inherit tcc-seed protosrc; + recipesStage1ExtrasPath = ./recipes/1-stage1; + stage1cPath = ./recipes/1-stage1.c; + }; # multioutput, offers .protobusybox, .protomusl and .tinycc + + # stage 2 + + mkCaDerivation = args: derivation (args // { + system = "x86_64-linux"; + __contentAddressed = true; + outputHashAlgo = "sha256"; outputHashMode = "recursive"; + }); + + mkDerivationStage2 = + {name, script, buildInputPaths, extra ? {}}: mkCaDerivation { + inherit name; + builder = "${stage1.protobusybox}/bin/ash"; + args = [ "-uexc" ( + '' + export PATH=${builtins.concatStringsSep ":" buildInputPaths} + + if [ -e /ccache/setup ]; then + . /ccache/setup bootstrap-from-tcc/${name} + fi + + unpack() (tar --strip-components=1 -xf "$@") + + if [ -n "$NIX_BUILD_CORES" ] && [ "$NIX_BUILD_CORES" != 0 ]; then + NPROC=$NIX_BUILD_CORES + elif [ "$NIX_BUILD_CORES" == 0 ] && [ -r /proc/cpuinfo ]; then + NPROC=$(grep -c processor /proc/cpuinfo) + else + NPROC=1 + fi + '' + script + ) ]; + } // extra; + + fetchurl = { url, sha256 }: derivation { + name = builtins.baseNameOf url; + inherit url; + urls = [ url ]; + unpack = false; + + builder = "builtin:fetchurl"; + system = "builtin"; + outputHashMode = "flat"; outputHashAlgo = "sha256"; + preferLocalBuild = true; + outputHash = sha256; + }; + + static-gnumake = (import using-nix/2a0-static-gnumake.nix) { + inherit fetchurl mkDerivationStage2 stage1; + }; + + static-binutils = (import using-nix/2a1-static-binutils.nix) { + inherit fetchurl mkDerivationStage2 stage1 static-gnumake; + }; + + static-gnugcc4-c = (import using-nix/2a2-static-gnugcc4-c.nix) { + inherit fetchurl mkDerivationStage2 stage1 static-gnumake static-binutils; + }; + + intermediate-musl = (import using-nix/2a3-intermediate-musl.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils static-gnugcc4-c; + }; + + gnugcc4-cpp = (import using-nix/2a4-gnugcc4-cpp.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils static-gnugcc4-c; + inherit intermediate-musl; + }; + + gnugcc10 = (import using-nix/2a5-gnugcc10.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils gnugcc4-cpp intermediate-musl; + }; + + linux-headers = (import using-nix/2a6-linux-headers.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils gnugcc10; + }; + + cmake = (import using-nix/2a7-cmake.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils gnugcc10 linux-headers; + }; + + python = (import using-nix/2a8-python.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils gnugcc10; + }; + + intermediate-clang = (import using-nix/2a9-intermediate-clang.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake static-binutils intermediate-musl gnugcc10; + inherit linux-headers cmake python; + }; + + musl = (import using-nix/2b0-musl.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake intermediate-clang; + }; + + clang = (import using-nix/2b1-clang.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake musl intermediate-clang; + inherit linux-headers cmake python; + }; + + busybox = (import using-nix/2b2-busybox.nix) { + inherit fetchurl mkDerivationStage2; + inherit stage1 static-gnumake musl clang linux-headers; + }; + +in + { + # exposed just because; don't rely on these + inherit protosrc tcc-seed; + inherit stage1; + inherit static-gnumake static-binutils static-gnugcc4-c; + inherit intermediate-musl gnugcc4-cpp gnugcc10; + inherit linux-headers cmake python intermediate-clang; + inherit musl clang; + + # public interface: + libc = musl; # some libc that TODO: doesn't depend on anything else + toolchain = clang; # some modern C/C++ compiler targeting this libc + busybox = busybox; # a freebie busybox TODO: depending on just libc + } diff --git a/06/download.sh b/06/download.sh new file mode 100755 index 0000000..5e352fb --- /dev/null +++ b/06/download.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash + +# Receives files as arguments, scans them for lines like +# #> FETCH dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3 +# #> FROM http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz +# #> AS make.tar.gz +# or +# #local = "/downloads/make.tar.gz"; +# url = "http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz"; +# sha256 = "dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3"; +# downloads to ./downloads if file's not present there yet, verifies hash, +# copies file over to $DESTDIR. + +set -ue + +: ${DESTDIR:=stage/downloads} # final location of putting the file +: ${ONLY:=all} # allow to limit to just a single file +mkdir -p downloads # first cached there, so that stage can be cleaned freely + +fetch() { + hash=$1; url=$2; filename=${3:-$(basename "$url")} + if [[ -e "downloads/$filename" ]]; then + pushd downloads >/dev/null + echo "$hash $filename" | sha256sum -c + popd >/dev/null + else + mkdir -p downloads/.tmp$$ + pushd downloads/.tmp$$ >/dev/null + wget -nv --show-progress "$url" -O "$filename" + echo "$hash $filename" | sha256sum -c --quiet + popd >/dev/null + mv "downloads/.tmp$$/$filename" downloads/ + rm -d downloads/.tmp$$ + fi + if [[ "${DESTDIR:-}" != downloads ]]; then + mkdir -p "$DESTDIR" + cp -a --reflink=auto "downloads/$filename" \ + "$DESTDIR/$filename" + fi +} + +REGEX_MAGIC='^#> ' +REGEX_FETCH='^#> FETCH' +REGEX_FROM='^#> FROM' +REGEX_AS='^#> AS' +NIX_REGEX_FETCH='^[[:blank:]]*sha256[[:blank:]]*=[[:blank:]]*"(.*)";$' +NIX_REGEX_FROM='^[[:blank:]]*url[[:blank:]]*=[[:blank:]]*"(.*)";$' +NIX_REGEX_AS='^[[:blank:]]*#[[:blank:]]local[[:blank:]]*=[[:blank:]]*/downloads/(.*);$' +process_commands_in() { + hash=''; url=''; filename='' + while read -r line; do + if [[ "$line" =~ $REGEX_MAGIC ]]; then + if [[ "$line" =~ $REGEX_FETCH ]]; then + hash="${line##"#> FETCH"}" + elif [[ "$line" =~ $REGEX_FROM ]]; then + url="${line##'#> FROM '}" + elif [[ "$line" =~ $REGEX_AS ]]; then + filename="${line##'#> AS '}" + else + echo "### $0: malformed line '$line' in '$1'" + exit 2 + fi + elif [[ "$line" =~ $NIX_REGEX_FETCH ]]; then + hash=${BASH_REMATCH[1]} + elif [[ "$line" =~ $NIX_REGEX_FROM ]]; then + url=${BASH_REMATCH[1]} + elif [[ "$line" =~ $NIX_REGEX_AS ]]; then + filename=${BASH_REMATCH[1]} + else + if [[ -n "$hash" && -n "$url" ]]; then + filename=${filename:-$(basename $url)} + if [[ "$ONLY" == all || \ + "$ONLY" == "$filename" ]]; then + fetch "$hash" "$url" "$filename" + fi + fi + hash=''; url=''; filename='' + fi + done < $1 +} + +[[ $# == 0 ]] && files='recipes/*.sh recipes/*/*.sh' || files="$@" +for f in $files; do + process_commands_in $f +done diff --git a/06/flake.nix b/06/flake.nix new file mode 100644 index 0000000..360ce1b --- /dev/null +++ b/06/flake.nix @@ -0,0 +1,15 @@ +{ + description = "bootstrap-from-tcc"; + + outputs = { self }: + let + allPkgs = (import ./default.nix); + in + { + packages.x86_64-linux = allPkgs; + + # TODO: expose only the most usable outputs + # TODO: solve fetching: https://discourse.nixos.org/t/17105 + hydraJobs = builtins.mapAttrs (_: drv: { x86_64-linux = drv; }) allPkgs; + }; +} diff --git a/06/helpers/builddir b/06/helpers/builddir new file mode 100755 index 0000000..c8f68b7 --- /dev/null +++ b/06/helpers/builddir @@ -0,0 +1,70 @@ +#!/bin/sh + +: ${DISORDER=0} + +set -uex + +verb=$1 +front=$2 +back=$front-back + +[ "tmp/build/${front#tmp/build/}" = "$front" ] +[ "tmp/build/${back#tmp/build/}" = "$back" ] + +remove_hard() { + if [ -e "$1" ]; then + sudo umount "$1" 2>/dev/null || true + if ! rm -rf "$1" 2>/dev/null; then + chmod -R +w "$1" + rm -rf "$1" + fi + fi +} + +if [ "$verb" = create ]; then + echo "### helpers/builddir: creating $front..." + remove_hard "$front"; remove_hard "$back" + mkdir -p "$front" + if [ "$DISORDER" = 1 ]; then + sudo umount "$back" || true + rm -rf "$back" + mkdir -p "$front" "$back" + sudo mount -o size=16G -t tmpfs tmpfs "$back" + sudo mount --bind "$back" "$front" + [ $(findmnt -no FSTYPE "$front") = tmpfs ] + fi +elif [ "$verb" = pre-build ]; then + [ -e "$front" ] + if [ "$DISORDER" = 1 ]; then + echo "### helpers/builddir: disordering $front..." + [ -e "$back" ] + [ $(findmnt -no FSTYPE "$back") = tmpfs ] + sudo umount "$front" + sudo disorderfs --shuffle-dirents=yes \ + -o allow_other --multi-user=yes \ + "$back" "$front" + [ $(findmnt -no FSTYPE "$front") = fuse.disorderfs ] + fi +elif [ "$verb" = post-build ]; then + if [ "$DISORDER" = 1 ]; then + echo "### helpers/builddir: ordering $front..." + [ ! -e "$front" ] && [ ! -e "$back" ] + [ $(findmnt -no FSTYPE "$front") = fuse.disorderfs ] + [ $(findmnt -no FSTYPE "$back") = tmpfs ] + sudo umount "$front" + sudo mount --bind "$back" "$front" + fi +elif [ "$verb" = remove ]; then + echo "### helpers/builddir: removing $front..." + if [ "$DISORDER" = 1 ]; then + [ $(findmnt -no FSTYPE "$back") = tmpfs ] + sudo umount "$front" + sudo umount "$back" + rm -d "$front" "$back" + else + remove_hard "$front"; remove_hard "$back" + fi + [ ! -e "$front" ] && [ ! -e "$back" ] +else + exit 9 +fi diff --git a/06/helpers/cheat b/06/helpers/cheat new file mode 100755 index 0000000..a8edb7f --- /dev/null +++ b/06/helpers/cheat @@ -0,0 +1,49 @@ +#!/bin/sh +set -ue + +NIXPKGS=nixpkgs/21f524672f25f8c3e7a0b5775e6505fee8fe43ce +: ${DESTDIR:=stage} + +mkdir -p $DESTDIR/cheat + +if [ ! -e $DESTDIR/cheat/make ]; then + nix build "$NIXPKGS#pkgsStatic.gnumake" + cp result/bin/make $DESTDIR/cheat/make + rm result +fi + +if [ ! -e $DESTDIR/cheat/bash ]; then + nix build "$NIXPKGS#pkgsStatic.bash" + cp result/bin/bash $DESTDIR/cheat/bash + rm result +fi + +if [ ! -e $DESTDIR/cheat/strace ]; then + nix build "$NIXPKGS#pkgsStatic.strace" + cp result/bin/strace $DESTDIR/cheat/ + rm result +fi + +if [ ! -e $DESTDIR/cheat/busybox ]; then + nix build "$NIXPKGS#pkgsStatic.busybox" + cp result/bin/busybox $DESTDIR/cheat/busybox + for f in $(ls result/bin/); do + [ $(basename $f) = busybox ] || + ln -s /cheat/busybox $DESTDIR/cheat/$(basename $f) + done + rm result +fi + +if [ -z "$@" ]; then + _PATH='' + for bindir in $DESTDIR/store/*/bin $DESTDIR/store/*/*/bin; do + _PATH="${bindir##$DESTDIR}:$_PATH" + done + LIBC=$(find $DESTDIR/store/*/lib/libc.so | tail -n1) + if [ -n "$LIBC" ] && [ ! -h $DESTDIR/cheat/ldd ]; then + ln -s "${LIBC##$DESTDIR}" $DESTDIR/cheat/ldd + fi + helpers/chroot /cheat/env "PATH=$_PATH" /cheat/ash +else + helpers/chroot "$@" +fi diff --git a/06/helpers/chroot b/06/helpers/chroot new file mode 100755 index 0000000..b8cdd65 --- /dev/null +++ b/06/helpers/chroot @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Run a command chrooted inside $DESTDIR w/o network, with /dev/null, outline: +# +# [helpers/chroot, outer script] +# / unshare +# | -n # without network +# | -r # with EUID=EGID=0 +# \ -m # separate mount namespace +# [helpers/chroot-inner, this script] +# mount --bind /dev/null $DESTDIR/dev/null # unprivileged /dev/null! +# && +# env -i # with env unset +# chroot $DESTDIR # unprivileged chroot! + +set -uex + +exec unshare -nrm helpers/chroot-inner "$@" diff --git a/06/helpers/chroot-inner b/06/helpers/chroot-inner new file mode 100755 index 0000000..e13ae2b --- /dev/null +++ b/06/helpers/chroot-inner @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# Run a command chrooted inside $DESTDIR w/o network, with /dev/null, outline: +# +# [helpers/chroot, outer script] +# unshare +# -n # without network +# -r # with EUID=EGID=0 +# -m # separate mount namespace +# [helpers/chroot-inner, this script] +# / mount --bind /dev/null $DESTDIR/dev/null # unprivileged /dev/null! +# | && +# | env -i # with env unset +# \ chroot $DESTDIR # unprivileged chroot! + +set -uex + +: ${DESTDIR:=stage} +: ${NPROC:=1} +: ${SOURCE_DATE_EPOCH:=0} + +CHROOT=$(command -v chroot) +if [[ ! -x "$CHROOT" ]]; then + if [[ -x /sbin/chroot ]]; then + CHROOT=/sbin/chroot + elif [[ -x /usr/sbin/chroot ]]; then + CHROOT=/usr/sbin/chroot + fi +fi + +if [[ -e /run/wrappers/bin/mount.real ]]; then + MOUNT=$(cat /run/wrappers/bin/mount.real) +else + MOUNT=mount +fi +mkdir -p "$DESTDIR/dev"; :> "$DESTDIR/dev/null" +$MOUNT --bind /dev/null "$DESTDIR/dev/null" + +exec env -i "NPROC=$NPROC" "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" \ + $CHROOT "$DESTDIR" "$@" diff --git a/06/helpers/inject b/06/helpers/inject new file mode 100755 index 0000000..1a3beb6 --- /dev/null +++ b/06/helpers/inject @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -uex + +DESTDIR=$1 +shift + +for arg; do + if [[ "$arg" =~ .*\.pkg ]]; then + # That one's for package dependencies + tar -xf "$arg" -Izstd -C "$DESTDIR" + else + # That one's for copying over downloads and sources + if [[ ! -e "./$DESTDIR/$arg" || "$arg" -nt "./$DESTDIR/$arg" ]] + then + echo "Copying $arg into $DESTDIR..." + mkdir -p "$DESTDIR/$(dirname "$arg")" + cp -a --reflink=auto "$arg" "$DESTDIR/$arg" + fi + fi +done diff --git a/06/helpers/maint/build-custom-stage5 b/06/helpers/maint/build-custom-stage5 new file mode 100755 index 0000000..470b955 --- /dev/null +++ b/06/helpers/maint/build-custom-stage5 @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +set -uexo pipefail + +CUSTOM_CORE_DIR=$1 + +# Determine where to start from +if [[ -e pkgs/custom-stage5.pkg ]]; then + BASE=pkgs/custom-stage5.pkg +elif [[ -e pkgs/5-go-beyond-using-nix.pkg ]]; then + BASE=pkgs/5-go-beyond-using-nix.pkg +elif [[ -e pkgs/4-rebootstrap-using-nix.pkg ]]; then + BASE=pkgs/4-rebootstrap-using-nix.pkg +else + [[ "${USE_CCACHE-}" = 1 ]] && FLAGS='USE_CCACHE=1' || FLAGS='' + [[ -n "${NPROC-}" ]] && FLAGS="$FLAGS NPROC=$NPROC" || FLAGS='' + make $FLAGS pkgs/5-go-beyond-using-nix.pkg + BASE=pkgs/5-rebootstrap-using-nix.pkg +fi + +# Inject stage5 pkg dependencies +DESTDIR=tmp/build/custom-stage5 +helpers/builddir create "$DESTDIR" +grep -E '^pkgs/5-go-beyond-using-nix.pkg:' Makefile \ + | grep -v '^pkgs/5-go-beyond-using-nix.pkg: downloads/' \ + | grep -v 'pkgs/5-go-beyond-using-nix.pkg: pkgs/_2a0-ccache.pkg$' \ + | sed 's|^pkgs/5-go-beyond-using-nix.pkg: ||' \ + | while IFS= read -r dep; do helpers/inject "$DESTDIR" "$dep"; done +helpers/inject "$DESTDIR" recipes/5-go-beyond-using-nix.sh + +# Inject BASE and its nixdb +helpers/inject "$DESTDIR" "$BASE" +mkdir -p "$DESTDIR/prev/" +tar --strip-components=2 -xf $BASE -C "$DESTDIR/prev/" +rm -f "$DESTDIR/store/5-go-beyond-using-nix/ZilchOS-core.iso" + +# Inject ccache data, all stage5 ccache data we can find +if [[ "${USE_CCACHE-}" = 1 ]]; then + helpers/inject "$DESTDIR" pkgs/_2a0-ccache.pkg + unshare -nr chroot "$DESTDIR" /store/_2a0-ccache/bin/ccache -z + if [[ -e tmp/ccache/5-go-beyond-using-nix.tar.zstd ]]; then + tar -Izstd -xf tmp/ccache/5-go-beyond-using-nix.tar.zstd \ + -C "$DESTDIR/ccache" + fi + if [[ -e tmp/ccache/custom-stage5.tar.zstd ]]; then + tar -Izstd -xf tmp/ccache/custom-stage5.tar.zstd \ + -C "$DESTDIR/ccache" + fi + ln -sf /store/_2a0-ccache/wrap-available "$DESTDIR/ccache/setup" + ln -sf /store/_2a0-ccache/bin "$DESTDIR/ccache/bin" +fi +helpers/builddir pre-build "$DESTDIR" + +# Inject custom ZilchOS Core code +DESTCORE="$DESTDIR/tmp/5-go-beyond-using-nix/ZilchOS-core" +mkdir -p "$DESTCORE" +rm -rf "$DESTCORE" # TODO: REMOVE +cp -r "$CUSTOM_CORE_DIR" "$DESTCORE" +rm -rf "$DESTCORE/.git" +[[ -e $DESTCORE/flake.nix ]] +hashes=$(cat $CUSTOM_CORE_DIR/.maint/hashes) + +# Inject custom required downloads +DESTDIR="$DESTDIR/downloads" ./download.sh $(find $DESTCORE -name '*.nix') + +DESTDIR="$DESTDIR" NPROC="${NPROC-}" \ + ./helpers/chroot /recipes/5-go-beyond-using-nix.sh + +cat tmp/build/custom-stage5/store/5-go-beyond-using-nix/hashes \ + > nix-checksums-stage5-custom + +# Collect results back +tar -Izstd -cf "pkgs/custom-stage5.pkg" \ + -C "$DESTDIR" "store/5-go-beyond-using-nix" + +# Collect ccache back +if [[ "${USE_CCACHE-}" = 1 ]]; then + unshare -nr chroot "$DESTDIR" /store/_2a0-ccache/bin/ccache -sz + tar -Izstd -cf "tmp/ccache/custom-stage5.tar.zstd" \ + -C "$DESTDIR/ccache" . +fi + +helpers/builddir post-build "$DESTDIR" +helpers/builddir remove "$DESTDIR" + +set +x +status=true +while IFS=' ' read ref_hash pkg; do + stage5_hash=$(grep " $pkg$" nix-checksums-stage5-custom \ + | sed -E 's|^([a-z0-9]{32}) .*|\1|'); + if [[ "$ref_hash" == "$stage5_hash" ]]; then + echo " $ref_hash $pkg"; + else + status=false; + echo "- $ref_hash $pkg"; + echo "+ $stage5_hash $pkg"; + fi +done <<<"$hashes"; $status diff --git a/06/helpers/maint/is-tested-enough b/06/helpers/maint/is-tested-enough new file mode 100755 index 0000000..faf61f9 --- /dev/null +++ b/06/helpers/maint/is-tested-enough @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +set -ueo pipefail + +COMMIT=${1-HEAD} + +commit=$(git show -s --no-notes "$COMMIT") +echo "$commit" +if grep -q '^\s*Builds-required: none$' <<<"$commit"; then + echo '---' + echo '`Builds-required: none` in commit message, skipping commit' + exit 0 +fi +echo '---' + +if grep -q '^\s*Builds-required: ' <<<"$commit"; then + verification_line=$(grep '^\s*Builds-required:' <<<"$commit") + verspec=$(sed 's|^\s*Builds-required:||' <<<"$verification_line") + if ! grep -Eq '^ make=[0-9]+ raw=[0-9]+ nix=[0-9]+$' <<<"$verspec"; then + echo 'Malformed `Builds-required:` line' >&2 + exit 7 + fi + required_make=$(sed -E 's|.* make=([0-9]+).*|\1|' <<<"$verspec") + (( required_make >= 0 )) + required_raw=$(sed -E 's|.* raw=([0-9]+).*|\1|' <<<"$verspec") + (( required_raw >= 0 )) + required_nix=$(sed -E 's|.* nix=([0-9]+).*|\1|' <<<"$verspec") + (( required_nix >= 0 )) +else + required_make=2 + required_raw=1 + required_nix=2 +fi + +git fetch origin refs/notes/commits:refs/notes/commits +notes=$(git notes show "$COMMIT" \ + | grep ^Built-on: \ + | grep -v USE_CCACHE \ + | sort -u) +using_make=$(grep -Fw how=make <<<"$notes" | wc -l) || true +using_raw=$(grep -Fw how=raw <<<"$notes" | wc -l) || true +using_nix=$(grep -Fw how=nix <<<"$notes" | wc -l) || true +echo "$notes" + +status=true +text="" +if (( using_make < required_make )); then + text+="Not enough how=make commits: $using_make < $required_make\n" + status=false +fi +if (( using_raw < required_raw )); then + text+="Not enough how=raw commits: $using_raw < $required_raw\n" + status=false +fi +if (( using_nix < required_nix )); then + text+="Not enough how=nix commits: $using_nix < $required_nix\n" + status=false +fi + +echo '---' +echo "${using_make} out of ${required_make} required how=make builds" +echo "${using_raw} out of ${required_raw} required how=raw builds" +echo "${using_nix} out of ${required_nix} required how=nix builds" +if ! $status; then + echo -ne "---\n$text" +fi +$status diff --git a/06/helpers/maint/notes b/06/helpers/maint/notes new file mode 100755 index 0000000..41a9956 --- /dev/null +++ b/06/helpers/maint/notes @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -ueo pipefail +if [[ $# == 0 || "$1" == 'show' ]]; then + exec git tree --show-notes --decorate=short --color=always \ + | grep -v '^|\s*$' \ + | grep -v 'Notes:$' \ + | sed 's/ Built-on: /^ Built-on: /' \ + | less +elif [[ "$1" == 'mark-built' ]] && (( $# >= 3 )) ; then + commit=$2; hostname=$3; how=$4; shift 4; extra="$@" + git fetch origin refs/notes/commits:refs/notes/commits + if ! grep -Eqx 'how=(raw|make|nix)' <<<$how; then + echo 'how must be one of: raw, make, nix' >/dev/stderr + exit 1 + fi + msg="Built-on: $hostname $how $extra" + if grep -Fqx "$msg" <(git notes show "$commit" 2>/dev/null); then + echo "$commit is already marked with '$msg'" >/dev/stderr + exit + fi + git notes append -m "$msg" "$commit" + git push origin refs/notes/commits +else + echo 'Usage: ' >/dev/stderr + echo ' helpers/notes [show]' >/dev/stderr + echo -n ' helpers/notes mark-built ' >/dev/stderr + echo ' how=[raw|make|nix] ' >/dev/stderr + exit 1 +fi diff --git a/06/helpers/maint/release b/06/helpers/maint/release new file mode 100755 index 0000000..f5e2a39 --- /dev/null +++ b/06/helpers/maint/release @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +set -uex + +# check that two extra files have not been modified + +seeder_path=$(nix eval --impure --expr '"${recipes/1-stage1/seed.host-executed.sh}"') +grep "stage1_seeder_reference = $seeder_path;$" using-nix/0.nix +syscall_h_path=$(nix eval --impure --expr '"${recipes/1-stage1/syscall.h}"') +grep "syscall_h_reference = $syscall_h_path;$" using-nix/0.nix + + +# check that both downloads in using-nix/0-prebuilt refer to the same tag + +lines=$(grep 'seeding-files-r[0-9]*' using-nix/0-prebuilt.nix \ + | sed 's/.*r\([0-9][0-9][0-9]\).*/\1/') +sort <<<"$lines" +[[ $(wc -l <<<"$lines") == 2 ]] +[[ $(sort <<<"$lines" | uniq | wc -l) == 1 ]] + + +# build nars, calculate hashes, check both 0-from-nixpkgs and 0-prebuilt + +[[ ! -L result* ]] + + +tinycc_=$(nix-build using-nix/0-from-nixpkgs.nix -A tinycc --no-out-link) +tinycc=$(nix-build using-nix/0-from-nixpkgs.nix -A tinycc --no-out-link --check) +[[ "$tinycc_" == "$tinycc" ]] +nix store dump-path $tinycc > tinycc-liberated.nar +tinycc_hash=$(nix hash file tinycc-liberated.nar) +grep "outputHash = \"$tinycc_hash\";$" using-nix/0-from-nixpkgs.nix +grep "sha256 = \"$tinycc_hash\";$" using-nix/0-prebuilt.nix + +protosrc_=$(nix-build using-nix/0-from-nixpkgs.nix -A protosrc --no-out-link) +protosrc=$(nix-build using-nix/0-from-nixpkgs.nix -A protosrc --no-out-link \ + --check) +[[ "$protosrc_" == "$protosrc" ]] +nix store dump-path $protosrc > protosrc.nar +protosrc_hash=$(nix hash file protosrc.nar) +grep "outputHash = \"$protosrc_hash\";$" using-nix/0-from-nixpkgs.nix +grep "sha256 = \"$protosrc_hash\";$" using-nix/0-prebuilt.nix + + +[[ ! -L result* ]] + + +# print release notes + +set +x + +cat <<\EOF +protosrc (patched sources of stage1 tinycc/protomusl/protobusybox) has to come from somewhere, and there are three main options: build as part of bootstrap, build using nixpkgs or take them from here. + +You don't need these files neither when you do the whole bootstrap-Nix-included route using ./build.sh/make, nor when you can afford pulling nixpkgs to build them. But there's at least a case for building in Hydra under restricted-eval mode where you can neither inject stuff externally nor IFD. These allow kickstarting Hydra builds as long as recipes/1-stage1/seed.host-executed.sh and recipes/1-stage1/syscall.h weren't modified. + +See using-nix/0.nix for more explanations of all three seeding options, using-nix/0-from-nixpkgs for how these were built. + +EOF + +echo "$tinycc_hash" tinycc-liberated.nar +echo "$protosrc_hash" protosrc.nar diff --git a/06/recipes/0-tcc-seed/seed.host-executed.sh b/06/recipes/0-tcc-seed/seed.host-executed.sh new file mode 100755 index 0000000..59d660f --- /dev/null +++ b/06/recipes/0-tcc-seed/seed.host-executed.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -uex + +cp tcc-seed stage/store/0-tcc-seed diff --git a/06/recipes/1-stage1.c b/06/recipes/1-stage1.c new file mode 100644 index 0000000..b78c079 --- /dev/null +++ b/06/recipes/1-stage1.c @@ -0,0 +1,933 @@ +// SPDX-FileCopyrightText: 2021 Alexander Sosedkin +// SPDX-License-Identifier: MIT + +// syscalls (x86_64) /////////////////////////////////////////////////////////// + +#ifndef INSIDE_NIX +#include "1-stage1/syscall.h" +#define TCC_SEED "/store/0-tcc-seed" +#define PROTOSRC "/protosrc" +#define RECIPES_STAGE1 "/recipes/1-stage1" +#define TMP_STAGE1 "/tmp/1-stage1" +#define STORE_PROTOBUSYBOX "/store/1-stage1/protobusybox" +#define STORE_PROTOMUSL "/store/1-stage1/protomusl" +#define STORE_TINYCC "/store/1-stage1/tinycc" +#define EXTRA_HELLO_ARGS +#else +#include "syscall.h" +#define EXTRA_HELLO_ARGS \ + "-DRECIPES_STAGE1=\"" RECIPES_STAGE1"\"", +#endif + +#define SYS_write 1 +#define SYS_open 2 +#define SYS_fork 57 +#define SYS_execve 59 +#define SYS_exit 60 +#define SYS_wait4 61 +#define SYS_getdents 78 +#define SYS_mkdir 83 + +long write(int fd, const void* buf, long cnt) { + return __syscall3(SYS_write, fd, (long) buf, cnt); +} + +int execve(const char* fname, + const char* const argv[], const char* const envp[]) { + return __syscall3(SYS_execve, (long) fname, (long) argv, (long) envp); +} + +void exit(int code) { __syscall1(SYS_exit, code); }; + +int fork() { return __syscall0(SYS_fork); } + +int wait4(int pid, int* status, int options, void* rusage) { + return __syscall4( + SYS_wait4, + pid, (long) status, options, (long) rusage + ); +} + +int mkdir(const char *pathname, unsigned mode) { + return __syscall2(SYS_mkdir, (long) pathname, mode); +} + +int open(const char *pathname, int flags, int mode) { + return __syscall3(SYS_open, (long) pathname, flags, mode); +} + +struct linux_dirent { + long d_ino; + long d_off; + unsigned short d_reclen; + char d_name[]; +}; +int getdents(unsigned int fd, struct linux_dirent *dirp, + unsigned int count) { + return __syscall3(SYS_getdents, fd, (long) dirp, count); +} + + +// random defines ////////////////////////////////////////////////////////////// + +#define NULL ((void*) 0) +#define STDOUT 1 +#define STDERR 2 +#define O_RDONLY 0 +#define O_DIRECTORY 0200000 +#define DT_REG 8 + + +// basic QoL /////////////////////////////////////////////////////////////////// + +unsigned strlen(const char* s) { + unsigned l; + for (l = 0; s[l]; l++); + return l; +} + +int write_(int fd, const char* msg) { + return write(fd, msg, strlen(msg)); +} + +#define __quote(x) #x +#define _quote(x) __quote(x) +// real assert calls abort() -> 128 + SIGABRT = 134 +#define assert(v) \ + while (!(v)) { \ + write_(STDERR, "Assertion "); \ + write_(STDERR, _quote(v)); write_(STDERR, " failed at "); \ + write_(STDERR, __FILE__); write_(STDERR, ":"); \ + write_(STDERR, __func__); write_(STDERR, ":"); \ + write_(STDERR, _quote(__LINE__)); write_(STDERR, "!\n"); \ + exit(134); \ + } + +void err(const char* msg) { assert(write_(STDERR, msg) == strlen(msg)); } + +void log_begin_line(const char* msg) { + assert(write_(STDOUT, "### 1-stage1.c: ") == 16); + assert(write_(STDOUT, msg) == strlen(msg)); +} +void log_continue_line(const char* msg) { + assert(write_(STDOUT, msg) == strlen(msg)); +} +void log_end_line() { assert(write_(STDOUT, "\n") == 1); } +void log(const char* msg) { log_begin_line(msg); log_end_line(); }; + + +// more library function substitutes /////////////////////////////////////////// + +void memset(char* ptr, int with, long len) { + long i; + for (i = 0; i < len; i++) + ptr[i] = with; +} + +char* strcpy(char* dest, const char* src) { + while (*src) + *dest++ = *src++; + *dest = 0; + return dest; +} + +int strcmp(const char* a, const char* b) { + for (; *a && *b; a++, b++) + if (*a != *b) + return (*a < *b) ? -1 : 1; + return !a && !b; +} + + +// my convenience functions: mkdir'ing ///////////////////////////////////////// + + +void mkreqdirs(const char* path) { + char b[128], *p; + strcpy(b, path); + for (p = b + 1; *p; p++) + if (*p == '/') { *p = '\0'; mkdir(b, 0777); *p = '/'; } +} +void mkreqdirs_at(const char* at, const char* subpath) { + char b[128], *p; + p = strcpy(b, at); + p = strcpy(strcpy(strcpy(p, "/"), subpath), "/"); + mkreqdirs(b); +} +#define mkdirs_at(at, args...) \ + do { \ + const char* const* p; \ + for (p = (char*[]) { "/", ## args, NULL }; *p; p++) \ + mkreqdirs_at(at, *p); \ + } while (0) + + +// my convenience functions: fork + exec /////////////////////////////////////// + +int run_(const char* cmd, const char* const args[], const char* const env[]) { + int pid, status, termsig; + if (pid = fork()) { + assert(wait4(pid, &status, 0, NULL) == pid); + termsig = status & 0x7f; // WTERMSIG + if (!termsig) { + return (status & 0xff00) >> 8; // WEXITSTATUS + } else { + err("child has been killed"); + exit(termsig); + } + } else { + exit(execve(cmd, args, env)); + } + return 0; // unreacheable +} + +#define run(expected_retcode, first_arg, args...) \ + do { \ + const char const* __env[] = {NULL}; \ + const char const* __args[] = {(first_arg), ##args, NULL}; \ + int __i; \ + log_begin_line("run() running: "); \ + for(__i = 0; __args[__i]; __i++) { \ + log_continue_line(__args[__i]); \ + log_continue_line(" "); \ + } \ + log_end_line(); \ + assert(run_(first_arg, __args, __env) == (expected_retcode)); \ + } while (0) +#define run0(first_arg, args...) run(0, (first_arg), ## args) + + +// my convenience functions: dynamic args accumulation / command execution ///// + +struct args_accumulator { + char* pointers[4096]; + char storage[262144]; + char** ptr_curr; + char* char_curr; +}; +void _aa_init(struct args_accumulator* aa) { + aa->char_curr = aa->storage; + aa->ptr_curr = aa->pointers; + *aa->ptr_curr = NULL; +} +void aa_append(struct args_accumulator* aa, const char* new_arg) { + *aa->ptr_curr = aa->char_curr; + *++aa->ptr_curr = NULL; + aa->char_curr = strcpy(aa->char_curr, new_arg); + aa->char_curr++; +} +void _aa_extend_from_arr(struct args_accumulator* aa, const char* const* p) { + for (; *p; p++) + aa_append(aa, *p); +} +void aa_extend_from(struct args_accumulator* aa, const void* from) { + // Cheat a little with void* to accept + // both struct args_accumulator* and null-terminated string arrays. + // Qualifiers could be stricter, but then declaring get cumbersome. + _aa_extend_from_arr(aa, (const char* const*) from); +} +#define aa_extend(aa_ptr, args...) \ + _aa_extend_from_arr(aa_ptr, (const char*[]) { NULL, ## args, NULL } + 1) +#define aa_init(aa_ptr, args...) \ + do { _aa_init(aa_ptr); aa_extend(aa_ptr, ## args); } while (0) +void aa_sort(struct args_accumulator* aa) { + int changes; + char **p, **n, *t; + if (!aa->pointers[0]) + return; + if (!aa->pointers[1]) + return; + do { + changes = 0; + for (p = aa->pointers, n = p + 1; *n; p++, n++) { + if (strcmp(*p, *n) > 0) { + t = *p; *p = *n; *n = t; + changes = 1; + } + } + } while (changes); +} +int aa_run(const struct args_accumulator* aa) { + int i; + log_begin_line("aa_run() running: "); + for (i = 0; aa->pointers[i]; i++) { + log_continue_line(aa->pointers[i]); + log_continue_line(" "); + } + log_end_line(STDOUT, "\n"); + return run_(aa->pointers[0], aa->pointers, (char*[]) { NULL }); +} +#define aa_run0(aa_ptr) do { assert(aa_run(aa_ptr) == 0); } while (0) + + +// my convenience functions: compiling whole directories worth of files //////// + +_Bool is_compileable(char* fname) { + int i = 0; + while (fname[i]) + i++; + if (i > 2) + if (fname[i - 2] == '.') + if (fname[i - 1] == 'c' || fname[i-1] == 's') + return 1; + return 0; +} + +void aa_extend_from_dir(struct args_accumulator* aa_out, + unsigned short keep_components, const char* dir_path) { + struct args_accumulator aa; + char d_buf[256]; + char buf[256]; + const char* prefix; + char* out_subpath; + struct linux_dirent* d; + int fd, r; + char d_type; + + aa_init(&aa); + + prefix = dir_path + strlen(dir_path); + while (keep_components) { + while (*prefix != '/') + prefix--; + keep_components--; + prefix += keep_components ? -1 : 1; + } + + fd = open(dir_path, O_RDONLY | O_DIRECTORY, 0); + assert(fd != -1); + + while (1) { + d = (struct linux_dirent*) d_buf; + r = getdents(fd, d, 256); + assert(r != -1); + if (!r) + break; + while ((char*) d - d_buf < r) { + d_type = *((char*) d + d->d_reclen - 1); + if ((d_type == DT_REG || !d_type) + && is_compileable(d->d_name)) { + out_subpath = strcpy(buf, prefix); + out_subpath = strcpy(out_subpath, "/"); + out_subpath = strcpy(out_subpath, d->d_name); + aa_append(&aa, buf); + } + d = (struct linux_dirent*) ((char*) d + d->d_reclen); + } + } + aa_sort(&aa); // iteration order isn't guaranteed, make stable + aa_extend_from(aa_out, &aa); +} + + +void mass_compile(const char* cc, const void* compile_args, + const char* in_dir_path, const void* fnames /* NULL=auto */, + const char* out_obj_dir_path, const char* out_lib_file_path) { + // qualifiers could've been stricter + // const void* could be struct args_accumulator*, + // NULL-terminated arrays or even just NULLs for fnames + struct args_accumulator aa, aa_link, aa_sources; + char in_file_path_buf[128], out_file_path_buf[128]; + char* in_file_path; + char* out_file_path; + char** p; + + aa_init(&aa_sources); + if (!fnames) + aa_extend_from_dir(&aa_sources, 0, in_dir_path); + else + aa_extend_from(&aa_sources, fnames); + + mkreqdirs(out_lib_file_path); + aa_init(&aa_link, cc, "-ar", "rc", out_lib_file_path); + + for (p = (char**) &aa_sources; *p; p++) { + in_file_path = strcpy(in_file_path_buf, in_dir_path); + in_file_path = strcpy(in_file_path, "/"); + in_file_path = strcpy(in_file_path, *p); + + out_file_path = strcpy(out_file_path_buf, out_obj_dir_path); + out_file_path = strcpy(out_file_path, "/"); + out_file_path = strcpy(out_file_path, *p); + out_file_path = strcpy(out_file_path, ".o"); + mkreqdirs(out_file_path_buf); + + aa_init(&aa, cc); + aa_extend_from(&aa, compile_args); + aa_extend(&aa, "-c", in_file_path_buf, "-o", out_file_path_buf); + aa_run0(&aa); + + aa_append(&aa_link, out_file_path_buf); + } + aa_run0(&aa_link); +} + + +// Kinda boring parts ////////////////////////////////////////////////////////// + +#define TCC_ARGS_NOSTD "-nostdlib", "-nostdinc", "-I", "/protosrc/tinycc/include" + + +void sanity_test() { + struct args_accumulator aa1, aa2; + + log("sanity-testing run()..."); + log("* testing run() -> retcode 0..."); + run0(TCC_SEED, "--help"); + log("* testing run() -> retcode 1..."); + run(1, TCC_SEED, "-ar", "--help"); + log("run() seems to work OK"); + + log("sanity-testing args accumulator..."); + log("* testing aa_append, aa_extend, aa_sort and aa_run0..."); + aa_init(&aa1); + aa_init(&aa2); + aa_append(&aa1, TCC_SEED); + aa_append(&aa2, "-ar"); + aa_extend(&aa2, "help-must-precede-ar", "--help"); + aa_sort(&aa2); + aa_extend_from(&aa1, &aa2); + assert(!strcmp(((char**) &aa1)[0], TCC_SEED)); + assert(!strcmp(((char**) &aa1)[1], "--help")); + assert(!strcmp(((char**) &aa1)[2], "-ar")); + assert(!strcmp(((char**) &aa1)[3], "help-must-precede-ar")); + assert(NULL == ((char**) &aa1)[4]); + aa_run0(&aa1); + + log("* testing aa_multi and aa_run for 1..."); + aa_init(&aa1, TCC_SEED, "-ar", "--help"); + assert(aa_run(&aa1) == 1); +} + + +// Interesting parts: libtcc1 ////////////////////////////////////////////////// + + +void compile_libtcc1_1st_time_nostd(const char* cc) { + log("compiling our first libtcc1.a..."); + mass_compile(cc, (char* []) { TCC_ARGS_NOSTD, "-DTCC_MUSL", NULL }, + PROTOSRC"/tinycc/lib", (char* []) { + "libtcc1.c", "alloca.S", + "dsohandle.c", "stdatomic.c", "va_list.c", + 0}, + TMP_STAGE1"/tinycc/libtcc1", + STORE_TINYCC"/lib/libtcc1.a"); +} // see also compile_libtcc1 far below + + +// Interesting parts: protomusl //////////////////////////////////////////////// + +#define PROTOMUSL_EXTRA_CFLAGS \ + "-std=c99", \ + "-D_XOPEN_SOURCE=700" +#define PROTOMUSL_INTERNAL_INCLUDES \ + "-I" PROTOSRC"/protomusl/src/include", \ + "-I" PROTOSRC"/protomusl/arch/x86_64", \ + "-I" PROTOSRC"/protomusl/host-generated/sed1", \ + "-I" PROTOSRC"/protomusl/host-generated/sed2", \ + "-I" PROTOSRC"/protomusl/arch/generic", \ + "-I" PROTOSRC"/protomusl/src/internal", \ + "-I" PROTOSRC"/protomusl/include" +#define PROTOMUSL_NOSTD_LDFLAGS_PRE \ + "-static", \ + STORE_PROTOMUSL"/lib/crt1.o", \ + STORE_PROTOMUSL"/lib/crti.o" +#define PROTOMUSL_NOSTD_LDFLAGS_POST \ + STORE_PROTOMUSL"/lib/libc.a", \ + STORE_PROTOMUSL"/lib/crtn.o" +#define PROTOMUSL_INCLUDES \ + "-I" PROTOSRC"/protomusl/include", \ + "-I" PROTOSRC"/protomusl/arch/x86_64", \ + "-I" PROTOSRC"/protomusl/arch/generic", \ + "-I" PROTOSRC"/protomusl/host-generated/sed1", \ + "-I" PROTOSRC"/protomusl/host-generated/sed2" + +void compile_protomusl(const char* cc) { + struct args_accumulator aa; + aa_init(&aa); + + log("compiling part of musl (protomusl)..."); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/conf"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/ctype"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/dirent"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/env"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/errno"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/exit"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/fcntl"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/fenv"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/internal"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/ldso"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/legacy"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/linux"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/locale"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/malloc"); + aa_extend_from_dir(&aa, 2, PROTOSRC"/protomusl/src/malloc/mallocng"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/math"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/misc"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/mman"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/multibyte"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/network"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/passwd"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/prng"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/process"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/regex"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/select"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/setjmp"); + aa_extend_from_dir(&aa, 2, PROTOSRC"/protomusl/src/setjmp/x86_64"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/signal"); + aa_extend_from_dir(&aa, 2, PROTOSRC"/protomusl/src/signal/x86_64"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/stat"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/stdio"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/stdlib"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/string"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/temp"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/termios"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/thread"); + aa_extend_from_dir(&aa, 2, PROTOSRC"/protomusl/src/thread/x86_64"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/time"); + aa_extend_from_dir(&aa, 1, PROTOSRC"/protomusl/src/unistd"); + mass_compile(cc, (char*[]) { + TCC_ARGS_NOSTD, + PROTOMUSL_EXTRA_CFLAGS, + PROTOMUSL_INTERNAL_INCLUDES, + 0}, + PROTOSRC"/protomusl/src", &aa, + TMP_STAGE1"/protomusl", + STORE_PROTOMUSL"/lib/libc.a"); + + log("compiling crt bits of protomusl..."); + run0(cc, TCC_ARGS_NOSTD, PROTOMUSL_INTERNAL_INCLUDES, "-DCRT", + "-c", PROTOSRC"/protomusl/crt/crt1.c", + "-o", STORE_PROTOMUSL"/lib/crt1.o"); + run0(cc, TCC_ARGS_NOSTD, "-DCRT", + "-c", PROTOSRC"/protomusl/crt/crti.c", + "-o", STORE_PROTOMUSL"/lib/crti.o"); + run0(cc, TCC_ARGS_NOSTD, "-DCRT", + "-c", PROTOSRC"/protomusl/crt/crtn.c", + "-o", STORE_PROTOMUSL"/lib/crtn.o"); +} + +void test_example_1st_time_nostd(const char* cc) { + log("linking an example (1st time)..."); + run0(cc, TCC_ARGS_NOSTD, PROTOMUSL_INCLUDES, + PROTOMUSL_NOSTD_LDFLAGS_PRE, + RECIPES_STAGE1"/hello.c", EXTRA_HELLO_ARGS + PROTOMUSL_NOSTD_LDFLAGS_POST, + STORE_TINYCC"/lib/libtcc1.a", + "-o", TMP_STAGE1"/protomusl-hello"); + + log("executing an example..."); + run(42, TMP_STAGE1"/protomusl-hello"); +} + + +// Interesting parts: recompiling tcc ////////////////////////////////////////// + +void compile_libtcc1(const char* cc) { + log("recompiling libtcc1.a..."); + mass_compile(cc, (char*[]) { "-DTCC_MUSL", PROTOMUSL_INCLUDES, 0}, + PROTOSRC"/tinycc/lib", (char*[]) { + "libtcc1.c", "alloca.S", + "dsohandle.c", "stdatomic.c", "va_list.c", + // now we can compile more + "tcov.c", "alloca-bt.S", + // bcheck.c is excluded, as it references __FILE__ + 0}, + TMP_STAGE1"/tinycc/libtcc1", + STORE_TINYCC"/lib/libtcc1.a"); +} + +#define TCC_CFLAGS \ + "-I"PROTOSRC"/tinycc", \ + "-I"PROTOSRC"/tinycc/include", \ + "-I"TMP_STAGE1"/tinycc/gen", \ + "-DTCC_VERSION=\"mob-af1abf1\"", \ + "-DTCC_GITHASH=\"mob:af1abf1\"", \ + "-DTCC_TARGET_X86_64", \ + "-DTCC_MUSL", \ + "-DONE_SOURCE=0", \ + "-DCONFIG_TCCDIR=\""STORE_TINYCC"/lib\"", \ + "-DCONFIG_TCC_SYSINCLUDEPATHS="\ + "\""STORE_PROTOMUSL"/include\"", \ + "-DCONFIG_TCC_LIBPATHS=\""STORE_PROTOMUSL"/lib\"", \ + "-DCONFIG_TCC_CRTPREFIX=\""STORE_PROTOMUSL"/lib\"", \ + "-DCONFIG_TCC_ELFINTERP=\"/sorry/not/yet\"", \ + "-DCONFIG_TCC_PREDEFS=1" + +void compile_tcc_1st_time_nostd(const char* cc) { + log("compiling tcc's conftest..."); + mkdirs_at(TMP_STAGE1"/tinycc", "gen", "lib", "bin"); + mkdirs_at(STORE_TINYCC"", "lib", "bin"); + run0(cc, TCC_ARGS_NOSTD, PROTOMUSL_INCLUDES, + PROTOMUSL_NOSTD_LDFLAGS_PRE, + "-DC2STR", PROTOSRC"/tinycc/conftest.c", + PROTOMUSL_NOSTD_LDFLAGS_POST, + STORE_TINYCC"/lib/libtcc1.a", + "-o", TMP_STAGE1"/tinycc/conftest" + ); + log("generating tccdefs_.h with conftest..."); + run0(TMP_STAGE1"/tinycc/conftest", + PROTOSRC"/tinycc/include/tccdefs.h", + TMP_STAGE1"/tinycc/gen/tccdefs_.h"); + + log("compiling libtcc..."); + mass_compile(cc, (char*[]) { + TCC_ARGS_NOSTD, + PROTOMUSL_INCLUDES, + TCC_CFLAGS, + 0}, + PROTOSRC"/tinycc", (char*[]) { + "libtcc.c", "tccpp.c", "tccgen.c", "tccelf.c", + "tccdbg.c", "tccasm.c", "tccrun.c", + "x86_64-gen.c", "x86_64-link.c", "i386-asm.c", + 0}, + TMP_STAGE1"/tinycc/libtcc", + STORE_TINYCC"/lib/libtcc.a"); + run0(cc, TCC_ARGS_NOSTD, PROTOMUSL_INCLUDES, TCC_CFLAGS, + PROTOMUSL_NOSTD_LDFLAGS_PRE, + PROTOSRC"/tinycc/tcc.c", + STORE_TINYCC"/lib/libtcc.a", + PROTOMUSL_NOSTD_LDFLAGS_POST, + STORE_TINYCC"/lib/libtcc1.a", + "-o", STORE_TINYCC"/bin/tcc"); + run0(STORE_TINYCC"/bin/tcc", "-print-search-dirs"); +} + + +void compile_tcc(const char* cc) { + log("recompiling libtcc..."); + mass_compile(cc, (char*[]) { PROTOMUSL_INCLUDES, TCC_CFLAGS, 0}, + PROTOSRC"/tinycc", (char*[]) { + "libtcc.c", "tccpp.c", "tccgen.c", "tccelf.c", + "tccdbg.c", "tccasm.c", "tccrun.c", + "x86_64-gen.c", "x86_64-link.c", "i386-asm.c", + 0}, + TMP_STAGE1"/tinycc/libtcc", + STORE_TINYCC"/lib/libtcc.a"); + run0(cc, PROTOMUSL_INCLUDES, TCC_CFLAGS, "-static", + PROTOSRC"/tinycc/tcc.c", + STORE_TINYCC"/lib/libtcc.a", + "-o", STORE_TINYCC"/bin/tcc"); +} + +void test_example_intermediate(const char* cc) { + log("linking an example (our tcc, includes not installed)..."); + run0(cc, PROTOMUSL_INCLUDES, "-static", + RECIPES_STAGE1"/hello.c", EXTRA_HELLO_ARGS + "-o", TMP_STAGE1"/protomusl-hello"); + + log("executing an example..."); + run(42, TMP_STAGE1"/protomusl-hello"); +} + +void test_example_final(const char* cc_wrapper) { + log("linking an example (wrapped tcc, includes installed)..."); + run0(cc_wrapper, RECIPES_STAGE1"/hello.c", EXTRA_HELLO_ARGS + "-o", TMP_STAGE1"/protomusl-hello"); + + log("executing an example..."); + run(42, TMP_STAGE1"/protomusl-hello"); +} + + +// Interesting parts: hacky standalone busybox applets ///////////////////////// + +void compile_standalone_busybox_applets(const char* cc) { + log("compiling protolibbb..."); + mass_compile(cc, (char*[]) { + PROTOMUSL_INCLUDES, + "-I"PROTOSRC"/protobusybox/include/", + "-I"PROTOSRC"/protobusybox/libbb/", + "-include", RECIPES_STAGE1"/protobusybox.h", + 0}, + PROTOSRC"/protobusybox/libbb", (char*[]) { + "ask_confirmation.c", + "auto_string.c", + "bb_cat.c", + "bb_getgroups.c", + "bb_pwd.c", + "bb_strtonum.c", + "compare_string_array.c", + "concat_path_file.c", + "concat_subpath_file.c", + "copy_file.c", + "copyfd.c", + "crc32.c", + "default_error_retval.c", + "dump.c", + "endofname.c", + "executable.c", + "fclose_nonstdin.c", + "fflush_stdout_and_exit.c", + "full_write.c", + "get_last_path_component.c", + "get_line_from_file.c", + "getopt32.c", + "inode_hash.c", + "isdirectory.c", + "isqrt.c", + "last_char_is.c", + "llist.c", + "make_directory.c", + "messages.c", + "mode_string.c", + "parse_mode.c", + "perror_msg.c", + "perror_nomsg_and_die.c", + "printable_string.c", + "process_escape_sequence.c", + "procps.c", + "ptr_to_globals.c", + "read.c", + "read_printf.c", + "recursive_action.c", + "remove_file.c", + "safe_poll.c", + "safe_strncpy.c", + "safe_write.c", + "signals.c", + "single_argv.c", + "skip_whitespace.c", + "sysconf.c", + "time.c", + "u_signal_names.c", + "verror_msg.c", + "vfork_daemon_rexec.c", + "wfopen.c", + "wfopen_input.c", + "xatonum.c", + "xfunc_die.c", + "xfuncs.c", + "xfuncs_printf.c", + "xgetcwd.c", + "xreadlink.c", + "xrealloc_vector.c", + "xregcomp.c", + 0}, + TMP_STAGE1"/protobusybox/libbb", + TMP_STAGE1"/protobusybox/libbb.a"); + + + log("compiling standalone protobusybox applets..."); + mkreqdirs(STORE_PROTOBUSYBOX"/bin/"); + #define compile_applet(applet_name, files...) \ + run0(cc, PROTOMUSL_INCLUDES, \ + "-D__GNUC__=2", "-D__GNUC_MINOR__=7", \ + "-static", \ + "-I"PROTOSRC"/protobusybox/include", \ + "-include", RECIPES_STAGE1"/protobusybox.h", \ + "-DAPPLET_MAIN=" applet_name "_main", \ + RECIPES_STAGE1"/protobusybox.c", \ + ## files, \ + TMP_STAGE1"/protobusybox/libbb.a", \ + "-o", STORE_PROTOBUSYBOX"/bin/" applet_name); + compile_applet("echo", PROTOSRC"/protobusybox/coreutils/echo.c") + run0(STORE_PROTOBUSYBOX"/bin/echo", + "Hello from protobusybox!"); + + compile_applet("ash", + PROTOSRC"/protobusybox/shell/shell_common.c", + PROTOSRC"/protobusybox/shell/ash_ptr_hack.c", + PROTOSRC"/protobusybox/shell/math.c", + PROTOSRC"/protobusybox/coreutils/printf.c", + PROTOSRC"/protobusybox/coreutils/test_ptr_hack.c", + PROTOSRC"/protobusybox/coreutils/test.c", + PROTOSRC"/protobusybox/shell/ash.c") + run(42, STORE_PROTOBUSYBOX"/bin/ash", "-c", + "printf 'Hello from ash!\n'; exit 42"); + + compile_applet("basename", + PROTOSRC"/protobusybox/coreutils/basename.c") + compile_applet("cat", PROTOSRC"/protobusybox/coreutils/cat.c") + compile_applet("chmod", PROTOSRC"/protobusybox/coreutils/chmod.c") + compile_applet("cp", + PROTOSRC"/protobusybox/coreutils/libcoreutils/cp_mv_stat.c", + PROTOSRC"/protobusybox/coreutils/cp.c"); + compile_applet("cut", PROTOSRC"/protobusybox/coreutils/cut.c"); + compile_applet("dirname", PROTOSRC"/protobusybox/coreutils/dirname.c") + compile_applet("env", PROTOSRC"/protobusybox/coreutils/env.c"); + compile_applet("expr", PROTOSRC"/protobusybox/coreutils/expr.c"); + compile_applet("head", PROTOSRC"/protobusybox/coreutils/head.c"); + compile_applet("install", PROTOSRC"/protobusybox/coreutils/install.c"); + compile_applet("ln", PROTOSRC"/protobusybox/coreutils/ln.c"); + compile_applet("ls", PROTOSRC"/protobusybox/coreutils/ls.c"); + compile_applet("mkdir", PROTOSRC"/protobusybox/coreutils/mkdir.c"); + compile_applet("mktemp", PROTOSRC"/protobusybox/coreutils/mktemp.c"); + compile_applet("mv", + PROTOSRC"/protobusybox/coreutils/libcoreutils/cp_mv_stat.c", + PROTOSRC"/protobusybox/coreutils/mv.c"); + compile_applet("od", PROTOSRC"/protobusybox/coreutils/od.c"); + compile_applet("pwd", PROTOSRC"/protobusybox/coreutils/pwd.c"); + compile_applet("rm", PROTOSRC"/protobusybox/coreutils/rm.c"); + compile_applet("rmdir", PROTOSRC"/protobusybox/coreutils/rmdir.c"); + compile_applet("sleep", PROTOSRC"/protobusybox/coreutils/sleep.c"); + compile_applet("sort", PROTOSRC"/protobusybox/coreutils/sort.c"); + compile_applet("touch", PROTOSRC"/protobusybox/coreutils/touch.c"); + compile_applet("tr", PROTOSRC"/protobusybox/coreutils/tr.c"); + compile_applet("true", PROTOSRC"/protobusybox/coreutils/true.c"); + compile_applet("uname", PROTOSRC"/protobusybox/coreutils/uname.c"); + compile_applet("uniq", PROTOSRC"/protobusybox/coreutils/uniq.c"); + compile_applet("wc", PROTOSRC"/protobusybox/coreutils/wc.c"); + + #define LIBARCHIVE PROTOSRC"/protobusybox/archival/libarchive" + compile_applet("tar", + LIBARCHIVE "/data_align.c", + LIBARCHIVE "/data_extract_all.c", + LIBARCHIVE "/data_extract_to_stdout.c", + LIBARCHIVE "/data_skip.c", + LIBARCHIVE "/decompress_bunzip2.c", + LIBARCHIVE "/decompress_gunzip.c", + LIBARCHIVE "/decompress_unxz.c", + LIBARCHIVE "/filter_accept_all.c", + LIBARCHIVE "/filter_accept_reject_list.c", + LIBARCHIVE "/find_list_entry.c", + LIBARCHIVE "/get_header_tar.c", + LIBARCHIVE "/header_list.c", + LIBARCHIVE "/header_skip.c", + LIBARCHIVE "/header_verbose_list.c", + LIBARCHIVE "/init_handle.c", + LIBARCHIVE "/open_transformer.c", + LIBARCHIVE "/seek_by_jump.c", + LIBARCHIVE "/seek_by_read.c", + LIBARCHIVE "/unsafe_prefix.c", + LIBARCHIVE "/unsafe_symlink_target.c", + PROTOSRC"/protobusybox/archival/chksum_and_xwrite_tar_header.c", + PROTOSRC"/protobusybox/archival/tar.c"); + + compile_applet("bzip2", PROTOSRC"/protobusybox/archival/bzip2.c", + PROTOSRC"/protobusybox/archival/bbunzip.c", + LIBARCHIVE "/decompress_bunzip2.c", + LIBARCHIVE "/decompress_gunzip.c", + LIBARCHIVE "/decompress_unxz.c", + LIBARCHIVE "/open_transformer.c" + ); + + compile_applet("awk", PROTOSRC"/protobusybox/editors/awk.c"); + compile_applet("cmp", PROTOSRC"/protobusybox/editors/cmp.c"); + compile_applet("diff", PROTOSRC"/protobusybox/editors/diff.c"); + compile_applet("sed", PROTOSRC"/protobusybox/editors/sed.c"); + + compile_applet("grep", PROTOSRC"/protobusybox/findutils/grep.c"); + compile_applet("find", PROTOSRC"/protobusybox/findutils/find.c"); + compile_applet("xargs", PROTOSRC"/protobusybox/findutils/xargs.c"); +} + + +// Little things we'll do now when we have a shell ///////////////////////////// + +void verify_tcc_stability(void) { + run0(STORE_PROTOBUSYBOX"/bin/cp", + STORE_TINYCC"/bin/tcc", TMP_STAGE1"/tcc-bak"); + compile_tcc(STORE_TINYCC"/bin/tcc"); + run0(STORE_PROTOBUSYBOX"/bin/diff", + STORE_TINYCC"/bin/tcc", TMP_STAGE1"/tcc-bak"); +} + +void tweak_output_in_store(void) { + run0(STORE_PROTOBUSYBOX"/bin/ash", "-uexvc", + ":> "TMP_STAGE1"/empty.c\n" + STORE_TINYCC"/bin/tcc -c "TMP_STAGE1"/empty.c " + "-o "TMP_STAGE1"/empty.o\n" + STORE_TINYCC"/bin/tcc -ar "TMP_STAGE1"/empty.a " + TMP_STAGE1"/empty.o\n" + STORE_PROTOBUSYBOX"/bin/cp "TMP_STAGE1"/empty.a " + STORE_PROTOMUSL"/lib/libm.a\n" + STORE_PROTOBUSYBOX"/bin/cp "TMP_STAGE1"/empty.a " + STORE_PROTOMUSL"/lib/libpthread.a\n" + + STORE_PROTOBUSYBOX"/bin/rm -rf " + STORE_PROTOMUSL"/include\n" + STORE_PROTOBUSYBOX"/bin/mkdir -p " + STORE_PROTOMUSL"/include/bits\n" + STORE_PROTOBUSYBOX"/bin/cp -rf " + PROTOSRC"/protomusl/host-generated/sed1/bits " + PROTOSRC"/protomusl/host-generated/sed2/bits " + PROTOSRC"/protomusl/arch/generic/* " + PROTOSRC"/protomusl/arch/x86_64/* " + PROTOSRC"/protomusl/include/* " + STORE_PROTOMUSL"/include/\n" + ); +} + + +void wrap_tcc_tools(void) { + #define EXECTCC "#!"STORE_PROTOBUSYBOX"/bin/ash\n" \ + "exec "STORE_TINYCC"/bin/tcc" + #define PASSTHROUGH "\\\"\\$@\\\"" // i.e., \"\$@\", i.e, "$@" + run0(STORE_PROTOBUSYBOX"/bin/ash", "-uexvc", + "PATH="STORE_PROTOBUSYBOX"/bin\n" + "mkdir -p "STORE_TINYCC"/wrappers\n" + "cd "STORE_TINYCC"/wrappers\n" + "_CPP_ARGS=\"-I"STORE_PROTOMUSL"/include\"\n" + "_LD_ARGS='-static'\n" + "echo -e \"" EXECTCC " $_LD_ARGS " PASSTHROUGH"\" > cc\n" + "echo -e \"" EXECTCC " -E $_CPP_ARGS " PASSTHROUGH"\" > cpp\n" + "echo -e \"" EXECTCC " $_LD_ARGS " PASSTHROUGH"\" > ld\n" + "echo -e \"" EXECTCC " -ar " PASSTHROUGH "\" > ar\n" + "chmod +x cc cpp ld ar\n" + ); +} + + +// The main plot /////////////////////////////////////////////////////////////// + +int _start() { + struct args_accumulator aa_cmd; + struct args_accumulator aa_link_objs; + + log("hello from stage1!"); +#ifdef INSIDE_NIX + log("executed inside nix"); + log("TCC_SEED=" TCC_SEED); + log("PROTOSRC=" PROTOSRC); + log("RECIPES_STAGE1=" RECIPES_STAGE1); + log("TMP_STAGE1=" TMP_STAGE1); + log("STORE_PROTOBUSYBOX=" STORE_PROTOBUSYBOX); + log("STORE_PROTOMUSL=" STORE_PROTOMUSL); + log("STORE_TINYCC=" STORE_TINYCC); +#endif + + log("creating directories..."); + mkdirs_at("/", + TMP_STAGE1, STORE_PROTOBUSYBOX, STORE_PROTOMUSL, STORE_TINYCC); + + sanity_test(); + + // starting with the seeded TCC + compile_libtcc1_1st_time_nostd(TCC_SEED); + compile_protomusl(TCC_SEED); + test_example_1st_time_nostd(TCC_SEED); + + // build the first TCC that comes from our sources + compile_tcc_1st_time_nostd(TCC_SEED); + test_example_intermediate(STORE_TINYCC"/bin/tcc"); + // rebuild everything with it + compile_libtcc1(STORE_TINYCC"/bin/tcc"); + compile_protomusl(STORE_TINYCC"/bin/tcc"); + test_example_intermediate(STORE_TINYCC"/bin/tcc"); + + // this is the final tcc we'll build, should not be worth repeating + compile_tcc(STORE_TINYCC"/bin/tcc"); + // recompile everything else with the final tcc (could be an overkill) + compile_libtcc1(STORE_TINYCC"/bin/tcc"); + compile_protomusl(STORE_TINYCC"/bin/tcc"); + test_example_intermediate(STORE_TINYCC"/bin/tcc"); + + compile_standalone_busybox_applets(STORE_TINYCC"/bin/tcc"); + + verify_tcc_stability(); + tweak_output_in_store(); + wrap_tcc_tools(); + test_example_final(STORE_TINYCC"/wrappers/cc"); + + log("done"); + +#ifndef CHAINLOAD + return 0; +#else + assert(execve(CHAINLOAD, (char*[]) {CHAINLOAD, 0}, NULL)); + + log("could not exec into next stages (ok when building with make)"); + return 99; +#endif +} diff --git a/06/recipes/1-stage1/hello.c b/06/recipes/1-stage1/hello.c new file mode 100644 index 0000000..e1e8aa7 --- /dev/null +++ b/06/recipes/1-stage1/hello.c @@ -0,0 +1,21 @@ +#include + +#ifndef RECIPES_STAGE1 +#define RECIPES_STAGE1 "/recipes/1-stage1" +#endif +#define SOURCE_PATH RECIPES_STAGE1"/hello.c" + +int main(int argc, char** argv) { + printf("Hello world!\n2*2=%d\n", 2*2); + + printf("Own source (%s):\n", SOURCE_PATH); + FILE* f = fopen(SOURCE_PATH, "r"); + while (!feof(f)) { + fputc(fgetc(f), stdout); + } + if (ferror(f)) + return 99; + fclose(f); + + return 42; +} diff --git a/06/recipes/1-stage1/protobusybox.c b/06/recipes/1-stage1/protobusybox.c new file mode 100644 index 0000000..47f4389 --- /dev/null +++ b/06/recipes/1-stage1/protobusybox.c @@ -0,0 +1,46 @@ +extern int APPLET_MAIN(int argc, char** argv); // templated in + +#include +#include + +#include +static inline int *get_perrno(void) { return &errno; } +int *const bb_errno; + +char bb_common_bufsiz1[1024]; + +const char *applet_name; +int _argc; +const char **_argv; + +int main(int argc, char** argv) { + int** bb_errno_ptr = &((int*) bb_errno); + *bb_errno_ptr = ((int*) get_perrno()); + asm volatile ("":::"memory"); // counter optimizations + + _argc = argc; _argv = argv; + + applet_name = strrchr(argv[0], '/') \ + ? strrchr(argv[0], '/') + 1 \ + : argv[0]; + return APPLET_MAIN(argc, argv); +} + +void bb_show_usage(void) { + int i; + write(2 /* STDERR */, "protobusybox's show_usage stub\n", 31); + write(2 /* STDERR */, "ho help for you, sorry. argv[]: \n", 33); + for (i < 0; i < _argc; i++) { + write(2 /* STDERR */, "* `", 3); + write(2 /* STDERR */, _argv[i], strlen(_argv[i])); + write(2 /* STDERR */, "`\n", 2); + } + exit(1); +} + +// appletlib replacement +unsigned string_array_len(char **argv) { + unsigned i; + for (i = 0; argv[i]; i++); + return i; +} diff --git a/06/recipes/1-stage1/protobusybox.h b/06/recipes/1-stage1/protobusybox.h new file mode 100644 index 0000000..2729b35 --- /dev/null +++ b/06/recipes/1-stage1/protobusybox.h @@ -0,0 +1,240 @@ +#define NUM_APPLETS 1 +#define BB_GLOBAL_CONST +#define BB_VER "1.36.1" +#define AUTOCONF_TIMESTAMP +#define _GNU_SOURCE + +extern char bb_common_bufsiz1[]; +#define setup_common_bufsiz() ((void)0) +enum { COMMON_BUFSIZE = 1024 }; + +#define CONFIG_BUSYBOX_EXEC_PATH "/proc/self/exe" +#define CONFIG_FEATURE_COPYBUF_KB 256 +#define CONFIG_FEATURE_EDITING_MAX_LEN 1024 +#define CONFIG_GZIP_FAST 2 +#define CONFIG_UNAME_OSNAME "Linux" + +#define ENABLE_ASH_ALIAS 0 +#define ENABLE_ASH_BASH_COMPAT 0 +#define ENABLE_ASH_CMDCMD 1 +#define ENABLE_ASH_ECHO 0 +#define ENABLE_ASH_GETOPTS 1 +#define ENABLE_ASH_JOB_CONTROL 0 +#define ENABLE_ASH_MAIL 0 +#define ENABLE_ASH_PRINTF 1 +#define ENABLE_ASH_SLEEP 0 +#define ENABLE_ASH_TEST 1 +#define ENABLE_BB_ARCH 1 +#define ENABLE_BUNZIP2 0 +#define ENABLE_BZCAT 0 +#define ENABLE_DEBUG 0 +#define ENABLE_DESKTOP 1 +#define ENABLE_EGREP 0 +#define ENABLE_FEATURE_ALLOW_EXEC 0 +#define ENABLE_FEATURE_AWK_LIBM 0 +#define ENABLE_FEATURE_BZIP2_DECOMPRESS 1 +#define ENABLE_FEATURE_CLEAN_UP 0 +#define ENABLE_FEATURE_CP_REFLINK 0 +#define ENABLE_FEATURE_CROND_D 0 +#define ENABLE_FEATURE_CUT_REGEX 0 +#define ENABLE_FEATURE_EDITING 0 +#define ENABLE_FEATURE_FANCY_ECHO 1 +#define ENABLE_FEATURE_FIND_NOT 1 +#define ENABLE_FEATURE_FIND_PAREN 1 +#define ENABLE_FEATURE_FIND_PRUNE 1 +#define ENABLE_FEATURE_FIND_TYPE 1 +#define ENABLE_FEATURE_GZIP_DECOMPRESS 1 +#define ENABLE_FEATURE_HUMAN_READABLE 0 +#define ENABLE_FEATURE_LS_COLOR 0 +#define ENABLE_FEATURE_LS_FILETYPES 0 +#define ENABLE_FEATURE_LS_FOLLOWLINKS 0 +#define ENABLE_FEATURE_LS_RECURSIVE 0 +#define ENABLE_FEATURE_LS_SORTFILES 0 +#define ENABLE_FEATURE_LS_TIMESTAMPS 1 +#define ENABLE_FEATURE_LS_WIDTH 0 +#define ENABLE_FEATURE_NON_POSIX_CP 0 +#define ENABLE_FEATURE_PRESERVE_HARDLINKS 0 +#define ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS 0 +#define ENABLE_FEATURE_SEAMLESS_BZ2 1 +#define ENABLE_FEATURE_SEAMLESS_GZ 1 +#define ENABLE_FEATURE_SEAMLESS_LZMA 0 +#define ENABLE_FEATURE_SEAMLESS_XZ 1 +#define ENABLE_FEATURE_SEAMLESS_Z 0 +#define ENABLE_FEATURE_SHOW_THREADS 0 +#define ENABLE_FEATURE_SH_MATH 1 +#define ENABLE_FEATURE_SH_READ_FRAC 0 +#define ENABLE_FEATURE_SYSLOG 0 +#define ENABLE_FEATURE_TAR_AUTODETECT 1 +#define ENABLE_FEATURE_TAR_CREATE 1 +#define ENABLE_FEATURE_TAR_GNU_EXTENSIONS 1 +#define ENABLE_FEATURE_TAR_LONG_OPTIONS 1 +#define ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY 1 +#define ENABLE_FEATURE_TAR_OLDSUN_COMPATIBILITY 0 +#define ENABLE_FEATURE_TOPMEM 1 +#define ENABLE_FEATURE_TOP_SMP_PROCESS 0 +#define ENABLE_FEATURE_TOUCH_SUSV3 1 +#define ENABLE_FEATURE_TR_CLASSES 0 +#define ENABLE_FEATURE_TR_EQUIV 0 +#define ENABLE_FEATURE_USE_SENDFILE 0 +#define ENABLE_FEATURE_VERBOSE 0 +#define ENABLE_FGREP 0 +#define ENABLE_FTPD 0 +#define ENABLE_HUSH_PRINTF 0 +#define ENABLE_HUSH_TEST 0 +#define ENABLE_KILLALL 0 +#define ENABLE_LOCALE_SUPPORT 1 +#define ENABLE_LONG_OPTS 1 +#define ENABLE_LZCAT 0 +#define ENABLE_PGREP 0 +#define ENABLE_PIDOF 0 +#define ENABLE_PKILL 0 +#define ENABLE_SELINUX 0 +#define ENABLE_SESTATUS 0 +#define ENABLE_TAR 1 +#define ENABLE_TEST1 0 +#define ENABLE_TEST2 0 +#define ENABLE_UNAME 0 +#define ENABLE_UNLZMA 0 +#define ENABLE_ZCAT 0 + +#define IF_AR(...) +#define IF_ASH_ALIAS(...) +#define IF_ASH_BASH_COMPAT(...) +#define IF_ASH_EXPAND_PRMT(...) +#define IF_ASH_HELP(...) +#define IF_ASH_OPTIMIZE_FOR_SIZE(...) +#define IF_BASENAME(...) +#define IF_BUNZIP2(...) +#define IF_BZCAT(...) +#define IF_BZIP2(...) __VA_ARGS__ +#define IF_CAT(...) +#define IF_CHGRP(...) +#define IF_CHMOD(...) +#define IF_CHOWN(...) +#define IF_CHROOT(...) +#define IF_CHVT(...) +#define IF_CKSUM(...) +#define IF_CLEAR(...) +#define IF_CPIO(...) +#define IF_DEALLOCVT(...) +#define IF_DESKTOP(...) __VA_ARGS__ +#define IF_DPKG(...) +#define IF_DPKG_DEB(...) +#define IF_DUMPKMAP(...) +#define IF_ECHO(...) __VA_ARGS__ +#define IF_EXTRA_COMPAT(...) +#define IF_FEATURE_AWK_GNU_EXTENSIONS(...) +#define IF_FEATURE_BZIP2_DECOMPRESS(...) __VA_ARGS__ +#define IF_FEATURE_CATN(...) +#define IF_FEATURE_CATV(...) +#define IF_FEATURE_CP_REFLINK(...) +#define IF_FEATURE_CUT_REGEX(...) +#define IF_FEATURE_FIND_AMIN(...) +#define IF_FEATURE_FIND_ATIME(...) +#define IF_FEATURE_FIND_CMIN(...) +#define IF_FEATURE_FIND_CONTEXT(...) +#define IF_FEATURE_FIND_CTIME(...) +#define IF_FEATURE_FIND_DELETE(...) +#define IF_FEATURE_FIND_DEPTH(...) +#define IF_FEATURE_FIND_EMPTY(...) +#define IF_FEATURE_FIND_EXEC(...) +#define IF_FEATURE_FIND_EXECUTABLE(...) +#define IF_FEATURE_FIND_EXEC_PLUS(...) +#define IF_FEATURE_FIND_GROUP(...) +#define IF_FEATURE_FIND_INUM(...) +#define IF_FEATURE_FIND_LINKS(...) +#define IF_FEATURE_FIND_MAXDEPTH(...) +#define IF_FEATURE_FIND_MMIN(...) +#define IF_FEATURE_FIND_MTIME(...) +#define IF_FEATURE_FIND_NEWER(...) +#define IF_FEATURE_FIND_NOT(...) __VA_ARGS__ +#define IF_FEATURE_FIND_PAREN(...) __VA_ARGS__ +#define IF_FEATURE_FIND_PATH(...) +#define IF_FEATURE_FIND_PERM(...) +#define IF_FEATURE_FIND_PRINT0(...) +#define IF_FEATURE_FIND_PRUNE(...) __VA_ARGS__ +#define IF_FEATURE_FIND_QUIT(...) +#define IF_FEATURE_FIND_REGEX(...) +#define IF_FEATURE_FIND_SAMEFILE(...) +#define IF_FEATURE_FIND_SIZE(...) +#define IF_FEATURE_FIND_TYPE(...) __VA_ARGS__ +#define IF_FEATURE_FIND_USER(...) +#define IF_FEATURE_FIND_XDEV(...) +#define IF_FEATURE_GREP_CONTEXT(...) +#define IF_FEATURE_GZIP_DECOMPRESS(...) __VA_ARGS__ +#define IF_FEATURE_HUMAN_READABLE(...) +#define IF_FEATURE_INSTALL_LONG_OPTIONS(...) +#define IF_FEATURE_LS_COLOR(...) +#define IF_FEATURE_LS_FILETYPES(...) +#define IF_FEATURE_LS_FOLLOWLINKS(...) +#define IF_FEATURE_LS_RECURSIVE(...) +#define IF_FEATURE_LS_SORTFILES(...) +#define IF_FEATURE_LS_TIMESTAMPS(...) __VA_ARGS__ +#define IF_FEATURE_LS_WIDTH(...) +#define IF_FEATURE_SEAMLESS_BZ2(...) __VA_ARGS__ +#define IF_FEATURE_SEAMLESS_GZ(...) __VA_ARGS__ +#define IF_FEATURE_SEAMLESS_LZMA(...) +#define IF_FEATURE_SEAMLESS_XZ(...) __VA_ARGS__ +#define IF_FEATURE_SEAMLESS_Z(...) +#define IF_FEATURE_SHOW_THREADS(...) +#define IF_FEATURE_SH_MATH(...) __VA_ARGS__ +#define IF_FEATURE_TAR_AUTODETECT(...) __VA_ARGS__ +#define IF_FEATURE_TAR_CREATE(...) __VA_ARGS__ +#define IF_FEATURE_TAR_FROM(...) __VA_ARGS__ +#define IF_FEATURE_TAR_LONG_OPTIONS(...) __VA_ARGS__ +#define IF_FEATURE_TAR_NOPRESERVE_TIME(...) __VA_ARGS__ +#define IF_FEATURE_TAR_OLDGNU_COMPATIBILITY(...) __VA_ARGS__ +#define IF_FEATURE_TAR_OLDSUN_COMPATIBILITY(...) +#define IF_FEATURE_TAR_TO_COMMAND(...) +#define IF_FEATURE_TIMEZONE(...) +#define IF_FEATURE_TOUCH_SUSV3(...) __VA_ARGS__ +#define IF_FEATURE_VERBOSE(...) +#define IF_FEATURE_XARGS_SUPPORT_ARGS_FILE(...) +#define IF_FEATURE_XARGS_SUPPORT_CONFIRMATION(...) +#define IF_FEATURE_XARGS_SUPPORT_PARALLEL(...) +#define IF_FEATURE_XARGS_SUPPORT_QUOTES(...) +#define IF_FEATURE_XARGS_SUPPORT_REPL_STR(...) +#define IF_FEATURE_XARGS_SUPPORT_TERMOPT(...) +#define IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(...) +#define IF_FGCONSOLE(...) +#define IF_GUNZIP(...) __VA_ARGS__ +#define IF_GZIP(...) __VA_ARGS__ +#define IF_KBD_MODE(...) +#define IF_LOADFONT(...) +#define IF_LOADKMAP(...) +#define IF_LONG_OPTS(...) __VA_ARGS__ +#define IF_LS(...) __VA_ARGS__ +#define IF_LZCAT(...) +#define IF_LZMA(...) +#define IF_LZOP(...) +#define IF_LZOPCAT(...) +#define IF_NOT_ASH_OPTIMIZE_FOR_SIZE(...) __VA_ARGS__ +#define IF_NOT_DESKTOP(...) +#define IF_NOT_FEATURE_FIND_MAXDEPTH(...) __VA_ARGS__ +#define IF_NOT_FEATURE_TAR_CREATE(...) +#define IF_NOT_FEATURE_TOUCH_SUSV3(...) +#define IF_OPENVT(...) +#define IF_PRINTF(...) __VA_ARGS__ +#define IF_RESET(...) +#define IF_RESIZE(...) +#define IF_RPM(...) +#define IF_RPM2CPIO(...) +#define IF_SELINUX(...) +#define IF_SETCONSOLE(...) +#define IF_SETFONT(...) +#define IF_SETKEYCODES(...) +#define IF_SETLOGCONS(...) +#define IF_SHELL_ASH(...) __VA_ARGS__ +#define IF_SHELL_HUSH(...) +#define IF_SHOWKEY(...) +#define IF_SLEEP(...) +#define IF_TAR(...) +#define IF_UNAME(...) __VA_ARGS__ +#define IF_UNCOMPRESS(...) +#define IF_UNLZMA(...) +#define IF_UNLZOP(...) +#define IF_UNXZ(...) __VA_ARGS__ +#define IF_UNZIP(...) +#define IF_XZ(...) +#define IF_XZCAT(...) +#define IF_ZCAT(...) diff --git a/06/recipes/1-stage1/seed.host-executed.sh b/06/recipes/1-stage1/seed.host-executed.sh new file mode 100755 index 0000000..62125a3 --- /dev/null +++ b/06/recipes/1-stage1/seed.host-executed.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +# 1st stage is special +# in that we don't have any semblance of a system to start with, +# meaning we can't even unpack sources, let alone patch them or something. +# For stage 1, we pre-unpack sources on the host and then fix them up with +# host's sed. + +#> FETCH 7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039 +#> FROM http://musl.libc.org/releases/musl-1.2.4.tar.gz + +#> FETCH f5a71d05664340ae46cda9579c6079a0f2fa809d24386d284f0d091e4d576a4e +#> FROM https://github.com/TinyCC/tinycc/archive/af1abf1f45d45b34f0b02437f559f4dfdba7d23c.tar.gz +#> AS tinycc-mob-af1abf1.tar.gz + +#> FETCH b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314 +#> FROM https://busybox.net/downloads/busybox-1.36.1.tar.bz2 + +set -ueo pipefail +TGT="$DESTDIR/tmp/1-stage1" + +echo "### $0: unpacking protomusl sources..." +mkdir -p "$DESTDIR/protosrc/protomusl" +tar --strip-components=1 -xzf downloads/musl-1.2.4.tar.gz \ + -C "$DESTDIR/protosrc/protomusl" + +echo "### $0: unpacking tinycc sources..." +mkdir -p "$DESTDIR/protosrc/tinycc" +tar --strip-components=1 -xzf downloads/tinycc-mob-af1abf1.tar.gz \ + -C $DESTDIR/protosrc/tinycc + +echo "### $0: unpacking protobusybox sources..." +mkdir -p "$DESTDIR/protosrc/protobusybox" +tar --strip-components=1 -xjf downloads/busybox-1.36.1.tar.bz2 \ + -C "$DESTDIR/protosrc/protobusybox" + +echo "### $0: patching up protomusl stage 1 sources..." +# original syscall_arch.h is not tcc-compatible, our syscall.h is dual-role +cp recipes/1-stage1/syscall.h \ + "$DESTDIR/protosrc/protomusl/arch/x86_64/syscall_arch.h" +pushd "$DESTDIR/protosrc/protomusl/" >/dev/null + # eliminiate a source path reference + sed -i 's/__FILE__/"__FILE__"/' include/assert.h + # two files have to be generated with host sed + mkdir -p host-generated/{sed1,sed2}/bits + sed -f ./tools/mkalltypes.sed \ + ./arch/x86_64/bits/alltypes.h.in \ + ./include/alltypes.h.in \ + > host-generated/sed1/bits/alltypes.h + sed -n -e s/__NR_/SYS_/p \ + < arch/x86_64/bits/syscall.h.in \ + > host-generated/sed2/bits/syscall.h + # more frivolous patching + echo '#define VERSION "1.2.2"' > src/internal/version.h + sed -i 's/@PLT//' src/signal/x86_64/sigsetjmp.s + rm -f src/signal/restore.c # *BIG URGH* + rm -f src/thread/clone.c # *BIG URGH #2* + rm -f src/thread/__set_thread_area.c # possible double-define + rm -f src/thread/__unmapself.c # double-define + rm -f src/math/sqrtl.c # tcc-incompatible + rm -f src/math/{acoshl,acosl,asinhl,asinl,hypotl}.c # sqrtl dep + sed -i 's|posix_spawn(&pid, "/bin/sh",|posix_spawnp(\&pid, "sh",|' \ + src/stdio/popen.c src/process/system.c + sed -i 's|execl("/bin/sh", "sh", "-c",|execlp("sh", "-c",|'\ + src/misc/wordexp.c +popd >/dev/null + +echo "### $0: patching up tinycc stage 1 sources..." +pushd "$DESTDIR/protosrc/tinycc" >/dev/null + :> config.h + # eliminate a source path reference + sed -i 's/__FILE__/"__FILE__"/' tcc.h + # don't hardcode paths + sed -i 's/SHN_ABS, filename);/SHN_ABS, "FILE stub");/' tccdbg.c + # break a circular dependency + sed -i 's/abort();//' lib/va_list.c +popd >/dev/null + +echo "### $0: patching up protobusybox stage 1 sources..." +pushd "$DESTDIR/protosrc/protobusybox" >/dev/null + :> include/NUM_APPLETS.h + :> include/common_bufsiz.h + # eliminate a source path reference + sed -i 's/__FILE__/"__FILE__"/' miscutils/fbsplash.c include/libbb.h + # already fixed in an unreleased version + sed -i 's/extern struct test_statics \*const test_ptr_to_statics/extern struct test_statics *BB_GLOBAL_CONST test_ptr_to_statics/' coreutils/test.c +popd >/dev/null + +echo "### $0: done" diff --git a/06/recipes/1-stage1/syscall.h b/06/recipes/1-stage1/syscall.h new file mode 100644 index 0000000..4426819 --- /dev/null +++ b/06/recipes/1-stage1/syscall.h @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2021 Alexander Sosedkin +// SPDX-License-Identifier: MIT + + +// constants/macro for this file to serve as a drop-in replacement +// for musl-1.2.2's arch/x86_64/syscall_arch.h + +#define __SYSCALL_LL_E(x) (x) +#define __SYSCALL_LL_O(x) (x) + +#define VDSO_USEFUL +#define VDSO_CGT_SYM "__vdso_clock_gettime" +#define VDSO_CGT_VER "LINUX_2.6" +#define VDSO_GETCPU_SYM "__vdso_getcpu" +#define VDSO_GETCPU_VER "LINUX_2.6" + +#define IPC_64 0 + + +// a different, tcc-compatible implementation of syscall invocations functions + +static long __syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6); +asm ( + //".globl __syscall6;" + ".type __syscall6, @function;" + "__syscall6:;" + "movq %rdi, %rax;" + "movq %rsi, %rdi;" + "movq %rdx, %rsi;" + "movq %rcx, %rdx;" + "movq %r8, %r10;" + "movq %r9, %r8;" + "movq 8(%rsp),%r9;" + "syscall;" + "ret" +); + +static __inline long __syscall5(long n, long a1, long a2, long a3, long a4, long a5) { + return __syscall6(n, a1, a2, a3, a4, a5, 0); +} + +static __inline long __syscall4(long n, long a1, long a2, long a3, long a4) { + return __syscall6(n, a1, a2, a3, a4, 0, 0); +} + +static __inline long __syscall3(long n, long a1, long a2, long a3) { + return __syscall6(n, a1, a2, a3, 0, 0, 0); +} + +static __inline long __syscall2(long n, long a1, long a2) { + return __syscall6(n, a1, a2, 0, 0, 0, 0); +} + +static __inline long __syscall1(long n, long a1) { + return __syscall6(n, a1, 0, 0, 0, 0, 0); +} + +static __inline long __syscall0(long n) { + return __syscall6(n, 0, 0, 0, 0, 0, 0); +} diff --git a/06/recipes/2a0-static-gnumake.sh b/06/recipes/2a0-static-gnumake.sh new file mode 100755 index 0000000..94e43e7 --- /dev/null +++ b/06/recipes/2a0-static-gnumake.sh @@ -0,0 +1,54 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3 +#> FROM http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz + +set -uex + +export PATH=/store/1-stage1/tinycc/wrappers:/store/1-stage1/protobusybox/bin + +mkdir -p /store/2a0-static-gnumake /tmp/2a0-static-gnumake +cd /tmp/2a0-static-gnumake + +echo "### $0: unpacking static GNU Make sources..." +tar --strip-components=1 -xf /downloads/make-4.4.1.tar.gz + +echo "### $0: fixing up static GNU Make sources..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + src/job.c build-aux/install-sh po/Makefile.in.in +# this is part of stdlib, no idea how it's supposed to not clash +rm src/getopt.h +for f in src/getopt.c src/getopt1.c; do :> $f; done +for f in lib/fnmatch.c lib/glob.c lib/xmalloc.c lib/error.c; do :> $f; done +# embrace chaos +shuffle_comment='\/\* Handle shuffle mode argument. \*\/' +shuffle_default='if (!shuffle_mode) shuffle_mode = xstrdup(\"random\");' +sed -i "s|$shuffle_comment|$shuffle_comment\n$shuffle_default|" src/main.c +grep 'if (!shuffle_mode) shuffle_mode = xstrdup("random");' src/main.c + +echo "### $0: building static GNU Make..." +ash ./configure \ + --build x86_64-linux \ + --disable-dependency-tracking \ + --prefix=/store/2a0-static-gnumake \ + CONFIG_SHELL='/store/1-stage1/protobusybox/bin/ash' \ + SHELL='/store/1-stage1/protobusybox/bin/ash' +ash ./build.sh + +echo "### $0: testing static GNU Make by remaking it with itself..." +mv make make-intermediate +./make-intermediate -j $NPROC clean +./make-intermediate -j $NPROC CFLAGS=-O2 + +echo "### $0: installing static GNU Make..." +./make -j $NPROC install + +echo "### $0: creating a wrapper that respects \$SHELL..." +# FIXME: patch make to use getenv? +mkdir /store/2a0-static-gnumake/wrappers; cd /store/2a0-static-gnumake/wrappers +echo "#!/store/1-stage1/protobusybox/bin/ash" > make +echo "exec /store/2a0-static-gnumake/bin/make SHELL=\$SHELL \"\$@\"" \ >> make +chmod +x make + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a0 /store/2a0-static-gnumake ) diff --git a/06/recipes/2a1-static-binutils.sh b/06/recipes/2a1-static-binutils.sh new file mode 100755 index 0000000..d5a6e85 --- /dev/null +++ b/06/recipes/2a1-static-binutils.sh @@ -0,0 +1,47 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH 645c25f563b8adc0a81dbd6a41cffbf4d37083a382e02d5d3df4f65c09516d00 +#> FROM https://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/1-stage1/tinycc/wrappers" +export PATH="$PATH:/store/2a0-static-gnumake/bin" + +mkdir -p /tmp/2a1-static-binutils; cd /tmp/2a1-static-binutils +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking binutils sources..." +tar --strip-components=1 -xf /downloads/binutils-2.39.tar.xz + +echo "### $0: building static binutils..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + missing install-sh mkinstalldirs +mkdir aliases +ln -s /store/1-stage1/protobusybox/bin/true aliases/makeinfo +PATH="/tmp/2a1-static-binutils/aliases:$PATH" +export lt_cv_sys_max_cmd_len=32768 +# see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 +sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh + +ash configure \ + CONFIG_SHELL=/store/1-stage1/protobusybox/bin/ash \ + SHELL=/store/1-stage1/protobusybox/bin/ash \ + CFLAGS='-O2 -D__LITTLE_ENDIAN__=1' \ + CFLAGS_FOR_TARGET=-O2 \ + MAKEINFO=/store/1-stage1/protobusybox/bin/true \ + --disable-gprofng \ + --enable-deterministic-archives \ + --host x86_64-linux --build x86_64-linux \ + --prefix=/store/2a1-static-binutils +make -j $NPROC all-libiberty all-gas all-bfd all-libctf all-zlib all-gprof +make all-ld # race condition on ld/.deps/ldwrite.Po, serialize +make -j $NPROC + +echo "### $0: installing static binutils..." +make -j $NPROC install +rm /store/2a1-static-binutils/lib/*.la # broken, reference builddir + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a1 /store/2a1-static-binutils ) diff --git a/06/recipes/2a2-static-gnugcc4-c.sh b/06/recipes/2a2-static-gnugcc4-c.sh new file mode 100755 index 0000000..3ca528f --- /dev/null +++ b/06/recipes/2a2-static-gnugcc4-c.sh @@ -0,0 +1,71 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH f69eff1bc3d15d4e59011d587c57462a8d3d32cf2378d32d30d008a42a863325 +#> FROM https://gmplib.org/download/gmp/archive/gmp-4.3.2.tar.xz + +#> FETCH d7271bbfbc9ddf387d3919df8318cd7192c67b232919bfa1cb3202d07843da1b +#> FROM https://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.xz + +#> FETCH e664603757251fd8a352848276497a4c79b7f8b21fd8aedd5cc0598a38fee3e4 +#> FROM http://www.multiprecision.org/downloads/mpc-0.8.1.tar.gz + +#> FETCH 92e61c6dc3a0a449e62d72a38185fda550168a86702dea07125ebd3ec3996282 +#> FROM https://ftp.gnu.org/gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2 + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/1-stage1/tinycc/wrappers" +export PATH="$PATH:/store/2a0-static-gnumake/bin" + +mkdir -p /tmp/2a2-static-gnugcc4-c; cd /tmp/2a2-static-gnugcc4-c +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/1-stage1/protobusybox/bin/ash aliases/sh +export PATH="/tmp/2a2-static-gnugcc4-c/aliases:$PATH" + +echo "### $0: unpacking GNU GCC sources..." +mkdir mpfr mpc gmp +tar --strip-components=1 -xf /downloads/gcc-4.7.4.tar.bz2 +tar --strip-components=1 -xf /downloads/mpfr-2.4.2.tar.xz -C mpfr +tar --strip-components=1 -xf /downloads/mpc-0.8.1.tar.gz -C mpc +tar --strip-components=1 -xf /downloads/gmp-4.3.2.tar.xz -C gmp + +echo "### $0: building static GNU GCC 4 (statically linked, C only)" +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + missing move-if-change mkdep mkinstalldirs symlink-tree \ + gcc/genmultilib */*.sh gcc/exec-tool.in \ + install-sh */install-sh +sed -i 's|^\(\s*\)sh |\1/store/1-stage1/protobusybox/bin/ash |' \ + Makefile* */Makefile* +sed -i 's|LIBGCC2_DEBUG_CFLAGS = -g|LIBGCC2_DEBUG_CFLAGS = |' \ + libgcc/Makefile.in +# see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 +sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh */ltmain.sh +ash configure \ + CONFIG_SHELL='/store/1-stage1/protobusybox/bin/ash' \ + SHELL='/store/1-stage1/protobusybox/bin/ash' \ + CFLAGS=-O2 CFLAGS_FOR_TARGET=-O2 \ + --with-sysroot=/store/1-stage1/protomusl \ + --with-native-system-header-dir=/include \ + --with-build-time-tools=/store/2a1-static-binutils/bin \ + --prefix=/store/2a2-static-gnugcc4-c \ + --enable-languages=c \ + --disable-bootstrap \ + --disable-libquadmath --disable-decimal-float --disable-fixed-point \ + --disable-lto \ + --disable-libgomp \ + --disable-multilib \ + --disable-multiarch \ + --disable-libmudflap \ + --disable-libssp \ + --disable-nls \ + --host x86_64-linux --build x86_64-linux +make -j $NPROC + +echo "### $0: installing static GNU GCC 4 (statically linked, C only)" +make -j $NPROC install + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a2 /store/2a2-static-gnugcc4-c ) diff --git a/06/recipes/2a3-intermediate-musl.sh b/06/recipes/2a3-intermediate-musl.sh new file mode 100755 index 0000000..afe7d73 --- /dev/null +++ b/06/recipes/2a3-intermediate-musl.sh @@ -0,0 +1,36 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH 7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039 +#> FROM http://musl.libc.org/releases/musl-1.2.4.tar.gz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a2-static-gnugcc4-c/bin" + +mkdir -p /tmp/2a3-intermediate-musl; cd /tmp/2a3-intermediate-musl +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking musl sources..." +tar --strip-components=1 -xf /downloads/musl-1.2.4.tar.gz + +echo "### $0: building musl with GNU GCC..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + tools/*.sh \ +# patch popen/system to search in PATH instead of hardcoding /bin/sh +sed -i 's|posix_spawn(&pid, "/bin/sh",|posix_spawnp(\&pid, "sh",|' \ + src/stdio/popen.c src/process/system.c +sed -i 's|execl("/bin/sh", "sh", "-c",|execlp("sh", "-c",|'\ + src/misc/wordexp.c +# eliminiate a source path reference +sed -i 's/__FILE__/"__FILE__"/' include/assert.h +ash ./configure --prefix=/store/2a3-intermediate-musl +make -j $NPROC + +echo "### $0: installing musl..." +make -j $NPROC install + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a3 /store/2a3-intermediate-musl ) diff --git a/06/recipes/2a4-gnugcc4-cpp.sh b/06/recipes/2a4-gnugcc4-cpp.sh new file mode 100755 index 0000000..d30a974 --- /dev/null +++ b/06/recipes/2a4-gnugcc4-cpp.sh @@ -0,0 +1,97 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH f69eff1bc3d15d4e59011d587c57462a8d3d32cf2378d32d30d008a42a863325 +#> FROM https://gmplib.org/download/gmp/archive/gmp-4.3.2.tar.xz + +#> FETCH d7271bbfbc9ddf387d3919df8318cd7192c67b232919bfa1cb3202d07843da1b +#> FROM https://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.xz + +#> FETCH e664603757251fd8a352848276497a4c79b7f8b21fd8aedd5cc0598a38fee3e4 +#> FROM http://www.multiprecision.org/downloads/mpc-0.8.1.tar.gz + +#> FETCH 92e61c6dc3a0a449e62d72a38185fda550168a86702dea07125ebd3ec3996282 +#> FROM https://ftp.gnu.org/gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2 + +set -uex + +export PATH='/store/_2a0-ccache/wrappers/c' # may or may not exist +export PATH="$PATH:/store/1-stage1/protobusybox/bin" +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a2-static-gnugcc4-c/bin" + +mkdir -p /tmp/2a4-gnugcc4-cpp; cd /tmp/2a4-gnugcc4-cpp +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/1-stage1/protobusybox/bin/ash aliases/sh +export PATH="/tmp/2a4-gnugcc4-cpp/aliases:$PATH" + +echo "### $0: creating wrappers that make previous GNU GCC target new musl..." +SYSROOT=/store/2a3-intermediate-musl +export _SYSROOT="--sysroot $SYSROOT" +export _LDFLAG="--dynamic-linker=$SYSROOT/lib/libc.so" +export _NEWINC="-I$SYSROOT/include" +export _REALCC="-I$SYSROOT/include" +mkdir wrappers +echo '#!/store/1-stage1/protobusybox/bin/ash' > wrappers/cc +echo '#!/store/1-stage1/protobusybox/bin/ash' > wrappers/cpp +echo '#!/store/1-stage1/protobusybox/bin/ash' > wrappers/ld +echo 'exec gcc $_SYSROOT -Wl,$_LDFLAG "$@"' >> wrappers/cc +echo 'exec /store/2a2-static-gnugcc4-c/bin/cpp $_NEWINC "$@"' >> wrappers/cpp +echo 'exec /store/2a1-static-binutils/bin/ld $_LDFLAG "$@"' >> wrappers/ld +chmod +x wrappers/cc wrappers/cpp wrappers/ld +export PATH="/tmp/2a4-gnugcc4-cpp/wrappers:$PATH" + +echo "### $0: unpacking GNU GCC 4 sources..." +mkdir mpfr mpc gmp +tar --strip-components=1 -xf /downloads/gcc-4.7.4.tar.bz2 +tar --strip-components=1 -xf /downloads/mpfr-2.4.2.tar.xz -C mpfr +tar --strip-components=1 -xf /downloads/mpc-0.8.1.tar.gz -C mpc +tar --strip-components=1 -xf /downloads/gmp-4.3.2.tar.xz -C gmp + +echo "### $0: fixing up GNU GCC 4 sources..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + missing move-if-change mkdep mkinstalldirs symlink-tree \ + gcc/genmultilib */*.sh gcc/exec-tool.in \ + install-sh */install-sh +sed -i 's|^\(\s*\)sh |\1/store/1-stage1/protobusybox/bin/ash |' \ + Makefile* */Makefile* +sed -i 's|LIBGCC2_DEBUG_CFLAGS = -g|LIBGCC2_DEBUG_CFLAGS = |' \ + libgcc/Makefile.in +sed -i "s|/lib64/ld-linux-x86-64.so.2|$SYSROOT/lib/libc.so|" \ + gcc/config/i386/linux64.h +sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host +# see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 +sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh */ltmain.sh + +echo "### $0: building GNU GCC 4 (dynamically linked, with C++ support)" +ash configure \ + cache_file=nonex \ + CONFIG_SHELL='/store/1-stage1/protobusybox/bin/ash' \ + SHELL='/store/1-stage1/protobusybox/bin/ash' \ + CC=cc CPP=cpp LD=ld \ + CFLAGS=-O2 CFLAGS_FOR_TARGET=-O2 \ + --with-sysroot=$SYSROOT \ + --with-native-system-header-dir=/include \ + --with-build-time-tools=/store/2a1-static-binutils/bin \ + --prefix=/store/2a4-gnugcc4-cpp \ + --with-specs='%{!static:%x{-rpath=/store/2a4-gnugcc4-cpp/lib64}}' \ + --enable-languages=c,c++ \ + --disable-bootstrap \ + --disable-libquadmath --disable-decimal-float --disable-fixed-point \ + --disable-lto \ + --disable-libgomp \ + --disable-multilib \ + --disable-multiarch \ + --disable-libmudflap \ + --disable-libssp \ + --disable-nls \ + --disable-libitm \ + --host x86_64-linux --build x86_64-linux +make -j $NPROC +echo "### $0: installing GNU GCC 4 (dynamically linked, with C++ support)" +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a4 /store/2a4-gnugcc4-cpp ) diff --git a/06/recipes/2a5-gnugcc10.sh b/06/recipes/2a5-gnugcc10.sh new file mode 100755 index 0000000..cbc4b6a --- /dev/null +++ b/06/recipes/2a5-gnugcc10.sh @@ -0,0 +1,90 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH 68dadacce515b0f8a54f510edf07c1b636492bcdb8e8d54c56eb216225d16989 +#> FROM https://gmplib.org/download/gmp/gmp-6.1.0.tar.xz + +#> FETCH 761413b16d749c53e2bfd2b1dfaa3b027b0e793e404b90b5fbaeef60af6517f5 +#> FROM https://www.mpfr.org/mpfr-3.1.4/mpfr-3.1.4.tar.xz + +#> FETCH 617decc6ea09889fb08ede330917a00b16809b8db88c29c31bfbb49cbf88ecc3 +#> FROM http://www.multiprecision.org/downloads/mpc-1.0.3.tar.gz + +#> FETCH 6b8b0fd7f81d0a957beb3679c81bbb34ccc7568d5682844d8924424a0dadcb1b +#> FROM http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 + +#> FETCH 25109543fdf46f397c347b5d8b7a2c7e5694a5a51cce4b9c6e1ea8a71ca307c1 +#> FROM https://ftp.gnu.org/gnu/gcc/gcc-10.5.0/gcc-10.5.0.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a4-gnugcc4-cpp/bin" + +mkdir -p /tmp/2a5-gnugcc10; cd /tmp/2a5-gnugcc10 +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/1-stage1/protobusybox/bin/ash aliases/sh +export PATH="/tmp/2a5-gnugcc10/aliases:$PATH" + +SYSROOT=/store/2a3-intermediate-musl + +echo "### $0: unpacking GNU GCC 10 sources..." +mkdir gmp mpfr mpc isl +tar --strip-components=1 -xf /downloads/gcc-10.5.0.tar.xz +tar --strip-components=1 -xf /downloads/gmp-6.1.0.tar.xz -C gmp +tar --strip-components=1 -xf /downloads/mpfr-3.1.4.tar.xz -C mpfr +tar --strip-components=1 -xf /downloads/mpc-1.0.3.tar.gz -C mpc +tar --strip-components=1 -xf /downloads/isl-0.18.tar.bz2 -C isl + +echo "### $0: fixing up GNU GCC 10 sources..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + missing move-if-change mkdep mkinstalldirs symlink-tree install-sh \ + gcc/exec-tool.in libgcc/mkheader.sh +sed -i 's|^\(\s*\)sh |\1/store/1-stage1/protobusybox/bin/ash |' \ + libgcc/Makefile.in +sed -i 's|LIBGCC2_DEBUG_CFLAGS = -g|LIBGCC2_DEBUG_CFLAGS = |' \ + libgcc/Makefile.in +sed -i "s|/lib/ld-musl-x86_64.so.1|$SYSROOT/lib/libc.so|" \ + gcc/config/i386/linux64.h +sed -i 's|m64=../lib64|m64=../lib|' gcc/config/i386/t-linux64 +sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host +# see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 +sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh */ltmain.sh + +echo "### $0: building GNU GCC 10" +ash configure \ + CONFIG_SHELL='/store/1-stage1/protobusybox/bin/ash' \ + SHELL='/store/1-stage1/protobusybox/bin/ash' \ + CFLAGS=-O2 CXX_FLAGS=-O2 \ + CFLAGS_FOR_TARGET=-O2 CXXFLAGS_FOR_TARGET=-O2 \ + --with-sysroot=$SYSROOT \ + --with-native-system-header-dir=/include \ + --with-build-time-tools=/store/2a1-static-binutils/bin \ + --prefix=/store/2a5-gnugcc10 \ + --with-specs='%{!static:%x{-rpath=/store/2a5-gnugcc10/lib}}' \ + --enable-languages=c,c++ \ + --disable-bootstrap \ + --disable-libquadmath --disable-decimal-float --disable-fixed-point \ + --disable-lto \ + --disable-libgomp \ + --disable-multilib \ + --disable-multiarch \ + --disable-libmudflap \ + --disable-libssp \ + --disable-nls \ + --disable-libitm \ + --disable-libsanitizer \ + --disable-cet \ + --disable-gnu-unique-object \ + --disable-gcov \ + --disable-checking \ + --host x86_64-linux-musl --build x86_64-linux-musl +make -j $NPROC +echo "### $0: installing GNU GCC 10" +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a5 /store/2a5-gnugcc10 ) diff --git a/06/recipes/2a6-linux-headers.sh b/06/recipes/2a6-linux-headers.sh new file mode 100755 index 0000000..c074bd9 --- /dev/null +++ b/06/recipes/2a6-linux-headers.sh @@ -0,0 +1,36 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH cca91be956fe081f8f6da72034cded96fe35a50be4bfb7e103e354aa2159a674 +#> FROM https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.4.12.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a5-gnugcc10/bin" + +mkdir -p /tmp/2a6-linux-headers; cd /tmp/2a6-linux-headers +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking Linux sources..." +tar --strip-components=1 -xf /downloads/linux-6.4.12.tar.xz \ + linux-6.4.12/Makefile \ + linux-6.4.12/arch/x86 \ + linux-6.4.12/include \ + linux-6.4.12/scripts \ + linux-6.4.12/tools + +echo "### $0: building Linux headers..." +make -j $NPROC \ + CONFIG_SHELL=/store/1-stage1/protobusybox/bin/ash \ + CC=gcc HOSTCC=gcc ARCH=x86_64 \ + headers + +echo "### $0: installing Linux headers..." +mkdir -p /store/2a6-linux-headers/ +find usr/include -name '.*' | xargs rm +cp -rv usr/include /store/2a6-linux-headers/ + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a6 /store/2a6-linux-headers ) diff --git a/06/recipes/2a7-cmake.sh b/06/recipes/2a7-cmake.sh new file mode 100755 index 0000000..f99d3b8 --- /dev/null +++ b/06/recipes/2a7-cmake.sh @@ -0,0 +1,48 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH 0a905ca8635ca81aa152e123bdde7e54cbe764fdd9a70d62af44cad8b92967af +#> FROM https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4.tar.gz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin/' +export PATH="$PATH:/store/2a0-static-gnumake/wrappers" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a5-gnugcc10/bin" + +export SHELL=/store/1-stage1/protobusybox/bin/ash + +mkdir -p /tmp/2a7-cmake; cd /tmp/2a7-cmake +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking CMake sources..." +tar --strip-components=1 -xf /downloads/cmake-3.27.4.tar.gz + +echo "### $0: fixing up CMake sources..." +sed -i "s|/bin/sh|$SHELL|" bootstrap +sed -i 's|__FILE__|"__FILE__"|' \ + Source/CPack/IFW/cmCPackIFWCommon.h \ + Source/CPack/cmCPack*.h \ + Source/cmCTest.h + +echo "### $0: bundling libraries..." +# poor man's static linking, a way for cmake to be self-contained later +mkdir -p /store/2a7-cmake/bundled-runtime +cp -H /store/2a5-gnugcc10/lib/libstdc++.so.6 /store/2a7-cmake/bundled-runtime/ +cp -H /store/2a5-gnugcc10/lib/libgcc_s.so.1 /store/2a7-cmake/bundled-runtime/ + +echo "### $0: building CMake..." +ash configure \ + CFLAGS="-DCPU_SETSIZE=128 -D_GNU_SOURCE" \ + CXXFLAGS="-isystem /store/2a6-linux-headers/include" \ + LDFLAGS="-Wl,-rpath /store/2a7-cmake/bundled-runtime" \ + --prefix=/store/2a7-cmake \ + --parallel=$NPROC \ + -- \ + -DCMAKE_USE_OPENSSL=OFF +make -j $NPROC +echo "### $0: installing CMake..." +make -j $NPROC install/strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a7 /store/2a7-cmake ) diff --git a/06/recipes/2a8-python.sh b/06/recipes/2a8-python.sh new file mode 100755 index 0000000..fe15f7e --- /dev/null +++ b/06/recipes/2a8-python.sh @@ -0,0 +1,70 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH 795c34f44df45a0e9b9710c8c71c15c671871524cd412ca14def212e8ccb155d +#> FROM https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin/' +export PATH="$PATH:/store/2a0-static-gnumake/wrappers" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a5-gnugcc10/bin" + +export SHELL=/store/1-stage1/protobusybox/bin/ash + +mkdir -p /tmp/2a8-python; cd /tmp/2a8-python +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/1-stage1/protobusybox/bin/ash aliases/sh +export PATH="/tmp/2a8-python/aliases:$PATH" + +echo "### $0: unpacking CPython sources..." +tar --strip-components=1 -xf /downloads/Python-3.12.0.tar.xz + +echo "### $0: fixing up CPython sources..." +sed -i "s|/bin/sh|$SHELL|" configure install-sh +sed -i 's|ac_sys_system=`uname -s`|ac_sys_system=Linux|' configure +# the precompiled pyc files aren't reproducible, +# but it's not like I need to waste time on them anyway. +# break their generation +mv Lib/compileall.py Lib/compileall.py.bak +echo 'import sys; sys.exit(0)' > Lib/compileall.py; chmod +x Lib/compileall.py +sed -i 's|__FILE__|"__FILE__"|' \ + Python/errors.c \ + Include/pyerrors.h \ + Include/cpython/object.h \ + Modules/pyexpat.c +sed -i 's|TIME __TIME__|TIME "xx:xx:xx"|' Modules/getbuildinfo.c +sed -i 's|DATE __DATE__|DATE "xx/xx/xx"|' Modules/getbuildinfo.c +# different build path length leads to different wrapping. avoid +sed -i 's|vars, stream=f|vars, stream=f, width=2**24|' Lib/sysconfig.py + +echo "### $0: building CPython..." +mkdir -p /store/2a8-python/lib +ash configure \ + ac_cv_broken_sem_getvalue=yes \ + ac_cv_posix_semaphores_enabled=no \ + OPT='-DNDEBUG -fwrapv -O3 -Wall' \ + LDFLAGS='-Wl,-rpath /store/2a8-python/lib' \ + --without-static-libpython \ + --build x86_64-linux-musl \ + --prefix=/store/2a8-python \ + --enable-shared \ + --with-ensurepip=no +# ensure reproducibility in case of no /dev/shm +grep 'define POSIX_SEMAPHORES_NOT_ENABLED 1' pyconfig.h +grep 'define HAVE_BROKEN_SEM_GETVALUE 1' pyconfig.h +make -j $NPROC + +echo "### $0: installing CPython..." +make -j $NPROC install +# strip builddir mentions +sed -i "s|/tmp/2a8-python|...|g" \ + /store/2a8-python/lib/python3.*/_sysconfigdata__*.py \ + /store/2a8-python/lib/python3.*/config-3.*-x86_64-linux-musl/Makefile +# restore compileall just in case +cat Lib/compileall.py.bak > /store/2a8-python/lib/python3.12/compileall.py + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a8 /store/2a8-python ) diff --git a/06/recipes/2a9-intermediate-clang.sh b/06/recipes/2a9-intermediate-clang.sh new file mode 100755 index 0000000..c036504 --- /dev/null +++ b/06/recipes/2a9-intermediate-clang.sh @@ -0,0 +1,142 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH b0e42aafc01ece2ca2b42e3526f54bebc4b1f1dc8de6e34f46a0446a13e882b9 +#> FROM https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.1/llvm-project-17.0.1.src.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin/' +export PATH="$PATH:/store/2a0-static-gnumake/wrappers" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a5-gnugcc10/bin" +export PATH="$PATH:/store/2a7-cmake/bin" +export PATH="$PATH:/store/2a8-python/bin" + +export SHELL=/store/1-stage1/protobusybox/bin/ash +GCC_PATH=/store/2a5-gnugcc10 + +mkdir -p /tmp/2a9-intermediate-clang; cd /tmp/2a9-intermediate-clang +# clang's cmake configuration should pick up ccache automatically from PATH +#if [ -e /ccache/setup ]; then . /ccache/setup; fi +export PATH="$PATH:/ccache/bin" +command -v ccache && USE_CCACHE=YES || USE_CCACHE=NO + +echo "### $0: preparing future sysroot..." +OUT=/store/2a9-intermediate-clang +SYSROOT=$OUT/sysroot +mkdir -p $SYSROOT/lib $SYSROOT/include +ln -s /store/2a3-intermediate-musl/lib/* $SYSROOT/lib/ +ln -s /store/2a3-intermediate-musl/include/* $SYSROOT/include/ + +echo "### $0: unpacking LLVM/Clang sources..." +tar --strip-components=1 -xf /downloads/llvm-project-17.0.1.src.tar.xz + +echo "### $0: fixing up LLVM/Clang sources..." +sed -i "s|COMMAND sh|COMMAND $SHELL|" \ + llvm/cmake/modules/GetHostTriple.cmake clang/CMakeLists.txt +echo 'echo x86_64-unknown-linux-musl' > llvm/cmake/config.guess +LOADER=/store/2a3-intermediate-musl/lib/libc.so +sed -i "s|/lib/ld-musl-\" + ArchName + \".so.1|$LOADER|" \ + clang/lib/Driver/ToolChains/Linux.cpp +BEGINEND='const bool HasCRTBeginEndFiles' +sed -i "s|${BEGINEND} =|${BEGINEND} = false; ${BEGINEND}_unused =|" \ + clang/lib/Driver/ToolChains/Gnu.cpp +REL_ORIGIN='_install_rpath \"\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}\"' +sed -i "s|_install_rpath \"\\\\\$ORIGIN/..|_install_rpath \"$OUT|" \ + llvm/cmake/modules/AddLLVM.cmake +sed -i 's|numShards = 32;|numShards = 1;|' lld/*/SyntheticSections.* +sed -i 's|numShards = 256;|numShards = 1;|' lld/*/ICF.cpp +sed -i 's|__FILE__|"__FILE__"|' compiler-rt/lib/builtins/int_util.h +sed -i 's|"@LLVM_SRC_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in +sed -i 's|"@LLVM_OBJ_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in + +echo "### $0: building LLVM/Clang (stage 1)..." +export LD_LIBRARY_PATH='/store/2a5-gnugcc10/lib' + +EXTRA_INCL='/tmp/2a9-intermediate-clang/extra_includes' +mkdir -p $EXTRA_INCL +cp clang/lib/Headers/*intrin*.h $EXTRA_INCL/ +cp clang/lib/Headers/mm_malloc.h $EXTRA_INCL/ +[ -e $EXTRA_INCL/immintrin.h ] + +BOTH_STAGES_OPTS='' +add_opt() { + BOTH_STAGES_OPTS="$BOTH_STAGES_OPTS -D$1 -DBOOTSTRAP_$1" +} +add_opt CMAKE_BUILD_TYPE=MinSizeRel +add_opt LLVM_OPTIMIZED_TABLEGEN=YES +add_opt LLVM_CCACHE_BUILD=$USE_CCACHE +add_opt DEFAULT_SYSROOT=$SYSROOT +add_opt CMAKE_INSTALL_PREFIX=$OUT +add_opt LLVM_INSTALL_BINUTILS_SYMLINKS=YES +add_opt LLVM_INSTALL_CCTOOLS_SYMLINKS=YES +add_opt CMAKE_INSTALL_DO_STRIP=YES +add_opt LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=YES +add_opt LLVM_TARGET_ARCH=X86 +add_opt LLVM_TARGETS_TO_BUILD=Native +add_opt LLVM_BUILTIN_TARGETS=x86_64-unknown-linux-musl +add_opt LLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl +add_opt LLVM_HOST_TRIPLE=x86_64-unknown-linux-musl +add_opt COMPILER_RT_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl +add_opt LLVM_APPEND_VC_REV=NO +add_opt LLVM_INCLUDE_TESTS=NO +add_opt LLVM_INCLUDE_EXAMPLES=NO +add_opt LLVM_INCLUDE_BENCHMARKS=NO +add_opt LLVM_ENABLE_BACKTRACES=NO +add_opt LLVM_ENABLE_EH=YES +add_opt LLVM_ENABLE_RTTI=YES +add_opt CLANG_ENABLE_ARCMT=NO +add_opt CLANG_ENABLE_STATIC_ANALYZER=NO +add_opt COMPILER_RT_BUILD_SANITIZERS=NO +add_opt COMPILER_RT_BUILD_XRAY=NO +add_opt COMPILER_RT_BUILD_LIBFUZZER=NO +add_opt COMPILER_RT_BUILD_PROFILE=NO +add_opt COMPILER_RT_BUILD_MEMPROF=NO +add_opt COMPILER_RT_BUILD_ORC=NO +add_opt COMPILER_RT_USE_BUILTINS_LIBRARY=YES +add_opt CLANG_DEFAULT_CXX_STDLIB=libc++ +add_opt CLANG_DEFAULT_LINKER=lld +add_opt CLANG_DEFAULT_RTLIB=compiler-rt +add_opt LIBCXX_HAS_MUSL_LIBC=YES +add_opt LIBCXX_USE_COMPILER_RT=YES +add_opt LIBCXX_INCLUDE_BENCHMARKS=NO +add_opt LIBCXX_CXX_ABI=libcxxabi +add_opt LIBCXX_ADDITIONAL_COMPILE_FLAGS=-I/store/2a6-linux-headers/include +add_opt LIBCXXABI_USE_COMPILER_RT=YES +add_opt LIBCXXABI_USE_LLVM_UNWINDER=YES +add_opt LLVM_INSTALL_TOOLCHAIN_ONLY=YES +add_opt LIBUNWIND_USE_COMPILER_RT=YES +add_opt LLVM_ENABLE_THREADS=NO + +cmake -S llvm -B build -G 'Unix Makefiles' \ + -DLLVM_ENABLE_PROJECTS='clang;lld' \ + -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \ + -DGCC_INSTALL_PREFIX=$GCC_PATH \ + -DCMAKE_C_FLAGS=--sysroot=$SYSROOT \ + "-DBOOTSTRAP_CMAKE_C_FLAGS=-isystem $EXTRA_INCL" \ + "-DBOOTSTRAP_CMAKE_CXX_FLAGS=-isystem $EXTRA_INCL" \ + -DCLANG_ENABLE_BOOTSTRAP=YES $BOTH_STAGES_OPTS + +make -C build -j $NPROC clang lld runtimes + +echo "### $0: building LLVM/Clang (stage 2)..." +NEW_LIB_DIR="$(pwd)/build/lib/x86_64-unknown-linux-musl" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$NEW_LIB_DIR" +make -C build -j $NPROC stage2 + +echo "### $0: installing LLVM/Clang..." +make -C build -j $NPROC stage2-install +ln -s $OUT/lib/x86_64-unknown-linux-musl/* $OUT/lib/ + +echo "### $0: setting up generic names..." +mkdir $OUT/bin/generic-names +ln -s $OUT/bin/clang $OUT/bin/generic-names/cc +ln -s $OUT/bin/clang++ $OUT/bin/generic-names/c++ +ln -s $OUT/bin/clang-cpp $OUT/bin/generic-names/cpp + +echo "### $0: mixing new stuff into sysroot..." +ln -s $OUT/lib/* $OUT/sysroot/lib/ + +echo "### $0: NOT checking for build path leaks - see _2a9.test.sh" diff --git a/06/recipes/2b0-musl.sh b/06/recipes/2b0-musl.sh new file mode 100755 index 0000000..52faa6a --- /dev/null +++ b/06/recipes/2b0-musl.sh @@ -0,0 +1,36 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH 7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039 +#> FROM http://musl.libc.org/releases/musl-1.2.4.tar.gz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a9-intermediate-clang/bin/generic-names" + +mkdir -p /tmp/2b0-musl; cd /tmp/2b0-musl +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking musl sources..." +tar --strip-components=1 -xf /downloads/musl-1.2.4.tar.gz + +echo "### $0: building musl..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' \ + tools/*.sh \ +# patch popen/system to search in PATH instead of hardcoding /bin/sh +sed -i 's|posix_spawn(&pid, "/bin/sh",|posix_spawnp(\&pid, "sh",|' \ + src/stdio/popen.c src/process/system.c +# avoid absolute path references +sed -i 's/__FILE__/__FILE_NAME__/' include/assert.h +ash ./configure --prefix=/store/2b0-musl CFLAGS=-O2 +make -j $NPROC + +echo "### $0: installing musl..." +make -j $NPROC install +mkdir /store/2b0-musl/bin +ln -s /store/2b0-musl/lib/libc.so /store/2b0-musl/bin/ldd + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2b0 /store/2b0-musl ) diff --git a/06/recipes/2b1-clang.sh b/06/recipes/2b1-clang.sh new file mode 100755 index 0000000..6c05336 --- /dev/null +++ b/06/recipes/2b1-clang.sh @@ -0,0 +1,153 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH b0e42aafc01ece2ca2b42e3526f54bebc4b1f1dc8de6e34f46a0446a13e882b9 +#> FROM https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.1/llvm-project-17.0.1.src.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin/' +export PATH="$PATH:/store/2a0-static-gnumake/wrappers" +export PATH="$PATH:/store/2a7-cmake/bin" +export PATH="$PATH:/store/2a8-python/bin" +# 2a9-intermediate-clang intentionally not added to $PATH to prevent confusion + +export SHELL=/store/1-stage1/protobusybox/bin/ash +PREV_CLANG=/store/2a9-intermediate-clang + +mkdir -p /tmp/2b1-clang; cd /tmp/2b1-clang +# clang's cmake configuration should pick up ccache automatically from PATH +#if [ -e /ccache/setup ]; then . /ccache/setup; fi +export PATH="$PATH:/ccache/bin" +command -v ccache && USE_CCACHE=YES || USE_CCACHE=NO + +echo "### $0: preparing future sysroot..." +OUT=/store/2b1-clang +SYSROOT=$OUT/sysroot +mkdir -p $SYSROOT/lib $SYSROOT/include +ln -s /store/2b0-musl/lib/* $SYSROOT/lib/ +ln -s /store/2b0-musl/include/* $SYSROOT/include/ + +echo "### $0: unpacking LLVM/Clang sources..." +tar --strip-components=1 -xf /downloads/llvm-project-17.0.1.src.tar.xz + +echo "### $0: fixing up LLVM/Clang sources..." +sed -i "s|COMMAND sh|COMMAND $SHELL|" \ + llvm/cmake/modules/GetHostTriple.cmake clang/CMakeLists.txt +echo 'echo x86_64-unknown-linux-musl' > llvm/cmake/config.guess +LOADER=/store/2b0-musl/lib/libc.so +sed -i "s|/lib/ld-musl-\" + ArchName + \".so.1|$LOADER|" \ + clang/lib/Driver/ToolChains/Linux.cpp +BEGINEND='const bool HasCRTBeginEndFiles' +sed -i "s|${BEGINEND} =|${BEGINEND} = false; ${BEGINEND}_unused =|" \ + clang/lib/Driver/ToolChains/Gnu.cpp +REL_ORIGIN='_install_rpath \"\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}\"' +sed -i "s|_install_rpath \"\\\\\$ORIGIN/..|_install_rpath \"$OUT|" \ + llvm/cmake/modules/AddLLVM.cmake +sed -i 's|numShards = 32;|numShards = 1;|' lld/*/SyntheticSections.* +sed -i 's|numShards = 256;|numShards = 1;|' lld/*/ICF.cpp +sed -i 's|__FILE__|__FILE_NAME__|' compiler-rt/lib/builtins/int_util.h +sed -i 's|"@LLVM_SRC_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in +sed -i 's|"@LLVM_OBJ_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in + +echo "### $0: building LLVM/Clang..." +export LD_LIBRARY_PATH="/store/2b0-musl/lib:$PREV_CLANG/lib" +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/tmp/2b1-clang/build/lib" # libLLVM + +EXTRA_INCL='/tmp/2b1-clang/extra_includes' +mkdir -p $EXTRA_INCL +cp clang/lib/Headers/*intrin*.h $EXTRA_INCL/ +cp clang/lib/Headers/mm_malloc.h $EXTRA_INCL/ +[ -e $EXTRA_INCL/immintrin.h ] + +OPTS='' +add_opt() { + OPTS="$OPTS -D$1" +} +add_opt CMAKE_BUILD_TYPE=Release +add_opt LLVM_OPTIMIZED_TABLEGEN=YES +add_opt LLVM_CCACHE_BUILD=$USE_CCACHE +add_opt DEFAULT_SYSROOT=$SYSROOT +add_opt CMAKE_INSTALL_PREFIX=$OUT +add_opt LLVM_INSTALL_BINUTILS_SYMLINKS=YES +add_opt LLVM_INSTALL_CCTOOLS_SYMLINKS=YES +add_opt CMAKE_INSTALL_DO_STRIP=YES +add_opt LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=YES +add_opt LLVM_TARGET_ARCH=X86 +add_opt LLVM_TARGETS_TO_BUILD=Native +add_opt LLVM_BUILTIN_TARGETS=x86_64-unknown-linux-musl +add_opt LLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl +add_opt LLVM_HOST_TRIPLE=x86_64-unknown-linux-musl +add_opt COMPILER_RT_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl +add_opt LLVM_APPEND_VC_REV=NO +add_opt LLVM_INCLUDE_TESTS=NO +add_opt LLVM_INCLUDE_EXAMPLES=NO +add_opt LLVM_INCLUDE_BENCHMARKS=NO +add_opt LLVM_ENABLE_BACKTRACES=NO +add_opt LLVM_ENABLE_EH=YES +add_opt LLVM_ENABLE_RTTI=YES +add_opt CLANG_ENABLE_ARCMT=NO +add_opt CLANG_ENABLE_STATIC_ANALYZER=NO +add_opt COMPILER_RT_BUILD_SANITIZERS=NO +add_opt COMPILER_RT_BUILD_XRAY=NO +add_opt COMPILER_RT_BUILD_LIBFUZZER=NO +add_opt COMPILER_RT_BUILD_PROFILE=NO +add_opt COMPILER_RT_BUILD_MEMPROF=NO +add_opt COMPILER_RT_BUILD_ORC=NO +add_opt COMPILER_RT_USE_BUILTINS_LIBRARY=YES +add_opt CLANG_DEFAULT_CXX_STDLIB=libc++ +add_opt CLANG_DEFAULT_LINKER=lld +add_opt CLANG_DEFAULT_RTLIB=compiler-rt +add_opt LIBCXX_HAS_MUSL_LIBC=YES +add_opt LIBCXX_USE_COMPILER_RT=YES +add_opt LIBCXX_INCLUDE_BENCHMARKS=NO +add_opt LIBCXX_CXX_ABI=libcxxabi +add_opt LIBCXXABI_USE_COMPILER_RT=YES +add_opt LIBCXXABI_USE_LLVM_UNWINDER=YES +add_opt LIBCXX_ADDITIONAL_COMPILE_FLAGS=-I/store/2a6-linux-headers/include +add_opt LLVM_INSTALL_TOOLCHAIN_ONLY=YES +add_opt LIBUNWIND_USE_COMPILER_RT=YES +add_opt LLVM_ENABLE_THREADS=NO + +REWRITE="-ffile-prefix-map=$(pwd)=/builddir/" +CFLAGS="--sysroot=$SYSROOT -I$EXTRA_INCL $REWRITE" +LDFLAGS="-Wl,--dynamic-linker=$LOADER" +cmake -S llvm -B build -G 'Unix Makefiles' \ + -DCMAKE_ASM_COMPILER=$PREV_CLANG/bin/clang \ + -DCMAKE_C_COMPILER=$PREV_CLANG/bin/clang \ + -DCMAKE_CXX_COMPILER=$PREV_CLANG/bin/clang++ \ + -DLLVM_ENABLE_PROJECTS='clang;lld' \ + -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \ + -DCMAKE_C_FLAGS="$CFLAGS" \ + -DCMAKE_CXX_FLAGS="$CFLAGS" \ + -DCMAKE_C_LINK_FLAGS="$LDFLAGS" \ + -DCMAKE_CXX_LINK_FLAGS="$LDFLAGS" \ + -DLLVM_BUILD_LLVM_DYLIB=YES \ + -DLLVM_LINK_LLVM_DYLIB=YES \ + -DCLANG_LINK_LLVM_DYLIB=YES \ + $OPTS + +make -C build -j $NPROC clang lld runtimes + +echo "### $0: installing LLVM/Clang..." +make -C build -j $NPROC install/strip +ln -s $OUT/lib/x86_64-unknown-linux-musl/* $OUT/lib/ + +echo "### $0: setting up generic names..." +ln -s $OUT/bin/clang $OUT/bin/cc +ln -s $OUT/bin/clang++ $OUT/bin/c++ +ln -s $OUT/bin/clang-cpp $OUT/bin/cpp +ln -s $OUT/bin/lld $OUT/bin/ld + +echo "### $0: HACK making linux target work..." +# FIXME boost wants it at lib/clang/17/lib/linux/libclang_rt.builtins-x86_64.a +OUTLIB=$OUT/lib/clang/17/lib +ln -s $OUTLIB/x86_64-unknown-linux-musl $OUTLIB/linux +ln -s $OUTLIB/x86_64-unknown-linux-musl/libclang_rt.builtins.a \ + $OUTLIB/x86_64-unknown-linux-musl/libclang_rt.builtins-x86_64.a + +echo "### $0: mixing new stuff into sysroot..." +ln -s $OUT/lib/* $OUT/sysroot/lib/ + +echo "### $0: NOT checking for build path leaks - see _2b1.test.sh" diff --git a/06/recipes/2b2-busybox.sh b/06/recipes/2b2-busybox.sh new file mode 100755 index 0000000..4b48394 --- /dev/null +++ b/06/recipes/2b2-busybox.sh @@ -0,0 +1,48 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314 +#> FROM https://busybox.net/downloads/busybox-1.36.1.tar.bz2 + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2b1-clang/bin" + +mkdir -p /tmp/2b2-busybox; cd /tmp/2b2-busybox +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/1-stage1/protobusybox/bin/ash aliases/sh +export PATH="/tmp/2b2-busybox/aliases:$PATH" + +echo "### $0: unpacking busybox sources..." +tar --strip-components=1 -xf /downloads/busybox-1.36.1.tar.bz2 + +echo "### $0: configuring busybox..." +BUSYBOX_FLAGS='CONFIG_SHELL=/store/1-stage1/protobusybox/bin/ash' +BUSYBOX_FLAGS="$BUSYBOX_FLAGS CC=cc HOSTCC=cc" +BUSYBOX_FLAGS="$BUSYBOX_FLAGS KCONFIG_NOTIMESTAMP=y" +BUSYBOX_CFLAGS='CFLAGS=-O2 -isystem /store/2a6-linux-headers/include' +echo -e '#!/store/1-stage1/protobusybox/bin/ash\nprintf 9999' \ + > scripts/gcc-version.sh +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|g' \ + scripts/gen_build_files.sh \ + scripts/mkconfigs scripts/embedded_scripts scripts/trylink \ + scripts/generate_BUFSIZ.sh \ + applets/usage_compressed applets/busybox.mkscripts applets/install.sh +make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" defconfig +sed -i 's|CONFIG_INSTALL_NO_USR=y|CONFIG_INSTALL_NO_USR=n|' .config +sed -i 's|CONFIG_FEATURE_COMPRESS_USAGE=y|CONFIG_FEATURE_COMPRESS_USAGE=n|' \ + .config + +echo "### $0: building busybox..." +make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" busybox busybox.links +sed -i 's|^/usr/s\?bin/|/bin/|' busybox.links + +echo "### $0: installing busybox..." +make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" \ + install CONFIG_PREFIX=/store/2b2-busybox + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2b2 /store/2b2-busybox ) diff --git a/06/recipes/2b3-gnumake.sh b/06/recipes/2b3-gnumake.sh new file mode 100755 index 0000000..b9d563c --- /dev/null +++ b/06/recipes/2b3-gnumake.sh @@ -0,0 +1,45 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3 +#> FROM http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2b1-clang/bin" + +mkdir -p /tmp/2b3-gnumake; cd /tmp/2b3-gnumake +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking GNU Make sources..." +tar --strip-components=1 -xf /downloads/make-4.4.1.tar.gz + +echo "### $0: fixing up GNU Make sources..." +# embrace chaos +shuffle_comment='\/\* Handle shuffle mode argument. \*\/' +shuffle_default='if (!shuffle_mode) shuffle_mode = xstrdup(\"random\");' +sed -i "s|$shuffle_comment|$shuffle_comment\n$shuffle_default|" src/main.c +grep 'if (!shuffle_mode) shuffle_mode = xstrdup("random");' src/main.c + +echo "### $0: building GNU Make..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' build-aux/install-sh +ash ./configure \ + CONFIG_SHELL=ash SHELL=ash MAKEINFO=true \ + --build x86_64-linux \ + --prefix=/store/2b3-gnumake \ + --disable-dependency-tracking +make -j $NPROC CFLAGS=-O2 + +echo "### $0: installing GNU Make with itself to test it..." +./make -j $NPROC SHELL=ash install-strip + +echo "### $0: creating a wrapper that respects \$SHELL..." +# FIXME: patch make to use getenv? +mkdir /store/2b3-gnumake/wrappers; cd /store/2b3-gnumake/wrappers +echo "#!/store/2b2-busybox/bin/ash" > make +echo "exec /store/2b3-gnumake/bin/make SHELL=\$SHELL \"\$@\"" \ >> make +chmod +x make + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2b3 /store/2b3-gnumake ) diff --git a/06/recipes/3a-boost.sh b/06/recipes/3a-boost.sh new file mode 100755 index 0000000..4927a2d --- /dev/null +++ b/06/recipes/3a-boost.sh @@ -0,0 +1,50 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e +#> FROM https://archives.boost.io/release/1.83.0/source/boost_1_83_0.tar.bz2 + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" +export LD_LIBRARY_PATH=/store/2b1-clang/lib + +mkdir -p /tmp/3a-boost; cd /tmp/3a-boost +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/2b2-busybox/bin/ash aliases/sh +export PATH="/tmp/3a-boost/aliases:$PATH" + +echo "### $0: unpacking Boost sources..." +tar --strip-components=1 -xf /downloads/boost_1_83_0.tar.bz2 + +echo "### $0: patching up Boost sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' \ + bootstrap.sh +sed -i 's|/usr/bin/env sh|/store/2b2-busybox/bin/ash|' \ + tools/build/src/engine/build.sh +sed -i 's|/bin/sh|sh|' \ + tools/build/src/engine/execunix.cpp \ + boost/process/detail/posix/shell_path.hpp +EXTRA_INCL='/tmp/3a-boost/extra_includes' +mkdir -p $EXTRA_INCL +cp /store/2b1-clang/lib/clang/17/include/*intrin*.h $EXTRA_INCL/ +cp /store/2b1-clang/lib/clang/17/include/mm_malloc.h $EXTRA_INCL/ +cp /store/2b1-clang/lib/clang/17/include/unwind.h $EXTRA_INCL/ + +echo "### $0: building Boost..." +ash bootstrap.sh +./b2 -j $NPROC \ + include=/store/2a6-linux-headers/include \ + include=$EXTRA_INCL \ + include=/store/2b1-clang/include/x86_64-unknown-linux-musl/c++/v1 \ + --with-context --with-thread --with-system + +echo "### $0: installing Boost..." +./b2 install --prefix=/store/3a-boost \ + --with-context --with-thread --with-system + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-boost ) diff --git a/06/recipes/3a-brotli.sh b/06/recipes/3a-brotli.sh new file mode 100755 index 0000000..16ccbdf --- /dev/null +++ b/06/recipes/3a-brotli.sh @@ -0,0 +1,46 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH f9e8d81d0405ba66d181529af42a3354f838c939095ff99930da6aa9cdf6fe46 +#> FROM https://github.com/google/brotli/archive/refs/tags/v1.0.9.tar.gz +#> AS brotli-1.0.9.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" + +mkdir -p /tmp/3a-brotli; cd /tmp/3a-brotli +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking brotli sources..." +tar --strip-components=1 -xf /downloads/brotli-1.0.9.tar.gz + +echo "### $0: building brotli..." +ash configure --prefix=/store/3a-brotli --help #--disable-dependency-tracking +CFLAGS='-fPIC' +CFLAGS="$CFLAGS -DBROTLICOMMON_SHARED_COMPILATION" +CFLAGS="$CFLAGS -DBROTLI_SHARED_COMPILATION" +make -j $NPROC lib CFLAGS="$CFLAGS" +clang -shared bin/obj/c/common/*.o -o libbrotlicommon.so +clang -shared bin/obj/c/enc/*.o libbrotlicommon.so -o libbrotlienc.so +clang -shared bin/obj/c/dec/*.o libbrotlicommon.so -o libbrotlidec.so + +echo "### $0: installing brotli..." +mkdir -p /store/3a-brotli/lib /store/3a-brotli/include +cp libbrotlicommon.so libbrotlienc.so libbrotlidec.so /store/3a-brotli/lib/ +cp -r c/include/brotli /store/3a-brotli/include/ +mkdir -p /store/3a-brotli/lib/pkgconfig +for l in common enc dec; do + sed < scripts/libbrotli${l}.pc.in \ + -e 's|@PACKAGE_VERSION@|1.0.9|g' \ + -e 's|@prefix@|/store/3a-brotli|g' \ + -e 's|@exec_prefix@|/store/3a-brotli/bin|g' \ + -e 's|@includedir@|/store/3a-brotli/include|g' \ + -e 's|@libdir@|/store/3a-brotli/lib|g' \ + -e 's|-R|-Wl,-rpath=|g' \ + > /store/3a-brotli/lib/pkgconfig/libbrotli${l}.pc +done + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-brotli ) diff --git a/06/recipes/3a-curl.sh b/06/recipes/3a-curl.sh new file mode 100755 index 0000000..632d3b8 --- /dev/null +++ b/06/recipes/3a-curl.sh @@ -0,0 +1,31 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH dd322f6bd0a20e6cebdfd388f69e98c3d183bed792cf4713c8a7ef498cba4894 +#> FROM https://curl.se/download/curl-8.2.1.tar.xz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" +export PATH="$PATH:/store/3a-pkg-config/bin" + +mkdir -p /tmp/3a-curl; cd /tmp/3a-curl +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking curl sources..." +tar --strip-components=1 -xf /downloads/curl-8.2.1.tar.xz + +echo "### $0: building curl..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' configure install-sh + +ash configure --prefix=/store/3a-curl \ + --with-mbedtls=/store/3a-mbedtls \ + --disable-dependency-tracking +make -j $NPROC + +echo "### $0: installing curl..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-curl ) diff --git a/06/recipes/3a-editline.sh b/06/recipes/3a-editline.sh new file mode 100755 index 0000000..41240bb --- /dev/null +++ b/06/recipes/3a-editline.sh @@ -0,0 +1,29 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH df223b3333a545fddbc67b49ded3d242c66fadf7a04beb3ada20957fcd1ffc0e +#> FROM https://github.com/troglobit/editline/releases/download/1.17.1/editline-1.17.1.tar.xz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" + +mkdir -p /tmp/3a-editline; cd /tmp/3a-editline +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking editline sources..." +tar --strip-components=1 -xf /downloads/editline-1.17.1.tar.xz + +echo "### $0: fixing up editline sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' configure aux/install-sh + +echo "### $0: building editline..." +ash configure --prefix=/store/3a-editline --disable-dependency-tracking +make -j $NPROC + +echo "### $0: installing editline..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-editline ) diff --git a/06/recipes/3a-gnugperf.sh b/06/recipes/3a-gnugperf.sh new file mode 100755 index 0000000..6928e0e --- /dev/null +++ b/06/recipes/3a-gnugperf.sh @@ -0,0 +1,33 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 588546b945bba4b70b6a3a616e80b4ab466e3f33024a352fc2198112cdbb3ae2 +#> FROM http://ftp.gnu.org/pub/gnu/gperf/gperf-3.1.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" + +mkdir -p /tmp/3a-gnugperf; cd /tmp/3a-gnugperf +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking GNU gperf sources..." +tar --strip-components=1 -xf /downloads/gperf-3.1.tar.gz + +echo "### $0: patching up GNU gperf sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' \ + configure lib/configure src/configure tests/configure doc/configure \ + Makefile.in src/Makefile.in doc/Makefile.in + +echo "### $0: building GNU gperf..." +REWRITE="-ffile-prefix-map=$(pwd)=/builddir/" +ash configure --prefix=/store/3a-gnugperf \ + CFLAGS=$REWRITE CXXFLAGS="$REWRITE -Wno-register" +make -j $NPROC + +echo "### $0: installing GNU gperf..." +make -j $NPROC install + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-gnugperf ) diff --git a/06/recipes/3a-libarchive.sh b/06/recipes/3a-libarchive.sh new file mode 100755 index 0000000..4ebe643 --- /dev/null +++ b/06/recipes/3a-libarchive.sh @@ -0,0 +1,33 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH b17403ce670ff18d8e06fea05a9ea9accf70678c88f1b9392a2e29b51127895f +#> FROM http://libarchive.org/downloads/libarchive-3.7.1.tar.xz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" +export PATH="$PATH:/store/3a-pkg-config/bin" + +mkdir -p /tmp/3a-libarchive; cd /tmp/3a-libarchive +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking libarchive sources..." +tar --strip-components=1 -xf /downloads/libarchive-3.7.1.tar.xz + +echo "### $0: fixing up libarchive sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' \ + configure build/autoconf/install-sh + +echo "### $0: building libarchive..." +ash configure --prefix=/store/3a-libarchive \ + --disable-dependency-tracking \ + --without-openssl +make -j $NPROC + +echo "### $0: installing libarchive..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-libarchive ) diff --git a/06/recipes/3a-libsodium.sh b/06/recipes/3a-libsodium.sh new file mode 100755 index 0000000..ae80ed8 --- /dev/null +++ b/06/recipes/3a-libsodium.sh @@ -0,0 +1,34 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 6f504490b342a4f8a4c4a02fc9b866cbef8622d5df4e5452b46be121e46636c1 +#> FROM https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz + + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" +export PATH="$PATH:/store/3a-pkg-config/bin" +export PKG_CONFIG_PATH='/store/3a-openssl/lib64/pkgconfig' + +mkdir -p /tmp/3a-libsodium; cd /tmp/3a-libsodium +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking libsodium sources..." +tar --strip-components=1 -xf /downloads/libsodium-1.0.18.tar.gz + +echo "### $0: fixing up libsodium sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' \ + configure build-aux/install-sh + +echo "### $0: building libsodium..." +ash configure --prefix=/store/3a-libsodium \ + --disable-dependency-tracking +make -j $NPROC + +echo "### $0: installing libsodium..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-libsodium ) diff --git a/06/recipes/3a-lowdown.sh b/06/recipes/3a-lowdown.sh new file mode 100755 index 0000000..2cfd514 --- /dev/null +++ b/06/recipes/3a-lowdown.sh @@ -0,0 +1,33 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 049b7883874f8a8e528dc7c4ed7b27cf7ceeb9ecf8fe71c3a8d51d574fddf84b +#> FROM https://github.com/kristapsdz/lowdown/archive/refs/tags/VERSION_1_0_2.tar.gz +#> AS lowdown-1.0.2.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/wrappers" +export PATH="$PATH:/store/3a-pkg-config/bin" +export PKG_CONFIG_PATH='/store/3a-openssl/lib64/pkgconfig' +export SHELL='/store/2b2-busybox/bin/ash' + +mkdir -p /tmp/3a-lowdown; cd /tmp/3a-lowdown +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking lowdown sources..." +tar --strip-components=1 -xf /downloads/lowdown-1.0.2.tar.gz + +echo "### $0: fixing up lowdown sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' configure + +echo "### $0: building lowdown..." +ash configure PREFIX=/store/3a-lowdown +make -j $NPROC CFLAGS=-ffile-prefix-map=$(pwd)=/builddir/ + +echo "### $0: installing lowdown..." +make -j $NPROC install_shared + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-lowdown ) diff --git a/06/recipes/3a-mbedtls.sh b/06/recipes/3a-mbedtls.sh new file mode 100755 index 0000000..5fa5413 --- /dev/null +++ b/06/recipes/3a-mbedtls.sh @@ -0,0 +1,32 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH a420fcf7103e54e775c383e3751729b8fb2dcd087f6165befd13f28315f754f5 +#> FROM https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v3.4.1.tar.gz +#> AS mbedtls-3.4.1.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/wrappers" +export SHELL=/store/2b2-busybox/bin/ash + +mkdir -p /tmp/3a-mbedtls; cd /tmp/3a-mbedtls +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking mbedtls sources..." +tar --strip-components=1 -xf /downloads/mbedtls-3.4.1.tar.gz + +echo "### $0: fixing up mbedtls sources..." +sed -i 's|^DESTDIR=.*|DESTDIR=/store/3a-mbedtls|' Makefile +sed -i 's|programs: lib mbedtls_test|programs: lib|' Makefile +sed -i 's|install: no_test|install: lib|' Makefile + +echo "### $0: building mbedtls..." +make -j $NPROC lib + +echo "### $0: installing mbedtls..." +make -j $NPROC install + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-mbedtls ) diff --git a/06/recipes/3a-nlohmann-json.sh b/06/recipes/3a-nlohmann-json.sh new file mode 100755 index 0000000..37f0545 --- /dev/null +++ b/06/recipes/3a-nlohmann-json.sh @@ -0,0 +1,29 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 8c4b26bf4b422252e13f332bc5e388ec0ab5c3443d24399acb675e68278d341f +#> FROM https://github.com/nlohmann/json/releases/download/v3.11.2/json.tar.xz +#> AS nlohmann-json-3.11.2.tar.xz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" + +mkdir -p /tmp/3a-nlohmann-json; cd /tmp/3a-nlohmann-json + +echo "### $0: unpacking nlohmann-json sources..." +tar --strip-components=1 -xf /downloads/nlohmann-json-3.11.2.tar.xz + +echo "### $0: installing nlohmann-json..." +mkdir /store/3a-nlohmann-json +cp -rv include /store/3a-nlohmann-json +mkdir -p /store/3a-nlohmann-json/lib/pkgconfig +sed < cmake/pkg-config.pc.in \ + -e 's|${PROJECT_NAME}|nlohmann_json|' \ + -e 's|${PROJECT_VERSION}|3.11.2|' \ + -e 's|${CMAKE_INSTALL_FULL_INCLUDEDIR}|/store/3a-nlohmann-json/include|' \ + > /store/3a-nlohmann-json/lib/pkgconfig/nlohmann_json.pc + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-nlohmann-json ) diff --git a/06/recipes/3a-pkg-config.sh b/06/recipes/3a-pkg-config.sh new file mode 100755 index 0000000..399006b --- /dev/null +++ b/06/recipes/3a-pkg-config.sh @@ -0,0 +1,32 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591 +#> FROM https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" + +mkdir -p /tmp/3a-pkg-config; cd /tmp/3a-pkg-config +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking pkg-config sources..." +tar --strip-components=1 -xf /downloads/pkg-config-0.29.2.tar.gz + +echo "### $0: patching pkg-config..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' \ + configure glib/configure \ + install-sh glib/install-sh + +echo "### $0: building pkg-config..." +ash configure --prefix=/store/3a-pkg-config --with-internal-glib \ + CFLAGS=-Wno-int-conversion +make -j $NPROC + +echo "### $0: installing pkg-config..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-pkg-config ) diff --git a/06/recipes/3a-seccomp.sh b/06/recipes/3a-seccomp.sh new file mode 100755 index 0000000..1840f8f --- /dev/null +++ b/06/recipes/3a-seccomp.sh @@ -0,0 +1,31 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH d82902400405cf0068574ef3dc1fe5f5926207543ba1ae6f8e7a1576351dcbdb +#> FROM https://github.com/seccomp/libseccomp/releases/download/v2.5.4/libseccomp-2.5.4.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" +export PATH="$PATH:/store/3a-gnugperf/bin" + +mkdir -p /tmp/3a-seccomp; cd /tmp/3a-seccomp +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking seccomp sources..." +tar --strip-components=1 -xf /downloads/libseccomp-2.5.4.tar.gz + +echo "### $0: patching up seccomp sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' configure build-aux/install-sh + +echo "### $0: building seccomp..." +ash configure --prefix=/store/3a-seccomp --disable-dependency-tracking \ + CFLAGS=-I/store/2a6-linux-headers/include +make -j $NPROC + +echo "### $0: installing seccomp..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-seccomp ) diff --git a/06/recipes/3a-sqlite.sh b/06/recipes/3a-sqlite.sh new file mode 100755 index 0000000..5907762 --- /dev/null +++ b/06/recipes/3a-sqlite.sh @@ -0,0 +1,28 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH 49008dbf3afc04d4edc8ecfc34e4ead196973034293c997adad2f63f01762ae1 +#> FROM https://sqlite.org/2023/sqlite-autoconf-3430000.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" + +mkdir -p /tmp/3a-sqlite; cd /tmp/3a-sqlite +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking SQLite archive..." +tar --strip-components=1 -xf /downloads/sqlite-autoconf-3430000.tar.gz + +echo "### $0: building SQLite..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' configure install-sh + +ash configure --prefix=/store/3a-sqlite +make -j $NPROC + +echo "### $0: installing SQLite..." +make -j $NPROC install-strip + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3a /store/3a-sqlite ) diff --git a/06/recipes/3b-busybox-static.sh b/06/recipes/3b-busybox-static.sh new file mode 100755 index 0000000..c2ae42c --- /dev/null +++ b/06/recipes/3b-busybox-static.sh @@ -0,0 +1,49 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314 +#> FROM https://busybox.net/downloads/busybox-1.36.1.tar.bz2 + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/wrappers" + +mkdir -p /tmp/3b-busybox-static; cd /tmp/3b-busybox-static +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: aliasing ash to sh..." +mkdir aliases; ln -s /store/2b2-busybox/bin/ash aliases/sh +export PATH="/tmp/3b-busybox-static/aliases:$PATH" + +echo "### $0: unpacking busybox sources..." +tar --strip-components=1 -xf /downloads/busybox-1.36.1.tar.bz2 + +echo "### $0: configuring busybox..." +BUSYBOX_FLAGS='CONFIG_SHELL=/store/2b2-busybox/bin/ash' +BUSYBOX_FLAGS='SHELL=/store/2b2-busybox/bin/ash' +BUSYBOX_FLAGS="$BUSYBOX_FLAGS CC=cc HOSTCC=cc" +BUSYBOX_FLAGS="$BUSYBOX_FLAGS KCONFIG_NOTIMESTAMP=y" +BUSYBOX_CFLAGS='CFLAGS=-O2 -isystem /store/2a6-linux-headers/include' +echo -e '#!/store/2b2-busybox/bin/ash\nprintf 9999' \ + > scripts/gcc-version.sh +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|g' \ + scripts/gen_build_files.sh \ + scripts/mkconfigs scripts/embedded_scripts scripts/trylink \ + scripts/generate_BUFSIZ.sh \ + applets/usage_compressed applets/busybox.mkscripts applets/install.sh +make -j $NPROC $BUSYBOX_FLAGS defconfig +sed -i 's|CONFIG_INSTALL_NO_USR=y|CONFIG_INSTALL_NO_USR=n|' .config +sed -i 's|CONFIG_FEATURE_SHARED_BUSYBOX=y|CONFIG_FEATURE_SHARED_BUSYBOX=n|' \ + .config + +echo "### $0: building busybox..." +make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" busybox busybox.links +sed -i 's|^/usr/s\?bin/|/bin/|' busybox.links + +echo "### $0: installing busybox..." +make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" \ + install CONFIG_PREFIX=/store/3b-busybox-static + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3b /store/3b-busybox-static ) diff --git a/06/recipes/3b-nix.sh b/06/recipes/3b-nix.sh new file mode 100755 index 0000000..71a6a49 --- /dev/null +++ b/06/recipes/3b-nix.sh @@ -0,0 +1,100 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH f3f8016621cf3971e0768404f05b89d4a7fc1911dddae5a9a7ed4bf62519302c +#> FROM https://github.com/ZilchOS/nix/releases/download/nix-2.17.0-zilched/nix-2.17.0-zilched.tar.xz + +#> FETCH 3659cd137c320991a78413dd370a92fd18e0a8bc36d017d554f08677a37d7d5a +#> FROM https://raw.githubusercontent.com/somasis/musl-compat/c12ea3af4e6ee53158a175d992049c2148db5ff6/include/sys/queue.h + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/wrappers" +export PATH="$PATH:/store/3a-pkg-config/bin" +export PATH="$PATH:/store/3a-lowdown/bin" + +export SHELL='/store/2b2-busybox/bin/ash' + +#export PKG_CONFIG_PATH='/store/3a-openssl/lib64/pkgconfig' +export PKG_CONFIG_PATH='' +#export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-bzip2/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-sqlite/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-curl/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-editline/lib/pkgconfig" +#export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-xz/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-brotli/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-seccomp/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libarchive/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libsodium/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-lowdown/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-nlohmann-json/lib/pkgconfig" +#LIBDIRS="$(pkg-config --variable=libdir openssl)" +LIBDIRS="" +#LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir bzip2)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir sqlite3)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libeditline)" +#LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir liblzma)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libbrotlicommon)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libseccomp)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libarchive)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libsodium)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir lowdown)" +export LD_LIBRARY_PATH=$LIBDIRS + +export BOOST_ROOT=/store/3a-boost/include + +mkdir -p /tmp/3b-nix; cd /tmp/3b-nix +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking Nix sources..." +tar --strip-components=1 \ + -xf /downloads/nix-2.17.0-zilched.tar.xz + +echo "### $0: copying queue.h..." +mkdir -p compat-includes/sys +cp /downloads/queue.h compat-includes/sys/ + +echo "### $0: stubbing out commands..." +mkdir stubs; export PATH="$(pwd)/stubs:$PATH" +ln -s /store/2b2-busybox/bin/true stubs/jq +ln -s /store/2b2-busybox/bin/true stubs/expr +ln -s /store/2b2-busybox/bin/ash stubs/bash + +echo "### $0: patching up Nix sources..." +sed -i 's|/bin/sh|/store/2b2-busybox/bin/ash|' configure +sed -i 's|/bin/sh|${stdenv.busybox}/bin/ash|' configure +# avoid an expression confusing ash +nl configure | grep 7217 | tee configure-problematic-line +grep -F "'X\(//\)$'" configure-problematic-line +sed -i '7217d' configure +nl configure | grep 7217 | tee configure-problematic-line +! grep -F "'X\(//\)$'" configure-problematic-line +# replace the declare confusing ash +sed -i 's|declare \$name=.*|:|' configure + +echo "### $0: building Nix..." +PCDEPS='libbrotlicommon libbrotlienc libbrotlidec sqlite3 libseccomp lowdown' +PCDEPS="$PCDEPS nlohmann_json" +INC="-I/store/2a6-linux-headers/include -I$(pwd)/compat-includes" +REWRITE="-ffile-prefix-map=$(pwd)=/builddir/" +export CFLAGS="$(pkg-config --cflags $PCDEPS) $INC $REWRITE" +export CXXFLAGS="$CFLAGS" +export GLOBAL_CXXFLAGS="$CFLAGS" +export LDFLAGS="$(pkg-config --libs $PCDEPS) -L/store/3a-boost/lib -v" +ash configure --prefix=/store/3b-nix \ + --with-boost=$BOOST_ROOT \ + --disable-doc-gen \ + --disable-gc \ + --disable-cpuid \ + --disable-gtest \ + --with-sandbox-shell=/store/3b-busybox-static/bin/busybox +sed -i "s|\${prefix}|/store/3b-nix|g" config.status +sed -i "s|\${exec_prefix}|/store/3b-nix|g" config.status +make -j $NPROC V=1 + +echo "### $0: installing Nix..." +make -j $NPROC install + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3b /store/3b-nix ) diff --git a/06/recipes/3b-tinycc-static.sh b/06/recipes/3b-tinycc-static.sh new file mode 100755 index 0000000..562a430 --- /dev/null +++ b/06/recipes/3b-tinycc-static.sh @@ -0,0 +1,42 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH f5a71d05664340ae46cda9579c6079a0f2fa809d24386d284f0d091e4d576a4e +#> FROM https://github.com/TinyCC/tinycc/archive/af1abf1f45d45b34f0b02437f559f4dfdba7d23c.tar.gz +#> AS tinycc-mob-af1abf1.tar.gz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/wrappers" +export SHELL="/store/2b2-busybox/bin/ash" + +mkdir -p /tmp/3b-tinycc-static; cd /tmp/3b-tinycc-static +if [ -e /ccache/setup ]; then . /ccache/setup; fi + +echo "### $0: unpacking TinyCC sources..." +tar --strip-components=1 -xf /downloads/tinycc-mob-af1abf1.tar.gz + +#echo "### $0: fixing up TinyCC sources..." +sed -i "s|^VERSION = .*|VERSION = mob-af1abf1|" configure +sed -i "s|^GITHASH := .*|GITHASH = mob:af1abf1|" configure + +echo "### $0: configuring TinyCC..." +$SHELL configure \ + --prefix=/store/3b-tinycc-static \ + --cc=cc \ + --extra-cflags="-O3 -static" \ + --extra-ldflags="-static" \ + --enable-static \ + --config-musl + +echo "### $0: building TinyCC..." + +make -j $NPROC tcc + +echo "### $0: installing TinyCC..." +mkdir -p /store/3b-tinycc-static/bin +cp tcc /store/3b-tinycc-static/bin/ + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/3b /store/3b-tinycc-static ) diff --git a/06/recipes/3b-zig.sh b/06/recipes/3b-zig.sh new file mode 100644 index 0000000..6e6c472 --- /dev/null +++ b/06/recipes/3b-zig.sh @@ -0,0 +1,14 @@ +#!/store/2b2-busybox/bin/ash + +#> FETCH +#> FROM https://github.com/ziglang/zig-bootstrap/archive/refs/tags/0.14.0.tar.gz +#> AS zig-bootstrap-0.14.0.tar.gz + +mkdir -p /tmp/3a-zig; cd /tmp/3a-zig + +echo "### $0: unpacking zig-boostrap sources..." +tar --strip-components=1 -xf /downloads/zig-bootstrap-0.14.0.tar.gz + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/2b1-clang/bin" +export PATH="$PATH:/store/2b3-gnumake/bin" diff --git a/06/recipes/4-rebootstrap-using-nix.sh b/06/recipes/4-rebootstrap-using-nix.sh new file mode 100755 index 0000000..1d89aea --- /dev/null +++ b/06/recipes/4-rebootstrap-using-nix.sh @@ -0,0 +1,98 @@ +#!/store/2b2-busybox/bin/ash + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/3a-pkg-config/bin" +export PATH="$PATH:/store/3a-sqlite/bin" +export PATH="$PATH:/store/3b-nix/bin" + +export SHELL='/store/2b2-busybox/bin/ash' + +export PKG_CONFIG_PATH='' +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-sqlite/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-curl/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-editline/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-seccomp/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libarchive/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libsodium/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-lowdown/lib/pkgconfig" +LIBDIRS='' +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir sqlite3)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libcurl)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libeditline)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libseccomp)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libarchive)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libsodium)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir lowdown)" +LIBDIRS="$LIBDIRS:/store/3a-boost/lib" +LIBDIRS="$LIBDIRS:/store/2b1-clang/lib" +export LD_LIBRARY_PATH=$LIBDIRS + +mkdir -p /tmp/4-rebootstrap-using-nix; cd /tmp/4-rebootstrap-using-nix + +echo "### $0: preparing stuff for nix to work..." +mkdir -p /dev/pts +mount -t devpts devpts /dev/pts +ln -s /dev/pts/ptmx /dev/ptmx + +echo "### $0: faking lots of stuff for nix to work..." +mkdir shelter +export HOME=/tmp/4-rebootstrap-using-nix/shelter +export USER=notauser +echo 'oh come on' >/dev/urandom + +echo "### $0: fixing up paths to shell..." +cp -a --reflink=auto /using-nix /default.nix /recipes ./ +sed -i 's|/bin/sh|/store/3b-busybox-static/bin/ash|' using-nix/1-stage1.nix + +echo "### $0: pointing to local downloads..." +sed -i 's| url =| #remote_url =|' using-nix/*.nix +sed -i 's|# local = \(.*\);|url = "file://\1";|' using-nix/*.nix + +if [ -e /prev/nix/store ] && [ -e /prev/nix-db.tar ]; then + echo "### $0: restoring nix store & db from previous build..." + mkdir -p /nix + cp -a --reflink=auto /prev/nix/store /nix + tar -xf /prev/nix-db.tar -C / + sqlite3 /nix/var/nix/db/db.sqlite \ + < /nix/var/nix/db/db.sqlite.dump + rm /nix/var/nix/db/db.sqlite.dump +fi + +echo "### $0: writing a 0.nix that simply injects what we've built..." +# Makefile bootstrap injects it as /stage/protosrc, regular --- as /protosrc +[ -e /protosrc ] && PROTOSRC="/protosrc" || PROTOSRC=/stage/protosrc +echo "{ tinycc = /store/3b-tinycc-static/bin/tcc; protosrc = $PROTOSRC; }" \ + > using-nix/0.nix + +echo "### $0: rebuilding everything using nix..." +nix-build \ + --extra-experimental-features ca-derivations \ + --option build-users-group '' \ + --option compress-build-log false \ + --no-substitute \ + --cores $NPROC \ + --keep-failed \ + -vvv \ + default.nix +rm -f /dev/urandom +rm /dev/ptmx +umount /dev/pts +umount /dev/pts || true +rm -r /dev/pts +rm -r shelter +rm -rf /build + +# this one is special wrt how the results are saved, see Makefile/USE_NIX_CACHE +echo "### $0: exporting resulting /nix/store (reproducible)..." +mkdir -p /store/4-rebootstrap-using-nix/nix +cp -a --reflink=auto /nix/store /store/4-rebootstrap-using-nix/nix/ + +echo "### $0: exporting /nix/var/nix/db to restore it (non-reproducible)..." +cp /nix/var/nix/db/db.sqlite db.sqlite +sqlite3 db.sqlite 'UPDATE ValidPaths SET registrationTime = 1;' +sqlite3 db.sqlite .dump > /nix/var/nix/db/db.sqlite.dump +tar --exclude nix/var/nix/db/db.sqlite \ + -cf /store/4-rebootstrap-using-nix/nix-db.tar /nix/var/nix/db +rm /nix/var/nix/db/db.sqlite.dump diff --git a/06/recipes/5-go-beyond-using-nix.sh b/06/recipes/5-go-beyond-using-nix.sh new file mode 100755 index 0000000..66133e3 --- /dev/null +++ b/06/recipes/5-go-beyond-using-nix.sh @@ -0,0 +1,203 @@ +#!/store/2b2-busybox/bin/ash +#> FETCH 10fa524294f58c805411ddd6e5522c02a0b69ad14e036b141cc80fb53a3ef1a0 +#> FROM https://github.com/ZilchOS/core/archive/2023.10.1.tar.gz +#> AS ZilchOS-core-2023.10.1.tar.gz + +#> FETCH ddd417f9caab3ef0f3031b938815a5c33367c3a50c09830138d208bd3126c98f +#> FROM https://github.com/limine-bootloader/limine/releases/download/v5.20230830.0/limine-5.20230830.0.tar.xz + +#> FETCH 1952b2a782ba576279c211ee942e341748fdb44997f704dd53def46cd055470b +#> FROM https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0.tar.bz2 + +#> FETCH 9bba0214ccf7f1079c5d59210045227bcf619519840ebfa80cd3849cff5a5bf2 +#> FROM https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz + +#> FETCH 63aede5c6d33b6d9b13511cd0be2cac046f2e70fd0a07aa9573a04a82783af96 +#> FROM https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz + +#> FETCH e87aae032bf07c26f85ac0ed3250998c37621d95f8bd748b31f15b33c45ee995 +#> FROM https://github.com/westes/flex/files/981163/flex-2.6.4.tar.gz + +#> FETCH 541e179665dc4e272b9602f2074243591a157da89cc47064da8c5829dbd2b339 +#> FROM http://ftp.gnu.org/gnu/mtools/mtools-4.0.43.tar.bz2 + +#> FETCH 786f9f5df9865cc5b0c1fecee3d2c0f5e04cab8c9a859bd1c9c7ccd4964fdae1 +#> FROM https://www.gnu.org/software/xorriso/xorriso-1.5.6.pl02.tar.gz + +#> FETCH 9c4396cc829cfae319a6e2615202e82aad41372073482fce286fac78646d3ee4 +#> FROM https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz + +#> FETCH 23c2469e2a568362a62eecf1b49ed90a15621e6fa30e29947ded3436422de9b9 +#> FROM https://curl.se/ca/cacert-2023-08-22.pem + +#> FETCH 85cd12e9cf1d6d5a45f17f7afe1cebe7ee628d3282281c492e86adf636defa3f +#> FROM https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tar.xz + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/3a-pkg-config/bin" +export PATH="$PATH:/store/3a-sqlite/bin" +export PATH="$PATH:/store/3b-nix/bin" + +export SHELL='/store/2b2-busybox/bin/ash' + +export PKG_CONFIG_PATH='' +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-sqlite/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-curl/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-editline/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-seccomp/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libarchive/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libsodium/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-lowdown/lib/pkgconfig" +LIBDIRS='' +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir sqlite3)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libcurl)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libeditline)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libseccomp)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libarchive)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libsodium)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir lowdown)" +LIBDIRS="$LIBDIRS:/store/3a-boost/lib" +LIBDIRS="$LIBDIRS:/store/2b1-clang/lib" +export LD_LIBRARY_PATH=$LIBDIRS + +mkdir -p /tmp/5-go-beyond-using-nix; cd /tmp/5-go-beyond-using-nix + +echo "### $0: preparing stuff for nix to work..." +mkdir -p /dev/pts +mount -t devpts devpts /dev/pts +ln -s /dev/pts/ptmx /dev/ptmx + +echo "### $0: faking lots of stuff for nix to work..." +mkdir shelter +export HOME=/tmp/5-go-beyond-using-nix/shelter +export USER=notauser +echo 'oh come on' >/dev/urandom +printf '\0\0\0\0\0\0\0\0\0\0' > 10x0 +cat 10x0 10x0 10x0 10x0 10x0 10x0 10x0 10x0 10x0 10x0 > 100x0 +cat 100x0 100x0 100x0 100x0 100x0 100x0 100x0 100x0 100x0 100x0 > 1Kx0 +cat 1Kx0 1Kx0 1Kx0 1Kx0 1Kx0 1Kx0 1Kx0 1Kx0 1Kx0 1Kx0 > 10Kx0 +cat 10Kx0 10Kx0 10Kx0 10Kx0 10Kx0 10Kx0 10Kx0 10Kx0 10Kx0 10Kx0 > 100Kx0 +cat 100Kx0 100Kx0 100Kx0 100Kx0 100Kx0 100Kx0 100Kx0 100Kx0 100Kx0 100Kx0 \ + > 1Mx0 +cat 1Mx0 1Mx0 1Mx0 1Mx0 1Mx0 1Mx0 1Mx0 1Mx0 1Mx0 1Mx0 > 10Mx0 +mv 10Mx0 /dev/zero +rm *x0 + +echo "### $0: fixing up paths to shell..." +sed -i 's|/bin/sh|/store/3b-busybox-static/bin/ash|' /using-nix/1-stage1.nix + +if [ -e /prev/nix/store ] && [ -e /prev/nix-db.tar ]; then + echo "### $0: restoring nix store & db from previous build..." + mkdir -p /nix + mv /prev/nix/store /nix + tar -xf /prev/nix-db.tar -C / + sqlite3 /nix/var/nix/db/db.sqlite \ + < /nix/var/nix/db/db.sqlite.dump + rm /nix/var/nix/db/db.sqlite.dump +elif [ ! -e /nix/store ]; then + echo "### $0: restoring nix store & db from previous stage..." + mkdir -p /nix + cp -a /store/4-rebootstrap-using-nix/nix/store /nix/ + tar -xf /store/4-rebootstrap-using-nix/nix-db.tar -C / + sqlite3 /nix/var/nix/db/db.sqlite \ + < /nix/var/nix/db/db.sqlite.dump + rm /nix/var/nix/db/db.sqlite.dump +fi + + +echo "### $0: creating a ZilchOS/bootstrap flake..." +mkdir ZilchOS-bootstrap +cp -r /flake.nix /default.nix /using-nix /recipes \ + ZilchOS-bootstrap/ + +echo "### $0: pointing to local files..." +sed -i 's| url =| #remote_url =|' ZilchOS-bootstrap/using-nix/*.nix +sed -i 's|# local = \(.*\);|url = "file://\1";|' ZilchOS-bootstrap/using-nix/*.nix +echo "### $0: writing a 0.nix that simply injects what we've built..." +# Makefile bootstrap injects it as /stage/protosrc, regular --- as /protosrc +[ -e /protosrc ] && PROTOSRC="/protosrc" || PROTOSRC=/stage/protosrc +echo "{ tinycc = /store/3b-tinycc-static/bin/tcc; protosrc = $PROTOSRC; }" \ + > ZilchOS-bootstrap/using-nix/0.nix + +if [[ ! -e ZilchOS-core ]]; then + echo "### $0: unpacking ZilchOS/core archive..." + mkdir ZilchOS-core + tar -xf /downloads/ZilchOS-core-2023.10.1.tar.gz --strip-components=1 \ + -C ZilchOS-core +fi +[[ -e ZilchOS-core/flake.nix ]] +cd ZilchOS-core +nix flake lock \ + --extra-experimental-features 'ca-derivations flakes nix-command' \ + --update-input bootstrap-from-tcc \ + --override-input bootstrap-from-tcc path:../ZilchOS-bootstrap +pwd +cd .. +ls -l ZilchOS-core + +echo "### $0: pointing to local downloads..." +sed -i 's| url =| #remote_url =|' \ + ZilchOS-core/*/*.nix ZilchOS-core/*/*/*.nix +sed -i 's|# local = \(.*\);|url = "file://\1";|' \ + ZilchOS-core/*/*.nix ZilchOS-core/*/*/*.nix + +if [ -e /ccache/setup ]; then + echo "### $0: configuring ccache..." + export CCACHE_COMPILERCHECK=content + export CCACHE_SLOPPINESS=include_file_ctime,include_file_mtime + export CCACHE_MAXSIZE=0 + export CCACHE_DIR=/ccache + MAYBE_CCACHE='ccachedPackages.' +else + MAYBE_CCACHE='' +fi + +echo "### $0: building ZilchOS/core using nix..." +mkdir -p /store/5-go-beyond-using-nix +: > /store/5-go-beyond-using-nix/hashes +while IFS=' ' read -r _unused_old_hash pkg; do + # can't have sandbox, need deterministic build paths + nix build \ + --extra-experimental-features 'ca-derivations flakes nix-command' \ + --option build-users-group '' \ + --option compress-build-log false \ + --no-substitute \ + --cores $NPROC \ + --keep-failed \ + --show-trace \ + -L \ + -vvv \ + -o .tmp \ + "./ZilchOS-core#${MAYBE_CCACHE}${pkg}" + new_path=$(readlink .tmp*) + new_hash=$(echo $new_path | sed -E 's|.*/([a-z0-9]{32})-.*|\1|') + if [ "$pkg" != 'live-cd^iso' ]; then rm .tmp*; fi + echo "$new_hash $pkg" >> /store/5-go-beyond-using-nix/hashes +done < ./ZilchOS-core/.maint/hashes +sha256sum .tmp*-iso # the last one is the iso +rm -f /dev/urandom +rm -f /dev/zero +rm /dev/ptmx +umount /dev/pts +umount /dev/pts || true +rm -r /dev/pts +rm -r shelter +rm -rf /build + +# this one is special wrt how the results are saved, see Makefile/USE_NIX_CACHE +echo "### $0: exporting resulting /nix/store (reproducible)..." +mkdir -p /store/5-go-beyond-using-nix/nix +cp -a --reflink=auto /nix/store /store/5-go-beyond-using-nix/nix/ + +echo "### $0: exporting /nix/var/nix/db to restore it (non-reproducible)..." +cp /nix/var/nix/db/db.sqlite db.sqlite +sqlite3 db.sqlite 'UPDATE ValidPaths SET registrationTime = 1;' +sqlite3 db.sqlite .dump > /nix/var/nix/db/db.sqlite.dump +tar --exclude nix/var/nix/db/db.sqlite \ + -cf /store/5-go-beyond-using-nix/nix-db.tar /nix/var/nix/db +rm /nix/var/nix/db/db.sqlite.dump + +echo "### $0: exporting the iso as well..." +cat .tmp*-iso > /store/5-go-beyond-using-nix/ZilchOS-core.iso diff --git a/06/recipes/_1.test.sh b/06/recipes/_1.test.sh new file mode 100755 index 0000000..06c45b3 --- /dev/null +++ b/06/recipes/_1.test.sh @@ -0,0 +1,40 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export PATH=/store/1-stage1/tinycc/wrappers:/store/1-stage1/protobusybox/bin + +mkdir -p /tmp/_1.test; cd /tmp/_1.test + + +echo "### $0: checking that /protosrc has not leaked into outputs..." +! grep -rF /protosrc /store/1-stage1 + +echo "### $0: checking compilation..." +cat > va_test.c <<\EOF +#include +int main(int _, char* argv[]) { printf("%sargs\n", argv[1]); return 0; } +EOF + +cat va_test.c +cc -o va_test.o va_test.c +cc -o va_test va_test.c +( ! grep /store/2a3-intermediate-musl/lib/libc.so va_test.o va_test ) +( ! grep ld-linux va_test.o va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: checking that we've got bzip2..." + +hello=$(echo hello | bzip2 -1 | bzip2 -d) +[ "$hello" == hello ] + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/_1.test . ) +( ! grep -rF /tmp/1-stage1 . ) +( ! grep -rF /store/1-stage1 . ) +( ! grep -rF va_test . ) +( ! grep -rF /tmp/1-stage1 /store/1-stage1 ) +( ! grep -rF /tmp/_1.test /store/1-stage1 ) + +touch /store/_1.test # indicator of successful completion diff --git a/06/recipes/_2a0-ccache.sh b/06/recipes/_2a0-ccache.sh new file mode 100755 index 0000000..e78c8d7 --- /dev/null +++ b/06/recipes/_2a0-ccache.sh @@ -0,0 +1,65 @@ +#!/store/1-stage1/protobusybox/bin/ash + +#> FETCH a02f4e8360dc6618bc494ca35b0ae21cea080f804a4898eab1ad3fcd108eb400 +#> FROM https://github.com/ccache/ccache/releases/download/v3.7.12/ccache-3.7.12.tar.xz + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/1-stage1/tinycc/wrappers" +export PATH="$PATH:/store/2a0-static-gnumake/bin" + +echo "### $0: unpacking ccache sources..." +mkdir -p /tmp/_2a0-ccache; cd /tmp/_2a0-ccache +tar --strip-components=1 -xf /downloads/ccache-3.7.12.tar.xz + +echo "### $0: building ccache..." +sed -i 's|/bin/sh|/store/1-stage1/protobusybox/bin/ash|' configure +ash configure \ + --host x86_64-linux --build x86_64-linux \ + --prefix=/store/_2a0-ccache +make -j $NPROC + +echo "### $0: installing ccache..." +make -j $NPROC install + +cat > /store/_2a0-ccache/wrap-available <<\EOF +mkdir -p .ccache-wrappers +for prefix in '' x86_64-linux- x86_64-linux-musl- x86_64-linux-unknown-; do + for name in cc c++ gcc g++ clang clang++ tcc; do + if command -v $prefix$name; then + ln -s /store/_2a0-ccache/bin/ccache \ + .ccache-wrappers/$prefix$name + fi + done +done +pwd +export PATH="$(pwd)/.ccache-wrappers:$PATH" +EOF +chmod +x /store/_2a0-ccache/wrap-available + +. /store/_2a0-ccache/wrap-available + +mkdir /store/_2a0-ccache/etc +cat > /store/_2a0-ccache/etc/ccache.conf <<\EOF +cache_dir = /ccache +compiler_check = content +compression = false +sloppiness = include_file_ctime,include_file_mtime +max_size = 0 +EOF +export PATH="/store/_2a0-ccache/wrappers/cc-only:$PATH" + +echo "### $0: testing ccache on itself..." +/store/_2a0-ccache/bin/ccache -z +/store/_2a0-ccache/bin/ccache -s > _stats; cat _stats +grep '^cache miss 0$' _stats +grep '^cache hit rate 0.00 %$' _stats +ash configure --host x86_64-linux --build x86_64-linux CC=cc +make -j $NPROC -B +/store/_2a0-ccache/bin/ccache -z +make -j $NPROC -B +/store/_2a0-ccache/bin/ccache -s > _stats; cat _stats +grep '^cache miss 0$' _stats +grep '^cache hit rate 100.00 %' _stats +/store/_2a0-ccache/bin/ccache -z diff --git a/06/recipes/_2a3.test.sh b/06/recipes/_2a3.test.sh new file mode 100755 index 0000000..33b5ba4 --- /dev/null +++ b/06/recipes/_2a3.test.sh @@ -0,0 +1,37 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export PATH='/store/2a0-static-gnumake/bin' +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a2-static-gnugcc4-c/bin" +export PATH="$PATH:/store/1-stage1/protobusybox/bin" + +mkdir -p /tmp/_2a3.test; cd /tmp/_2a3.test + +echo "### $0: preparing..." +cat > va_test.c <<\EOF +#include +int main(int _, char* argv[]) { printf("%sargs\n", argv[1]); return 0; } +EOF + +cat va_test.c + +echo "### $0: testing (dynamic)..." +SYSROOT=/store/2a3-intermediate-musl +make va_test \ + CC=gcc \ + LDFLAGS="-Wl,--dynamic-linker=$SYSROOT/lib/libc.so --sysroot $SYSROOT" +grep /store/2a3-intermediate-musl/lib/libc.so va_test +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (static)..." +make -B va_test CC=gcc LDFLAGS="-static --sysroot $SYSROOT" +( ! grep /store/2a3-intermediate-musl/lib/libc.so va_test ) +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +touch /store/_2a3.test # indicator of successful completion diff --git a/06/recipes/_2a4.test.sh b/06/recipes/_2a4.test.sh new file mode 100755 index 0000000..3e14775 --- /dev/null +++ b/06/recipes/_2a4.test.sh @@ -0,0 +1,46 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export PATH='/store/2a0-static-gnumake/bin' +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a4-gnugcc4-cpp/bin" +export PATH="$PATH:/store/1-stage1/protobusybox/bin" + +mkdir -p /tmp/_2a4.test; cd /tmp/_2a4.test + +echo "### $0: preparing..." +cat > va_test.c <<\EOF +#include +int main(int _, char* argv[]) { printf("%sargs\n", argv[1]); return 0; } +EOF + +cat va_test.c + +echo "### $0: testing (dynamic)..." +make va_test CC=gcc # neither linker nor sysroot need to be specified now +grep /store/2a3-intermediate-musl/lib/libc.so va_test +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (static)..." +make -B va_test CC=gcc LDFLAGS=-static # no specifying sysroot anymore +( ! grep /store/2a3-intermediate-musl/lib/libc.so va_test ) +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (dynamic C++)..." +cat > cpp_test.cpp <<\EOF +#include +using namespace std; +int main() { cout << "this is c+" << "+" << endl; return 0; } +EOF +make cpp_test +grep /store/2a3-intermediate-musl/lib/libc.so cpp_test +( ! grep ld-linux cpp_test ) +./cpp_test +[ "$(./cpp_test)" == 'this is c++' ] + +touch /store/_2a4.test # indicator of successful completion diff --git a/06/recipes/_2a5.test.sh b/06/recipes/_2a5.test.sh new file mode 100755 index 0000000..2811964 --- /dev/null +++ b/06/recipes/_2a5.test.sh @@ -0,0 +1,46 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a1-static-binutils/bin" +export PATH="$PATH:/store/2a5-gnugcc10/bin" + +mkdir -p /tmp/_2a5.test; cd /tmp/_2a5.test + +echo "### $0: preparing..." +cat > va_test.c <<\EOF +#include +int main(int _, char* argv[]) { printf("%sargs\n", argv[1]); return 0; } +EOF + +cat va_test.c + +echo "### $0: testing (dynamic)..." +make va_test CC=gcc +grep /store/2a3-intermediate-musl/lib/libc.so va_test +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (static)..." +make -B va_test CC=gcc LDFLAGS=-static +( ! grep /store/2a3-intermediate-musl/lib/libc.so va_test ) +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (dynamic C++)..." +cat > cpp_test.cpp <<\EOF +#include +using namespace std; +int main() { cout << "this is c+" << "+" << endl; return 0; } +EOF +make cpp_test +grep /store/2a3-intermediate-musl/lib/libc.so cpp_test +( ! grep ld-linux cpp_test ) +./cpp_test +[ "$(./cpp_test)" == 'this is c++' ] + +touch /store/_2a5.test # indicator of successful completion diff --git a/06/recipes/_2a9.test.sh b/06/recipes/_2a9.test.sh new file mode 100755 index 0000000..e12ad29 --- /dev/null +++ b/06/recipes/_2a9.test.sh @@ -0,0 +1,49 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2a9-intermediate-clang/bin/generic-names" + +mkdir -p /tmp/_2a9.test; cd /tmp/_2a9.test + +echo "### $0: preparing..." +cat > va_test.c <<\EOF +#include +int main(int _, char* argv[]) { printf("%sargs\n", argv[1]); return 0; } +EOF + +cat va_test.c + +echo "### $0: testing (dynamic)..." +make va_test +grep /store/2a3-intermediate-musl/lib/libc.so va_test +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (static)..." +make -B va_test LDFLAGS=-static +( ! grep libc.so va_test ) +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (dynamic C++)..." +cat > cpp_test.cpp <<\EOF +#include +using namespace std; +int main() { cout << "this is c+" << "+" << endl; return 0; } +EOF +# FIXME flags! +make cpp_test CXX=c++ LDFLAGS='-rpath /store/2a9-intermediate-clang/lib' +grep /store/2a3-intermediate-musl/lib/libc.so cpp_test +( ! grep ld-linux cpp_test ) +./cpp_test +[ "$(./cpp_test)" == 'this is c++' ] + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2a9 /store/2a9-intermediate-clang ) + +touch /store/_2a9.test # indicator of successful completion diff --git a/06/recipes/_2b1.test.sh b/06/recipes/_2b1.test.sh new file mode 100755 index 0000000..15377d1 --- /dev/null +++ b/06/recipes/_2b1.test.sh @@ -0,0 +1,51 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export PATH='/store/1-stage1/protobusybox/bin' +export PATH="$PATH:/store/2a0-static-gnumake/bin" +export PATH="$PATH:/store/2b1-clang/bin" + +mkdir -p /tmp/_2b1.test; cd /tmp/_2b1.test + +echo "### $0: preparing..." +cat > va_test.c <<\EOF +#include +int main(int _, char* argv[]) { printf("%sargs\n", argv[1]); return 0; } +EOF + +cat va_test.c + +echo "### $0: testing (dynamic)..." +make va_test +grep /store/2b0-musl/lib/libc.so va_test +( ! grep /store/2a3-intermediate-musl/lib/libc.so va_test ) +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (static)..." +make -B va_test LDFLAGS=-static +( ! grep libc.so va_test ) +( ! grep ld-linux va_test ) +./va_test var +[ "$(./va_test var)" == varargs ] + +echo "### $0: testing (dynamic C++)..." +cat > cpp_test.cpp <<\EOF +#include +using namespace std; +int main() { cout << "this is c+" << "+" << endl; return 0; } +EOF +# FIXME flags! +make cpp_test CXX=c++ LDFLAGS='-rpath /store/2b1-clang/lib' +grep /store/2b0-musl/lib/libc.so cpp_test +( ! grep /store/2a3-intermediate-musl/lib/libc.so cpp_test ) +( ! grep ld-linux cpp_test ) +./cpp_test +[ "$(./cpp_test)" == 'this is c++' ] + +echo "### $0: checking for build path leaks..." +( ! grep -rF /tmp/2b1 /store/2b1-clang ) + +touch /store/_2b1.test # indicator of successful completion diff --git a/06/recipes/_3b.test.sh b/06/recipes/_3b.test.sh new file mode 100755 index 0000000..bfc1af7 --- /dev/null +++ b/06/recipes/_3b.test.sh @@ -0,0 +1,54 @@ +#!/store/2b2-busybox/bin/ash + +set -uex + +export PATH='/store/2b2-busybox/bin' +export PATH="$PATH:/store/3a-pkg-config/bin" +export PATH="$PATH:/store/3b-nix/bin" + +export SHELL='/store/2b2-busybox/bin/ash' + +export PKG_CONFIG_PATH='' +#export PKG_CONFIG_PATH='/store/3a-openssl/lib64/pkgconfig' +#export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-bzip2/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-sqlite/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-curl/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-editline/lib/pkgconfig" +#export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-xz/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-seccomp/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libarchive/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libsodium/lib/pkgconfig" +export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-lowdown/lib/pkgconfig" +LIBDIRS='' +#LIBDIRS="$(pkg-config --variable=libdir openssl)" +#LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir bzip2)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir sqlite3)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libcurl)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libeditline)" +#LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir liblzma)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libseccomp)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libarchive)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libsodium)" +LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir lowdown)" +LIBDIRS="$LIBDIRS:/store/3a-boost/lib" +LIBDIRS="$LIBDIRS:/store/2b1-clang/lib" +export LD_LIBRARY_PATH=$LIBDIRS + +mkdir -p /tmp/_3b.test; cd /tmp/_3b.test + +echo "### $0: faking lots of stuff for nix to work..." +mkdir shelter +export HOME=/tmp/_3b.test/shelter +export USER=notauser +echo 'oh come on' >/dev/urandom + +echo "### $0: testing that derivation assumes a known input hash..." +nix repl > known-drv-hash.output <<\EOF + # see https://nixos.org/guides/nix-pills/our-first-derivation.html + derivation { name = "myname"; builder = "mybuilder"; system = "mysystem"; } +EOF +grep -Fx '«derivation /nix/store/z3hhlxbckx4g3n9sw91nnvlkjvyw754p-myname.drv»' \ + known-drv-hash.output + +rm -f /dev/urandom +touch /store/_3b.test # indicator of successful completion diff --git a/06/recipes/all-past-stage1.sh b/06/recipes/all-past-stage1.sh new file mode 100755 index 0000000..5853a31 --- /dev/null +++ b/06/recipes/all-past-stage1.sh @@ -0,0 +1,39 @@ +#!/store/1-stage1/protobusybox/bin/ash + +set -uex + +export SOURCE_DATE_EPOCH=0 + +/recipes/2a0-static-gnumake.sh +/recipes/2a1-static-binutils.sh +/recipes/2a2-static-gnugcc4-c.sh +/recipes/2a3-intermediate-musl.sh +/recipes/2a4-gnugcc4-cpp.sh +/recipes/2a5-gnugcc10.sh +/recipes/2a6-linux-headers.sh +/recipes/2a7-cmake.sh +/recipes/2a8-python.sh +/recipes/2a9-intermediate-clang.sh +/recipes/2b0-musl.sh +/recipes/2b1-clang.sh +/recipes/2b2-busybox.sh +/recipes/2b3-gnumake.sh +/recipes/3a-sqlite.sh +/recipes/3a-boost.sh +/recipes/3a-mbedtls.sh +/recipes/3a-pkg-config.sh +/recipes/3a-curl.sh +/recipes/3a-editline.sh +/recipes/3a-brotli.sh +/recipes/3a-gnugperf.sh +/recipes/3a-seccomp.sh +/recipes/3a-libarchive.sh +/recipes/3a-libsodium.sh +/recipes/3a-lowdown.sh +/recipes/3a-nlohmann-json.sh +/recipes/3b-busybox-static.sh +/recipes/3b-tinycc-static.sh +/recipes/3b-zig.sh +# /recipes/3b-nix.sh +# /recipes/4-rebootstrap-using-nix.sh +# /recipes/5-go-beyond-using-nix.sh diff --git a/06/seed.sh b/06/seed.sh new file mode 100755 index 0000000..fde76df --- /dev/null +++ b/06/seed.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -uex + +if [[ ! -e ./tcc-seed ]]; then + echo 'You need to supply a statically linked TinyCC as `tcc-seed`.' + echo -n 'You can `./compile-tcc-seed-with-nix.sh` ' + echo 'if you have `nix` and trust in me.' + exit 1 +fi + +rm -rf stage +mkdir -p stage/store +cp -raL --reflink=auto downloads recipes default.nix flake.nix stage/ + +# I'm too lazy to pass it through stage1 +sed -i "s|\$NPROC|$NPROC|" stage/recipes/*.sh + +DESTDIR=stage recipes/0-tcc-seed/seed.host-executed.sh # copy tcc-seed +DESTDIR=stage recipes/1-stage1/seed.host-executed.sh # unpack stage1 sources +# Everything past stage1 will unpack sources from downloads/ all by itself +# all the way until +cp -r using-nix stage/ diff --git a/06/using-nix/0-from-nixpkgs.nix b/06/using-nix/0-from-nixpkgs.nix new file mode 100644 index 0000000..71ebe41 --- /dev/null +++ b/06/using-nix/0-from-nixpkgs.nix @@ -0,0 +1,77 @@ +# This is to support building protosrc/tinycc from nixpkgs, see comment in 0.nix + +let + nixpkgs = import (builtins.fetchTarball { + name = "pinned-nixpkgs"; + url = "https://github.com/nixos/nixpkgs/archive/21f524672f25f8c3e7a0b5775e6505fee8fe43ce.tar.gz"; + sha256 = "sha256:00pwazjld0bj2sp33gwiz1h8krkyf2nyid7injv5cqz5bz5jjw99"; + }) { system = "x86_64-linux"; }; + + tinycc-unliberated = nixpkgs.pkgsStatic.tinycc; + + tinycc-liberated = derivation { + name = "tinycc-liberated"; + builder = "/bin/sh"; + args = [ "-uexc" '' + ${nixpkgs.pkgs.gnused}/bin/sed \ + 's|/nix/store/.\{32\}-|!nix!store/................................-|g' \ + < ${tinycc-unliberated}/bin/tcc \ + > $out + ! ${nixpkgs.pkgs.gnugrep}/bin/grep -i /nix/store $out + ${nixpkgs.pkgs.coreutils}/bin/chmod +x $out + '']; + allowedReferences = [ ]; + allowedRequisites = [ ]; + system = "x86_64-linux"; + __contentAddressed = true; + outputHashAlgo = "sha256"; outputHashMode = "recursive"; + outputHash = "sha256-oqeOU6SFYDwpdIj8MjcQ+bMuU63CHyoV9NYdyPLFxEQ="; + }; + + source-tarball-musl = builtins.fetchurl { + url = "http://musl.libc.org/releases/musl-1.2.4.tar.gz"; + sha256 = "7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039"; + }; + + source-tarball-busybox = builtins.fetchurl { + url = "https://busybox.net/downloads/busybox-1.36.1.tar.bz2"; + sha256 = "b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314"; + }; + + source-tarball-tinycc = builtins.fetchurl { + url = "https://github.com/TinyCC/tinycc/archive/af1abf1f45d45b34f0b02437f559f4dfdba7d23c.tar.gz"; + sha256 = "sha256:0kkaax6iw28d9wl6sf14kn0gmwm0g5h9qmx9rm3awh23cq2iv9zm"; + }; + + protosrc = derivation { + name = "protosrc"; + builder = "/bin/sh"; + args = [ "-uexc" '' + PATH=${nixpkgs.coreutils}/bin + PATH=$PATH:${nixpkgs.gnused}/bin + PATH=$PATH:${nixpkgs.gnutar}/bin + PATH=$PATH:${nixpkgs.gzip}/bin + PATH=$PATH:${nixpkgs.bzip2}/bin + export PATH + mkdir downloads/ + cp ${source-tarball-musl} downloads/musl-1.2.4.tar.gz + cp ${source-tarball-busybox} downloads/busybox-1.36.1.tar.bz2 + cp ${source-tarball-tinycc} downloads/tinycc-mob-af1abf1.tar.gz + mkdir -p recipes + cp -r ${../recipes/1-stage1} recipes/1-stage1 + DESTDIR=$out ${nixpkgs.bash}/bin/bash \ + ${../recipes/1-stage1/seed.host-executed.sh} + mv $out/protosrc/* $out/; rm -d $out/protosrc + '']; + allowedReferences = [ ]; + allowedRequisites = [ ]; + system = "x86_64-linux"; + __contentAddressed = true; + outputHashAlgo = "sha256"; outputHashMode = "recursive"; + outputHash = "sha256-upUZTTumJgBY16waF6L8ZeWbflSuQL9TMmwLw0YEDqM="; + }; +in + { + tinycc = tinycc-liberated; + inherit protosrc; + } diff --git a/06/using-nix/0-prebuilt.nix b/06/using-nix/0-prebuilt.nix new file mode 100644 index 0000000..952e20e --- /dev/null +++ b/06/using-nix/0-prebuilt.nix @@ -0,0 +1,28 @@ +# This is to prefetch protosrc/tinycc from github, see comment in 0.nix + +let + fetchTarball = { name, url, sha256 }: derivation { + inherit name url; + urls = [ url ]; + unpack = true; + + builder = "builtin:fetchurl"; + system = "builtin"; + outputHashMode = "recursive"; outputHashAlgo = "sha256"; + preferLocalBuild = true; + outputHash = sha256; + }; +in + { + protosrc = fetchTarball { + name = "protosrc"; + url = "https://github.com/ZilchOS/bootstrap-from-tcc/releases/download/seeding-files-r004/protosrc.nar"; + sha256 = "sha256-upUZTTumJgBY16waF6L8ZeWbflSuQL9TMmwLw0YEDqM="; + }; + + tinycc = fetchTarball { + name = "tinycc-liberated"; + url = "https://github.com/ZilchOS/bootstrap-from-tcc/releases/download/seeding-files-r004/tinycc-liberated.nar"; + sha256 = "sha256-oqeOU6SFYDwpdIj8MjcQ+bMuU63CHyoV9NYdyPLFxEQ="; + }; + } diff --git a/06/using-nix/0.nix b/06/using-nix/0.nix new file mode 100644 index 0000000..9852426 --- /dev/null +++ b/06/using-nix/0.nix @@ -0,0 +1,35 @@ +# Where do tcc-seed and protosrc come from if you build with Nix? + +# When building with `make` or `build.sh` you'll have tcc-seed and protosrc +# long long before you have Nix, +# so there's no question of where to take them from, you just inject'em. +# In this case this file isn't used at all and a simpler 0.nix is generated, +# see recipes/4-rebootstrap-using-nix.sh + +# But not everyone wants to go the full bootstrap route. +# This file is for when you already have Nix and want to jump into the middle, +# starting from the second, `using-nix` half of the bootstrap. +# Cases like hydra or flake-building. + +# One option is to build them using nixpkgs (see 0-from-nixpkgs.nix), +# but then you need nixpkgs, IFD and stuff. + +# Alternatively we could download them prebuilt from github:ZilchOS, +# but then there's the question of falling back to another method +# when recipes/1-stage1/seed.host-executed.sh or recipes/1-stage1/syscall.h +# are updated. + +# Here's one weird combined approach: + +let + and = builtins.all (x: x); + syscall_h_ours = "${../recipes/1-stage1/syscall.h}"; + syscall_h_reference = "/nix/store/678g5j997qzp0srprfg4gqqxcp8mr3g9-syscall.h"; + syscall_h_is_unmodified = (syscall_h_ours == syscall_h_reference); + stage1_seeder_ours = "${../recipes/1-stage1/seed.host-executed.sh}"; + stage1_seeder_reference = "/nix/store/qv4rmbdclws5nrx3m1vw1pb98qacw226-seed.host-executed.sh"; + stage1_seeder_is_unmodified = (stage1_seeder_ours == stage1_seeder_reference); +in + if (and [ syscall_h_is_unmodified stage1_seeder_is_unmodified ]) + then import ./0-prebuilt.nix + else import ./0-from-nixpkgs.nix diff --git a/06/using-nix/1-stage1.nix b/06/using-nix/1-stage1.nix new file mode 100644 index 0000000..4ae0b7c --- /dev/null +++ b/06/using-nix/1-stage1.nix @@ -0,0 +1,26 @@ +{ tcc-seed, protosrc, recipesStage1ExtrasPath, stage1cPath }: + +derivation { + name = "bootstrap-1-stage1"; + builder = "/bin/sh"; # purely to pass $vars, which is silly + args = [ "-c" '' + ${tcc-seed} \ + -nostdinc -nostdlib -Werror \ + -I${recipesStage1ExtrasPath} \ + -DINSIDE_NIX \ + -DPROTOSRC='"'${protosrc}'"' \ + -DTCC_SEED='"'${tcc-seed}'"' \ + -DRECIPES_STAGE1='"'${recipesStage1ExtrasPath}'"' \ + -DTMP_STAGE1='"'$TMPDIR/tmp'"' \ + -DSTORE_PROTOBUSYBOX='"'$protobusybox/'"' \ + -DSTORE_PROTOMUSL='"'$protomusl'"' \ + -DSTORE_TINYCC='"'$tinycc'"' \ + -run ${stage1cPath} + '']; + outputs = [ "protobusybox" "protomusl" "tinycc" ]; + allowedReferences = [ "protobusybox" "protomusl" "tinycc" ]; + allowedRequisites = [ "protobusybox" "protomusl" "tinycc" ]; + system = "x86_64-linux"; + __contentAddressed = true; + outputHashAlgo = "sha256"; outputHashMode = "recursive"; +} diff --git a/06/using-nix/2a0-static-gnumake.nix b/06/using-nix/2a0-static-gnumake.nix new file mode 100644 index 0000000..b32448d --- /dev/null +++ b/06/using-nix/2a0-static-gnumake.nix @@ -0,0 +1,70 @@ +{ fetchurl, mkDerivationStage2, stage1 }: + +let + source-tarball-gnumake = fetchurl { + # local = /downloads/make-4.4.1.tar.gz; + url = "http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz"; + sha256 = "dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a0-static-gnumake"; + buildInputPaths = [ + "${stage1.tinycc}/wrappers" + "${stage1.protobusybox}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # unpack: + unpack ${source-tarball-gnumake} + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \ + src/job.c build-aux/install-sh po/Makefile.in.in + # this is part of stdlib, no idea how it's supposed to not clash + rm src/getopt.h + for f in src/getopt.c src/getopt1.c lib/fnmatch.c; do :> $f; done + for f in lib/glob.c lib/xmalloc.c lib/error.c; do :> $f; done + # embrace chaos + shuffle_comment='\/\* Handle shuffle mode argument. \*\/' + shuffle_default='if (!shuffle_mode) shuffle_mode = xstrdup(\"random\");' + sed -i "s|$shuffle_comment|$shuffle_comment\n$shuffle_default|" \ + src/main.c + grep 'if (!shuffle_mode) shuffle_mode = xstrdup("random");' src/main.c + # configure: + ash ./configure \ + --build x86_64-linux \ + --disable-dependency-tracking \ + --prefix=$out \ + CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \ + SHELL='${stage1.protobusybox}/bin/ash' + # bootstrap build: + ash ./build.sh + # test static GNU Make by remaking it with itself: + mv make make-intermediate + ./make-intermediate -j $NPROC clean + ./make-intermediate -j $NPROC + # reconfigure: + ash ./configure \ + --build x86_64-linux \ + --disable-dependency-tracking \ + --prefix=$out \ + CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \ + SHELL='${stage1.protobusybox}/bin/ash' + # rebuild: + ash ./build.sh + # test: + mv make make-intermediate + ./make-intermediate -j $NPROC clean + ./make-intermediate -j $NPROC CFLAGS=-O2 + # install: + ./make -j $NPROC install + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + # wrap: + # FIXME: patch make to use getenv? + mkdir -p $out/wrappers; cd $out/wrappers + echo "#!${stage1.protobusybox}/bin/ash" > make + echo "exec $out/bin/make SHELL=\$SHELL \"\$@\"" \ >> make + chmod +x make + ''; + } diff --git a/06/using-nix/2a1-static-binutils.nix b/06/using-nix/2a1-static-binutils.nix new file mode 100644 index 0000000..e98189b --- /dev/null +++ b/06/using-nix/2a1-static-binutils.nix @@ -0,0 +1,56 @@ +{ fetchurl, mkDerivationStage2, stage1, static-gnumake }: + +let + source-tarball-binutils = fetchurl { + # local = /downloads/binutils-2.39.tar.xz; + url = "https://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.xz"; + sha256 = "645c25f563b8adc0a81dbd6a41cffbf4d37083a382e02d5d3df4f65c09516d00"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a1-static-binutils"; + buildInputPaths = [ + "${stage1.tinycc}/wrappers" + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # unpack: + unpack ${source-tarball-binutils} + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \ + missing install-sh mkinstalldirs + # see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 + sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh + sed -i 's|__FILE__|"__FILE__"|' \ + ld/*.c ld/*.h bfd/*.* libctf/*.* opcodes/*.* + sed -i 's| -g | |' ld/Makefile* + # alias makeinfo to true + mkdir aliases + ln -s ${stage1.protobusybox}/bin/true aliases/makeinfo + PATH="$(pwd)/aliases/:$PATH" + # configure: + export lt_cv_sys_max_cmd_len=32768 + export ac_cv_func_strncmp_works=no + ash ./configure \ + CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \ + SHELL='${stage1.protobusybox}/bin/ash' \ + CFLAGS='-O2 -D__LITTLE_ENDIAN__=1' \ + CFLAGS_FOR_TARGET=-O2 \ + --enable-deterministic-archives \ + --disable-gprofng \ + --host x86_64-linux --build x86_64-linux \ + --prefix=$out + # build: + make -j $NPROC \ + all-libiberty all-gas all-bfd all-libctf all-zlib all-gprof + make all-ld # race condition on ld/.deps/ldwrite.Po, serialize + make -j $NPROC + # install: + make -j $NPROC install + rm $out/lib/*.la # broken, reference builddir + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a2-static-gnugcc4-c.nix b/06/using-nix/2a2-static-gnugcc4-c.nix new file mode 100644 index 0000000..45dea0e --- /dev/null +++ b/06/using-nix/2a2-static-gnugcc4-c.nix @@ -0,0 +1,85 @@ +{ fetchurl, mkDerivationStage2, stage1, static-gnumake, static-binutils }: + +let + source-tarball-gcc = fetchurl { + # local = /downloads/gcc-4.7.4.tar.bz2; + url = "https://ftp.gnu.org/gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2"; + sha256 = "92e61c6dc3a0a449e62d72a38185fda550168a86702dea07125ebd3ec3996282"; + }; + source-tarball-gmp = fetchurl { + # local = /downloads/gmp-4.3.2.tar.xz; + url = "https://gmplib.org/download/gmp/archive/gmp-4.3.2.tar.xz"; + sha256 = "f69eff1bc3d15d4e59011d587c57462a8d3d32cf2378d32d30d008a42a863325"; + }; + source-tarball-mpfr = fetchurl { + # local = /downloads/mpfr-2.4.2.tar.xz; + url = "https://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.xz"; + sha256 = "d7271bbfbc9ddf387d3919df8318cd7192c67b232919bfa1cb3202d07843da1b"; + }; + source-tarball-mpc = fetchurl { + # local = /downloads/mpc-0.8.1.tar.gz; + url = "http://www.multiprecision.org/downloads/mpc-0.8.1.tar.gz"; + sha256 = "e664603757251fd8a352848276497a4c79b7f8b21fd8aedd5cc0598a38fee3e4"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a2-static-gnugcc4-c"; + buildInputPaths = [ + "${stage1.tinycc}/wrappers" + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # alias ash to sh: + mkdir aliases; ln -s ${stage1.protobusybox}/bin/ash aliases/sh + export PATH="$(pwd)/aliases:$PATH" + # unpack: + unpack ${source-tarball-gcc} + mkdir mpfr mpc gmp + unpack ${source-tarball-mpfr} -C mpfr + unpack ${source-tarball-mpc} -C mpc + unpack ${source-tarball-gmp} -C gmp + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \ + missing move-if-change mkdep mkinstalldirs symlink-tree \ + gcc/genmultilib */*.sh gcc/exec-tool.in \ + install-sh */install-sh + sed -i 's|^\(\s*\)sh |\1${stage1.protobusybox}/bin/ash |' \ + Makefile* */Makefile* + sed -i 's|LIBGCC2_DEBUG_CFLAGS = -g|LIBGCC2_DEBUG_CFLAGS = |' \ + libgcc/Makefile.in + # see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 + sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh */ltmain.sh + sed -i 's|#define HAVE_HOST_CORE2 1||' mpfr/configure + # configure: + export ac_cv_func_strncmp_works=no + export ac_cv_func_alloca_works=no + export ac_cv_prog_make_make_set=no + ash configure \ + CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \ + SHELL='${stage1.protobusybox}/bin/ash' \ + CFLAGS=-O2 CFLAGS_FOR_TARGET=-O2 \ + --with-sysroot=${stage1.protomusl} \ + --with-native-system-header-dir=/include \ + --with-build-time-tools=${static-binutils}/bin \ + --prefix=$out \ + --enable-languages=c \ + --disable-bootstrap \ + --disable-libquadmath --disable-decimal-float --disable-fixed-point \ + --disable-lto \ + --disable-libgomp \ + --disable-multilib \ + --disable-multiarch \ + --disable-libmudflap \ + --disable-libssp \ + --disable-nls \ + --host x86_64-linux --build x86_64-linux + # build: + make -j $NPROC + # install: + make -j $NPROC install + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a3-intermediate-musl.nix b/06/using-nix/2a3-intermediate-musl.nix new file mode 100644 index 0000000..794bf22 --- /dev/null +++ b/06/using-nix/2a3-intermediate-musl.nix @@ -0,0 +1,42 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, static-binutils, static-gnugcc4-c }: + +let + source-tarball-musl = fetchurl { + # local = /downloads/musl-1.2.4.tar.gz; + url = "http://musl.libc.org/releases/musl-1.2.4.tar.gz"; + sha256 = "7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a3-intermediate-musl"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + "${static-binutils}/bin" + "${static-gnugcc4-c}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # unpack: + unpack ${source-tarball-musl} + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \ + tools/*.sh \ + # patch popen/system to search in PATH instead of hardcoding /bin/sh + sed -i 's|posix_spawn(&pid, "/bin/sh",|posix_spawnp(\&pid, "sh",|' \ + src/stdio/popen.c src/process/system.c + sed -i 's|execl("/bin/sh", "sh", "-c",|execlp("sh", "-c",|'\ + src/misc/wordexp.c + # eliminate a source path reference + sed -i 's/__FILE__/"__FILE__"/' include/assert.h + # configure: + ash ./configure --prefix=$out + # build: + make -j $NPROC + # install: + make -j $NPROC install + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a4-gnugcc4-cpp.nix b/06/using-nix/2a4-gnugcc4-cpp.nix new file mode 100644 index 0000000..038ab20 --- /dev/null +++ b/06/using-nix/2a4-gnugcc4-cpp.nix @@ -0,0 +1,113 @@ +{ fetchurl, mkDerivationStage2 +, stage1 +, static-gnumake, static-binutils, static-gnugcc4-c, intermediate-musl }: + +let + source-tarball-gcc = fetchurl { + # local = /downloads/gcc-4.7.4.tar.bz2; + url = "https://ftp.gnu.org/gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2"; + sha256 = "92e61c6dc3a0a449e62d72a38185fda550168a86702dea07125ebd3ec3996282"; + }; + source-tarball-gmp = fetchurl { + # local = /downloads/gmp-4.3.2.tar.xz; + url = "https://gmplib.org/download/gmp/archive/gmp-4.3.2.tar.xz"; + sha256 = "f69eff1bc3d15d4e59011d587c57462a8d3d32cf2378d32d30d008a42a863325"; + }; + source-tarball-mpfr = fetchurl { + # local = /downloads/mpfr-2.4.2.tar.xz; + url = "https://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.xz"; + sha256 = "d7271bbfbc9ddf387d3919df8318cd7192c67b232919bfa1cb3202d07843da1b"; + }; + source-tarball-mpc = fetchurl { + # local = /downloads/mpc-0.8.1.tar.gz; + url = "http://www.multiprecision.org/downloads/mpc-0.8.1.tar.gz"; + sha256 = "e664603757251fd8a352848276497a4c79b7f8b21fd8aedd5cc0598a38fee3e4"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a4-gnugcc4-cpp"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + "${static-binutils}/bin" + "${static-gnugcc4-c}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # alias ash to sh: + mkdir aliases; ln -s ${stage1.protobusybox}/bin/ash aliases/sh + export PATH="$(pwd)/aliases:$PATH" + # create wrappers that make previous GNU GCC target new musl: + SYSROOT=${intermediate-musl} + export _SYSROOT="--sysroot $SYSROOT" + export _LDFLAG="--dynamic-linker=$SYSROOT/lib/libc.so" + export _NEWINC="-I$SYSROOT/include" + export _REALCC="-I$SYSROOT/include" + mkdir wrappers + echo '#!${stage1.protobusybox}/bin/ash' > wrappers/cc + echo '#!${stage1.protobusybox}/bin/ash' > wrappers/cpp + echo '#!${stage1.protobusybox}/bin/ash' > wrappers/ld + echo 'exec gcc $_SYSROOT -Wl,$_LDFLAG "$@"' >> wrappers/cc + echo 'exec ${static-gnugcc4-c}/bin/cpp $_NEWINC "$@"' \ + >> wrappers/cpp + echo 'exec ${static-binutils}/bin/ld $_LDFLAG "$@"' \ + >> wrappers/ld + chmod +x wrappers/cc wrappers/cpp wrappers/ld + export PATH="$(pwd)/wrappers:$PATH" + # unpack: + unpack ${source-tarball-gcc} + mkdir mpfr mpc gmp + unpack ${source-tarball-mpfr} -C mpfr + unpack ${source-tarball-mpc} -C mpc + unpack ${source-tarball-gmp} -C gmp + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \ + missing move-if-change mkdep mkinstalldirs symlink-tree \ + gcc/genmultilib */*.sh gcc/exec-tool.in \ + install-sh */install-sh + sed -i 's|^\(\s*\)sh |\1${stage1.protobusybox}/bin/ash |' \ + Makefile* */Makefile* + sed -i "s|/lib64/ld-linux-x86-64.so.2|$SYSROOT/lib/libc.so|" \ + gcc/config/i386/linux64.h + sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host + sed -i 's|LIBGCC2_DEBUG_CFLAGS = -g|LIBGCC2_DEBUG_CFLAGS = |' \ + libgcc/Makefile.in + # see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 + sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh */ltmain.sh + sed -i 's|#define HAVE_HOST_CORE2 1||' mpfr/configure + # configure: + export ac_cv_func_strncmp_works=no + export ac_cv_func_alloca_works=no + export ac_cv_prog_make_make_set=no + export glibcxx_cv_random_tr1=no + ash configure \ + cache_file=nonex \ + CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \ + SHELL='${stage1.protobusybox}/bin/ash' \ + CC=cc CPP=cpp LD=ld \ + CFLAGS=-O2 CFLAGS_FOR_TARGET=-O2 \ + --with-sysroot=$SYSROOT \ + --with-native-system-header-dir=/include \ + --with-build-time-tools=${static-binutils}/bin \ + --prefix=$out \ + --with-specs='%{!static:%x{-rpath=$out/lib64}}' \ + --enable-languages=c,c++ \ + --disable-bootstrap \ + --disable-libquadmath --disable-decimal-float --disable-fixed-point \ + --disable-lto \ + --disable-libgomp \ + --disable-multilib \ + --disable-multiarch \ + --disable-libmudflap \ + --disable-libssp \ + --disable-nls \ + --disable-libitm \ + --host x86_64-linux --build x86_64-linux + # build: + make -j $NPROC + # install: + make -j $NPROC install + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a5-gnugcc10.nix b/06/using-nix/2a5-gnugcc10.nix new file mode 100644 index 0000000..3b71b23 --- /dev/null +++ b/06/using-nix/2a5-gnugcc10.nix @@ -0,0 +1,104 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, static-binutils, intermediate-musl, gnugcc4-cpp }: + +let + source-tarball-gcc = fetchurl { + # local = /downloads/gcc-10.5.0.tar.xz; + url = "https://ftp.gnu.org/gnu/gcc/gcc-10.5.0/gcc-10.5.0.tar.xz"; + sha256 = "25109543fdf46f397c347b5d8b7a2c7e5694a5a51cce4b9c6e1ea8a71ca307c1"; + }; + source-tarball-gmp = fetchurl { + # local = /downloads/gmp-6.1.0.tar.xz; + url = "https://gmplib.org/download/gmp/gmp-6.1.0.tar.xz"; + sha256 = "68dadacce515b0f8a54f510edf07c1b636492bcdb8e8d54c56eb216225d16989"; + }; + source-tarball-mpfr = fetchurl { + # local = /downloads/mpfr-3.1.4.tar.xz; + url = "https://www.mpfr.org/mpfr-3.1.4/mpfr-3.1.4.tar.xz"; + sha256 = "761413b16d749c53e2bfd2b1dfaa3b027b0e793e404b90b5fbaeef60af6517f5"; + }; + source-tarball-mpc = fetchurl { + # local = /downloads/mpc-1.0.3.tar.gz; + url = "http://www.multiprecision.org/downloads/mpc-1.0.3.tar.gz"; + sha256 = "617decc6ea09889fb08ede330917a00b16809b8db88c29c31bfbb49cbf88ecc3"; + }; + source-tarball-isl = fetchurl { + # local = /downloads/isl-0.18.tar.bz2; + url = "http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2"; + sha256 = "6b8b0fd7f81d0a957beb3679c81bbb34ccc7568d5682844d8924424a0dadcb1b"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a5-gnugcc10"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + "${static-binutils}/bin" + "${gnugcc4-cpp}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # alias ash to sh: + mkdir aliases; ln -s ${stage1.protobusybox}/bin/ash aliases/sh + export PATH="$(pwd)/aliases:$PATH" + # unpack: + unpack ${source-tarball-gcc} + mkdir mpfr mpc gmp isl + unpack ${source-tarball-mpfr} -C mpfr + unpack ${source-tarball-mpc} -C mpc + unpack ${source-tarball-gmp} -C gmp + unpack ${source-tarball-isl} -C isl + # fixup: + SYSROOT=${intermediate-musl} + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \ + missing move-if-change mkdep mkinstalldirs symlink-tree install-sh \ + gcc/exec-tool.in gcc/genmultilib libgcc/mkheader.sh + sed -i 's|^\(\s*\)sh |\1${stage1.protobusybox}/bin/ash |' \ + libgcc/Makefile.in + sed -i "s|/lib/ld-musl-x86_64.so.1|$SYSROOT/lib/libc.so|" \ + gcc/config/i386/linux64.h + sed -i 's|m64=../lib64|m64=../lib|' gcc/config/i386/t-linux64 + sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host + sed -i 's|LIBGCC2_DEBUG_CFLAGS = -g|LIBGCC2_DEBUG_CFLAGS = |' \ + libgcc/Makefile.in + # see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 + sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh */ltmain.sh + # configure: + export ac_cv_func_strncmp_works=no + export ac_cv_prog_make_make_set=no + export glibcxx_cv_dev_random=no + ash configure \ + CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \ + SHELL='${stage1.protobusybox}/bin/ash' \ + CFLAGS=-O2 CXXFLAGS=-O2 \ + CFLAGS_FOR_TARGET=-O2 CXXFLAGS_FOR_TARGET=-O2 \ + --with-sysroot=$SYSROOT \ + --with-native-system-header-dir=/include \ + --with-build-time-tools=${static-binutils}/bin \ + --prefix=$out \ + --with-specs='%{!static:%x{-rpath=$out/lib}}' \ + --enable-languages=c,c++ \ + --disable-bootstrap \ + --disable-libquadmath --disable-decimal-float --disable-fixed-point \ + --disable-lto \ + --disable-libgomp \ + --disable-multilib \ + --disable-multiarch \ + --disable-libmudflap \ + --disable-libssp \ + --disable-nls \ + --disable-libitm \ + --disable-libsanitizer \ + --disable-cet \ + --disable-gnu-unique-object \ + --disable-gcov \ + --disable-checking \ + --host x86_64-linux-musl --build x86_64-linux-musl + # build: + make -j $NPROC + # install: + make -j $NPROC install + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a6-linux-headers.nix b/06/using-nix/2a6-linux-headers.nix new file mode 100644 index 0000000..72344fa --- /dev/null +++ b/06/using-nix/2a6-linux-headers.nix @@ -0,0 +1,39 @@ +{ fetchurl, mkDerivationStage2, stage1, static-gnumake, static-binutils, gnugcc10 }: + +let + source-tarball-linux = fetchurl { + # local = /downloads/linux-6.4.12.tar.xz; + url = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.4.12.tar.xz"; + sha256 = "cca91be956fe081f8f6da72034cded96fe35a50be4bfb7e103e354aa2159a674"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a6-linux-headers"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + "${static-binutils}/bin" + "${gnugcc10}/bin" + ]; + script = '' + # unpack: + mkdir build-dir; cd build-dir + unpack ${source-tarball-linux} \ + linux-6.4.12/Makefile \ + linux-6.4.12/arch/x86 \ + linux-6.4.12/include \ + linux-6.4.12/scripts \ + linux-6.4.12/tools + # build: + make -j $NPROC \ + CONFIG_SHELL=${stage1.protobusybox}/bin/ash \ + CC=gcc HOSTCC=gcc ARCH=x86_64 \ + headers + # install: + find usr/include -name '.*' | xargs rm + mkdir -p $out + cp -rv usr/include $out/ + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a7-cmake.nix b/06/using-nix/2a7-cmake.nix new file mode 100644 index 0000000..90d3706 --- /dev/null +++ b/06/using-nix/2a7-cmake.nix @@ -0,0 +1,51 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, static-binutils, gnugcc10, linux-headers }: + +let + source-tarball-cmake = fetchurl { + # local = /downloads/cmake-3.27.4.tar.gz; + url = "https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4.tar.gz"; + sha256 = "0a905ca8635ca81aa152e123bdde7e54cbe764fdd9a70d62af44cad8b92967af"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a7-cmake"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/wrappers" + "${static-binutils}/bin" + "${gnugcc10}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + export SHELL=${stage1.protobusybox}/bin/ash + # unpack: + unpack ${source-tarball-cmake} + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' bootstrap + sed -i 's|__FILE__|"__FILE__"|' \ + Source/CPack/IFW/cmCPackIFWCommon.h \ + Source/CPack/cmCPack*.h \ + Source/cmCTest.h + # bundle libraries: + # poor man's static linking, a way for cmake to be self-contained later + mkdir -p $out/bundled-runtime + cp -H ${gnugcc10}/lib/libstdc++.so.6 $out/bundled-runtime/ + cp -H ${gnugcc10}/lib/libgcc_s.so.1 $out/bundled-runtime/ + # configure: + ash configure \ + CFLAGS="-DCPU_SETSIZE=128 -D_GNU_SOURCE" \ + CXXFLAGS="-isystem ${linux-headers}/include" \ + LDFLAGS="-Wl,-rpath $out/bundled-runtime" \ + --prefix=$out \ + --parallel=$NPROC \ + -- \ + -DCMAKE_USE_OPENSSL=OFF + # build: + make -j $NPROC + # install: + make -j $NPROC install/strip + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2a8-python.nix b/06/using-nix/2a8-python.nix new file mode 100644 index 0000000..f8ae622 --- /dev/null +++ b/06/using-nix/2a8-python.nix @@ -0,0 +1,74 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, static-binutils, gnugcc10 }: + +let + source-tarball-python = fetchurl { + # local = /downloads/Python-3.12.0.tar.xz; + url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz"; + sha256 = "795c34f44df45a0e9b9710c8c71c15c671871524cd412ca14def212e8ccb155d"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a8-python"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/wrappers" + "${static-binutils}/bin" + "${gnugcc10}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + export SHELL=${stage1.protobusybox}/bin/ash + # alias ash to sh: + mkdir aliases; ln -s ${stage1.protobusybox}/bin/ash aliases/sh + export PATH="$(pwd)/aliases:$PATH" + # unpack: + unpack ${source-tarball-python} + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' configure install-sh + sed -i 's|ac_sys_system=`uname -s`|ac_sys_system=Linux|' configure + # the precompiled pyc files aren't reproducible, + # but it's not like I need to waste time on them anyway. + # break their generation + mv Lib/compileall.py Lib/compileall.py.bak + echo 'import sys; sys.exit(0)' > Lib/compileall.py + chmod +x Lib/compileall.py + sed -i 's|__FILE__|"__FILE__"|' \ + Python/errors.c \ + Include/pyerrors.h \ + Include/cpython/object.h \ + Modules/pyexpat.c + sed -i 's|TIME __TIME__|TIME "xx:xx:xx"|' Modules/getbuildinfo.c + sed -i 's|DATE __DATE__|DATE "xx/xx/xx"|' Modules/getbuildinfo.c + # different build path length leads to different wrapping. avoid + sed -i 's|vars, stream=f|vars, stream=f, width=2**24|' Lib/sysconfig.py + # configure: + mkdir -p $out/lib + ash configure \ + ac_cv_broken_sem_getvalue=yes \ + ac_cv_posix_semaphores_enabled=no \ + OPT='-DNDEBUG -fwrapv -O3 -Wall' \ + LDFLAGS="-Wl,-rpath $out/lib" \ + --without-static-libpython \ + --build x86_64-linux-musl \ + --prefix=$out \ + --enable-shared \ + --with-ensurepip=no + # ensure reproducibility in case of no /dev/shm + grep 'define POSIX_SEMAPHORES_NOT_ENABLED 1' pyconfig.h + grep 'define HAVE_BROKEN_SEM_GETVALUE 1' pyconfig.h + # build: + make -j $NPROC + # install: + make -j $NPROC install + # strip builddir mentions: + sed -i "s|$(pwd)|...|g" \ + $out/lib/python3.*/_sysconfigdata__*.py \ + $out/lib/python3.*/config-3.*-x86_64-linux-musl/Makefile + # restore compileall just in case + cat Lib/compileall.py.bak > $out/lib/python3.12/compileall.py + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } + diff --git a/06/using-nix/2a9-intermediate-clang.nix b/06/using-nix/2a9-intermediate-clang.nix new file mode 100644 index 0000000..7d3696d --- /dev/null +++ b/06/using-nix/2a9-intermediate-clang.nix @@ -0,0 +1,145 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, static-binutils, intermediate-musl, gnugcc10 +, linux-headers, cmake, python}: + +let + source-tarball-llvm = fetchurl { + # local = /downloads/llvm-project-17.0.1.src.tar.xz; + url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.1/llvm-project-17.0.1.src.tar.xz"; + sha256 = "b0e42aafc01ece2ca2b42e3526f54bebc4b1f1dc8de6e34f46a0446a13e882b9"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2a9-intermediate-clang"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/wrappers" + "${static-binutils}/bin" + "${gnugcc10}/bin" + "${cmake}/bin" + "${python}/bin" + ]; + script = '' + # Shared libs are not relinked on install. Instead, their rpath + # is erased with RPATH_SET: `Set runtime path of + # "/nix/store/.../lib/x86_64-unknown-linux-musl/libc++.so.1.0" to ""` + # One (hacky) workaround to that is using a constant-len build-dir. + build_dir=build-dir; expr "$(pwd)/$build_dir)" '<=' 128 + while ! echo "$(pwd)/$build_dir" | wc -c | grep -Fqx 128; do + build_dir="$build_dir." + done; expr "$(echo $(pwd)/$build_dir | wc -c)" '==' 128 + mkdir $build_dir; cd $build_dir + export SHELL=${stage1.protobusybox}/bin/ash + # llvm cmake configuration should pick up ccache automatically from PATH + export PATH="$PATH:/ccache/bin" + command -v ccache && USE_CCACHE=YES || USE_CCACHE=NO + # prepare future sysroot: + SYSROOT=$out/sysroot + mkdir -p $SYSROOT/lib $SYSROOT/include + ln -s ${intermediate-musl}/lib/* $SYSROOT/lib/ + ln -s ${intermediate-musl}/include/* $SYSROOT/include/ + # unpack: + unpack ${source-tarball-llvm} + # fixup: + sed -i "s|COMMAND sh|COMMAND ${stage1.protobusybox}/bin/ash|" \ + llvm/cmake/modules/GetHostTriple.cmake clang/CMakeLists.txt + echo 'echo x86_64-unknown-linux-musl' > llvm/cmake/config.guess + LOADER=${intermediate-musl}/lib/libc.so + sed -i "s|/lib/ld-musl-\" + ArchName + \".so.1|$LOADER|" \ + clang/lib/Driver/ToolChains/Linux.cpp + BEGINEND='const bool HasCRTBeginEndFiles' + sed -i "s|$BEGINEND =|$BEGINEND = false; ''${BEGINEND}_unused =|" \ + clang/lib/Driver/ToolChains/Gnu.cpp + REL_ORIGIN='_install_rpath \"\$ORIGIN/../lib''${LLVM_LIBDIR_SUFFIX}\"' + sed -i "s|_install_rpath \"\\\\\$ORIGIN/..|_install_rpath \"$out|" \ + llvm/cmake/modules/AddLLVM.cmake + sed -i 's|numShards = 32;|numShards = 1;|' lld/*/SyntheticSections.* + sed -i 's|numShards = 256;|numShards = 1;|' lld/*/ICF.cpp + sed -i 's|__FILE__|"__FILE__"|' \ + libcxx/src/verbose_abort.cpp \ + libcxxabi/src/abort_message.cpp \ + compiler-rt/lib/builtins/int_util.h + sed -i 's|"@LLVM_SRC_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in + sed -i 's|"@LLVM_OBJ_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in + # figure out includes: + EXTRA_INCL="$(pwd)/extra_includes" + mkdir -p $EXTRA_INCL + cp clang/lib/Headers/*intrin*.h $EXTRA_INCL/ + cp clang/lib/Headers/mm_malloc.h $EXTRA_INCL/ + [ -e $EXTRA_INCL/immintrin.h ] + # configure: + export LD_LIBRARY_PATH=${gnugcc10}/lib + BOTH_STAGES_OPTS="" + add_opt() { + BOTH_STAGES_OPTS="$BOTH_STAGES_OPTS -D$1 -DBOOTSTRAP_$1" + } + add_opt CMAKE_BUILD_TYPE=MinSizeRel + add_opt LLVM_OPTIMIZED_TABLEGEN=YES + add_opt LLVM_CCACHE_BUILD=$USE_CCACHE + add_opt DEFAULT_SYSROOT=$SYSROOT + add_opt CMAKE_INSTALL_PREFIX=$out + add_opt LLVM_INSTALL_BINUTILS_SYMLINKS=YES + add_opt LLVM_INSTALL_CCTOOLS_SYMLINKS=YES + add_opt CMAKE_INSTALL_DO_STRIP=YES + add_opt LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=YES + add_opt LLVM_TARGET_ARCH=X86 + add_opt LLVM_TARGETS_TO_BUILD=Native + add_opt LLVM_BUILTIN_TARGETS=x86_64-unknown-linux-musl + add_opt LLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl + add_opt LLVM_HOST_TRIPLE=x86_64-unknown-linux-musl + add_opt COMPILER_RT_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl + add_opt LLVM_APPEND_VC_REV=NO + add_opt LLVM_INCLUDE_TESTS=NO + add_opt LLVM_INCLUDE_EXAMPLES=NO + add_opt LLVM_INCLUDE_BENCHMARKS=NO + add_opt LLVM_ENABLE_BACKTRACES=NO + add_opt LLVM_ENABLE_EH=YES + add_opt LLVM_ENABLE_RTTI=YES + add_opt CLANG_ENABLE_ARCMT=NO + add_opt CLANG_ENABLE_STATIC_ANALYZER=NO + add_opt COMPILER_RT_BUILD_SANITIZERS=NO + add_opt COMPILER_RT_BUILD_XRAY=NO + add_opt COMPILER_RT_BUILD_LIBFUZZER=NO + add_opt COMPILER_RT_BUILD_PROFILE=NO + add_opt COMPILER_RT_BUILD_MEMPROF=NO + add_opt COMPILER_RT_BUILD_ORC=NO + add_opt COMPILER_RT_USE_BUILTINS_LIBRARY=YES + add_opt CLANG_DEFAULT_CXX_STDLIB=libc++ + add_opt CLANG_DEFAULT_LINKER=lld + add_opt CLANG_DEFAULT_RTLIB=compiler-rt + add_opt LIBCXX_HAS_MUSL_LIBC=YES + add_opt LIBCXX_USE_COMPILER_RT=YES + add_opt LIBCXX_INCLUDE_BENCHMARKS=NO + add_opt LIBCXX_CXX_ABI=libcxxabi + add_opt LIBCXXABI_USE_COMPILER_RT=YES + add_opt LIBCXXABI_USE_LLVM_UNWINDER=YES + add_opt LIBCXX_ADDITIONAL_COMPILE_FLAGS=-I${linux-headers}/include + add_opt LLVM_INSTALL_TOOLCHAIN_ONLY=YES + add_opt LIBUNWIND_USE_COMPILER_RT=YES + add_opt LLVM_ENABLE_THREADS=NO + cmake -S llvm -B build -G 'Unix Makefiles' \ + -DLLVM_ENABLE_PROJECTS='clang;lld' \ + -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \ + -DGCC_INSTALL_PREFIX=${gnugcc10} \ + "-DBOOTSTRAP_CMAKE_C_FLAGS=-isystem $EXTRA_INCL" \ + "-DBOOTSTRAP_CMAKE_CXX_FLAGS=-isystem $EXTRA_INCL" \ + -DCLANG_ENABLE_BOOTSTRAP=YES $BOTH_STAGES_OPTS + # build (stage1): + make -C build -j $NPROC clang lld runtimes + # build/install (stage2): + NEW_LIB_DIR="$(pwd)/build/lib/x86_64-unknown-linux-musl" + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$NEW_LIB_DIR" + make -C build -j $NPROC stage2 stage2-install + ln -s $out/lib/x86_64-unknown-linux-musl/* $out/lib/ + mkdir -p $out/bin/generic-names + ln -s $out/bin/clang $out/bin/generic-names/cc + ln -s $out/bin/clang++ $out/bin/generic-names/c++ + ln -s $out/bin/clang-cpp $out/bin/generic-names/cpp + # mix new stuff into sysroot + ln -s $out/lib/* $out/sysroot/lib/ + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + } diff --git a/06/using-nix/2b0-musl.nix b/06/using-nix/2b0-musl.nix new file mode 100644 index 0000000..ac74359 --- /dev/null +++ b/06/using-nix/2b0-musl.nix @@ -0,0 +1,45 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, intermediate-clang }: + +let + source-tarball-musl = fetchurl { + # local = /downloads/musl-1.2.4.tar.gz; + url = "http://musl.libc.org/releases/musl-1.2.4.tar.gz"; + sha256 = "7a35eae33d5372a7c0da1188de798726f68825513b7ae3ebe97aaaa52114f039"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2b0-musl"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + "${intermediate-clang}/bin" + "${intermediate-clang}/bin/generic-names" + ]; + script = '' + # unpack: + mkdir build-dir; cd build-dir + unpack ${source-tarball-musl} + # fixup: + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' tools/*.sh \ + # patch popen/system to search in PATH instead of hardcoding /bin/sh + sed -i 's|posix_spawn(&pid, "/bin/sh",|posix_spawnp(\&pid, "sh",|' \ + src/stdio/popen.c src/process/system.c + sed -i 's|execl("/bin/sh", "sh", "-c",|execlp("sh", "-c",|'\ + src/misc/wordexp.c + # avoid absolute path references + sed -i 's/__FILE__/__FILE_NAME__/' include/assert.h + # configure: + ash ./configure --prefix=$out CFLAGS=-O2 + # build: + make -j $NPROC + # install: + make -j $NPROC install + mkdir $out/bin + ln -s $out/lib/libc.so $out/bin/ldd + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + extra.allowedRequisites = [ "out" ]; + extra.allowedReferences = [ "out" ]; + } diff --git a/06/using-nix/2b1-clang.nix b/06/using-nix/2b1-clang.nix new file mode 100644 index 0000000..e7bf2be --- /dev/null +++ b/06/using-nix/2b1-clang.nix @@ -0,0 +1,157 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, musl, intermediate-clang +, linux-headers, cmake, python}: + +let + source-tarball-llvm = fetchurl { + # local = /downloads/llvm-project-17.0.1.src.tar.xz; + url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.1/llvm-project-17.0.1.src.tar.xz"; + sha256 = "b0e42aafc01ece2ca2b42e3526f54bebc4b1f1dc8de6e34f46a0446a13e882b9"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2b1-clang"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/wrappers" + "${cmake}/bin" + "${python}/bin" + # 2a9-intermediate-clang intentionally not added to $PATH + # to prevent confusion + ]; + script = '' + # Shared libs are not relinked on install. Instead, their rpath + # is erased with RPATH_SET: `Set runtime path of + # "/nix/store/.../lib/x86_64-unknown-linux-musl/libc++.so.1.0" to ""` + # One (hacky) workaround to that is using a constant-len build-dir. + build_dir=build-dir; expr "$(pwd)/$build_dir)" '<=' 128 + while ! echo "$(pwd)/$build_dir" | wc -c | grep -Fqx 128; do + build_dir="$build_dir." + done; expr "$(echo $(pwd)/$build_dir | wc -c)" '==' 128 + mkdir $build_dir; cd $build_dir + export SHELL=${stage1.protobusybox}/bin/ash + # llvm cmake configuration should pick up ccache automatically from PATH + export PATH="$PATH:/ccache/bin" + command -v ccache && USE_CCACHE=YES || USE_CCACHE=NO + # prepare future sysroot: + SYSROOT=$out/sysroot + mkdir -p $SYSROOT/lib $SYSROOT/include + ln -s ${musl}/lib/* $SYSROOT/lib/ + ln -s ${musl}/include/* $SYSROOT/include/ + # unpack: + unpack ${source-tarball-llvm} + # fixup: + sed -i "s|COMMAND sh|COMMAND ${stage1.protobusybox}/bin/ash|" \ + llvm/cmake/modules/GetHostTriple.cmake clang/CMakeLists.txt + echo 'echo x86_64-unknown-linux-musl' > llvm/cmake/config.guess + LOADER=${musl}/lib/libc.so + sed -i "s|/lib/ld-musl-\" + ArchName + \".so.1|$LOADER|" \ + clang/lib/Driver/ToolChains/Linux.cpp + BEGINEND='const bool HasCRTBeginEndFiles' + sed -i "s|$BEGINEND =|$BEGINEND = false; ''${BEGINEND}_unused =|" \ + clang/lib/Driver/ToolChains/Gnu.cpp + REL_ORIGIN='_install_rpath \"\$ORIGIN/../lib''${LLVM_LIBDIR_SUFFIX}\"' + sed -i "s|_install_rpath \"\\\\\$ORIGIN/..|_install_rpath \"$out|" \ + llvm/cmake/modules/AddLLVM.cmake + sed -i 's|numShards = 32;|numShards = 1;|' lld/*/SyntheticSections.* + sed -i 's|numShards = 256;|numShards = 1;|' lld/*/ICF.cpp + sed -i 's|__FILE__|"__FILE__"|' \ + libcxx/src/verbose_abort.cpp \ + libcxxabi/src/abort_message.cpp \ + compiler-rt/lib/builtins/int_util.h + sed -i 's|"@LLVM_SRC_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in + sed -i 's|"@LLVM_OBJ_ROOT@"|"REDACTED"|' \ + llvm/tools/llvm-config/BuildVariables.inc.in + # figure out includes: + EXTRA_INCL="$(pwd)/extra_includes" + mkdir -p $EXTRA_INCL + cp clang/lib/Headers/*intrin*.h $EXTRA_INCL/ + cp clang/lib/Headers/mm_malloc.h $EXTRA_INCL/ + [ -e $EXTRA_INCL/immintrin.h ] + # configure: + export LD_LIBRARY_PATH="${musl}/lib:${intermediate-clang}/lib" + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$(pwd)/build/lib" # libLLVM + OPTS="" + add_opt() { + OPTS="$OPTS -D$1" + } + add_opt CMAKE_BUILD_TYPE=Release + add_opt LLVM_OPTIMIZED_TABLEGEN=YES + add_opt LLVM_CCACHE_BUILD=$USE_CCACHE + add_opt DEFAULT_SYSROOT=$SYSROOT + add_opt CMAKE_INSTALL_PREFIX=$out + add_opt LLVM_INSTALL_BINUTILS_SYMLINKS=YES + add_opt LLVM_INSTALL_CCTOOLS_SYMLINKS=YES + add_opt CMAKE_INSTALL_DO_STRIP=YES + add_opt LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=YES + add_opt LLVM_TARGET_ARCH=X86 + add_opt LLVM_TARGETS_TO_BUILD=Native + add_opt LLVM_BUILTIN_TARGETS=x86_64-unknown-linux-musl + add_opt LLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl + add_opt LLVM_HOST_TRIPLE=x86_64-unknown-linux-musl + add_opt COMPILER_RT_DEFAULT_TARGET_TRIPLE=x86_64-unknown-linux-musl + add_opt LLVM_APPEND_VC_REV=NO + add_opt LLVM_INCLUDE_TESTS=NO + add_opt LLVM_INCLUDE_EXAMPLES=NO + add_opt LLVM_INCLUDE_BENCHMARKS=NO + add_opt LLVM_ENABLE_BACKTRACES=NO + add_opt LLVM_ENABLE_EH=YES + add_opt LLVM_ENABLE_RTTI=YES + add_opt CLANG_ENABLE_ARCMT=NO + add_opt CLANG_ENABLE_STATIC_ANALYZER=NO + add_opt COMPILER_RT_BUILD_SANITIZERS=NO + add_opt COMPILER_RT_BUILD_XRAY=NO + add_opt COMPILER_RT_BUILD_LIBFUZZER=NO + add_opt COMPILER_RT_BUILD_PROFILE=NO + add_opt COMPILER_RT_BUILD_MEMPROF=NO + add_opt COMPILER_RT_BUILD_ORC=NO + add_opt COMPILER_RT_USE_BUILTINS_LIBRARY=YES + add_opt CLANG_DEFAULT_CXX_STDLIB=libc++ + add_opt CLANG_DEFAULT_LINKER=lld + add_opt CLANG_DEFAULT_RTLIB=compiler-rt + add_opt LIBCXX_HAS_MUSL_LIBC=YES + add_opt LIBCXX_USE_COMPILER_RT=YES + add_opt LIBCXX_INCLUDE_BENCHMARKS=NO + add_opt LIBCXX_CXX_ABI=libcxxabi + add_opt LIBCXX_ADDITIONAL_COMPILE_FLAGS=-I${linux-headers}/include + add_opt LIBCXXABI_USE_COMPILER_RT=YES + add_opt LIBCXXABI_USE_LLVM_UNWINDER=YES + add_opt LLVM_INSTALL_TOOLCHAIN_ONLY=YES + add_opt LIBUNWIND_USE_COMPILER_RT=YES + add_opt LLVM_ENABLE_THREADS=NO + REWRITE="-ffile-prefix-map=$(pwd)=/builddir/" + CFLAGS="--sysroot=$SYSROOT -I$EXTRA_INCL $REWRITE" + LDFLAGS="-Wl,--dynamic-linker=$LOADER" + cmake -S llvm -B build -G 'Unix Makefiles' \ + -DCMAKE_ASM_COMPILER=${intermediate-clang}/bin/clang \ + -DCMAKE_C_COMPILER=${intermediate-clang}/bin/clang \ + -DCMAKE_CXX_COMPILER=${intermediate-clang}/bin/clang++ \ + -DLLVM_ENABLE_PROJECTS='clang;lld' \ + -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \ + -DCMAKE_C_FLAGS="$CFLAGS" \ + -DCMAKE_CXX_FLAGS="$CFLAGS" \ + -DCMAKE_C_LINK_FLAGS="$LDFLAGS" \ + -DCMAKE_CXX_LINK_FLAGS="$LDFLAGS" \ + -DLLVM_BUILD_LLVM_DYLIB=YES \ + -DLLVM_LINK_LLVM_DYLIB=YES \ + -DCLANG_LINK_LLVM_DYLIB=YES \ + $OPTS + # build: + make -C build -j $NPROC + # install: + make -C build install/strip + ln -s $out/lib/x86_64-unknown-linux-musl/* $out/lib/ + mkdir -p $out/bin + ln -s $out/bin/clang $out/bin/cc + ln -s $out/bin/clang++ $out/bin/c++ + ln -s $out/bin/clang-cpp $out/bin/cpp + ln -s $out/bin/lld $out/bin/ld + # mix new stuff into sysroot: + ln -s $out/lib/* $out/sysroot/lib/ + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + extra.allowedRequisites = [ "out" musl ]; + extra.allowedReferences = [ "out" musl ]; + } diff --git a/06/using-nix/2b2-busybox.nix b/06/using-nix/2b2-busybox.nix new file mode 100644 index 0000000..78dc2b1 --- /dev/null +++ b/06/using-nix/2b2-busybox.nix @@ -0,0 +1,52 @@ +{ fetchurl, mkDerivationStage2 +, stage1, static-gnumake, musl, clang, linux-headers }: + +let + source-tarball-busybox = fetchurl { + # local = /downloads/busybox-1.36.1.tar.bz2; + url = "https://busybox.net/downloads/busybox-1.36.1.tar.bz2"; + sha256 = "b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314"; + }; +in + mkDerivationStage2 { + name = "bootstrap-2b2-busybox"; + buildInputPaths = [ + "${stage1.protobusybox}/bin" + "${static-gnumake}/bin" + "${clang}/bin" + ]; + script = '' + mkdir build-dir; cd build-dir + # alias ash to sh: + mkdir aliases; ln -s ${stage1.protobusybox}/bin/ash aliases/sh + export PATH="$(pwd)/aliases:$PATH" + # unpack: + unpack ${source-tarball-busybox} + # fixup: + echo -e '#!${stage1.protobusybox}/bin/ash\nprintf 9999' \ + > scripts/gcc-version.sh + sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|g' \ + scripts/gen_build_files.sh \ + scripts/mkconfigs scripts/embedded_scripts scripts/trylink \ + scripts/generate_BUFSIZ.sh \ + applets/usage_compressed applets/busybox.mkscripts applets/install.sh + # configure: + echo "### $0: configuring busybox..." + BUSYBOX_FLAGS='CONFIG_SHELL=${stage1.protobusybox}/bin/ash' + BUSYBOX_FLAGS="$BUSYBOX_FLAGS CC=cc HOSTCC=cc" + BUSYBOX_FLAGS="$BUSYBOX_FLAGS KCONFIG_NOTIMESTAMP=y" + BUSYBOX_CFLAGS="CFLAGS=-I${linux-headers}/include" + make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" defconfig + sed -i 's|CONFIG_INSTALL_NO_USR=y|CONFIG_INSTALL_NO_USR=n|' .config + # build: + make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" busybox busybox.links + sed -i 's|^/usr/s\?bin/|/bin/|' busybox.links + # install: + make -j $NPROC $BUSYBOX_FLAGS "$BUSYBOX_CFLAGS" \ + install CONFIG_PREFIX=$out + # check for build path leaks: + ( ! grep -rF $(pwd) $out ) + ''; + extra.allowedRequisites = [ "out" musl clang ]; + extra.allowedReferences = [ "out" musl clang ]; + } diff --git a/06/verify.nix b/06/verify.nix new file mode 100644 index 0000000..177e6ed --- /dev/null +++ b/06/verify.nix @@ -0,0 +1,16 @@ +amhpqf61g19sw80gcxkx9i385b497hzh stage1^tinycc +r5jb6ydqlphvh33kqynvnxbqqrsy9vlm stage1^protobusybox +45fx2ls8ikc8whr03plslhjir844f7ax stage1^protomusl +xapj0c7basdkkacrng50ayxy9xbklaj2 static-gnumake +xc3db7c3rpfqpp11y2ms4v5cgkq7dzyj static-binutils +x58bd1awpbmd2iaxwcmb269anvhb9bbm static-gnugcc4-c +mhbvszfvvryvnd46xawvsbd0bnbpmw9v intermediate-musl +ghh0kin5896hc5wqcll4s0axgn540jgy gnugcc4-cpp +6vnz5a78ahy1762s5wbvaq3jifsnf18f gnugcc10 +wgg3p19hv7ji265gcm6mclrlqxays1v0 linux-headers +mdavw6g21ysjrp9wxidl9vpbfy2hqqdj cmake +3ivma9103vx1192kqkw6vvbcg161gvz1 python +z3qlri49m9v9zhf1f5pyfbm5jdbk9wiz intermediate-clang +5hasqad9ih2fmn6ma9vww2jdjqjgzvxs musl +cr1bxa6hjz1baygh7kdwmhgxvypqcvag clang +2f7xfn3x1bgpy1wdrnn48z3c1bagwggh busybox diff --git a/06/verify.pkgs.sha256 b/06/verify.pkgs.sha256 new file mode 100644 index 0000000..1a623c7 --- /dev/null +++ b/06/verify.pkgs.sha256 @@ -0,0 +1,32 @@ +da4da9d48bb65e68a8095efb3f439e5b92bddd360e60578219932f813eb05ec1 pkgs/0-tcc-seed.tar +8347995cd00d16f1564d19ed045aaf9c7c500c417574d28dde7c2254a089d36a pkgs/1-stage1.tar +c825a49166b6a382002136d0cd3510477c2e50b55172af6679db2090debdf520 pkgs/2a0-static-gnumake.tar +ac3ca80644a351c75c5ac7bb03c0c8d6b33fdb677e11663fef247c670d81edc4 pkgs/2a1-static-binutils.tar +86915ff0e41e21086a71a89729bb75cb3ddf6e32f7a06f3ea1fb66e4c8cada33 pkgs/2a2-static-gnugcc4-c.tar +bf7d15658210e0fa8a8d1b5ea44c16af1b8a5d5223475812e4a395542440b98d pkgs/2a3-intermediate-musl.tar +2d9759bcba6170d9cf8a750df3db94746d7e778f3414a72aaaa570508219ebf3 pkgs/2a4-gnugcc4-cpp.tar +b2028c82e05dc8858f2c5ccb7b93eae169f9f397ef4b6fe755ad3f1e6c4c857d pkgs/2a5-gnugcc10.tar +d5703b484fe95c7c8a617f29329cc87c0ad852a8ff2597e167c6766e0ce5980a pkgs/2a6-linux-headers.tar +969031fdf9f7df5c5039e5d04b5a9cc76928f3558097e40555157a13e08ee6c0 pkgs/2a7-cmake.tar +a4b89542ef2ae8af348df98c7bbb8aafa1692dec65a46e1e58be5b47b819a749 pkgs/2a8-python.tar +236f41af85e539484f4845a5cf8cb751f5a957bae2b4a1ff13c35bacbbcd8276 pkgs/2a9-intermediate-clang.tar +89e7aa57ab169b4ce6498294b67926d0d09a9cf7f6d108d958f0d207c546930e pkgs/2b0-musl.tar +f804d4d19a1437eda38dfc532407f21524a99897906f0df9b51a2bf2d1b192d4 pkgs/2b1-clang.tar +15b9751b6f102007243250d95a58e686c8d1564d92d1c5708be2b657019453a9 pkgs/2b2-busybox.tar +c9c5a533f70c10dc659e79638d24b00a35aac51d875b85fec21a8f0da6507217 pkgs/2b3-gnumake.tar +2f05779ae73ef59950b1ded356da891a9a5e0d02f153567d9e85fa1cb926966b pkgs/3a-boost.tar +1fbde76654b4879687a02435470afbc248e7d4f6717f01432ed9cf7205161287 pkgs/3a-brotli.tar +60e4454d2e9b7d127af0e4e1967cc4eccdd386480c2e9eae32f1c5ee7e7d442d pkgs/3a-curl.tar +0e19d7d952ff9a4a3971a804e20463e422ec9a5de54438deda69065d7e67bf79 pkgs/3a-editline.tar +442bde8dafed0d7b5571394e13a4f8bbf1d4e0dffa41306d19e73e8e32854820 pkgs/3a-gnugperf.tar +04eeff2024984df8204dd8718bf4db00c1223a6d9d4dc08591be13594127a293 pkgs/3a-libarchive.tar +0fa4c6c75e2974a4a6b8cb61ebc419130ac866f0da4539412fb2bc1e6252be58 pkgs/3a-libsodium.tar +6f1be37aa2fa121e90ccb49308634165f96e2eb03d841f563245bae7736c83d7 pkgs/3a-lowdown.tar +3d7282686a98e6a5e2b3655ae02c1aae1dc1d3c20ac53fadef90cd8408a4eed7 pkgs/3a-mbedtls.tar +3e3796d38d685334cc6d88c79e573257b8ce834308a793571f45e4d657330f3f pkgs/3a-nlohmann-json.tar +47e7dbb47b13f0348e0403ea6ac70c45e4ddb1536f3e05ef2b777c8b7fc8b027 pkgs/3a-pkg-config.tar +fb353622c346831fdea82d74801e27bcda482ad72221d9be51a5372fc1234daf pkgs/3a-seccomp.tar +73e2efe1845ca550762ddcce2103164839c02ed6777356af833c594a2a1e1d76 pkgs/3a-sqlite.tar +846525ebdfb81858963530cae2977b7fcb29381112119059690e7f916ce8c397 pkgs/3b-busybox-static.tar +8df17ee6e1e7f19f7118d17cd9ff7f25dbc4b05b9f9bbab9b78f40e1b4667672 pkgs/3b-nix.tar +c9d0fb338b81db4184f84eb1f71687391edded2e937dec77ac9f353fa526e70d pkgs/3b-tinycc-static.tar diff --git a/BOOSTRAP.md b/BOOSTRAP.md new file mode 100644 index 0000000..00a7bf1 --- /dev/null +++ b/BOOSTRAP.md @@ -0,0 +1,241 @@ +# boostrapping a (Linux x86-64) C compiler + +Compilers nowadays are written in languages like C, which themselves need to be +compiled. But then, you need a C compiler to compile your C compiler! Of course, +the very first C compiler was not written in C. +First, people made assemblers, then simple programming languages, +then, eventually, it was possible to make a C compiler. +In this repository, we'll explore how that's done. Each directory here +is a "stage" in the process. The first one, `00`, is a hand-written +executable, and the last one, `05`, is a C compiler. Each directory has its own +README explaining what's going on. + +You can run `bootstrap.sh` to run through and test every stage. +To get HTML versions of all README pages, run `make`. + +Note that the executables produced in this series will only run on +64-bit Linux, because each OS/architecture combination would need its own separate +executable. + +## table of contents + +- [stage 00](00/README.md) - a program converting a text file with +hexadecimal digit pairs to a binary file. +- [stage 01](01/README.md) - a language with comments, and 2-character +command codes. +- [stage 02](02/README.md) - a language with labels +- [stage 03](03/README.md) - a language with longer labels, better error messages, and less register manipulation +- [stage 04](04/README.md) - a language with nice functions and local variables +- [stage 04a](04a/README.md) - (interlude) a simple preprocessor +- [stage 05](05/README.md) - a C compiler capable of compiling TCC +- [stage 06](06/README.md) - an interpreter capable of executing zig + +## prerequisite knowledge + +If you want to follow along with this series, you'll probably want to know about: + +- number bases -- if a number is preceded by 0x, 0o, or 0b in this series, that +means hexadecimal/octal/binary respectively. So 0xff = FF hexadecimal = 255 +decimal. +- bits, bytes, kilobytes, etc. +- bitwise operations (not, or, and, xor, left shift, right shift) +- 2's complement +- ASCII, null-terminated strings +- how pointers work +- how floating-point numbers work +- what a compiler is +- what an executable file is +- what a system call is +- what a CPU is +- what a CPU architecture is +- what a CPU register is +- what the (call) stack is + +If you're unfamiliar with x86-64 assembly, you should take a look at the instruction list below. + +## principles + +- as simple as possible + +Bootstrapping a compiler is not an easy task, so we're trying to make it as easy +as possible. We don't even necessarily need a standard-compliant C compiler, we +only need enough to compile someone else's C compiler. Specifically, we'll be +using [tcc](https://bellard.org/tcc/) since it's written (mostly) in C89. + +- efficiency is not a concern + +We will create big and slow executables, and that's okay. It doesn't really +matter if compiling TCC takes 30 as opposed to 0.01 seconds; once +we compile it with itself, we should get the same executable either way. + +## reflections on trusting trust + +In 1984, Ken Thompson wrote the well-known article +[Reflections on Trusting Trust](http://users.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf). +This is one of the inspirations for this project. A brief summary is: +it's possible to create a malicious C compiler which will +replicate its own malicious functionalities (e.g. detecting password-checking +routines to make them also accept another password the attacker knows) when used +to compile other C compilers. For all we know, such a compiler was used to +compile gcc, say, and so all programs around today could be compromised. Of +course, this is practically definitely not the case, but it's still an +interesting experiment to try to create a fully trustable compiler. This +project can't necessarily even do that though, because the Linux kernel, which +we depend on, is compiled from C, so we can't fully trust *it*. To +create a *fully* trustable compiler, you'd need to manually write +an operating system to a USB key with a circuit or something, +assuming you trust your CPU... +I'll leave that to someone else. + +## instruction set + +x86-64 has a *gigantic* instruction set. The manual for it is over 2,000 pages +long! To make things simpler, we will only use a small subset. + +Here are all the instructions we'll be using. If you're not familiar with +x86-64 assembly, you might want to look over these. + +x86-64 has 16 integer registers: rax, rbx, rcx, rdx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15. +We will almost entirely be using the first 8 of these. +al refers to the bottom 8 bits of rax, likewise with bl, cl, dl; +ax refers to the bottom 16 bits of rax, likewise with bx, cx, dx; +eax refers to the bottom 32 bits of rax, likewise with ebx, ecx, edx. + +x86-64 also has 16 floating-point registers: xmm0 through xmm15. We'll only be using +xmm0 and xmm1. These registers can hold either four 32-bit floating-point numbers (`float`s) or +two 64-bit floating-point numbers (`double`s), but we'll only be using them to hold either one +`float` or one `double`. + +In the table below, `IMM64` means a 64-bit *immediate* (a constant number). +`rdx:rax` refers to the 128-bit number you get by combining `rdx` and `rax`. + +``` +ax bx cx dx sp bp si di +0 3 1 2 4 5 6 7 + +┌──────────────────────┬───────────────────┬────────────────────────────────────────┐ +│ Instruction │ Encoding │ Description │ +├──────────────────────┼───────────────────┼────────────────────────────────────────┤ +│ mov rax, IMM64 │ 48 b8 IMM64 │ set rax to the 64-bit value IMM64 │ +│ mov rbx, IMM64 │ 48 bb IMM64 │ set rbx to the 64-bit value IMM64 │ +| add rax, IMM32 | 48 05 IMM32 | add IMM32 (signed) to rax | +│ xor eax, eax │ 31 c0 │ set rax to 0 (shorter than mov rax, 0) │ +│ xor edx, edx │ 31 d2 │ set rdx to 0 │ +│ mov RDEST, RSRC │ 48 89 (DEST|SRC<<3|0xc0) │ set register DEST to current │ +│ │ │ value of register SRC │ +│ mov r8, rax │ 49 89 c0 │ set r8 to rax (only used for syscalls) │ +│ mov r9, rax │ 49 89 c1 │ set r9 to rax (only used for syscalls) │ +│ mov r10, rax │ 49 89 c2 │ set r10 to rax (only used for syscalls)│ +| movsx rax, al | 48 0f be c0 | sign-extend al to rax | +| movsx rax, ax | 48 0f bf c0 | sign-extend ax to rax | +| movsx rax, eax | 48 63 c0 | sign-extend eax to rax | +| movzx rax, al | 48 0f b6 c0 | zero-extend al to rax | +| movzx rax, ax | 48 0f b7 c0 | zero-extend ax to rax | +| mov eax, eax | 89 c0 | zero-extend eax to rax | +│ xchg rax, rbx │ 48 93 │ exchange the values of rax and rbx │ +│ mov [rbx], rax │ 48 89 03 │ store rax as 8 bytes at address rbx │ +│ mov rax, [rbx] │ 48 8b 03 │ load 8 bytes from address rbx into rax │ +│ mov [rbx], eax │ 89 03 │ store eax as 4 bytes at address rbx │ +│ mov eax, [rbx] │ 8b 03 │ load 4 bytes from address rbx into eax │ +│ mov [rbx], ax │ 66 89 03 │ store ax as 2 bytes at address rbx │ +│ mov ax, [rbx] │ 66 8b 03 │ load 2 bytes from address rbx into eax │ +│ mov [rbx], al │ 88 03 │ store al as 1 byte at address rbx │ +│ mov al, [rbx] │ 8a 03 │ load 1 byte from address rbx into al │ +│ mov rax, [rbp+IMM32] │ 48 8b 85 IMM32 │ load 8 bytes from address rbp+IMM32 │ +│ │ │ into rax (note: IMM32 may be negative) │ +│ mov rax, [rsp+IMM32] │ 48 8b 84 24 IMM32 │ load 8 bytes from rsp+IMM32 into rax │ +│ mov [rbp+IMM32], rax │ 48 89 85 IMM32 │ store rax in 8 bytes at rbp+IMM32 │ +│ mov [rsp+IMM32], rax │ 48 89 84 24 IMM32 │ store rax in 8 bytes at rsp+IMM32 │ +│ mov [rsp], rbp │ 48 89 2c 24 │ store rbp in 8 bytes at rsp │ +│ mov rbp, [rsp] │ 48 8b 2c 24 │ load 8 bytes from rsp into rbp │ +│ lea rax, [rbp+IMM32] │ 48 8d 85 IMM32 │ set rax to rbp+IMM32 │ +│ lea rsp, [rbp+IMM32] │ 48 8d a5 IMM32 │ set rsp to rbp+IMM32 │ +| int3 | cc | raise trap signal -useful for debugging| +| movsq | 48 a5 | copy 8 bytes from rsi to rdi | +| rep movsb | f3 a4 | copy rcx bytes from rsi to rdi | +│ push rax │ 50 │ push rax onto the stack │ +│ pop rax │ 58 │ pop a value off the stack into rax │ +│ neg rax │ 48 f7 d8 │ set rax to -rax │ +│ add rax, rbx │ 48 01 d8 │ add rbx to rax │ +│ sub rax, rbx │ 48 29 d8 │ subtract rbx from rax │ +│ imul rbx │ 48 f7 eb │ set rdx:rax to rax * rbx (signed) │ +│ cqo │ 48 99 │ sign-extend rax to rdx:rax | +│ idiv rbx │ 48 f7 fb │ divide rdx:rax by rbx (signed); put │ +│ │ │ quotient in rax, remainder in rdx │ +│ mul rbx │ 48 f7 e3 │ like imul, but unsigned │ +│ div rbx │ 48 f7 f3 │ like idiv, but unsigned │ +│ not rax │ 48 f7 d0 │ set rax to ~rax (bitwise not) │ +│ and rax, rbx │ 48 21 d8 │ set rax to rax & rbx (bitwise and) │ +│ or rax, rbx │ 48 09 d8 │ set rax to rax | rbx (bitwise or) │ +│ xor rax, rbx │ 48 31 d8 │ set rax to rax ^ rbx (bitwise xor) │ +│ shl rax, cl │ 48 d3 e0 │ set rax to rax << cl (left shift) │ +│ shl rax, IMM8 │ 48 c1 e0 IMM8 │ set rax to rax << IMM8 │ +│ shr rax, cl │ 48 d3 e8 │ set rax to rax >> cl (unsigned) │ +│ shr rax, IMM8 │ 48 c1 e8 IMM8 │ set rax to rax >> IMM8 (unsigned) │ +│ sar rax, cl │ 48 d3 f8 │ set rax to rax >> cl (signed) │ +│ sar rax, IMM8 │ 48 c1 f8 IMM8 │ set rax to rax >> IMM8 (signed) │ +│ sub rsp, IMM32 │ 48 81 ec IMM32 │ subtract IMM32 from rsp │ +│ add rsp, IMM32 │ 48 81 c4 IMM32 │ add IMM32 to rsp │ +│ cmp rax, rbx │ 48 39 d8 │ compare rax with rbx (see je, jl, etc.)│ +│ test rax, rax │ 48 85 c0 │ equivalent to cmp rax, 0 │ +│ jmp IMM32 │ e9 IMM32 │ jump to offset IMM32 from here │ +│ je IMM32 │ 0f 84 IMM32 │ jump to IMM32 if equal │ +│ jne IMM32 │ 0f 85 IMM32 │ jump if not equal │ +│ jl IMM32 │ 0f 8c IMM32 │ jump if less than │ +│ jg IMM32 │ 0f 8f IMM32 │ jump if greater than │ +│ jle IMM32 │ 0f 8e IMM32 │ jump if less than or equal to │ +│ jge IMM32 │ 0f 8d IMM32 │ jump if greater than or equal to │ +│ jb IMM32 │ 0f 82 IMM32 │ jump if "below" (like jl but unsigned) │ +│ ja IMM32 │ 0f 87 IMM32 │ jump if "above" (like jg but unsigned) │ +│ jbe IMM32 │ 0f 86 IMM32 │ jump if below or equal to │ +│ jae IMM32 │ 0f 83 IMM32 │ jump if above or equal to │ +│ sete al │ 0f 94 c0 │ set al to 1 if equal; 0 otherwise │ +│ setne al │ 0f 95 c0 │ set al to 1 if not equal │ +│ setl al │ 0f 9c c0 │ set al to 1 if less than │ +│ setg al │ 0f 9f c0 │ set al to 1 if greater than │ +│ setle al │ 0f 9e c0 │ set al to 1 if less than or equal to │ +│ setge al │ 0f 9d c0 │ set al to 1 if greater than or equal to│ +│ setb al │ 0f 92 c0 │ set al to 1 if below │ +│ seta al │ 0f 97 c0 │ set al to 1 if above │ +│ setbe al │ 0f 96 c0 │ set al to 1 if below or equal to │ +│ setae al │ 0f 93 c0 │ set al to 1 if above or equal to │ +| movq rax, xmm0 | 66 48 0f 7e c0 | set rax to xmm0 | +| movq xmm0, rax | 66 48 0f 6e c0 | set xmm0 to rax | +| movq xmm1, rax | 66 48 0f 6e c8 | set xmm1 to rax | +| movq xmm1, xmm0 | f3 0f 7e c8 | set xmm1 to xmm0 | +| cvtss2sd xmm0, xmm0 | f3 0f 5a c0 | convert xmm0 from float to double | +| cvtsd2ss xmm0, xmm0 | f2 0f 5a c0 | convert xmm0 from double to float | +| cvttsd2si rax, xmm0 | f2 48 0f 2c c0 | convert double in xmm0 to int in rax | +| cvtsi2sd xmm0, rax | f2 48 0f 2a c0 | convert int in rax to double in xmm0 | +| comisd xmm0, xmm1 | 66 0f 2f c1 | compare xmm0 and xmm1 | +| addsd xmm0, xmm1 | f2 0f 58 c1 | add xmm1 to xmm0 | +| subsd xmm0, xmm1 | f2 0f 5c c1 | subtract xmm1 from xmm0 | +| mulsd xmm0, xmm1 | f2 0f 59 c1 | multiply xmm0 by xmm1 | +| divsd xmm0, xmm1 | f2 0f 5e c1 | divide xmm0 by xmm1 | +│ call rax │ ff d0 │ call the function at address rax │ +│ ret │ c3 │ return from function │ +│ syscall │ 0f 05 │ execute a system call │ +│ nop │ 90 │ do nothing │ +└──────────────────────┴───────────────────┴────────────────────────────────────────┘ + +SYSCALLS +Arguments are passed in + rdi, rsi, rdx, r10, r8, r9 +The return value is placed in rax. +The values of rsp, rbp and rbx are preserved, but other registers might change. +``` + +## license + +This does not apply to tcc's or musl's source code. + +``` +This project is in the public domain. Any copyright protections from any law +are forfeited by the author(s). No warranty is provided, and the author(s) +shall not be held liable in connection with it. +``` + +## contributing + +If you notice a mistake/want to clarify something, you can submit a pull request +via GitHub, or email `pommicket at pommicket.com`. diff --git a/README.md b/README.md index 00a7bf1..6f63bff 100644 --- a/README.md +++ b/README.md @@ -1,241 +1,5 @@ -# boostrapping a (Linux x86-64) C compiler +## Documentation -Compilers nowadays are written in languages like C, which themselves need to be -compiled. But then, you need a C compiler to compile your C compiler! Of course, -the very first C compiler was not written in C. -First, people made assemblers, then simple programming languages, -then, eventually, it was possible to make a C compiler. -In this repository, we'll explore how that's done. Each directory here -is a "stage" in the process. The first one, `00`, is a hand-written -executable, and the last one, `05`, is a C compiler. Each directory has its own -README explaining what's going on. +- [TinyCC Boostrap (stages 1-5)](./BOOSTRAP.md) +- [TinyCC -> Clang (stage 6)](./06/README.md) -You can run `bootstrap.sh` to run through and test every stage. -To get HTML versions of all README pages, run `make`. - -Note that the executables produced in this series will only run on -64-bit Linux, because each OS/architecture combination would need its own separate -executable. - -## table of contents - -- [stage 00](00/README.md) - a program converting a text file with -hexadecimal digit pairs to a binary file. -- [stage 01](01/README.md) - a language with comments, and 2-character -command codes. -- [stage 02](02/README.md) - a language with labels -- [stage 03](03/README.md) - a language with longer labels, better error messages, and less register manipulation -- [stage 04](04/README.md) - a language with nice functions and local variables -- [stage 04a](04a/README.md) - (interlude) a simple preprocessor -- [stage 05](05/README.md) - a C compiler capable of compiling TCC -- [stage 06](06/README.md) - an interpreter capable of executing zig - -## prerequisite knowledge - -If you want to follow along with this series, you'll probably want to know about: - -- number bases -- if a number is preceded by 0x, 0o, or 0b in this series, that -means hexadecimal/octal/binary respectively. So 0xff = FF hexadecimal = 255 -decimal. -- bits, bytes, kilobytes, etc. -- bitwise operations (not, or, and, xor, left shift, right shift) -- 2's complement -- ASCII, null-terminated strings -- how pointers work -- how floating-point numbers work -- what a compiler is -- what an executable file is -- what a system call is -- what a CPU is -- what a CPU architecture is -- what a CPU register is -- what the (call) stack is - -If you're unfamiliar with x86-64 assembly, you should take a look at the instruction list below. - -## principles - -- as simple as possible - -Bootstrapping a compiler is not an easy task, so we're trying to make it as easy -as possible. We don't even necessarily need a standard-compliant C compiler, we -only need enough to compile someone else's C compiler. Specifically, we'll be -using [tcc](https://bellard.org/tcc/) since it's written (mostly) in C89. - -- efficiency is not a concern - -We will create big and slow executables, and that's okay. It doesn't really -matter if compiling TCC takes 30 as opposed to 0.01 seconds; once -we compile it with itself, we should get the same executable either way. - -## reflections on trusting trust - -In 1984, Ken Thompson wrote the well-known article -[Reflections on Trusting Trust](http://users.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf). -This is one of the inspirations for this project. A brief summary is: -it's possible to create a malicious C compiler which will -replicate its own malicious functionalities (e.g. detecting password-checking -routines to make them also accept another password the attacker knows) when used -to compile other C compilers. For all we know, such a compiler was used to -compile gcc, say, and so all programs around today could be compromised. Of -course, this is practically definitely not the case, but it's still an -interesting experiment to try to create a fully trustable compiler. This -project can't necessarily even do that though, because the Linux kernel, which -we depend on, is compiled from C, so we can't fully trust *it*. To -create a *fully* trustable compiler, you'd need to manually write -an operating system to a USB key with a circuit or something, -assuming you trust your CPU... -I'll leave that to someone else. - -## instruction set - -x86-64 has a *gigantic* instruction set. The manual for it is over 2,000 pages -long! To make things simpler, we will only use a small subset. - -Here are all the instructions we'll be using. If you're not familiar with -x86-64 assembly, you might want to look over these. - -x86-64 has 16 integer registers: rax, rbx, rcx, rdx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15. -We will almost entirely be using the first 8 of these. -al refers to the bottom 8 bits of rax, likewise with bl, cl, dl; -ax refers to the bottom 16 bits of rax, likewise with bx, cx, dx; -eax refers to the bottom 32 bits of rax, likewise with ebx, ecx, edx. - -x86-64 also has 16 floating-point registers: xmm0 through xmm15. We'll only be using -xmm0 and xmm1. These registers can hold either four 32-bit floating-point numbers (`float`s) or -two 64-bit floating-point numbers (`double`s), but we'll only be using them to hold either one -`float` or one `double`. - -In the table below, `IMM64` means a 64-bit *immediate* (a constant number). -`rdx:rax` refers to the 128-bit number you get by combining `rdx` and `rax`. - -``` -ax bx cx dx sp bp si di -0 3 1 2 4 5 6 7 - -┌──────────────────────┬───────────────────┬────────────────────────────────────────┐ -│ Instruction │ Encoding │ Description │ -├──────────────────────┼───────────────────┼────────────────────────────────────────┤ -│ mov rax, IMM64 │ 48 b8 IMM64 │ set rax to the 64-bit value IMM64 │ -│ mov rbx, IMM64 │ 48 bb IMM64 │ set rbx to the 64-bit value IMM64 │ -| add rax, IMM32 | 48 05 IMM32 | add IMM32 (signed) to rax | -│ xor eax, eax │ 31 c0 │ set rax to 0 (shorter than mov rax, 0) │ -│ xor edx, edx │ 31 d2 │ set rdx to 0 │ -│ mov RDEST, RSRC │ 48 89 (DEST|SRC<<3|0xc0) │ set register DEST to current │ -│ │ │ value of register SRC │ -│ mov r8, rax │ 49 89 c0 │ set r8 to rax (only used for syscalls) │ -│ mov r9, rax │ 49 89 c1 │ set r9 to rax (only used for syscalls) │ -│ mov r10, rax │ 49 89 c2 │ set r10 to rax (only used for syscalls)│ -| movsx rax, al | 48 0f be c0 | sign-extend al to rax | -| movsx rax, ax | 48 0f bf c0 | sign-extend ax to rax | -| movsx rax, eax | 48 63 c0 | sign-extend eax to rax | -| movzx rax, al | 48 0f b6 c0 | zero-extend al to rax | -| movzx rax, ax | 48 0f b7 c0 | zero-extend ax to rax | -| mov eax, eax | 89 c0 | zero-extend eax to rax | -│ xchg rax, rbx │ 48 93 │ exchange the values of rax and rbx │ -│ mov [rbx], rax │ 48 89 03 │ store rax as 8 bytes at address rbx │ -│ mov rax, [rbx] │ 48 8b 03 │ load 8 bytes from address rbx into rax │ -│ mov [rbx], eax │ 89 03 │ store eax as 4 bytes at address rbx │ -│ mov eax, [rbx] │ 8b 03 │ load 4 bytes from address rbx into eax │ -│ mov [rbx], ax │ 66 89 03 │ store ax as 2 bytes at address rbx │ -│ mov ax, [rbx] │ 66 8b 03 │ load 2 bytes from address rbx into eax │ -│ mov [rbx], al │ 88 03 │ store al as 1 byte at address rbx │ -│ mov al, [rbx] │ 8a 03 │ load 1 byte from address rbx into al │ -│ mov rax, [rbp+IMM32] │ 48 8b 85 IMM32 │ load 8 bytes from address rbp+IMM32 │ -│ │ │ into rax (note: IMM32 may be negative) │ -│ mov rax, [rsp+IMM32] │ 48 8b 84 24 IMM32 │ load 8 bytes from rsp+IMM32 into rax │ -│ mov [rbp+IMM32], rax │ 48 89 85 IMM32 │ store rax in 8 bytes at rbp+IMM32 │ -│ mov [rsp+IMM32], rax │ 48 89 84 24 IMM32 │ store rax in 8 bytes at rsp+IMM32 │ -│ mov [rsp], rbp │ 48 89 2c 24 │ store rbp in 8 bytes at rsp │ -│ mov rbp, [rsp] │ 48 8b 2c 24 │ load 8 bytes from rsp into rbp │ -│ lea rax, [rbp+IMM32] │ 48 8d 85 IMM32 │ set rax to rbp+IMM32 │ -│ lea rsp, [rbp+IMM32] │ 48 8d a5 IMM32 │ set rsp to rbp+IMM32 │ -| int3 | cc | raise trap signal -useful for debugging| -| movsq | 48 a5 | copy 8 bytes from rsi to rdi | -| rep movsb | f3 a4 | copy rcx bytes from rsi to rdi | -│ push rax │ 50 │ push rax onto the stack │ -│ pop rax │ 58 │ pop a value off the stack into rax │ -│ neg rax │ 48 f7 d8 │ set rax to -rax │ -│ add rax, rbx │ 48 01 d8 │ add rbx to rax │ -│ sub rax, rbx │ 48 29 d8 │ subtract rbx from rax │ -│ imul rbx │ 48 f7 eb │ set rdx:rax to rax * rbx (signed) │ -│ cqo │ 48 99 │ sign-extend rax to rdx:rax | -│ idiv rbx │ 48 f7 fb │ divide rdx:rax by rbx (signed); put │ -│ │ │ quotient in rax, remainder in rdx │ -│ mul rbx │ 48 f7 e3 │ like imul, but unsigned │ -│ div rbx │ 48 f7 f3 │ like idiv, but unsigned │ -│ not rax │ 48 f7 d0 │ set rax to ~rax (bitwise not) │ -│ and rax, rbx │ 48 21 d8 │ set rax to rax & rbx (bitwise and) │ -│ or rax, rbx │ 48 09 d8 │ set rax to rax | rbx (bitwise or) │ -│ xor rax, rbx │ 48 31 d8 │ set rax to rax ^ rbx (bitwise xor) │ -│ shl rax, cl │ 48 d3 e0 │ set rax to rax << cl (left shift) │ -│ shl rax, IMM8 │ 48 c1 e0 IMM8 │ set rax to rax << IMM8 │ -│ shr rax, cl │ 48 d3 e8 │ set rax to rax >> cl (unsigned) │ -│ shr rax, IMM8 │ 48 c1 e8 IMM8 │ set rax to rax >> IMM8 (unsigned) │ -│ sar rax, cl │ 48 d3 f8 │ set rax to rax >> cl (signed) │ -│ sar rax, IMM8 │ 48 c1 f8 IMM8 │ set rax to rax >> IMM8 (signed) │ -│ sub rsp, IMM32 │ 48 81 ec IMM32 │ subtract IMM32 from rsp │ -│ add rsp, IMM32 │ 48 81 c4 IMM32 │ add IMM32 to rsp │ -│ cmp rax, rbx │ 48 39 d8 │ compare rax with rbx (see je, jl, etc.)│ -│ test rax, rax │ 48 85 c0 │ equivalent to cmp rax, 0 │ -│ jmp IMM32 │ e9 IMM32 │ jump to offset IMM32 from here │ -│ je IMM32 │ 0f 84 IMM32 │ jump to IMM32 if equal │ -│ jne IMM32 │ 0f 85 IMM32 │ jump if not equal │ -│ jl IMM32 │ 0f 8c IMM32 │ jump if less than │ -│ jg IMM32 │ 0f 8f IMM32 │ jump if greater than │ -│ jle IMM32 │ 0f 8e IMM32 │ jump if less than or equal to │ -│ jge IMM32 │ 0f 8d IMM32 │ jump if greater than or equal to │ -│ jb IMM32 │ 0f 82 IMM32 │ jump if "below" (like jl but unsigned) │ -│ ja IMM32 │ 0f 87 IMM32 │ jump if "above" (like jg but unsigned) │ -│ jbe IMM32 │ 0f 86 IMM32 │ jump if below or equal to │ -│ jae IMM32 │ 0f 83 IMM32 │ jump if above or equal to │ -│ sete al │ 0f 94 c0 │ set al to 1 if equal; 0 otherwise │ -│ setne al │ 0f 95 c0 │ set al to 1 if not equal │ -│ setl al │ 0f 9c c0 │ set al to 1 if less than │ -│ setg al │ 0f 9f c0 │ set al to 1 if greater than │ -│ setle al │ 0f 9e c0 │ set al to 1 if less than or equal to │ -│ setge al │ 0f 9d c0 │ set al to 1 if greater than or equal to│ -│ setb al │ 0f 92 c0 │ set al to 1 if below │ -│ seta al │ 0f 97 c0 │ set al to 1 if above │ -│ setbe al │ 0f 96 c0 │ set al to 1 if below or equal to │ -│ setae al │ 0f 93 c0 │ set al to 1 if above or equal to │ -| movq rax, xmm0 | 66 48 0f 7e c0 | set rax to xmm0 | -| movq xmm0, rax | 66 48 0f 6e c0 | set xmm0 to rax | -| movq xmm1, rax | 66 48 0f 6e c8 | set xmm1 to rax | -| movq xmm1, xmm0 | f3 0f 7e c8 | set xmm1 to xmm0 | -| cvtss2sd xmm0, xmm0 | f3 0f 5a c0 | convert xmm0 from float to double | -| cvtsd2ss xmm0, xmm0 | f2 0f 5a c0 | convert xmm0 from double to float | -| cvttsd2si rax, xmm0 | f2 48 0f 2c c0 | convert double in xmm0 to int in rax | -| cvtsi2sd xmm0, rax | f2 48 0f 2a c0 | convert int in rax to double in xmm0 | -| comisd xmm0, xmm1 | 66 0f 2f c1 | compare xmm0 and xmm1 | -| addsd xmm0, xmm1 | f2 0f 58 c1 | add xmm1 to xmm0 | -| subsd xmm0, xmm1 | f2 0f 5c c1 | subtract xmm1 from xmm0 | -| mulsd xmm0, xmm1 | f2 0f 59 c1 | multiply xmm0 by xmm1 | -| divsd xmm0, xmm1 | f2 0f 5e c1 | divide xmm0 by xmm1 | -│ call rax │ ff d0 │ call the function at address rax │ -│ ret │ c3 │ return from function │ -│ syscall │ 0f 05 │ execute a system call │ -│ nop │ 90 │ do nothing │ -└──────────────────────┴───────────────────┴────────────────────────────────────────┘ - -SYSCALLS -Arguments are passed in - rdi, rsi, rdx, r10, r8, r9 -The return value is placed in rax. -The values of rsp, rbp and rbx are preserved, but other registers might change. -``` - -## license - -This does not apply to tcc's or musl's source code. - -``` -This project is in the public domain. Any copyright protections from any law -are forfeited by the author(s). No warranty is provided, and the author(s) -shall not be held liable in connection with it. -``` - -## contributing - -If you notice a mistake/want to clarify something, you can submit a pull request -via GitHub, or email `pommicket at pommicket.com`.