From 52c96a7d887114351dd34075f6cfa48fd8b19fa2 Mon Sep 17 00:00:00 2001 From: bzt Date: Tue, 5 Jun 2018 20:34:03 +0200 Subject: [PATCH] Initial commit --- .gitignore | 7 + LICENSE | 21 + README.md | 390 +++++++ aarch64-rpi/Makefile | 27 + aarch64-rpi/README.md | 49 + aarch64-rpi/boot.S | 154 +++ aarch64-rpi/bootboot.c | 1574 ++++++++++++++++++++++++++ aarch64-rpi/font.psf | Bin 0 -> 2080 bytes aarch64-rpi/fs.h | 274 +++++ aarch64-rpi/link.ld | 36 + aarch64-rpi/mkboot.c | 112 ++ aarch64-rpi/raspbootcom.c | 379 +++++++ aarch64-rpi/tinf.h | 120 ++ aarch64-rpi/tinflate.c | 475 ++++++++ boot.bin | Bin 0 -> 512 bytes bootboot.bin | Bin 0 -> 8192 bytes bootboot.efi | Bin 0 -> 77348 bytes bootboot.h | 142 +++ bootboot.img | Bin 0 -> 26608 bytes bootboot.rom | Bin 0 -> 77824 bytes bootboot_spec_1st_ed.pdf | Bin 0 -> 199204 bytes mykernel/Makefile | 50 + mykernel/font.psf | Bin 0 -> 2080 bytes mykernel/kernel.c | 106 ++ mykernel/link.ld | 48 + mykernel/mykernel.aarch64.elf | Bin 0 -> 4336 bytes mykernel/mykernel.aarch64.txt | 42 + mykernel/mykernel.x86_64.elf | Bin 0 -> 4088 bytes mykernel/mykernel.x86_64.txt | 42 + mykernel/screenshot.png | Bin 0 -> 1258 bytes x86_64-bios/Makefile | 15 + x86_64-bios/README.md | 34 + x86_64-bios/boot.asm | 218 ++++ x86_64-bios/bootboot.asm | 1965 +++++++++++++++++++++++++++++++++ x86_64-bios/bootboot.inc | 121 ++ x86_64-bios/fs.inc | 502 +++++++++ x86_64-bios/initrd.asm | 62 ++ x86_64-bios/mkboot.c | 106 ++ x86_64-bios/tinf.inc | 500 +++++++++ x86_64-efi/Makefile | 35 + x86_64-efi/README.md | 35 + x86_64-efi/bootboot.c | 1076 ++++++++++++++++++ x86_64-efi/crt0-efi-x86_64.o | Bin 0 -> 1328 bytes x86_64-efi/efirom.c | 273 +++++ x86_64-efi/elf_x86_64_efi.lds | 74 ++ x86_64-efi/fs.h | 264 +++++ x86_64-efi/libefi.a | Bin 0 -> 659244 bytes x86_64-efi/libgnuefi.a | Bin 0 -> 18618 bytes x86_64-efi/tinf.h | 117 ++ x86_64-efi/tinflate.c | 475 ++++++++ 50 files changed, 9920 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 aarch64-rpi/Makefile create mode 100644 aarch64-rpi/README.md create mode 100644 aarch64-rpi/boot.S create mode 100644 aarch64-rpi/bootboot.c create mode 100644 aarch64-rpi/font.psf create mode 100644 aarch64-rpi/fs.h create mode 100644 aarch64-rpi/link.ld create mode 100644 aarch64-rpi/mkboot.c create mode 100644 aarch64-rpi/raspbootcom.c create mode 100644 aarch64-rpi/tinf.h create mode 100644 aarch64-rpi/tinflate.c create mode 100644 boot.bin create mode 100644 bootboot.bin create mode 100755 bootboot.efi create mode 100644 bootboot.h create mode 100755 bootboot.img create mode 100644 bootboot.rom create mode 100644 bootboot_spec_1st_ed.pdf create mode 100644 mykernel/Makefile create mode 100644 mykernel/font.psf create mode 100644 mykernel/kernel.c create mode 100644 mykernel/link.ld create mode 100755 mykernel/mykernel.aarch64.elf create mode 100644 mykernel/mykernel.aarch64.txt create mode 100755 mykernel/mykernel.x86_64.elf create mode 100644 mykernel/mykernel.x86_64.txt create mode 100644 mykernel/screenshot.png create mode 100644 x86_64-bios/Makefile create mode 100644 x86_64-bios/README.md create mode 100644 x86_64-bios/boot.asm create mode 100644 x86_64-bios/bootboot.asm create mode 100644 x86_64-bios/bootboot.inc create mode 100644 x86_64-bios/fs.inc create mode 100644 x86_64-bios/initrd.asm create mode 100644 x86_64-bios/mkboot.c create mode 100644 x86_64-bios/tinf.inc create mode 100644 x86_64-efi/Makefile create mode 100644 x86_64-efi/README.md create mode 100644 x86_64-efi/bootboot.c create mode 100644 x86_64-efi/crt0-efi-x86_64.o create mode 100644 x86_64-efi/efirom.c create mode 100644 x86_64-efi/elf_x86_64_efi.lds create mode 100644 x86_64-efi/fs.h create mode 100644 x86_64-efi/libefi.a create mode 100644 x86_64-efi/libgnuefi.a create mode 100644 x86_64-efi/tinf.h create mode 100644 x86_64-efi/tinflate.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..402798b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# Debug files +*.dSYM/ +*.su +aarch64-rpi/LIC* +aarch64-rpi/*.bin +aarch64-rpi/*.dat +aarch64-rpi/*.elf diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ac146d8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + Copyright (C) 2017 bzt (bztsrc@gitlab) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..41cc836 --- /dev/null +++ b/README.md @@ -0,0 +1,390 @@ +BOOTBOOT Reference Implementations +================================== + +I provide pre-compiled images ready for use. + +1. *x86_64-efi* the preferred way of booting on x86_64 architecture. + Standard GNU toolchain and a few files from gnuefi (included). + [bootboot.efi](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.efi?raw=true) (76k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.rom?raw=true) (76k) + +2. *x86_64-bios* BIOS and Multiboot (GRUB) compatible, OBSOLETE loader. + If you want to recompile this, you'll need fasm (not included). + [boot.bin](https://gitlab.com/bztsrc/bootboot/blob/master/boot.bin?raw=true) (512 bytes, works as MBR and VBR too), [bootboot.bin](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.bin?raw=true) (8k) + +3. *aarch64-rpi* ARMv8 boot loader for Raspberry Pi 3 + [bootboot.img](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.img?raw=true) (27k) + +4. *mykernel* an example BOOTBOOT [compatible kernel](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel) in C which draws lines and boxes + +Please note that the reference implementations do not support the full protocol at level 2, +they only handle static mappings which makes them level 1 loaders. + +BOOTBOOT Protocol +================= + +Rationale +--------- + +The protocol describes how to boot an ELF64 or PE32+ executable inside an initial ram disk image +into clean 64 bit mode, without using any configuration or even knowing the file system of initrd. + +On [BIOS](https://gitlab.com/bztsrc/bootboot/tree/master/x86_64-bios) based systems, the same image can be loaded via +Multiboot, chainload from MBR or VBR (GPT hybrid booting) or run as a BIOS Expansion ROM +(so not only the ramdisk can be in ROM, but the loader as well). + +On [UEFI machines](https://gitlab.com/bztsrc/bootboot/tree/master/x86_64-efi), it is a standard EFI OS Loader application. + +On [Raspberry Pi 3](https://gitlab.com/bztsrc/bootboot/tree/master/aarch64-rpi) board the bootboot.img +is loaded from the boot partition on SD card as kernel8.img by start.elf. + +The difference to other booting protocols is flexibility and portability; +only clean 64 bit support; and that BOOTBOOT expects the kernel to fit inside the +initial ramdisk. This is ideal for hobby OSes and micro-kernels. The advantage it gaves is that your kernel +can be splitted up into several files and yet they will be loaded together +as if it were a monolitic kernel. And you can use your own file system for the initrd. + +Note: BOOTBOOT is not a boot manager, it's a boot loader protocol. If you want an interactive boot menu, you should +integrate that *before* a BOOTBOOT compatible loader is called. Like GRUB chainloading boot.bin (or loading bootboot.bin as a +kernel) or adding bootboot.efi to UEFI Boot Manager's menu for example. + +Licence +------- + +The BOOTBOOT Protocol as well as the reference implementations are free +software and licensed under the terms of MIT licence. + +``` + Copyright (C) 2017 bzt (bztsrc@gitlab) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +``` + +Authors +------- + +efirom: Michael Brown + +zlib: Mark Adler + +tinflate: Joergen Ibsen + +raspbootcom: (GPL) Goswin von Brederlow + +BOOTBOOT, FS/Z: bzt + +Glossary +-------- + +* _boot partition_: the first bootable partition of the first bootable disk, + a rather small one. Most likely an EFI System Partition with FAT, but can be + any other partition as well if the partition is bootable (bit 2 set in flags). + +* _environment file_: a maximum one page frame long, utf-8 [file](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#environment-file) on boot partition + at `BOOTBOOT\CONFIG` (or when your initrd is on the entire partition, `/sys/config`). It + has "key=value" pairs (separated by newlines). The protocol + only specifies two of the keys: "screen" for screen size, + and "kernel" for the name of the executable inside the initrd. + +* _initrd_: initial [ramdisk image](https://gitlab.com/bztsrc/bootboot/blob/master/README.md#installation) + (probably in ROM or flash, or on a GPT boot partition at BOOTBOOT\INITRD, or it can occupy the whole partition, or can be loaded + over the network). It's format and whereabouts are not specified (the good part :-) ) and can be optionally gzip compressed. + +* _loader_: a native executable on the boot partition or in ROM. For multi-bootable disks + more loader implementations can co-exists. + +* _file system driver_: a separated function that parses initrd for the kernel file. + Without one the first executable found will be loaded. + +* _kernel file_: an ELF64 / PE32+ [executable inside initrd](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel), + optionally with the following symbols: `fb`, `environment`, `bootboot` (see machine state and linker script). + +* _BOOTBOOT structure_: an informational structure defined in [bootboot.h](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.h). + +Boot process +------------ + +1. the firmware locates the loader, loads it and passes control to it. +2. the loader initializes hardware (64 bit mode, screen resolution, memory map etc.) +3. then loads environment file and initrd file (probably from the boot partition or from ROM). +4. iterates on file system drivers, and loads kernel file from initrd. +5. if file system is not recognized, scans for the first executable in the initrd. +6. parses executable header and symbols to get link addresses (only level 2 compatible loaders). +7. maps linear framebuffer, environment and [bootboot structure](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.h) accordingly. +8. sets up stack, registers and jumps to kernel entry point. See [example kernel](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel). + +Machine state +------------- + +When the kernel gains control, the memory mapping looks like this: + +``` + -64M "fb" framebuffer (0xFFFFFFFFFC000000) + -2M "bootboot" structure (0xFFFFFFFFFFE00000) + -2M+1page "environment" string (0xFFFFFFFFFFE01000) + -2M+2page.. code segment v (0xFFFFFFFFFFE02000) + ..0 stack ^ (0x0000000000000000) + 0-16G RAM identity mapped (0x0000000400000000) +``` + +All infomration is passed at linker defined addresses. No API required at all, therefore the BOOTBOOT Protocol is +totally architecture and ABI agnostic. Level 1 expects these symbols at pre-defined addresses, level 2 loaders +parse the symbol table in executable to get the actual addresses. + +The RAM (up to 16G) is identity mapped in the positive address range. Interrups are turned off and code is running +in supervisor mode. + +The screen is properly set up with a 32 bit packed pixel linear framebuffer, mapped at the negative address defined by +the `fb` symbol. Level 1 loaders limit the framebuffer size somewhere around 4096 x 4096 pixels (depends on scanline size +and aspect ratio too). That's more than enough for [Ultra HD 4K](https://en.wikipedia.org/wiki/4K_resolution) +(3840 x 2160). Level 2 loaders can place the fb anywhere in memory therefore they do not have such a limitation. + +The main information [bootboot structure](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.h) is mapped +at `bootboot` symbol. It consist of a fixed 128 bytes long header followed by various number of fixed +records. Your initrd (with the additional kernel modules and servers) is enitrely in the memory, and you can locate it +using this struct's *initrd_ptr* and *initrd_size* members. The physical address of the framebuffer can be found in +the *fb_ptr* field. The *boot time* and a platform independent *memory map* are also provided. + +The configuration string (or command line if you like) is mapped at `environment` symbol. + +Kernel's code segment is mapped at ELF header's `p_vaddr` or PE header's `code_base` (level 2 only). Level 1 loaders +load kernels at -2M, therefore limiting the kernel's size in 2M, including configuration, data, bss and stack. That +must be more than enough for all micro-kernels. + +The stack is at the top of the memory, starting at zero and growing downwards. + +Environment file +---------------- + +Configuration is passed to your kernel as newline separated, zero terminated UTF-8 string with "key=value" pairs. + +``` +// BOOTBOOT Options + +// --- Loader specific --- +// requested screen dimension. If not given, autodetected +screen=800x600 +// elf or pe binary to load inside initrd +kernel=sys/core + +// --- Kernel specific, you're choosing --- +anythingyouwant=somevalue +otherstuff=enabled +somestuff=100 +someaddress=0xA0000 +``` + +That cannot be larger than a page size (4096 bytes). Temporary variables will be appended at the end (from +UEFI command line). C style single line and multi line comments can be used. BOOTBOOT protocol only uses `screen` and +`kernel` keys, all the others and their values are up to your kernel (or drivers) to parse. Be creative :-) + +To modify the environment, one will need to insert the disk into another machine (or boot a simple OS like DOS) and edit +BOOTBOOT\CONFIG on the boot partition. With UEFI, you can use the `edit` command provided by the EFI Shell or append +"key=value" pairs on the command line (value specified on command line takes precedence over the one in the file). + +File system drivers +------------------- + +The file system of the boot partition and how initrd is loaded from it is out of the scope of this specification: +the BOOTBOOT Protocol only states that a compatible loader must be able to load initrd and the environment file, +but does not describe how or from where. They can be loaded from nvram, ROM or over +network for example, it does not matter. + +On the other hand BOOTBOOT does specify one API function to locate a file (the kernel) +inside the initrd image, but the ABI is also implementation (and architecture) specific. +This function receives a pointer to initrd in memory as well as the kernel's filename, and +returns a pointer to the first byte of the kernel and it's size. On error (if file system is +not recognized or the kernel file is not found) returns {NULL,0}. Plain simple. + +```c +typedef struct { + uint8_t *ptr; + uint64_t size; +} file_t; + +file_t myfs_initrd(uint8_t *initrd, char *filename); +``` + +The protocol expects that a BOOTBOOT compliant loader iterates on a list of drivers until one +returns a valid result. If all file system drivers returned {NULL,0}, the loader will brute-force +scan for the first ELF64 / PE32+ image in the initrd. This feature is quite comfortable when you +want to use your own file system but you don't have written an fs driver for it yet, or when your +"initrd" is a single, statically linked executable, like the Minix kernel. You just copy +your initrd on the boot partition, and you're ready to rock and roll! + +The BOOTBOOT Protocol expects the file system drivers ([here](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-efi/fs.h), +[here](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-bios/fs.inc) and [here](https://gitlab.com/bztsrc/bootboot/blob/master/aarch64-rpi/fs.h)) +to be separated from the rest of the loader's source. This is so because it was designed to help the needs of hobby +OS developers, specially for those who want to write their own file systems. + +The reference implementations support [cpio](https://en.wikipedia.org/wiki/Cpio) (all hpodc, newc and crc variants), +[ustar](https://en.wikipedia.org/wiki/Tar_(computing)), osdev.org's [SFS](http://wiki.osdev.org/SFS), +[James Molloy's initrd](http://www.jamesmolloy.co.uk/tutorial_html/8.-The%20VFS%20and%20the%20initrd.html) +format and OS/Z's native [FS/Z](https://gitlab.com/bztsrc/osz/blob/master/etc/include/fsZ.h). +Gzip compressed initrds also supported to save disk space and fasten up load time (not recommended on RPi3). + +Example kernel +-------------- + +An [example kernel](https://gitlab.com/bztsrc/bootboot/blob/master/mykernel/kernel.c) is included with BOOTBOOT Protocol +to demostrate how to access the environment: + +```c +#include + +/* imported virtual addresses, see linker script below */ +extern BOOTBOOT bootboot; // see bootboot.h +extern unsigned char *environment; // configuration, UTF-8 text key=value pairs +extern uint8_t fb; // linear framebuffer mapped + +void _start() +{ + int x, y, s=bootboot.fb_scanline, w=bootboot.fb_width, h=bootboot.fb_height; + + // cross-hair to see screen dimension detected correctly + for(y=0;y ../INITRD +find . | cpio -H crc -o | gzip > ../INITRD +find . | cpio -H hpodc -o | gzip > ../INITRD +tar -czf ../INITRD * +mkfs ../INITRD . +``` + +2. Create FS0:\BOOTBOOT directory on the boot partition, and copy the image you've created + into it. If you want, create a text file named CONFIG there too, and put your + environment variables there. If you use a different name than "sys/core" for your + kernel, specify "kernel=" in it. + +Alternatively you can copy an uncompressed INITRD into the whole partition using your fs only, leaving FAT file system entirely out. +You can also create an Option ROM out of INITRD (on BIOS there's not much space ~64-96k, but on EFI it can be 16M). + +3. copy the BOOTBOOT loader on the boot partition. + +3.1. *UEFI disk*: copy __bootboot.efi__ to **_FS0:\EFI\BOOT\BOOTX64.EFI_**. + +3.2. *BIOS disk*: copy __bootboot.bin__ to **_FS0:\BOOTBOOT\LOADER_**. + +3.3. *Raspberry Pi 3*: copy __bootboot.img__ to **_FS0:\KERNEL8.IMG_**. + +**IMPORTANT**: see the relevant port's README.md for more details. + +Troubleshooting +--------------- + +``` +BOOTBOOT-PANIC: LBA support not found +``` + +Really old hardware. Your BIOS does not support LBA. This message is generated by 1st stage loader (boot.bin). + +``` +BOOTBOOT-PANIC: FS0:\BOOTBOOT\LOADER not found +``` + +The loader (bootboot.bin) is not on the disk or it's starting LBA address is not recorded in the boot sector at dword [0x1B0] +(see [mkboot](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-bios/mkboot.c)). As the boot sector supports RAID mirror, +it will try to load the loader from other drives as well. This message is generated by 1st stage loader (boot.bin). + +``` +BOOTBOOT-PANIC: Hardware not supported +``` + +Really old hardware. On x86_64, your CPU is older than family 6.0 or PAE, MSR, LME features not supported. +On AArch64 it means the MMU does not support 4k granule size, at least 36 bit address size or the system timer +(0x3F003000) is not available. + + +``` +BOOTBOOT-PANIC: Unable to initialize SDHC card +``` + +The loader was unable to initialize EMMC for SDHC card access, probably hardware error or old card. + +``` +BOOTBOOT-PANIC: No boot partition +``` + +Either the disk does not have a GPT, or there's no EFI System Partition nor any other bootable +partition on it. Or the FAT file system is found but inconsistent, or doesn't have a BOOTBOOT directory. + +``` +BOOTBOOT-PANIC: INITRD not found +``` + +The loader could not find the initial ramdisk image on the boot partition. This message will be shown +even if you specify an alternative initrd file on EFI command line. + +``` +BOOTBOOT-PANIC: Kernel not found in initrd +``` + +Kernel is not included in the initrd, or initrd's fileformat is not recognized by any of the file system +drivers and scanning haven't found a valid executable header in it. + +``` +BOOTBOOT-PANIC: Kernel is not a valid executable +``` + +The file that was specified as kernel could be loaded by fs drivers, but it's not an ELF64 or PE32+, +does not match the architecture, or does not have any program header with a loadable segment (p_vaddr or core_base) +in the negative range (see linker script). This error is also shown by level 2 loaders if the address of `fb`, +`bootboot` and `environment` symbols are not in the negative range. + +``` +BOOTBOOT-PANIC: GOP failed, no framebuffer +BOOTBOOT-PANIC: VESA VBE error, no framebuffer +BOOTBOOT-PANIC: VideoCore error, no framebuffer +``` + +The first part of the message varies on different platforms. It means that the loader was unable to set up linear +framebuffer with packed 32 bit pixels in the requested resolution. Possible solution is to modify screen to +`screen=800x600` or `screen=1024x768` in environment. + +That's all, hope it will be useful! diff --git a/aarch64-rpi/Makefile b/aarch64-rpi/Makefile new file mode 100644 index 0000000..59ad724 --- /dev/null +++ b/aarch64-rpi/Makefile @@ -0,0 +1,27 @@ +all: boot.S bootboot.c fs.h + @echo " src aarch64-rpi (Raspberry Pi 3+)" + @aarch64-elf-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -c boot.S -o boot.o + @aarch64-elf-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -I ./ -c tinflate.c -o tinflate.o + @aarch64-elf-gcc -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles -I ./ -c bootboot.c -o bootboot.o + @aarch64-elf-ld -r -b binary -o font.o font.psf + @aarch64-elf-ld -nostdlib -nostartfiles boot.o bootboot.o tinflate.o font.o -T link.ld -o bootboot.elf + @aarch64-elf-objcopy -O binary bootboot.elf ../bootboot.img + @rm *.o bootboot.elf + +mkboot: mkboot.c + gcc mkboot.c -o mkboot + +raspbootcom: raspbootcom.c + gcc raspbootcom.c -o raspbootcom + +getfw: + wget -q https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/LICENCE.broadcom + wget -q https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/bootcode.bin + wget -q https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup.dat + wget -q https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start.elf + +cleanfw: + @rm LICENCE.broadcom bootcode.bin fixup.dat start.elf + +clean: + @rm mkboot raspbootcom *.o >/dev/null 2>/dev/null || true diff --git a/aarch64-rpi/README.md b/aarch64-rpi/README.md new file mode 100644 index 0000000..d61c920 --- /dev/null +++ b/aarch64-rpi/README.md @@ -0,0 +1,49 @@ +BOOTBOOT Raspberry Pi 3 Implementation +====================================== + +See [BOOTBOOT Protocol](https://gitlab.com/bztsrc/bootboot) for common details. + +On [Raspberry Pi 3](https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/sdcard.md) board the bootboot.img +is loaded from the boot (or firmware) partition on SD card as kernel8.img by start.elf. For separating firmware and boot +partitions see [documentation](https://gitlab.com/bztsrc/bootboot/blob/master/bootboot_spec_1st_ed.pdf). + +Machine state +------------- + +In addition to standard mappings, the MMIO is also mapped in kernel space: + +``` + -128M MMIO (0xFFFFFFFFF8000000) +``` + +Code is running in supervisor mode, at EL1. Dummy exception handlers are installed, but your kernel should use it's own +handlers as soon as possible. + +File system drivers +------------------- + +For boot partition, RPi3 version expects FAT16 or FAT32 file systems (if the +initrd is a file and does not occupy the whole boot partition). The initrd can also be loaded over serial line, +running [raspbootcom](https://gitlab.com/bztsrc/bootboot/blob/master/aarch64-rpi/raspbootcom.c) on a remote machine. + +Gzip compression is not recommended as reading from SD card is considerably faster than uncompressing. + +Installation +------------ + +1. Copy __bootboot.img__ to **_FS0:\KERNEL8.IMG_**. + +2. You'll need other [firmware files](https://gitlab.com/raspberrypi/firmware/tree/master/boot) as well. + +3. If you have used a GPT disk with ESP as boot partition, then you need to map it in MBR so that Raspberry Pi + firmware could find those files. The [mkboot](https://gitlab.com/bztsrc/bootboot/blob/master/aarch64-rpi/mkboot.c) + utility will do that for you. + +Limitations +----------- + + - Initrd in ROM is not possible + - Maps only the first 1G of RAM. + - Cards other than SDHC Class 10 not supported. + - Raspberry Pi does not have an on-board RTC, so always 0000-00-00 00:00:00 returned as bootboot.datetime. + diff --git a/aarch64-rpi/boot.S b/aarch64-rpi/boot.S new file mode 100644 index 0000000..7b88867 --- /dev/null +++ b/aarch64-rpi/boot.S @@ -0,0 +1,154 @@ +/* + * aarch64-rpi/boot.S + * + * Copyright (C) 2017 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the BOOTBOOT Protocol package. + * @brief Boot loader for the Raspberry Pi 3+ ARMv8 + * + */ +.section ".text.boot" + +.global _start +.global jumptokernel + +/********************************************************************* + * Entry point called by start.elf * + *********************************************************************/ +_start: + // magic + b 1f + .ascii "BOOTBOOT" + // read cpu id, stop slave cores +1: mrs x7, mpidr_el1 + and x7, x7, #3 + cbz x7, 2f +1: wfe + b 1b +2: // set stack before our code + ldr x1, =_start + // set up EL1 + mrs x0, CurrentEL + and x0, x0, #12 + // running at EL3? + cmp x0, #12 + bne 1f + mov x2, #0x5b1 + msr scr_el3, x2 + mov x2, #0x3c9 + msr spsr_el3, x2 + adr x2, 1f + msr elr_el3, x2 + eret + // running at EL2? +1: cmp x0, #4 + beq 1f + msr sp_el1, x1 + // set up exception handlers + ldr x1, =_vectors + msr vbar_el2, x1 + // enable CNTP for EL1 + mrs x0, cnthctl_el2 + orr x0, x0, #3 + msr cnthctl_el2, x0 + msr cntvoff_el2, xzr + // initialize virtual MPIDR + mrs x0, midr_el1 + mrs x2, mpidr_el1 + msr vpidr_el2, x0 + msr vmpidr_el2, x2 + // disable coprocessor traps + mov x0, #0x33FF + msr cptr_el2, x0 + msr hstr_el2, xzr + mov x0, #(3 << 20) + msr cpacr_el1, x0 + // enable AArch64 in EL1 + mov x0, #(1 << 31) // AArch64 + orr x0, x0, #(1 << 1) // SWIO hardwired on Pi3 + msr hcr_el2, x0 + mrs x0, hcr_el2 + // Setup SCTLR access + mov x2, #0x0800 + movk x2, #0x30d0, lsl #16 + msr sctlr_el1, x2 + // change exception level to EL1 + mov x2, #0x3c4 + msr spsr_el2, x2 + adr x2, 1f + msr elr_el2, x2 + eret +1: // clear bss + ldr x2, =__bss_start + ldr w3, =__bss_size +1: cbz w3, 2f + str xzr, [x2], #8 + sub w3, w3, #1 + cbnz w3, 1b +2: mov sp, x1 + // set up exception handlers + ldr x1, =_vectors + msr vbar_el1, x1 + // jump to C code + bl bootboot_main +1: wfe + b 1b + + .align 11 +_vectors: + .align 7 + mov x0, #0 + mrs x1, esr_el1 + mrs x2, elr_el1 + mrs x3, spsr_el1 + mrs x4, far_el1 + mrs x5, sctlr_el1 + mrs x6, tcr_el1 + b uart_exc + .align 7 + mov x0, #1 + mrs x1, esr_el1 + mrs x2, elr_el1 + mrs x3, spsr_el1 + mrs x4, far_el1 + mrs x5, sctlr_el1 + mrs x6, tcr_el1 + b uart_exc + .align 7 + mov x0, #2 + mrs x1, esr_el1 + mrs x2, elr_el1 + mrs x3, spsr_el1 + mrs x4, far_el1 + mrs x5, sctlr_el1 + mrs x6, tcr_el1 + b uart_exc + .align 7 + mov x0, #3 + mrs x1, esr_el1 + mrs x2, elr_el1 + mrs x3, spsr_el1 + mrs x4, far_el1 + mrs x5, sctlr_el1 + mrs x6, tcr_el1 + b uart_exc diff --git a/aarch64-rpi/bootboot.c b/aarch64-rpi/bootboot.c new file mode 100644 index 0000000..06b9ae6 --- /dev/null +++ b/aarch64-rpi/bootboot.c @@ -0,0 +1,1574 @@ +/* + * aarch64-rpi/bootboot.c + * + * Copyright (C) 2017 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the BOOTBOOT Protocol package. + * @brief Boot loader for the Raspberry Pi 3+ ARMv8 + * + */ +#define DEBUG 1 +//#define SD_DEBUG DEBUG +//#define INITRD_DEBUG DEBUG +//#define EXEC_DEBUG DEBUG +//#define MEM_DEBUG DEBUG + +#define CONSOLE UART0 + +#define NULL ((void*)0) +#define PAGESIZE 4096 + +#include "tinf.h" + +/* get BOOTBOOT structure */ +#include "../bootboot.h" + +/* aligned buffers */ +volatile uint32_t __attribute__((aligned(16))) mbox[36]; +/* we place these manually in linker script, gcc would otherwise waste lots of memory */ +volatile uint8_t __attribute__((aligned(PAGESIZE))) __bootboot[PAGESIZE]; +volatile uint8_t __attribute__((aligned(PAGESIZE))) __environment[PAGESIZE]; +volatile uint8_t __attribute__((aligned(PAGESIZE))) __paging[23*PAGESIZE]; +volatile uint8_t __attribute__((aligned(PAGESIZE))) __corestack[PAGESIZE]; +#define __diskbuf __paging +extern volatile uint8_t _data; +extern volatile uint8_t _end; + +/* forward definitions */ +uint32_t color=0xC0C0C0; +void putc(char c); +void puts(char *s); + +/*** ELF64 defines and structs ***/ +#define ELFMAG "\177ELF" +#define SELFMAG 4 +#define EI_CLASS 4 /* File class byte index */ +#define ELFCLASS64 2 /* 64-bit objects */ +#define EI_DATA 5 /* Data encoding byte index */ +#define ELFDATA2LSB 1 /* 2's complement, little endian */ +#define PT_LOAD 1 /* Loadable program segment */ +#define EM_AARCH64 183 /* ARM aarch64 architecture */ + +typedef struct +{ + unsigned char e_ident[16];/* Magic number and other info */ + uint16_t e_type; /* Object file type */ + uint16_t e_machine; /* Architecture */ + uint32_t e_version; /* Object file version */ + uint64_t e_entry; /* Entry point virtual address */ + uint64_t e_phoff; /* Program header table file offset */ + uint64_t e_shoff; /* Section header table file offset */ + uint32_t e_flags; /* Processor-specific flags */ + uint16_t e_ehsize; /* ELF header size in bytes */ + uint16_t e_phentsize; /* Program header table entry size */ + uint16_t e_phnum; /* Program header table entry count */ + uint16_t e_shentsize; /* Section header table entry size */ + uint16_t e_shnum; /* Section header table entry count */ + uint16_t e_shstrndx; /* Section header string table index */ +} Elf64_Ehdr; + +typedef struct +{ + uint32_t p_type; /* Segment type */ + uint32_t p_flags; /* Segment flags */ + uint64_t p_offset; /* Segment file offset */ + uint64_t p_vaddr; /* Segment virtual address */ + uint64_t p_paddr; /* Segment physical address */ + uint64_t p_filesz; /* Segment size in file */ + uint64_t p_memsz; /* Segment size in memory */ + uint64_t p_align; /* Segment alignment */ +} Elf64_Phdr; + +/*** PE32+ defines and structs ***/ +#define MZ_MAGIC 0x5a4d /* "MZ" */ +#define PE_MAGIC 0x00004550 /* "PE\0\0" */ +#define IMAGE_FILE_MACHINE_ARM64 0xaa64 /* ARM aarch64 architecture */ +#define PE_OPT_MAGIC_PE32PLUS 0x020b /* PE32+ format */ +typedef struct +{ + uint16_t magic; /* MZ magic */ + uint16_t reserved[29]; /* reserved */ + uint32_t peaddr; /* address of pe header */ +} mz_hdr; + +typedef struct { + uint32_t magic; /* PE magic */ + uint16_t machine; /* machine type */ + uint16_t sections; /* number of sections */ + uint32_t timestamp; /* time_t */ + uint32_t sym_table; /* symbol table offset */ + uint32_t symbols; /* number of symbols */ + uint16_t opt_hdr_size; /* size of optional header */ + uint16_t flags; /* flags */ + uint16_t file_type; /* file type, PE32PLUS magic */ + uint8_t ld_major; /* linker major version */ + uint8_t ld_minor; /* linker minor version */ + uint32_t text_size; /* size of text section(s) */ + uint32_t data_size; /* size of data section(s) */ + uint32_t bss_size; /* size of bss section(s) */ + int32_t entry_point; /* file offset of entry point */ + int32_t code_base; /* relative code addr in ram */ +} pe_hdr; + +/*** Raspberry Pi specific defines ***/ +#define MMIO_BASE 0x3F000000 + +#define PM_RTSC ((volatile uint32_t*)(MMIO_BASE+0x0010001c)) +#define PM_WATCHDOG ((volatile uint32_t*)(MMIO_BASE+0x00100024)) +#define PM_WDOG_MAGIC 0x5a000000 +#define PM_RTSC_FULLRST 0x00000020 + +#define GPFSEL0 ((volatile uint32_t*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile uint32_t*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile uint32_t*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile uint32_t*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile uint32_t*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile uint32_t*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile uint32_t*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile uint32_t*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile uint32_t*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile uint32_t*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile uint32_t*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile uint32_t*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile uint32_t*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile uint32_t*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile uint32_t*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile uint32_t*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile uint32_t*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile uint32_t*)(MMIO_BASE+0x0020009C)) + +#define UART0 0 +#define UART0_DR ((volatile uint32_t*)(MMIO_BASE+0x00201000)) +#define UART0_FR ((volatile uint32_t*)(MMIO_BASE+0x00201018)) +#define UART0_IBRD ((volatile uint32_t*)(MMIO_BASE+0x00201024)) +#define UART0_FBRD ((volatile uint32_t*)(MMIO_BASE+0x00201028)) +#define UART0_LCRH ((volatile uint32_t*)(MMIO_BASE+0x0020102C)) +#define UART0_CR ((volatile uint32_t*)(MMIO_BASE+0x00201030)) +#define UART0_IMSC ((volatile uint32_t*)(MMIO_BASE+0x00201038)) +#define UART0_ICR ((volatile uint32_t*)(MMIO_BASE+0x00201044)) + +#define UART1 1 +#define AUX_ENABLE ((volatile uint32_t*)(MMIO_BASE+0x00215004)) +#define AUX_MU_IO ((volatile uint32_t*)(MMIO_BASE+0x00215040)) +#define AUX_MU_IER ((volatile uint32_t*)(MMIO_BASE+0x00215044)) +#define AUX_MU_IIR ((volatile uint32_t*)(MMIO_BASE+0x00215048)) +#define AUX_MU_LCR ((volatile uint32_t*)(MMIO_BASE+0x0021504C)) +#define AUX_MU_MCR ((volatile uint32_t*)(MMIO_BASE+0x00215050)) +#define AUX_MU_LSR ((volatile uint32_t*)(MMIO_BASE+0x00215054)) +#define AUX_MU_MSR ((volatile uint32_t*)(MMIO_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile uint32_t*)(MMIO_BASE+0x0021505C)) +#define AUX_MU_CNTL ((volatile uint32_t*)(MMIO_BASE+0x00215060)) +#define AUX_MU_STAT ((volatile uint32_t*)(MMIO_BASE+0x00215064)) +#define AUX_MU_BAUD ((volatile uint32_t*)(MMIO_BASE+0x00215068)) + +/* timing stuff */ +uint64_t cntfrq; +/* delay cnt clockcycles */ +void delay(uint32_t cnt) { while(cnt--) { asm volatile("nop"); } } +/* delay cnt microsec */ +void delaym(uint32_t cnt) {uint64_t t,r;asm volatile ("mrs %0, cntpct_el0" : "=r" (t)); + t+=((cntfrq/1000)*cnt)/1000;do{asm volatile ("mrs %0, cntpct_el0" : "=r" (r));}while(r=0;c-=4){n=(d>>c)&0xF;n+=n>9?0x37:0x30;uart_send(n);} } +void uart_putc(char c) { if(c=='\n') uart_send((uint32_t)'\r'); uart_send((uint32_t)c); } +void uart_puts(char *s) { while(*s) uart_putc(*s++); } +void uart_dump(void *ptr,uint32_t l) { + uint64_t a,b; + unsigned char c; + for(a=(uint64_t)ptr;a<(uint64_t)ptr+l*16;a+=16) { + uart_hex(a,8); uart_puts(": "); + for(b=0;b<16;b++) { + uart_hex(*((unsigned char*)(a+b)),1); + uart_putc(' '); + if(b%4==3) + uart_putc(' '); + } + for(b=0;b<16;b++) { + c=*((unsigned char*)(a+b)); + uart_putc(c<32||c>=127?'.':c); + } + uart_putc('\n'); + } +} +void uart_exc(uint64_t idx, uint64_t esr, uint64_t elr, uint64_t spsr, uint64_t far, uint64_t sctlr, uint64_t tcr) +{ + register uint64_t r; + asm volatile ("msr ttbr0_el1, %0;tlbi vmalle1" : : "r" ((uint64_t)&__paging+1)); + asm volatile ("dsb ish; isb; mrs %0, sctlr_el1" : "=r" (r)); + // set mandatory reserved bits + r&=~((1<<12) | // clear I, no instruction cache + (1<<2)); // clear C, no cache at all + asm volatile ("msr sctlr_el1, %0; isb" : : "r" (r)); + puts("\nBOOTBOOT-EXCEPTION"); + uart_puts(" #"); + uart_hex(idx,1); + uart_puts(":\n ESR_EL1 "); + uart_hex(esr,8); + uart_puts(" ELR_EL1 "); + uart_hex(elr,8); + uart_puts("\n SPSR_EL1 "); + uart_hex(spsr,8); + uart_puts(" FAR_EL1 "); + uart_hex(far,8); + uart_puts("\nSCTLR_EL1 "); + uart_hex(sctlr,8); + uart_puts(" TCR_EL1 "); + uart_hex(tcr,8); + uart_putc('\n'); + r=0; while(r!='\n' && r!=' ') r=uart_getc(); + asm volatile("dsb sy; isb"); + *PM_WATCHDOG = PM_WDOG_MAGIC | 1; + *PM_RTSC = PM_WDOG_MAGIC | PM_RTSC_FULLRST; + while(1); +} +#define VIDEOCORE_MBOX (MMIO_BASE+0x0000B880) +#define MBOX_READ ((volatile uint32_t*)(VIDEOCORE_MBOX+0x0)) +#define MBOX_POLL ((volatile uint32_t*)(VIDEOCORE_MBOX+0x10)) +#define MBOX_SENDER ((volatile uint32_t*)(VIDEOCORE_MBOX+0x14)) +#define MBOX_STATUS ((volatile uint32_t*)(VIDEOCORE_MBOX+0x18)) +#define MBOX_CONFIG ((volatile uint32_t*)(VIDEOCORE_MBOX+0x1C)) +#define MBOX_WRITE ((volatile uint32_t*)(VIDEOCORE_MBOX+0x20)) +#define MBOX_REQUEST 0 +#define MBOX_RESPONSE 0x80000000 +#define MBOX_FULL 0x80000000 +#define MBOX_EMPTY 0x40000000 +#define MBOX_CH_POWER 0 +#define MBOX_CH_FB 1 +#define MBOX_CH_VUART 2 +#define MBOX_CH_VCHIQ 3 +#define MBOX_CH_LEDS 4 +#define MBOX_CH_BTNS 5 +#define MBOX_CH_TOUCH 6 +#define MBOX_CH_COUNT 7 +#define MBOX_CH_PROP 8 + +/* mailbox functions */ +void mbox_write(uint8_t ch, volatile uint32_t *mbox) +{ + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_FULL); + *MBOX_WRITE = (((uint32_t)((uint64_t)mbox)&~0xF) | (ch&0xF)); +} +uint32_t mbox_read(uint8_t ch) +{ + uint32_t r; + while(1) { + do{asm volatile("nop");}while(*MBOX_STATUS & MBOX_EMPTY); + r=*MBOX_READ; + if((uint8_t)(r&0xF)==ch) + return (r&~0xF); + } +} +uint8_t mbox_call(uint8_t ch, volatile uint32_t *mbox) +{ + mbox_write(ch,mbox); + return mbox_read(ch)==(uint32_t)((uint64_t)mbox) && mbox[1]==MBOX_RESPONSE; +} + +/* string.h */ +uint32_t strlen(unsigned char *s) { uint32_t n=0; while(*s++) n++; return n; } +void memcpy(void *dst, void *src, uint32_t n){uint8_t *a=dst,*b=src;while(n--) *a++=*b++; } +void memset(void *dst, uint8_t c, uint32_t n){uint8_t *a=dst;while(n--) *a++=c; } +int memcmp(void *s1, void *s2, uint32_t n){uint8_t *a=s1,*b=s2;while(n--){if(*a!=*b){return *a-*b;}a++;b++;} return 0; } +/* other string functions */ +int atoi(unsigned char *c) { int r=0;while(*c>='0'&&*c<='9') {r*=10;r+=*c++-'0';} return r; } +int oct2bin(unsigned char *s, int n){ int r=0;while(n-->0){r<<=3;r+=*s++-'0';} return r; } +int hex2bin(unsigned char *s, int n){ int r=0;while(n-->0){r<<=4; + if(*s>='0' && *s<='9')r+=*s-'0';else if(*s>='A'&&*s<='F')r+=*s-'A'+10;s++;} return r; } + +#if DEBUG +#define DBG(s) puts(s) +#else +#define DBG(s) +#endif + +/* sdcard */ +#define EMMC_ARG2 ((volatile uint32_t*)(MMIO_BASE+0x00300000)) +#define EMMC_BLKSIZECNT ((volatile uint32_t*)(MMIO_BASE+0x00300004)) +#define EMMC_ARG1 ((volatile uint32_t*)(MMIO_BASE+0x00300008)) +#define EMMC_CMDTM ((volatile uint32_t*)(MMIO_BASE+0x0030000C)) +#define EMMC_RESP0 ((volatile uint32_t*)(MMIO_BASE+0x00300010)) +#define EMMC_RESP1 ((volatile uint32_t*)(MMIO_BASE+0x00300014)) +#define EMMC_RESP2 ((volatile uint32_t*)(MMIO_BASE+0x00300018)) +#define EMMC_RESP3 ((volatile uint32_t*)(MMIO_BASE+0x0030001C)) +#define EMMC_DATA ((volatile uint32_t*)(MMIO_BASE+0x00300020)) +#define EMMC_STATUS ((volatile uint32_t*)(MMIO_BASE+0x00300024)) +#define EMMC_CONTROL0 ((volatile uint32_t*)(MMIO_BASE+0x00300028)) +#define EMMC_CONTROL1 ((volatile uint32_t*)(MMIO_BASE+0x0030002C)) +#define EMMC_INTERRUPT ((volatile uint32_t*)(MMIO_BASE+0x00300030)) +#define EMMC_INT_MASK ((volatile uint32_t*)(MMIO_BASE+0x00300034)) +#define EMMC_INT_EN ((volatile uint32_t*)(MMIO_BASE+0x00300038)) +#define EMMC_CONTROL2 ((volatile uint32_t*)(MMIO_BASE+0x0030003C)) +#define EMMC_SLOTISR_VER ((volatile uint32_t*)(MMIO_BASE+0x003000FC)) + +// command flags +#define CMD_NEED_APP 0x80000000 +#define CMD_RSPNS_48 0x00020000 +#define CMD_ERRORS_MASK 0xfff9c004 +#define CMD_RCA_MASK 0xffff0000 + +// COMMANDs +#define CMD_GO_IDLE 0x00000000 +#define CMD_ALL_SEND_CID 0x02010000 +#define CMD_SEND_REL_ADDR 0x03020000 +#define CMD_CARD_SELECT 0x07030000 +#define CMD_SEND_IF_COND 0x08020000 +#define CMD_STOP_TRANS 0x0C030000 +#define CMD_READ_SINGLE 0x11220010 +#define CMD_READ_MULTI 0x12220032 +#define CMD_SET_BLOCKCNT 0x17020000 +#define CMD_APP_CMD 0x37000000 +#define CMD_SET_BUS_WIDTH (0x06020000|CMD_NEED_APP) +#define CMD_SEND_OP_COND (0x29020000|CMD_NEED_APP) +#define CMD_SEND_SCR (0x33220010|CMD_NEED_APP) + +// STATUS register settings +#define SR_READ_AVAILABLE 0x00000800 +#define SR_DAT_INHIBIT 0x00000002 +#define SR_CMD_INHIBIT 0x00000001 +#define SR_APP_CMD 0x00000020 + +// INTERRUPT register settings +#define INT_DATA_TIMEOUT 0x00100000 +#define INT_CMD_TIMEOUT 0x00010000 +#define INT_READ_RDY 0x00000020 +#define INT_CMD_DONE 0x00000001 + +#define INT_ERROR_MASK 0x017E8000 + +// CONTROL register settings +#define C0_SPI_MODE_EN 0x00100000 +#define C0_HCTL_HS_EN 0x00000004 +#define C0_HCTL_DWITDH 0x00000002 + +#define C1_SRST_DATA 0x04000000 +#define C1_SRST_CMD 0x02000000 +#define C1_SRST_HC 0x01000000 +#define C1_TOUNIT_DIS 0x000f0000 +#define C1_TOUNIT_MAX 0x000e0000 +#define C1_CLK_GENSEL 0x00000020 +#define C1_CLK_EN 0x00000004 +#define C1_CLK_STABLE 0x00000002 +#define C1_CLK_INTLEN 0x00000001 + +// SLOTISR_VER values +#define HOST_SPEC_NUM 0x00ff0000 +#define HOST_SPEC_NUM_SHIFT 16 +#define HOST_SPEC_V3 2 +#define HOST_SPEC_V2 1 +#define HOST_SPEC_V1 0 + +// SCR flags +#define SCR_SD_BUS_WIDTH_4 0x00000400 +#define SCR_SUPP_SET_BLKCNT 0x02000000 +// added by my driver +#define SCR_SUPP_CCS 0x00000001 + +#define ACMD41_VOLTAGE 0x00ff8000 +#define ACMD41_CMD_COMPLETE 0x80000000 +#define ACMD41_CMD_CCS 0x40000000 +#define ACMD41_ARG_HC 0x51ff8000 + +#define SD_OK 0 +#define SD_TIMEOUT -1 +#define SD_ERROR -2 + +uint32_t sd_scr[2], sd_ocr, sd_rca, sd_err, sd_hv; + +/** + * Wait for data or command ready + */ +int sd_status(uint32_t mask) +{ + int cnt = 500000; while((*EMMC_STATUS & mask) && !(*EMMC_INTERRUPT & INT_ERROR_MASK) && cnt--) delaym(1); + return (cnt <= 0 || (*EMMC_INTERRUPT & INT_ERROR_MASK)) ? SD_ERROR : SD_OK; +} + +/** + * Wait for interrupt + */ +int sd_int(uint32_t mask) +{ + uint32_t r, m=mask | INT_ERROR_MASK; + int cnt = 1000000; while(!(*EMMC_INTERRUPT & m) && cnt--) delaym(1); + r=*EMMC_INTERRUPT; + if(cnt<=0 || (r & INT_CMD_TIMEOUT) || (r & INT_DATA_TIMEOUT) ) { *EMMC_INTERRUPT=r; return SD_TIMEOUT; } else + if(r & INT_ERROR_MASK) { *EMMC_INTERRUPT=r; return SD_ERROR; } + *EMMC_INTERRUPT=mask; + return 0; +} + +/** + * Send a command + */ +int sd_cmd(uint32_t code, uint32_t arg) +{ + int r=0; + sd_err=SD_OK; + if(code&CMD_NEED_APP) { + r=sd_cmd(CMD_APP_CMD|(sd_rca?CMD_RSPNS_48:0),sd_rca); + if(sd_rca && !r) { DBG("BOOTBOOT-ERROR: failed to send SD APP command\n"); sd_err=SD_ERROR;return 0;} + code &= ~CMD_NEED_APP; + } + if(sd_status(SR_CMD_INHIBIT)) { DBG("BOOTBOOT-ERROR: EMMC busy\n"); sd_err= SD_TIMEOUT;return 0;} +#if SD_DEBUG + uart_puts("EMMC: Sending command ");uart_hex(code,4);uart_puts(" arg ");uart_hex(arg,4);uart_putc('\n'); +#endif + *EMMC_INTERRUPT=*EMMC_INTERRUPT; *EMMC_ARG1=arg; *EMMC_CMDTM=code; + if(code==CMD_SEND_OP_COND) delaym(1000); else + if(code==CMD_SEND_IF_COND || code==CMD_APP_CMD) delaym(100); + if((r=sd_int(INT_CMD_DONE))) {DBG("BOOTBOOT-ERROR: failed to send EMMC command\n");sd_err=r;return 0;} + r=*EMMC_RESP0; + if(code==CMD_GO_IDLE || code==CMD_APP_CMD) return 0; else + if(code==(CMD_APP_CMD|CMD_RSPNS_48)) return r&SR_APP_CMD; else + if(code==CMD_SEND_OP_COND) return r; else + if(code==CMD_SEND_IF_COND) return r==arg? SD_OK : SD_ERROR; else + if(code==CMD_ALL_SEND_CID) {r|=*EMMC_RESP3; r|=*EMMC_RESP2; r|=*EMMC_RESP1; return r; } else + if(code==CMD_SEND_REL_ADDR) { + sd_err=(((r&0x1fff))|((r&0x2000)<<6)|((r&0x4000)<<8)|((r&0x8000)<<8))&CMD_ERRORS_MASK; + return r&CMD_RCA_MASK; + } + return r&CMD_ERRORS_MASK; + // make gcc happy + return 0; +} + +/** + * read a block from sd card and return the number of bytes read + * returns 0 on error. + */ +int sd_readblock(uint64_t lba, uint8_t *buffer, uint32_t num) +{ + int r,c=0,d; + if(num<1) num=1; +#if SD_DEBUG + uart_puts("sd_readblock lba ");uart_hex(lba,4);uart_puts(" num ");uart_hex(num,4);uart_putc('\n'); +#endif + if(sd_status(SR_DAT_INHIBIT)) {sd_err=SD_TIMEOUT; return 0;} + uint32_t *buf=(uint32_t *)buffer; + if(sd_scr[0] & SCR_SUPP_CCS) { + if(num > 1 && (sd_scr[0] & SCR_SUPP_SET_BLKCNT)) { + sd_cmd(CMD_SET_BLOCKCNT,num); + if(sd_err) return 0; + } + *EMMC_BLKSIZECNT = (num << 16) | 512; + sd_cmd(num == 1 ? CMD_READ_SINGLE : CMD_READ_MULTI,lba); + if(sd_err) return 0; + } else { + *EMMC_BLKSIZECNT = (1 << 16) | 512; + } + while( c < num ) { + if(!(sd_scr[0] & SCR_SUPP_CCS)) { + sd_cmd(CMD_READ_SINGLE,(lba+c)*512); + if(sd_err) return 0; + } + if((r=sd_int(INT_READ_RDY))){DBG("\rBOOTBOOT-ERROR: Timeout waiting for ready to read\n");sd_err=r;return 0;} + for(d=0;d<128;d++) buf[d] = *EMMC_DATA; + c++; buf+=128; + } +#if SD_DEBUG + uart_dump(buffer,4); +#endif + if( num > 1 && !(sd_scr[0] & SCR_SUPP_SET_BLKCNT) && (sd_scr[0] & SCR_SUPP_CCS)) sd_cmd(CMD_STOP_TRANS,0); + return sd_err!=SD_OK || c!=num? 0 : num*512; +} + +/** + * set SD clock to frequency in Hz + */ +int sd_clk(uint32_t f) +{ + uint32_t d,c=41666666/f,x,s=32,h=0; + int cnt = 100000; + while((*EMMC_STATUS & (SR_CMD_INHIBIT|SR_DAT_INHIBIT)) && cnt--) delaym(1); + if(cnt<=0) { + DBG("BOOTBOOT-ERROR: timeout waiting for inhibit flag\n"); + return SD_ERROR; + } + + *EMMC_CONTROL1 &= ~C1_CLK_EN; delaym(10); + x=c-1; if(!x) s=0; else { + if(!(x & 0xffff0000u)) { x <<= 16; s -= 16; } + if(!(x & 0xff000000u)) { x <<= 8; s -= 8; } + if(!(x & 0xf0000000u)) { x <<= 4; s -= 4; } + if(!(x & 0xc0000000u)) { x <<= 2; s -= 2; } + if(!(x & 0x80000000u)) { x <<= 1; s -= 1; } + if(s>0) s--; + if(s>7) s=7; + } + if(sd_hv>HOST_SPEC_V2) d=c; else d=(1<HOST_SPEC_V2) h=(d&0x300)>>2; + d=(((d&0x0ff)<<8)|h); + *EMMC_CONTROL1=(*EMMC_CONTROL1&0xffff003f)|d; delaym(10); + *EMMC_CONTROL1 |= C1_CLK_EN; delaym(10); + cnt=10000; while(!(*EMMC_CONTROL1 & C1_CLK_STABLE) && cnt--) delaym(10); + if(cnt<=0) { + DBG("BOOTBOOT-ERROR: failed to get stable clock\n"); + return SD_ERROR; + } + return SD_OK; +} + +/** + * initialize EMMC to read SDHC card + */ +int sd_init() +{ + long r,cnt,ccs=0; + // GPIO_CD + r=*GPFSEL4; r&=~(7<<(7*3)); *GPFSEL4=r; + *GPPUD=2; delay(150); *GPPUDCLK1=(1<<15); delay(150); *GPPUD=0; *GPPUDCLK1=0; + r=*GPHEN1; r|=1<<15; *GPHEN1=r; + + // GPIO_CLK, GPIO_CMD + r=*GPFSEL4; r|=(7<<(8*3))|(7<<(9*3)); *GPFSEL4=r; + *GPPUD=2; delay(150); *GPPUDCLK1=(1<<16)|(1<<17); delay(150); *GPPUD=0; *GPPUDCLK1=0; + + // GPIO_DAT0, GPIO_DAT1, GPIO_DAT2, GPIO_DAT3 + r=*GPFSEL5; r|=(7<<(0*3)) | (7<<(1*3)) | (7<<(2*3)) | (7<<(3*3)); *GPFSEL5=r; + *GPPUD=2; delay(150); + *GPPUDCLK1=(1<<18) | (1<<19) | (1<<20) | (1<<21); + delay(150); *GPPUD=0; *GPPUDCLK1=0; + + sd_hv = (*EMMC_SLOTISR_VER & HOST_SPEC_NUM) >> HOST_SPEC_NUM_SHIFT; +#if SD_DEBUG + uart_puts("EMMC: GPIO set up\n"); +#endif + // Reset the card. + *EMMC_CONTROL0 = 0; *EMMC_CONTROL1 |= C1_SRST_HC; + cnt=10000; do{delaym(10);} while( (*EMMC_CONTROL1 & C1_SRST_HC) && cnt-- ); + if(cnt<=0) { + DBG("BOOTBOOT-ERROR: failed to reset EMMC\n"); + return SD_ERROR; + } +#if SD_DEBUG + uart_puts("EMMC: reset OK\n"); +#endif + *EMMC_CONTROL1 |= C1_CLK_INTLEN | C1_TOUNIT_MAX; + delaym(10); + // Set clock to setup frequency. + if((r=sd_clk(400000))) return r; + *EMMC_INT_EN = 0xffffffff; + *EMMC_INT_MASK = 0xffffffff; + sd_scr[0]=sd_scr[1]=sd_rca=sd_err=0; + sd_cmd(CMD_GO_IDLE,0); + if(sd_err) return sd_err; + + sd_cmd(CMD_SEND_IF_COND,0x000001AA); + if(sd_err) return sd_err; + cnt=6; r=0; while(!(r&ACMD41_CMD_COMPLETE) && cnt--) { + delay(400); + r=sd_cmd(CMD_SEND_OP_COND,ACMD41_ARG_HC); +#if SD_DEBUG + uart_puts("EMMC: CMD_SEND_OP_COND returned "); + if(r&ACMD41_CMD_COMPLETE) + uart_puts("COMPLETE "); + if(r&ACMD41_VOLTAGE) + uart_puts("VOLTAGE "); + if(r&ACMD41_CMD_CCS) + uart_puts("CCS "); + uart_hex(r,8); + uart_putc('\n'); +#endif + if(sd_err!=SD_TIMEOUT && sd_err!=SD_OK ) { + DBG("BOOTBOOT-ERROR: EMMC ACMD41 returned error\n"); + return sd_err; + } + } + if(!(r&ACMD41_CMD_COMPLETE) || !cnt ) return SD_TIMEOUT; + if(!(r&ACMD41_VOLTAGE)) return SD_ERROR; + if(r&ACMD41_CMD_CCS) ccs=SCR_SUPP_CCS; + + sd_cmd(CMD_ALL_SEND_CID,0); + + sd_rca = sd_cmd(CMD_SEND_REL_ADDR,0); +#if SD_DEBUG + uart_puts("EMMC: CMD_SEND_REL_ADDR returned "); + uart_hex(sd_rca,8); + uart_putc('\n'); +#endif + if(sd_err) return sd_err; + + if((r=sd_clk(25000000))) return r; + + sd_cmd(CMD_CARD_SELECT,sd_rca); + if(sd_err) return sd_err; + + if(sd_status(SR_DAT_INHIBIT)) return SD_TIMEOUT; + *EMMC_BLKSIZECNT = (1<<16) | 8; + sd_cmd(CMD_SEND_SCR,0); + if(sd_err) return sd_err; + if(sd_int(INT_READ_RDY)) return SD_TIMEOUT; + + r=0; cnt=100000; while(r<2 && cnt) { + if( *EMMC_STATUS & SR_READ_AVAILABLE ) + sd_scr[r++] = *EMMC_DATA; + else + delaym(1); + } + if(r!=2) return SD_TIMEOUT; + if(sd_scr[0] & SCR_SD_BUS_WIDTH_4) { + sd_cmd(CMD_SET_BUS_WIDTH,sd_rca|2); + if(sd_err) return sd_err; + *EMMC_CONTROL0 |= C0_HCTL_DWITDH; + } + // add software flag +#ifdef SD_DEBUG + uart_puts("EMMC: supports "); + if(sd_scr[0] & SCR_SUPP_SET_BLKCNT) + uart_puts("SET_BLKCNT "); + if(ccs) + uart_puts("CCS "); + uart_putc('\n'); +#endif + sd_scr[0]&=~SCR_SUPP_CCS; + sd_scr[0]|=ccs; + return SD_OK; +} + +// comment out this include if you don't want FS/Z support +#include "../../osZ/etc/include/fsZ.h" +// get filesystem drivers for initrd +#include "fs.h" + +/*** other defines and structs ***/ +#define COREMMIO_BASE 0xFFFFFFFFF8000000 + +typedef struct { + uint32_t type[4]; + uint8_t uuid[16]; + uint64_t start; + uint64_t end; + uint64_t flags; + uint8_t name[72]; +} efipart_t; + +typedef struct { + char jmp[3]; + char oem[8]; + uint16_t bps; + uint8_t spc; + uint16_t rsc; + uint8_t nf; + uint16_t nr; + uint16_t ts16; + uint8_t media; + uint16_t spf16; + uint16_t spt; + uint16_t nh; + uint32_t hs; + uint32_t ts32; + uint32_t spf32; + uint32_t flg; + uint32_t rc; + char vol[6]; + char fst[8]; + char dmy[20]; + char fst2[8]; +} __attribute__((packed)) bpb_t; + +typedef struct { + char name[8]; + char ext[3]; + char attr[9]; + uint16_t ch; + uint32_t attr2; + uint16_t cl; + uint32_t size; +} __attribute__((packed)) fatdir_t; + +typedef struct { + uint32_t magic; + uint32_t version; + uint32_t headersize;/* offset of bitmaps in file */ + uint16_t flags; /* original PSF2 has 32 bit flags */ + uint8_t hotspot_x; /* addition to OS/Z */ + uint8_t hotspot_y; + uint32_t numglyph; + uint32_t bytesperglyph; + uint32_t height; + uint32_t width; + uint8_t glyphs; +} __attribute__((packed)) font_t; + +extern volatile unsigned char _binary_font_psf_start; + +/*** common variables ***/ +file_t env; // environment file descriptor +file_t initrd; // initrd file descriptor +file_t core; // kernel file descriptor +BOOTBOOT *bootboot; // the BOOTBOOT structure + +// default environment variables. M$ states that 1024x768 must be supported +int reqwidth = 1024, reqheight = 768; +char *kernelname="sys/core"; +unsigned char *kne; + +// alternative environment name +char *cfgname="sys/config"; + +/* current cursor position */ +int kx, ky; +/* maximum coordinates */ +int maxx, maxy; + +/** + * Get a linear frame buffer + */ +int GetLFB(uint32_t width, uint32_t height) +{ + font_t *font = (font_t*)&_binary_font_psf_start; + + //query natural width, height if not given + if(width==0 && height==0) { + mbox[0] = 8*4; + mbox[1] = MBOX_REQUEST; + mbox[2] = 0x40003; //get phy wh + mbox[3] = 8; + mbox[4] = 8; + mbox[5] = 0; + mbox[6] = 0; + mbox[7] = 0; + if(mbox_call(MBOX_CH_PROP,mbox) && mbox[5]!=0) { + width=mbox[5]; + height=mbox[6]; + } + } + //if we already have a framebuffer, release it + if(bootboot->fb_ptr!=NULL) { + mbox[0] = 8*4; + mbox[1] = MBOX_REQUEST; + mbox[2] = 0x48001; //release buffer + mbox[3] = 8; + mbox[4] = 8; + mbox[5] = (uint32_t)(((uint64_t)bootboot->fb_ptr)); + mbox[6] = 0; + mbox[7] = 0; + mbox_call(MBOX_CH_PROP,mbox); + } + //check minimum resolution + if(width<640) width=640; + if(height<480) height=480; + + mbox[0] = 35*4; + mbox[1] = MBOX_REQUEST; + + mbox[2] = 0x48003; //set phy wh + mbox[3] = 8; + mbox[4] = 8; + mbox[5] = width; //FrameBufferInfo.width + mbox[6] = height; //FrameBufferInfo.height + + mbox[7] = 0x48004; //set virt wh + mbox[8] = 8; + mbox[9] = 8; + mbox[10] = width; //FrameBufferInfo.virtual_width + mbox[11] = height; //FrameBufferInfo.virtual_height + + mbox[12] = 0x48009; //set virt offset + mbox[13] = 8; + mbox[14] = 8; + mbox[15] = 0; //FrameBufferInfo.x_offset + mbox[16] = 0; //FrameBufferInfo.y.offset + + mbox[17] = 0x48005; //set depth + mbox[18] = 4; + mbox[19] = 4; + mbox[20] = 32; //FrameBufferInfo.depth + + mbox[21] = 0x48006; //set pixel order + mbox[22] = 4; + mbox[23] = 4; + mbox[24] = 0; //RGB, not BGR preferably + + mbox[25] = 0x40001; //get framebuffer, gets alignment on request + mbox[26] = 8; + mbox[27] = 8; + mbox[28] = PAGESIZE; //FrameBufferInfo.pointer + mbox[29] = 0; //FrameBufferInfo.size + + mbox[30] = 0x40008; //get pitch + mbox[31] = 4; + mbox[32] = 4; + mbox[33] = 0; //FrameBufferInfo.pitch + + mbox[34] = 0; //Arnold Schwarzenegger + + if(mbox_call(MBOX_CH_PROP,mbox) && mbox[20]==32 && mbox[27]==(MBOX_RESPONSE|8) && mbox[28]!=0) { + mbox[28]&=0x3FFFFFFF; + bootboot->fb_width=mbox[5]; + bootboot->fb_height=mbox[6]; + bootboot->fb_scanline=mbox[33]; + bootboot->fb_ptr=(void*)((uint64_t)mbox[28]); + bootboot->fb_size=mbox[29]; + bootboot->fb_type=mbox[24]?FB_ABGR:FB_ARGB; + kx=ky=0; + maxx=bootboot->fb_width/(font->width+1); + maxy=bootboot->fb_height/font->height; + return 1; + } + return 0; +} + +/** + * display one literal unicode character + */ +void putc(char c) +{ + font_t *font = (font_t*)&_binary_font_psf_start; + unsigned char *glyph = (unsigned char*)&_binary_font_psf_start + + font->headersize + (c>0&&cnumglyph?c:0)*font->bytesperglyph; + int offs = (ky * font->height * bootboot->fb_scanline) + (kx * (font->width+1) * 4); + int x,y, line,mask; + int bytesperline=(font->width+7)/8; + if(c=='\r') { + kx=0; + } else + if(c=='\n') { + kx=0; ky++; + } else { + for(y=0;yheight;y++){ + line=offs; + mask=1<<(font->width-1); + for(x=0;xwidth;x++){ + *((uint32_t*)((uint64_t)bootboot->fb_ptr + line))=((int)*glyph) & (mask)?color:0; + mask>>=1; + line+=4; + } + *((uint32_t*)((uint64_t)bootboot->fb_ptr + line))=0; + glyph+=bytesperline; + offs+=bootboot->fb_scanline; + } + kx++; + if(kx>=maxx) { + kx=0; ky++; + } + } + // send it to serial too + uart_putc(c); +} + +/** + * display a string + */ +void puts(char *s) { while(*s) putc(*s++); } + +void ParseEnvironment(uint8_t *env) +{ + uint8_t *end=env+PAGESIZE; + DBG(" * Environment\n"); + env--; env[PAGESIZE]=0; kne=NULL; + while(env0 && !(*AUX_MU_LSR&0x01)); +#else + r=(char)(*UART0_DR);do{asm volatile("nop");}while(--mp>0 && *UART0_FR&0x10); +#endif + if(mp>0) { + // we got response from raspbootcom + sp=uart_getc(); + sp|=uart_getc()<<8; sp|=uart_getc()<<16; sp|=uart_getc()<<24; + if(sp>0 && sp127) np=127; + // read GPT entries + r=sd_readblock(*((uint32_t*)((char*)&__diskbuf+72)),(unsigned char*)&__diskbuf,(np*sp+511)/512); + if(r==0) goto diskerr; + part=NULL; + // first, look for a partition with bootable flag + for(r=0;rtype[0]==0 && part->type[1]==0 && part->type[2]==0 && part->type[3]==0) || part->start==0) { + r=np; + break; + } + // EFI_PART_USED_BY_OS? + if(part->flags&4) break; + } + // if none, look for specific partition types + if(part==NULL || r>=np) { + for(r=0;rtype[0]==0 && part->type[1]==0 && part->type[2]==0 && part->type[3]==0) || part->start==0) { + r=np; + break; + } + // ESP? + if((part->type[0]==0xC12A7328 && part->type[1]==0x11D2F81F) || + // or OS/Z root partition for this architecture? + (part->type[0]==0x5A2F534F && (part->type[1]&0xFFFF)==0xAA64 && part->type[3]==0x746F6F72)) + break; + } + } + if(part==NULL || r>=np) goto diskerr; + r=sd_readblock(part->start,(unsigned char*)&_end,1); + if(r==0) goto diskerr; + initrd.ptr=NULL; initrd.size=0; + // wait keypress with timeout + mp=50; +#if CONSOLE == UART1 + r=(char)(*AUX_MU_IO);do{delaym(5);}while(--mp>0 && !(*AUX_MU_LSR&0x01)); +#else + r=(char)(*UART0_DR);do{delaym(5);}while(--mp>0 && *UART0_FR&0x10); +#endif + if(mp!=0) { + puts(" * Backup initrd\n"); + bkp=1; + } + //is it a FAT partition? + bpb=(bpb_t*)&_end; + if(!memcmp((void*)bpb->fst,"FAT16",5) || !memcmp((void*)bpb->fst2,"FAT32",5)) { + // locate BOOTBOOT directory + uint32_t data_sec, root_sec, clu=0, s, s2; + fatdir_t *dir; + uint32_t *fat32=(uint32_t*)((uint8_t*)&_end+bpb->rsc*512); + uint16_t *fat16=(uint16_t*)fat32; + uint8_t *ptr; + data_sec=root_sec=((bpb->spf16?bpb->spf16:bpb->spf32)*bpb->nf)+bpb->rsc; + //WARNING gcc generates a code for bpb->nr that cause unaligned exception + s=*((uint32_t*)&bpb->nf); + s>>=8; + s&=0xFFFF; + s<<=5; + if(bpb->spf16>0) { + data_sec+=(s+511)>>9; + } else { + root_sec+=(bpb->rc-2)*bpb->spc; + } + // load fat table + r=sd_readblock(part->start+1,(unsigned char*)&_end+512,(bpb->spf16?bpb->spf16:bpb->spf32)+bpb->rsc); + if(r==0) goto diskerr; + pe=(uint8_t*)&_end+512+r; + // load root directory + r=sd_readblock(part->start+root_sec,(unsigned char*)pe,s/512+1); + dir=(fatdir_t*)pe; + while(dir->name[0]!=0 && memcmp(dir->name,"BOOTBOOT ",11)) dir++; + if(dir->name[0]!='B') goto diskerr; + r=sd_readblock(part->start+(dir->cl+(dir->ch<<16)-2)*bpb->spc+data_sec,(unsigned char*)pe,bpb->spc); + if(r==0) goto diskerr; + dir=(fatdir_t*)pe; + // locate environment and initrd + while(dir->name[0]!=0) { + if(!memcmp(dir->name,"CONFIG ",11)) { + s=dir->sizesize:PAGESIZE-1; + clu=dir->cl+(dir->ch<<16); + ptr=(void*)&__environment; + while(s>0) { + s2=s>bpb->spc*512?bpb->spc*512:s; + r=sd_readblock(part->start+(clu-2)*bpb->spc+data_sec,ptr,s2<512?1:s2/512); + clu=bpb->spf16>0?fat16[clu]:fat32[clu]; + ptr+=s2; + s-=s2; + } + clu=0; + } else + if(!memcmp(dir->name,bkp?"INITRD BAK":"INITRD ",11)) { + clu=dir->cl+(dir->ch<<16); + initrd.size=dir->size; + } + dir++; + } + // if initrd not found, try architecture specific name + if(clu==0) { + dir=(fatdir_t*)pe; + while(dir->name[0]!=0) { + if(!memcmp(dir->name,"AARCH64 ",11)) { + clu=dir->cl+(dir->ch<<16); + initrd.size=dir->size; + break; + } + dir++; + } + } + // walk through cluster chain to load initrd + if(clu!=0 && initrd.size!=0) { + initrd.ptr=ptr=pe; + s=initrd.size; + while(s>0) { + s2=s>bpb->spc*512?bpb->spc*512:s; + r=sd_readblock(part->start+(clu-2)*bpb->spc+data_sec,ptr,s2<512?1:s2/512); + clu=bpb->spf16>0?fat16[clu]:fat32[clu]; + ptr+=s2; + s-=s2; + } + } + } else { + // initrd is on the entire partition + r=sd_readblock(part->start,(unsigned char*)&_end+512,part->end-part->start); + if(r==0) goto diskerr; + initrd.ptr=(uint8_t*)&_end; + initrd.size=r; + } +gotinitrd: + if(initrd.ptr==NULL || initrd.size==0) { + puts("BOOTBOOT-PANIC: INITRD not found\n"); + goto error; + } +#if INITRD_DEBUG + uart_puts("Initrd at ");uart_hex((uint64_t)initrd.ptr,4);uart_putc(' ');uart_hex(initrd.size,4);uart_putc('\n'); +#endif + // uncompress if it's compressed + if(initrd.ptr[0]==0x1F && initrd.ptr[1]==0x8B) { + unsigned char *addr,f; + volatile TINF_DATA d; + DBG(" * Gzip compressed initrd\n"); + // skip gzip header + addr=initrd.ptr+2; + if(*addr++!=8) goto gzerr; + f=*addr++; addr+=6; + if(f&4) { r=*addr++; r+=(*addr++ << 8); addr+=r; } + if(f&8) { while(*addr++ != 0); } + if(f&16) { while(*addr++ != 0); } + if(f&2) addr+=2; + d.source = addr; + memcpy((void*)&d.destSize,initrd.ptr+initrd.size-4,4); + // decompress + d.bitcount = 0; + d.bfinal = 0; + d.btype = -1; + d.curlen = 0; + if((uint8_t*)&_end+d.destSizeinitrd_ptr=(uint64_t)&_end; + // round up to page size + bootboot->initrd_size=(initrd.size+PAGESIZE-1)&~(PAGESIZE-1); + DBG(" * Initrd loaded\n"); +#if INITRD_DEBUG + // dump initrd in memory + uart_dump((void*)bootboot->initrd_ptr,8); +#endif + + // if no config, locate it in uncompressed initrd + if(*((uint8_t*)&__environment)==0) { + r=0; env.ptr=NULL; + while(env.ptr==NULL && fsdrivers[r]!=NULL) { + env=(*fsdrivers[r++])((unsigned char*)bootboot->initrd_ptr,cfgname); + } + if(env.ptr!=NULL) + memcpy((void*)&__environment,(void*)(env.ptr),env.sizeinitrd_ptr,kernelname); + } + if(kne!=NULL) + *kne='\n'; + // scan for the first executable + if(core.ptr==NULL || core.size==0) { + DBG(" * Autodetecting kernel\n"); + core.size=0; + r=bootboot->initrd_size; + core.ptr=(uint8_t*)bootboot->initrd_ptr; + while(r-->0) { + Elf64_Ehdr *ehdr=(Elf64_Ehdr *)(core.ptr); + pe_hdr *pehdr=(pe_hdr*)(core.ptr + ((mz_hdr*)(core.ptr))->peaddr); + if((!memcmp(ehdr->e_ident,ELFMAG,SELFMAG)||!memcmp(ehdr->e_ident,"OS/Z",4))&& + ehdr->e_ident[EI_CLASS]==ELFCLASS64&& + ehdr->e_ident[EI_DATA]==ELFDATA2LSB&& + ehdr->e_machine==EM_AARCH64&& + ehdr->e_phnum>0){ + core.size=1; + break; + } + if(((mz_hdr*)(core.ptr))->magic==MZ_MAGIC && pehdr->magic == PE_MAGIC && + pehdr->machine == IMAGE_FILE_MACHINE_ARM64 && pehdr->file_type == PE_OPT_MAGIC_PE32PLUS) { + core.size=1; + break; + } + core.ptr++; + } + } + if(core.ptr==NULL || core.size==0) { + puts("BOOTBOOT-PANIC: Kernel not found in initrd\n"); + goto error; + } else { + Elf64_Ehdr *ehdr=(Elf64_Ehdr *)(core.ptr); + pe_hdr *pehdr=(pe_hdr*)(core.ptr + ((mz_hdr*)(core.ptr))->peaddr); + if((!memcmp(ehdr->e_ident,ELFMAG,SELFMAG)||!memcmp(ehdr->e_ident,"OS/Z",4))&& + ehdr->e_ident[EI_CLASS]==ELFCLASS64&& + ehdr->e_ident[EI_DATA]==ELFDATA2LSB&& + ehdr->e_machine==EM_AARCH64&& + ehdr->e_phnum>0){ + DBG(" * Parsing ELF64\n"); + Elf64_Phdr *phdr=(Elf64_Phdr *)((uint8_t *)ehdr+ehdr->e_phoff); + for(r=0;re_phnum;r++){ + if(phdr->p_type==PT_LOAD && phdr->p_vaddr>>48==0xffff) { + core.ptr += phdr->p_offset; + // hack to keep symtab and strtab for shared libraries + core.size = phdr->p_filesz + (ehdr->e_type==3?0x4000:0); + bss = phdr->p_memsz - core.size; + entrypoint = ehdr->e_entry; + break; + } + phdr=(Elf64_Phdr *)((uint8_t *)phdr+ehdr->e_phentsize); + } + } else + if(((mz_hdr*)(core.ptr))->magic==MZ_MAGIC && pehdr->magic == PE_MAGIC && + pehdr->machine == IMAGE_FILE_MACHINE_ARM64 && pehdr->file_type == PE_OPT_MAGIC_PE32PLUS && + (int64_t)pehdr->code_base>>48==0xffff) { + DBG(" * Parsing PE32+\n"); + core.size = (pehdr->entry_point-pehdr->code_base) + pehdr->text_size + pehdr->data_size; + bss = pehdr->bss_size; + entrypoint = (int64_t)pehdr->entry_point; + } + } +#if EXEC_DEBUG + uart_puts("Executable size "); + uart_hex((uint64_t)core.size,4); + uart_puts(" bss "); + uart_hex((uint64_t)bss,4); + uart_putc('\n'); + uart_dump((void*)core.ptr,4); +#endif + if(core.size<2 || entrypoint==0) { + puts("BOOTBOOT-PANIC: Kernel is not a valid executable\n"); + goto error; + } + // create core segment + memcpy((void*)(bootboot->initrd_ptr+bootboot->initrd_size), core.ptr, core.size); + core.ptr=(uint8_t*)(bootboot->initrd_ptr+bootboot->initrd_size); + if(bss>0) + memset(core.ptr + core.size, 0, bss); + core.size = (core.size+bss+PAGESIZE-1)&~(PAGESIZE-1); +#if EXEC_DEBUG + uart_puts("Core "); + uart_hex((uint64_t)core.ptr,4); + uart_puts(" to "); + uart_hex((uint64_t)core.ptr+core.size,4); + uart_putc('\n'); +#endif + + /* generate memory map to bootboot struct */ + DBG(" * Memory Map\n"); + mmap=(MMapEnt *)&bootboot->mmap; + + // everything before the bootboot struct is free + mmap->ptr=0; mmap->size=(uint64_t)&__bootboot | MMAP_FREE; + mmap++; bootboot->size+=sizeof(MMapEnt); + + // mark bss reserved + mmap->ptr=(uint64_t)&__bootboot; mmap->size=((uint64_t)&_end-(uint64_t)&__bootboot) | MMAP_USED; + mmap++; bootboot->size+=sizeof(MMapEnt); + + r=bootboot->initrd_size + core.size; + // after bss and before initrd is free + if(bootboot->initrd_ptr-(uint64_t)&_end) { + mmap->ptr=(uint64_t)&_end; mmap->size=(bootboot->initrd_ptr-(uint64_t)&_end) | MMAP_FREE; + mmap++; bootboot->size+=sizeof(MMapEnt); + // initrd is reserved (and add core's area to it) + mmap->ptr=bootboot->initrd_ptr; mmap->size=r | MMAP_USED; + mmap++; bootboot->size+=sizeof(MMapEnt); + } else { + mmap--; mmap->size+=r; mmap++; + } + r+=(uint32_t)bootboot->initrd_ptr; + + mbox[0]=8*4; + mbox[1]=0; + mbox[2]=0x10005; // get memory size + mbox[3]=8; + mbox[4]=0; + mbox[5]=0; + mbox[6]=0; + mbox[7]=0; + if(!mbox_call(MBOX_CH_PROP, mbox)) + // on failure (should never happen) assume 64Mb memory max + mbox[6]=64*1024*1024; + + // everything after initrd to the top of memory is free + mp=mbox[6]-r; + mmap->ptr=r; mmap->size=mp | MMAP_FREE; + mmap++; bootboot->size+=sizeof(MMapEnt); + + // MMIO area + mmap->ptr=MMIO_BASE; mmap->size=((uint64_t)0x40000000-MMIO_BASE) | MMAP_MMIO; + mmap++; bootboot->size+=sizeof(MMapEnt); + +#if MEM_DEBUG + /* dump memory map */ + mmap=(MMapEnt *)&bootboot->mmap; + for(r=128;rsize;r+=sizeof(MMapEnt)) { + uart_hex(MMapEnt_Ptr(mmap),8); + uart_putc(' '); + uart_hex(MMapEnt_Ptr(mmap)+MMapEnt_Size(mmap)-1,8); + uart_putc(' '); + uart_hex(MMapEnt_Type(mmap),1); + uart_putc(' '); + switch(MMapEnt_Type(mmap)) { + case MMAP_USED: uart_puts("reserved"); break; + case MMAP_FREE: uart_puts("free"); break; + case MMAP_ACPIFREE: uart_puts("acpifree"); break; + case MMAP_ACPINVS: uart_puts("acpinvs"); break; + case MMAP_MMIO: uart_puts("mmio"); break; + default: uart_puts("unknown"); break; + } + uart_putc('\n'); + mmap++; + } +#endif + + /* get linear framebuffer if requested resolution different than current */ + DBG(" * Screen VideoCore\n"); + if(reqwidth!=bootboot->fb_width || reqheight!=bootboot->fb_height) { + if(!GetLFB(reqwidth, reqheight)) { +viderr: + puts("BOOTBOOT-PANIC: VideoCore error, no framebuffer\n"); + goto error; + } + } + kx=ky=0; color=0xFFDD33; + + /* create MMU translation tables in __paging */ + paging=(uint64_t*)&__paging; + // TTBR0, identity L1 + paging[0]=(uint64_t)((uint8_t*)&__paging+2*PAGESIZE)|0b11|(3<<8)|(1<<10); //AF=1,Block=1,Present=1, SH=3 ISH, RO + // identity L2 + paging[2*512]=(uint64_t)((uint8_t*)&__paging+3*PAGESIZE)|0b11|(3<<8)|(1<<10); //AF=1,Block=1,Present=1 + // identity L2 2M blocks + mp>>=21; + np=MMIO_BASE>>21; + for(r=1;r<512;r++) + paging[2*512+r]=(uint64_t)(((uint64_t)r<<21))|0b01|(1<<10)|(r>=np?(2<<8)|(1<<2)|(1L<<54):(3<<8)); //device SH=2 OSH + // identity L3 + for(r=0;r<512;r++) + paging[3*512+r]=(uint64_t)(r*PAGESIZE)|0b11|(1<<10)|(r<0x80||r>(uint32_t)((uint64_t)&_data/PAGESIZE)?0:(1<<7)); + // TTBR1, core L1 + paging[512+511]=(uint64_t)((uint8_t*)&__paging+4*PAGESIZE)|0b11|(3<<8)|(1<<10); //AF=1,Block=1,Present=1 + // core L2 + // map MMIO in kernel space + for(r=0;r<32;r++) + paging[4*512+448+r]=(uint64_t)(MMIO_BASE+((uint64_t)r<<21))|0b01|(2<<8)|(1<<10)|(1<<2)|(1L<<54); //OSH, Attr=1, NX + // map framebuffer + for(r=0;r<28;r++) + paging[4*512+480+r]=(uint64_t)((uint8_t*)&__paging+(6+r)*PAGESIZE)|0b11|(2<<8)|(1<<10)|(2<<2)|(1L<<54); //OSH, Attr=2 + paging[4*512+511]=(uint64_t)((uint8_t*)&__paging+5*PAGESIZE)|0b11|(3<<8)|(1<<10);// pointer to core L3 + // core L3 + paging[5*512+0]=(uint64_t)((uint8_t*)&__bootboot)|0b11|(3<<8)|(1<<10)|(1L<<54); // p, b, AF, ISH + paging[5*512+1]=(uint64_t)((uint8_t*)&__environment)|0b11|(3<<8)|(1<<10)|(1L<<54); + for(r=0;r<(core.size/PAGESIZE);r++) + paging[5*512+2+r]=(uint64_t)((uint8_t *)core.ptr+(uint64_t)r*PAGESIZE)|0b11|(3<<8)|(1<<10); +#if MEM_DEBUG + reg=r; +#endif + paging[5*512+511]=(uint64_t)((uint8_t*)&__corestack)|0b11|(3<<8)|(1<<10)|(1L<<54); // core stack + // core L3 (lfb) + for(r=0;r<16*512;r++) + paging[6*512+r]=(uint64_t)((uint8_t*)bootboot->fb_ptr+r*PAGESIZE)|0b11|(2<<8)|(1<<10)|(2<<2)|(1L<<54); //map framebuffer + +#if MEM_DEBUG + /* dump page translation tables */ + uart_puts("\nTTBR0\n L1 "); + uart_hex((uint64_t)&__paging,8); + uart_puts("\n "); + uart_hex((uint64_t)paging[0],8); + uart_puts(" ...\n L2 "); + uart_hex((uint64_t)&paging[2*512],8); + uart_puts("\n "); + for(r=0;r<4;r++) { uart_hex(paging[2*512+r],8); uart_putc(' '); } + uart_puts("...\n ... "); + for(r=mp-4;r0D7#>_KR}4bsa4{l9ij>P897`AyNSU9IYDvN-#T4cWA-F-duJC{G54fL@ zbcRKSsZ2^0kr1w|CInT73$wcC{TS^A?#0^Ocb@nAWBljmHB10uHuk&-tTrh=e)ws&!OD& zIEIK5^uV;cAqPZ!>YLZE8&T)Oo2%>Vs~g29qhEiU-GXLf!8ai9;6V6SzrQL$XZt(h z&)=WF2YuY#w{qaz+VA{Y-GAtCq&H0R97LTP}vkkfS*({VNnjTr}Y#bM;bqUfqI81m+h>gY@@8Zx*QlcZQH7K zK7Ag#@Vv*zRTX1)k7G11R(<<=LH8K`*G8P>6EwU3UbcBQLcDrdc zzA+V~qku&I5fcz;;va?g%@P^5OI=X&5D09V@E~~Cy!$l!RKIJqUdq??exScisd*th zd180!kA{!Q3qIj#==c2|u4Xehy%&66Gadb4RA`6UDj_MD1UD@KOKcBz-DPA(or1q5ydEtm(tybNSpz)=EZHy?o@Kj5#f#%<( zOKRRS&!3ldDNDr-Zm_fJ^mt!+Ss!Z|r*4Yf|9RrJEz9A>qB1iZkNaxw>YA#JAvjuy z2?LPpcM4Ad;=11?6cd&p<5l=jbC0yXz^5dB8!cbqupg#mU+as}tcLwB3NykwfKV4G zLtX|zrootdirfid*FSZ_SECSIZE); + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || memcmp(sb->magic,FSZ_MAGIC,4) || kernel==NULL){ + return ret; + } + DBG(" * FS/Z "); + DBG(kernel); + DBG("\n"); + // Get the inode + int i,ss=1<<(sb->logsec+11); + char *s,*e; + s=e=kernel; + i=0; +again: + while(*e!='/'&&*e!=0){e++;} + if(*e=='/'){e++;} + if(!memcmp(in->magic,FSZ_IN_MAGIC,4)){ + //is it inlined? + if(!memcmp(in->inlinedata,FSZ_DIR_MAGIC,4)){ + ent=(FSZ_DirEnt *)(in->inlinedata); + } else if(!memcmp(initrd_p+in->sec*ss,FSZ_DIR_MAGIC,4)){ + // go, get the sector pointed + ent=(FSZ_DirEnt *)(initrd_p+in->sec*ss); + } else { + return ret; + } + //skip header + FSZ_DirEntHeader *hdr=(FSZ_DirEntHeader *)ent; ent++; + //iterate on directory entries + int j=hdr->numentries; + while(j-->0){ + if(!memcmp(ent->name,s,e-s)) { + if(*e==0) { + i=ent->fid; + break; + } else { + s=e; + in=(FSZ_Inode *)(initrd_p+ent->fid*ss); + goto again; + } + } + ent++; + } + } else { + i=0; + } + if(i!=0) { + // fid -> inode ptr -> data ptr + FSZ_Inode *in=(FSZ_Inode *)(initrd_p+i*ss); + if(!memcmp(in->magic,FSZ_IN_MAGIC,4)){ + ret.size=in->size; + switch(FSZ_FLAG_TRANSLATION(in->flags)) { + case FSZ_IN_FLAG_INLINE: + // inline data + ret.ptr=(uint8_t*)(initrd_p+i*ss+1024); + break; + case FSZ_IN_FLAG_SECLIST: + case FSZ_IN_FLAG_SDINLINE: + // sector directory or list inlined + ret.ptr=(uint8_t*)(initrd_p + *((uint64_t*)&in->inlinedata) * ss); + break; + case FSZ_IN_FLAG_DIRECT: + // direct data + ret.ptr=(uint8_t*)(initrd_p + in->sec * ss); + break; + // sector directory (only one level supported here, and no holes in files) + case FSZ_IN_FLAG_SECLIST0: + case FSZ_IN_FLAG_SD: + ret.ptr=(uint8_t*)(initrd_p + (unsigned int)(((FSZ_SectorList *)(initrd_p+in->sec*ss))->sec) * ss); + break; + default: + ret.size=0; + break; + } + } + } + return ret; +} +#endif + +/** + * cpio archive + */ +file_t cpio_initrd(unsigned char *initrd_p, char *kernel) +{ + unsigned char *ptr=initrd_p; + int k; + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || kernel==NULL || + (memcmp(initrd_p,"070701",6) && memcmp(initrd_p,"070702",6) && memcmp(initrd_p,"070707",6))) + return ret; + DBG(" * cpio "); + DBG(kernel); + DBG("\n"); + k=strlen((unsigned char*)kernel); + // hpodc archive + while(!memcmp(ptr,"070707",6)){ + int ns=oct2bin(ptr+8*6+11,6); + int fs=oct2bin(ptr+8*6+11+6,11); + if(!memcmp(ptr+9*6+2*11,kernel,k+1)){ + ret.size=fs; + ret.ptr=(uint8_t*)(ptr+9*6+2*11+ns); + return ret; + } + ptr+=(76+ns+fs); + } + // newc and crc archive + while(!memcmp(ptr,"07070",5)){ + int fs=hex2bin(ptr+8*6+6,8); + int ns=hex2bin(ptr+8*11+6,8); + if(!memcmp(ptr+110,kernel,k+1)){ + ret.size=fs; + ret.ptr=(uint8_t*)(ptr+((110+ns+3)/4)*4); + return ret; + } + ptr+=((110+ns+3)/4)*4 + ((fs+3)/4)*4; + } + return ret; +} + +/** + * ustar tarball archive + */ +file_t tar_initrd(unsigned char *initrd_p, char *kernel) +{ + unsigned char *ptr=initrd_p; + int k; + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || kernel==NULL || memcmp(initrd_p+257,"ustar",5)) + return ret; + DBG(" * tar "); + DBG(kernel); + DBG("\n"); + k=strlen((unsigned char*)kernel); + while(!memcmp(ptr+257,"ustar",5)){ + int fs=oct2bin(ptr+0x7c,11); + if(!memcmp(ptr,kernel,k+1)){ + ret.size=fs; + ret.ptr=(uint8_t*)(ptr+512); + return ret; + } + ptr+=(((fs+511)/512)+1)*512; + } + return ret; +} + +/** + * Simple File System + */ +file_t sfs_initrd(unsigned char *initrd_p, char *kernel) +{ + unsigned char *ptr, *end; + int k,bs,ver; + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || kernel==NULL || (memcmp(initrd_p+0x1AC,"SFS",3) && memcmp(initrd_p+0x1A6,"SFS",3))) + return ret; + // 1.0 Brendan's version, 1.10 BenLunt's version + ver=!memcmp(initrd_p+0x1A6,"SFS",3)?10:0; + bs=1<<(7+(uint8_t)initrd_p[ver?0x1B6:0x1BC]); + end=initrd_p + *((uint64_t *)&initrd_p[ver?0x1AA:0x1B0]) * bs; // base + total_number_of_blocks * blocksize + // get index area + ptr=end - *((uint64_t *)&initrd_p[ver?0x19E:0x1A4]); // end - size of index area + // got a Starting Marker Entry? + if(ptr[0]!=2) + return ret; + DBG(" * SFS 1."); + DBG(ver?"10":"0"); + DBG(kernel); + DBG("\n"); + k=strlen((unsigned char*)kernel); + // iterate on index until we reach the end or Volume Identifier + while(ptr>3; diff --git a/aarch64-rpi/mkboot.c b/aarch64-rpi/mkboot.c new file mode 100644 index 0000000..237725a --- /dev/null +++ b/aarch64-rpi/mkboot.c @@ -0,0 +1,112 @@ +/* + * aarch64-rpi/mkboot.c + * + * Copyright (C) 2017 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the BOOTBOOT Protocol package. + * @brief Little tool to create a RPi compatible MBR for ESP + * + */ + +#include +#include +#include +#include +#include + +/* entry point */ +int main(int argc, char** argv) +{ + // variables + unsigned char data[65536]; + unsigned int np,sp,i,es,ee; + int f; + + // check arguments + if(argc < 2) { + printf( "BOOTBOOT mkboot utility - bztsrc@gitlab\n\nUsage:\n" + " ./mkboot \n\n" + "Maps GPT EFI System Partition into MBR so that Raspberry Pi 3\n" + "firmware can find it's files and boot from it.\n" + "Examples:\n" + " ./mkboot diskimage.dd - modify a disk image file\n" + " ./mkboot /dev/sda - modify a real disk\n"); + return 1; + } + // open file + f = open(argv[1], O_RDONLY); + if(f < 0) { + fprintf(stderr, "mkboot: file not found\n"); + return 2; + } + // read the partitioning tables + if(read(f, data, 65536)==-1) { + close(f); + fprintf(stderr, "mkboot: unable to read file\n"); + return 2; + } + close(f); + if(memcmp((void*)&data[512], "EFI PART", 8)) { + fprintf(stderr, "mkboot: GPT partitioning table not found\n"); + return 2; + } + // get number of partitions and size of partition entry + np=*((unsigned int*)&data[512+80]); sp=*((unsigned int*)&data[512+84]); + i=*((unsigned int*)&data[512+72])*512; es=ee=0; + // get esp start and esp end sectors + while(np--) { + if(*((unsigned int*)&data[i])==0xC12A7328 && *((unsigned int*)&data[i+4])==0x11D2F81F) { + es=*((unsigned int*)&data[i+32]); ee=*((unsigned int*)&data[i+40]); break; + } + i+=sp; + } + if(es==0 || ee==0 || ee + * minor modifications for BOOTBOOT: 2017 bzt (bztsrc@gitlab) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../bootboot.h" + +#define BUF_SIZE 65536 + +struct termios old_tio, new_tio; + +void do_exit(int fd, int res) { + // close FD + if (fd != -1) close(fd); + // restore settings for STDIN_FILENO + if (isatty(STDIN_FILENO)) { + tcsetattr(STDIN_FILENO,TCSANOW,&old_tio); + } + exit(res); +} + +// open serial connection +int open_serial(const char *dev) { + // The termios structure, to be configured for serial interface. + struct termios termios; + + // Open the device, read/write, not the controlling tty, and non-blocking I/O + int fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); + if (fd == -1) { + // failed to open + return -1; + } + // must be a tty + if (!isatty(fd)) { + fprintf(stderr, "%s is not a tty\n", dev); + do_exit(fd, EXIT_FAILURE); + } + + // Get the attributes. + if(tcgetattr(fd, &termios) == -1) + { + perror("Failed to get attributes of device"); + do_exit(fd, EXIT_FAILURE); + } + + // So, we poll. + termios.c_cc[VTIME] = 0; + termios.c_cc[VMIN] = 0; + + // 8N1 mode, no input/output/line processing masks. + termios.c_iflag = 0; + termios.c_oflag = 0; + termios.c_cflag = CS8 | CREAD | CLOCAL; + termios.c_lflag = 0; + + // Set the baud rate. + if((cfsetispeed(&termios, B115200) < 0) || + (cfsetospeed(&termios, B115200) < 0)) + { + perror("Failed to set baud-rate"); + do_exit(fd, EXIT_FAILURE); + } + + // Write the attributes. + if (tcsetattr(fd, TCSAFLUSH, &termios) == -1) { + perror("tcsetattr()"); + do_exit(fd, EXIT_FAILURE); + } + return fd; +} + +// send initrd to rpi +void send_initrd(int fd, const char *file) { + int file_fd; + off_t off; + uint32_t size; + ssize_t pos, total=0; + char *p; + int done = 0; + + // Set fd blocking + if (fcntl(fd, F_SETFL, 0) == -1) { + perror("fcntl()"); + do_exit(fd, EXIT_FAILURE); + } + + // Open file. If not found, simply continue with terminal + if (file==NULL || file[0]==0 || (file_fd = open(file, O_RDONLY)) == -1) { + return; + } + + // Get initrd size + off = lseek(file_fd, 0L, SEEK_END); + if (off >= INITRD_MAXSIZE*1024*1024) { + fprintf(stderr, "initrd too big\n"); + close(file_fd); + return; + } + // empty file + if (off == 0) { + close(file_fd); + return; + } + size = htole32(off); + lseek(file_fd, 0L, SEEK_SET); + + fprintf(stderr, "### sending initrd %s [%zu byte]\n", file, (size_t)off); + + // send initrd size to RPi + p = (char*)&size; + pos = 0; + while(pos < 4) { + ssize_t len = write(fd, &p[pos], 4 - pos); + if (len == -1) { + perror("write()"); + do_exit(fd, EXIT_FAILURE); + } + pos += len; + } + // wait for OK + char ok_buf[2]; + p = ok_buf; + pos = 0; + while(pos < 2) { + ssize_t len = read(fd, &p[pos], 2 - pos); + if (len == -1) { + perror("read()"); + do_exit(fd, EXIT_FAILURE); + } + pos += len; + } + if (ok_buf[0] != 'O' || ok_buf[1] != 'K') { + fprintf(stderr, "error after sending size\n"); + close(file_fd); + return; + } + + while(!done) { + char buf[BUF_SIZE]; + ssize_t pos = 0; + ssize_t len = read(file_fd, buf, BUF_SIZE); + switch(len) { + case -1: + perror("read()"); + close(file_fd); + return; + case 0: + done = 1; + } + while(len > 0) { + ssize_t len2 = write(fd, &buf[pos], len); + if (len2 == -1) { + perror("write()"); + do_exit(fd, EXIT_FAILURE); + } + len -= len2; + pos += len2; + total += len2; + fprintf(stderr,"%3d%% %d / %d\r",total*100/off, total, off); + } + } + close(file_fd); + + // Set fd non-blocking + if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) { + perror("fcntl()"); + do_exit(fd, EXIT_FAILURE); + } + + fprintf(stderr, "### finished sending\n"); + + return; +} + +int main(int argc, char *argv[]) { + int fd, max_fd = STDIN_FILENO; + fd_set rfds, wfds, efds; + char buf[BUF_SIZE]; + size_t start = 0; + size_t end = 0; + int done = 0, leave = 0; + int breaks = 0; + + printf("Raspbootcom V1.0 - BOOTBOOT version\n\n"); + + if (argc < 2) { + printf("USAGE: %s [file]\n", argv[0]); + printf("Example: %s /dev/ttyUSB0 BOOTBOOT/INITRD\n", argv[0]); + exit(EXIT_FAILURE); + } + + // Set STDIN non-blocking and unbuffered + if (fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK) == -1) { + perror("fcntl()"); + exit(EXIT_FAILURE); + } + if (isatty(STDIN_FILENO)) { + // get the terminal settings for stdin + if (tcgetattr(STDIN_FILENO, &old_tio) == -1) { + perror("tcgetattr"); + exit(EXIT_FAILURE); + } + + // we want to keep the old setting to restore them a the end + new_tio=old_tio; + + // disable canonical mode (buffered i/o) and local echo + new_tio.c_lflag &= (~ICANON & ~ECHO); + + // set the new settings immediately + if (tcsetattr(STDIN_FILENO, TCSANOW, &new_tio) == -1) { + perror("tcsetattr()"); + do_exit(-1, EXIT_FAILURE); + } + } + + while(!leave) { + // Open device + if ((fd = open_serial(argv[1])) == -1) { + // udev takes a while to change ownership + // so sometimes one gets EPERM + if (errno == ENOENT || errno == ENODEV || errno == EACCES) { + fprintf(stderr, "\r### Waiting for %s...\r", argv[1]); + sleep(1); + continue; + } + perror(argv[1]); + do_exit(fd, EXIT_FAILURE); + } + fprintf(stderr, "### Listening on %s \n", argv[1]); + + // select needs the largeds FD + 1 + if (fd > STDIN_FILENO) { + max_fd = fd + 1; + } else { + max_fd = STDIN_FILENO + 1; + } + + done = 0; + start = end = 0; + while(!done || start != end) { + // Watch stdin and dev for input. + FD_ZERO(&rfds); + if (!done && end < BUF_SIZE) FD_SET(STDIN_FILENO, &rfds); + FD_SET(fd, &rfds); + + // Watch fd for output if needed. + FD_ZERO(&wfds); + if (start != end) FD_SET(fd, &wfds); + + // Watch stdin and dev for error. + FD_ZERO(&efds); + FD_SET(STDIN_FILENO, &efds); + FD_SET(fd, &efds); + + // Wait for something to happend + if (select(max_fd, &rfds, &wfds, &efds, NULL) == -1) { + perror("select()"); + do_exit(fd, EXIT_FAILURE); + } else { + // check for errors + if (FD_ISSET(STDIN_FILENO, &efds)) { + fprintf(stderr, "error on STDIN\n"); + do_exit(fd, EXIT_FAILURE); + } + if (FD_ISSET(fd, &efds)) { + fprintf(stderr, "error on device\n"); + do_exit(fd, EXIT_FAILURE); + } + // RPi is ready to recieve more data, send more + if (FD_ISSET(fd, &wfds)) { + ssize_t len = write(fd, &buf[start], end - start); + if (len == -1) { + perror("write()"); + do_exit(fd, EXIT_FAILURE); + } + start += len; + if (start == end) start = end = 0; + // shift buffer contents + if (end == BUF_SIZE) { + memmove(buf, &buf[start], end - start); + end -= start; + start = 0; + } + } + // input from the user, copy to RPi + if (FD_ISSET(STDIN_FILENO, &rfds)) { + ssize_t len = read(STDIN_FILENO, &buf[end], BUF_SIZE - end); + switch(len) { + case -1: + perror("read()"); + do_exit(fd, EXIT_FAILURE); + case 0: + done = 1; + leave = 1; + } + end += len; + } + // output from the RPi, copy to STDOUT + if (FD_ISSET(fd, &rfds)) { + char buf2[BUF_SIZE]; + ssize_t len = read(fd, buf2, BUF_SIZE); + switch(len) { + case -1: + perror("read()"); + do_exit(fd, EXIT_FAILURE); + case 0: + done = 1; + } + // scan output for tripple break (^C^C^C) + // send initrd on tripple break, otherwise output text + const char *p = buf2; + while(p < &buf2[len]) { + const char *q = index(p, '\x03'); + if (q == NULL) q = &buf2[len]; + if (p == q) { + ++breaks; + ++p; + if (breaks == 3) { + if (start != end) { + fprintf(stderr, "Discarding input after tripple break\n"); + start = end = 0; + } + if(argv[2]!=NULL) + send_initrd(fd, argv[2]); + breaks = 0; + } + } else { + while (breaks > 0) { + ssize_t len2 = write(STDOUT_FILENO, "\x03\x03\x03", breaks); + if (len2 == -1) { + perror("write()"); + do_exit(fd, EXIT_FAILURE); + } + breaks -= len2; + } + while(p < q) { + ssize_t len2 = write(STDOUT_FILENO, p, q - p); + if (len2 == -1) { + perror("write()"); + do_exit(fd, EXIT_FAILURE); + } + p += len2; + } + } + } + } + } + } + close(fd); + } + + do_exit(-1, EXIT_SUCCESS); +} diff --git a/aarch64-rpi/tinf.h b/aarch64-rpi/tinf.h new file mode 100644 index 0000000..3a1fe9d --- /dev/null +++ b/aarch64-rpi/tinf.h @@ -0,0 +1,120 @@ +/* + * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) + * + * Copyright (c) 2003 by Joergen Ibsen / Jibz + * All Rights Reserved + * http://www.ibsensoftware.com/ + * + * Copyright (c) 2014-2016 by Paul Sokolovsky + */ + +#ifndef TINF_H_INCLUDED +#define TINF_H_INCLUDED + +/* we don't have stdint.h */ +typedef signed char int8_t; +typedef short int int16_t; +typedef int int32_t; +typedef long int int64_t; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long int uint64_t; + +/* calling convention */ +#ifndef TINFCC + #ifdef __WATCOMC__ + #define TINFCC __cdecl + #else + #define TINFCC + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ok status, more data produced */ +#define TINF_OK 0 +/* end of compressed stream reached */ +#define TINF_DONE 1 +#define TINF_DATA_ERROR (-3) +#define TINF_CHKSUM_ERROR (-4) +#define TINF_DICT_ERROR (-5) + +/* checksum types */ +#define TINF_CHKSUM_NONE 0 +#define TINF_CHKSUM_ADLER 1 +#define TINF_CHKSUM_CRC 2 + +/* data structures */ + +typedef struct { + unsigned int table[16]; /* table of code length counts */ + unsigned int trans[288]; /* code -> symbol translation table */ +} TINF_TREE; + +struct TINF_DATA; +typedef struct TINF_DATA { + TINF_TREE ltree; /* dynamic length/symbol tree */ + TINF_TREE dtree; /* dynamic distance tree */ + const unsigned char *source; + /* If source above is NULL, this function will be used to read + next byte from source stream */ + unsigned char (*readSource)(volatile struct TINF_DATA *data); + + unsigned int tag; + unsigned int bitcount; + + /* Buffer start */ + unsigned char *destStart; + /* Buffer total size */ + unsigned int destSize; + /* Current pointer in buffer */ + unsigned char *dest; + /* Remaining bytes in buffer */ + unsigned int destRemaining; + + /* Accumulating checksum */ + unsigned int checksum; + unsigned int checksum_type; + + int btype; + int bfinal; + unsigned int curlen; + int lzOff; +} TINF_DATA; + +#define TINF_PUT(d, c) \ + { \ + *d->dest++ = c; \ + } + +unsigned char TINFCC uzlib_get_byte(volatile TINF_DATA *d); + +/* Decompression API */ + +void TINFCC uzlib_init(void); +void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen); +int TINFCC uzlib_uncompress(volatile TINF_DATA *d); +int TINFCC uzlib_uncompress_chksum(TINF_DATA *d); + +int TINFCC uzlib_zlib_parse_header(TINF_DATA *d); +int TINFCC uzlib_gzip_parse_header(TINF_DATA *d); + +/* Compression API */ + +void TINFCC uzlib_compress(void *data, const uint8_t *src, unsigned slen); + +/* Checksum API */ + +/* prev_sum is previous value for incremental computation, 1 initially */ +uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); +/* crc is previous value for incremental computation, 0xffffffff initially */ +uint32_t TINFCC uzlib_crc32(const void *data, unsigned int length, uint32_t crc); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* TINF_H_INCLUDED */ diff --git a/aarch64-rpi/tinflate.c b/aarch64-rpi/tinflate.c new file mode 100644 index 0000000..8508477 --- /dev/null +++ b/aarch64-rpi/tinflate.c @@ -0,0 +1,475 @@ +/* + * tinflate - tiny inflate + * + * Copyright (c) 2003 by Joergen Ibsen / Jibz + * All Rights Reserved + * http://www.ibsensoftware.com/ + * + * Copyright (c) 2014-2016 by Paul Sokolovsky + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be + * held liable for any damages arising from the use of + * this software. + * + * Permission is granted to anyone to use this software + * for any purpose, including commercial applications, + * and to alter it and redistribute it freely, subject to + * the following restrictions: + * + * 1. The origin of this software must not be + * misrepresented; you must not claim that you + * wrote the original software. If you use this + * software in a product, an acknowledgment in + * the product documentation would be appreciated + * but is not required. + * + * 2. Altered source versions must be plainly marked + * as such, and must not be misrepresented as + * being the original software. + * + * 3. This notice may not be removed or altered from + * any source distribution. + */ + +#include "tinf.h" + +uint32_t tinf_get_le_uint32(TINF_DATA *d); +uint32_t tinf_get_be_uint32(TINF_DATA *d); + +/* --------------------------------------------------- * + * -- uninitialized global data (static structures) -- * + * --------------------------------------------------- */ + +#ifdef RUNTIME_BITS_TABLES + +/* extra bits and base tables for length codes */ +unsigned char length_bits[30]; +unsigned short length_base[30]; + +/* extra bits and base tables for distance codes */ +unsigned char dist_bits[30]; +unsigned short dist_base[30]; + +#else + +const unsigned char length_bits[30] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, + 5, 5, 5, 5 +}; +const unsigned short length_base[30] = { + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, + 131, 163, 195, 227, 258 +}; + +const unsigned char dist_bits[30] = { + 0, 0, 0, 0, 1, 1, 2, 2, + 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, + 11, 11, 12, 12, 13, 13 +}; +const unsigned short dist_base[30] = { + 1, 2, 3, 4, 5, 7, 9, 13, + 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, + 4097, 6145, 8193, 12289, 16385, 24577 +}; + +#endif + +/* special ordering of code length codes */ +const unsigned char clcidx[] = { + 16, 17, 18, 0, 8, 7, 9, 6, + 10, 5, 11, 4, 12, 3, 13, 2, + 14, 1, 15 +}; + +/* ----------------------- * + * -- utility functions -- * + * ----------------------- */ + +#ifdef RUNTIME_BITS_TABLES +/* build extra bits and base tables */ +static void tinf_build_bits_base(unsigned char *bits, unsigned short *base, int delta, int first) +{ + int i, sum; + + /* build bits table */ + for (i = 0; i < delta; ++i) bits[i] = 0; + for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta; + + /* build base table */ + for (sum = first, i = 0; i < 30; ++i) + { + base[i] = sum; + sum += 1 << bits[i]; + } +} +#endif + +/* build the fixed huffman trees */ +static void tinf_build_fixed_trees(volatile TINF_TREE *lt, volatile TINF_TREE *dt) +{ + int i; + + /* build fixed length tree */ + for (i = 0; i < 7; ++i) lt->table[i] = 0; + + lt->table[7] = 24; + lt->table[8] = 152; + lt->table[9] = 112; + + for (i = 0; i < 24; ++i) lt->trans[i] = 256 + i; + for (i = 0; i < 144; ++i) lt->trans[24 + i] = i; + for (i = 0; i < 8; ++i) lt->trans[24 + 144 + i] = 280 + i; + for (i = 0; i < 112; ++i) lt->trans[24 + 144 + 8 + i] = 144 + i; + + /* build fixed distance tree */ + for (i = 0; i < 5; ++i) dt->table[i] = 0; + + dt->table[5] = 32; + + for (i = 0; i < 32; ++i) dt->trans[i] = i; +} + +/* given an array of code lengths, build a tree */ +static void tinf_build_tree(volatile TINF_TREE *t, const unsigned char *lengths, unsigned int num) +{ + unsigned short offs[16]; + unsigned int i, sum; + + /* clear code length count table */ + for (i = 0; i < 16; ++i) t->table[i] = 0; + + /* scan symbol lengths, and sum code length counts */ + for (i = 0; i < num; ++i) t->table[lengths[i]]++; + + t->table[0] = 0; + + /* compute offset table for distribution sort */ + for (sum = 0, i = 0; i < 16; ++i) + { + offs[i] = sum; + sum += t->table[i]; + } + + /* create code->symbol translation table (symbols sorted by code) */ + for (i = 0; i < num; ++i) + { + if (lengths[i]) t->trans[offs[lengths[i]]++] = i; + } +} + +/* ---------------------- * + * -- decode functions -- * + * ---------------------- */ + +unsigned char uzlib_get_byte(volatile TINF_DATA *d) +{ + if (d->source) { + return *d->source++; + } + return d->readSource(d); +} + +uint32_t tinf_get_le_uint32(TINF_DATA *d) +{ + uint32_t val = 0; + int i; + for (i = 4; i--;) { + val = val >> 8 | uzlib_get_byte(d) << 24; + } + return val; +} + +uint32_t tinf_get_be_uint32(TINF_DATA *d) +{ + uint32_t val = 0; + int i; + for (i = 4; i--;) { + val = val << 8 | uzlib_get_byte(d); + } + return val; +} + +/* get one bit from source stream */ +static int tinf_getbit(volatile TINF_DATA *d) +{ + unsigned int bit; + + /* check if tag is empty */ + if (!d->bitcount--) + { + /* load next tag */ + d->tag = uzlib_get_byte(d); + d->bitcount = 7; + } + + /* shift bit out of tag */ + bit = d->tag & 0x01; + d->tag >>= 1; + + return bit; +} + +/* read a num bit value from a stream and add base */ +static unsigned int tinf_read_bits(volatile TINF_DATA *d, int num, int base) +{ + unsigned int val = 0; + + /* read num bits */ + if (num) + { + unsigned int limit = 1 << (num); + unsigned int mask; + + for (mask = 1; mask < limit; mask *= 2) + if (tinf_getbit(d)) val += mask; + } + + return val + base; +} + +/* given a data stream and a tree, decode a symbol */ +static int tinf_decode_symbol(volatile TINF_DATA *d, volatile TINF_TREE *t) +{ + int sum = 0, cur = 0, len = 0; + + /* get more bits while code value is above sum */ + do { + + cur = 2*cur + tinf_getbit(d); + + ++len; + + sum += t->table[len]; + cur -= t->table[len]; + + } while (cur >= 0); + + return t->trans[sum + cur]; +} + +/* given a data stream, decode dynamic trees from it */ +static void tinf_decode_trees(volatile TINF_DATA *d, volatile TINF_TREE *lt, volatile TINF_TREE *dt) +{ + unsigned char lengths[288+32]; + unsigned int hlit, hdist, hclen; + unsigned int i, num, length; + + /* get 5 bits HLIT (257-286) */ + hlit = tinf_read_bits(d, 5, 257); + + /* get 5 bits HDIST (1-32) */ + hdist = tinf_read_bits(d, 5, 1); + + /* get 4 bits HCLEN (4-19) */ + hclen = tinf_read_bits(d, 4, 4); + + for (i = 0; i < 19; ++i) lengths[i] = 0; + + /* read code lengths for code length alphabet */ + for (i = 0; i < hclen; ++i) + { + /* get 3 bits code length (0-7) */ + unsigned int clen = tinf_read_bits(d, 3, 0); + + lengths[clcidx[i]] = clen; + } + + /* build code length tree, temporarily use length tree */ + tinf_build_tree(lt, lengths, 19); + + /* decode code lengths for the dynamic trees */ + for (num = 0; num < hlit + hdist; ) + { + int sym = tinf_decode_symbol(d, lt); + + switch (sym) + { + case 16: + /* copy previous code length 3-6 times (read 2 bits) */ + { + unsigned char prev = lengths[num - 1]; + for (length = tinf_read_bits(d, 2, 3); length; --length) + { + lengths[num++] = prev; + } + } + break; + case 17: + /* repeat code length 0 for 3-10 times (read 3 bits) */ + for (length = tinf_read_bits(d, 3, 3); length; --length) + { + lengths[num++] = 0; + } + break; + case 18: + /* repeat code length 0 for 11-138 times (read 7 bits) */ + for (length = tinf_read_bits(d, 7, 11); length; --length) + { + lengths[num++] = 0; + } + break; + default: + /* values 0-15 represent the actual code lengths */ + lengths[num++] = sym; + break; + } + } + + /* build dynamic trees */ + tinf_build_tree(lt, lengths, hlit); + tinf_build_tree(dt, lengths + hlit, hdist); +} + +/* ----------------------------- * + * -- block inflate functions -- * + * ----------------------------- */ + +/* given a stream and two trees, inflate a block of data */ +static int tinf_inflate_block_data(volatile TINF_DATA *d, volatile TINF_TREE *lt, volatile TINF_TREE *dt) +{ + if (d->curlen == 0) { + unsigned int offs; + int dist; + int sym = tinf_decode_symbol(d, lt); + //printf("huff sym: %02x\n", sym); + + /* literal byte */ + if (sym < 256) { + TINF_PUT(d, sym); + return TINF_OK; + } + + /* end of block */ + if (sym == 256) { + return TINF_DONE; + } + + /* substring from sliding dictionary */ + sym -= 257; + /* possibly get more bits from length code */ + d->curlen = tinf_read_bits(d, length_bits[sym], length_base[sym]); + + dist = tinf_decode_symbol(d, dt); + /* possibly get more bits from distance code */ + offs = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); + d->lzOff = -offs; + } + + /* copy next byte from dict substring */ + d->dest[0] = d->dest[d->lzOff]; + d->dest++; + d->curlen--; + return TINF_OK; +} + +/* inflate an uncompressed block of data */ +static int tinf_inflate_uncompressed_block(volatile TINF_DATA *d) +{ + if (d->curlen == 0) { + unsigned int length, invlength; + + /* get length */ + length = uzlib_get_byte(d) + 256 * uzlib_get_byte(d); + /* get one's complement of length */ + invlength = uzlib_get_byte(d) + 256 * uzlib_get_byte(d); + /* check length */ + if (length != (~invlength & 0x0000ffff)) return TINF_DATA_ERROR; + + /* increment length to properly return TINF_DONE below, without + producing data at the same time */ + d->curlen = length + 1; + + /* make sure we start next block on a byte boundary */ + d->bitcount = 0; + } + + if (--d->curlen == 0) { + return TINF_DONE; + } + + unsigned char c = uzlib_get_byte(d); + TINF_PUT(d, c); + return TINF_OK; +} + +/* ---------------------- * + * -- public functions -- * + * ---------------------- */ + +/* initialize global (static) data */ +void uzlib_init(void) +{ +#ifdef RUNTIME_BITS_TABLES + /* build extra bits and base tables */ + tinf_build_bits_base(length_bits, length_base, 4, 3); + tinf_build_bits_base(dist_bits, dist_base, 2, 1); + + /* fix a special case */ + length_bits[28] = 0; + length_base[28] = 258; +#endif +} + +/* inflate next byte of compressed stream */ +int uzlib_uncompress(volatile TINF_DATA *d) +{ + do { + int res; + + /* start a new block */ + if (d->btype == -1) { +next_blk: + /* read final block flag */ + d->bfinal = tinf_getbit(d); + /* read block type (2 bits) */ + d->btype = tinf_read_bits(d, 2, 0); + + //printf("Started new block: type=%d final=%d\n", d->btype, d->bfinal); + + if (d->btype == 1) { + /* build fixed huffman trees */ + tinf_build_fixed_trees(&d->ltree, &d->dtree); + } else if (d->btype == 2) { + /* decode trees from stream */ + tinf_decode_trees(d, &d->ltree, &d->dtree); + } + } + + /* process current block */ + switch (d->btype) + { + case 0: + /* decompress uncompressed block */ + res = tinf_inflate_uncompressed_block(d); + break; + case 1: + case 2: + /* decompress block with fixed/dyanamic huffman trees */ + /* trees were decoded previously, so it's the same routine for both */ + res = tinf_inflate_block_data(d, &d->ltree, &d->dtree); + break; + default: + return TINF_DATA_ERROR; + } + + if (res == TINF_DONE && !d->bfinal) { + /* the block has ended (without producing more data), but we + can't return without data, so start procesing next block */ + goto next_blk; + } + + if (res != TINF_OK) { + return res; + } + + } while (--d->destSize); + + return TINF_OK; +} diff --git a/boot.bin b/boot.bin new file mode 100644 index 0000000000000000000000000000000000000000..0c0f4b9cabed87ddfe5b8588529056d61afe1382 GIT binary patch literal 512 zcmaDIF~P~-KLmsss0)4>9_YKUhk-4ColpJ+14CT%yUahG&l}$}Fz#$%__TT_1LLQq zubSBy7&^q7*^jZcunQbxYh$-M#@5Ns(eSIGMzY~oOR@hJ$K9(!&k7fDH~tP?Rm%G9 zAY&=(K1cS~misoa@9$v`UkU^-f*3627&uDB8|;`lUX}`k?aOC>;l~iSkcESlo#X$5 ze{9X{4R+1!Ej6e1`Lc)YV`h6{zz`R<&w~Ah21DEn6^4CD>@VaPej6S*E4Ja^vy@j1 z4FCTJhi!4{0=jHp3;S8&xah-cI1ZF>ZsFU_&2U!W^{2zS0gis2&Q=NxK2DAb#ia!W z`9&oRZovjtF|go_@$q+baSdWn$jdKLNXswHOX1>WaLUgw$;?YvfXM0T=>f$^0{?-4 LBn@~KhpqwuN?m%B literal 0 HcmV?d00001 diff --git a/bootboot.bin b/bootboot.bin new file mode 100644 index 0000000000000000000000000000000000000000..2eb4028922cee4e7f16b101ceae39f6fe829b58f GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/bootboot.efi b/bootboot.efi new file mode 100755 index 0000000000000000000000000000000000000000..288947985e9bedc61cb6b6af56e8c361ec4d6a4d GIT binary patch literal 77348 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 +#define MMapEnt_Size(a) (a->size & 0xFFFFFFFFFFFFFFF0) +#define MMapEnt_Type(a) (a->size & 0xF) +#define MMapEnt_IsFree(a) ((a->size&0xF)==1||(a->size&0xF)==2) + +#define MMAP_USED 0 // don't use. Reserved or unknown regions +#define MMAP_FREE 1 // usable memory +#define MMAP_ACPIFREE 2 // free to use after acpi tables are parsed +#define MMAP_ACPINVS 3 // don't use. Acpi non-volatile +#define MMAP_MMIO 4 // memory mapped IO region + +#define INITRD_MAXSIZE 16 //Mb + +typedef struct { + uint8_t magic[4]; // 'BOOT', first 64 bytes are platform independent + uint32_t size; // length of bootboot structure, minimum 128 + + uint8_t protocol; // 1, static addresses, see PROTOCOL_* above + uint8_t loader_type; // see LOADER_* above + uint8_t pagesize; // in power of two, 12 = 4096 + uint8_t fb_type; // framebuffer type, see FB_* above + + int16_t timezone; // in minutes -1440..1440 + uint16_t bspid; // Bootsrap processor ID (Local APIC Id on x86_64) + + uint8_t datetime[8]; // in BCD yyyymmddhhiiss UTC (independent to timezone) + + uint64_t initrd_ptr; // ramdisk image position and size + uint64_t initrd_size; + + uint8_t *fb_ptr; // framebuffer pointer and dimensions + uint32_t fb_size; + uint32_t fb_width; + uint32_t fb_height; + uint32_t fb_scanline; + + // the rest (64 bytes) is platform specific + union { + struct { + uint64_t acpi_ptr; + uint64_t smbi_ptr; + uint64_t efi_ptr; + uint64_t mp_ptr; + uint64_t unused0; + uint64_t unused1; + uint64_t unused2; + uint64_t unused3; + } x86_64; + struct { + uint64_t acpi_ptr; + uint64_t mmio_ptr; + uint64_t unused0; + uint64_t unused1; + uint64_t unused2; + uint64_t unused3; + uint64_t unused4; + uint64_t unused5; + } aarch64; + }; + + /* from 128th byte, MMapEnt[], more records may follow */ + MMapEnt mmap; + /* use like this: + * MMapEnt *mmap_ent = &bootboot.mmap; mmap_ent++; + * until you reach bootboot->size */ +} __attribute__((packed)) BOOTBOOT; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bootboot.img b/bootboot.img new file mode 100755 index 0000000000000000000000000000000000000000..4516cf1e7f3c876d3269814a43c456387e34e71b GIT binary patch literal 26608 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 DUqVj( literal 0 HcmV?d00001 diff --git a/bootboot_spec_1st_ed.pdf b/bootboot_spec_1st_ed.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6c19aff71e3f5987a60b671a0d7e67bf072ea000 GIT binary patch literal 199204 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

c?MtS5_lMTH}2z1>C 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 literal 0 HcmV?d00001 diff --git a/mykernel/Makefile b/mykernel/Makefile new file mode 100644 index 0000000..c1f4ff0 --- /dev/null +++ b/mykernel/Makefile @@ -0,0 +1,50 @@ +# +# mykernel/Makefile +# +# Copyright (C) 2017 bzt (bztsrc@gitlab) +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +# This file is part of the BOOTBOOT Protocol package. +# @brief An example Makefile for sample kernel +# +# + +CFLAGS = -Wall -fpic -ffreestanding -fno-stack-protector -nostdinc -nostdlib -I../ + +all: mykernel.x86_64.elf mykernel.aarch64.elf + +mykernel.x86_64.elf: kernel.c + x86_64-elf-gcc $(CFLAGS) -mno-red-zone -c kernel.c -o kernel.o + x86_64-elf-ld -r -b binary -o font.o font.psf + x86_64-elf-ld -nostdlib -nostartfiles -T link.ld kernel.o font.o -o mykernel.x86_64.elf + x86_64-elf-strip -s -K fb -K bootboot -K environment mykernel.x86_64.elf + x86_64-elf-readelf -hls mykernel.x86_64.elf >mykernel.x86_64.txt + +mykernel.aarch64.elf: kernel.c + aarch64-elf-gcc $(CFLAGS) -c kernel.c -o kernel.o + aarch64-elf-ld -r -b binary -o font.o font.psf + aarch64-elf-ld -nostdlib -nostartfiles -T link.ld kernel.o font.o -o mykernel.aarch64.elf + aarch64-elf-strip -s -K fb -K bootboot -K environment mykernel.aarch64.elf + aarch64-elf-readelf -hls mykernel.aarch64.elf >mykernel.aarch64.txt + +clean: + rm *.o *.elf *.txt diff --git a/mykernel/font.psf b/mykernel/font.psf new file mode 100644 index 0000000000000000000000000000000000000000..3e67693f59d769c6453826ed9012a09818a9b9af GIT binary patch literal 2080 zcmZuyJ!>0D7#>_KR}4bsa4{l9ij>P897`AyNSU9IYDvN-#T4cWA-F-duJC{G54fL@ zbcRKSsZ2^0kr1w|CInT73$wcC{TS^A?#0^Ocb@nAWBljmHB10uHuk&-tTrh=e)ws&!OD& zIEIK5^uV;cAqPZ!>YLZE8&T)Oo2%>Vs~g29qhEiU-GXLf!8ai9;6V6SzrQL$XZt(h z&)=WF2YuY#w{qaz+VA{Y-GAtCq&H0R97LTP}vkkfS*({VNnjTr}Y#bM;bqUfqI81m+h>gY@@8Zx*QlcZQH7K zK7Ag#@Vv*zRTX1)k7G11R(<<=LH8K`*G8P>6EwU3UbcBQLcDrdc zzA+V~qku&I5fcz;;va?g%@P^5OI=X&5D09V@E~~Cy!$l!RKIJqUdq??exScisd*th zd180!kA{!Q3qIj#==c2|u4Xehy%&66Gadb4RA`6UDj_MD1UD@KOKcBz-DPA(or1q5ydEtm(tybNSpz)=EZHy?o@Kj5#f#%<( zOKRRS&!3ldDNDr-Zm_fJ^mt!+Ss!Z|r*4Yf|9RrJEz9A>qB1iZkNaxw>YA#JAvjuy z2?LPpcM4Ad;=11?6cd&p<5l=jbC0yXz^5dB8!cbqupg#mU+as}tcLwB3NykwfKV4G zLtX|z + +/* imported virtual addresses, see linker script */ +extern BOOTBOOT bootboot; // see bootboot.h +extern unsigned char *environment; // configuration, UTF-8 text key=value pairs +extern uint8_t fb; // linear framebuffer mapped + +/****************************************** + * Entry point, called by BOOTBOOT Loader * + ******************************************/ +void _start() +{ + int x, y, s=bootboot.fb_scanline, w=bootboot.fb_width, h=bootboot.fb_height; + + // cross-hair to see screen dimension detected correctly + for(y=0;ywidth+7)/8; + while(*s) { + unsigned char *glyph = (unsigned char*)&_binary_font_psf_start + font->headersize + + (*s>0&&*snumglyph?*s:0)*font->bytesperglyph; + offs = (kx * (font->width+1) * 4); + for(y=0;yheight;y++) { + line=offs; mask=1<<(font->width-1); + for(x=0;xwidth;x++) { + *((uint32_t*)((uint64_t)&fb+line))=((int)*glyph) & (mask)?0xFFFFFF:0; + mask>>=1; line+=4; + } + *((uint32_t*)((uint64_t)&fb+line))=0; glyph+=bpl; offs+=bootboot.fb_scanline; + } + s++; kx++; + } +} diff --git a/mykernel/link.ld b/mykernel/link.ld new file mode 100644 index 0000000..c16c4ea --- /dev/null +++ b/mykernel/link.ld @@ -0,0 +1,48 @@ +/* + * mykernel/link.ld + * + * Copyright (C) 2017 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the BOOTBOOT Protocol package. + * @brief An example linker script for sample kernel + * + */ + +mmio = 0xfffffffffa000000; +fb = 0xfffffffffc000000; +SECTIONS +{ + . = 0xffffffffffe00000; + bootboot = .; . += 4096; + environment = .; . += 4096; + .text : { + KEEP(*(.text.boot)) *(.text .text.*) /* code */ + *(.rodata .rodata.*) /* data */ + *(.data .data.*) + } + .bss (NOLOAD) : { /* bss */ + . = ALIGN(16); + *(.bss .bss.*) + *(COMMON) + } +} diff --git a/mykernel/mykernel.aarch64.elf b/mykernel/mykernel.aarch64.elf new file mode 100755 index 0000000000000000000000000000000000000000..00a056ada604c7680b03e9a26ffc200149bbc4db GIT binary patch literal 4336 zcmcIoO=uKn7=AaKu3D#Ytrn*mk`<-eTH>Nor#dx@(pZXAt0|OTT%%cIo&1=Du*D&6 zdXRz?D)r*2vCu>5rHB5_A-F^sdXPd7U8D(N;vu;dNqZ;>#MwUY_p>vbs?e6cWashGgh< zwUT>ydE(25NxBa76FS$iM0U;_-$7mt-v@kK47Y%{l6QL-dFzQb-r50tSI*10v?bx@ zJ{{kd^QhQ*im=~GbWPaFcPwSFPXxE0MNUGV8fpDFY}|tGcx%pUC%X96!)oX4-Q+z7 zyG%>Ct*4;3mfXaK*(AL*4qr7tyWwZJ<;i|nhW)_iE$lfq_Opxq!1osTVSgLgAL2-y zfb2>ipgqpdZ0q<*kx$IeIQFf_=+ejV!8UcCychK4f8hJa$NNqMpZ&kSbBQP9UHVtP z#VnN9UvD6~f&Ip6GVyb;ik1Yur(-EtM@!ZHOt}ja7^fHus0TSBfY&9_A{CC<^Z!*Z71(}mfIlX6|rMR z;NxkIJ&*YKTyR_o=-uC2l4lQRCdX$6=Oy6z!Wm$D!Cvgsh=+Z)W6!a{2gjN~&6vhB z{t@PEHfD=+fH@PiC0;h9z+d2jvNQ2J2(eFrjNbnJ_sPw_6GC@t6pfNjEo#M}3_X8{8XfyA$zy>b?Cetxbj38pz^&)ZWkQwn3mfbdPz9Mu66y8~dA{3}yaQ=B zF+T4{p>Gsb;Ib1@_!`&s5#ga~DJ@TkTm{dhJo7kX$%lOd*-0x*0%2xmX1c86OLIX& z4oJ!`V**^B_+^RPg-K*so>T{v79D053eKYBhlQ@5Vo$!Spz5XYe10LOKjZraT=@*_ zNw`z~c=!a^lHVexAv*7Ka8)eA>73**(>lV4#d^@W+B(dA<%rwIhPkbQuPIYgvIZ=hPc9E-x*>1s=gRa zE8hQ9ikfg70H_O;Auk6&$xC5q=z0+S7NWqFDDP=DukULSA2%V&NAlg;25K2mr2K2_(b z38@Znfz;azZ#A%c=CO=9AcGm1mTUABCtRD0$h=#Y-@)=d>Be@s){8{g(IZC=WOg2X z>zx-f``h-kWh2hxcS(M`((h9-u_QIn4=?}SUy_n^?~(LIT6iS=shCx{g-876!82WN z{~1C5oquzvyrq0v%Tv8Pb@z>280_!s?d}_F z-Nj*QI}a&-v<*1ebPWwr+u8nJVMzM?FHipA!8xY15mjIP1@evhX4P!{zN+!9*sy+5 z5p*B2Tp&P3Jfnx!*Xs*l#r1W+PAL7AH;mTP>u%`tUi;U5?NR!XXSrivao7ihX)6a% z>*L+J4zzxJRX_IXd+&Zr{py}9^s94@rClv22b)fxfBFFbA{Yy&! LH7%&tmHK}H*P{D! literal 0 HcmV?d00001 diff --git a/mykernel/mykernel.aarch64.txt b/mykernel/mykernel.aarch64.txt new file mode 100644 index 0000000..5a4c6ab --- /dev/null +++ b/mykernel/mykernel.aarch64.txt @@ -0,0 +1,42 @@ +ELF Header: + Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF64 + Data: 2's complement, little endian + Version: 1 (current) + OS/ABI: UNIX - System V + ABI Version: 0 + Type: EXEC (Executable file) + Machine: AArch64 + Version: 0x1 + Entry point address: 0xffffffffffe02000 + Start of program headers: 64 (bytes into file) + Start of section headers: 3760 (bytes into file) + Flags: 0x0 + Size of this header: 64 (bytes) + Size of program headers: 56 (bytes) + Number of program headers: 1 + Size of section headers: 64 (bytes) + Number of section headers: 9 + Section header string table index: 8 + +Program Headers: + Type Offset VirtAddr PhysAddr + FileSiz MemSiz Flags Align + LOAD 0x0000000000000078 0xffffffffffe02000 0xffffffffffe02000 + 0x0000000000000cf0 0x0000000000000cf0 RWE 0x8 + + Section to Segment mapping: + Segment Sections... + 00 .text .got .got.plt + +Symbol table '.symtab' contains 9 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: ffffffffffe02000 0 SECTION LOCAL DEFAULT 1 + 2: ffffffffffe02cb8 0 SECTION LOCAL DEFAULT 2 + 3: ffffffffffe02cd8 0 SECTION LOCAL DEFAULT 3 + 4: ffffffffffe02cf0 0 SECTION LOCAL DEFAULT 4 + 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5 + 6: ffffffffffe01000 0 NOTYPE GLOBAL DEFAULT 1 environment + 7: fffffffffc000000 0 NOTYPE GLOBAL DEFAULT ABS fb + 8: ffffffffffe00000 0 NOTYPE GLOBAL DEFAULT 1 bootboot diff --git a/mykernel/mykernel.x86_64.elf b/mykernel/mykernel.x86_64.elf new file mode 100755 index 0000000000000000000000000000000000000000..0f91b477b19391a489a123981f9882c4ba34e2c5 GIT binary patch literal 4088 zcmbtXUuYcV7XNmWZX=G#ihUS0C-aG!2zh00_DlZr)Bln_h^i(nINkQJir!!qmdeBb$Yr(p}Cr`?(F z{QI5ropZj)%sJ=8i}6@YXo`#DLUO5Ei)fS;m+#RQLW~LvHlyM$(I;&WLsigf_7i-s z->nq--p6()GvyyMrM*;U)fb}Hs*KuYXTQxnS$67e#wt5|t4@O)Zyl{T`vd=T8ky5; z6{jBaGoNQ-RcR@jnb_K@K+2-zG-4H}@vO7wt*tsu>3FQ-?3Js_KmQ}PcB27=eTmRq zuEp;F(F8>ES*Pv=I`){xdK};-|40V~OgA7QD3@lebhde4@oUPebhdF{@$#PmJk}Mk zCH^wtcsD@cbp^~^c&>yg*o{-oL++K8DWAQDTAz5h*2Ar9lEUGPHt3QMRBWTKXc(o zOb3juA!bc^4qg~XcQ6Q5Y^v<+azTIkHvlTmE)5SSwHy0_rn$WQ?GNQOIY(+7Mqp4w zUIUl>hn>Ao{rSUJXmV~Hxs8aF5%_3OLR#4S_;1F+?NPfq$Jq+)T;27AraXq*B!y`1Fgg)%xtKl}yfc zr&Iaa>8aGI)Z9B$Gj1+5_R1@-(J%FGZuU&h6|?{U=Xr{oqKh!ZBCbjPsq^-IeDP!X z{}RNY;?jSXmabl0S}HQ%+HAE}c3Lgwg>XZVXAz8~q~%3f)3$eZc1+V|wP_dO+~FaH ziK(>MA!uiX0uV{5ogW*^D|abexp?*J#TC{M^*?Z|a2>>t6*~{IO$1Pg&p+{e8Z=X{ zDgNB)bEiRX@7(m2z%)1Q9eb1Q7yVkj5jN^Ie^ILAiT6@lm)Cmg; z2f|(H&uwmQe)J%bwkxk2DsM&Ky}d8LvmwvEU2R6Ig({I=S9@0W9;qUFS{LDO6gY9!iB9^O*Y%Oy7EB2=M(pf{Dio|V*&7yJ^2 zXeWsAZ~h)`f79V*t%>FR%KZ@p=g0c>ZO`Z@1gWPzay;m>mXT=t7mIJ)mM=j|VtnRY zec*^+UtbS@aXG)h#cA|Vbj4FGWes@$VQ`+BSJm@ptK*VRvtHl{He(I8pI5dzK87Ln z)J=uk<%*|mIvstmuuZ}6+UHf&vRSG&hMqQL8&eQy!G zeqPJ`s0p3@D81Jn0iB;d(pwAp&U{FJOn~-JrqfMo$y0;SD3aTY)I&yZ{{ay~4FLBa zE_n7>(LPaj^bj!gk-ARLQ$A1q*y;=wNKPj`fjdOuNk=y3j7nxenJe-eK0kDY6AE9S#_V(tNC1EUJU0Z-^|aRn#zgcx2NZaXIzLT=H|rk>FFtn zhNyp^=tYM1O8u3@b=H57T>fs;>VvI)2nzD2AtBQJ*k!*-C2n62`acFu)L-{)oZk=* zKC!gFzCQ_nTI=|_zmx3W4$KRR6{Qg{Bs(~W+W+3DG24bDj<=4&sJ@y~dhI~Kh{|6CO0uTTI literal 0 HcmV?d00001 diff --git a/mykernel/mykernel.x86_64.txt b/mykernel/mykernel.x86_64.txt new file mode 100644 index 0000000..1dac104 --- /dev/null +++ b/mykernel/mykernel.x86_64.txt @@ -0,0 +1,42 @@ +ELF Header: + Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF64 + Data: 2's complement, little endian + Version: 1 (current) + OS/ABI: UNIX - System V + ABI Version: 0 + Type: EXEC (Executable file) + Machine: Advanced Micro Devices X86-64 + Version: 0x1 + Entry point address: 0xffffffffffe02000 + Start of program headers: 64 (bytes into file) + Start of section headers: 3512 (bytes into file) + Flags: 0x0 + Size of this header: 64 (bytes) + Size of program headers: 56 (bytes) + Number of program headers: 1 + Size of section headers: 64 (bytes) + Number of section headers: 9 + Section header string table index: 8 + +Program Headers: + Type Offset VirtAddr PhysAddr + FileSiz MemSiz Flags Align + LOAD 0x0000000000000078 0xffffffffffe02000 0xffffffffffe02000 + 0x0000000000000bf0 0x0000000000000bf0 RWE 0x8 + + Section to Segment mapping: + Segment Sections... + 00 .text .eh_frame .got.plt + +Symbol table '.symtab' contains 9 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: ffffffffffe02000 0 SECTION LOCAL DEFAULT 1 + 2: ffffffffffe02b70 0 SECTION LOCAL DEFAULT 2 + 3: ffffffffffe02bd8 0 SECTION LOCAL DEFAULT 3 + 4: ffffffffffe02bf0 0 SECTION LOCAL DEFAULT 4 + 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5 + 6: ffffffffffe01000 0 NOTYPE GLOBAL DEFAULT 1 environment + 7: fffffffffc000000 0 NOTYPE GLOBAL DEFAULT ABS fb + 8: ffffffffffe00000 0 NOTYPE GLOBAL DEFAULT 1 bootboot diff --git a/mykernel/screenshot.png b/mykernel/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d63e6f9ee41077ba3e9d6f1a1810c66b35996e16 GIT binary patch literal 1258 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2WU228v`v%y$M-`~f~8u0WcB;s1XS0i^!x z-nr|;z`!!i)5S5Q;?~<6(Lsj{BpNQ-r7-6m)ZNi&_vd%~WE1nCAoo>=D<0OIJ24@M z%W{&~^r!Q;=rMijNb>x;_sCPTqj|Sw-y8Mz-+U`4czgXeKPe0uR;O6C5s zymgONPMm#r`+TZ~eA4WHl_|Gg9!_VQl>X(<=316bZdMYEMLa^4J69>J{QGp7O+@$% zk=o4eeQIkf6Hm@oT5t3F?(vuBXD^%hOK6cyl66?!yw|TQohF=~eSY#4$6x7c=X2Ji z{tJpvy!C8fc-HBQb>EGSTTjSbBBS1)yZ>5ZWc4$DkC|^cm+*y5*g7|G(cIj{b{hG+ znzp?CUhi}(?ybk+*OfsNN^RQjH0e}N`1YZy(xh2tzOx;3=Ao~K+!H=4d{y~eJ7JRx zqom^_n-gDUikK&z(~JD;RB`8YXjt6#+uOHoo3i9n>BjTnwrBanBTIv=Zq)vf+L1fU z{ne@P^_xy@z51i-&+8|rm&(r*RB)*K{asRliOI#Gf#XEr`n@&Z*G_-G?@I#%BNGdU zfPw=q#)Nd{pSKwql@uIUSUMUQ1O*hB=*b4U7j7>d*bOt7pkc%z0P-{>ylBaOV%S<2 zYNrUci0+ny5(C6@4lML!15*;*UOKQD3|UD`MNjy@^Ra(FZ=v/dev/null + @fasm bootboot.asm ../bootboot.bin >/dev/null + +mkboot: ../boot.bin mkboot.c + @echo " src mkboot" + @ld -r -b binary -o boot.o ../boot.bin + @gcc boot.o mkboot.c -o mkboot + @rm boot.o 2>/dev/null || true + +clean: + @rm *.o ../mbr.bin ../bootboot.bin mkboot >/dev/null 2>/dev/null || true diff --git a/x86_64-bios/README.md b/x86_64-bios/README.md new file mode 100644 index 0000000..44fa466 --- /dev/null +++ b/x86_64-bios/README.md @@ -0,0 +1,34 @@ +BOOTBOOT BIOS / Multiboot Implementation +======================================== + +See [BOOTBOOT Protocol](https://gitlab.com/bztsrc/bootboot) for common details. + +On [BIOS](http://www.scs.stanford.edu/05au-cs240c/lab/specsbbs101.pdf) based systems, the same image can be loaded via +[Multiboot](https://www.gnu.org/software/grub/manual/multiboot/multiboot.html), +chainload from MBR or VBR (GPT hybrid booting) or run as a BIOS Expansion ROM +(so not only the ramdisk can be in ROM, but the loader as well). + +Machine state +------------- + +IRQs masked. GDT unspecified, but valid, IDT unset. Code is running in supervisor mode in ring 0. + +Installation +------------ + +1. *BIOS disk*: copy __bootboot.bin__ to **_FS0:\BOOTBOOT\LOADER_**. You can place it inside your INITRD partition + or outside of partition area as well (with `dd conv=notrunc oseek=x`). Finally install __boot.bin__ in the + master boot record (or in volume boot record if you have a boot manager), saving bootboot.bin's first sector's + LBA number in a dword at 0x1B0. The [mkboot](https://gitlab.com/bztsrc/bootboot/blob/master/x86_64-bios/mkboot.c) + utility will do that for you. + +2. *BIOS ROM*: install __bootboot.bin__ in a **_BIOS Expansion ROM_**. + +3. *GRUB*: specify __bootboot.bin__ as "kernel" in grub.cfg, or you can chainload __boot.bin__. + +Limitations +----------- + + - As it boots in protected mode, it only maps the first 4G of RAM. + - Compressed initrd in ROM is limited to ~96k. + - The CMOS nvram does not store timezone, so always GMT+0 returned in bootboot.timezone. diff --git a/x86_64-bios/boot.asm b/x86_64-bios/boot.asm new file mode 100644 index 0000000..57c4d13 --- /dev/null +++ b/x86_64-bios/boot.asm @@ -0,0 +1,218 @@ +;* +;* x86_64-bios/boot.asm +;* +;* Copyright (C) 2017 bzt (bztsrc@gitlab) +;* +;* Permission is hereby granted, free of charge, to any person +;* obtaining a copy of this software and associated documentation +;* files (the "Software"), to deal in the Software without +;* restriction, including without limitation the rights to use, copy, +;* modify, merge, publish, distribute, sublicense, and/or sell copies +;* of the Software, and to permit persons to whom the Software is +;* furnished to do so, subject to the following conditions: +;* +;* The above copyright notice and this permission notice shall be +;* included in all copies or substantial portions of the Software. +;* +;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;* DEALINGS IN THE SOFTWARE. +;* +;* This file is part of the BOOTBOOT Protocol package. +;* @brief 1nd stage loader, compatible with BIOS boot specification +;* + +;********************************************************************* +;* Macros * +;********************************************************************* + +;LBA packet fields +virtual at lba_packet +lbapacket.size: dw ? +lbapacket.count:dw ? +lbapacket.addr0:dw ? +lbapacket.addr1:dw ? +lbapacket.sect0:dw ? +lbapacket.sect1:dw ? +lbapacket.sect2:dw ? +lbapacket.sect3:dw ? +end virtual + +;memory locations +ldr.header equ 800h ;position of 2nd stage loader +ldr.executor equ 804h ;ptr to init code + +;Writes a message on screen. +macro print msg +{ +if ~ msg eq si + push si + mov si, msg +end if + call printfunc +if ~ msg eq si + pop si +end if +} + +;********************************************************************* +;* code * +;********************************************************************* + +;-----------------ENTRY POINT called by BIOS-------------------- + ORG 0600h + USE16 + +bootboot_record: + jmp short .skipid + nop +.system: db "BOOTBOOT",0 + ;skip BPB area so that we can use this + ;boot code on a FAT volume if needed + db 05Ah-($-$$) dup 0 +.skipid: ;relocate our code to offset 600h + cli + xor ax, ax + mov ss, ax + mov sp, 600h + push ax + pop es + push cs + pop ds + ;find our position in memory. + call .getaddr +.getaddr: pop si + sub si, .getaddr-bootboot_record + cld + mov di, sp + ;clear data area 500h-600h + sub di, 100h + mov cx, 80h + repnz stosw + ;and copy ourselves to 600h + mov cx, 100h + repnz movsw + jmp 0:.start + +.start: ;save boot drive code + mov byte [drive], dl + ;initialize lba packet + mov byte [lbapacket.size], 16 + mov byte [lbapacket.count], 58 + mov byte [lbapacket.addr0+1], 08h ;to address 800h + ;check for lba presistance - floppy not supported any more + ;we use pendrive as removable media for a long time + cmp dl, byte 80h + jl .nolba + cmp dl, byte 84h + jae .nostage2err +.notfloppy: mov ah, byte 41h + mov bx, word 55AAh + int 13h + jc .nolba + cmp bx, word 0AA55h + jne .nolba + test cl, byte 1 + jnz .lbaok +.nolba: mov si, lbanotf + jmp diefunc +.lbaok: ;try to load stage2 - it's a continous area on disk + ;started at given sector with maximum size of 7400h bytes + mov si, stage2_addr + mov di, lbapacket.sect0 + push di + movsw + movsw + movsw + movsw + call loadsectorfunc + + ;do we have a 2nd stage loader? +.chk: cmp word [ldr.header], bx + jne .nostage2 + cmp byte [ldr.header+3], 0E9h + jne .nostage2 + ;invoke stage2 real mode code + print okay + mov ax, [ldr.executor] + add ax, ldr.executor+3 + jmp ax + +.nostage2: ;try to load stage2 from a RAID mirror + inc byte [drive] + cmp byte [drive], 84h + jl .lbaok +.nostage2err: + mov si, stage2notf + ;fall into the diefunc code + +;********************************************************************* +;* functions * +;********************************************************************* +;writes the reason, waits for a key and reboots. +diefunc: + print bootboot_record.system + print panic + call printfunc + mov si, found + call printfunc + sti + xor ax, ax + int 16h + mov al, 0FEh + out 64h, al + jmp far 0FFFFh:0 ;invoke BIOS POST routine + +;loads an LBA sector +loadsectorfunc: + push bx + push si + mov ah, byte 42h + mov dl, byte [drive] + mov si, lba_packet + int 13h + pop si + pop bx + ret + +;ds:si zero terminated string to write +printfunc: + lodsb + or al, al + jz .end + mov ah, byte 0Eh + mov bx, word 11 + int 10h + jmp printfunc +.end: ret + +;********************************************************************* +;* data area * +;********************************************************************* + +panic: db "-PANIC: ",0 +lbanotf: db "LBA support",0 +stage2notf: db "FS0:\BOOTBOOT\LOADER",0 +found: db " not found",10,13,0 +okay: db "Booting LOADER...",10,13,0 +drive: db 0 +lba_packet: db 01B0h-($-$$) dup 0 + +;right before the partition table some data +stage2_addr:dd 0FFFFFFFFh,0 ;1B0h 2nd stage loader address + ;this should be set by mkfs + +diskid: dd 0 ;1B8h WinNT expects it here + dw 0 + +;1BEh first partition entry + + ;padding and magic + db 01FEh-($-$$) dup 0 + db 55h,0AAh +bootboot_record_end: diff --git a/x86_64-bios/bootboot.asm b/x86_64-bios/bootboot.asm new file mode 100644 index 0000000..fc89ccd --- /dev/null +++ b/x86_64-bios/bootboot.asm @@ -0,0 +1,1965 @@ +;* +;* x86_64-bios/bootboot.asm +;* +;* Copyright (C) 2017 bzt (bztsrc@gitlab) +;* +;* Permission is hereby granted, free of charge, to any person +;* obtaining a copy of this software and associated documentation +;* files (the "Software"), to deal in the Software without +;* restriction, including without limitation the rights to use, copy, +;* modify, merge, publish, distribute, sublicense, and/or sell copies +;* of the Software, and to permit persons to whom the Software is +;* furnished to do so, subject to the following conditions: +;* +;* The above copyright notice and this permission notice shall be +;* included in all copies or substantial portions of the Software. +;* +;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;* DEALINGS IN THE SOFTWARE. +;* +;* This file is part of the BOOTBOOT Protocol package. +;* @brief Booting code for BIOS and MultiBoot +;* +;* 2nd stage loader, compatible with GRUB and +;* BIOS boot specification 1.0.1 too (even expansion ROM). +;* +;* memory occupied: 800-7C00 +;* +;* Memory map +;* 0h - 600h reserved for the system +;* 600h - 800h stage1 (MBR) +;* 800h - 6C00h stage2 (this) +;* 6C00h - 7C00h stack +;* 8000h - 9000h bootboot structure +;* 9000h - A000h environment +;* A000h - B000h disk buffer / PML4 +;* B000h - C000h PDPE, higher half core 4K slots +;* C000h - D000h PDE 4K +;* D000h - E000h PTE 4K +;* E000h - F000h PDPE, 4G physical RAM identity mapped 2M +;* F000h -10000h PDE 2M +;* 10000h -11000h PDE 2M +;* 11000h -12000h PDE 2M +;* 12000h -13000h PDE 2M +;* 13000h -14000h PTE 4K +;* 14000h -15000h core stack +;* +;* At first big enough free hole, initrd. Usually at 1Mbyte. +;* + +DEBUG equ 1 + +;get Core boot parameter block +include "bootboot.inc" + +;VBE filter (available, has additional info, color, graphic, linear fb) +VBE_MODEFLAGS equ 1+2+8+16+128 + +;********************************************************************* +;* Macros * +;********************************************************************* + +;Writes a message on screen. +macro real_print msg +{ +if ~ msg eq si + push si + mov si, msg +end if + call real_printfunc +if ~ msg eq si + pop si +end if +} + +;protected and real mode are functions, because we have to switch beetween +macro real_protmode +{ + USE16 + call near real_protmodefunc + USE32 +} + +macro prot_realmode +{ + USE32 + call near prot_realmodefunc + USE16 +} + +;edx:eax sector, edi:pointer +macro prot_readsector +{ + call near prot_readsectorfunc +} + +macro DBG msg +{ +if DEBUG eq 1 + real_print msg +end if +} + +macro DBG32 msg +{ +if DEBUG eq 1 + prot_realmode + real_print msg + real_protmode +end if +} + +virtual at 0 + bpb.jmp db 3 dup 0 + bpb.oem db 8 dup 0 + bpb.bps dw 0 + bpb.spc db 0 + bpb.rsc dw 0 + bpb.nf db 0 ;16 + bpb.nr dw 0 + bpb.ts16 dw 0 + bpb.media db 0 + bpb.spf16 dw 0 ;22 + bpb.spt dw 0 + bpb.nh dw 0 + bpb.hs dd 0 + bpb.ts32 dd 0 + bpb.spf32 dd 0 ;36 + bpb.flg dd 0 + bpb.rc dd 0 ;44 + bpb.vol db 6 dup 0 + bpb.fst db 8 dup 0 ;54 + bpb.dmy db 20 dup 0 + bpb.fst2 db 8 dup 0 ;84 +end virtual + +virtual at 0 + fatdir.name db 8 dup 0 + fatdir.ext db 3 dup 0 + fatdir.attr db 9 dup 0 + fatdir.ch dw 0 + fatdir.attr2 dd 0 + fatdir.cl dw 0 + fatdir.size dd 0 +end virtual + +;********************************************************************* +;* header * +;********************************************************************* +;offs len desc +; 0 2 expansion ROM magic (AA55h) +; 2 1 size in blocks (40h) +; 3 1 magic E9h +; 4 2 real mode entry point (relative) +; 6 2 checksum +; 8 8 magic 'BOOTBOOT' +; 16 10 zeros, at least one and a padding +; 26 2 pnp ptr, must be zero +; 28 4 flags, must be zero +; 32 32 MultiBoot header with protected mode entry point +;any format can follow. + + USE16 + ORG 800h +;BOOTBOOT stage2 header (64 bytes) +loader: db 55h,0AAh ;ROM magic + db (loader_end-loader)/512 ;size in 512 blocks +.executor: jmp near realmode_start ;entry point +.checksum: dw 0 ;checksum +.name: db "BOOTBOOT" + dw 0 + dd 0, 0 +.pnpptr: dw 0 +.flags: dd 0 +MB_MAGIC equ 01BADB002h +MB_FLAGS equ 0D43h + align 8 +.mb_header: dd MB_MAGIC ;magic + dd MB_FLAGS ;flags + dd -(MB_MAGIC+MB_FLAGS) ;checksum (0-magic-flags) + dd .mb_header ;our location (GRUB should load us here) + dd 0800h ;the same... load start + dd 07C00h ;load end + dd 0h ;no bss + dd multiboot_start ;entry point + +;no segments or sections, code comes right after the header + +;********************************************************************* +;* code * +;********************************************************************* + +;----------------Multiboot stub----------------- + USE32 +multiboot_start: + cld + cli + xor dl, dl + ;no GRUB environment available? + cmp eax, 2BADB002h + jne @f + ;save drive code for boot device + mov dl, byte [ebx+12] +@@: jmp CODE_BOOT:.real ;load 16 bit mode segment into cs + USE16 +.real: mov eax, CR0 + and al, 0FEh ;switching back to real mode + mov CR0, eax + xor ax, ax + mov ds, ax ;load registers 2nd turn + mov es, ax + mov ss, ax + jmp 0:realmode_start + +;-----------realmode-protmode stub------------- +realmode_start: + cli + cld + mov sp, 7C00h + ;relocate ourself from ROM to RAM if necessary + call .getaddr +.getaddr: pop si + mov ax, cs + or ax, ax + jnz .reloc + cmp si, .getaddr + je .noreloc +.reloc: mov ds, ax + xor ax, ax + mov es, ax + mov di, loader + sub si, .getaddr-loader + mov cx, (loader_end-loader)/2 + repnz movsw + xor ax, ax + mov ds, ax + xor dl, dl + jmp 0:.noreloc +.noreloc: or dl, dl + jnz @f + mov dl, 80h +@@: mov byte [bootdev], dl + mov word [lbapacket.count], 8 + + ;-----initialize serial port COM1,115200,8N1------ +if DEBUG eq 1 + mov ax, 0401h + xor bx, bx + mov cx, 030Bh + xor dx, dx + int 14h +end if + real_print starting + + in al, 060h ; read key + in al, 061h ; ack + out 061h, al + + DBG dbg_cpu + + ;-----check CPU----- + ;at least 286? + pushf + pushf + pop dx + xor dh,40h + push dx + popf + pushf + pop bx + popf + cmp dx, bx + jne .cpuerror + ;check for 386 + ;look for cpuid instruction + pushfd + pop eax + mov ebx, eax + xor eax, 200000h + and ebx, 200000h + push eax + popfd + pushfd + pop eax + and eax, 200000h + xor eax, ebx + shr eax, 21 + and al, 1 + jz .cpuerror + ;ok, now we can get cpu feature flags + mov eax, 1 + cpuid + shr al, 4 + shr ebx, 24 + mov word [bootboot.bspid], bx + ;look for minimum family + cmp ax, 0600h + jb .cpuerror + ;look for minimum feature flags + ;so we have PAE? + bt edx, 6 + jnc .cpuerror + ;what about MSR? + bt edx, 5 + jnc .cpuerror + ;and can we use long mode (LME)? + mov eax, 80000000h + push bx + cpuid + pop bx + cmp eax, 80000001h + jb .cpuerror + mov eax, 80000001h + cpuid + ;long mode + bt edx, 29 + jc .cpuok +.cpuerror: mov si, noarch + jmp real_diefunc +.cpuok: ;okay, we can do 64 bit! + + DBG dbg_A20 + + ;-----enable A20----- + ;no problem even if a20 is already turned on. + stc + mov ax, 2401h ;BIOS enable A20 function + int 15h + jnc .a20ok + ;keyboard nightmare + call .a20wait + mov al, 0ADh + out 64h, al + call .a20wait + mov al, 0D0h + out 64h, al + call .a20wait2 + in al, 60h + push ax + call .a20wait + mov al, 0D1h + out 64h, al + call .a20wait + pop ax + or al, 2 + out 60h, al + call .a20wait + mov al, 0AEh + out 64h, al + jmp .a20ok + + ;all methods failed, report an error + mov si, a20err + jmp real_diefunc + +.a20wait: in al, 64h + test al, 2 + jnz .a20wait + ret +.a20wait2: in al, 64h + test al, 1 + jz .a20wait2 + ret +.a20ok: + ; wait for a key press, if so use backup initrd + mov ecx, dword [046Ch] + add ecx, 5 ; ~250ms, 18.2/4 + sti +.waitkey: pause + in al, 064h + and al, 1 + jz @f + mov eax, ' BAK' + mov dword [bkp], eax + real_print backup + jmp .waitend +@@: cmp dword [046Ch], ecx + jb .waitkey +.waitend: cli + + ;-----detect memory map----- +getmemmap: + DBG dbg_mem + + xor eax, eax + mov dword [bootboot.acpi_ptr], eax + mov dword [bootboot.smbi_ptr], eax + mov dword [bootboot.initrd_ptr], eax + mov eax, bootboot_MAGIC + mov dword [bootboot.magic], eax + mov dword [bootboot.size], 128 + mov dword [bootboot.pagesize], 12 + mov dword [bootboot.protocol_ver], PROTOCOL_STATIC + mov dword [bootboot.loader_type], LOADER_BIOS + mov di, bootboot.mmap + mov cx, 800h + xor ax, ax + repnz stosw + mov di, bootboot.mmap + xor ebx, ebx + clc +.nextmap: cmp word [bootboot.size], 4096 + jae .nomoremap + mov edx, 'PAMS' + xor ecx, ecx + mov cl, 20 + xor eax, eax + mov ax, 0E820h + int 15h + jc .nomoremap + cmp eax, 'PAMS' + jne .nomoremap + ;is this the first memory hole? If so, mark + ;ourself as reserved memory + cmp dword [di+4], 0 + jnz .notfirst + cmp dword [di], 0 + jnz .notfirst + ; "allocate" memory for loader + mov eax, 15000h + add dword [di], eax + sub dword [di+8], eax + ;convert E820 memory type to BOOTBOOT memory type +.notfirst: mov al, byte [di+16] + cmp al, 1 + je .noov + cmp al, 3 + jne @f + mov al, MMAP_ACPIFREE + jmp .noov +@@: cmp al, 4 + jne @f + mov al, MMAP_ACPINVS + jmp .noov + ; everything else reserved +@@: mov al, MMAP_USED +.noov: ;copy memory type to size's least significant byte + mov byte [di+8], al + xor ecx, ecx + ;is it ACPI area? + cmp al, MMAP_ACPIFREE + jne .notacpi + mov dword [bootboot.acpi_ptr], edi + jmp .entryok + ;is it free slot? +.notacpi: cmp al, MMAP_FREE + jne .notmax +.freemem: ;do we have a ramdisk area? + cmp dword [bootboot.initrd_ptr], 0 + jnz .entryok + ;is it big enough for the compressed and the inflated ramdisk? + mov ebp, (INITRD_MAXSIZE+2)*1024*1024 + shr ebp, 20 + shl ebp, 20 + ;is this free memory hole big enough? (first fit) +.sizechk: mov eax, dword [di+8] ;load size + xor al, al + mov edx, dword [di+12] + and edx, 000FFFFFFh + or edx, edx + jnz .bigenough + cmp eax, ebp + jb .entryok +.bigenough: mov eax, dword [di] + ;save ramdisk pointer + mov dword [bootboot.initrd_ptr], eax +.entryok: ;get limit of memory + mov eax, dword [di+8] ;load size + xor al, al + mov edx, dword [di+12] + add eax, dword [di] ;add base + adc edx, dword [di+4] + and edx, 000FFFFFFh +.notmax: add dword [bootboot.size], 16 + ;bubble up entry if necessary + push si + push di +.bubbleup: mov si, di + cmp di, bootboot.mmap + jbe .swapdone + sub di, 16 + ;order by base asc + mov eax, dword [si+4] + cmp eax, dword [di+4] + jb .swapmodes + jne .swapdone + mov eax, dword [si] + cmp eax, dword [di] + jae .swapdone +.swapmodes: push di + mov cx, 16/2 +@@: mov dx, word [di] + lodsw + stosw + mov word [si-2], dx + dec cx + jnz @b + pop di + jmp .bubbleup +.swapdone: pop di + pop si + add di, 16 + cmp di, bootboot.mmap+4096 + jae .nomoremap +.skip: or ebx, ebx + jnz .nextmap +.nomoremap: cmp dword [bootboot.size], 128 + jne .E820ok +.noE820: mov si, memerr + jmp real_diefunc + +.E820ok: ;check if we have memory for the ramdisk + xor ecx, ecx + cmp dword [bootboot.initrd_ptr], ecx + jnz .enoughmem +.nomem: mov si, noenmem + jmp real_diefunc +.enoughmem: + + ;-----detect system structures----- + DBG dbg_systab + + ;do we need that scanning shit? + mov eax, dword [bootboot.acpi_ptr] + or eax, eax + jz @f + shr eax, 4 + mov es, ax + ;no if E820 map was correct + cmp dword [es:0], 'XSDT' + je .detsmbi + cmp dword [es:0], 'RSDT' + je .detsmbi +@@: inc dx + ;get starting address min(EBDA,E0000) + mov ah,0C1h + stc + int 15h + mov bx, es + jnc @f + mov ax, [ebdaptr] +@@: cmp ax, 0E000h + jb .acpinext + mov ax, 0E000h + ;detect ACPI ptr +.acpinext: mov es, ax + cmp dword [es:0], 'RSD ' + jne .acpinotf + cmp dword [es:4], 'PTR ' + jne .acpinotf + ;ptr found + ; do we have XSDT? + cmp dword [es:28], 0 + jne .acpi2 + cmp dword [es:24], 0 + je .acpi1 +.acpi2: mov eax, dword [es:24] + mov dword [bootboot.acpi_ptr], eax + mov eax, dword [es:28] + mov dword [bootboot.acpi_ptr+4], eax + jmp .detsmbi + ; no, fallback to RSDT +.acpi1: mov eax, dword [es:16] +@@: mov dword [bootboot.acpi_ptr], eax + jmp .detsmbi +.acpinotf: xor eax, eax + mov ax, es + inc ax + cmp ax, 0A000h + jne @f + add ax, 03000h +@@: ;end of 1Mb? + or ax, ax + jnz .acpinext + mov si, noacpi + jmp real_diefunc + + ;detect SMBios tables +.detsmbi: xor eax, eax + mov ax, 0E000h + xor dx, dx +.smbnext: mov es, ax + push ax + cmp dword [es:0], '_SM_' + je .smbfound + cmp dword [es:0], '_MP_' + jne .smbnotf + shl eax, 4 + mov ebx, dword [es:4] + mov dword [bootboot.mp_ptr], ebx + bts dx, 2 + jmp .smbnotf +.smbfound: shl eax, 4 + mov dword [bootboot.smbi_ptr], eax + bts dx, 1 +.smbnotf: pop ax + bt ax, 0 + mov bx, ax + and bx, 03h + inc ax + ;end of 1Mb? + or ax, ax + jnz .smbnext + ;restore ruined es +.detend: push ds + pop es + + DBG dbg_time + + ; ------- BIOS date and time ------- + mov ah, 4 + int 1Ah + jc .nobtime + ;ch century + ;cl year + xchg ch, cl + mov word [bootboot.datetime], cx + ;dh month + ;dl day + xchg dh, dl + mov word [bootboot.datetime+2], dx + mov ah, 2 + int 1Ah + jc .nobtime + ;ch hour + ;cl min + xchg ch, cl + mov word [bootboot.datetime+4], cx + ;dh sec + ;dl daylight saving on/off + xchg dh, dl + mov word [bootboot.datetime+6], dx +.nobtime: + + ;---- enable protmode ---- + cli + cld + lgdt [GDT_value] + mov eax, cr0 + or al, 1 + mov cr0, eax + jmp CODE_PROT:protmode_start + +;writes the reason, waits for a key and reboots. + USE32 +prot_diefunc: + prot_realmode + USE16 +real_diefunc: + push si + real_print loader.name + real_print panic + pop si + call real_printfunc + sti + xor ax, ax + int 16h + mov al, 0FEh + out 64h, al + jmp far 0FFFFh:0 ;invoke BIOS POST routine + +;ds:si zero terminated string to write +real_printfunc: + lodsb + or al, al + jz .end + push si + push ax + mov ah, byte 0Eh + mov bx, word 11 + int 10h + pop ax +if DEBUG eq 1 + mov ah, byte 01h + xor dx, dx + int 14h +end if + pop si + jmp real_printfunc +.end: ret + +real_protmodefunc: + cli + ;get return address + xor ebp, ebp + pop bp + mov dword [hw_stack], esp + lgdt [GDT_value] + mov eax, cr0 ;enable protected mode + or al, 1 + mov cr0, eax + jmp CODE_PROT:.init + + USE32 +.init: mov ax, DATA_PROT + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, dword [hw_stack] + jmp ebp + +prot_realmodefunc: + cli + ;get return address + pop ebp + ;save stack pointer + mov dword [hw_stack], esp + jmp CODE_BOOT:.back ;load 16 bit mode segment into cs + USE16 +.back: mov eax, CR0 + and al, 0FEh ;switching back to real mode + mov CR0, eax + xor ax, ax + mov ds, ax ;load registers 2nd turn + mov es, ax + mov ss, ax + jmp 0:.back2 +.back2: mov sp, word [hw_stack] + sti + jmp bp + + USE32 +prot_readsectorfunc: + push eax + push ecx + push edx + push esi + push edi + ;load 8 sectors (1 page) in low memory + mov dword [lbapacket.sect0], eax + mov dword [lbapacket.sect1], edx + mov dword [lbapacket.addr], 0A000h + prot_realmode + mov ah, byte 42h + mov dl, byte [bootdev] + mov esi, lbapacket + int 13h + xor ebx, ebx + mov bl, ah + real_protmode + pop edi + or edi, edi + jz @f + push edi + ;and copy to addr where it wanted to be (maybe in high memory) + mov esi, dword [lbapacket.addr] + xor ecx, ecx + mov cx, word [lbapacket.count] + shl ecx, 7 + repnz movsd + pop edi +@@: pop esi + pop edx + pop ecx + pop eax + ret + +prot_hex2bin: + xor eax, eax + xor ebx, ebx +@@: mov bl, byte [esi] + cmp bl, '0' + jb @f + cmp bl, '9' + jbe .num + cmp bl, 'A' + jb @f + cmp bl, 'F' + ja @f + sub bl, 7 +.num: sub bl, '0' + shl eax, 4 + add eax, ebx + inc esi + dec cx + jnz @b +@@: ret + +prot_dec2bin: + xor eax, eax + xor ebx, ebx + xor edx, edx + mov ecx, 10 +@@: mov bl, byte [esi] + cmp bl, '0' + jb @f + cmp bl, '9' + ja @f + mul ecx + sub bl, '0' + add eax, ebx + inc esi + jmp @b +@@: ret + +;IN: eax=str ptr, ecx=length OUT: eax=num +prot_oct2bin: + push ebx + push edx + mov ebx, eax + xor eax, eax + xor edx, edx +@@: shl eax, 3 + mov dl, byte[ebx] + sub dl, '0' + add eax, edx + inc ebx + dec ecx + jnz @b + pop edx + pop ebx + ret + +protmode_start: + mov ax, DATA_PROT + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, 7C00h + + ; ------- Locate initrd -------- + mov esi, 0C8000h +.nextrom: cmp word [esi], 0AA55h + jne @f + cmp dword [esi+8], 'INIT' + jne @f + cmp word [esi+12], 'RD' + jne @f + mov eax, dword [esi+16] + mov dword [bootboot.initrd_size], eax + add esi, 32 + jmp .initrdrom +@@: add esi, 2048 + cmp esi, 0F4000h + jb .nextrom + + ; read GPT +.getgpt: xor eax, eax + xor edx, edx + xor edi, edi + prot_readsector + mov esi, 0A000h+512 + cmp dword [esi], 'EFI ' + je @f +.nogpt: mov si, nogpt + jmp prot_diefunc +@@: mov edi, 0B000h + mov ebx, edi + mov ecx, 896 + repnz movsd + mov esi, ebx + mov ecx, dword [esi+80] ;number of entries + mov ebx, dword [esi+84] ;size of one entry + add esi, 512 + mov edx, esi ;first entry + mov dword [gpt_ent], ebx + mov dword [gpt_num], ecx + mov dword [gpt_ptr], edx + ; first, look for a partition with bootable flag + mov esi, edx +@@: cmp dword [esi], 0 ;failsafe, jump to parttype search + jne .notz + cmp dword [esi+32], 0 + jz .nextgpt +.notz: bt word [esi+48], 2 ;EFI_PART_USED_BY_OS? + jc .loadesp2 + add esi, ebx + dec ecx + jnz @b + ; if none, look for specific partition types +.nextgpt: mov esi, dword [gpt_ptr] + mov ebx, dword [gpt_ent] + mov ecx, dword [gpt_num] + mov eax, 0C12A7328h + mov edx, 011D2F81Fh +@@: cmp dword [esi], eax ;GUID match? + jne .note + cmp dword [esi+4], edx + je .loadesp +.note: cmp dword [esi], 'OS/Z' ;or OS/Z root partition for this archicture? + jne .noto + cmp word [esi+4], 08664h + jne .noto + cmp dword [esi+12], 'root' + je .loadesp +.noto: add esi, ebx + dec ecx + jnz @b +.noinitrd: mov esi, nord + jz prot_diefunc + + ; load ESP at free memory hole found +.loadesp: mov dword [gpt_ptr], esi + mov dword [gpt_num], ecx +.loadesp2: mov ecx, dword [esi+40] ;last sector + mov eax, dword [esi+32] ;first sector + mov edx, dword [esi+36] + or edx, edx + jnz .nextgpt + or ecx, ecx + jz .nextgpt + or eax, eax + jz .nextgpt + mov dword [bpb_sec], eax + ;load BPB + mov edi, dword [bootboot.initrd_ptr] + mov word [lbapacket.count], 8 + prot_readsector + + ;parse fat on EFI System Partition +@@: cmp dword [edi + bpb.fst2], 'FAT3' + je .isfat + cmp dword [edi + bpb.fst], 'FAT1' + je .isfat + ;no, then it's an initrd on the entire partition + or eax, eax + jz .noinitrd + or ecx, ecx + jz .noinitrd + sub ecx, eax + shl ecx, 9 + mov dword [bootboot.initrd_size], ecx + ; load INITRD from partition + dec ecx + shr ecx, 12 + xor edx, edx + mov edi, dword [bootboot.initrd_ptr] +@@: add edi, 4096 + prot_readsector + add eax, 8 + dec ecx + jnz @b + jmp .initrdloaded + +.isfat: cmp word [edi + bpb.bps], 512 + jne .nextgpt + ;calculations + xor eax, eax + xor ebx, ebx + xor ecx, ecx + xor edx, edx + mov bx, word [edi + bpb.spf16] + or bx, bx + jnz @f + mov ebx, dword [edi + bpb.spf32] +@@: mov al, byte [edi + bpb.nf] + mov cx, word [edi + bpb.rsc] + ;data_sec = numFat*secPerFat + mul ebx + ;data_sec += reservedSec + add eax, ecx + ;data_sec += ESPsec + add eax, dword [bpb_sec] + mov dword [data_sec], eax + mov dword [root_sec], eax + xor eax, eax + mov al, byte [edi + bpb.spc] + mov dword [clu_sec], eax + ;FAT16 + ;data_sec += (numRootEnt*32+511)/512 + cmp word [edi + bpb.spf16], 0 + je .fat32bpb + cmp byte [edi + bpb.fst + 4], '6' + jne .nextgpt + xor eax, eax + mov ax, word [edi + bpb.nr] + shl eax, 5 + add eax, 511 + shr eax, 9 + add dword [data_sec], eax + mov byte [fattype], 0 + xor ecx, ecx + mov cx, word [edi + bpb.spf16] + jmp .loadfat +.fat32bpb: ;FAT32 + ;root_sec += (rootCluster-2)*secPerCluster + mov eax, dword [edi + bpb.rc] + sub eax, 2 + xor edx, edx + mov ebx, dword [clu_sec] + mul ebx + add dword [root_sec], eax + mov byte [fattype], 1 + mov ecx, dword [edi + bpb.spf32] + ;load FAT +.loadfat: xor eax, eax + mov ax, word [edi+bpb.rsc] + add eax, dword [bpb_sec] + shr ecx, 3 + inc ecx + mov edi, 0x10000 + mov word [lbapacket.count], 8 +@@: prot_readsector + add edi, 4096 + add eax, 8 + dec ecx + jnz @b + mov ax, word [clu_sec] + mov word [lbapacket.count], ax + + ;load root directory + mov eax, dword [root_sec] + xor edx, edx + mov edi, dword [bootboot.initrd_ptr] + prot_readsector + + ;look for BOOTBOOT directory + mov esi, edi + mov eax, 'BOOT' + mov ecx, 255 +.nextroot: cmp dword [esi], eax + jne @f + cmp dword [esi+4], eax + jne @f + cmp word [esi+8], ' ' + je .foundroot +@@: add esi, 32 + cmp byte [esi], 0 + jz .nextgpt + dec ecx + jnz .nextroot + jmp .nextgpt +.foundroot: xor eax, eax + cmp byte [fattype], 0 + jz @f + mov ax, word [esi + fatdir.ch] + shl eax, 16 +@@: mov ax, word [esi + fatdir.cl] + ;sec = (cluster-2)*secPerCluster+data_sec + sub eax, 2 + xor edx, edx + mov ebx, dword [clu_sec] + mul ebx + add eax, dword [data_sec] + mov edi, dword [bootboot.initrd_ptr] + prot_readsector + + mov dword [9000h], 0 + + ;look for CONFIG and INITRD + mov esi, edi + mov ecx, 255 + mov edx, dword [bkp] +.nextdir: cmp dword [esi], 'CONF' + jne .notcfg + cmp dword [esi+4], 'IG ' + jne .notcfg + cmp dword [esi+7], ' ' + jne .notcfg + + push edx + push esi + push edi + push ecx + mov ecx, dword [esi + fatdir.size] + cmp ecx, 4095 + jbe @f + mov ecx, 4095 +@@: mov dword [core_len], ecx + xor eax, eax + cmp byte [fattype], 0 + jz @f + mov ax, word [esi + fatdir.ch] + shl eax, 16 +@@: mov ax, word [esi + fatdir.cl] + mov ebx, dword [clu_sec] + cmp bx, 8 + jbe @f + mov word [lbapacket.count], 8 +@@: mov edi, 9000h +.nextcfg: push eax + ;sec = (cluster-2)*secPerCluster+data_sec + sub eax, 2 + xor edx, edx + mov ebx, dword [clu_sec] + mul ebx + shl ebx, 9 + add eax, dword [data_sec] + push ebx + prot_readsector + pop ebx + pop eax + add edi, ebx + sub ecx, ebx + js .cfgloaded + jz .cfgloaded + ;get next cluster from FAT + cmp byte [fattype], 0 + jz @f + shl eax, 2 + add eax, 0x10000 + mov eax, dword [eax] + jmp .nextcfg +@@: shl eax, 1 + add eax, 0x10000 + mov ax, word [eax] + and eax, 0FFFFh + jmp .nextcfg +.cfgloaded: pop ecx + pop edi + pop esi + pop edx + xor eax, eax + mov ecx, 4096 + sub ecx, dword [core_len] + mov edi, 9000h + add edi, dword [core_len] + repnz stosb + mov dword [core_len], eax + mov byte [9FFFh], al + jmp .notinit +.notcfg: + cmp dword [esi], 'X86_' + jne @f + cmp dword [esi+4], '64 ' + je .altinitrd +@@: cmp dword [esi], 'INIT' + jne .notinit + cmp dword [esi+4], 'RD ' + jne .notinit + cmp dword [esi+7], edx + jne .notinit + +.altinitrd: mov ecx, dword [esi + fatdir.size] + mov dword [bootboot.initrd_size], ecx + xor eax, eax + cmp byte [fattype], 0 + jz @f + mov ax, word [esi + fatdir.ch] + shl eax, 16 +@@: mov ax, word [esi + fatdir.cl] + jmp .loadinitrd + +.notinit: add esi, 32 + cmp byte [esi], 0 + jz .loadinitrd + dec ecx + jnz .nextdir + + ;load cluster chain, eax=cluster, ecx=size +.loadinitrd: + mov edi, dword [bootboot.initrd_ptr] +.nextclu: push eax + ;sec = (cluster-2)*secPerCluster+data_sec + sub eax, 2 + xor edx, edx + mov ebx, dword [clu_sec] + mov word [lbapacket.count], bx + mul ebx + shl ebx, 9 + add eax, dword [data_sec] + push ebx + prot_readsector + pop ebx + pop eax + add edi, ebx + sub ecx, ebx + js .initrdloaded + jz .initrdloaded + ;get next cluster from FAT + cmp byte [fattype], 0 + jz @f + shl eax, 2 + add eax, 0x10000 + mov eax, dword [eax] + jmp .nextclu +@@: shl eax, 1 + add eax, 0x10000 + mov ax, word [eax] + and eax, 0FFFFh + jmp .nextclu + +.initrdloaded: + DBG32 dbg_initrd + mov esi, dword [bootboot.initrd_ptr] +.initrdrom: + mov edi, dword [bootboot.initrd_ptr] + cmp word [esi], 08b1fh + jne .noinflate + DBG32 dbg_gzinitrd + mov ebx, esi + mov eax, dword [bootboot.initrd_size] + add ebx, eax + sub ebx, 4 + mov ecx, dword [ebx] + mov dword [bootboot.initrd_size], ecx + add edi, eax + add edi, 4095 + shr edi, 12 + shl edi, 12 + add eax, ecx + cmp eax, (INITRD_MAXSIZE+2)*1024*1024 + jb @f + mov esi, nogzmem + jmp prot_diefunc +@@: mov dword [bootboot.initrd_ptr], edi + ; inflate initrd + xor eax, eax + add esi, 2 + lodsb + cmp al, 8 + jne tinf_err + lodsb + mov bl, al + add esi, 6 + test bl, 4 + jz @f + lodsw + add esi, eax +@@: test bl, 8 + jz .noname +@@: lodsb + or al, al + jnz @b +.noname: test bl, 16 + jz .nocmt +@@: lodsb + or al, al + jnz @b +.nocmt: test bl, 2 + jz @f + add esi, 2 +@@: call tinf_uncompress +.noinflate: + ;round up to page size + mov eax, dword [bootboot.initrd_size] + add eax, 4095 + shr eax, 12 + shl eax, 12 + mov dword [bootboot.initrd_size], eax + + ;do we have an environment configuration? + mov ebx, 9000h + cmp byte [ebx], 0 + jnz .parsecfg + + ;-----load /sys/config------ + mov edx, fsdrivers +.nextfs1: xor ebx, ebx + mov bx, word [edx] + or bx, bx + jz .errfs1 + mov esi, dword [bootboot.initrd_ptr] + mov ecx, dword [bootboot.initrd_size] + add ecx, esi + mov edi, cfgfile + push edx + call ebx + pop edx + or ecx, ecx + jnz .fscfg + add edx, 2 + jmp .nextfs1 +.fscfg: mov edi, 9000h + add ecx, 3 + shr ecx, 2 + repnz movsd +.errfs1: + ;do we have an environment configuration? + mov ebx, 9000h + cmp byte [ebx], 0 + jz .noconf + + ;parse +.parsecfg: push ebx + DBG32 dbg_env + pop esi + jmp .getnext + + ;skip comments +.nextvar: cmp byte[esi], '#' + je .skipcom + cmp word[esi], '//' + jne @f + add esi, 2 +.skipcom: lodsb + cmp al, 10 + je .getnext + cmp al, 13 + je .getnext + or al, al + jz .parseend + cmp esi, 0A000h + ja .parseend + jmp .skipcom +@@: cmp word[esi], '/*' + jne @f +.skipcom2: inc esi + cmp word [esi-2], '*/' + je .getnext + cmp byte [esi], 0 + jz .parseend + cmp esi, 0A000h + ja .parseend + jmp .skipcom2 + ;parse screen dimensions +@@: cmp dword[esi], 'scre' + jne @f + cmp word[esi+4], 'en' + jne @f + cmp byte[esi+6], '=' + jne @f + add esi, 7 + call prot_dec2bin + mov dword [reqwidth], eax + inc esi + call prot_dec2bin + mov dword [reqheight], eax + jmp .getnext + ;get kernel's filename +@@: cmp dword[esi], 'kern' + jne @f + cmp word[esi+4], 'el' + jne @f + cmp byte[esi+6], '=' + jne @f + add esi, 7 + mov edi, kernel +.copy: lodsb + or al, al + jz .copyend + cmp al, ' ' + jz .copyend + cmp al, 13 + jbe .copyend + cmp esi, 0A000h + ja .copyend + cmp edi, loader_end-1 + jae .copyend + stosb + jmp .copy +.copyend: xor al, al + stosb + jmp .getnext +@@: + inc esi + ;failsafe +.getnext: cmp esi, 0A000h + jae .parseend + cmp byte [esi], 0 + je .parseend + ;skip white spaces + cmp byte [esi], ' ' + je @b + cmp byte [esi], 13 + jbe @b + jmp .nextvar +.noconf: mov edi, ebx + mov ecx, 1024 + xor eax, eax + repnz stosd + mov dword [ebx+0], '// N' + mov dword [ebx+4], '/A\n' +.parseend: + + ;-----load /sys/core------ + mov edx, fsdrivers +.nextfs: xor ebx, ebx + mov bx, word [edx] + or bx, bx + jz .errfs + mov esi, dword [bootboot.initrd_ptr] + mov ecx, dword [bootboot.initrd_size] + add ecx, esi + mov edi, kernel + push edx + call ebx + pop edx + or ecx, ecx + jnz .coreok + add edx, 2 + jmp .nextfs +.errfs2: mov esi, nocore + jmp prot_diefunc +.errfs: ; if all drivers failed, search for the first elf executable + DBG32 dbg_scan + mov esi, dword [bootboot.initrd_ptr] + mov ecx, dword [bootboot.initrd_size] + add ecx, esi + dec esi +@@: inc esi + cmp esi, ecx + jae .errfs2 + cmp dword [esi], 5A2F534Fh ; OS/Z magic + je .alt + cmp dword [esi], 464C457Fh ; ELF magic + je .alt + cmp word [esi], 5A4Dh ; MZ magic + jne @b + mov eax, dword [esi+0x3c] + add eax, esi + cmp dword [eax], 00004550h ; PE magic + jne @b + cmp word [eax+4], 8664h ; x86_64 + jne @b + cmp word [eax+20], 20Bh + jne @b +.alt: cmp word [esi+4], 0102h ;lsb 64 bit + jne @b + cmp word [esi+18], 62 ;x86_64 + jne @b + cmp word [esi+0x38], 0 ;e_phnum > 0 + jz @b +.coreok: + ; parse PE + cmp word [esi], 5A4Dh ; MZ magic + jne .tryelf + mov ebx, esi + add esi, dword [esi+0x3c] + cmp dword [esi], 00004550h ; PE magic + jne .badcore + cmp word [esi+4], 8664h ; x86_64 architecture + jne .badcore + cmp word [esi+20], 20Bh ; PE32+ format + jne .badcore + + DBG32 dbg_pe + + mov eax, dword [esi+36] ; entry point + mov dword [entrypoint], eax + mov dword [entrypoint+4], 0FFFFFFFFh + mov ecx, eax + sub ecx, dword [esi+40] ; - code base + add ecx, dword [esi+24] ; + text size + add ecx, dword [esi+28] ; + data size + mov edx, dword [esi+32] ; bss size + shr eax, 31 + jz .badcore + jmp .mkcore + + ; parse ELF +.tryelf: cmp dword [esi], 5A2F534Fh ; OS/Z magic + je @f + cmp dword [esi], 464C457Fh ; ELF magic + jne .badcore +@@: cmp word [esi+4], 0102h ;lsb 64 bit, little endian + jne .badcore + cmp word [esi+18], 62 ;x86_64 architecture + je @f +.badcore: mov esi, badcore + jmp prot_diefunc +@@: + DBG32 dbg_elf + + mov ebx, esi + mov eax, dword [esi+0x18] + mov dword [entrypoint], eax + mov eax, dword [esi+0x18+4] + mov dword [entrypoint+4], eax + ;parse ELF binary + mov cx, word [esi+0x38] ; program header entries phnum + mov eax, dword [esi+0x20] ; program header + add esi, eax + sub esi, 56 + inc cx +.nextph: add esi, 56 + dec cx + jz .badcore + cmp word [esi], 1 ; p_type, loadable + jne .nextph + cmp word [esi+22], 0FFFFh ; p_vaddr == negative address + jne .nextph + ;got it + add ebx, dword [esi+8] ; + P_offset + mov ecx, dword [esi+32] ; p_filesz + ; hack to keep symtab and strtab for shared libraries + cmp byte [ebx+16], 3 + jne @f + add ecx, 04000h +@@: mov edx, dword [esi+40] ; p_memsz + sub edx, ecx + + ;ebx=ptr to core segment, ecx=segment size, edx=bss size +.mkcore: or ecx, ecx + jz .badcore + mov edi, dword [bootboot.initrd_ptr] + add edi, dword [bootboot.initrd_size] + mov dword [core_ptr], edi + mov dword [core_len], ecx + ;copy code from segment after initrd + mov esi, ebx + mov ebx, ecx + and bl, 3 + shr ecx, 2 + repnz movsd + or bl, bl + jz @f + mov cl, bl + repnz movsb + ;zero out bss +@@: or edx, edx + jz @f + add dword [core_len], edx + xor eax, eax + mov ecx, edx + and dl, 3 + shr ecx, 2 + repnz stosd + or dl, dl + jz @f + mov cl, dl + repnz stosb + ;round up to page size +@@: mov eax, dword [core_len] + add eax, 4095 + shr eax, 12 + shl eax, 12 + mov dword [core_len], eax + + ;exclude initrd area and core from free mmap + mov esi, bootboot.mmap + mov ebx, dword [bootboot.initrd_ptr] + mov edx, dword [core_ptr] + add edx, eax + mov cx, 248 + ; initrd+core (ebx..edx) +.nextfree: cmp dword [esi], ebx + ja .excludeok + mov eax, dword [esi+8] + and al, 0F0h + add eax, dword [esi] + cmp edx, eax + ja .notini + ; +--------------+ + ; ####### + cmp dword [esi], ebx + jne .splitmem + ; ptr = initrd_ptr+initrd_size+core_len + mov dword [esi], edx + sub edx, ebx + and dl, 0F0h + ; size -= initrd_size+core_len + sub dword [esi+8], edx + jmp .excludeok + ; +--+ +----------+ + ; ####### +.splitmem: mov edi, bootboot.magic + add edi, dword [bootboot.size] + add dword [bootboot.size], 16 +@@: mov eax, dword [edi-16] + mov dword [edi], eax + mov eax, dword [edi-12] + mov dword [edi+4], eax + mov eax, dword [edi-8] + mov dword [edi+8], eax + mov eax, dword [edi-4] + mov dword [edi+12], eax + sub edi, 16 + cmp edi, esi + ja @b + mov eax, ebx + sub eax, dword [esi] + sub dword [esi+24], eax + inc al + mov dword [esi+8], eax + mov dword [esi+16], edx + sub edx, ebx + sub dword [esi+24], edx + jmp .excludeok +.notini: add esi, 16 + dec cx + jnz .nextfree +.excludeok: + ; ------- set video resolution ------- + prot_realmode + + DBG dbg_vesa + + xor ax, ax + mov es, ax + mov word [vbememsize], ax + ;get VESA VBE2.0 info + mov ax, 4f00h + mov di, 0A000h + mov dword [di], 'VBE2' + ;this call requires a big stack + int 10h + cmp ax, 004fh + je @f +.viderr: mov si, novbe + jmp real_diefunc + ;get video memory size in MiB +@@: mov ax, word [0A000h+12h] + shr ax, 4 + or ax, ax + jnz @f + inc ax +@@: mov word [vbememsize], ax + ;read dword pointer and copy string to 1st 64k + ;available video modes +@@: xor esi, esi + xor edi, edi + mov si, word [0A000h+0Eh] + mov ax, word [0A000h+10h] + mov ds, ax + xor ax, ax + mov es, ax + mov di, 0A000h+400h + mov cx, 64 +@@: lodsw + cmp ax, 0ffffh + je @f + or ax, ax + jz @f + stosw + dec cx + jnz @b +@@: xor ax, ax + stosw + ;iterate on modes + mov si, 0A000h+400h +.nextmode: mov di, 0A000h+800h + xor ax, ax + mov word [0A000h+802h], ax ; vbe mode + lodsw + or ax, ax + jz .viderr + mov cx, ax + mov ax, 4f01h + push bx + push cx + push si + push di + int 10h + pop di + pop si + pop cx + pop bx + cmp ax, 004fh + jne .viderr + bts cx, 13 + bts cx, 14 + mov ax, word [0A000h+800h] ; vbe flags + and ax, VBE_MODEFLAGS + cmp ax, VBE_MODEFLAGS + jne .nextmode + ;check memory model (direct) + cmp byte [0A000h+81bh], 6 + jne .nextmode + ;check bpp + cmp byte [0A000h+819h], 32 + jne .nextmode + ;check min width + mov ax, word [reqwidth] + cmp ax, 640 + ja @f + mov ax, 640 +@@: cmp word [0A000h+812h], ax + jne .nextmode + ;check min height + mov ax, word [reqheight] + cmp ax, 480 + ja @f + mov ax, 480 +@@: cmp word [0A000h+814h], ax + jb .nextmode + ;match? go no further +.match: mov ax, word [0A000h+810h] + mov word [bootboot.fb_scanline], ax + mov ax, word [0A000h+812h] + mov word [bootboot.fb_width], ax + mov ax, word [0A000h+814h] + mov word [bootboot.fb_height], ax + mov eax, dword [0A000h+828h] + mov dword [bootboot.fb_ptr], eax + mov byte [bootboot.fb_type],FB_ARGB ; blue offset + cmp byte [0A000h+824h], 0 + je @f + mov byte [bootboot.fb_type],FB_RGBA + cmp byte [0A000h+824h], 8 + je @f + mov byte [bootboot.fb_type],FB_ABGR + cmp byte [0A000h+824h], 16 + je @f + mov byte [bootboot.fb_type],FB_BGRA +@@: ; set video mode + mov bx, cx + bts bx, 14 ;flat linear + mov ax, 4f02h + int 10h + cmp ax, 004fh + jne .viderr + ;no debug output after this point + + ;inform firmware that we're about to leave it's realm + mov ax, 0EC00h + mov bl, 2 ; 64 bit + int 15h + real_protmode + + ; -------- paging --------- + ;map core at higher half of memory + ;address 0xffffffffffe00000 + xor eax, eax + mov edi, 0A000h + mov ecx, (15000h-0A000h)/4 + repnz stosd + + ;PML4 + mov edi, 0A000h + ;pointer to 2M PDPE (first 4G RAM identity mapped) + mov dword [edi], 0E001h + ;pointer to 4k PDPE (core mapped at -2M) + mov dword [edi+4096-8], 0B001h + + ;4K PDPE + mov edi, 0B000h + mov dword [edi+4096-8], 0C001h + ;4K PDE + mov edi, 0C000h+3840 + mov eax, dword[bootboot.fb_ptr] ;map framebuffer + mov al,81h + mov ecx, 31 +@@: stosd + add edi, 4 + add eax, 2*1024*1024 + dec ecx + jnz @b + mov dword [0C000h+4096-8], 0D001h + + ;4K PT + mov dword[0D000h], 08001h ;map bootboot + mov dword[0D008h], 09001h ;map configuration + mov edi, 0D010h + mov eax, dword[core_ptr] ;map core text segment + inc eax + mov ecx, dword[core_len] + shr ecx, 12 + inc ecx +@@: stosd + add edi, 4 + add eax, 4096 + dec ecx + jnz @b + mov dword[0DFF8h], 014001h ;map core stack + + ;identity mapping + ;2M PDPE + mov edi, 0E000h + mov dword [edi], 0F001h + mov dword [edi+8], 010001h + mov dword [edi+16], 011001h + mov dword [edi+24], 012001h + ;2M PDE + mov edi, 0F000h + xor eax, eax + mov al, 81h + mov ecx, 512* 4;G RAM +@@: stosd + add edi, 4 + add eax, 2*1024*1024 + dec ecx + jnz @b + ;first 2M mapped by page + mov dword [0F000h], 013001h + mov edi, 013000h + mov eax, 1 + mov ecx, 512 +@@: stosd + add edi, 4 + add eax, 4096 + dec ecx + jnz @b + + ;generate new 64 bit gdt + mov edi, GDT_table+8 + ;8h core code + xor eax, eax ;supervisor mode (ring 0) + mov ax, 0FFFFh + stosd + mov eax, 00209800h + stosd + ;10h core data + xor eax, eax ;flat data segment + mov ax, 0FFFFh + stosd + mov eax, 00809200h + stosd + ;18h mandatory tss + xor eax, eax ;required by vt-x + mov al, 068h + stosd + mov eax, 00008900h + stosd + xor eax, eax + stosd + stosd + + ;Enter long mode + cli + mov al, 0FFh ;disable PIC + out 021h, al + out 0A1h, al + in al, 70h ;disable NMI + or al, 80h + out 70h, al + + mov eax, 1101000b ;Set PAE, MCE, PGE + mov cr4, eax + mov eax, 0A000h + mov cr3, eax + mov ecx, 0C0000080h ;EFER MSR + rdmsr + or eax, 100h ;enable long mode + wrmsr + + mov eax, cr0 + or eax, 0C0000001h + mov cr0, eax ;enable paging wich cache disabled + lgdt [GDT_value] ;read 80 bit address + jmp @f + nop +@@: jmp 8:longmode_init + USE64 +longmode_init: + xor eax, eax + mov ax, 10h + mov ds, ax + mov es, ax + mov ss, ax + mov fs, ax + mov gs, ax + + xor rsp, rsp + ;call _start() at qword[entrypoint] + jmp qword[entrypoint] + nop + nop + nop + nop + + USE32 + include "fs.inc" + include "tinf.inc" + +;********************************************************************* +;* Data * +;********************************************************************* + ;global descriptor table + align 16 +GDT_table: dd 0, 0 ;null descriptor +DATA_PROT = $-GDT_table + dd 0000FFFFh,008F9200h ;flat ds +CODE_BOOT = $-GDT_table + dd 0000FFFFh,00009800h ;16 bit legacy real mode cs +CODE_PROT = $-GDT_table + dd 0000FFFFh,00CF9A00h ;32 bit prot mode ring0 cs + dd 00000068h,00CF8900h ;32 bit TSS, not used but required +GDT_value: dw $-GDT_table + dd GDT_table + dd 0,0 + align 16 +entrypoint: dq 0 +core_ptr: dd 0 +core_len: dd 0 +ebdaptr: dd 0 +hw_stack: dd 0 +lastmsg: dd 0 +bpb_sec: dd 0 ;ESP's first sector +root_sec: dd 0 ;root directory's first sector +data_sec: dd 0 ;first data sector +clu_sec: dd 0 ;sector per cluster +gpt_ptr: dd 0 +gpt_num: dd 0 +gpt_ent: dd 0 +lbapacket: ;lba packet for BIOS +.size: dw 10h +.count: dw 8 +.addr: dd 0A000h +.sect0: dd 0 +.sect1: dd 0 +.flataddr: dd 0,0 +reqwidth: dd 1024 +reqheight: dd 768 +bootdev: db 0 +fattype: db 0 +vbememsize: dw 0 +bkp: dd ' ' +if DEBUG eq 1 +dbg_cpu db " * Detecting CPU",10,13,0 +dbg_A20 db " * Enabling A20",10,13,0 +dbg_mem db " * E820 Memory Map",10,13,0 +dbg_systab db " * System tables",10,13,0 +dbg_time db " * System time",10,13,0 +dbg_env db " * Environment",10,13,0 +dbg_initrd db " * Initrd loaded",10,13,0 +dbg_gzinitrd db " * Gzip compressed initrd",10,13,0 +dbg_scan db " * Autodetecting kernel",10,13,0 +dbg_elf db " * Parsing ELF64",10,13,0 +dbg_pe db " * Parsing PE32+",10,13,0 +dbg_vesa db " * Screen VESA VBE",10,13,0 +end if +backup: db " * Backup initrd",10,13,0 +starting: db "Booting OS...",10,13,0 +panic: db "-PANIC: ",0 +noarch: db "Hardware not supported",0 +a20err: db "Failed to enable A20",0 +memerr: db "E820 memory map not found",0 +nogzmem: db "Inflating: " +noenmem: db "Not enough memory",0 +noacpi: db "ACPI not found",0 +nogpt: db "No boot partition",0 +nord: db "INITRD not found",0 +nolib: db "/sys not found in initrd",0 +nocore: db "Kernel not found in initrd",0 +badcore: db "Kernel is not a valid executable",0 +novbe: db "VESA VBE error, no framebuffer",0 +nogzip: db "Unable to uncompress",0 +cfgfile: db "sys/config",0,0,0 +kernel: db "sys/core" + db (128-($-kernel)) dup 0 +;-----------padding to be multiple of 512---------- + db (511-($-loader+511) mod 512) dup 0 +loader_end: + +;-----------BIOS checksum------------ +chksum = 0 +repeat $-loader + load b byte from (loader+%-1) + chksum = (chksum + b) mod 100h +end repeat +store byte (100h-chksum) at (loader.checksum) + +;-----------bss area----------- +tinf_bss_start: +d_end: dd ? +d_lzOff: dd ? +d_dict_ring:dd ? +d_dict_size:dd ? +d_dict_idx: dd ? +d_tag: db ? +d_bitcount: db ? +d_bfinal: db ? +d_curlen: dw ? +d_ltree: +d_ltree_table: + dw 16 dup ? +d_ltree_trans: + dw 288 dup ? +d_dtree: +d_dtree_table: + dw 16 dup ? +d_dtree_trans: + dw 288 dup ? +offs: dw 16 dup ? +num: dw ? +lengths: db 320 dup ? +hlit: dw ? +hdist: dw ? +hclen: dw ? +tinf_bss_end: + +;-----------bound check------------- +;fasm will generate an error if the code +;is bigger than it should be +db 07C00h-4096-($-loader) dup ? diff --git a/x86_64-bios/bootboot.inc b/x86_64-bios/bootboot.inc new file mode 100644 index 0000000..7c5fc3b --- /dev/null +++ b/x86_64-bios/bootboot.inc @@ -0,0 +1,121 @@ +;* +;* x86_64-bios/bootboot.inc +;* +;* Copyright (C) 2017 bzt (bztsrc@gitlab) +;* +;* Permission is hereby granted, free of charge, to any person +;* obtaining a copy of this software and associated documentation +;* files (the "Software"), to deal in the Software without +;* restriction, including without limitation the rights to use, copy, +;* modify, merge, publish, distribute, sublicense, and/or sell copies +;* of the Software, and to permit persons to whom the Software is +;* furnished to do so, subject to the following conditions: +;* +;* The above copyright notice and this permission notice shall be +;* included in all copies or substantial portions of the Software. +;* +;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;* DEALINGS IN THE SOFTWARE. +;* +;* This file is part of the BOOTBOOT Protocol package. +;* @brief The BOOTBOOT structure +;* +; ------ !!! WARNING: MUST MATCH ../bootboot.h !!! ------ + +bootboot = 8000h + + + + + +; this define is in the 18th line of bootboot.h +bootboot_MAGIC equ 'BOOT' + +; minimum protocol level: +; hardcoded kernel name, static kernel memory addresses +PROTOCOL_MINIMAL equ 0 +; static protocol level: +; kernel name parsed from environment, static kernel memory addresses +PROTOCOL_STATIC equ 1 +; dynamic protocol level: +; kernel name parsed from environment, kernel memory addresses parsed from ELF symbols +PROTOCOL_DYNAMIC equ 2 +; big-endian flag +PROTOCOL_BIGENDIAN equ 080h + +; loader types, just informational +LOADER_BIOS equ 0 +LOADER_UEFI equ 1 +LOADER_RPI equ 2 + +; framebuffer pixel format, only 32 bits supported +FB_ARGB equ 0 +FB_RGBA equ 1 +FB_ABGR equ 2 +FB_BGRA equ 3 + + + +; mmap entry, type is stored in least significant tetrad of size +virtual at 0 + mmap_ent.ptr: dq 0 + mmap_ent.size: dq 0 +end virtual +; we don't have entry field macros for asm +; realsize = size & 0xFFFFFFFFFFF0 +; type = size & 0xF + + +MMAP_USED equ 0 +MMAP_FREE equ 1 +MMAP_ACPIFREE equ 2 +MMAP_ACPINVS equ 3 +MMAP_MMIO equ 4 + +INITRD_MAXSIZE equ 16 ; Mb + +virtual at bootboot + bootboot.magic: dd 0 + bootboot.size: dd 0 + + bootboot.protocol_ver:db 1 + bootboot.loader_type: db 0 + bootboot.pagesize: db 0 + bootboot.fb_type: db 0 + + bootboot.timezone: dw 0 + bootboot.bspid: dw 0 + + bootboot.datetime: dq 0 + + bootboot.initrd_ptr: dq 0 + bootboot.initrd_size: dq 0 + + bootboot.fb_ptr: dq 0 + bootboot.fb_size: dd 0 + bootboot.fb_width: dd 0 + bootboot.fb_height: dd 0 + bootboot.fb_scanline: dd 0 + + ; architecture specific pointers + + + bootboot.acpi_ptr: dq 0 + bootboot.smbi_ptr: dq 0 + bootboot.efi_ptr: dq 0 + bootboot.mp_ptr: dq 0 + bootboot.unused: dq 0,0,0,0 + + bootboot.mmap: +end virtual + + + + + diff --git a/x86_64-bios/fs.inc b/x86_64-bios/fs.inc new file mode 100644 index 0000000..b66123c --- /dev/null +++ b/x86_64-bios/fs.inc @@ -0,0 +1,502 @@ +;* +;* x86_64-bios/fs.inc +;* +;* Copyright (C) 2017 bzt (bztsrc@gitlab) +;* +;* Permission is hereby granted, free of charge, to any person +;* obtaining a copy of this software and associated documentation +;* files (the "Software"), to deal in the Software without +;* restriction, including without limitation the rights to use, copy, +;* modify, merge, publish, distribute, sublicense, and/or sell copies +;* of the Software, and to permit persons to whom the Software is +;* furnished to do so, subject to the following conditions: +;* +;* The above copyright notice and this permission notice shall be +;* included in all copies or substantial portions of the Software. +;* +;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;* DEALINGS IN THE SOFTWARE. +;* +;* This file is part of the BOOTBOOT Protocol package. +;* @brief Filesystem drivers for initial ramdisk. +;* + +FSZ_SUPPORT equ 1 + +;********************************************************************* +;* File System Drivers * +;********************************************************************* + + USE32 +fsdrivers: +if FSZ_SUPPORT eq 1 + dw fsz_initrd +end if + dw cpio_initrd + dw tar_initrd + dw sfs_initrd + dw jamesm_initrd + dw 0 + +if FSZ_SUPPORT eq 1 +; ----------- FS/Z ---------- +; Find the kernel on initrd +; IN: esi: initrd pointer, ecx: initrd end, edi: kernel filename +; OUT: On Success +; esi: pointer to the first byte, ecx: size in bytes +; On Error +; ecx: 0 +fsz_initrd: + mov ebx, ecx + xor ecx, ecx + ; FS/Z superblock + ; get root dir inode + mov eax, dword [esi+560] ; FSZ_SuperBlock.rootdirfid + shl eax, 12 + add esi, eax + cmp dword [esi], 'FSIN' + je @f +.nolib: mov esi, nolib +.err: xor ecx, ecx + ret +.nocore: mov esi, nocore + jmp .err +@@: ; it has inlined data? +.again: add esi, 1024 ; FSZ_Inode.inlinedata + cmp dword [esi], 'FSDR' + je .srchdir + ; no, locate the data + mov ecx, dword [esi] + mov eax, dword [esi-1024+448] ; FSZ_Inode.sec + shl eax, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, eax + cmp dword [esi], 'FSDR' + je .srchdir + ; inlined sector directory or list? + shl ecx, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, ecx + cmp dword [esi], 'FSDR' + jne .nolib +.srchdir: ; find sys/ + mov ecx, dword [esi+16] ; FSZ_DirEntHeader.numentries + mov eax, dword [edi] +@@: add esi, 128 ; directories than + cmp dword [esi+17], eax + je @f + dec ecx + jnz @b + jmp .nolib + ; found, get it's inode +@@: + mov eax, dword [esi] + shl eax, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, eax + cmp dword [esi], 'FSIN' + jne .nolib + + ;this is not bullet proof + add edi, 4 + cmp byte [edi+3], '/' + je .again + + ; it has inlined data? + add esi, 1024 ; FSZ_Inode.inlinedata + cmp dword [esi], 'FSDR' + je .srchcore + ; no, locate the data + mov ecx, dword [esi] + mov eax, dword [esi-1024+448] ; FSZ_Inode.sec + shl eax, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, eax + cmp dword [esi], 'FSDR' + je .srchdir + ; inlined sector directory or list? + shl ecx, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, ecx + cmp dword [esi], 'FSDR' + jne .nolib + +.srchcore: ; find filename + mov ecx, dword [esi+16] ; FSZ_DirEntHeader.numentries + ;filename, 8 characters supported + mov eax, dword [edi] + mov edx, dword [edi+4] +@@: add esi, 128 + cmp dword [esi+21], edx + jne .not + cmp dword [esi+17], eax + je @f +.not: dec ecx + jnz @b + jmp .nocore + ; found, get it's inode +@@: mov eax, dword [esi] + shl eax, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, eax + cmp dword [esi], 'FSIN' + jne .nocore + ; get data + mov eax, dword [esi+448] ; FSZ_Inode.sec + mov ecx, dword [esi+464] ; FSZ_Inode.size + mov bl, byte [esi+492] ; FSZ_Inode.flags + + ; inline + cmp bl, 0FFh ; FSZ_IN_FLAG_INLINE + jne @f + add esi, 1024 + ret + ; direct data block +@@: or bl, bl ; FSZ_IN_FLAG_DIRECT + je .load + ; inlined sector directory or sector list +@@: cmp bl, 07Fh ; FSZ_IN_FLAG_SDINLINE + je @f + cmp bl, 080h ; FSZ_IN_FLAG_SECLIST + je @f + cmp bl, 1 ; FSZ_IN_FLAG_SD + jne .nocore + shl eax, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, eax + mov eax, dword [esi] ; first FSZ_SectorList.sec + jmp .load +@@: add esi, 1024 + ; sector directory at esi, file size in ecx + mov eax, dword [esi] ; first FSZ_SectorList.sec +.load: shl eax, 12 + mov esi, dword [bootboot.initrd_ptr] + add esi, eax + ret +end if + +; ----------- cpio ---------- +; Find the kernel on initrd +; IN: esi: initrd pointer, ecx: initrd end, edi: kernel filename +; OUT: On Success +; esi: pointer to the first byte, ecx: size in bytes +; On Error +; ecx: 0 +cpio_initrd: + ; upper bound + mov ebx, ecx + xor ecx, ecx + ; strlen(kernel) + mov eax, edi + or eax, eax + jz .err + cmp byte [eax], 0 + jz .err + xor ecx, ecx +@@: inc ecx + inc eax + cmp byte [eax], 0 + jnz @b + mov dword [.ks], ecx + ; while(ptr.magic=='070707' && ptr +#include +#include +#include +#include + +/* the BOOTBOOT 1st stage loader code */ +extern unsigned char *_binary____boot_bin_start; + +/* entry point */ +int main(int argc, char** argv) +{ + // variables + unsigned char bootrec[512], data[512]; + int f, lba=0, lsn, bootlsn=-1; + + // check arguments + if(argc < 2) { + printf( "BOOTBOOT mkboot utility - bztsrc@gitlab\n\nUsage:\n" + " ./mkboot [partition lba]\n\n" + "Installs boot record on a disk. Disk can be a local file, a disk or partition\n" + "device. If you want to install it on a partition, you'll have to specify the\n" + "starting LBA of that partition as well. Requires that bootboot.bin is already\n" + "copied on the disk in a contiguous area in order to work.\n\n" + "Examples:\n" + " ./mkboot diskimage.dd - installing on a disk image\n" + " ./mkboot /dev/sda - installing as MBR\n" + " ./mkboot /dev/sda1 123 - installing as VBR\n"); + return 1; + } + if(argc > 2 || argv[2]!=NULL) { + lba = atoi(argv[2]); + } + // open file + f = open(argv[1], O_RDONLY); + if(f < 0) { + fprintf(stderr, "mkboot: file not found\n"); + return 2; + } + // read the boot record + if(read(f, data, 512)==-1) { + close(f); + fprintf(stderr, "mkboot: unable to read file\n"); + return 2; + } + // create the boot record. First copy the code then the data area from original sector on disk + memcpy((void*)&bootrec, (void*)&_binary____boot_bin_start, 512); + memcpy((void*)&bootrec+0xB, (void*)&data+0xB, 0x5A-0xB); // copy BPB (if any) + memcpy((void*)&bootrec+0x1B8, (void*)&data+0x1B8, 510-0x1B8); // copy WNTID and partitioning table (if any) + // now locate the second stage by magic bytes + for(lsn = 1; lsn < 1024*1024; lsn++) { + printf("Checking sector %d\r", lsn); + if(read(f, data, 512) != -1 && + data[0] == 0x55 && data[1] == 0xAA && data[3] == 0xE9 && data[8] == 'B' && data[12] == 'B') { + bootlsn=lsn; + break; + } + } + close(f); + // add bootboot.bin's address to boot record + if(bootlsn == -1) { + fprintf(stderr, "mkboot: unable to locate 2nd stage (bootboot.bin) in the first 512 Mbyte\n"); + return 2; + } + bootlsn += lba; + memcpy((void*)&bootrec+0x1B0, (void*)&bootlsn, 4); + // save boot record + f = open(argv[1], O_WRONLY); + if(f < 0 || write(f, bootrec, 512) <= 0) { + fprintf(stderr, "mkboot: unable to write boot record\n"); + return 3; + } + close(f); + // all went well + printf("mkboot: BOOTBOOT installed, 2nd stage starts at LBA %d\n", bootlsn); +} diff --git a/x86_64-bios/tinf.inc b/x86_64-bios/tinf.inc new file mode 100644 index 0000000..f2d16bf --- /dev/null +++ b/x86_64-bios/tinf.inc @@ -0,0 +1,500 @@ +;* +;* x86_64-bios/tinf.inc +;* +;* Copyright (C) 2017 bzt (bztsrc@gitlab) +;* +;* Permission is hereby granted, free of charge, to any person +;* obtaining a copy of this software and associated documentation +;* files (the "Software"), to deal in the Software without +;* restriction, including without limitation the rights to use, copy, +;* modify, merge, publish, distribute, sublicense, and/or sell copies +;* of the Software, and to permit persons to whom the Software is +;* furnished to do so, subject to the following conditions: +;* +;* The above copyright notice and this permission notice shall be +;* included in all copies or substantial portions of the Software. +;* +;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;* DEALINGS IN THE SOFTWARE. +;* +;* This file is part of the BOOTBOOT Protocol package. +;* @brief Tiny inflate, ported after tinflate.c by bzt +;* + +;IN: +; esi: gzipped initrd +; edi: output buffer (guaranteed to be big enough) +; ecx: output buffer size +tinf_uncompress: + push ecx + push edi + mov edi, tinf_bss_start + mov ecx, tinf_bss_end-tinf_bss_start + xor al, al + repnz stosb + pop edi + pop ecx + mov dword [d_end], ecx + add dword [d_end], edi +.again: + ; start a new block + cmp byte [d_btype], 255 + jne .notst + ; read final block flag +.next_blk: call tinf_getbit + mov byte [d_bfinal], al + ; read block type + xor ebx, ebx + mov cl, 2 + call tinf_read_bits + mov byte [d_btype], al + ; build fixed huffman trees + cmp al, 1 + jne @f + call tinf_build_fixed_trees + xor al, al + ; decode trees from stream +@@: cmp al, 2 + jne @f + call tinf_decode_trees +@@: +.notst: + ; process current block + cmp byte [d_btype], 0 + jnz @f + ; decompress uncompressed block + call tinf_inflate_uncompressed_block + JMP .procend +@@: cmp byte [d_btype], 1 + je @f + cmp byte [d_btype], 2 + jne tinf_err + ; decompress block with fixed/dyanamic huffman trees + ; trees were decoded previously, so it's the same routine for both +@@: call tinf_inflate_block_data +.procend: cmp al, 1 + jne @f + cmp byte [d_bfinal], 0 + ; the block has ended (without producing more data), but we + ; can't return without data, so start procesing next block + jz .next_blk + ret +@@: or al, al + jnz tinf_err + cmp edi, dword [d_end] + jbe .again + ret + +; build the fixed huffman trees +tinf_build_fixed_trees: + push edi + xor ecx, ecx + xor eax, eax + ; build fixed length tree + mov cl, 7 + mov edi, d_ltree_table + repnz stosb + mov al, 24 + stosb + mov al, 152 + stosb + mov al, 112 + stosb + mov edi, d_ltree_trans + + mov cl, 24 + mov ax, 256 +@@: stosw + inc ax + dec cl + jnz @b + + mov cl, 144 + xor ax, ax +@@: stosw + inc ax + dec cl + jnz @b + + mov cl, 8 + mov ax, 280 +@@: stosw + inc ax + dec cl + jnz @b + + mov cl, 112 + mov ax, 144 +@@: stosw + inc ax + dec cl + jnz @b + + ; build fixed distance tree + mov cl, 5 + mov edi, d_dtree_table + xor al, al + repnz stosb + mov al, 32 + stosb + + mov edi, d_dtree_trans + mov cl, 32 + xor ax, ax +@@: stosw + inc ax + dec cl + jnz @b + + pop edi + ret + +;IN: +; ebp: TINF_TREE +; ebx: lengths +; ecx: num +tinf_build_tree: + push edi + xor eax, eax + ; clear code length count table + mov edi, ebp + stosd ; for(i=0;i<16;i++) table[i]=0; + stosd + stosd + stosd + + ; scan symbol lengths, and sum code length counts + push ebx + push ecx +@@: mov al, byte [ebx] ;lengths[i] + inc ebx + inc byte [ebp+eax] ;table[lengths[i]]++ + dec cx + jnz @b + mov byte [ebp], 0 + + ; compute offset table for distribution sort + mov cl, 16 + xor edx, edx ;i + xor ebx, ebx ;sum + xor eax, eax +@@: mov word [offs+2*edx], bx + mov al, byte [ebp+edx] + add ebx, eax + inc edx + dec cl + jnz @b + + pop ecx + pop ebx ;lengths + + ; create code->symbol translation table (symbols sorted by code) + xor eax, eax ;i +@@: cmp byte [ebx], 0 + jz .null + xor edx, edx + mov dl, byte [ebx] ;lengths[i] + inc word [offs+2*edx] + mov dx, word [offs+2*edx] + dec dx + mov word [ebp+2*edx+16], ax +.null: inc ebx + inc eax + dec cx + jnz @b + + pop edi + ret + +tinf_decode_trees: + mov word [num], 0 + + ; get 5 bits HLIT (257-286) + xor ecx, ecx + mov cl, 5 + mov ebx, 257 + call tinf_read_bits + mov word [hlit], ax + mov word [num], ax + + ; get 5 bits HDIST (1-32) + mov cl, 5 + xor ebx, ebx + inc ebx + call tinf_read_bits + mov word [hdist], ax + add word [num], ax + + ; get 4 bits HCLEN (4-19) + mov cl, 4 + mov ebx, ecx + call tinf_read_bits + mov word [hclen], ax + + push edi + mov cl, 19 + mov edi, lengths + xor ax, ax + repnz stosw + pop edi + + ; read code lengths for code length alphabet + mov edx, clcidx + ; get 3 bits code length (0-7) +@@: mov cx, 3 + xor ebx, ebx + call tinf_read_bits + xor ebx, ebx + mov bl, byte [edx] ;clcidx[i] + mov byte[ebx+lengths], al + inc edx + dec word [hclen] + jnz @b + + ; build code length tree, temporarily use length tree + mov ebp, d_ltree + mov ebx, lengths + xor ecx, ecx + mov cl, 19 + call tinf_build_tree + + ; decode code lengths for the dynamic trees + mov edx, lengths +.decode: mov ebp, d_ltree + call tinf_decode_symbol + xor ebx, ebx + cmp al, 16 + jne .not16 + ; copy previous code length 3-6 times (read 2 bits) + mov cl, 2 + mov bl, 3 + call tinf_read_bits + mov cx, ax + mov al, byte [edx-1] ;lengths[num-1] +@@: mov byte [edx], al + inc edx + dec word [num] + dec cl + jnz @b + jmp .next + +.not16: cmp al, 17 + jne .not17 + ; repeat code length 0 for 3-10 times (read 3 bits) + mov cl, 3 + mov bl, cl + call tinf_read_bits + mov cx, ax +@@: mov byte [edx], 0 + inc edx + dec word [num] + dec cl + jnz @b + jmp .next + +.not17: cmp al, 18 + jne .not18 + ; repeat code length 0 for 11-138 times (read 7 bits) + mov cl, 7 + mov bl, 11 + call tinf_read_bits + mov cx, ax +@@: mov byte [edx], 0 + inc edx + dec word [num] + dec cl + jnz @b + jmp .next + +.not18: ; values 0-15 represent the actual code lengths + mov byte [edx], al + inc edx + dec word [num] + +.next: cmp word [num], 0 + jnz .decode + + ; build dynamic trees + mov ebp, d_ltree + mov ebx, lengths + xor ecx, ecx + mov cx, word [hlit] + call tinf_build_tree + + mov ebp, d_dtree + mov ebx, lengths + xor ecx, ecx + mov cx, word [hlit] + add ebx, ecx + mov cx, word [hdist] + call tinf_build_tree + ret + +;OUT: +; al: status +tinf_inflate_block_data: + cmp word [d_curlen], 0 + jne .notnull + mov ebp, d_ltree + call tinf_decode_symbol + ; literal byte + cmp ax, 256 + jae @f + stosb + xor al, al + ret +@@: cmp ax, 256 + jne @f + ; end of block + mov al, 1 + ret +@@: ; substring from sliding dictionary + sub eax, 257 + ; possibly get more bits from length code + xor ecx, ecx + mov cl, byte [length_bits+eax] + xor ebx, ebx + mov bx, word [length_base+2*eax] + call tinf_read_bits + mov word [d_curlen], ax + ; possibly get more bits from distance code + mov ebp, d_dtree + call tinf_decode_symbol + xor ecx, ecx + mov cl, byte [dist_bits+eax] + xor ebx, ebx + mov bx, word [dists_base+2*eax] + call tinf_read_bits + cmp dword [d_dict_ring], 0 + neg eax + mov dword [d_lzOff], eax +.notnull: mov eax, edi + add eax, dword [d_lzOff] + mov al, byte [eax] + stosb +@@: dec word [d_curlen] + xor al, al + ret + +;OUT: +; al: status +tinf_inflate_uncompressed_block: + cmp word [d_curlen], 0 + jne @f + ; get length + lodsw + ; get one's complement of length + add esi, 2 + ; increment length to properly return TINF_DONE below, without + ; producing data at the same time + mov word [d_curlen], ax + inc word [d_curlen] + ; make sure we start next block on a byte boundary + mov byte [d_bitcount], 0 +@@: dec byte [d_curlen] + cmp byte [d_curlen], 0 + jnz @f + mov al, 1 + ret +@@: movsb + xor al, al + ret + +;OUT: +; al,zeroflag bit +tinf_getbit: + mov al, byte [d_bitcount] + or al, al + jnz @f + lodsb + mov byte [d_tag], al + mov byte [d_bitcount], 8 +@@: dec byte [d_bitcount] + xor ax, ax + shr byte [d_tag], 1 + adc ax, 0 + ret + +;IN: +; ebx: base +; cl: num +;OUT: +; eax: bits +tinf_read_bits: + push edx + or cl, cl + jz .end + xor eax, eax + xor edx, edx + inc dl +.next: call tinf_getbit + jz @f + add ebx, edx +@@: shl edx, 1 + dec cl + jnz .next +.end: pop edx + mov eax, ebx + ret + +;IN: +; ebp: TINF_TREE +;OUT: +; eax: trans +tinf_decode_symbol: + push edx + xor eax, eax + xor ebx, ebx ;cur + xor ecx, ecx ;len + xor edx, edx ;sum + ; get more bits while code value is above sum +@@: shl ebx, 1 + call tinf_getbit + add ebx, eax + inc ecx + mov al, byte [ebp+ecx] + add edx, eax + sub ebx, eax + jns @b + add edx, ebx + mov ax, word [ebp+2*edx+16] +mov ebp, edx + pop edx + ret + +tinf_err: + mov esi, nogzip + jmp prot_diefunc + +length_bits: + db 0, 0, 0, 0, 0, 0, 0, 0 + db 1, 1, 1, 1, 2, 2, 2, 2 + db 3, 3, 3, 3, 4, 4, 4, 4 + db 5, 5, 5, 5, 0, 0, 0, 0 +length_base: + dw 3, 4, 5, 6, 7, 8, 9, 10 + dw 11, 13, 15, 17, 19, 23, 27, 31 + dw 35, 43, 51, 59, 67, 83, 99, 115 + dw 131, 163, 195, 227, 258, 0, 0 +dist_bits: + db 0, 0, 0, 0, 1, 1, 2, 2 + db 3, 3, 4, 4, 5, 5, 6, 6 + db 7, 7, 8, 8, 9, 9, 10, 10 + db 11, 11, 12, 12, 13, 13, 0, 0 +dists_base: + dw 1, 2, 3, 4, 5, 7, 9, 13 + dw 17, 25, 33, 49, 65, 97, 129, 193 + dw 257, 385, 513, 769, 1025, 1537, 2049, 3073 + dw 4097, 6145, 8193, 12289, 16385, 24577, 0, 0 +clcidx: + db 16, 17, 18, 0, 8, 7, 9, 6 + db 10, 5, 11, 4, 12, 3, 13, 2 + db 14, 1, 15 + +d_btype: db 255 diff --git a/x86_64-efi/Makefile b/x86_64-efi/Makefile new file mode 100644 index 0000000..7053bdf --- /dev/null +++ b/x86_64-efi/Makefile @@ -0,0 +1,35 @@ +ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) +GNUEFI_INCLUDES = -I/usr/include -I. -I/usr/include/efi -I/usr/include/efi/$(ARCH) -I/usr/include/efi/protocol +GNUEFI_CRT_OBJS = crt0-efi-$(ARCH).o +GNUEFI_LDS = elf_$(ARCH)_efi.lds + +CFLAGS = -mno-red-zone -mno-mmx -mno-sse -O2 -fpic -Wall -Wextra -Werror -fshort-wchar -fno-strict-aliasing -ffreestanding -fno-stack-protector -fno-stack-check -DCONFIG_$(ARCH) -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11 + +LDFLAGS = -nostdlib +LDFLAGS += -shared -Bsymbolic -L. $(GNUEFI_CRT_OBJS) + +TARGET = bootboot.efi + +all: tinflate.o $(TARGET) + +%.efi: %.so + @echo " src x86_64-efi (UEFI)" + @objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target efi-app-$(ARCH) --subsystem=13 $^ $@ + @echo -n "BOOTBOOT Loader do not " | dd conv=notrunc of=$(TARGET) bs=1 seek=78 1>/dev/null 2>/dev/null + @gcc $(GNUEFI_INCLUDES) -Wall -fshort-wchar efirom.c -o efirom $(LIBS) + @./efirom $(TARGET) ../bootboot.rom || true + @mv $(TARGET) ../$(TARGET) + @rm tinflate.o efirom + +%.so: %.o + @ld $(LDFLAGS) tinflate.o $^ -o $@ -lefi -lgnuefi -T $(GNUEFI_LDS) + +%.o: %.c + @gcc $(GNUEFI_INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.S + @gcc $(GNUEFI_INCLUDES) $(CFLAGS) -c $< -o $@ + +clean: + @rm bootboot.o $(TARGET) ../$(TARGET) ../bootboot.rom *.so *.efi efirom tinflate.o 2>/dev/null || true + diff --git a/x86_64-efi/README.md b/x86_64-efi/README.md new file mode 100644 index 0000000..52093b8 --- /dev/null +++ b/x86_64-efi/README.md @@ -0,0 +1,35 @@ +BOOTBOOT UEFI Implementation +============================ + +See [BOOTBOOT Protocol](https://gitlab.com/bztsrc/bootboot) for common details. + +On [UEFI machines](http://www.uefi.org/), the PCI Option ROM is created from the standard EFI +OS loader application. + +Machine state +------------- + +IRQs masked. GDT unspecified, but valid, IDT unset. Code is running in supervisor mode in ring 0. + +File system drivers +------------------- + +For boot partition, UEFI version relies on any file system that's supported by EFI Simple File System Protocol. + +Installation +------------ + +1. *UEFI disk*: copy __bootboot.efi__ to **_FS0:\EFI\BOOT\BOOTX64.EFI_**. + +2. *UEFI ROM*: use __bootboot.rom__ which is a standard **_PCI Option ROM image_**. + +3. *GRUB*, *UEFI Boot Manager*: add __bootboot.efi__ to boot options. + +Limitations +----------- + +Known limitations: + + - Maps the first 16G of RAM. + - PCI Option ROM should be signed in order to work. + - Compressed initrd in ROM is limited to 16M. diff --git a/x86_64-efi/bootboot.c b/x86_64-efi/bootboot.c new file mode 100644 index 0000000..18eb071 --- /dev/null +++ b/x86_64-efi/bootboot.c @@ -0,0 +1,1076 @@ +/* + * x86_64-efi/bootboot.c + * + * Copyright (C) 2017 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the BOOTBOOT Protocol package. + * @brief Booting code for EFI + * + */ + +// DEBUG defined in efidebug.h + +#define BBDEBUG 1 +//#define GOP_DEBUG BBDEBUG + +#if BBDEBUG +#define DBG(fmt, ...) do{Print(fmt,__VA_ARGS__); }while(0); +#else +#define DBG(fmt, ...) +#endif + +// get UEFI functions and environment +#include +#include +#include +#include +// get BOOTBOOT specific stuff +#include "../bootboot.h" +#include "tinf.h" +// comment out this include if you don't want FS/Z support +#include "../../osZ/etc/include/fsZ.h" +// get filesystem drivers for initrd +#include "fs.h" + +/*** ELF64 defines and structs ***/ +#define ELFMAG "\177ELF" +#define SELFMAG 4 +#define EI_CLASS 4 /* File class byte index */ +#define ELFCLASS64 2 /* 64-bit objects */ +#define EI_DATA 5 /* Data encoding byte index */ +#define ELFDATA2LSB 1 /* 2's complement, little endian */ +#define PT_LOAD 1 /* Loadable program segment */ +#define EM_X86_64 62 /* AMD x86-64 architecture */ + +typedef struct +{ + unsigned char e_ident[16];/* Magic number and other info */ + UINT16 e_type; /* Object file type */ + UINT16 e_machine; /* Architecture */ + UINT32 e_version; /* Object file version */ + UINT64 e_entry; /* Entry point virtual address */ + UINT64 e_phoff; /* Program header table file offset */ + UINT64 e_shoff; /* Section header table file offset */ + UINT32 e_flags; /* Processor-specific flags */ + UINT16 e_ehsize; /* ELF header size in bytes */ + UINT16 e_phentsize; /* Program header table entry size */ + UINT16 e_phnum; /* Program header table entry count */ + UINT16 e_shentsize; /* Section header table entry size */ + UINT16 e_shnum; /* Section header table entry count */ + UINT16 e_shstrndx; /* Section header string table index */ +} Elf64_Ehdr; + +typedef struct +{ + UINT32 p_type; /* Segment type */ + UINT32 p_flags; /* Segment flags */ + UINT64 p_offset; /* Segment file offset */ + UINT64 p_vaddr; /* Segment virtual address */ + UINT64 p_paddr; /* Segment physical address */ + UINT64 p_filesz; /* Segment size in file */ + UINT64 p_memsz; /* Segment size in memory */ + UINT64 p_align; /* Segment alignment */ +} Elf64_Phdr; + +/*** PE32+ defines and structs ***/ +#define MZ_MAGIC 0x5a4d /* "MZ" */ +#define PE_MAGIC 0x00004550 /* "PE\0\0" */ +#define IMAGE_FILE_MACHINE_AMD64 0x8664 /* AMD x86_64 architecture */ +#define PE_OPT_MAGIC_PE32PLUS 0x020b /* PE32+ format */ +typedef struct +{ + UINT16 magic; /* MZ magic */ + UINT16 reserved[29]; /* reserved */ + UINT32 peaddr; /* address of pe header */ +} mz_hdr; + +typedef struct { + UINT32 magic; /* PE magic */ + UINT16 machine; /* machine type */ + UINT16 sections; /* number of sections */ + UINT32 timestamp; /* time_t */ + UINT32 sym_table; /* symbol table offset */ + UINT32 symbols; /* number of symbols */ + UINT16 opt_hdr_size; /* size of optional header */ + UINT16 flags; /* flags */ + UINT16 file_type; /* file type, PE32PLUS magic */ + UINT8 ld_major; /* linker major version */ + UINT8 ld_minor; /* linker minor version */ + UINT32 text_size; /* size of text section(s) */ + UINT32 data_size; /* size of data section(s) */ + UINT32 bss_size; /* size of bss section(s) */ + INT32 entry_point; /* file offset of entry point */ + INT32 code_base; /* relative code addr in ram */ +} pe_hdr; + +/*** EFI defines and structs ***/ +extern EFI_GUID GraphicsOutputProtocol; +extern EFI_GUID LoadedImageProtocol; +struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL; +struct EFI_FILE_PROTOCOL; + +typedef +EFI_STATUS +(EFIAPI *EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME)( + IN struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, + OUT struct EFI_FILE_PROTOCOL **Root + ); + +/* Intel EFI headers has simple file protocol, but not GNU EFI */ +#ifndef EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION +typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL { + UINT64 Revision; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume; +} EFI_SIMPLE_FILE_SYSTEM_PROTOCOL; + +typedef struct _EFI_FILE_PROTOCOL { + UINT64 Revision; + EFI_FILE_OPEN Open; + EFI_FILE_CLOSE Close; + EFI_FILE_DELETE Delete; + EFI_FILE_READ Read; + EFI_FILE_WRITE Write; + EFI_FILE_GET_POSITION GetPosition; + EFI_FILE_SET_POSITION SetPosition; + EFI_FILE_GET_INFO GetInfo; + EFI_FILE_SET_INFO SetInfo; + EFI_FILE_FLUSH Flush; +} EFI_FILE_PROTOCOL; +#endif + +#ifndef EFI_PCI_OPTION_ROM_TABLE_GUID +#define EFI_PCI_OPTION_ROM_TABLE_GUID \ + { 0x7462660f, 0x1cbd, 0x48da, {0xad, 0x11, 0x91, 0x71, 0x79, 0x13, 0x83, 0x1c} } +typedef struct { + EFI_PHYSICAL_ADDRESS RomAddress; + EFI_MEMORY_TYPE MemoryType; + UINT32 RomLength; + UINT32 Seg; + UINT8 Bus; + UINT8 Dev; + UINT8 Func; + BOOLEAN ExecutedLegacyBiosImage; + BOOLEAN DontLoadEfiRom; +} EFI_PCI_OPTION_ROM_DESCRIPTOR; + +typedef struct { + UINT64 PciOptionRomCount; + EFI_PCI_OPTION_ROM_DESCRIPTOR *PciOptionRomDescriptors; +} EFI_PCI_OPTION_ROM_TABLE; +#endif + +/*** other defines and structs ***/ +typedef struct { + UINT8 magic[8]; + UINT8 chksum; + CHAR8 oemid[6]; + UINT8 revision; + UINT32 rsdt; + UINT32 length; + UINT64 xsdt; + UINT32 echksum; +} __attribute__((packed)) ACPI_RSDPTR; + +#define PAGESIZE 4096 + +/*** common variables ***/ +file_t env; // environment file descriptor +file_t initrd; // initrd file descriptor +file_t core; // kernel file descriptor +BOOTBOOT *bootboot; // the BOOTBOOT structure +UINT64 *paging; // paging table for MMU +UINT64 entrypoint; // kernel entry point +EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume; +EFI_FILE_HANDLE RootDir; +EFI_FILE_PROTOCOL *Root; +unsigned char *kne; + +// default environment variables. M$ states that 1024x768 must be supported +int reqwidth = 1024, reqheight = 768; +char *kernelname="sys/core"; + +// alternative environment name +char *cfgname="sys/config"; + +/** + * function to convert ascii to number + */ +int atoi(unsigned char*c) +{ + int r=0; + while(*c>='0'&&*c<='9') { + r*=10; r+=*c-'0'; + c++; + } + return r; +} + +/** + * convert ascii to unicode characters + */ +CHAR16 * +a2u (char *str) +{ + static CHAR16 mem[PAGESIZE]; + int i; + + for (i = 0; str[i]; ++i) + mem[i] = (CHAR16) str[i]; + mem[i] = 0; + return mem; +} + +/** + * report status with message to standard output + */ +EFI_STATUS +report(EFI_STATUS Status,CHAR16 *Msg) +{ + Print(L"BOOTBOOT-PANIC: %s (EFI %r)\n",Msg,Status); + return Status; +} + +/** + * convert ascii octal number to binary number + */ +int oct2bin(unsigned char *str,int size) +{ + int s=0; + unsigned char *c=str; + while(size-->0){ + s*=8; + s+=*c-'0'; + c++; + } + return s; +} + +/** + * convert ascii hex number to binary number + */ +int hex2bin(unsigned char *str, int size) +{ + int v=0; + while(size-->0){ + v <<= 4; + if(*str>='0' && *str<='9') + v += (int)((unsigned char)(*str)-'0'); + else if(*str >= 'A' && *str <= 'F') + v += (int)((unsigned char)(*str)-'A'+10); + str++; + } + return v; +} + +/** + * Parse FS0:\BOOTBOOT\CONFIG or /sys/config + */ +EFI_STATUS +ParseEnvironment(unsigned char *cfg, int len, INTN argc, CHAR16 **argv) +{ + unsigned char *ptr=cfg-1; + int i; + // failsafe + if(len>PAGESIZE-1) { + len=PAGESIZE-1; + } + // append temporary variables provided on EFI command line + // if a key exists multiple times, the last is used + cfg[len]=0; + if(argc>2){ + ptr=cfg+len; + for(i=3;iHorizontalResolution, info->VerticalResolution, info->PixelFormat,valid?' ':'?'); + DBG(L"r:%x g:%x b:%x\n", + info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor?0xff:( + info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor?0xff0000:( + info->PixelFormat==PixelBitMask?info->PixelInformation.RedMask:0)), + info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor || + info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor?0xff00:( + info->PixelFormat==PixelBitMask?info->PixelInformation.GreenMask:0), + info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor?0xff0000:( + info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor?0xff:( + info->PixelFormat==PixelBitMask?info->PixelInformation.BlueMask:0))); +#endif + } + // if we have found a new, better mode + if(selectedMode != 9999 && selectedMode != nativeMode) { + status = uefi_call_wrapper(gop->SetMode, 2, gop, selectedMode); + if(!EFI_ERROR(status)) + nativeMode = selectedMode; + } + // get framebuffer properties + bootboot->fb_ptr=(void*)gop->Mode->FrameBufferBase; + bootboot->fb_size=gop->Mode->FrameBufferSize; + bootboot->fb_scanline=4*gop->Mode->Info->PixelsPerScanLine; + bootboot->fb_width=gop->Mode->Info->HorizontalResolution; + bootboot->fb_height=gop->Mode->Info->VerticalResolution; + bootboot->fb_type= + gop->Mode->Info->PixelFormat==PixelBlueGreenRedReserved8BitPerColor || + (gop->Mode->Info->PixelFormat==PixelBitMask && gop->Mode->Info->PixelInformation.BlueMask==0)? FB_ARGB : ( + gop->Mode->Info->PixelFormat==PixelRedGreenBlueReserved8BitPerColor || + (gop->Mode->Info->PixelFormat==PixelBitMask && gop->Mode->Info->PixelInformation.RedMask==0)? FB_ABGR : ( + gop->Mode->Info->PixelInformation.BlueMask==0xFF00? FB_RGBA : FB_BGRA + )); + DBG(L" * Screen %d x %d, scanline %d, fb @%lx %d bytes, type %d %s\n", + bootboot->fb_width, bootboot->fb_height, bootboot->fb_scanline, + bootboot->fb_ptr, bootboot->fb_size, gop->Mode->Info->PixelFormat, + bootboot->fb_type==FB_ARGB?L"ARGB":(bootboot->fb_type==FB_ABGR?L"ABGR":( + bootboot->fb_type==FB_RGBA?L"RGBA":L"BGRA"))); + return EFI_SUCCESS; +} + +/** + * Load a file from FS0 into memory + */ +EFI_STATUS +LoadFile(IN CHAR16 *FileName, OUT UINT8 **FileData, OUT UINTN *FileDataLength) +{ + EFI_STATUS status; + EFI_FILE_HANDLE FileHandle; + EFI_FILE_INFO *FileInfo; + UINT64 ReadSize; + UINTN BufferSize; + UINT8 *Buffer; + + if ((RootDir == NULL) || (FileName == NULL)) { + return report(EFI_NOT_FOUND,L"Empty Root or FileName\n"); + } + + status = uefi_call_wrapper(RootDir->Open, 5, RootDir, &FileHandle, FileName, + EFI_FILE_MODE_READ, EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM); + if (EFI_ERROR(status)) { + return status; +// Print(L"%s not found\n",FileName); +// return report(status,L"Open error"); + } + FileInfo = LibFileInfo(FileHandle); + if (FileInfo == NULL) { + uefi_call_wrapper(FileHandle->Close, 1, FileHandle); + Print(L"%s not found\n",FileName); + return report(EFI_NOT_FOUND,L"FileInfo error"); + } + ReadSize = FileInfo->FileSize; + if (ReadSize > 16*1024*1024) + ReadSize = 16*1024*1024; + FreePool(FileInfo); + + BufferSize = (UINTN)((ReadSize+PAGESIZE-1)/PAGESIZE); + status = uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, BufferSize, (EFI_PHYSICAL_ADDRESS*)&Buffer); + if (Buffer == NULL) { + uefi_call_wrapper(FileHandle->Close, 1, FileHandle); + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + } + status = uefi_call_wrapper(FileHandle->Read, 3, FileHandle, &ReadSize, Buffer); + uefi_call_wrapper(FileHandle->Close, 1, FileHandle); + if (EFI_ERROR(status)) { + uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)(Buffer), BufferSize); + Print(L"%s not found\n",FileName); + return report(status,L"Read error"); + } + + *FileData = Buffer; + *FileDataLength = ReadSize; + return EFI_SUCCESS; +} + +/** + * Locate and load the kernel in initrd + */ +EFI_STATUS +LoadCore() +{ + int i=0,bss=0; + UINT8 *ptr; + core.ptr=ptr=NULL; + while(core.ptr==NULL && fsdrivers[i]!=NULL) { + core=(*fsdrivers[i++])((unsigned char*)initrd.ptr,kernelname); + } + // if every driver failed, try brute force, scan for the first elf or pe executable + if(core.ptr==NULL) { + DBG(L" * Autodetecting kernel%s\n",""); + i=initrd.size; + core.ptr=initrd.ptr; + while(i-->0) { + Elf64_Ehdr *ehdr=(Elf64_Ehdr *)(core.ptr); + pe_hdr *pehdr=(pe_hdr*)(core.ptr + ((mz_hdr*)(core.ptr))->peaddr); + if((!CompareMem(ehdr->e_ident,ELFMAG,SELFMAG)||!CompareMem(ehdr->e_ident,"OS/Z",4))&& + ehdr->e_ident[EI_CLASS]==ELFCLASS64&& + ehdr->e_ident[EI_DATA]==ELFDATA2LSB&& + ehdr->e_machine==EM_X86_64&& + ehdr->e_phnum>0){ + break; + } + if(((mz_hdr*)(core.ptr))->magic==MZ_MAGIC && pehdr->magic == PE_MAGIC && + pehdr->machine == IMAGE_FILE_MACHINE_AMD64 && pehdr->file_type == PE_OPT_MAGIC_PE32PLUS) { + break; + } + core.ptr++; + } + core.ptr=NULL; + } + + if(core.ptr!=NULL) { + Elf64_Ehdr *ehdr=(Elf64_Ehdr *)(core.ptr); + pe_hdr *pehdr=(pe_hdr*)(core.ptr + ((mz_hdr*)(core.ptr))->peaddr); + if((!CompareMem(ehdr->e_ident,ELFMAG,SELFMAG)||!CompareMem(ehdr->e_ident,"OS/Z",4))&& + ehdr->e_ident[EI_CLASS]==ELFCLASS64&&ehdr->e_ident[EI_DATA]==ELFDATA2LSB&& + ehdr->e_machine==EM_X86_64&&ehdr->e_phnum>0){ + // Parse ELF64 + DBG(L" * Parsing ELF64 @%lx\n",core.ptr); + Elf64_Phdr *phdr=(Elf64_Phdr *)((UINT8 *)ehdr+ehdr->e_phoff); + for(i=0;ie_phnum;i++){ + if(phdr->p_type==PT_LOAD && phdr->p_vaddr>>48==0xffff) { + // hack to keep symtab and strtab for shared libraries + core.size = phdr->p_filesz + (ehdr->e_type==3?0x4000:0); + ptr = (UINT8*)ehdr + phdr->p_offset; + bss = phdr->p_memsz - core.size; + entrypoint = ehdr->e_entry; + break; + } + phdr=(Elf64_Phdr *)((UINT8 *)phdr+ehdr->e_phentsize); + } + } else if(((mz_hdr*)(core.ptr))->magic==MZ_MAGIC && pehdr->magic == PE_MAGIC && + pehdr->machine == IMAGE_FILE_MACHINE_AMD64 && pehdr->file_type == PE_OPT_MAGIC_PE32PLUS && + (INT64)pehdr->code_base>>48==0xffff) { + //Parse PE32+ + DBG(L" * Parsing PE32+ @%lx\n",core.ptr); + core.size = (pehdr->entry_point-pehdr->code_base) + pehdr->text_size + pehdr->data_size; + ptr = core.ptr; + bss = pehdr->bss_size; + entrypoint = (INT64)pehdr->entry_point; + } + if(ptr==NULL || core.size<2 || entrypoint==0) + return report(EFI_LOAD_ERROR,L"Kernel is not a valid executable"); + // create core segment + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, + (core.size + bss + PAGESIZE-1)/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&core.ptr); + if (core.ptr == NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + CopyMem((void*)core.ptr,ptr,core.size); + if(bss>0) + ZeroMem((void*)core.ptr + core.size, bss); + core.size += bss; + DBG(L" * Entry point @%lx, text @%lx %d bytes\n",entrypoint, core.ptr, core.size); + core.size = ((core.size+PAGESIZE-1)/PAGESIZE)*PAGESIZE; + return EFI_SUCCESS; + + } + return report(EFI_LOAD_ERROR,L"Kernel not found in initrd"); +} + +/** + * Main EFI application entry point + */ +EFI_STATUS +efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) +{ + EFI_LOADED_IMAGE *loaded_image = NULL; + EFI_GUID lipGuid = LOADED_IMAGE_PROTOCOL; + EFI_GUID RomTableGuid = EFI_PCI_OPTION_ROM_TABLE_GUID; + EFI_PCI_OPTION_ROM_TABLE *RomTable; + EFI_GUID bioGuid = BLOCK_IO_PROTOCOL; + EFI_BLOCK_IO *bio; + EFI_HANDLE *handles = NULL; + EFI_STATUS status=EFI_SUCCESS; + EFI_MEMORY_DESCRIPTOR *memory_map = NULL, *mement; + EFI_PARTITION_TABLE_HEADER *gptHdr; + EFI_PARTITION_ENTRY *gptEnt; + EFI_INPUT_KEY key; + UINTN i, j=0, handle_size=0,memory_map_size=0, map_key=0, desc_size=0; + UINT32 desc_version=0; + UINT64 lba_s=0,lba_e=0; + MMapEnt *mmapent, *last=NULL; + file_t ret={NULL,0}; + CHAR16 **argv, *initrdfile, *configfile, *help= + L"SYNOPSIS\n BOOTBOOT.EFI [ -h | -? | /h | /? ] [ INITRDFILE [ ENVIRONMENTFILE [...] ] ]\n\nDESCRIPTION\n Bootstraps an operating system via the BOOTBOOT Protocol.\n If arguments not given, defaults to\n FS0:\\BOOTBOOT\\INITRD as ramdisk image and\n FS0:\\BOOTBOOT\\CONFIG for boot environment.\n Additional \"key=value\" command line arguments will be appended to the\n environment. If INITRD not found, it will use the first bootable partition\n in GPT. If CONFIG not found, it will look for /sys/config inside the\n INITRD (or partition).\n\n As this is a loader, it is not supposed to return control to the shell.\n\n"; + INTN argc; + + // Initialize UEFI Library + InitializeLib(image, systab); + BS = systab->BootServices; + + // Parse command line arguments + // BOOTBOOT.EFI [-?|-h|/?|/h] [initrd [config [key=value...]] + argc = GetShellArgcArgv(image, &argv); + if(argc>1) { + if((argv[1][0]=='-'||argv[1][0]=='/')&&(argv[1][1]=='?'||argv[1][1]=='h')){ + Print(L"BOOTBOOT LOADER (build %s)\n\n%s",a2u(__DATE__),help); + return EFI_SUCCESS; + } + initrdfile=argv[1]; + } else { + initrdfile=L"\\BOOTBOOT\\INITRD"; + } + if(argc>2) { + configfile=argv[2]; + } else { + configfile=L"\\BOOTBOOT\\CONFIG"; + } + + Print(L"Booting OS...\n"); + + // get memory for bootboot structure + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, 1, (EFI_PHYSICAL_ADDRESS*)&bootboot); + if (bootboot == NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + ZeroMem((void*)bootboot,PAGESIZE); + CopyMem(bootboot->magic,BOOTBOOT_MAGIC,4); + // unlike BIOS+MultiBoot bootboot, no need to check if we have + // PAE + MSR + LME, as we're already in long mode. + __asm__ __volatile__ ( + "mov $1, %%eax;" + "cpuid;" + "shrl $24, %%ebx;" + "mov %%bx,%0" + : "=b"(bootboot->bspid) : : ); + + // locate InitRD in ROM + DBG(L" * Locate initrd in Option ROMs%s\n",L""); + RomTable = NULL; initrd.ptr = NULL; initrd.size = 0; + status=EFI_LOAD_ERROR; + // first, try RomTable + LibGetSystemConfigurationTable(&RomTableGuid,(void *)&(RomTable)); + if(RomTable!=NULL) { + for (i=0;iPciOptionRomCount;i++) { + ret.ptr=(UINT8*)RomTable->PciOptionRomDescriptors[i].RomAddress; + if(ret.ptr[0]==0x55 && ret.ptr[1]==0xAA && !CompareMem(ret.ptr+8,(const CHAR8 *)"INITRD",6)) { + CopyMem(&initrd.size,ret.ptr+16,4); + initrd.ptr=ret.ptr+32; + status=EFI_SUCCESS; + break; + } + } + } + //if not found, scan memory + if(EFI_ERROR(status) || initrd.ptr==NULL){ + status = uefi_call_wrapper(BS->GetMemoryMap, 5, + &memory_map_size, memory_map, NULL, &desc_size, NULL); + if (status!=EFI_BUFFER_TOO_SMALL || memory_map_size==0) { + return report(EFI_OUT_OF_RESOURCES,L"GetMemoryMap getSize"); + } + memory_map_size+=2*desc_size; + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, + (memory_map_size+PAGESIZE-1)/PAGESIZE, + (EFI_PHYSICAL_ADDRESS*)&memory_map); + if (memory_map == NULL) { + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + } + status = uefi_call_wrapper(BS->GetMemoryMap, 5, + &memory_map_size, memory_map, &map_key, &desc_size, &desc_version); + status=EFI_LOAD_ERROR; + for(mement=memory_map; + mementPhysicalStart==0 && mement->NumberOfPages==0)) + break; + // skip free and ACPI memory + if(mement->Type==7||mement->Type==9||mement->Type==10) + continue; + // according to spec, EFI Option ROMs must start on 512 bytes boundary, not 2048 + for(ret.ptr=(UINT8*)mement->PhysicalStart; + ret.ptr<(UINT8*)mement->PhysicalStart+mement->NumberOfPages*PAGESIZE; + ret.ptr+=512) { + if(ret.ptr[0]==0x55 && ret.ptr[1]==0xAA && !CompareMem(ret.ptr+8,(const CHAR8 *)"INITRD",6)) { + CopyMem(&initrd.size,ret.ptr+16,4); + initrd.ptr=ret.ptr+32; + status=EFI_SUCCESS; + goto foundinrom; + } + } + } +foundinrom: + uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)memory_map, (memory_map_size+PAGESIZE-1)/PAGESIZE); + } + // fall back to INITRD on filesystem + if(EFI_ERROR(status) || initrd.ptr==NULL){ + // if the user presses any key now, we fallback to backup initrd + for(i=0;i<50;i++) { + // delay 5ms + uefi_call_wrapper(BS->Stall, 1, 5000); + status=uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &key); + if(status!=EFI_NOT_READY) { + Print(L" * Backup initrd\n"); + initrdfile=L"\\BOOTBOOT\\INITRD.BAK"; + break; + } + } + DBG(L" * Locate initrd in %s\n",initrdfile); + // Initialize FS with the DeviceHandler from loaded image protocol + status = uefi_call_wrapper(BS->HandleProtocol, + 3, + image, + &lipGuid, + (void **) &loaded_image); + if (!EFI_ERROR(status) && loaded_image!=NULL) { + status=EFI_LOAD_ERROR; + RootDir = LibOpenRoot(loaded_image->DeviceHandle); + // load ramdisk + status=LoadFile(initrdfile,&initrd.ptr, &initrd.size); + } + } + // if not found, try architecture specific initrd file + if(EFI_ERROR(status) || initrd.ptr==NULL){ + initrdfile=L"\\BOOTBOOT\\X86_64"; + DBG(L" * Locate initrd in %s\n",initrdfile); + status=LoadFile(initrdfile,&initrd.ptr, &initrd.size); + } + // if even that failed, look for a partition + if(status!=EFI_SUCCESS || initrd.size==0){ + DBG(L" * Locate initrd in GPT%s\n",L""); + status = uefi_call_wrapper(BS->LocateHandle, 5, ByProtocol, &bioGuid, NULL, &handle_size, handles); + if (status!=EFI_BUFFER_TOO_SMALL || handle_size==0) { + return report(EFI_OUT_OF_RESOURCES,L"LocateHandle getSize"); + } + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, (handle_size+PAGESIZE-1)/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&handles); + if(handles==NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages\n"); + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, 1, (EFI_PHYSICAL_ADDRESS*)&initrd.ptr); + if (initrd.ptr == NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + lba_s=lba_e=0; + status = uefi_call_wrapper(BS->LocateHandle, 5, ByProtocol, &bioGuid, NULL, &handle_size, handles); + for(i=0;iHandleProtocol, 3, handles[i], &bioGuid, (void **) &bio); + if(status!=EFI_SUCCESS || bio==NULL || bio->Media->BlockSize==0) + continue; + status=bio->ReadBlocks(bio, bio->Media->MediaId, 1, PAGESIZE, initrd.ptr); + if(status!=EFI_SUCCESS || CompareMem(initrd.ptr,EFI_PTAB_HEADER_ID,8)) + continue; + gptHdr = (EFI_PARTITION_TABLE_HEADER*)initrd.ptr; + if(gptHdr->NumberOfPartitionEntries>127) gptHdr->NumberOfPartitionEntries=127; + // first, look for a partition with bootable flag + ret.ptr= (UINT8*)(initrd.ptr + (gptHdr->PartitionEntryLBA-1) * bio->Media->BlockSize); + for(j=0;jNumberOfPartitionEntries;j++) { + gptEnt=(EFI_PARTITION_ENTRY*)ret.ptr; + if((ret.ptr[0]==0 && ret.ptr[1]==0 && ret.ptr[2]==0 && ret.ptr[3]==0) || gptEnt->StartingLBA==0) + break; + // use first partition with bootable flag as INITRD + if((gptEnt->Attributes & EFI_PART_USED_BY_OS)) goto partfound; + ret.ptr+=gptHdr->SizeOfPartitionEntry; + } + // if none, look for specific partition types + ret.ptr= (UINT8*)(initrd.ptr + (gptHdr->PartitionEntryLBA-1) * bio->Media->BlockSize); + for(j=0;jNumberOfPartitionEntries;j++) { + gptEnt=(EFI_PARTITION_ENTRY*)ret.ptr; + if((ret.ptr[0]==0 && ret.ptr[1]==0 && ret.ptr[2]==0 && ret.ptr[3]==0) || gptEnt->StartingLBA==0) + break; + // use the first OS/Z root partition for this architecture + if(!CompareMem(&gptEnt->PartitionTypeGUID.Data1,"OS/Z",4) && + gptEnt->PartitionTypeGUID.Data2==0x8664 && + !CompareMem(&gptEnt->PartitionTypeGUID.Data4[4],"root",4)) { +partfound: lba_s=gptEnt->StartingLBA; lba_e=gptEnt->EndingLBA; + initrd.size = (((lba_e-lba_s)*bio->Media->BlockSize + PAGESIZE-1)/PAGESIZE)*PAGESIZE; + status=EFI_SUCCESS; + goto partok; + } + ret.ptr+=gptHdr->SizeOfPartitionEntry; + } + } + return report(EFI_LOAD_ERROR,L"No boot partition"); +partok: + uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)initrd.ptr, 1); + if(initrd.size>0 && bio!=NULL) { + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, initrd.size/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&initrd.ptr); + if (initrd.ptr == NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + status=bio->ReadBlocks(bio, bio->Media->MediaId, lba_s, initrd.size, initrd.ptr); + } else + status=EFI_LOAD_ERROR; + } + if(status==EFI_SUCCESS && initrd.size>0){ + //check if initrd is gzipped + if(initrd.ptr[0]==0x1f && initrd.ptr[1]==0x8b){ + unsigned char *addr,f; + int len=0, r; + TINF_DATA d; + DBG(L" * Gzip compressed initrd @%lx %d bytes\n",initrd.ptr,initrd.size); + // skip gzip header + addr=initrd.ptr+2; + if(*addr++!=8) goto gzerr; + f=*addr++; addr+=6; + if(f&4) { r=*addr++; r+=(*addr++ << 8); addr+=r; } + if(f&8) { while(*addr++ != 0); } + if(f&16) { while(*addr++ != 0); } + if(f&2) addr+=2; + d.source = addr; + // allocate destination buffer + CopyMem(&len,initrd.ptr+initrd.size-4,4); + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, (len+PAGESIZE-1)/PAGESIZE, (EFI_PHYSICAL_ADDRESS*)&addr); + if(addr==NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages\n"); + // decompress + d.bitcount = 0; + d.bfinal = 0; + d.btype = -1; + d.dict_size = 0; + d.dict_ring = NULL; + d.dict_idx = 0; + d.curlen = 0; + d.dest = addr; + d.destSize = len; + do { r = uzlib_uncompress(&d); } while (!r); + if (r != TINF_DONE) { +gzerr: return report(EFI_COMPROMISED_DATA,L"Unable to uncompress"); + } + // swap initrd.ptr with the uncompressed buffer + // if it's not page aligned, we came from ROM, no FreePages + if(((UINT64)initrd.ptr&(PAGESIZE-1))==0) + uefi_call_wrapper(BS->FreePages, 2, (EFI_PHYSICAL_ADDRESS)initrd.ptr, (initrd.size+PAGESIZE-1)/PAGESIZE); + initrd.ptr=addr; + initrd.size=len; + } + DBG(L" * Initrd loaded @%lx %d bytes\n",initrd.ptr,initrd.size); + kne=env.ptr=NULL; + // if there's an environment file, load it + if(loaded_image!=NULL && LoadFile(configfile,&env.ptr,&env.size)!=EFI_SUCCESS) { + env.ptr=NULL; + } + if(env.ptr==NULL) { + // if there were no environment file on boot partition, find it inside the INITRD + j=0; ret.ptr=NULL; ret.size=0; + while(ret.ptr==NULL && fsdrivers[j]!=NULL) { + ret=(*fsdrivers[j++])((unsigned char*)initrd.ptr,cfgname); + } + if(ret.ptr!=NULL) { + if(ret.size>PAGESIZE-1) + ret.size=PAGESIZE-1; + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, 1, (EFI_PHYSICAL_ADDRESS*)&env.ptr); + if(env.ptr==NULL) + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + ZeroMem((void*)env.ptr,PAGESIZE); + CopyMem((void*)env.ptr,ret.ptr,ret.size); + env.size=ret.size; + } + } + if(env.ptr!=NULL) { + ParseEnvironment(env.ptr,env.size, argc, argv); + } else { + // provide an empty environment for the OS + env.size=0; + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, 1, (EFI_PHYSICAL_ADDRESS*)&env.ptr); + if (env.ptr == NULL) { + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + } + ZeroMem((void*)env.ptr,PAGESIZE); + CopyMem((void*)env.ptr,"// N/A",8); + } + + // get linear frame buffer + status = GetLFB(); + if (EFI_ERROR(status) || bootboot->fb_width==0 || bootboot->fb_ptr==0) + return report(status, L"GOP failed, no framebuffer"); + + // collect information on system + bootboot->protocol=PROTOCOL_STATIC; + bootboot->loader_type=LOADER_UEFI; + bootboot->size=128; + bootboot->pagesize=12; + CopyMem((void *)&(bootboot->initrd_ptr),&initrd.ptr,8); + bootboot->initrd_size=((initrd.size+PAGESIZE-1)/PAGESIZE)*PAGESIZE; + CopyMem((void *)&(bootboot->x86_64.efi_ptr),&systab,8); + + // System tables and structures + DBG(L" * System tables%s\n",""); + LibGetSystemConfigurationTable(&AcpiTableGuid,(void *)&(bootboot->x86_64.acpi_ptr)); + LibGetSystemConfigurationTable(&SMBIOSTableGuid,(void *)&(bootboot->x86_64.smbi_ptr)); + LibGetSystemConfigurationTable(&MpsTableGuid,(void *)&(bootboot->x86_64.mp_ptr)); + + // FIX ACPI table pointer on TianoCore... + ret.ptr = (UINT8*)(bootboot->x86_64.acpi_ptr); + if(CompareMem(ret.ptr,(const CHAR8 *)"RSDT", 4) && CompareMem(ret.ptr,(const CHAR8 *)"XSDT", 4)) { + // scan for the real rsd ptr, as AcpiTableGuid returns bad address + for(i=1;i<256;i++) { + if(!CompareMem(ret.ptr+i, (const CHAR8 *)"RSD PTR ", 8)){ + ret.ptr+=i; + break; + } + } + // get ACPI system table + ACPI_RSDPTR *rsd = (ACPI_RSDPTR*)ret.ptr; + if(rsd->xsdt!=0) + bootboot->x86_64.acpi_ptr = rsd->xsdt; + else + bootboot->x86_64.acpi_ptr = (UINT64)((UINT32)rsd->rsdt); + } + + // Date and time + EFI_TIME t; + uefi_call_wrapper(ST->RuntimeServices->GetTime, 2, &t, NULL); + bootboot->datetime[0]=DecimaltoBCD(t.Year/100); + bootboot->datetime[1]=DecimaltoBCD(t.Year%100); + bootboot->datetime[2]=DecimaltoBCD(t.Month); + bootboot->datetime[3]=DecimaltoBCD(t.Day); + bootboot->datetime[4]=DecimaltoBCD(t.Hour); + bootboot->datetime[5]=DecimaltoBCD(t.Minute); + bootboot->datetime[6]=DecimaltoBCD(t.Second); + bootboot->datetime[7]=DecimaltoBCD(t.Daylight); + CopyMem((void *)&bootboot->timezone, &t.TimeZone, 2); + if(bootboot->timezone<-1440||bootboot->timezone>1440) // TZ in mins + bootboot->timezone=0; + DBG(L" * System time %d-%02d-%02d %02d:%02d:%02d GMT%s%d:%02d %s\n", + t.Year,t.Month,t.Day,t.Hour,t.Minute,t.Second, + bootboot->timezone>=0?L"+":L"",bootboot->timezone/60,bootboot->timezone%60, + t.Daylight?L"summertime":L""); + // get sys/core and parse + status=LoadCore(); + if (EFI_ERROR(status)) + return status; + if(kne!=NULL) + *kne='\n'; + + // query size of memory map + status = uefi_call_wrapper(BS->GetMemoryMap, 5, + &memory_map_size, memory_map, NULL, &desc_size, NULL); + if (status!=EFI_BUFFER_TOO_SMALL || memory_map_size==0) { + return report(EFI_OUT_OF_RESOURCES,L"GetMemoryMap getSize"); + } + // allocate memory for memory descriptors. We assume that one or two new memory + // descriptor may created by our next allocate calls and we round up to page size + memory_map_size+=2*desc_size; + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, + (memory_map_size+PAGESIZE-1)/PAGESIZE, + (EFI_PHYSICAL_ADDRESS*)&memory_map); + if (memory_map == NULL) { + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + } + + // create page tables + uefi_call_wrapper(BS->AllocatePages, 4, 0, 2, 24, (EFI_PHYSICAL_ADDRESS*)&paging); + if (paging == NULL) { + return report(EFI_OUT_OF_RESOURCES,L"AllocatePages"); + } + ZeroMem((void*)paging,23*PAGESIZE); + DBG(L" * Pagetables PML4 @%lx\n",paging); + //PML4 + paging[0]=(UINT64)((UINT8 *)paging+4*PAGESIZE)+1; // pointer to 2M PDPE (16G RAM identity mapped) + paging[511]=(UINT64)((UINT8 *)paging+PAGESIZE)+1; // pointer to 4k PDPE (core mapped at -2M) + //4k PDPE + paging[512+511]=(UINT64)((UINT8 *)paging+2*PAGESIZE+1); + //4k PDE + for(i=0;i<31;i++) + paging[2*512+480+i]=(UINT64)(((UINT8 *)(bootboot->fb_ptr)+(i<<21))+0x81); //map framebuffer + paging[2*512+511]=(UINT64)((UINT8 *)paging+3*PAGESIZE+1); + //4k PT + paging[3*512+0]=(UINT64)(bootboot)+1; + paging[3*512+1]=(UINT64)(env.ptr)+1; + for(i=0;i<(core.size/PAGESIZE);i++) + paging[3*512+2+i]=(UINT64)((UINT8 *)core.ptr+i*PAGESIZE+1); + paging[3*512+511]=(UINT64)((UINT8 *)paging+23*PAGESIZE+1); // core stack + //identity mapping + //2M PDPE + for(i=0;i<16;i++) + paging[4*512+i]=(UINT64)((UINT8 *)paging+(7+i)*PAGESIZE+1); + //first 2M mapped per page + paging[7*512]=(UINT64)((UINT8 *)paging+5*PAGESIZE+1); + for(i=0;i<512;i++) + paging[5*512+i]=(UINT64)(i*PAGESIZE+1); + //2M PDE + for(i=1;i<512*16;i++) + paging[7*512+i]=(UINT64)((i<<21)+0x81); + + // Get memory map + int cnt=3; +get_memory_map: + DBG(L" * Memory Map @%lx %d bytes #%d\n",memory_map, memory_map_size, 4-cnt); + mmapent=(MMapEnt *)&(bootboot->mmap); + status = uefi_call_wrapper(BS->GetMemoryMap, 5, + &memory_map_size, memory_map, &map_key, &desc_size, &desc_version); + if (EFI_ERROR(status)) { + return report(status,L"GetMemoryMap"); + } + last=NULL; + for(mement=memory_map; + mementsize>=PAGESIZE-128 || + (mement->PhysicalStart==0 && mement->NumberOfPages==0)) + break; + // failsafe, don't report our own structures as free + if( mement->NumberOfPages==0 || + ((mement->PhysicalStart <= (UINT64)bootboot && + mement->PhysicalStart+(mement->NumberOfPages*PAGESIZE) > (UINT64)bootboot) || + (mement->PhysicalStart <= (UINT64)env.ptr && + mement->PhysicalStart+(mement->NumberOfPages*PAGESIZE) > (UINT64)env.ptr) || + (mement->PhysicalStart <= (UINT64)initrd.ptr && + mement->PhysicalStart+(mement->NumberOfPages*PAGESIZE) > (UINT64)initrd.ptr) || + (mement->PhysicalStart <= (UINT64)core.ptr && + mement->PhysicalStart+(mement->NumberOfPages*PAGESIZE) > (UINT64)core.ptr) || + (mement->PhysicalStart <= (UINT64)paging && + mement->PhysicalStart+(mement->NumberOfPages*PAGESIZE) > (UINT64)paging) + )) { + continue; + } + mmapent->ptr=mement->PhysicalStart; + mmapent->size=(mement->NumberOfPages*PAGESIZE)+ + ((mement->Type>0&&mement->Type<5)||mement->Type==7?MMAP_FREE: + (mement->Type==9?MMAP_ACPIFREE: + (mement->Type==10?MMAP_ACPINVS: + (mement->Type==11||mement->Type==12?MMAP_MMIO: + MMAP_USED)))); + // merge continous areas of the same type + if(last!=NULL && + MMapEnt_Type(last) == MMapEnt_Type(mmapent) && + MMapEnt_Ptr(last)+MMapEnt_Size(last) == MMapEnt_Ptr(mmapent)) { + last->size+=MMapEnt_Size(mmapent); + mmapent->ptr=mmapent->size=0; + } else { + last=mmapent; + bootboot->size+=16; + mmapent++; + } + } + // --- NO PRINT AFTER THIS POINT --- + + //inform firmware that we're about to leave it's realm + status = uefi_call_wrapper(BS->ExitBootServices, 2, image, map_key); + if(EFI_ERROR(status)){ + cnt--; + if(cnt>0) goto get_memory_map; + return report(status,L"ExitBootServices"); + } + + //set up paging + __asm__ __volatile__ ( + "mov %0,%%rax;" + "mov %%rax,%%cr3" + : : "b"(paging) : "memory" ); + + //call _start() in sys/core + __asm__ __volatile__ ( + "xorq %%rsp, %%rsp;" + "pushq %0;" + "retq" + : : "a"(entrypoint): "memory" ); + } + return report(status,L"INITRD not found"); +} + diff --git a/x86_64-efi/crt0-efi-x86_64.o b/x86_64-efi/crt0-efi-x86_64.o new file mode 100644 index 0000000000000000000000000000000000000000..82ed97d2d6259781f20e1905a3d7219cbca83a97 GIT binary patch literal 1328 zcmbu9%}T>S5Xb*%)z+#|!Gq$Z7ezq=Jt(~>sb8d^f<0Le#;uJSXjGaN+LMQ#`!0P4 zeHafufCoW$l3kl_6E9AoGxOV-*;#frFGnZG8N+}Q1A7>GiUPyT$hJb$LIFA0{g3>4 z-5%@`vj^Lx8kgtwcQTx-P}%*r{44n+g-HGNpH1ul$ckT*WHB{?qca%T&{lGxpH^pD ziv|`#GRc<&FDCT48uE!USWDq%3a_Mam~PkOXg&LW4{g?T+hsTbXC023&+goP7PxQ@ z8)wzi+5w!7+kU)Z+=YAVIX?3qRA;l&plc=j>pPNSjMG&qz7peeFce@;Bi*W|C83Zsx8lFSd{Ese)WSWf`t%xQ4O^xf5MfXe0 z(&9elqq&wmFEk<2B+HS)y3oY+3H0Q;zMm{BSAi{IQB6JH|BVs==&%2PN7{HUy%tk)3mp~Kk=mf Ohcd4!>nJ6$a`6Mqk6|wW literal 0 HcmV?d00001 diff --git a/x86_64-efi/efirom.c b/x86_64-efi/efirom.c new file mode 100644 index 0000000..56fd712 --- /dev/null +++ b/x86_64-efi/efirom.c @@ -0,0 +1,273 @@ +/* + * Copyright (C) 2009 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * modifications for gnuefi by bzt (bztsrc@gitlab) + */ + +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) + +/** Command-line options */ +struct options { + uint16_t vendor; + uint16_t device; +}; + +/** + * Allocate memory + * + * @v len Length of memory to allocate + * @ret ptr Pointer to allocated memory + */ +static void * xmalloc ( size_t len ) { + void *ptr; + + ptr = malloc ( len ); + if ( ! ptr ) { + eprintf ( "Could not allocate %zd bytes\n", len ); + exit ( 1 ); + } + + return ptr; +} + +/** + * Get file size + * + * @v file File + * @v len File size + */ +/* +static size_t file_size ( FILE *file ) { + ssize_t len; + + return len; +} +*/ +/** + * Read information from PE headers + * + * @v pe PE file + * @ret machine Machine type + * @ret subsystem EFI subsystem + */ +static void read_pe_info ( void *pe, uint16_t *machine, + uint16_t *subsystem ) { + IMAGE_DOS_HEADER *dos; + union { + IMAGE_NT_HEADERS nt64; + } *nt; + + /* Locate NT header */ + dos = pe; + nt = ( pe + dos->e_lfanew ); + + /* Parse out PE information */ + *machine = nt->nt64.FileHeader.Machine; + *subsystem = nt->nt64.OptionalHeader.Subsystem; +} + +/** + * Convert EFI image to ROM image + * + * @v pe EFI file + * @v rom ROM file + */ +static void make_efi_rom ( FILE *pe, FILE *rom, struct options *opts ) { + struct { + EFI_PCI_EXPANSION_ROM_HEADER rom; + PCI_DATA_STRUCTURE pci __attribute__ (( aligned ( 4 ) )); + uint8_t checksum; + } *headers; + struct stat pe_stat; + size_t pe_size; + size_t rom_size; + void *buf; + void *payload; + unsigned int i; + uint8_t checksum; + + /* Determine PE file size */ + if ( fstat ( fileno ( pe ), &pe_stat ) != 0 ) { + eprintf ( "Could not stat PE file: %s\n", + strerror ( errno ) ); + exit ( 1 ); + } + pe_size = pe_stat.st_size; + + /* Determine ROM file size */ + rom_size = ( ( pe_size + sizeof ( *headers ) + 511 ) & ~511 ); + + /* Allocate ROM buffer and read in PE file */ + buf = xmalloc ( rom_size ); + memset ( buf, 0, rom_size ); + headers = buf; + payload = ( buf + sizeof ( *headers ) ); + if ( fread ( payload, pe_size, 1, pe ) != 1 ) { + eprintf ( "Could not read PE file: %s\n", + strerror ( errno ) ); + exit ( 1 ); + } + + /* Construct ROM header */ + headers->rom.Signature = PCI_EXPANSION_ROM_HEADER_SIGNATURE; + headers->rom.InitializationSize = ( rom_size / 512 ); + headers->rom.EfiSignature = EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE; + read_pe_info ( payload, &headers->rom.EfiMachineType, + &headers->rom.EfiSubsystem ); + headers->rom.EfiImageHeaderOffset = sizeof ( *headers ); + headers->rom.PcirOffset = + offsetof ( typeof ( *headers ), pci ); + headers->pci.Signature = PCI_DATA_STRUCTURE_SIGNATURE; + headers->pci.VendorId = opts->vendor ? opts->vendor : 0x8086; + headers->pci.DeviceId = opts->device ? opts->device : 0x100E; + headers->pci.Length = sizeof ( headers->pci ); + headers->pci.ClassCode[0] = PCI_CLASS_NETWORK; + headers->pci.ImageLength = ( rom_size / 512 ); + headers->pci.CodeType = 0x03; /* No constant in EFI headers? */ + headers->pci.Indicator = 0x80; /* No constant in EFI headers? */ + + /* Fix image checksum */ + for ( i = 0, checksum = 0 ; i < rom_size ; i++ ) + checksum += *( ( uint8_t * ) buf + i ); + headers->checksum -= checksum; + + /* Write out ROM */ + if ( fwrite ( buf, rom_size, 1, rom ) != 1 ) { + eprintf ( "Could not write ROM file: %s\n", + strerror ( errno ) ); + exit ( 1 ); + } +} + +/** + * Print help + * + * @v program_name Program name + */ +static void print_help ( const char *program_name ) { + eprintf ( "Syntax: %s [--vendor=VVVV] [--device=DDDD] " + "infile outfile\n", program_name ); +} + +/** + * Parse command-line options + * + * @v argc Argument count + * @v argv Argument list + * @v opts Options structure to populate + */ +static int parse_options ( const int argc, char **argv, + struct options *opts ) { + char *end; + int c; + + while (1) { + int option_index = 0; + static struct option long_options[] = { + { "vendor", required_argument, NULL, 'v' }, + { "device", required_argument, NULL, 'd' }, + { "help", 0, NULL, 'h' }, + { 0, 0, 0, 0 } + }; + + if ( ( c = getopt_long ( argc, argv, "v:d:h", + long_options, + &option_index ) ) == -1 ) { + break; + } + + switch ( c ) { + case 'v': + opts->vendor = strtoul ( optarg, &end, 16 ); + if ( *end ) { + eprintf ( "Invalid vendor \"%s\"\n", optarg ); + exit ( 2 ); + } + break; + case 'd': + opts->device = strtoul ( optarg, &end, 16 ); + if ( *end ) { + eprintf ( "Invalid device \"%s\"\n", optarg ); + exit ( 2 ); + } + break; + case 'h': + print_help ( argv[0] ); + exit ( 0 ); + case '?': + default: + exit ( 2 ); + } + } + return optind; +} + +int main ( int argc, char **argv ) { + struct options opts = { + }; + unsigned int infile_index; + const char *infile_name; + const char *outfile_name; + FILE *infile; + FILE *outfile; + + /* Parse command-line arguments */ + infile_index = parse_options ( argc, argv, &opts ); + if ( argc != ( infile_index + 2 ) ) { + print_help ( argv[0] ); + exit ( 2 ); + } + infile_name = argv[infile_index]; + outfile_name = argv[infile_index + 1]; + + /* Open input and output files */ + infile = fopen ( infile_name, "r" ); + if ( ! infile ) { + eprintf ( "Could not open %s for reading: %s\n", + infile_name, strerror ( errno ) ); + exit ( 1 ); + } + outfile = fopen ( outfile_name, "w" ); + if ( ! outfile ) { + eprintf ( "Could not open %s for writing: %s\n", + outfile_name, strerror ( errno ) ); + exit ( 1 ); + } + + /* Convert file */ + make_efi_rom ( infile, outfile, &opts ); + + fclose ( outfile ); + fclose ( infile ); + + return 0; +} diff --git a/x86_64-efi/elf_x86_64_efi.lds b/x86_64-efi/elf_x86_64_efi.lds new file mode 100644 index 0000000..942d1f3 --- /dev/null +++ b/x86_64-efi/elf_x86_64_efi.lds @@ -0,0 +1,74 @@ +/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ +OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") +OUTPUT_ARCH(i386:x86-64) +ENTRY(_start) +SECTIONS +{ + . = 0; + ImageBase = .; + .hash : { *(.hash) } /* this MUST come first! */ + . = ALIGN(4096); + .eh_frame : + { + *(.eh_frame) + } + . = ALIGN(4096); + .text : + { + _text = .; + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + . = ALIGN(16); + } + _etext = .; + _text_size = . - _text; + . = ALIGN(4096); + .reloc : + { + *(.reloc) + } + . = ALIGN(4096); + .data : + { + _data = .; + *(.rodata*) + *(.got.plt) + *(.got) + *(.data*) + *(.sdata) + /* the EFI loader doesn't seem to like a .bss section, so we stick + it all into .data: */ + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(COMMON) + *(.rel.local) + } + .note.gnu.build-id : { *(.note.gnu.build-id) } + + _edata = .; + _data_size = . - _etext; + . = ALIGN(4096); + .dynamic : { *(.dynamic) } + . = ALIGN(4096); + .rela : + { + *(.rela.data*) + *(.rela.got) + *(.rela.stab) + } + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .ignored.reloc : + { + *(.rela.reloc) + *(.eh_frame) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} diff --git a/x86_64-efi/fs.h b/x86_64-efi/fs.h new file mode 100644 index 0000000..8b9ab57 --- /dev/null +++ b/x86_64-efi/fs.h @@ -0,0 +1,264 @@ +/* + * x86_64-efi/fs.h + * + * Copyright (C) 2017 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This file is part of the BOOTBOOT Protocol package. + * @brief Filesystem drivers for initial ramdisk. + * + */ + +/** + * return type for fs drivers + */ +typedef struct { + UINT8 *ptr; + UINTN size; +} file_t; + +extern int oct2bin(unsigned char *str,int size); +extern int hex2bin(unsigned char *str,int size); +extern CHAR16 *a2u (char *str); + +#ifdef _FS_Z_H_ +/** + * FS/Z initrd (OS/Z's native file system) + */ +file_t fsz_initrd(unsigned char *initrd_p, char *kernel) +{ + FSZ_SuperBlock *sb = (FSZ_SuperBlock *)initrd_p; + FSZ_DirEnt *ent; + FSZ_Inode *in=(FSZ_Inode *)(initrd_p+sb->rootdirfid*FSZ_SECSIZE); + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || CompareMem(sb->magic,FSZ_MAGIC,4) || kernel==NULL){ + return ret; + } + DBG(L" * FS/Z %s\n",a2u(kernel)); + // Get the inode + int i,ss=1<<(sb->logsec+11); + char *s,*e; + s=e=kernel; + i=0; +again: + while(*e!='/'&&*e!=0){e++;} + if(*e=='/'){e++;} + if(!CompareMem(in->magic,FSZ_IN_MAGIC,4)){ + //is it inlined? + if(!CompareMem(in->inlinedata,FSZ_DIR_MAGIC,4)){ + ent=(FSZ_DirEnt *)(in->inlinedata); + } else if(!CompareMem(initrd_p+in->sec*ss,FSZ_DIR_MAGIC,4)){ + // go, get the sector pointed + ent=(FSZ_DirEnt *)(initrd_p+in->sec*ss); + } else { + return ret; + } + //skip header + FSZ_DirEntHeader *hdr=(FSZ_DirEntHeader *)ent; ent++; + //iterate on directory entries + int j=hdr->numentries; + while(j-->0){ + if(!CompareMem(ent->name,s,e-s)) { + if(*e==0) { + i=ent->fid; + break; + } else { + s=e; + in=(FSZ_Inode *)(initrd_p+ent->fid*ss); + goto again; + } + } + ent++; + } + } else { + i=0; + } + if(i!=0) { + // fid -> inode ptr -> data ptr + FSZ_Inode *in=(FSZ_Inode *)(initrd_p+i*ss); + if(!CompareMem(in->magic,FSZ_IN_MAGIC,4)){ + ret.size=in->size; + switch(FSZ_FLAG_TRANSLATION(in->flags)) { + case FSZ_IN_FLAG_INLINE: + // inline data + ret.ptr=(UINT8*)(initrd_p+i*ss+1024); + break; + case FSZ_IN_FLAG_SECLIST: + case FSZ_IN_FLAG_SDINLINE: + // sector directory or list inlined + ret.ptr=(UINT8*)(initrd_p + *((UINT64*)&in->inlinedata) * ss); + break; + case FSZ_IN_FLAG_DIRECT: + // direct data + ret.ptr=(UINT8*)(initrd_p + in->sec * ss); + break; + // sector directory (only one level supported here, and no holes in files) + case FSZ_IN_FLAG_SECLIST0: + case FSZ_IN_FLAG_SD: + ret.ptr=(UINT8*)(initrd_p + (unsigned int)(((FSZ_SectorList *)(initrd_p+in->sec*ss))->sec) * ss); + break; + default: + ret.size=0; + break; + } + } + } + return ret; +} +#endif + +/** + * cpio archive + */ +file_t cpio_initrd(unsigned char *initrd_p, char *kernel) +{ + unsigned char *ptr=initrd_p; + int k; + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || kernel==NULL || + (CompareMem(initrd_p,"070701",6) && CompareMem(initrd_p,"070702",6) && CompareMem(initrd_p,"070707",6))) + return ret; + DBG(L" * cpio %s\n",a2u(kernel)); + k=strlena((unsigned char*)kernel); + // hpodc archive + while(!CompareMem(ptr,"070707",6)){ + int ns=oct2bin(ptr+8*6+11,6); + int fs=oct2bin(ptr+8*6+11+6,11); + if(!CompareMem(ptr+9*6+2*11,kernel,k+1)){ + ret.size=fs; + ret.ptr=(UINT8*)(ptr+9*6+2*11+ns); + return ret; + } + ptr+=(76+ns+fs); + } + // newc and crc archive + while(!CompareMem(ptr,"07070",5)){ + int fs=hex2bin(ptr+8*6+6,8); + int ns=hex2bin(ptr+8*11+6,8); + if(!CompareMem(ptr+110,kernel,k+1)){ + ret.size=fs; + ret.ptr=(UINT8*)(ptr+((110+ns+3)/4)*4); + return ret; + } + ptr+=((110+ns+3)/4)*4 + ((fs+3)/4)*4; + } + return ret; +} + +/** + * ustar tarball archive + */ +file_t tar_initrd(unsigned char *initrd_p, char *kernel) +{ + unsigned char *ptr=initrd_p; + int k; + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || kernel==NULL || CompareMem(initrd_p+257,"ustar",5)) + return ret; + DBG(L" * tar %s\n",a2u(kernel)); + k=strlena((unsigned char*)kernel); + while(!CompareMem(ptr+257,"ustar",5)){ + int fs=oct2bin(ptr+0x7c,11); + if(!CompareMem(ptr,kernel,k+1)){ + ret.size=fs; + ret.ptr=(UINT8*)(ptr+512); + return ret; + } + ptr+=(((fs+511)/512)+1)*512; + } + return ret; +} + +/** + * Simple File System + */ +file_t sfs_initrd(unsigned char *initrd_p, char *kernel) +{ + unsigned char *ptr, *end; + int k,bs,ver; + file_t ret = { NULL, 0 }; + if(initrd_p==NULL || kernel==NULL || (CompareMem(initrd_p+0x1AC,"SFS",3) && CompareMem(initrd_p+0x1A6,"SFS",3))) + return ret; + // 1.0 Brendan's version, 1.10 BenLunt's version + ver=!CompareMem(initrd_p+0x1A6,"SFS",3)?10:0; + bs=1<<(7+(UINT8)initrd_p[ver?0x1B6:0x1BC]); + end=initrd_p + *((UINT64 *)&initrd_p[ver?0x1AA:0x1B0]) * bs; // base + total_number_of_blocks * blocksize + // get index area + ptr=end - *((UINT64 *)&initrd_p[ver?0x19E:0x1A4]); // end - size of index area + // got a Starting Marker Entry? + if(ptr[0]!=2) + return ret; + DBG(L" * SFS 1.%d %s\n",ver,a2u(kernel)); + k=strlena((unsigned char*)kernel); + // iterate on index until we reach the end or Volume Identifier + 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%0AJ_x?mgm@00o)(v6QnDKHa7OH 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

X-#5xn>q_bdF-ekB&VqEdTa@s%r{jN-92sB4oB z+hr4ZIU}n5OqSPfYOhSoDk_5Q^j(h+4xX0{dFkjiw7dIKR6j?v6?MVUG&0-WYKr6>ee{k(cx4dI_zX2YPer&-J;{99CMP|%X+pV z$wdafIU!}Pqn<9c4*HJgZbyhkt=?S{dH5>KXVnoeDnKK_3YmHe;o0{*3hU0472wHyEG+jQ(Z@_+i49OM7|O&a09tSH*7-v6F< zBeIYOR~_ul6wQ{^18{8Z`0xpMeY>gpiuY>R? zz^xE|6>u+vmjWJw@CSfjM)-5Ua}YiTcqPIY0B=V47rE)4j4gv$U9 z7o|{x*R=qLYgHk~wB|PAk9)*6$j<+za8; zfQKL)`~6c7Md z(=@{T!?iOo&iR0|Blegk8)h$z@Ls^>5dH>m9fW@e+zR0|xTy#8?}hNafQKMl8t}^q z*91HV;n-SQ%zq`qy#Q}U_<6uzAUpx^NrYbq{5`_U0f$p7jB^X%)VN1%gS>x(1Gt5c z1ABJF{ypHrfWw)Z821EguQp|idb*wRv)A!- z_VBa!(ed&0^R)GJ!_#wi_j3Ces&DHh{>KC>=-K=DJKNeHbM~-v_Hg|3l7Zb8JFM_; z?9{fH;hz5+D?MvBy)(Xk_U;>6yDF!g?eO%pj;S5j`&*W`^>Y4O((>~CTQKl&_3%9H zp=gg)6i>;)S;yMPPydXUy{5gRwe1-#8=no2TVB{a7-r_|=j`dR@v@KEO}SL(j|2d26_pe0)58 zaF!^?tp5QUI$A5ZS^N6_@w(ZTW1gOW4`gWV-l;5*#9w9!+O~R7f>gAH@81j z*%@cI5n@AJHn`hsTHDyWsd+ef;{APPqo`udml7$bZni~Jpb4j{0*_Tz29k1AJ>iQJ6PM=tJ&d>~WIKZZ^0D<9|Hh*fDEgdj(IszaiL6ZQ$^aB`)`zt=+aB+{4)xx0`~e8%_fnmj-_< zH#2FArKYE~9Tt&47Jq~G2Pr!Hx^CI!n472V)-velKjxcR@~4O$!QM{I-P-Z*K{l(Q zW9|311GG=Mxxr*sar4CemN-lTJS7i1H4ofkdJkLszdK@dOGy`(K3j^K&Ng~}r)&&1 zcXy`QzS7Vi5wCrEGxnx}mXynOI z>FHyZY96>jX6=TP&9>V*Ut;r=(iXrDo?~2j3+LOyRkm>9EnIaAhx0V%XDf&I0Kj`& z;4a`+u8n&=u-7QS+H!b*7RIo@``|_saBJBgdugzi9o%BN!GY<~e%(!JQYe?at=I zpL#-V%2tF!?Q86P1h&EW2!ZRGSDW|`*8&|ri*T!Lo8UddyMX<7ghTCXVh|5_++xs= z*!vD_gZwCnKMTV1L7wm;d>!}^MfgqZ1}WSIfBOvj*8zTX5qoaHEfKySa2JG&0Pc_Q zuZ)|=h4;q6<2Hf*O-JmtK|fX_oCD-7_Pz$&pdU*xpa&3s8F1`<%~tz^pnsPU4(AJ~ zsRsRrgL)E!{UC?h*R%*PpxQhhE5fBWF&;m{^MQZt{Smf7|Mnmb#}E!RfV2=E55}V% z!lCxH3&LYSzjz^h4fZ3#4MF^a5MBxLEeYXJi#Z+PZJ@n52)_a5pIZoT2jx>#1oYQ#gzJHMfCu4p;3Fkbgd2f4%OG3^#76_+s$kq1B76nR z^EL>F_4Gh^2*|5Igm3)t3obq>2)_dChY{`s+BJdjUJ!>_g#QB91B(d%0p{Tk2=ii?Q7Y2Dw2;vI+>+VLcin-Lxlj=PTVXfUrr4M^x;4$Q;y-~Rf%Spf*AEbT70|A3gx`SU5#fyBg8B`@ zwXp-?Hd@gC@VNIueZ&zCwXfw6E(6Lw2$ulsb8-=`xOrH-MuZE4_>3SN{w5C8hJ^L> z0R2J$+70;_n1^>DJPjO|1>vl~&pw1h?Q02yn}K|T?*rg*sX$)oAoe$by#>OrfqryB z_&YGqpGJ5X=$8nDYlCrp72#)q|9c3}0rNu#!a;cO`VkH_yrvKiwXfeHyaBZLE5i4I zc5MU4hjH@<^`}92B*=$72#4C&`w)%?{2xU4Uf|~#!k0mwI3oNJ@Z*DUb}-&=AiNmV z|1rYzz;Rz9{4ALFJ|H|A_<`CjFh0zH3t|AbLCyo}e;DDgy~+rO*AKb~Cj#@PCBmCQ zKD!_sYJZ(ZxF;C5(Fm^v=dTQeSAzN%AiNyRSG5R-+Sd;deg&N07ZLs&#O({hH=~HV zpB@|^dl~!t4cbeKa1L-jVn;aCeAh(yDCl=fg!_X7dm@}2jLQV?iXMe=r16(&|ARN9=YeIMzXfFYX6Z9_+`h^7H!=Rp22xkW4 z4qg{SKi$Bd8L@W*?czbWGn|JJ4u1>A3*m>se3g#y5Uc{YEg#`}U>@G8m5rIMgSfmv z><@u?cnRT9`ZdBlU2XZbj-lY%@wXaVi9BSO9A)Fo5rxoFFX}}u7Z9zTZZ-v47bb|IugMNS< zYG1n|+zjM%2Ey0C{Pq~(G+_S3eJQrFLH~`Qeo_d>1Mhc~5l#=zmwE_)0k{>yyFfiW z5Z(>0X95wf1>y;{`C&bef^qZ>u`dDh0Q|fV+9!kjAO^2P9t-9pN`yo0>s<(U1%C7q z{t}F@^9YA|b_3xyAP*lQ{2TDUjPO;^PI}M}u>O@Go<|T4wXb6lE&}{tMtBX#H>jZk z{bvH6h1fTO_!l9Z5RCU>gkJ!8_zmGaAWyi!c@G}f0py_w!YhCu8H7XaYYl{(g7%sq zoFCNR9^rdIdovN<3EI_z@DHFLcL0B|{`O!#p+`9U?KT#KSAu%-A)FZWuQ9@vKzyPR z{uJ;Ug!_X$A4hl?$TLzf&S3qa*0&78`#^l05&mX#8o`5Fv(S$!Xjdj;&ke38ix55s z>T?_6u-_jcybRRm1;U~B^*F-e=ZSb=KUmM(VEj@dybr`{H^P@eoOuyW3EC@;a68bC zP%9c97iwQ?qxRsuY=-b4Fi$!md=Icch42wDzQRxr;-7$UYcRgxxQF$`*56=T5n>Ou z$LkT!vuTb8f725B@do2)9I@XA>JPPiSRbiE@6b1f%+dscq$n0>Igps#=8;1q2{wa!mohywJ*X~fd5d0 zL(Q`UgqMSOLak*Ohn=8bU|vIxtwX}LJBXiGz`h;f#$bNvM>zbv`!&KZ13&P*2akIV z#OF6+{}O!uKndQrLHpYv|Ctd^3;K&6;rPHW{Cp1jaRl{OK+g7b?3_dNuPPb}hV|)i_?^dmBj6?0~ty)Sk5RHg5&q6X*GD|3glqi}=B29|;?{n`yI?sN3 ze(&%7zo(CT&-tFU_g;JLwb$NvXkB8iY>c0S>pn48HpT^^e-d+LW1JE8mzXOX<5tkl z#9Y}JSBC2aF;_OmIiNnoT-g}6gYkiwD;wk3_e8OSm@6COv)BVTh`F*cg#R`PF;_Om z@!v2Y=E}x+2lP*3u566+LO&baU`xA3zWBe_&KQUJ}#_`|ABIe4*_$Rmy5p!i@`~r+`#9Y}J z$A1%wm=hc08F0LA5pq*w+#LEXF;_Om)vyO}5OZZ?NDKChm@6COc<$@BNd0*3>j{J( zf__EJm5tR?0sWAeD;wi@?(4;bT+JBY3FnI#!UN!V5p!i@^1X0BtPSNcw=o5O__2w= zO>hXF-3WXmf#W%`v3iUNJf0wLK;Xv-T%W)%5x5?Kml3!wfj=N{9Rhzw;MxTKfxxv0 ze44;F5IE;@+6C4xO#&Apa18>NCvf~bBiL;%0#_%0(T{FH3APL@U;XUN8qXi zevH6X2>c>}uOaYK0$)wwO$4q?;JpN{MBpO?u1Mg&2wZ`{IS9F(Am>pnIa7H367NI`P?^|BNeUUiim^>U( zs^A&|hf|8m4G0{DKq|K*aJcoL^6dl;w?tGPM&NJ>r1B&Jhh3ubYyyWbRjK?sfx{)1 z%I^|549!&D06A_q{5Qfn2=Z`Aqsl)=&S*g18AJY0II@+Jfhmli5_AaJ;3 zQaSwk0M)PXb6Uee;k$xe-9S$C;6U2*4*V<_eEA-vCkI(>N%C$%^Qp_Rtha%lzW>N% z?u~s{UY?fd+||u3&@=QOw_Wk%=QN4`b>4HThW}3wn2*zezkl=@Tx)~Bza5w?@xaW9 zF}U2%-_nL>+Q<#!m|`MW%)+*Oh!`mb0;11g@@RQ1#{aE-y!;ld5aAFZoMWe0tY!p% z+Tf3P2*}c|!XU)j#pK}jbUsJBHeghn;5WcEcJxC1J%~;QI8~M^L3>yap8nQ;I&A+H zTr{xuu`$A%!D9-xNBUd)8qjcK;6Cv{+jj;xQHIH{fRkGUyC58>>^5-kZ~6z=(F);u zV)|nt1l8XUu)pbV4BIcDRWtvHw!asaM{|r%!SeX`)A0)M^7wNCULF^K&r)y^!R80? zz{}y!Y2YS)PL$IjE<%JGs4O;2sPALqiO_zh31zWUv^;iAkH}z`6xhBRjH_5Xm@A_8 z$HwGu?Z?2)!EtPG2?yFfHDD2vd@EA(cheqd=d?%FHMGp$N^0v=X~cy++Q8J1p6*YL zbfgXc>L1p0y8a&pw5g}sB!2KgBPHoGC6&5~G)`)##C>F?B!T}Se;-K13}a%Wvs7V{ zq=AmLwSkq5h@pun`i6!YTK`8D@@x(#BY(f^A!RU0oNmLdws4h22N% zxa=%CLPqjEqD@OYPPsdWd~e!Mw`AS+ceUDu{OirXg$OZnL}P&RQ!8+c~ycH1XI`_|sg&t`76e%&{n?r|K4~ zow>KrN%|L4&36~acQ!j%tW^@->6Q<*pH~Z(;nM7=Us9>M*k*hDOCF=!>1*GeYoQ-3 zGZ5g4zx(AKb1lol?QgpuRjP4sh}RYKZ*2|VKjEshnPcCVj&BPy&L@aU+!fzeVrg7^ z$1RV4Cnd~+@f)43N$pGhtNcspnYIot*pYc{obO`5Kt|z0rk9Li!l6ed{0)9^*IV)^ z*PP}Xa#1qp4*6o|+4R#@Y2{bP*S?&7e72&hvzg`msS2*I^Lx~K6URI4Uhg{8u{<-X zGty4uKz85OpuFyS9qFFDdO8mwFMdvrA{T~6*UcTKV}X~P7jAX6d`K3&Xl17y|I|QB zg40VkzvNJ<3*XWY({2ZZnjahRUUTHyX%y0CcIH6C22b|>yRyFgE$I^%CyNyyw>zxU z^u6q}Ty;vqK{R4m^Qb}X@mm`?5+qtrzP_C=_QR_%&-K-qY4L~!v=qxCErtBr(XgUf)yxv&5s?5j1{g=I}=7PQ7j;?v)JYn>^;i|Niu*kw?w|RcQC}zo-wRGrZr_kcdEvj`N>HiUj^aBd!!bdA}%kLWnZ-hJaa=T z^_%7xKdF0{&pprdQ{Dg4c7|_(&`>~{uG*H&?m)Tzj|X+} zv%2q0pc22I&FeFl)x=}(D7Y;%O(|s1uJk-PW}2XOAb0=oE~cHGJGbqABBi!<@}a+> zPgzmPLGhPCmb~}oR44q^_HA7guG8SEU%2+bhC53}e6p(6{Sw-+ zSo6Szu}Znf<*bSd&E_ZXABbQ3?BQpbJ4+c`+g>!Ot=SnpL>%PN%l6Yjrrj^In@g^KB>YZx?zqn%5rT$xJxPtuIQ^rAWlL_1!Hb6~~JY zseGN1iulNQcuVAoBwnY~=1H#W8R9bnT^@}ohPzvL2P+!}JE%Hc?=(FS_E~1oe zFI|(nWVhvseDvoNhqmy)lh}ITW#8oIEuwbC0*NbDCmLFg<9*>hK z8*K=DQ{XY{HOfD9sfg0s)zc@j+-UYmtAAOfy}$?FAw{c~+jq*H+B%kFC+%HYArgA% z=Cd=;#QSz|S#$@VW@o>rIaKNEbRmMN=g5Qxd+`1+g;$doeY+zTCOEtvlcamcHoo}2 z{^R>@k1a0kH7rWK)wDf5Jhxj@#Hl9x>DIC*A3~+B?mKWHbUNTOSF+!_mvaH12Y8+B z7Yn&*bL}9vD9OvWi*SADy4MjZsmt(UZw_xn-l2*s>Up-CFYl}{O8arVT=1%3W~F44 z+(EIr^hs}zj~o; zGSls{(P-Fq@cg%9M>9foa{TX2l_`kah*&eiUunBJSmg`Ib$@8CI`V7A%GV!n+@E1k z?`wIqfmC;9w*S&LJZYbG|4Uz_o};w0?uWdrUz=oAyd!p{ zJBxi&vmR_Sx=|$kvEJ;Kgz%NOKM$x&%|(2V=#>1Hm=n8k@vTmJA7QO?5}Wdlm}Knb zu#P^O$0PW5c)*Ws+-93)goKpcySokDo@u@BHzj6&Q4Ke!lCged&*sE#7v}%qJ^R#( znZ;RO7j2OF;r0CTgy_$ZOZ(V`PoxWFg5<<(Sux@4(ITS1RV)U%*eY&<3pvsE$`*s> zY-}gMg_vj%xOgn-Yxrf+tgc^j-{lFV@Z)}2MzxzKYaEtZt%_Vl_Hiv@`zZMH;>}OY zVf!aERBk7pH!+DCZt7aSM72_msrg)zytAWlQ3sz)*ul(UcD}pHrooOjT?U&kyxQ+_ z&P3)xvstiaS2d@gqXm<3LDJ2Wu@28bx>J#Um5$@rj8^*w^X)8jI+tv$W>E8Pn@;Uj z_E7WHY?oK`@{dx6<7%0Ce#!PSouUk17J0KuBIl-yq`&yt`}7ANA5pZ?c~p8T-j&^| z_@uF#o=)jEX149uH1{qM78?X=b+bs=tWb+zZ>(mdv-F#R61zB`hY6idrwr584F3xq z>^ymL;@vAKKJ2MB1tLMl0^WBkx0-kw?zD{VvT_zT+vK^|pG&FJM#aSBxMB9CSB?2f zoxw~ecjjk!$(CyirhK(#I{B7UTt&8=_f$&Pg;yU=HC-NT*crXQ|59?dr@`F^C$3x= z9b{H{e(&@>!R`lQyrvm$pgDpIr;?i*uv7TJtLknNju(Md~p0HuD2r4`rw@>Kf`&T1e z-}eN>#4!jhd-KYL<)E5cSB)#z>5*4kxn_H72D$9i)oN>GS&Y=TjJ>Mh>QM_j9ru2{ z+QXU-uC$PVoVXCKp7m-2HEdkwfdR_eGfhpee}%1Y?s^naD9C#=U}7W7;_B_mjJ17T zT6b!$?f38L709NF5~&5%W^o4WNMhzv?EB1*rx8bMb8|z z-u*ba!H`FDf>(a+q0>f3E6y!0`|c)qW~-RgwTGJ|CEawhhko&Fy1app*F^u`Y?h_i z(ytbdB9;%wMpD6#W|T`VyN|!p!2fe8ehqTbZfditRpg#6m9$D-aEx_LtS(6CLyhQMw^0`L#sI6y<6jB`WMU=8bo*D1yA53XnZaul(JWJV6 z?&7;+14j*uew=q=bGpqdJIJiJH}Gt?taB)@_1(R_q1W3rAD-WO`gN#~!YWA<`I~7G zV=wM7_?eK7@(Ek#-Ap@ir&x{Y#nas#E;+Uzvz~5R)V|Yf{o5&J>}x5b=*fL_dKqXdzyYlf%mqt)AkUaZfZ7NfM#%fMyzO71#2 z((^esEL{@yQ2bZDPh4GGT--=>T+AM4>SMrr!wY0cTXAu2c!FPJsgv8VY{4;4#?GDD zknmJh#y#xw)&o9wmIydLvwP+f@!hSm&5d<%T14xO2uV4NA%;8eNyc^VO=?Oh452pe z*Hs>s-IC=PDf##yVQZOO;SMdQ~Xd+?UNz*7%-axFfSWzuqwtyBotW;M1c-z6V-*ZIoA6p4q4n-*}} zPmfysa43IZ{K#Y(chIQQy`B$ATU*qR6vnQVY|bq?RgjbGv%W&`onN~8=jXSCV#i<0 zQ5;`3^GY|8d2XG1TB&|o{ihFqd1!fH;QFr`D?{pB)PGt2{Mg#iefcEE%Kmi58xgOE zx_7Bdaou+DYtFu@Zeyw+yXWpJm7?$`li3w*CsaM#-iV!epHO;SJ$%uD<)8QUo)muFL{FH~P)^ukX6l(-}nR+|*IAeXoZ{ ziI(BHo$5S%-G_c(W9RSqB(a^6o98`i@vdH>f_(7!IFEE&UVhiW&04cGxTgi;s1@TZ>A$yDwf3)BANPKW)Lv@qlL`W`|cja($L@eTe@fPiLLK z^YSlgAFo^)uJST&ViNRnv>m(Nari&VA|AuLOxg zrRU#b7nbb0zw=kx!s+@$o8K??NS%4IdUwgl#W5e|=;5ks*KfLwHQhFH2ySNT)MS40 zec8%Kyz4`AV(N4Dlr3!f_{P3zo2!FTlIwEAwB~*jiH?%^{cOByw@SjBDJfUXZ>Gl- zFXMa0a8rC`zplok#RJu!81{M{*2{E}UA7{s$ZBj^O>kVXzhZdzZJ~Uh)qXKW4lM)f z-^qOXF~=tc7(ZXz*ZFPw##Q#-{;BZxydS3V2N!)AS(95`IJU()uxRA^5&dyrWBUU} zOTU-93h74J1sgAocr3f&lJ=0|0@0d!Tl;U*mDlA}rVBl@E|nkru)cUJ>)F{C%#Zfo z;BNGCs6K02P_I#H>2mbf3y)7b)od6Wx~@s++NOs{KJvFw4AIaqtR7g;;ME#;BSqnG znRL*?%k|*}mEPILJ$F@S@;8NLxRVyw1O!xnRZrQMz)LZh3FJ7&HzrdQ(GlqSrBZ9H zu(W7soBbu1StZjz`f%SfF{F;W#crGFRSRF$2V}=YKB#azCu8zO_z{O#-L5kZI~;#E zZJd;zE%}hW__n)UkWk&V%=ZV68pzhl?#*6XSM?-`ZXhh|;aj?x#nR;`N@ky!nK^py z_cy4QJ>=9rq;6nMZ?MzfwjzsONjk2#d(l?k8)7f|Opd5mNp0TBR}{B;h2QR|BW7(s zZioJ?T(M2==tnW_1oh*G6U&ZE7^<}@NL40o7SM9@&lgaWIkVt`fh_-wXf!gZP2pL?aJHTT%Vl@X!b2FIetmh)cD+!l6>}UCT$|mF2>jI zm=#YNHA;_e-sO72Et}<{fXmQ9?VF;e95?9C$wt4}R>OYcWvqi@21!8Cd7)g))ydw4 z%0uIPD_yQFT5{P^Cw=%0eaiX_^CYpgbh#YM)*IY2alaz!VtH7_$ijX)&~Wixqo|e?rMilR~C_jxGHbBJx)Scrqqc#ykS= zw|P3z`#sf+oYj!?2uUy3q*(gMcyKJQf4^XcE9Q3i%PYB;GS*&I(SEs+e_7R}kQO7` z<_}86d_ByOZIzvoZ`QokPrKc$XnRzlPEn{Wy=OF&PbL4+wTEktn}kYtvc9=r)3oL7 zr#uhI&nM-z$?r3izFs@P6!{?gMwAh&d=$fht3LuxF)ZG`H9t(P!pXW&uuUcAM{ZZ( zzT2wo$t7J0l8POpW;M^8GKZfVZkxJ)*%6vxUE^c3&iX- zxvu+rM=aG$zY??Rgsru%H`(7=fR8bYyyvj|hf|G{OHB`&R~)K-V>5B@S!#U2&D+ne z+BT=T72W01lI~t&e$(;OgY|0GR_%t&JXf4K9v&K-7H_?2p<#S*VVi(ciLy_ln)k$+ z4a|ZPp22a6KfSvY+YMcfO|RQU?ccup)XR(m@+rp|4z#9rDoR;yDNJqi$ll#o7cXVC zuqkE2sdbrRSpI7NVET(^xO{e2GYAP?6TiYmZ*AKWKXWX#PWmbvLsI<-jx(!0m#>#O zxH0s>O&&*o)?Zn6{n^RFA7xkCTdWoE>@6P9l22Q5M0=OZR8nfgjx9ec#D%*uayZLm4Jsv&j9 zJA0?ppsuuqKPDBn__Z}>Pa1NaIAfmc5%ZOCyLkC_E=$Ay$&amdLeGlw@0}m{GSh0( zzr*V6>q<7&$PhD;)b<$0r8-`(n#QTAgVoQBW_XC@AOA<{;Khmbp&)heoy?bt@3lp< zqvq}&Zj-B7dUV_IS!K@r4{}7W1G~ML$mLsbwc0atvZMCxP$XTfvpEbN~7dEnmMa0@|3ayL#V#{&V*LUaf zmAaIa+o>chW3c<%6OkfeiB}hITRBvm7Rz?PG=pc|4{N2LhEZo%{_I(sdQ79VOJ#VY zm3GPnvt3&{QcHJoaxLdeasMb^+*RQ%SyR)$&D~w(xKGxPw}HzJ(2PG zJ7QbPt)OU-Gx$Ep8SISZ3|{?YpsczxJ#!l544%ev29FQ5Tz;HaHSiSV40fgE3>I9f zB)Hfv*(k-VfNf{@3Y~|?W+<^rD(CQoL8U$+U#g{YCdCeALa+JAW{WcPj<(jm1+ zmj)JvwM^a{ywtvb<7uWV-&qx;(^GbB-%Y<$h_5?!wP3dKL-fh-dUo=; zw=k>_G!Q-awr*L=PDzr%(7E=(#fQHrc-(&y>lA#eS;OXv?G6T0??--jZVXwa-tyvL zZr-H$aL$t5IJ!dn)z*=YcfI8P!j9Hv#|%2}BSxgHtICV7=WV_5=B##N`PUSE2zIHq{U)s1qYN;G5V+)-0Mf7L@w9lOuY6kIEvsutI~!R`5ELT#M) z1O3ia>$~N*N$*|4->qS|l5x%B^{3JM&c}!QlyA=!Puq9jBufQ6-(ozucI)y_`fqGM zx8Cu0LTy5SbXWK53jf~9RLJzRVjKZZ#y@a50Hu+UPw+OllL+)1_# zJ9wpnZ_7;vo~`lRk-sZ>p>)XMmHw)2S#J$fm%2urVQTKZ`lf4-WHf`4rJ?@)s7pgP z`f@VwFA@EE_i9%5=bX=-JiP*s3T}lkPP2b#bv7C{Er>dBY1DmOt-+!vrzC(SeXM^? z)5hJ~FDAVld!g1Q^|A2g^mh-rl50=ym)>sgcGw&A?AE5Qhni1zm{z-+aHlX%bl4xZ zd^WgB=*#fwX2Z}Eaz7`0b?mt;RdcW09)0(G*{#%7Juh5;cZ+3T7YSN_CgW&uqK3!* z!BBfqgKV;Qc6rr1@|%*kHw2eX*{km3eXR9D$W0|Jw@zdBh)kiBqHJ{KmyLBL$B)d> zk%mq+{!f{L@$X5{?X@D&g>lmfaAP*$2@3KI3??}nnOf-T zm^xb+8d@9JINRvxni@D`_bmfKo=Z>V+IG{_q2T&5PGF z2)}Sd{m2vu;d}_XlrAiY^Ak`XBZLpa5B0YqTpWJ5?1k_rupS?Tk3(hg?^xjN=0OAO zL*zB!7kmyOoE7SG7~xmp%ikP?CqRA{;kTikZz9|e28d#W%VG`+jw;&IyggIk)NMw1 z3$$|=!ULf`FAc4$F`5LvS2L5k3p2x*Wp2 z;P|dZIG$@m7vb@6a#$dIA*{y@;qTzM`yu=z z9ASq#!toqX`2XR<+jW6oR5iSV*GZ^8QpnvW~xI7$}7=)jJ{%`={i?JXI zj#PxFL%+R%aPWH))Z-e$U7$S+5pD>-fLV(0T6ldI;iI^pAe}n;V!UWhYVFyG zyP^CD!dE~&#}Qr(>-mQ8OK^ToBm5qWZ{R1}sRwRnaVUr9EW|mULtz0T-woGUUWDI) zezFwdD`CH+5Z(v%bVWGqF6k`71)+c5MEDqt19uRf0{!p-!WCeg=|;E*?AJ$xd&Bwi z6XAtWe-`N1xZSwnxbPwz&#|}(;Wn^en-T5-*I!43+d=>IKscV8G63N*(4f~4&Isc_ zo|_ieUl6v-1n=YA7{*m8gujLHXA{EHV0(@TKML)bhHyL=>M4Y;hJJem;bTyr5`;TJ zf38J%0=#~Va8_8)3xw~-=Oe;z!TA3J;biDR*B7_@2{d*9;8T#!Y!b9PHf(|nbIB@%j!+P-lQ-bqS zIKCSY`SfdF7vWLx`XItB;JnR5xGtP8*Ac!O+P@6p z#&BJ$NBC|yA0H!J70$b9gl9v0vch(-+whcXcRqw)fc+Ii_z+yb6cOGJ=Ys>n)8V-L zAv~1YD)_(12&cXQ1n%8L_z&2hCkWpI?Xv*th4@N?Tf4DyHpq>Hy3)d(+zc6o*HDYze)LHHbuV~Q}|a+ z2)_dT&<^2vZd`YS7s5CbfbbNkM-;-FU_3vB@JVRTMuhjmILQw6!u7X?*W3u-4E+F) z6S%wyj8j60{8H$L`2V%S<>g>K9*BG^+~*ud_+uzvgzyQtzC1xVo&#|f;g@0mCE>b? z>$4l$(-h$zQ2%U%Pr~_l2H{(vzu~WI@%r&xSNVv%EgY8$gxAA(g75F}dbZ>HV|?5| ze8f!84E!bRY^T!HX3s81up@o|5Ga4V<}p8E>dUkUpE zCq(`fY?m9B!{v+M{1rmDKeU%D!V93C*CPB8w3|M{@!we4gz(c)PbY*+!g=I_@GuxB z!w^0I$2S4tci{Xwf^ht|EAkMo1LxNbgzMtth45wYx(VS@&>x;4Tp8Nu6T&}0{ihM$ z2s!>a5v7AQJf3HcqoSOb#R{I?@QtG`q0iAh`c3~H%53God0$R55Xz~hdaVm z;B^4Pji8_JL-=yIE+0ZT{+lr;5uO6~4;K)=8v1h)!W*I8st}$4=Sd5~Z^C}{B3u~y z;ah}v!10!{+5YwYZ#v|AUqV>U4|aV$VMo~yYM;k?j)8W7$F z_s8uBZ-wL7hw#sEeR+rQ?{NM7jBxxn31$#30plJE{6Y-wC%$kV@gO`D$_pVJ&pj%G z@TbrpRwEpLKX(JdcffgSjPME=uWS&068fz(!n2`2>_j;JK1c|{W1u}_5PlK*Pcp(I zp?yvu+!MyPvj`7`ajXpCDR8`M5xxwz+lKI;koO{-1pVqY!o%Qv`G)XlxPKtQgi83h z1h#$K*|^(j?MB0>?~%{T4fRWDqzepGl=8(h10MJw+hDN#MBY zv0IM_^p4)(5^@%5qN^h66HaTr2ov7 z1QH^-%KtlIl0Pkb67?=E_tD=nCDHDH--rEs(j-FZ|8?dhEJKs4yyp&QuR!o)#CXsC z-=0N4am-dk+hR3pV-MgEqdm<(;&#UY7GAMXrHupld}7NH(@v-NkI;$ z50nNu66eqUd4knJJmkOyR_FiU@=BmARwq69BOW{8g)k9Gi(?C-U1M#9%%bp0R3BeP8grC z`@{n+kJ;&O`QQ2%plwG$1>{>4^;m> z;O5`jKLgvx+rjLQnG|mZ=ZSz}bt>XFz&UnU!F6#dTt{dW+6r9YdK`u4ct3GDU%0=8 z+ZPNn2}5(r-%A zmx?f~F_3$UTxz&bgJ};3>^QlUlb(`n%}Pn=Bqv}294bpm8ds_w#xx|CT64#DhS>e( zh8_=u8g#)@@H9|JgC3p+^Jp;Or!4S<5?2q>e}TH~9jQvsv4$%fpNWOLR(HlidkNZLPbbeTIO6;Ue9a)&*57>Brn^%&OG>wfpbsQx`dbZhSPj>K27kF}yYgRfG#B(7>+ctMOQ{<3b-cgi zQWG}dyZDsQ2iF|nL67~9YtL6X@9Skj+~D@`yWewjF%djKOInvn&l|TN*+Jm%QwHi`ez}*!B2>lm6YeQjDcPn*cvCzSjR+3&;e%-jRe!m505F(>c(+nOlApV!7EK+Z0(zG&qfFYL(`=1 zrb+K9admW5iou86; zX}BKDcZRl3&aW3SQA~fln)-eMKD){K4`QMi|JRCoTKMBH|0jQg>mir{*y2cY6{5ZW?Tc8ef9fZfnll0!rg;-1{sZSHn3vY% zQdKZbwPR+P$OoA~u%o0>{Yjf#+5`4q85Ft)VE;ufwFT=3-2c#`7uAknPVb^u>VwnQ z08Hgov~@qBj~w3(#*thKCh~kq;$+rY*B{;cpA&XI4xsIhreHn&w>~4-5YES+zue#S zf4Hyo&--R{R147h{3pVUumdq#Sb{NUWC zJ~Dst0TS2_{RL~2KrDq59E=w;Z7)a-9l^pH_-^^{YrJWyJ8plfH<~65Qpb;yOdUDRgx) zzoLV8SI~i1O`}{iKZ_fo3*JCU8YP$VlFNK(V*NlYaa zB+QaRu;9Xt^#NNRzSIFhN>Yu|cOb1aM*&+mR@0hg@b! z4_@JbPJ#|%YJZ9eqnisErmUEv#8oqbO<_EyJazn&ep}NjOKLJss>kaEY6WwdCJj-N zK2egIpa89r^gs61*-V@9#z|knRx9qK3?%_{6=+V5?*r9S626n;AAl2D`DAbd)JwfE zPHF%?VoWaRhjlklQo)J^$_mgxLbY*HQ*bztH%$$e5HO`$!2r%*O0o?wOj0AZCB*tc zVQ|2%KTvJ+l0r91qcmRxLX{vIgW;)Tq;l#!`(wdd&}S*B5i?XlTH&~Q8PlXGd^~lW zv7I#a4$y0KkdpLc{-SH%U$NbZanf(vHXE#gAdY#_8>dD}&>F^k(G>KEW>jEZY8B)% zJ$h3x34p)Q^)`~C8@1`?8nx*e8?_mr;gVibk{WQWfC-0bTGgd1jg5|hSGn`+H?92{ zto zL7m=Gp&|@~yNz|8MFsAF$0sBP~t?6?*G5bK!12N$P z)qQ9q09LU?j}>P_(oNWlB_Qw zf?a~(9ZaI9%*TBj2@$1cOk)ABBu-0AOaNQ42tkHs7n&kwN#o>%5U>pxjlts{@FyP- zRfE02NMhcEEoGD>4GCerB7PmpU zdH=>jABZg28#5rZP?EtD2!6C@dPdqa1GcV$;0_iakPVPTG9>wu{7C`eUpTm;kX%WD zBoFW}kmOAYC3ym-N75%*kt|4N;M@{inSnoJk`B1CB?VDGM==L-!Qfg8{OJM~L|R3X z1dlS{(Ur6U(Es_6By9%*SP5clG9*P(7@%SEHCTh%g2CUPJ96_ff6o52XG`r(Fp$?L z8GxSZ0F6yaHY5>Ht2=1x&wWYIW1Q+!b@2d?`qY+{;G;ZAg?gq;ef*;p_FGzhBrjku zKk(-U+Vlgp5p~4+hwJAH`tx7snC7-r%m1;Q4Y0N)mFrWV!70@y>i_FU63LoswO}wx zUZfB(-a6nh7>v3e_@imQ9gslkXydZpR10CP5zG4m8Ekz2ry7ibo}naFU;*rxM6glC z{0!@xKJYJEZ)h@Ws4|%C<$>HkAMvsz;BT%#7pyi(Fxtw%ezbeo2pNNGi+Njbp|(Qv zN}~OVexyWNO~){!mMxqc@oO{@@?6 z4jT9T%N-q1B7kZMOOiQg9UHGTRNMZ!L$m1?&=);WYv4chFaz4{qKlan6|9qf;nIl834;xLaoE-2WZ=efiVKoxX@3DUUw;b;4 zSR;RvGXs&^3dF{6FoK@oSM>0?hPU+ZJD9a8B<%A|nq9DG+#=w&IKjCesD-u)VDTM` zShV?zmBc=`)i*b=FtY|H|8Wq028Akty`&@_*tf~{EowLeQJ2QTxq$wzn;q3j%rbpW%qJ8%HjD_c2uWMOQ z=U%Oqti5Dc`RqP!OJ&IoQ|{+-)-Brj!B%DK@z9aaVcT0PQlENQBy@Hv?&CivY|{N^ zATDa=np8ByvE})fCYF3Xzq9q~VdKvyY^`#fq#CkJE~>3`K2+>~e5iKmiXP+br!RY^^wcUD6)RJmb8opavF=miq}K9f?N=6B^9!D4=gjHeth#bQHvOLI z>Gm6LnXI?+n!CAIi~lg)`%?aVR-}rHTc!g;V8rql7S1u{8mC9rwv>Ct>?q9nAoIBS z&6NGh74MXM^6MWvU7xUEzdNCInQmg_ba=tWnVHRev%B_>*MH_XeevAOPf_NfgB!We zYbrKr{J8WiWb91#aYmEpX(4KLT2m^=r%JBN?{DgiySUgy_(YW4Dmn4OlzL_MmK}0^ zu1o5c8_^sZcca<9yd9f5KJoTTn!U)rR2Gqw zE4y;O49$EA?7PN8F8j9k`dZ^Y&qgnu z*4o)xyY9e`B`@}r=e@jpVP@uLue5LUW49}$nd0*8N`3Ex`?U0@Jm!4w=sov)>egE` zbpO|f-3NX!WhV1~DdzQ1lD}ifu2nSfJK{nfLv~)=^Qo%OIX&cq%fB{uZ`f8@)=cmYQrWjvzpH+{52@jmCVrvtp1>yzi=#J6!uyRI$~8_NpH&r{&-EibgV z_r_1lgI!Hn=kadd?WV;)oNF)XYN&2yH0_XjB52@rT(zV1z=|=}k3q{X)pI|%xN=YX z={4*u-UDG)yVy>}d=lB;wSpz-$`(^Lo(D47D~zwyD@w+1l(Rl!T$$^rVQtl+6SKnm zip1vt_4GQi9G!vS$qdfR#mmhXPhMb`W;o7xDcGR%rfIYOMM3Mzvqu_^eG)LYxb(G} ztJ!O##n+zXgGbFSZP8d(u=a4gm_FmrNXoUvt%`Sl7uC3LNh*DEgLU1pRwKHf4pR>% zPaNs)Y+}{CnBlu6%gQj|nzH92*}K9mo7j{**SOwU^Sa{D8>4{J>3ifVM8X?KG+u|C zX3xFMb7%h-o3lJk$Jnma2c1s3U_9|AY;nf3jM{H*x!aQ-eQ{QQY^9mEm;T_|$J>`o zPKa(x+ekLAj13d>4E&Mdc;xGQ^^xD|BMj;zaVf_l><#!i{5On?zsdRfouj{Rn{rQq z-E;NH>_X!S)r=Gwx(J)HpM0(?bj8moRlKSh1N%IxZihRTJv+SmsL?(WNCM9_RDY|y zY%RsPPp6vxNlXc;#ca#z2A;H&F(G^>ObTBdcuU?=yIiR7Q*|Ku#7j4}KGW*Gd?s6d z(~XMDxh`k9(Y?i~n#WMxCAUtQLHt?5WaP24(F{F@x6}?UDSTxpSUtANMW;aG)xHON z7H<{U_ja*Z4@*_|1;uOyxtDt;kZ&yPmf-Uw4zbNEuYf0t6#&)Ze^dY?ve3^#svbN;gG!sFhJ>ee5I zKYw>S`eoHQqg|2*jlPRl+|;zRC~nbLJ5zmjy)yH+C)3=&xC?!QtJTDq7n+)1=v#PC zu-!;D4*Tt>?sd872pb9Sbc=v%IjPN#Rmk?^Vh2=f$4ewRXL0)HQRJ6F#pz z!64I9kvwy~EjiTI;pc6p1NS?Yy)+KK8J)`Jw`K7!VI|k?+Z~6UePS7U5@ti*70J6f z{#xt8VSjRVPSqlG;b`Z}_*K4+zl0n3OXYtHwmm7esyo)y`q=j^^Ce$p(Y6uO@LCQ3 zvR3!aYp)mcv3NJsf4*JWtIM4nT>8|b;qywjgplzbwWw9MKgBszL~7X-zd!J;dQj~% zXR)2oVcy4zqi1*A5qy$$SN-XU;>?)|5&K83liAIs4)t%0?4D05N)=4Eo@fcbyLG+d zfTq|$owC!iz04mtM5Oq0bY`@emJhjvE&J(FBpNW)ejzMoPvZLt2bP?;hot)Ytn=Jj zcCVy4H2m|TIZ7Y%kFCu8n*F3fk-I9r^i}OFl+zwer*tRW(2F%7xN@97)&-%BS>>rVORwLc7PdlkNdZAV`9;7_(l zjvm7nXN^TV;!HdC#%7vstR3RxSB-3SIdPu<{M$g+iVZajDVNwiW_S}{h^4RRsdue^ ze%-m|`%{DI5ypMnn9e#YF6GMmE?KL<8W!v(@CbZ5qBb|C+$Bg-R97E)D8|TX{Kn~$ z1p765?Q_;KEN5$&V>PFv-Z+2L9(r4~_UF?VM`SX4cIjSfiye_%!ZlUXLT}`!k@%pF zKHN$qe7ZoZ;k$xCgpH*~TF3Rb<1hDGcFyS}Dg0oM-KTZOG+xdmR>N_i%Ad1z^E1!k zZJYb9j`XTZKd2Cl8+y~s_ax42QT}1AUAm{tYP~jF##|6JiuxuiMrMDr?(&cRK;<(( zF6_{f95EhpQ2v}z!*}@m&_u*%+h%|NC}FxX(=;&yW3^f1oT7*Pv0J(%24hYR9$&I0 z(?FwwZ`C`tF|@-&OK+b|FHRqB@KtFC?^*? z%z5!_WR7g|NK-f#wl!cl)ap=s2fezpZcxM9ZN)G0kA!7)oqwBKJGuMvMYoOYKb@te zk2Fa1TNIvH!D8v!lsG41?i{-P+x`6;>9?=fuhu+DK3b6R^PG#h*>1)2*{z?_bFI&4 zi0(R^p>bnLy4aPr!AQuC#k3e``%;`(p0W&D?qB zyTVDX{lX>I!>jLz9Y1WOnreKfKJ4qoIa5B5@Z0uFGkA{VuLLUiBgC$zJNZ(LY2r&g(D*81slaB}tsKAThh$FCGVj-Qpa(RG_U_v)~} z<<~`4xeIMB#F-@|?6qN*i)M+`-B^5e%@QB=kXK%DxnAj}+#gc-CX ziJNp7wk8_vUcav}E{MDQvg9Juth*_*OYdzEzgsn+^U+?ds3zgN`j3}-b7@oV^mAq` zO&?BtG5=WF)wghBlhC>3Dt=h(UFOk;)JkXI$o zSu*SJxO(ZWffBtB>nb@?op=n#H_lD1Fo^qfL0J5&HJyt3xM56JPqz-b#KTuN(cT zZ0&j$&(I<%2mbI-9p2dp`qPd_*v7d}J3eUL{7mvxkWJ_cDGlzh&=IK@&EcWBZ6Qg@ zcjToU_J)Tpk$Q1FJk-&w{L|z|7B@}n zU*{$TtOHHAFrCUe;!~?J2S}FU(LIWikK>p8lD@>LIQXda@QMa0hql>=$M#FTC>?Np zD6;wq{|1+bF1+%aw`W@Itd*KsXKk1nkXqSJcRWMt#fgBt;*z|~0F_(is*Ul<7IIHz z&B}Y?%k4aC+az;+cv~%eS0($XcdHe?*`)o}J(W5Y zaK$cQ*C95R9SffNsSXz2-S1PD86ai;{&_HOT2;8)+8oz+ms>n5Ya@%3Gd&hu3e|Yw znzqS*$6W3^Ye$z3|EA63;gLVos_Uq&T5Dx$-i=UIuFar-HAL0Wp`)tm>k=3tv&;6w})gT zPpsU1o2S5P$l{oqVbbekYEDVVH{P%sVw5zu8Iq86S|B#N=7|dLBM!Uu3hS&%?^f>K z&$GBjI^}|8mwczo(}wPW((1&$8L#?f{CdoSQm*tfdhx9{Irsfc?RMWTC#wuLt-1X( z=@p{9mzG7+8$Ir@9T6)XX4{w(X4QIs_yfZZI^oc*4Olx7O1wTU(&mRG<207^PdyZk z(+n%|c*t$TYJFfYb8wt=fXw4r-ul?Nsm>VRS9QNS`J48<);fA=X>Lbg=5`sIK?b4O zkecUu%fogiMX#K4?mYIqUs2gI(ps$YTvWNOru7qVcP8t@VP{Od-ObkO1p3Ci=9HCu zx{y8KcanF^P~7D9Z1|!XndZ6QA&cU=#cr4z-m8oA*PAV{GrVVH_&YY`(8zknO`rHT zg?8I?-@WYF6)Iy9ym;^mx2WKi>vh~GA97y~yHzshTfnkVv?^Cpw{lb9_Z$}s6Xg~L zy&bB4PLJHO$36_NQ~SCxFInlp6VGlATkvrF-?u zVsGCv81)xg)v~5ExwL;n&j)XZ`!6mttDJig^KwRXV~e=#N{>9b5pRKeMPxCJ@E1a( z=P8c`&b{w_)Ge)a`aVb-6l)-bLo8z`m75N;3-H>QYU^>z}MMe0j<(SAy8HJ5wa|TOFnAhzpeQlDwU~-AIoXTd>(x5$7Z#6BXytatN zmw8&>v-m)@UT{i!4>xJUgX+{6&opzlj|IwnJ5YeC<)s%pKL4MoDUYnh6B-2(&iedXqprPEQvQR0=4>kc%vheTD3 zeP{c!^1(r-UKz&=4@sB5^V4nk$R3dDW7?A)v&%i6j$`(Yvf+Bi9^oUmgQi)ZFOh$4 z?|8eoEhz20dm7vQ$s@8&RvLZw>m|3@7mQ8Ev#cx4y|E$xW3Rh?kzdjCe$oJk)=`z% z!)x}5L<}z7tY8}Yt@fK&kWE;X-P-*{u01u6f3er@maqN1Q@u8t*YH{^d2TErUHa69 zqpc$qvFlzoyl_@Jd{dE<5uU@lzH-jRd29>k+FI=ZJC=@0#-~&79U2>IXH~Uha~l6Y zy3Pb1s_*^dgObQ3LPe1%*+N-ctf56@ZMB4ogpjS0B8kXWQAr|+l#(Qg79?7}N{W&e zZ4^bD7XN!@p5uGI=l^qF%*=hy=RW5-&)M!a_qwUA8}+;NjqZ=RcTbh*pH!XJ(z|i8 z{!94}9f6yfa8^MzbS%NN#5WIvw&=y}~haxTAK?D#WFyS&UiqSkqC-syDAc)O*O zy^FxOYdQ}X^r&uLoD$cU_bT@bpSa_rzu7`#ZKDM;4sGinZ+0#IN}-F5k@B|2H9x;~ z=lqNl|GV|gs-A;4S_Pj)95-rI+G?orrftB~FzLGUmC$S7bXdGffjSb!F4v`M(#t{* z&Kz~v==hVw@0ks<>pxvNZg{iC)OfA?-%80_hI2*w#6911^vd#k-c;Q&=FMwA!&+nS zTfR5W^}X&eESmbwBJshG8xDIXN?Dl>T=br^t-o~g_gujnkJoIipcxpY5%^64Bd_>l(h-zxDZL)T5-rOMZbp4c8skrfqPFN*}Y* zy)tiQ@9-xxtjha4#(y09PNz+_^2CUiFv~GfmdWahBiD@`dEI<QgHce_(L-3`v?%WxxJo8Ij z`@hXd?$MTfVJ!JVu79_(!jY*X;}l$t&dFY>n;%jf=g0pn>_pTbdDo2otD4p#Z^{IE zS4ZvYJLPw%P(o*{-b5Y}w$va<%CQB8j_)NLG?_TSI+*grJOWr4K z(|o*ZpiX4t=_HxuDZAUJDQ{)jH`aXll*4~Dd9?UPYoU!=Es}5TO$SoXzKrU=QZY>> z&C9pr%q53Kb5HW>`wDLgx7-$`TY2&CPTkR8OLD5Su7;<%cF8n;Q4{!jGWx>S%h%uj zjXT{|-jG*nn`GJZxw6;#&%3iXu6z|@xkSsYmFq4D+vr|7LCGxW_`95i=F>6~Glp3| znr@$OTl64*b%vkbw&bp{KYz|XH>bgOg35`oQDJ41Un=|EY<8|0@u&8sa^Pq2^1dA} zMs)PMs*V`0Kk&^}?#QF}i#y@9NQ*l`Az?6?x z2gjL>jLl5#>A3dLs`~A-7kS|d@6!9Xzl>b}{#IFUm+E5Ob%i$j7X)7%;pQ-MQIS)@ zZllX_&CSd2PQSRPxjF1{+Nnn;rU<*O+tX#deBiw0_DiOV7dMqidNfbCqT|%G<(2jm zsrHBy1BY1Zn=@x#Gx?g(H(GDyb8ihvmxguhw>(>pc+Q(Or|Z(}pLwz3MAEQuJfwTxOO&>9k}6xz==cgvkx3h$g8*``(1Z+*~2Z>^WH9#3qFuvuya+p z$Z5WkvI`ySO-^3D{-L78EMtr0Y=;*ASCRd`3!e;Ie*3C-*^0>D2di671S!`!#`mPS z{T0|Y?&-=kC+h9i^0lrSz4}FZ56|Jkvt6#7DQARtLb1%-*|je72L9<2HAv7rx@y}R z?*ns+(#Ba;3U^grd*$VH-fe`UpV=nQ66>3a*&kLXEKQRBVKi&^#OdE$H)tRDWg785 zEaGLopr`(HzAlxEie`=W((g`B(R{M6{y|Ca<=AI4y4<#2{8!)@69zBLUt6|?9Q(2Q^17gP!Epzly$`r-m3eg1hejv&z_~4ZFF)K6$Zxn&a)q zIGrvs^YY*Sh^N3?W77D1^Ic)HqZVFY@@R2rl22~>u8MFMo+(ZpMH2dYd%kXN*;i40 z)&DO46WxSKf~vb8N0+_%>@muF6p#0kAH^MuPhD{@cVEaeW8=7ol2<1L+_@Dkzb~QQ zFuo*M^ib_2(a7@$I$zwlo*r6g>>uw~vO)QU({%T&x&eiy2XlRD{2QR)Ysqe(5VqWlfSb*AO#wSU`l_LB3>s~w)x`P*6+ez|a8x=grI`DVoT z{0l}K7B%eNsI9E__g&?uNB73&F8Q22_1cbr!;>?kc-KDqqn7hU^3SB#`wt%CYY%uK zuhmw+U$rFjmqtWq(YQbE8qRhh3XP$z$}gHvS)8KD5{`n7(J8 ziHTJD`6qV!PpaIn*H2UI*YG;Y&aL}7DSl#y=p(1T{U=(JG_6G=bPh~;$p83O)-V^b zlK1xW&)UaCWF82N&~W7mU%D(}cGU34$|_ait~`@OCE6Fb@+6E@UcZUm^KyMv=;<$S z^c;+P7g~gMw)~xOa&*BNW0{Oi>~CZH-~HaxV$+nZ-=rERSl00V%cy?O?2Gp;g(_#| zH{~DgF*JJLF}y(XdsME`gT04NMGF6(eAe#itQR4*)de;?l3AyZKl+oq&vB%XmP@Yn z%IjWU-3MYLGVAkW+7d+~{R_p!B5sX$m>vA{3~$TQs>^+6x9qStyT~ivYV0RflHTnX z^D$`e5EVE1Z z*jJsS|owJU6o$+%S-zOGSbl}Zjg+pjT|qsm0d!&0EaAXcI$c|DK8Sck;3BixN6 zeEk*w=H7@}E0)}LdC{u3eW!jk_jNuJxi{W#xrM);kMXQ9F`=)P?5v7?j;ed_zguxm z@RHg|dx2()YAv%f?+aS@t3Iyja^H}n^ZSvym0-_F=~%v_;u7r^x&a^F*-M<)&U^Xs z$Ra*=z%8kuoaThSM;-UKZhIh;({ws@KkIb;iaoL~Dm_|Ro#z*)UH8)L-K4#rB`uyA z;VU52v&uDhMql{KvAX7Vt8SIeYLDsajG0mqlvBz!{PWdvKy>L6|1;z4#6&)~ z*N*Ve85Pg{B?HPHbe(a$P{9s9^la|bo3+xPx^%imuDJ1X%~6SVM_s0GsHs#Xylkk; z{vIR3^L^1}S+UsZ6a18SUnxw8J*50C_F{AX`t9Ps3<^Sav?cz#8#b-ULIubMb$`RXYo|So)tL;YrQgx{Nk?pYH*M?h>v%YP6;!?G) zc!_ahPtoZX*WLH$WjU(OG0Hy6w6x}c6}x)&+Rb^zX@0t9*(qzpdyJP9h$Jkk-ZaJW z!$9ZitI8{j;-A!gW5>6xx}L)8tx~5oU7&thUcL17_SjG%jmtKtc`v@cAoyaU&1d#* z^-F8ouFv)iEL}Eyt0L3FT2HJg=eA;*_(@^~5oi5x@ohC(7V-A{)F>y*>0&$w18(uH zQc$UCI+6bV{x7CY2ggVhty~sSzH9goYlq=|cZJ6E@GUsGSJL5Qo{CPp`tFxE5)>M* zn2uQ@vrl*G+0ZYmjl29CjC!SS7JVK6X5enoapy_-9l@GahcxRteoWYHR^MTM)PMK= z&sukz1f@I!OO_4yzT+u=UEF5VE{z))9U<{oAXv~?Td4tc<0cJq`sVo!%n;I|LRhszH~{Ppr2Yna_)zlPXlM`ANTF3Lku-17O8~hDl{L|+7>7^XVviK zyghSvCr5}$$MP=mzg2G0vuzCjeku3ZNf&O1Mp&fH+4 zh2jl{R&#i!7C&mdn8i~X7gX*#rJA=(_~_S7ni}%m3nNax-qvVWVPSGMMzCkJ^m%sM zz4h;oEop1Q_aNYs2E!%qPcH}Qkkas!Z9U^{hswEm9ITGXSu$rRxfqyQ&;2SJv{%gmrYH+II{DGV}^%Z z?9*C>z^At++WZM_tt<3!ns1W1{|?XIO}F@-%BxhF@A?|0HFtE6$C#_$>F3Yf)~~l4 z+cRc?`@uNpYf*>epW03v8#1LtA%D);mQxb_Qt>A&gvTx(En9TQuIgd%;$5D1HlLkT zU{QKd$;E(Y*^$jvmM^y4?4Kr782YNLrSi7eg9sV-xnJVjgxByEU6o6TX|tKk+jeyR zsPq0wh412`%ZplmMs$BU`NUcLV3R$2`=LKtLg${mxc6D?mig1?T0*^T=LF(EiB4`0 zkp9AQ7LjP*SKOE#>~JCCY@9^TTSxc8l@feCBD-Hk+_RN(*z)biz1a<(+QDWIBeK&! zEZse~_J*&_#x1R$fimlg=jq<_x%T8~|C7z%WOn?R-Ha|{3U+%zemUW zs#R_Y@9ypFeY-7FIY@A){O{=kI~D(~E;*c~=zo2Z!kA1)xi?XoGxbi%x2~vJanv`) zQrom)z1$OZF-t{N|Kg`PY5&w&tnpfrD8BrS`^pt>cB+d@m9F(zD`5QekY=_6U!3B- zFY*tf^<2$Pj!W{^)Y_;n)%wl&^x`$W0S@VVYa7nb)ss|hbzA!2_w#$xL}z-`^oO_` zXm)j^Mt$71eUjL-wCVN_rXG<<4)lqe(Qsf+%+gI#2>~JTv3Bu-$-dT`qw}}CG5Or~ zVB5KDp=Xiii4PN}3Qeo~kizaVx|v^7?V)seou$_RU*QRnBQ`5?B5!n0{VMG5>n+&G zPHe83E3I>PSb(rj`tGMc!qOeg+7=i+=s9x1+5Pai6n3m$*UU7#z*`A3+HKM&o#PF= zwM!!RdZ$FH3jeHVeJ9uQ{aZ`*%45|IE3UaK_2q7R#EyFh7UeZe$vWN`9MbiMHN)_2 z#D!|-4boTNio6t=blbYNEnc_t%UrPsufMn?WLjJp6=0M7?%H&pe4CRY!oSX!p5edD zXRdCncdKNl*&RI#&~C( z&>!8ze|fra+_NVY3g?~78p9+!onJ>jxbx6xq;B2!zS55}&qKvW-y7S%CWG0q+H#bg zGwVR{nTnHh4JYNqvr4T~2F_KEFx%nax|~N^>FXqi?TdzWzly!&ba+pz*QG4cIn^4IEC;f!;9{j0OG3unZ;98oA! zOWpt=a zXmPEkaOq~J_l*OcY;m*T?pXyMK@&Ica$l*by?Do%IZKq^mhqlkI7WZRqSY!Zc|--@lB_1Fkide^s>?CZU`^>{{F#9sf3oW-lfIXJ;(Dj+hUL93tn8` za?C5O_~7B#x5u4&4iryYUOI8c@dM4O0SA1%R!Yr&vg}++OV*!1J3gr%nbsU+(`>bR zM$q*W9<$YdlzY3|Yo2WI2rc?@MZ)sN>BoZoqj{B`if5g>9^zjsCX@8rvFM|O*@Zvt z3YIQUYh}C@R#bN;!KCpkv%YOj9u zHCt4CJ|*hh!lm`z(}i9f_!X;g>003AHoms2Y8_`JMya_^ec8J}eXFXzPN8mNy{=K$ z?}<0|DK5#@4XhB4d!6-qSFf7O+;1&{-7+s6LLB^ZNjx$wN zPlp!HTQ;r!+h2{1*Y?I+M?e3ez2aGy`Rpk%$?+*?CT@5U6?V->{GrR?QE&E`mW!K9 zIM^2)eWB9VQQT4UzHzke+q%zd9Adt(tQv16s9h0zEUBX+C4DJKGNrto{bTE$`YR%T zx^%5xmR+p$yKlBYM6+D~Xuhb*>(8%x)?COa4huWI^kWb zyIA?Pnz9`~@=C9zNY(5qSx{Il7kFIp*$SRtzSBMwvnT$j4nCh)7!|*BdZhu2|H1R> zODlJleVZeu@*zmUC0@t3qT=H32gA1YjO3H7PFUw#aqnP>$nB%7#_$JAgY|a=%)k1g zBdhaHVV3%}tcyo01pcU=mY2*_`t&ETY=K-vj>iM-Y0lMG=EX>S<_q8X*sEa0&1?M4 zJq^!IgJV0!EZ(;?*;wGl+fNUwuUzb|&Z>N(`ygqLsK|=;y3po`=~ddS?{4;Y%l}L| zru0k8DP+fqmFt9#rrmwT-)%58SX;@=b*tR2bxtzNM+LqM-Z;!v!&t4?>i8^4i)CMv zN^e!a{;+Ysl+Tni1qH7JtSd6#-ySXPJ4(@IZ=rbk)q}hnqGs&Xod0RkHQSV;?(Bnd zJ!R2N|0GPBHe0U7dv?x>aJ7i0mBU1b*Umin@qE7cVSdA8QJrJ&M87zkne%Av+0e~~ znN8X1`#yfX?wq7!9DRx}?eXa|BTeVF6!z-eZ-4rI$IT28Nr|sj3%&O2)qHv9@wts7I@Uh-A-fe7gZ-DQyRP`;rkvUJ!<=y@C?7ZhR&#ry{Ossn~GDNb>cNp*C zQX|#Pn*DW8=c>-jt9AyVNAAb$-*Rqq}aNZeFmq>50t7TL)IBXYHP) z`hBG6-1EEs*}=2H({cW_oefG-Pxh6)OPDr#%*fW<)7|rah&{M3I+m^fqsKb-x7wBt ztp|&;_I*6#qa;vze0K6n!(X2@#in#Wv44Lc)xtr)+NIq}tHx?!U*F}X>pO#27x=9? zJMq`SyZeu>H^}cVoMxc2yQHo{I{oSh?R4oW5~hO3W{GN@IXT&LxWLqlWg#^e9xu3E zdcI$=iEZ6~zur@H$pc=cU9~cv^?x&!g>PPzJGj*)_RL(K?Nv_okuL-8tN&A=82eXT z+)#Jx`m!XGwZ-R87la0_l`0EZ6l3WW(JlLR=|w)o3K-N`u6g6z3wj} zk7~yr^DEf1dzenoffok16jUC|570^@y~RZ2-(M4uU@QF&mOJm^};mh9sfBQ(L>vL)26T{KiMQN zIQi_(gp4SWkLg!3Y7}qo<&C%?uJk)4%MUk1zE~&UzxPe_ z^G8pgT{5s{8N77~yS($o z+`bzvs|$B{&CQuv#osmk)$qoNFO~SVPX3iVDow>#%ju~0^Wt*Z;r`cd&U#t&jYm3q zBaif*DuoY6Uk1+jX6?gckiyQ|yYZEqh3&5P&8a)2RdxjG*%`(*m?%cd#oQErF%?jQpl&e@kYKK3c=t0{CW23;O-gUgGWFABvbk4_ur2` zK`I5yRlhu`WGQdnJSRMVV3u&(3&U%*>~9Kd?VBgb{*+mJ%ttEZVbF;moyP=MZ7sg* zG|>P1r|y>Dn{;MBz4Lo_`SJ&EwtJ|5^xl3w_?z|SM<2WR#FSUPkT2>zoxyXqmp|G; z=UVCrjmR{^=NHwR!bgYSh`X|V#F_J@Pe#s}qM6vNtNpCbY5uowj>|1?zBg4>PS<7o zugz%hNaD|S-=6Z+F8s9RzV_n=5xJuu%}Cm?&s|5&bnYboSDWgs{&*xV5FIsDEzEwl z)qzF#4^%Ypotk$wb6Wg7 z`<78Z)09@-2(=qkXjZbiC(OrvZPexCJV&5BiDZCj*j1#NHrN|^atqi{sg^i6If9wmIKwa+M? zs};HM{tI72^H|LvV*}a@|JGMu_+$OP-%WUP*||Qk9?KJgX%VKahD{4XdF2it7~6f^ z=j%?x3lZ{JKccKQDj&Ict7i4s{W9M~w|HjV5>(rluaVPs$YR1rn`eJS9b1ZAJ4eSW z7^k-w?qg@qEnVWhqbs`QF-t(pc`47v`gw|KzXYZv!*)6i7ck5nSNElF;kL!RX7kri_>r_|&0?dj(N%~Z8G!&L>hEp;5i_so2-Pk3or85FQ|GlEvbCooBDTAT0-vk#%M1# zHGAwYm1pou!PQefYKja0mO|FL4{8(ldreNujQ+dB$HK+1(@bj9*F^bfiT9Qr2Af6l z9!^m_Xw<b*0Gv?gz7_Hm1&{)Pg&ni+VZ#6 z8YiUwc`h^T8*l2gow{cZNbBm9J=rhR@Nm!WECXp_!&~#aIyY<{>l{3A(OFXbmZu2& zPBXvk=nMTNVq1QGwGNv3WA3lN9jymtoQ29B*mx(uzrc5{>YCNT;Rc31UaYw#-=AL< zj+pVI-1;WJa>5%)as65^F>zQ?iQNj#D}~ev$9dS#u^{THTX7-d*sYr%uW16_a#BvZkyG{`|}F>=M(a&>X!r zReQ7_)nE8sd)wgKHPOqzbw)R(n?9GaJ?WV)-J!QkB>6J=^Lx%dr0pa`;4vI!0o(k1+gQ8JB*rghxzo+K6=Zl z=l#LGt210a99q(`b<~|nhyK~n{3b8&>}8dM%i^|G9ay@i`I+ABsKlPq5Lu0`ynpJV z7FryZ9B(%iKJFkh)&ELPq`bkVe#a`C?(LJtxx_fe$KFoXsdlT~x1s|*ps;D_OZLRLdfotN{*Y=e^%|Cuw_rbS2nL)BE zt;ZcZe>*S8m7tvCVNgEyh*W_N4fT*hGuau6gZkM#+mOcfe zRreIMD*LxBc^wcY9Cx*TV0Y{%ovwnY>iJWy9K4tNe&=?NO;2=<*i+XXN?sJK+~Bm-vYo!3t04V+Y}R*X7#N`LN41qH2=*-`6VoPX;H+`RF{tw-MLh?IGAcHa1e zw-1z?jw|1ucfP$i?_-do>~ERv?~TT@%uP)6Wfjer*iV<$R?}3|kkwSz&{o%-iSHGQ z?v;xYPnZphCq#rtYSajUL}vF`gkf-7RTloKBw~2IbhHwa5Hsa`V(t$P?}(vaC8I<# zZ!W@*o#U(<0ZaRk>~Ur{*dj(XY=QacC!xsy zn@GnbHS}W2mi1%{aBM$C%S}!ms@xg=PIx<2H9W|Vh@4A;}AIP9WXK$zk#W9 z*5s}$0>5h|*OdpR4?6S{R9#>}$i}~AUC5U8Vv1@Cp|Ka@wI@n$CFH{_;rin|whs9l z1-8gCqyZZbc_JNtZZ%nkD$rqn4H+GNzCGul@6d4#|6g%k%v2`IYaCpNvWoePk}mVF z0u0@r1=ZJH)Gnj>EZDMo5tuO9SKFH|<|LOb?43=0#XQ<*)!P=h;S# zb{}fX38*c{4>M*f?nP}mn%{`68#%(1?ZSIkkgdx&q0W>>kqMYA)2zoa&056x9$UZ^ z^`|+^{}Hem$b3fSh(|W}@-g{Gqy7;&+??sFO#4z~EXgvK#xa&e7)t`iLY(!V!umNw zt-p|2KjMF^&v>wySw|Xvv;7>_hcYpB^Z&}Un5m$Wp^L;Vk2lzhMfS`G>zeNG>zGE*nF?GY3 z`JZ)Tj_Ssc`PYTt=cD_~uoe&Y1x_1ds%0zViV5M$0wJc>n2tZ#>d<((6>LNx8~=_W zW=yU4|2u}DFNaQO_!-9fJn+91e1oTr{`)Q8|GbMhy06>7SEHYyhvXJ9FJkf!0%HW-O2&!dw}Dy(G|D|jNN$N^Z~98oHKVaYzyZXa1v+kWIm+tQL1D9kzN+YBF-Gjut&f} zAk>_>l3}law?n9NnPrrEnSW#_5gf;HKoyR75pX>I3o+$K{628(|2W`1z}1m)CQSt{ zJA%86?aTyj2prFSM!+M0bLKy0)g{33Go`VguGl`@e*({Ee%L;6>?gVp1oGbnIQAzF zcm#0H+{Waa3H(0XuL93k=YZp9XLIH(ZV{RG49>$ce&fT=V=$;kz5f3vKF(7X{ujr+ z;lJPUac0*4GPJ}uxJCHi@Az2%`)n{Di*uvR|B5+waJ2sW6(46S@4u{yiI2#C5ohVq z5d8TN{NoV(C&NWiJA}|_LtbpApZu?U#|**QO#eZ4L`HE9aJCbek7%3hf7wxCIMP>v z-VpLN1&*J^gy(r%;OcPy6wX}Ftg~(i`+-C7tzgFw?BHh{#t)&-9)h0(I}y-?ICDSa zPt6eed!Xk$FoMx>=6dG6Z3z9FA^3N&Qv}Zf;mrAr9RY}cA_SW=cQbr4a9QZ+nCk;C z0?wIp8T~?r|F8P8VfYxLKcaStlJgLHAF$sJ0|saQW%N6T(8q(`1-eoMGL91WVHj>K zXH$%=5KJ((!<@;)!N@T(AUk^dytxWdV3%PgTTbp z#>#SV$<{T{b#TGn)jyDBV(VyUVxcy3)*xQsv)0qc)7aI=eGu9Ed$LSi1Fii%eFB$w z1P1&1Zy3xO^99yH+Jh_53;$ZTbagXwclZBSscAL%**;*+;Af4QdjGCu=DEiI-$2;9 z1$YkXi~?Q#h$S~-!Nk`mkh%WB+vDHdEIl?_y7~>SZ0+Xe>i=&st=;~$w8Yol!`^3u zk8iNgpxlBHoBDeO{p*T@hmX52W8QqRm9f!cXDc%^+xd3Rc1FgF=Q|HZj0JX>y7gr0 z)5Le9pR2!z`DRad78jukGxPV|Xu-tX+k<6nOYp%sn{M9dXWey152={F?>K$eVep7K5yPnHFQ>>ley|gJtCB#}tB45pD0klvtuyLeXNG z`Fn6pqee)GZ3F!|F5&D~c=-ErT(I}?b9LK5C~32}gsjD$YyOql`7ZDY^zdKn$^?_7 zOg=1R8A zHj#caH{V1_j*FRX1}dk?9ASU5*nSxFMIBg$43mWSaLBEEwgZ&JkIF3ss#gBoVpA^3UTo5`E?T;dG zv>NJPHn6_-5c&m_9=8YEA@p99UIgq1Qyd>_3#a&N@P7}*oxn~CaJpO2W=dKn^mA_H!I?-~{o1#90OQud)BwzBX`V zjvU|SQ+jNF`4IX5N{{Vt8$!RA(qsF_hS2|}^v5C2_dbo;7cgJ0=PZJ1A)6!JO=m%il+fjr}$bFKqegnPRH{qrN{LmAi!M@ z$6+zp5d}`$QKt0RjtRwaJFyzV&RR-80rEXW@dhYwF2z3qzew>jz-uUu??3v8;+l}} zD~eg0IUNa-U$ z|C!==92gkF&S*HEhRciVeFnw*z<+Jvv_IyQek}O2WC;B_N{`2DpCR;Em@g;zY=Wl~oV1fma2-NlLU2-FLvS+RK7y0^ z3c`*j@}J~mfTMbuOXMpzgkF{4WPJ1pJLnt+j)OU&C-ZeBxE`VR8G;`sI9c9v1Sjn` z5*+O-V}G6z+>qd7;rJwqk1@ez32s7g{A^=7o|_51CZUfYIO$Iu!3_yLFC5fF_Q`y; z2~L(bhu~y8IXeU|Cpa0;27;6JdEvM#UEW#1QTrkLT?24DUWGtEeMZ=^Aj;cCa8rT{ z!SPsRe*wYmfg^ur5ImCLh6F!E@Pz~)E5%L-4jC_@5#8G}zyz^KBS{&qEc+BwFt|1P>d6#}2_OU^|PpUyZ>3 z$k!X%5v|V{f?pqkw++FihuH4b9D)Z8!K;Vhvxe9X3>tz953wDkH3VNW1ot0;PlSd@ z$Mee&d<@K|v|e!tesTzYV+bxmj05Dn;LU9goa11qDIJ4lKZ>I{9wmH!3u)2+G6b0v z!hIXGgY9mmcmyotcWfsWcoe*2o(Ie1emDB=7{oCVw#%?y1$ZjOEr6#{+#C22iYEd; zM)8|a-_Wd>Gnd>r;Pc<(z+cP_L9a-0S>R|+K?&>e`ELs@9^@?0<9K5|KCi!?(i=iQ z!S#amvcO{~J-*H$jpF#agglBDK|jAl@kHRaDBccnd`xkCUBx?!uWAm1YtUp<8jvMAmF{rU{W$B*NJ zVv6JA4tTo-#}gmlsiX8fFdsamco#GreBA)HqlP{(=>zv|FwTdeTwf`^3AXz=9gg`9 z+qn*UbbS*_n6H6le0&}AZWxy)Q~G7lK2<2rJDF=&hvN9TImQ$pE63GaQT&W7mt()M zKN`|pj?bfEt^+)bvNIQWG{sGTpP+a*Y&YjqoDJ>&I>qhBa{akWaeUtA4aJqA{d}SL z4d^d_DISjs$Rt7N|CZe);Cl9HVm9EDgFfp=#LcN3iBO4K8^iRh3#^DUJvut zFusZ4@0sE#G5@7F{uCb#{dywBkAWYvD838&Bf8!PC7iDwa6^it>q1d7qxjV+T)vp% zB`~g{>w{3j_9x167Fo+E?hE6d6UDD?PM#( z7eRkP*CnBZ?XQ`@UB<`zF)xwi@_m$kI>hrh#mk|-E>k=R#(^4&D|5}W8Yzyi8*8Ju zJjAn;;!#j9-zdHr;>HW@4wno2$)@;W=)d?p0M=iGcCJI|&qExHDXt9da|y*I<+%mM z=Qpu^Z5a3P`4i0NLj49%c1}P!!zu0x<&C8{&i4StZDD&Lo8o_AJU>HmydQFz;@Ex- z#kYW;jTD~=+ZAmT-w5rYlj0J%eksli_IaUxaNMvzY>I0@oTVr(3+;a@#hZX@QhYy* zSMw;Y4*hEp#SLKIccAzjSYAVM?7t7iT~Gm;w1wgsz@sTX2ijpW#j*WTig!b~u2WnF z`t@CkV>>MrmxJTTZz#S6+VcR-xy51$LjS|{I3E0$pg7KVHpQR9b`(BejP0~SzBZH| z+rj6HvHsT-u0xTOJ`Co^1d4ls{t(5n{alJ;`{yZ++h--k?O;5=P4V4Ou16Hd`M#vM z3i$tt;&?mY7saJvp5ll0i{mpD<^@rT<9sJkJR16u62;F${hCnx6l`xhQG6$e(xU=luli@6+(d&ZO=+p(g!Ba9oXDEILaaeSVylj8p1|4)h^ zgK=Ou)C0~}0p>GNievv}DE=4x#K&>59elh|kJ5WWJ2azs4D=&git9l8#M=wlzAKam zU$=ny0@&UQqwH)4JNSAAtjFa_rSyhy{4I;(xLju_j>~n0;{LF`cZ=fbFrG9~9Q*T< z;@H0)iW@?E{!Q_P;QvUdAM~{n^N;OIP#ljN@)SP}_VMviZ07~&=2CiWe<8*3`8G$2 z_d$Pmr}zli{`9AKCG5Y?hqz*Y-op04B8nHne6f_`mt?se)sfFmaUp1LZWMnC zdQXbm$#d=dQv4(rvw|o-9_GiL6dwouqJrWxV7&T6@wE^)L74Y&d=9`oD@pO)z~w29 zejkLA2E`wOeG7`??L2#m`+@&%6t{wWeJQ>f;#o-XEZ9FSrg$8*hcb$ z4+K68`aSk1RhFB<7>Yx-tVtCA3iGKl#dq*<*U+VS1C(n%#ScLoY$^T@_Upqb?hXC? z7{$@=1W`Io@p_0)8^z_Izq6rT;5alv|D8(ly|DdnPVvLwrz^$tq5b<%Toe4?Lh<>q zpB_W;uTWq6DJ}@}`*Di1VVuO*vEXv0L494J^aap9>nNT8ad<@W3|M|eacPKe55=>g zTz@I90s85XKlW1}{MVv*0kkV4iVL9?nPf@v<IS@hdR@ZlicS z*xy6(xiDVsr+5o2XHk4JY+s$Bcstm6KymcDZQ`yUJaSB&EJvYha* z_J4z&y_Eh5#OD&l@4~ouo8t4JzrUck5tK^=+6B({7mVjx6ifd3;yWNdVH7uneiT9RF3{ui5;)&kP`~k%z7*`F zQM?iM2d`5+AI80x6d!>8J_@!waK52^(aU2S!hKj8B@Fq+K&^(1)#ji6c>i^ z@CwB}VLRz3#e={OKjee`HwJ&iDBcI{Z!*O-Aa1G@e+_YVrZ^tIA}DSoi=x0{6;S*W zw8MWWej4UYA-uiJtgFQQZv+3eDZUWKtHJGS(BtEYdntX6EF)l2A;p_ud-xf}_rms! zFtm3ZPkpEtU5bl9fA^<&HH?D=6t9OkT%!0gsMl(WzXm&v6dwWOEuP1)pHrb+U6ei_ z+K(cPD_B2FmJ=S9H^nocp8P5P8sZQ_@j%$G-%jxqh;JOl|H^Umt)V!&p9xBzDSi^{ zi$QzA{@23(kru^uxn@`{6#ou!!N<9=ohH~mIYa54VE+0|ad&7Zyzq|gRKWI+0L2Gj z{25L0&(Oc5D2|UuETVWV=)Ea^3+nd(#rHt_%%(V=UyCSy3C4j6ieEqlWD?%q$K|bt z`f8^1!Z6OT!C$PO34WSVd>+)}4vGiE{IZ+kQ(zoVpg1n)A&R$iyl1g)Q@jW2x1Zu4 zpxr7!yT@+sc`TnH14%90@^gmpWZ_o!OiBbF@)Qc>|m%;q5 zN^uXU7rY&T?MuM8XHMx?K>gzLv{)|$^Oq~7Z-MdFhvLG}KDSW(IgD>H6wj396qmK1 z;$;xG;}n+yewN}-p&s%6J@!8m;*8JZVSW?px0$lj4)ak5#d9FvUW$i9zC19lVEanY z9!69A1&lKjDc%eIC{x@NwgdDiZV&C>oZ^Mh{_QEg4a((4@j!^rCW^CRp4v|F_dMMC zil_Jyn0Jm)d>D-Lc@!^)eqBQGXW;*Jiob?-a-ZUP1!lpEK}HQ0_dqWE;s zFQ)iHs24|y|AqFjhT@4ZuWzLIcIdw$6kiK|M^bz_=o2VD2I8Df@yAdvITR0ses`AQ zWxy{}yc_ISQ(PR{+kJ|=LwQ>%ejD2P8;VE4xb&IgVz58*o8l%AhY_$IuE%Z|uS6;C zH;mgpCsI5L>PwO0gz758uEQ)W0app9|Q=om8Qv3vLUtOp8EvUyk6u%61 z9#i}-)Z;6Phr+z`iQv4$hW?m9@eqjTF^VsOc3VL4Ac)IFikrZEeU0LHo@k`_1F-Xq z;%g^!G*iR$45<_&M-m?jgK3a0rELI-Dk^Vf)JH-S?9}j~562Xyv z4$Mcj6vz8TkAR~%pmObma`jO>4LHv5ZO!4I~FYl-L8sKLsj?Y)sQT!{@urL zf+IV)9z_U_^a~-L;si%}+2PC!dM7y2p8~xC!I8cnj;pH^9O(tXjuyd@UKHxfkl;uk z2m1L0NBSV()&xiTO5pauaXnri$$ZHqFM=cKGSCMS9J#_Lh}10BK7u1@5%`%-aD*m< zzJ%aN?+yA&f+M64`iBHZ`X3O_Hi9F)4d{Cbj`ZWu3zPm39O?Z*FRH}(n)5R`Bvl8! zG{KQR8T1+iM^bz}{cM6GeHrK-2#)ml`gj+DBYi#Sw*W_r=;Hy{F5L+n*BA2@C*=@& zRKFwnx%?Et(MQ~#FAyB*jX_@q9NUNH$@+)j5E@PfPYFBdV*vR1iqNBS!R|6^xH4xo z&bWv2-2(Xv5*)3H{S+rS($|7sf#QlIxOSBYj_ly=5G{fuJ9|K{4;+_w0oM#`5y4S; z?SMNIc98wABe`F!CG@DgMWBx%^eA7v{SZ%Zvb<>oNBT_yTtgWINBWk@T%Jd8q^|^h zA#hx->s&djn&7BhF~FY?c94A)*bZ+e^r&3-LC>qg{UFG^p?vZE8b%PDESD(3k=_jA zHksn7z^4Mo{=ejA$C^iQ4b=^p0@cW)8uTegO1Fz;PUuAr8w4j^cp(ix*)B z**}JlQxSSpE_~mB6he>k)fHl1n3P6vWCxcko8U-)AM|+yNBXhgXEDK%e#R)~g-MqP zj`a9?>>A*>y#8S41;J5y+nIlqIth--6$g5LHO|+A^AY|%wg|zI{yylZQ~U*RQ-Y&> zCjehUaAXHPUjQW!f+Ic00p`sQxFGWxmDd%<&tO82>~MBUn74F7kK&d9aXU(IWCz#F zDS{(?E$Gh>9O+B=m=`9M5gh4R!svy?x(XZ>2l+Fd;}r9p5Q3v}SwMMT5O$FLiBPV0 zgdUl|_q7n5!7MOIkoiaX>OsDv2~L)40>P2qAM{ETuL3>;IQHKd{5K~!@;?>)UrE?O z`P#$w_8LNuOvpmqq6j_mhs|bQn6!uBr2nY|M|%7mg=~sH2RnJdvH$vz?+t<@{~e%Q zcL+#4g5XGx&$ByI_SsP0V1lD^ zU4nMLldyyATZ~~|n6!t`BR}!|Y6=KF$`?O}qlnJKl`?Z`-zkuAAd`y_%7H_KT6pd293Ie;AFXO z5*(FF2=p(8;D0DS0rV4Qa*ECA7sw9g+7#CZy$x_2w>{uc zD+wIs3x{4fLd7AtE@cN_*JMcPVOV1=9fGf>?BMc&~7sb4n^Yl zf0E!x?*;lwisSy(LU3f~C|Ze0uL+J&9oS)MalRgmGoD8T36Au*e<={0^m7Kmksi0( zg#;({b_7Ry+4YA|4c|}WD8W&j@qBlR;7I>QoOxkV z8O8DSqE`uy?A!x=9l?>E+Y-nMi*=XaNRN*{KOs2MPlEF`ZNPE4M(`sm%zg>MQBiZD zUifr4Uk{Gk+Mu6IaYx{D2#)OF`wE#69GS+yUt2?Pq{scyo8U+v1@^ZQob)pWIBqAC zsJzIZIgsx(f|LGh5*+C_gWj0pXMmdn$NAPk zzRmCZ!Ra^go;6NG}WhG>_m&zd{gM zVX=w{j`TjDzXTkY3*Z0ZKEYAB`k-8|2|LI>K9AN(=#jJs$|bDFEHDYVf%3(_zYrxj zvV+Hmi3CUbui&Q~!IAzPTnC~`aHLm*^R}A6ak*q+|9T<8QMvGawd@Hy$bK}`*D6Af z%7yKO6MB^II>l5^x;8li)~i z4cmKP36Avmyug^*%mR~;pQL>$f+Ib?|CKhuksi-$h6G3YFz{zN#qoVT{0L6k*#caU zv4P?|7Uum_isNzP7{w*0Fe@?XG{y0GnM)Mk1oc}@@kwB(0XVKleBa$qgdWwqJ#3Hl z5}a&Te+iEC383ejgS`E>zqp`+Gl@-bq^||N7;x;*7&wohOmGxWe7`eo!VdCh%oyf{ zNplH3sxN&1VP`^*@@2vCaCd@} zS0c3MlY|{)-&2BlVbU2wkIH2TcJ32;ly3p}*+g)%T}aFUxDLt*?>R7bGhFm&T0Qpu5rKx8IJ7Z=d;QXdQ>hKuwz8%QN9kc%nOsu2u_x3 zDZ!C`pDa={+wT;=CCkCAwZO6e_`Wvb1V{cq1poICc2K_8!A>fn=d?FyhXs_r74#Pg zj{M}A%)BtEoZ!g56vUy1;7IQR`g(#Ry#@IBh~P*c3HnxoBRvb|%{K%``j?>ZBskLJ z`w;d6=V2Hs?@}o5gn7&YlQ7Q)t^r(-`3~91l0zzHdzRAU=lD7idgKqj-r9}e$j$?> z<3n(ye+)dF;+8P(MG_p@!Q*WL!I7Nf+J}w=q-Tb^3H+tXf6~t2OdK4 z)xgt%3$nQ7l7ar1L+SB(#&SxJ<4{9zlV%nOt14LNUvafn3@GpWUp^ESv`Wx30* z4Y}{QT=>4Szkp*u@%T2}h^t2&8!I4bYF=^Pnr9Kn%& zALyrY1V{Qp&`%>c(&OujH3*LMa_CDY8B%-$@c9Hs2;WcGir~mj0_g34^DvB;`N#M7 z@TPbP%rA))e}v~9ioXDU1Gpe#8)az@+nIMLy&v@J*OVT|`4hpB|2M(^UVOQ3OZ&%b*`aaAf}|>{m(=9O-*NFH3Nw|1yPnVUiNTksenzisHAy&P|H{0REKX_&SGvisSpTN}4iGGYR{t0qsqT;){UWP}~E!GsXRZ z2Lcyl@<4HGmqxiU`-POg3a)$EPwDY^m`QLH=RK+%GprnfBl|x@x%>>lk^VI3iwTbO zxSd=Bj^oe`{yhCZ>fSq^%kO{ue-havvmz7~kximxd&=G`duL{k%F2#t$jV4UAv2L| zl2wsH5`~aT$!z#t7w78jeO|qOpYQnVd)!>tb?(>WJkH}h&ba3DT#&pHDAyDuPYdLK zLGqaWB#N7Mp?*N^SpxP@ZsA+)VcNn``5^wy^ekIADvupc_iy2-{KiMpkkz3r9F_k7 z8m{OTj>?+}APXcM-NI3M?D#Ifg`@J{fINN+N98g9>ulkuyoMmMK!PFQn4fP0zn$A6 zkLtm`LmUOkWACkHLh_B7LMx2uBWQEa8#aC2;GU?C*HzQd8{5g z0mtlL0PoRFK^*%o4}sE#x{YxX)vpBflSBMD;Penb1D@aS1RTqEC&*U_lHUQIXG=o- zB;Y6hMUOtj`G9`cEu0v!zW`kzAz%w9MB+>28yI(O3r9tt0r`S09F=DT`fIjuRCEQ% zcWmLPJT@=qd%)4`4j}*Gpj>khX9Lfh7a{%#@ZS(WC59+N0;%%m8r6@Ua#?Ohag19y znr|?WXM=bT;GA3dRz2cdII3rt_+|!DfMfOh82Cqb3rAh!wtZ9HVhcz869(i1w{TSc z6p)YI!cqAoAb%6$cLA^6!cjfg{oXdfQU4r5{;_!pp8N}c4sq;v)&u{-M}{J z!aqQq1la%aU-&nOPmv&nK*G|$@ZS)}=35}dZ>GcifN^q&1NAuSf8k6J_dpu}5_bO! z-v{v}P~HRo!ucUi3H&MiFI*Dh_24>P`d@et+L(}lwc8MIAM73|ILguXgSK@vbU_>p zZ@3Q-m)Vd;jsv8d8<-wo296!#T0kB&_l@zE3ovvAE=&H{iS7CgHZc1!&H*;i;(;P= z5HNgfFqC6@F}pDNQjq=>SY!Mdhgy|oE9|<2`QVaKlus*-T`sU*fEG>@9}?r zk3HvQKmigk&H>sJH^gNC$G)?H$%gb3v)4ZF|70ded;m>R^f>&c);1xw&@4wmj`ztoXg{{JnAfwpQL&IDTs{FC6~{^>p7P8xeF9#r!VrHdZb`!q(2( z$HBtM&E6eJy|Ha&ZS862`(L|}1pgJc^0abuutPH0Oo7EVbJsYV8~?>^-eq?KUg>|6<93q(!?XHqK(IWWdH4I9_0! z7TW-87G#Y!2^kQ_Rw4GATLs|wv_2W~HH97j+Nn)7BNWXZwsXY;={z%cTM z@gZBN&i~W&=;<1&6Kz*p1D1az487#}0qX-}2n16gK{$`J+Q3oWBvmHnPBWY$n5D^K@bJ9s#^5i$##N zF7p4k{HKFAg{GZ1*J%Fe(1>M&mERU&f6LzjoOi!~$`3_xe*cnQ&)4_1Kw)7HX&N#6(({)Rf%MqYokA@8Li+kdk^5!jE_Giv`1 z}W)GY^28oz`9y*a|0cpwgxO6wtj-_ z#J0D}^?~$T8M+P2jsgacAA=x$!T&IR3?b?N=Dz~qzj@$))PLx$9?VUc|4^SoRfG`a z{BnL{g`3`7{aM2HqjA`FR5-+RGl>>Bk3xqd^p+KzKia4Nmj5&B&GbdkPB?!%PfvGG zes=*55CpLeWWBk)xfB-_-Pj{6EF>npv1Lgftf;0$Nbnzx1UTt`)DLP!wAQ9A=u&25 zQwBNyFyio=lMUeGv`Fz0ecqgSDM4>3e0U@6M;aP-1>~7NvWY+HG4FiWMZ_cZX zkNGOpD6}+#DzoROVZX4U6(93*gY4h?&+2S~Gia1Z? z&mH;S3@SJ`oG-G^1?RM}UklmxME+fowBE=+DyNUgcp(}+kUumf%56b8{h zp(!|!k=Y3sh-@RjiT^LIhopDk*zdZLrwbyXfe>$m=^*l`jR6Q#K(>7m9cT&u+h#*V zzte^V95^jx8%=A6$YC~VBKe`(+!0$gb$TJ&K8WO|H;}hUkhlv%&=PXsr&q*R-=9DvAaZRkeZ0va>ekaq#PHdD$YZATu; zT@lfVw)f3;@SnQEAw6L09wkH{Y7Z9R{-B2Bgx0GMvPNqc?M-Mv+YMSKv<12%I?(z; z^HbQc%xY5zSsEg7Pej9J-EnO6C1)h=j+{NXA@a&d?g5A%N00)RM|%QlA6h>gNG(`x z*o*pS(`HzHYybGC^gr$SpZn*ZqWu4E5Nz%Z!GyrL{wEHG;y-cpxPyd{jU}=m-rV>T z2Zyddad0U369>nFKXLR}fP|2ZC9(jgUVq}?*4Cdm<)+}DIC$jsCk_t%f8yW~^`AH` zZX^7OqsKxdglsI41>NSxpE$Ub`4eY=_Jd26Kl{<+EfPXDmdFCUa_}b(j=_K8=rI}z zAsb6%0Z!rn#KF19pE!7Q_9xDcq(MT+#u8a@Y;J^Xu8=urpg5>+Z1+Eo5y1cw;p_cZlM{ z&(`Le@WXX$$mSdC@#ZH?<_^EMQ@pJd9CET^Ci!7Y9+^kIlzz*q<6s{_uK zp>_w7cktyJwU>4a?_f8(#~G;_{9|I-x5bFTHvsfHxY?9r?eEZ+pum`Q`9C8QdB*RF+n zkX*j}Q}uQa%>|n1k77Imjn7CF{nR7rR<8^esO(QV5qB<4kA4;3x@fGgI+4gt)1qRK zvd2ySvEHvl?x@^L9f4f+yT)1uRhmyQ|B@4o4Baa-I7>^z^q5TVh`YXT=81#Z8c_cd9?th)yBNp|9;e+%J!dI=FoCRwip~-@@LL>S^8F+tAP<<+t3i zS%LF`bW}t;n)V(p2o6~^En;gpE5%N#ByG*yX<-wfoHi1D$Jcn->vzJMyAh4N%p<3U z`yBMc5AD*HV!JEnc{G??qDT+^Vli;|);c=KR(jkK`+S4 z*L|8yvHLuJ?Oa=F^bq0sLVtlP%i(WnSf)$A{)pr8$W6l?SJWr+vuGts**%U6@$NEz zohrOT?(kebzt$D)M>~$V?mDPyzAjeq;L@Yx%&Q6EX%pe*3af6(UoNGz9GR2~XpxqE zZee_te$sA&mP!4E75-eux8_Xk0`BQ?|0E zR>?8P`QpB0P@A(=YUxa^%-cZe&Xp|84r19&&%wxz_I|KffK{#Xz08-ghi2 zWZlg%L`g(37Zg%U1Jaq9#*#f0SR13+y;|SX?x5K5n8rNn$u~FWBwo5R1v7L{;k?&RW>7@+swPKt2LkdcynKoOEPs?iP`UWhv^lEQm)vt{Ib0Jv@$jC72hFk z{kA(~Lo;Dj*1O5=%Pfyl=!}x^Sg|wQ)qdN&rY_ERF@5T0_iC_OUC7#XmUfmgxfy$npBkM3H|Qg}}2 zEN=F>HO*IC>Z;rJa21&wFJ11_iy5-X-wm$NuRi>F0B$T_@lIPfKjheT*{Dt|Gl%ln<@yRCZ zE1V}|zXt>yJo&|HMu5DpUFm4;EB^5tCn-)>x3+d>R6nTg-tptm<$|N`x`q>MslKBp zqjeti1sT?BcW90;+ji=%$glb)pCk9f3%F%9lW^IRO!1u6k~?6T*_?&P2lwbc(3LB3 zMk1;mHQl-^(HDrijzu&iCLT@ApMOOso*O{UensHGobF22H>EeiSsiCqiw?v^pXH=+ zE^norvk)$L+)p*XZ#>|%_l`^aoQpZ^hWA?Mrpp<*;_SVNXJ1C|G0O?_i{53X)5P0y zu_W%0cP_8ayo_KjuXf^<^yiCO*My{MGs!QTi`4crOmy0NKVrD`5Lpf^rR*_F-JQq$ zm2TfQ2A7g+3L1u`UTHBIIhLlCbi1N&#p7$j%;t9{i7*x|9E{1x%eHvBW7jRqh|e6J z31JzAv82bR=rGZ(*%c z#mN?aU61z$EWR~is#Pyboyhs0J&82S87t2?J;+Dw_s*rop7+7p)Pj?L-mryZ^$cBA zK{WG_`k~3d2gXfq;`bcf3-25bQx7Jt*Lw9{caOOB2z&hE*oCW?xK~!mEqYRkJ!+Yc zh;HAP|0ueAv6hc*fHwMjSXN@}M;}%96+5!Yq7N`P&dNGx84)hedhB&m4t3`HF+q|jDgVsy4^k4%O(#i|CH+IgZCHyu=jBN5 z?y2i&ird5baZG~5nU(d6<&E$~YH^9d=`jV8g9NSXEB>=9gDNP&v#CDG3GlPXJ0kG zrT)EQ#c}M!Ti@*_*cHf5a4Cz${WJ8FdUTov86uv##^~8>+fNujrpahBGA7XS2BV=`?=9|Iu=%598j|pou$c_sSLULg^%DXQCVQpz48H> zd;Rn>l>QVMj+gtAW4eBc`e)T7(^d`7<`bLz>gY5ki%XhQU8-MT6ES&|dyDsWx3OWG zbyYr%%S~7I?G2@YFV(qSTt#npuIL>;HK>>^vHYNmNjm6qq*nOV1e&y*CLf`1KhkusEo&0l6arl$FZF^5xFTF_XO8-^(ldG{MsZldDSj0mh zA9K>8qWDHv9Of zn(duPNBS%;m~ZUhSIx^2r4J{F+>Pt6pkBiCVUH%TxPL~!m8GSnHI9IKyDe=~$R6Yh zTmp9q+l|d=fyMnZ)DwHin*}LD`g>cBO{>4Xc{rBxt^I@h>7mc#-L5@~P|j*~m=9>p zWv*b4-Fx**xai&?5gfHU&T{VIn`d2v+*c2In-3TjoOBk;s5mASV-UC7Y^TCxSm%T` z8-t`7iH+PW=sj@d_pGzvCgO|{CS;^6t7`b|z1;1QbR*+B7st-P zTElx)fpp&zD44$16;dRd@JgAPn7*#md9CRxaKHJQl?mmSs2JwgCD)V;qG=RdQqAss z^I-Vy{BG!WL#0l?A1mkmbM9+P_1>$6P6BSe(hJQ?sgK)C`|F3R#y&}R)tJqjT>Wvm zTK0AH0rx}p;y$nRMoNwto9SgpTT3Lk?=HKxz5a{ftB9TIC;V0DS6;UGFSokE(=#pM#cmJ+GS6VX77lE$N18$LB97inkRPOgOca#;4 zSvV6kn3{IQ={~*mX@KIj=(($ub#59{B} z8{X%=t8=yPhtWv3lcIOz&4e0}Jzb>z9h8T=Y^?gDKN8tc^~Kxq?Tt@z>{*B?C(~4_ zYg3l0;E|x%QS_Xc?(EHFLaz{K%T|_-=9!Tfv?bSXto%x3H6nlO61*T68N0J4>?tRo z`O6y}cTP4O$-Yu==f<~?ueK+0x~{65$1iExPsMDC_RY$JS6RMwi_1a=&+jP41q^?y zbsYAwVB+)tplSU0jH>)aXMWnU3iH@^&jP4tl94O#$I@4?4GHU2-%|)ES&2$4UgGg~9iI8BJbt9Ua%1wf;a^ znL)8iMT2YWU&DUIsK?(q{Y}jyxBlYL)eGPHPZFjYr5bo0=nEKD<_-(JbE37Tf>8|Y}pzTrm-rLA?sw0p{-SFMz2dQuC7-e;>fA8E!@}RxzG&jY} z(>pGj?#5kq_e%GF@if{lsIQ*#gr&&Ip0xcExxvMeC2O&g0gi}2ZfT)(?$?Tme9=2wv@{Va-@HM z-#(u_ze>fu&7BiR`cg22#&VVQe8{01DHU2HX_ZzXZ$^d_lG|Quv?e9mDQDYe+O-!r zo*_L)JU27HhASd3WIFu9bM&!fUHqd_t&4|_6+CWP)|-BD?6oR~Zj_+p*~?cab!X=M zh-B{FI~04KFv!}DTVbR~Se7_AgW_nY2k+i7lg(mko?lpg z@nv~FS0S0`b}eJdH_w%|10NG|mz`8O67tLWvvZ>!3LJCZb(ury(&w2S9Nj{u7M`hM zBiD-(x?64i<}(vwpWWTn=ImOdikw!;;I$PBKiQg{* z14F5-tBNA#q}7slGMCiIk8`Jv?he@fhC}Xr+Hti9OlC~>cFLM#=5uQzy;|qWDjVa5 zWapwN*T|cVG?RC=ura+zCEq=Bn^L4yKGV=R;4-=BLj72?hI%o%YMN9lGS9-GlLebh z3TcO;%E_!BXlPH@{9;b^-Cg?sc9Il>MYP ziAqU=Sv2q4JQhFOdfbmwSwh{QBed<#*V}UvM6F&+oj*isR8F@i=H6OAP^xv0`vjlN zTwIddKtl3GUPjo;4ru(p0hDfLM~q3qzMo4oG~x+Unu zWKZ0`Nw7jMns8XKBH?Oaix52tr?9+ks>bopH8J$Bn{Hit{6&e6+=R7tpThp|%gx#E zc>HIUPt@PmmGhBF4=st=8C|sNn#{!Gn@72YyYJN9dnR9bl;~iMd`-6IwC@;8+fZ)%61%l{)}BlE%v_s+JUxusb;*&wuP~b$tYuCjmAFNy~0Wf z2aT^B(-T_^P0sE(RZ5U(^7u${_vF590#wB5Kb0B^Zr9&8;yichy&tg&!(`$<&l<6( zZPShIBV!s(HjzuZbf$*exKkcEI}|^8wtEhL_3^jYtD|Zy8sEmbThyOlJ#TtV>PBQSW4qIs?oM(+ zXO?=V1X^8Xa_=;)C$bcW4&=ppyuZ_Qy!=(>c!Ak&shwv6zvggmSI=NmP0AIeF0IsQ zthzpu;^%jS#^Q6s$eWSiM?ouVE1y30ywf`pm&_cu9^yJNF!P;%{kf0-!SLtP3a&Md zfoDQ4u`?M5O^+RX{^}>m*=f$gVo>NQbdQ!DbnIDMD^; zH@xEKdFfCS}Qxula(i24_Fa(vQ120OJ}jyUP{Hi59plQUmmKeYg0pc zMl$Sj{2Hxo+Z)!dZ>qT14yB%!gP%WWK688#dYUv%dwG8+(?Od9rk=iR_7fjG^&~1L zwOGk=zta@cE`AW<%4F6sU|+LJdHJo-`{L4VncaC~<5f$&)EAY!lu0}lLIT5X(M#jA zZ8`{S7)@pw=!i})-lnR~G%C5xc>L5hi36h%3N%jo+Ipf#2~AWr6e=RyEscFwNlbR> zL}jPjcLin%?xJo>1ChF>w)|9&q?9~O~;u$RV2Wvei*iXIprsX7fmdDnsKRxe1 z<#4%nw_3Mjw@0#-VL#6CgbvYVg5pCKX-q}@<@Y)IPweu)VyTiTbCZCcQvcWW>Yi*( zqxR>Io)IXT*ry38%Rv@j%dRnW}x`$8r=@Uf-P_jJp}IO))W3;m!Hp;VWsE zny1v`a^9<*8@M=Exq86cMzW#5l+2e2H(ZwxlFG(T)j#~$$tyPPmNd`TrR?F?PVsrO zy=(MYuZOKN)VQtn7vE@`x(pQs?+LS_lw4l(us?j1DNb|fVxt#5=~Tu1i1Q__p?50m ze&u`e$@~rYYW>A6FOzV8+>t!@P}+h0M+!A@_KL*K9`#oiJ-N~(-N>yl8`1MC)6kh z&&D?1r1<;Os{c^*9GnREb^Sl&KU>@W`bG%)&IF{0QH%#Xnl$DjuD};&1W_|H5&bFA3S;biJ*-eZ2JCb-g{E+#GNg z%4(W&vT7EZN=mwldKP-Ja%zeeI7Rf0B6)XPJ3T9F7dxD;79#77B=wZ{KwoP?0#@_r z?_E%@{9NA*=)0h3K+Qy-g=1U}g-Af3pQ7HvxE>0TfO53WVjQb^v|XZluvfsaceXGN zo-hBIUlik;y#tv`2}z3vjAQxXH}N0t0peJFVDgE8J3{j1Anp(Gb`Xz-_!x+%Kpbld z1rXnd8i0fco2x%|$^hO0aU;M7A$}V0X^2Mxz5?+yz_H&xpi$KS_W|Dt))?;vac+oD zfH?N;pPz7Ozeh|2)J0&z#cNkRVTZq)yYfN#Bvhw?_ivEOuH^4L3%5|ADaw4)&b z>rd$WC8QftTHWEjVOiviyE*cg#fd2B9IaBF9y-2xLfGT_-*Zob#D zb+pF%E2e(|yeI-*Vg92Z`^|&g7CmUbw`ezkGQ<~lZUSS76N5tALwp+OafWyYY8Vpy zH&=h`c?cW;UKRhtPl6Y1Vj=n6z@AGG$9}V%0dWt|K5`(AeZ#Z_;z8&jiiC>I)gODv zz>7uo5H|ts;R(c3(Z+>@7n`d;da!S|y@fc|e`g{736ysc;xZs#Z2ZIOod@Jg0m_Z> zK+vF=AdY=AXfMQFK>hMToD$T_5r}((dY6NEHPE9DaeMG07j}Ccvy&a@afRf+gM0%Z zz6N*%#Ib{W62wbEzbJ*cEvWY@h-3Y|2jUM=gOM-<@r_Q8@UIXj0G;?3#F+pm18d9= z*!aQ-ab95OUWkW*1cxE+4o=aILR@OYdgLugh^qtrIuJhs+M5}~$$-2g#1DgZ8w_!8 z&^{v|E(7W%4&o)CJtRSV1^7P&;+~+r-Glf9h*v?}71;j};@DixO%P87@y8Ia0sg^$ zyNcB#_N|J3NPZc}4?&z9_~9+Y)j&N?LR=Uea6Ur3AMmdbw*~dS3~^Zy{{``NFz#&w z$4RVQ4?sO)-!Q~@AMpPkNM0Qrti&MB2*v?fh_?g#)gjIU{ALVs0^lEeh|hw2&p;ge z7Wp}dV|K|Y1%za5gdLj{n~4{=#A&Wu4k1e6QwXPAB!(4MhxVqp9cu%8ZV*GOJy6Z{6oRW^v% z06(9CxGE@@HN+#p@z)XJ%AlRQL;N7HGYH~gz@b$T?*sAI5I+X;r3K}{%4-P5RUwEk zg9}1zjt5L0E2kqQZw36G3h}4F54RyM3)*c3#0f$BY=k&AUi3g*7sQ7l&IHQ!0pd2G z-F}C70~r4aLI1^evR;#r`bX+xYGl*=6AZJ=E_LtGcg z`$OCols5w6*j#6qA+86;(=3QDfqq>KaXipJ2yqQi?-LLQ?!nDN{0ta>enR{u@INWg zht-P%C@%xV=Rm*afH?LIbUuhHfqIvKxCzKt0pcw{zZS$tfFH~to(S4W7{ueiaW)>} z9H76~L0kv)uW^Xm0{iD6ehQ4Ml&HgyfcZ@j=n;o_3#eZeh&O_`KE$!|T0tB;e{h9( z4;bG9Anpf_QxOn11aa)!wrCU`;)OuJ&4uLkK>N85aUJ0QW{BH?QHWmw{@Dra!pd6+^vgk91jt)M`~m2vNf74*_jB$;d>*v_R}jAl%DV^jKg^yL zkS{01hk%_t5FZ6`0f=`4d2xty0{yZO=K%HS3~^6Tt~iJf13y za2F(>5B%~G;@iRaLjuMXOwTwN$D|-m4ca+2M<6C|0rcL4&8dmydku_Vq~N>;<2}G{JP>aM{?~(e1h6L%;#8phR6_g}sNc5`e**N-0Ka1P z&;mQfARY?rF@U%zXwQ)lX9f1$hxmOkzKuhC7>u7RART5;46s`d;#Hs>T0#63(C-Fu z>^uOwzQOdT0Xt$K`D?(QYY-;__4^#+lVF@=1a@KiEkT?G;^v^;?1eZs_Z>IHvAJeM zAua;+xI;V_^e^n&hL}BAyR3uccYtwh6ynW5KN&cFVtOh;`2`^!4E$*babeI;^C12m z^vAmpKMmSj8N_t~e*p0_pq;luyb6pb-yyC7+6ne8KCE2RfMefA!?+k|hiagnF@6Tf z8$q@4}tg)Xm8aJj|YDH1o3Q8kB5LiFguCCI3o!0eLz1pcRMEU z5A2kOA-)dA+f|5%f_zy(I;_0Wp#O41JP!Cv4C0S~ zpXDI_473wXh>L)JdJ5t$pr1NHd^_kzz7SUe<0Ll6Ic9$YINwTyOmF27b5$ zaZb>`sv(X&hr^DOSibx~t`Cww0NMlg4Jb@r6!>QqlJ5fcZwLJblg|g79^yAadJc&5 z06$~*xiLK^pr1-Y^810Gl_7ox$Ya+5n4Wad|E(Z-4O9RLZV<=x20>g8wDV|)&tb!6>!gm@Gv*L#R#-)NqPcsZ!AUl4Z#9J>#J z`O^*fpBeZY_;%7m*R3YvQ{A>hqP0-)%Aif>+cTb4x0*>X6 z*{=hR*9nmPZJ<8`;-^5l?m*lU_y@c0!SvUHdT)p1sX)12K-?Qmh=g|#-wnoxd5Bko z@$fgq4*@-tU;+co9$Vmt-4K5a%Eb+FXVCt|A^rsTM-k#Vpgn0roCnx%4sj=7zca*- z1HT189Q$@gF2whO@%bLauLHk~LRn@i;JEtwWp?>n~tp2+Ysq!2gU8 zF9d$(fH*d{IWNSq_8|`O4?w>x#IFGTY7l>doqs}{6!^^=;yHl3Lc9%de~4#+<54)o zZ-RPEfcOjGw^WE90sI!ky+J#<2k{Y5kF^l52jy*pI3qZ&J%ji#I1hde@jT$?DTx0D z$Cs}V$DUvQgm?SDf#Pq}if5t)b5up7fLp%YLHwWTg zV0)Nn8!4s7A5y!D1O^39_y9F<=L z^**tMqw=qS{0!izTGUP@z_)FgZwFM##vX<(9F;c$^7{bC+QT~V^MQZi{1CqkoFx1& z9BX!{e$W*+at6cVKi-S`4eY|o1)?|(uz_X=vfL#9`*ZXDUrfupIpyxZ&dB@!z#P0- zy#se*uUBDF9D2Awhgg|EWOGA;YjbT0I6C~Jbp)E}|2PM43P=a9P#s$X9}+=zf??y& zuK(5aLP!d@?Vw7q^g7`9fhor9$Kuk+2AUquf8*s-glqj*zvb@-(hF=!i*CZ{{So%J z@*8PxCKTLUZOng)x)Lsb62ktLKXx6~3({jNIRA^tj=$v}4f4nQjQSrPYT^8EAPm(h zi0weO(cq0HKmzvMZZr0u@?&-sAUihFV*+5Evv+d?oDTlki>1TXWyl_E`;QQ^Q3uj* zW#~36+YT7iO>m7MJ?4K*4^&KC6SCuP{>%Q0|Ij9hrN{h=o`(OU?;`90NdFAk-Wp*0 z(Ku{7DnAeG$KF#%Z;PPEFgSno82z{Wr#X=wNKoBe{aM2K+xa3Bwg2zTVJjpiBF=$^ z|MfX+$Iw9n1euMs3^Ic)9ZptHUnS;=u1d^LwU{=Qm}mHyZ}{*z8GPKvxduL7jY|R_ zw+$bo#>G*CI%!=?3m?(wk3yB0X?&a>mxNl(_*B}0IJ0L~vn@H7g8NKp{kL16p^)WSb= z03-QGZ03X3E*8aE@G-M$F`w09J_t2Vqr5&OIR&Q{v%C>O9PjfI%tovh zvxel3kCPF^$26^@GZQ!Z*CLikpk~XO$(qYrw9v5Q5FhZ##*jceu$IZjf#&g_o{rAo z7~p-ajd9(6>e2GKCqYkCzm@OcI7Z9Gbx79t1)YLmXYz%^d~7+EvZoq}iL{yQ^kw!j zJu{I#W+HQ(q=+I`mZF&Wl$Og2rfZ7DH><4k_zUv9zTA*nVB&%XIw+Uk!~d6W;+%1z87<;J`2)sMc=QwtHsk7tPO`9xH5 zyWhI<{lheVKlxoJ3uk@{4xbS_-5f}9u(;I2GnnGugD1_r4~_f>7%1{znM$ztt0C36Xm9M%hXje@5))|h{=N;d2`Pr6LZ%wRT6*tnzlR|uOw z!OC#9Rr_{5O)9Au!B9qVYNGr&_PSlNa; zGOewXJnvGp%9F@`w8NZNGNRGf&umKHktA0PZ%M#L_bivlo15VH^VT!9;_P~l6-Rd{ zS854Pm*1`Hc({*{M6O9u_fdyz>rrAcdj92oQCfH=%H1b=;#iq-r=+65W~JiC?{*H5#`ez`}6SLux}MHa4|e@@*iMJJw3n}TC+)S&x) zgPTg8(zWHl;6gJiUpv`Nx6wOu5+@EFxDf1;5#LmN(>*2r#9sT{ud6O+uZU5L(><&l zP{_5eB)Od>n#HV{J>~my#6j%LvzSGPGdSa@RN@vnzQGW(L48r(hZ!@k6f}sgl5;8* z?&00loPLv@u2v+c-9*u}l$>f&UZ^)=!q8gyjv3YI$38vQTALF$nzISTbbj=#Dz(jJA^veXy%5J<8v?EjH!_+RVqA{u>0-< zUeo@E*7{Vz$)^&+he`Z?NIz6Qa`!-`SK|?{??QtFOjMuMg7a!EEb55|=4JM%kyXAu8)AXBv^fj=UI$EqP7u4*p6ZjQWhRoWyZt9YA zZswjYMU|FjbD+;druL*#S=p2;D*iHJ)5%WW--(Oa$>yI?s2K@3CN}O{!oOr6v5P{zL4!n&Zuz_J+koGmv;O*?nv5 zee-EZHj^ghbLSXSqkW@0vD&J9DXw(a&j`VDtL;lSO9m-Q)fk6#fBDz_3ymyWsj=J=CNoAy7Fu69HPH^8Ki+t7tx|zGF^+%UDr9ViA-uhI_ zcYX({pg^Gp^P|uU)kB?6c0Qcl-rY0um`K!d-?Z-inS0z%*DQt#8_3JK!kq7vH_EK@ zy`Smh`%FF9B-$kSN?mqJ)V|m5wo~xDxQoS;PwC}zGGA?XP37tq{dg<&z)N7Zfqad2 zvWbtr#OduXq5JIpc3-RWEBD0M%A4}NUiqBTc;0T-m-HHJzlaEJ|)lR zZj{U%V`Tgh)Y?;1hhHWy+CQ$yFirT?qIptv=+3$@`D*)XUczqrQGxUEnZYfYSsKe1 ztvT&3J>9!te>X^`E>g_B{Ik&AAU?%Us$612QE|aWl^s83qT<#=S9)tD4%JSC`rbSC z{v90^UAD#>7DvNqHA8-b`2hJ9qS6Ctj6t%zT<^DNSRbO%Yt0k@56yQ1r+|a$vlg@tZ2{i7Q%B zaze=TjdRHKjlJ@Qaf1Vr9uW~i8tvgENuon{)DtzW)H(0&!5fBK(rM)%y)+nFt8+fq z#G=%|jo>Nyp~0{tZB*qqInL2t%wySKK$pq+gDGSnj{M?)3h`OD@#gLHJYPJ6%j&3C zD^eP6bGZ7w_IaFNd=|Hwp3<-obynVt*FtvIB4y1`1)IpMK0a(9_6B@{JGZn za@W0DT@+M4TH~5?%U4xrg^rS6=Fi#=f->^S3u%R`mvJPxs-YZts2Y)##hJW7UhuYcW3 z*Q=X&>YRd{1##585FNi(qSCoHbP?yt%lB(0ipt2IX4vVJ9oBmAF}{ktFU^{BfT!cs zWu@JBl1~?Q;}>T&P40;HaqHh+wx{8YH=wW7v%4ik?ly9oGhW}L@a0aYx-g2$QGA1r zhjD^P9~Ux%qb;Ypfybiy`~G>)s)i1?{(#v#bmq1T`kjj&al5C@pZ+esV?pM!CbS}F z7JkoWF#2ou!I$AXtfdRa78vW(L@36+1@=gG$7SB9a&q=I4*abpFw7*q_u9*uWZ!u^ zvYF>gW0}azjeA)6{7RdVxf_r5H&w9COAQpH z&BMxeP$yjAylQ!zHM^J~*7W#-U)Cz)vai5moj57;Som9;Gvg{PM~mHNsWOdP_f_$0 zFkiQ%c4*6+47XkKcuCobGV>0^7Q4|#@j9hg_iClrPqCO?hv?|&S=DRF5P5{)virE!c}$C zq2_UtDR1vf);*QZ_)0m>XIgjT<-O$fPnY`KyyB)q^?E8zoThE!Ht%mV4Lm>I{6nCj#}NBnEKUyGZNM(Kkm)G3yU^(iTBE-{Wn;CnSF6RS&**bnYk>^(BEvdC#5jPX^=%N zq?gsCL5PURhG@#TVY-v>&2}1sfe)M>mMYFUF*D{9Rhr!q3fCBa3d-BD?>ySMS18SA z+}v+u@?z&_otyjfyLTQ*Calo>qMAEMVt$Y4Qaaf+kCq*bh0axX_@%z`R0Y29=6!WM zq0YGEiv10fG<-5^U*DH14GY~dQ3Ao9Rgt^>1HGOvV|5z?W|)22<1QY*p2vJt)bzQe z50&B}_xa49ZnIOolj%}F`CoN@c;Yi!`%NM4Tb9K72wmHEqxFmLoK>f}-m<(ryoX?< zGKlwMTJWg_SKf=q{dzgOe~}9>MV(QdmkSQW3+rR<>IV-wu(*Fl{FSnkEm{nbUk>x+ zF(}OMICX;|XN*^ZYepR}THPW{R66sv)u9A zHxy!D_#_@^q%y6D->1&KM@N$7P~WX^QR0%JL$6{*^Sou8j%wXnP(%$3IuPQM1H_?+K)JWIcHb}*Qe=J#2lXj_{s=__CSe;g(`mRyB8Vn8IaY9f15Rq$PXeTWR4&6 zE!_4};QsaS;rDGs+!f@m20yYQhd;D2a97+OE?QzIt>P6RsI%oId0B1b5$8uo#E+== zop?%beo^zdq?6Up;>u>(hOuSGUi6myW+TOJc5U1bz)}D0KG~KV1y-O={!=w^cDBfz zo+}-Vjg1{E>6e)C!opz^GPf*DPTk77l6osEGo#4D%8JR|{-$YSQTmlsLzA5JOv5|w zw;gUd6lA4d&(KY~+?kz!FQ4R{%(doKO3FgJ!hrpOGTXPwpHVq!Zyv+{OyLn_;{HOX zRF%{K9vN!-lq;9hw%dxx57`lWXvk`xC(F2Elt|`q@WY3up|1g{srcb5C;P{bWuM@1 zA>BqPk-9TG#5nRRp_ifwt;oU0Y5vq7E>tCT?_v$?rVH$nOu6gwt~^!rLb0p5M8-`v z#onyokkFV2q07c0Es-^`Es-|#Ue~VEi##PuFzX(XIeu*i>)JuiqvB^et_y$N7EX`z ztUU48JeJELakKOG3reMivV;fB{eR3g>jz~Md#S!`T!^jG?jjcOS05Wlc-8HCzmmuK zKz`*hfy&|+PjUsnM}KLF{UjLJDUz}}{&2)Jz1}QE(_%oebvX9A{@w=PaIT0QV^=Ic zxs@9omaIz7l&6z59nYLeN-8KYnDf&wjgGzYQ_$zP`a-bq!SkKx2Fqf`1(vqItb_qi?Sx6;BeRHf*7r;{JCo0S=%>EFOT^^zd~=#r)PvcFBz;HBd|Zrp`YTFi%321Z z>p72)tomkAl;^rCE{mxWxev|%x-*+;CVfgNf|yhNonJsWYXRlDnBn}$&{5em606yg zEIeUX=&GsG3&LM_W{5eLVi=$Hy5kvE^Bq2=s|%P}h^#0s>zl>I`g~bn`)a_&+%dls z|JtiaLUV5L3?ZEte@SjU*^}yos%BE_(dJ_pS+A7jnSLhV8e)U2ws0IB8yu)5rt-8sSWOR*6 zE(tIyC|p?Xqq{eJ@a9_wb^XTK_E+J*>l|GD@j_V|+vY<{KN;zM^X)g>A7egr*_X0f zwCGF=k(`@>kIL?#ONXRyA9yE7wYRBNUv=?^iQe_JN2cX!x+C&UH-`8wXnDGA3p#E< zYP4|U&M9ktse(ck6*pl&F_%MOYcqOu1nUz?2G%{Vi4GAh9ZISw8D5}pO&u2c%!iW} zTxoyNQNH3E{K%L&M>XTsNi`A8@~N6}f%ve*pWCzPD9dmu_gV%GpM}n~YQ7pY)|QQV zQ@zLC)qMHG)Gv(ZW{xLsrg>o|h?3Ts1aiBb;I()5tJ@X&X;+^P!}z4T#i zuGwLZX1}cVuU@=TTsuX~*nN7m9nU+wI%%6kUK^Wf|Fo1@(oklC%3^Q2JAD-=HX`(KcGo9POB0d`9~{urJ8OHS=6*hx&sp`daxH5TWgYML zKUKxW-u4eqe!MO7(z!yFqLWKcdf%wN1ee>?5og6#-iz#I)drN649~Xr?bE09)E*bC zcye&;$<36xgcl`Fuc*G88Pb$({Z5zF4ZLXkMHAhSPqgy;po#~g#cKzvSQh~Dv+tf4O27fm}}*Jbv6 zyZ_mq_f^4llCt2HObYrmWk2Fuvnt1^bx#(rYMK9dL}W@d&crkwZ1KvInZCd|*+8to z$e1hN{HoU5==iJm3KO5K3mw@;mnd~+dGTW@t*VUma<<8hoRq^WOj$?fS#iz__1aP@ zobEbtA-&i5@O6_?=SgGl5h*h@yuLbjO+x*sHlOQpHO9#Qcjw(F{B2~QPSz$pa?ZMPe@DcFz)F)7qP4Ha)Nt`E zqIJRySInAz*o)CUt6j2xXrOqk^YJ%V{|r5c!5ZHNPWo}YiY&`6Jngo_LcI6CToSAu z{mLbvq-678;K}!0etF~nAA4^CPSy7|ejoFYkdOwEBub%CC^JVP^H5|KC4^9^WXP0A zqe@A$Qif8gB#Kn>tyE~%h(@7=ylb6vuiC%$t>^zd*Y&>d|9!9Pzpl&Kdwur3*Sgoe z?zQ&b$3FLpPaPhVdHBv0r5i_Vs|-fgjngX7=@I;RZP}c>A?~6Rh1_4#YsF?2bDGrf3Ze)>Q&F{w=doi*(#;Gz_mX~Nk?F$=W*i|{I*8t@>{Y)4@_Ab zJ#L)O(WJ&Op7qEVgznoNlWKA-csF=myOE>Ji1$)2-T!%c>Ui@;eRavmgHcJxuk=~S z&D4CFl74N8%a5eI>RGcqr5Z+@C=PNJT7Lf4h$*$n`)u>?{LJJa@_b z$E_b}ohOS=`fN~narWvyb=|732EB)7?459BZ2a-$Tf2BCm4sQ3%X+x5en-=)f)Rx$ zT6NvFsXTkV`^(wphb@&q65h_DGXKL4hi`Sfzf~pER8;Wc zM4&~|g9)*2j-LXxCOrC(vajjG&x~{KU-I;gi_0E~C$Ks~AC(xdSRM33pl?x3Z%5b7Z;#5F zcWb`iqg{8vX0ox5_shzlFUfhW%S{V*icL8vZM{mwLqS0Kqe`LPrFlyw(rq=Ku3wvJ zSJxL-Q8RbXt(5E)2_qNi&oqqmdG_RqUd;J{u&D5Xu8%L;GeSHZ8k_sc)K@ z_W7s(os^EnJohGx4~u!Lxc_{#n)T_#iF^3vawP}78yhHOe0;afH}le1Gm#HDvB$)P zV#OD2t-rR$IP)a`@6SsYOrXZl%9hxYH3V9yood=h)@8;$PBxdqx&NY%`Ec2nv;u znIJtvT$R02Qb#weBz4~Ow%v9XiHG~Pq_Th96yU9&n=zwi?Ypb#(bk(ziaBl3<9)Tn zb#IPIo%gu;gU5L9?V7ecFZzK3q)N+=eCRgNA8Mx15{B>R>4X3aw|P&muR@!O9=X%4r}bqJbsv`bJQ^&3xiGhb4JwZI*Bct*R;TD!5j4j z7CFwXHLNJLfs8XT|BSJG`HuZ+xmoPj8f((l=ra1$uGu#eN4&n$ZJd@-tkGVs z)-XIJY}57>^{2lvRv)gi^uGD?Yed4*gQ=i&C53*NWa%$YpfgnV#@3#BNmi> zyVNQ@)iqquCykFkv;E1ms<{gnzfS)2;jwm|%ErQzy&tEIeUq`trP^!%;aMQV;-;5OJTP|LQ2tyYB2Q zlRdR7uJX!{OkZi|u#m?uZvT(>&nFFj=rs4IQ0{@peE&t9Pa%WdE@5m$`ow-NW`wH6guG^`SrGprVuG`b}&Y(5AbGG+jD8ZO5dpN~>I z{`g&vAuh*6JeG&|C@RQ=ah}B>PjN+a24JD}Az7>w_QPQ z!cQju`(mLo-xmC>A>XezE`Bq-$H!R_{686&!waj_AwCwoDEluiK@o12?_Y1q5su&D z`Ok#k0b#~A<@gk0D(DZtGeRdl1pdVJ5y$1k!U-IoLi={WNlZMBk07=L{r#z&u)lB? z_hl0wmSv!~ahRW1gr7}VNJNNFNRV|%M4=DZh=x1#Xp2=Bn*GI1jO2^bw-QTxT$zzZYr z(+|$OQq1p6)VRfPf#M`aEHefqZnGYAavLQd3ij`!cr1BQ8`?+g)&ug) z7?AkbUFaBQ3`orDp&!Rk<&=W`nK2--{1EUHW(-KoM}U2pF(5HN22=8Us(kXB9&d{8 zg>ex~aT23+6~*&Gp2XzEb>hFN;3tPD`R{N+&!_l8=*LQm4+p;`v3g1QPGYDMl-^MC z1U5bPX5m2(sPa}~v}L4#u{J`enA1I4Yu{^=CI4}N=);tKF0Wj@7u zU|bhc{0YoIr4(;~{6&gOLc1y{E)90OPH}6HzfJKBumh=w^lv}h8Z=Y#YhZjmr??8- zlDwh#3h4Lu6ki7U4vM>D1yK4S+LJSiW|UqWX6ERI-P>@!zg*8=UR%Bm}99F9}50ZSM!nBRE79>mThHl7g0h2gqJexpm|gTT*+Qu585UPtpc#ciNnDin_aJxT08 zQvPTtXFnyc1@qlWipRmcae?AhxImPyQ~WB(->0|$w2SCi7jDc%WwZ%gqQXqPj^`Qbk_?i5c4|MaDJIg}qt@m}zse2S~Vc>IUrg>c;$fa9cH zo!~zz6pw-V$ClzHP_8@0&w(8`Q5^ou$J$NtcDNoLrFaI+^Jgd?3VvTn@qEbFQ@jG& z^_b$-WIR&b9_IgV6gLBZQ-b~{cDo7sm{7b6&L_XEA@ar`7e~nlgFh5g+>z_%tQ!eHm`%I#E5%}ROiU&dYrW9WZ<=9dD4fshE z#r44c%ovbZSACfGiYWOvp#KAke}Q_LF(7d{$uRHn;0#K{4p*U^i4=DRK8NC?LI1fF zC+&5jIJtlDrnoZrc`(I)fIqLI_!-EP*d;iN|02L2$ZzHee+d3_9L^*BDCmEd;%zWr zU8VST(32Sh5{uNqb+DI`*M)L^#d-ie(T0;`pniNB{+k7QDp7nUT#qy70_AVx)XHL!ShS?x`QW!Fsd6Sm{vO5UpuL0Px=PBq4&~3J_&KnHGsO*Ie%?Uw zLeT#>#Yyb_TNED-@={-on1`7$ATj>|c6m;fQwZ~LAH|hnyl6tZaT)l}5Bz)q z#T()L9TcAk?LA2G88A;4QG7YbU#2*T@pY5pZQ$qR`Hbjk19lq?^CjUVCX)rlA49uB zD838k$zv3E1OI8DxFWQRAM8r%^#?sCP@Ese^*oCE!F;}&;>SRr;}q|K{(3-hEohe{ zoJaH_G07|_ZUNtmI#Ha&3i6>iiER){@tKe(_f4c;@;s1A$)|ult0}$`#*rwD4^qwt z$V*aO0{TOi;&Cuf$x~b(`b&-CufWfIDgG43R|dtCpxz>iCxRc|qd18v@{{6*kRJ#A zK-x=Ud|FaG1@zxV@f^@Um*O8_d>y9v8Msd>pm;af|2)NoVZ66ed?WawDBKqi{U<{C z()lQ0=!8os?IJvHWr1(|vtKpy*>6cdMM{A0U!@RVT z;(}oReH6a}b~{1wDR4h|p5m(DH`Np;{eF+)Z=t`QQ``ys|0Bgoj6+E{kF>W6#;-iZ zCE@%D6kiN>o=NeQ&|VXY?*e<;QoIWEBz{Nqaf9pfQc6Atp8KLHE(7w36es^O&7$}_ zu>U@aleL~sP~3s^7sX2;UqkVkXdK{lkK##ShmRB=1N!$;ydUOgVemU*pK*|vq4+)M z7bS`}!F;Ph@zqeT9>qU{yamNIVEi~y`~+4EB_E34fP5&$U%Y^HcRnLjCh80=F(aS7;`3lwL={7_5ryCDCN;_h($eNFKW@Sm>~Plj@M;JQcb zAP(bBg5o5WhCI!||0hzMTyJzJPGWwVQJk!OXHW5ipuZ=@vtYcC@A-)S&JVn0tWToGCqD0cXa5#PY&$ zU&o9AiFpffW(-Kozd=7TV?bg)0mch61|;U`&@N^SNX$=xpD<%UVjc+o$&3Ms`9f$f zGX^B)0bpll3`op_;eL@B0}^vS(1#fV67wvWf0!{KF(+%TGGjnu-i<#{V#a{P=mN|$ z%ovcE^T2p!#(>0pF!(1k1|;S)K%N-`67yE@2WAXN%-_O%!i)il`8MFp7?7Ahh53pZ z0}}H`(2vX*keFWve_+Od#M}t37t9!tn2!N_GGjnu-VFZ3i~)%`iNVi|0g1Uh%x}yX zkeExt{pwjpEJn=t!u6UN0}^vvsFxW767%u+10`k*NQ@l8ub43)G0%Z<)J4^M5bhtC zF(9#gHQ0d}0}}Hh@Iz({NX*F^7vni`fw*%F=20+Sm@yzR4}kt+#(>1!7Os!X7?7B2 zf!(a3eC$rxWaND}KdN5x{dfq2gDar3(D%3uj?0H?S!)>_%dfz~D5X=pjf+`X435h= z34XhW!Erer;Q#v>9Lp~Pew@Lvd;{=82FLRDz{?mM%ai-PItIt`zV|lVxW)y=n?XaG~u{`;na|458`FSwzwo<$X=C?eG&&DUAR0y2dt(=Qlk15^^ zyo=)eU{7fUt^g^A#P&7>j;q6ef-sNGqvWA@mNzAT8pd4^gJV0?!#G{e;JAEQxbClJ za4c^E{Ts{RSf0d&Pi1f{zXs$p7#zzdp+B6m863;kg8W_v$MX5m-lGhT_Sf2Rd4dBH7Q_(S;dMR$n#VjdB?hY;k|E0q`Ao~{%(=kVuOu@JW zxNQ9Ez0jZdAWB3ZZjQxLgdIF~;S$0j0Thpgd?Cfj{K@*C$4vDL@|w&Iei|6;AHsrt zFK_QKzetk%|8iJVjwKY)C$=f+4-P~h2Czf_pqca!k;AvE*i{V(fbCHw?oKA;@#PEG z18(uZjE!o|>`W*FZ*UpRq>eJUOc=hu4*hq}pMlQclt~nW63F>v?JZI;UB4DO@Tc}` zkL8}>If1*y?ZfZYlq6zs+CHe-9nClv0?=vOLN8qypHI z_c1gnPM^OJ9sg7NcUo~zBzM3<3zsK_kjC7F8ytPqDLA!z&W1?z*Yd}NqC(5b(EY(wp-!+UjneB z21Mb0O7#gBLN*u$r&TH{X^ ztAxAx^+~DoN8Pcowj%cw@_h(?EX0>Sx_<0af2v;-<{xtZ$}R18|B?LS6@k8t(4vZ( zioX+gpZhsu+BD9ADbr_6N%nlxbfPnJ+f;0Uzh&&=O> zZV=2a90apZ>k&JB5~Z)QAe<)^8|LYARtWan?$Zoz8juLHnlshG|wP zkmg$y4^$fqh@%}%yfYZ>sNx+lw4;c32B94}yd#QsB=L?2+7ZS(!YTa95SjCL?NwMm zMjBsSV?N>P-65NtS-G`=VY(_*ejJrort)K{{5X~-OPdwVn#96;)BdnG1u=XKZ@E%T zLXP}x%VL?MbJ0B$%byj9wvj9^Rv0Us6@g}@FqR)8zN}EhB3J=vKM=)%_F^sO@Ca02 z1R}wRbN55glNO!}z0oh-mZBqgUh_rU@LxH9w2yxW7lKOhMSCWwq)3(pN75Ya2cvlR zf#|p&V!=owTmm8Xtd;2O-+Tp<2xR#n8DEY*mgsXaD%S_e86g_N(Ip(wFeK-NO66)4 z2~t6bg>&=?Mlx7$TpqSTC~BD>YK70QeIHIde<#kF#;7E6rUSa7m`9 z&M?-$IaeOHfhlc+YBEGDoKw3KDnSeN3GNj~M3B)PQ-NVKtd=}?tXC@`P z@ba2n$s8uxus4fWkbj(@&y^nrE0g0!NLx6Z7?SZ|N$Zy(siM-Uvhku_t}=rJ^8>az z#W*eqYJIF5zBqDv>5)AzU-kNzul{ta@9VjeMGx;Sj}hG4^;%d89&)z{1!h?{uw?)1d)+|HJ1#v|`!EMB_d$;P#A3#Yb>R$a4v`rbEC2HC=H%Z7vvR88mb}ox&yznsJ~8Z8%!ySuB34eX$ds6KD#WVf{c^c{$J)YIUegT@T`pKZ zvcFpSOVuj%H7-Aj#5`NQTfMRq{HAO-R5y0nP-J;$h(eS4SV7U4`ddS%CDpfl6W#vs z_KKML52wGD_Dco7@iou6YMU5UsaPWOQ~r6(htW z_|Tn)Dw{Hw|MVXJc}`1!Ss&sIwbhAdx~!iIUogvRu@qagwJX#2w9-1SWm#KQ zJ9uaC33)62u-28RM%TX~`#o4EdA`RbJ zeeb&wHuF*X_SLl=xkXnkob!h@X*tM`m$6KlUT=Nh9;Jqkt7bdD|k=hmy4K_a^*@s->weq*g!)sp*9Vob!=Q{)a8n^!RazXuEyDb+QmPuXS{w>t3^|4@$ zyN0#@-B)E%BB2Kk|MNug`9Jpd?}DYD8(8gsr0(?QpYn)LS7gs}OO);`4^hQae;1U$khkd-5! z>htpi%9m8UT@zWsuj@5b{!{q5_Hz%`7L9Wa;XS3>D=EKbZq=;8RacBo$*!~cloS-g z8acFKVZ}txPb&A;eirnO*9p347$p1nsE$F%j9JMSG>-D!61QU+6u*vbwH)*HfNZz@ z%%c_)mQ`6TWY=ct2JlVzI4-1~f8Fz3r;Zo(2VxXzB?P)&jQp1KSWDr+yAb8MgYQf! z7ETkq@5NrT_4Ue2#x}N+celSZ7Li|hFVeT!!NDo3c!tTt%q9EEg&&PPdPzJ!w{0!!e{rFx zf6kJSLAz5##|Onk%{w46a5{1IQ={H*6{F31EL^%ffX6Rvt~1npsmbet(^GarSN_C7+|)JT%Pw#;Prpy7V%tNX^IT`s*MM(I@OU zFWHmH5-IbC=uh-j2?^&Ddpu#3ueoN6x%3xlldEy2pW~f9i!au@94vC-Us7gz+SJfw zVSwR`k?Z5Ml#lXWNmZ0temACj=+@g~TZ@zDM6@^_3X;ixkkuA=Aa35&()hy*6@I>H zjym2r`E(zj>*!6Ho97NI==AOunTz6~j+=Yew)#w+$K!44<5Oo@IJBF~ttqZmf1=_P zmtT8u*Jvy0Am1~pN5@{7Aa(VUL`&tIiU$YEvpW}BxyYT}m1fjFVB5XA;WGP&_<@;; z+k<^-Y<~z?gxgu%Hw;{{XWYr@e&>_A<_p}sa;&){&Sc(5wTX|O)I2zNS7}X(SAmko zSleOAy`qynwiT51Za&x^AS8Fr`TL3oshbt{U)NAJGiyFsT(iUGe05`a&CiX~&1<{2 z7R{DfTzxn9y{5#lZ^9!pyQ|RF_|0M4Wa}B?1>+C3N`4)ey#9RKQ_B*m{f45C)W%0% z_I;S!8aCz9_&Yb|ggv%@@3nP~_1zDFt7g3l5O}MR=dG_MeyDYSmQqSoUdvRw=%NIx z#D{yc4tI3QvBQ0{-F)-Lo_UdjQ=^*Wav4X49;?{_4x^l7IYR>k3W|#Ec+wYA_{!kPrqNgv< z-*2HgB}ZlA#D|k!&bu49V*blzk;is?J$K)Iy|Vk}xynruYnOjMBB5F?Yg}-|Cc{uw z{eAe9mf7p`##IN2KZ~FK!8cOuYX zr1ayuBL)lEC!TuiH~je-9plx@uIGji8aCrx^6DKIW`1qAy`0s#d#Y6AS=XqD=8k8% z<>{Thmrp&sEBkZu+-KukYfSn2N?)YlqTDPp%t2_r<=FHmbRxvNTJvC+4w6cTWlh&GCl%8=QO_VL$ z^=`_wNrqF))OkKh&Mph$IVCo`ELiF0rpe|Ne1;j5Jq)Z*nm?SkHKFd^szK~kUGIJf zU*Cp4McGm4GsWF&YMGIi;pCRrsbaE)=O3s}F{!v6Xy$aT{)4nzf)L?W#=Hwt&c@*pX))O6Kvq<-gu_U-X>8(rFhQD*R?G zEYabKYKf_PGw9rpw$^EGisF9R%gWr;>-L*Q9!S10I#{Z3cUOCp`+(F0HPn3pkNSw;kGBCNvY;@}E70dd+xJkJM zdc`Nsdr`9~CLt<0Z#0T+ydyYB%vm<8H*{O#{j+zaMCYF}O_M(zS~XRDkBHEzxapzq zyLqpNt{nGbRpPq*FdOG>iSCZ#AM?Z5-hPTVQtx(j&hfhT-M~3o&Y@~=&yDpS4ZhC? zb#x9yww+p&vpHwjr{go79<0e6>d_=L@uAf0yn$jX4~s|T!Vl#emY9aL|8rX5Zr9F0 zT}j6QzMC_8p0Q@+c#OYb+BImE&h7U6MKQI9B|Pt+XdEv0OjP#ajpEAg`sIRNJ2%`b zt^Trm(e`f#gD17J-@SG;8B}|;XmLzH&ynWkf(IhUSe*N!n~-l*5TyEItAg$TPl1FA ziHX1phi^;C15xyzWwtl1d9_e{;r($=qQ(M;<0Q83(AZe3zEMi+{hP&o!jWa+UVZML za>R4SEWda9ZPOz=OM9Ocz8h2y2OpTqS~4`CzgkkVYe@F6{`{$f8U|eyIXWX`J>R?q zgRCrPE->u9<+eq&Bu-(|<|cEqP5zm3b!Gm?bWetx`A4Z02prjn0t_qJA3l4?_I*yS zb6m}}!P`QgjIPTGIWs{+S48c6nRCR%XHP-|N=6A?(>_0KvwG9HX}8WqP88as!rCx( zk=e?!X4l&jmWyi7ugZNIt>s_uH^OAJ{EnXK*5&yRL_#keJoELR$F&NV#$Vpu=Red@ zr{~$>)~Cz6&yP!ORa>{I=izpndF3-lo%?*XzIx?H|MC36$KA7^EWL2NF}8Qy&+{^$ z6~EtDBd4!i_?Ykewl6{#Un0o4zzhjP3=Gp;0hds+IvmL0uQAH$y@~5omiQRI>ZdP<_?e02Omue6uP}MN;CQ4=$V)$m zwxb5^&8lauuZ4|yD_SslkA>j`HQm;XRYKS0M_9<@28%VTyYpOgMrd4+n%%yo>*AT@buUwHUb=H2V_jC?ccIVAoYF)1_(%PaobTz~y({_o z^ouNo&o!apL+@SCb~6nfHg>Pp=)0%Zu+}*$0`-7>*LC;RDW0mcWfB$M(PA(01~6TUPdp z`wtEk9-nlo!>%y>-3HSD^Qz@B_mT^yeO{AvezIK9k1OH3DylP{xw!2y9eUX#;pVef zri#1rZl`T5FTJF?LFW0;kYyoRHqE0(&a3gZt=WBh&esE;hE6B0eo`9B^U1o?E2uy9 z-a4s?G1l(dnorVBXs?;#9e$x>rkal0)u|f24_;5&qbaSo_@}8u)r)_sd(F4&L`omo zJ}jyJ#Hr>Mmz2K4M|Dak_Y_^5E;hCBbs8x zu=o2GP5Y#B`ScpK=fj>2^SdLH*Dv=YH@NH_?-+%gK%MPF4sRa5V0%qv*~gQ!HyK)- z-CksL+53H8gM_+#@!MF*(gcaIcb@MkaD5w>nEd{oJa6dXQ@r67k)BrKUXW8Y+4O$oMfEOTzQcj`;Y+ji56$FpO8?rd zd8ELCBCUO4=??^I4pf#vR0wf{ps&6=N#=QYw9$;9XGS+RY66`;A$f~#nX$2 z%U#?5RaySfP~}b^1*N*6!2Cx$+?T6e6WXG-$V=i_wCq$5qbbcYd%9c{_jW}s8a%7_ zcBkJUk;7RsGoLAUFVS{j)i&G+Fj`eOK746Hz@_m|bq4!y-%HSB5VqKeLD3HOwt*?!Iju3t7yEeUBZ(`ql)cUBnYvWC#F6X zIj~CMl3MoLBis1z7TsN)s@q>~|HWmyX;)?J?2iieI)a%k{7<%ix%}Q`v2)9Lvx<%C z?IZVIn!jJ#Fn`y=>pow&CSU^3fq0Jv|gGtWszOK zXYIJ805v<`%^w6=qDp%DDO%meJ#vLFe^i{Cqdv%i@Ba4D!Gl8t9);}RkgUR+;Q5`m zku~;h@>u@sPv&i?xNfmw)0hIqA9n--qV4QO7DVz-uP?bJx71^lkvC6)PM!|$leirh z1S_@Y`!0L>;Av2;ncwJymM;sN10U)&P0V#nGSCUKxc}y!(xXozs~34}_wDEZcC~(& zy4^kDjfXxo77fnhs~q}p>C+*+<@JfI{ZbE8m&#mok6ITsv(Y;uG)m&o@%s%W0{txy zWb}lDcdziMt-88?YOQTWd#aR7$ocK<#;rRX7aum-IC$q`=kw8HM~=#!>+jfeaHpDI zUdbf)A8Yk)s5yQx-n{Li_RaSWee=hy-@K8n&vW zMo=!eMe2B9+nb@%R@*kZ%eTF;bj?UQl%8+t<`|lzc2Z_!X_`@r={eqp`Mlv4rv4&* z-C^5`4!<-{otWwWGo(M&*Dy%>*r(J|gNK11-MW+b^tQ@vlXO1IYrjbRLdeS1Bepr( zvwGFjCI~qUj@l;>A~!{CK}Pd?U1ekbxi#DOy2a<&p3{zty6kKD!!OM2`+`SiO}SE0 zZ}@6iK86d*B{B}Qh^@6*vg)9go7#yWbhg3d6RBS zUo8||J@R0T!=9ZA_6m8AR>&+Kqp@HWU%j{UzU7&7^R@}()r))U`(`G1R{Iy<3g|A( z?RK#7iD@g(J{I&(_}enO7YFm!q_6WlYrH&R*M`t-v!=hWQwuvbgw`Ltl zE;PO)x_rdO-i@x~trE8jmrOV;JWoc}^r_3|FY}w4Sg*}e!c8xIJS3l8d2Hq6h04b( zcTagHDLlW=v~yV2p{=R=4IDr3HZaQ0lb*5X&@FT8?Qe4e*Es41j&$ugSulS`?W#!^ z3J$g{oMtlQZHN1D$3u2^wy!h%G|}66<1DFJ`)8Nt@w5+RZ92NIcD`uri=8R)vf2BO zB^>`a>B-fU51v_NFUyBWDMqdu!n?(A=YEk6>B`P;3i|gZ@0avUH?A{nFs|Hm@tNO| zi*qK(zVdspL)Cbf*v2gp`=>RG*VDDxsPsYqQBn3aS1+ggrI%wig!SxQJLjMJQ#wat z`FuAS1|Dgf9l1Z~iSQU1jk_ByXN|2Nd8c%htihE74GqzYbS+N%IWKX4V;pqVV%kB$ z(9PcYuIsmW=gu~~Fju}OxBPXr`tXrU)hZ>2k1epDy~V-d!TrtK6>qw!3O!#?Gt=po zjJ(h|ah~0J2gXl0bIP&#dZUlChtZJKDWO9GU(NM>qS|8i?74;E;SJqWQVNa-%XYS$ znY`G3uWhPv>i(Xcu@4L+x)%&OtT0W#vw&3a$+;&351*WDJE3nJa{poH;Dle>gXx~r#-TH);@G0Fbfn(LePD_bY|DBGluRWCSVzbMS->9c2gYgc{`TlY0I zY9RVsfBTcV7PtFpX0Or)VpqPp-_xfu5U}uK)&5!?`_##8<+_z`Y6L-CVN-4=3&UJ}JEbMFqmG^zK*=$Ea^6xfbnMLJH}n|{#W`oMmrbGNnjj=w7gvs- z4TW30oM*G7*S_MvwRVBo+G+VAx8$C_YEZQr@kZHYvtp*L`Q_5({ig!j_G^1}nzb60 zq>G+?aVSfpOsCdsO1g8`m|7e6O@-@hWGrsxziWtE*)RIqKvZf)Z_3QY_hk~hj-O1} zG*!lNYUDld-8LJ4_L|A7zFVkT-*q#2OKV@?yE}8bci9&z-*TG1B$!w^iFE?$qoJntcA}1oj?F*@CD@soQ7Ee*=n3)Xw>O=;4eA^kN}(!w(}*Is4Wj=f97 zC-1R*?!9i=)%WX4h3`fD7lC%slZP}seekTZWAQ{w@{AM{63#?-;>MU7`W*;2JS{2lXnBZp}1P_}>xh7C*u9Fy2TEg~xTQB_D(1JWlxCBp!6c0B2Cbw!;a(dWSi& zBjNa+J%_ABv9qr^Lsx(!Y=JvG5yQ|CuaMmKm#;m_HOaX+QBx7sLr;mW1DK`4f+Uauh+B zhsqib|-$eY0`~HPT{DsH=h41+bKlK-0@fUvQFZ}IaIF1?mr*@703&+2a|C2oa zZOEUv*I#(lUpS84`KNNW{)OlLgf`Tl9BmBbr zy?lO!qGs8f21i=>vg~neYP_}b3dI}4pg^y1v||w*7!l|d6u8O{m-3fr)pilaA_S=A`C^YW?8QY3gVoJDhNd3uJOKQV0Z+})IZQXD8$<<$jK`#(91i>k41Lu zBSOM{>u2H@8Hm*NiU=UlvssoQUcP?57R$UA{}yxbi;l1e{w0F5^H)Ut${V4#=a*W9 z{K}gIhBLEffkA%uE5jrFmi>~zm0PrBO)8Z}sd^L0&nK9FU8)-wIl9-8?Uekhn1nk@+gOVErjE) z%)?xJS$T(X{D?bM;p;9=$o*OPHz*|5xE_Wm;p;ViUz%_)3{m1ofB5H?gy&$05-tZ{ zg9z`y5G5>+@23bSS2)b^&zA^~NBcO@@?46q`CNTSo_w>6Ij+|m4v;wkbND$E=LmU6 zn#c!$ydrEdXTIjG%HX*CP{?aCxFYQ1jW+C)^5YO3yi;T>DIfeY|>2P!m zXF2bjgPbrNC-Mf6$M-il;mu^u9`}R%_JGLSft(^kUV|a8%HUXkeE))zCWC8o5$98z z!LfW09B6*0 z7#z!!81fYij(=Z8(sc&M@~o-oPW;X+6?)3436bVEc(w3j-T;J z`p)23eiXi--~?NISce0+AHocd<&_~X$>8`Y(SR$?l4EczKMnGV436cAPpdLGmN$dE zCWB*nN%V)4HiKh%8^{|lIF?sLe>kxj9Lonlo}7o~ zXAxf|{5@_oN=DqxuX;yAVdfNH1&X**Tu+z_{3-4Y!d7|OS!_%g5qb8QgZ?-?LZ=24;#i7mE{Du=|n zPo(%+{BVO(8pTPhqsV%9f`dqBRQ z;<30ul=#4Yr2J0MUzFnNppQJo8(_SUH7!UvmM{+(Qu4D0bL+LDxChwNmEy5rALiO1 z*gu!UxLZ!iPk`(48j2G=Qz*U?{AwG;g@6}RJQa8+#WzE{eo*`t*n#sPj`Sw>nFanS z2<;}^6y`TEijRkKr6}G7*JU}1F9ts!P4Vko^RvcL+yvT1V)+q$NX)7rN*1?_%A9G`-w5wS&HIn&@ZDYPS)aa zqqqxnNT9`DTh|Lc88lypW7Xid)0| z9xwDWv5yz{+a!utgFf>q-U{U|r1(t8r&D|>yoh*-;wIS1QMym@rC^_KirZl4MM)Cc zNA#}+edH-F2>v#K;@R9{STiY3)&?Tuo|Jzd{K1xzj{|>OL~%XvtECjb3G&ete+vCb z)@ma4YJmS_QSxLhr+pMBYZ(<#yb{W9qY4T7sY0PQlQ!G{v34f5@5#qQ2Zv`uWqAwD%kT5#Uo%G$-wv^`oDqvNQyUte~h7c3CvTf6jug6oJR2i zC?|yCO>qCYi{dum9~UW}0)F_E;$-bF5wJIDmk!8jQoINH%bDWAp#LF?hlBpdDgFZd zt%%|`fS;rI7qI_TimStT@1%Gv_@NBk7m#+5HS+W+ehTbnN%5mljw{8t!?^IL_#S9) z1jW5T|5%FKKzq+pTnx(jK=EO4J(>XJk#@zve4(ij)6OU8VRK z@S8gnC;d*o|08-ng8m|FM-i?I{@+8Dvk&eEM#6bSz8uD{D#ZuE`O_&r6YOk6ak7@$ ze2N!OpS({@u#hYQ=k+p?Ly-IMuv5k_~1;5Rs_-nX-I7M*- z@aKyZpAY$3ii<;kJfJvPyYMB&)xi%xQ+yWKv!CK!O4|DxFyDqzybgFQ#c#p=$|j1dfIfRD9tiEq zr#N|TIY;rS*dQoXQ`{K(rGesIAm2i9@;wn*BZt`e1NhHRN}jBtDF)X)BL5WZFoNQ3 z&@NSqe*yoWL2(PPk154fK@arX6HX%adcyp+h~oP|fAW1Ek>3a7WhEtl0j_rkC{EU5 zK1FeH$d^%k4YaqK;^caHm*Q_=yuYUSJokPoEz zBk;Efia&+%zK-JSfu~aZ5_ztq_yF`{F2zg0AC6OeB3zG3DLx9W7gs3$6Xuy)6qkYa zKBV{um_J)6PM!n5Q#=#;i%j{BXoH-*8md@_{3iNUe_e9(UvrGA^so>FYglhyD)E%*y)&K{mrq$D2=1!8$n)!!LfWS z$WH@K+6%*%Wy_GqD!RdS+?kTcb>g&yl3$4{K`HnzJd)xCa9vyV7Y@@9=XwXCobrjC zi2fXiKIEW%G*<)xY-9XK(lpp1oRrI^xFR{>f4&w+h_6?K7i)4DXH5>Yi}xmnp+z~k z#Ls)hVvqmduF`?+f^ALuiI~X%cIX&K#J)rh-{#;;v;hII)tt!PISP3^J>z;{TKQkD z(P0CAU<2oq4PC!FlnK)<5o6`T`M&_{&{zv`%$PofMalVO?J&%6BKmW4EY=*fgU_ey zH-P(=P^w@>aw2SJq3xgS*9i7ggh?IS5BCwNAEtj6whyOG`(2#jvIy&IUlzl-@?%C--H;aesTciak>cgw{x?(KsWxQW1D&yg{NkCXcGZOxzRw^7AXXl+EQaJv2g zui*dD8Y5G+rfYLo8~N|AF`^jB)dhbVaCQyQ3L{c1LuW%L!;}H;QX=>9QX<`!DOF{e zNJq4ih>JxHN0yypsjSVeF;V86%1#ebHo!SH7PCzERc5zOmr#hsqU0zg_*eMRmik2xI1DS;!83$!H8!i1|z)pF}hIL31Dppjn(=bazN6&N1ia@nq zY2#xjRRCOhRPJKa)Q z(=r_`OmZ3bz&lQvi51cA?D!aEO;&`S)+5WbNtm_|C2O3p2pZ;y{E1ZiywFCJ6RIJsQBN zpPhJDA_4#VT%wd$t6QtqKQsRMIz9e~VOrgK>mnvfoL$As=J|mRa`1}Q*i}3{5$Y0W zjgT~(rxG1#zs+6K1|1oQ@Ww}gmvXs5LU+VSjLY#TgJZjXubG3ZuuSLIL5t3?QmW(M ztTTxHxlSVC8WOflspOp08Za<0K>Q)0Rw5x2mlV&(V-a7&V>zo|B1s4du+#V~xh_y4 zk*iV-bf*C`z1;vl&uW3!&D^_)p0XQ!_*9P zkbg-e%A+i5ERRG&4mt(x@k%5bOO?G;i9Ck~CWJ~4w;L9k7JRR9wA`uTq)FmAA zaAJD4TK&W}GT=6jdjhwG7B!r^9gfag74C*^hVGo9%4r!>5VydFDgB?anrU`&vxcEQ zkw|Rp9~j`)dK>NiyP$LMTp0_cwcbR^al7&)I)NxIQHt8ux)l+|8cJw9YLl^)(t{@p zMet@clztC)RjjQdJKX_|@02S8Ho|xgKz+v@@7h(r)=1*?79)=bei?os!lS>JJ3pb5 zkUcqLn{#V|XHZQ%(zUT5o?TV(NY`#3c9Tqtse{i-&{YszL{!qu5X-+1X?Ex&A^u21+wsE z4NZ&@=z1fGYeoYAO_69|S)v00c>c1Hvq-thPESxSM8_@Dma$MTsS0ysv89o_plcZF zxL^H`JtF?QhD1^&7DBzIol=<|DvattE+jpKGXZWyhvI)CnOAtHLXyq%1z$p1@qHMn zi=FuBFI7cY;&GRT3gnbghE7Vi7REiVozfBCqk&Y%RY^)Daq6i?#b3wOTcpjfL|0<8 zTGzmK?u^#Xv*Mg($}$#esAbBF0UJd;Xf0E|Gv*quL#0Ww)7iqRb~F~T9W>i(xrLFET9;xGqi?yGp9=aa<@;m$^L$t~p z$M4vry|Ns?JB|uLZI(!qL^A2ol9p-w;_(9-=(?^dk<^M0R>-k=eqvw5H#?ST;+$?x zMn^c^S{*HdyR>}^>L=VYxts%k^;3O@pGI0TEozx2%rWI}H^Q}{HR_NPacYZ4u6d24 z1M$mH%aqT=FRRkckiX!e)q#c@Ru>Pgs8Q)_QIo`Yph;0fg4NLu*JPe$ zH(mPn=924-CacUs$;`p)mGw+=Z4ETdUT+>I7qe!+jex+bWpQ(Dc#0&fOavA#2vimQ zac6>3uGFFC2db$H4t3qJ^EhL5x%6nm_6K%4Z}+TxJoulr9W|eIr(XWLD|>2`ztp!{2>b9KGS%o>`xF80dwLI<4osI_pgFU_s-rvXkv+A1c}36|<-KbwEwY z?5d9jx+gyj?_r%b^r%0dkthFXtbd5s=jIDydlvdV@0vMMd)>kHgHBEjU3p;r#EnIs z@2&V=J`t34iSD-G+akN&a(l_J4z`?F+)#1rbLKzOwS+X@C0rJs&p&Ldd#IFW(&t2j zZ@ihck|p2Y#5($EW9W_r!LCLP5SGKbwQw&x(g8 zhpsuBzMrRXUbN0t%iHl&H(j5x<+EQ!t;%CzZF7N{U)9*GRsPFm%11A_aPwfHxTnA5 z1MPEbOO*W$XPyyTxYtx<=z#9bu&T@Y3-@GaER%dBSt?#SxpZ`CVB=w*-RqaBl)5(h zPt1^*tv*|)_IY`G!rpsFLi?vI@vjr%-}mwK*Y9G!`ELRSVp6ISbjQ?czgWyOe(Q&~ zqWs#tauZ_Mk0iQ2&S)Q|Ge~pnV*(Hiu3X^^ywqIx}Urw#ae0@AI?%Nj0)i9CqlwSd96_ z*^P1a$wK~0Pc4GH)+&vb=C6LQS2jv*W^JkSvG8NcSzhD1?vFLqe>5@x!M{QH|MN)>m z4-zqaUNC05ki3+M#JgF^dBRtG#-_CTcZ=(<-!(t5ZgRn~>SyuG;}k|2w$M*I%?x1O(n_!RB=!)1K58rJq5;?i(TiAfg(a*~w7w-%y(XDdb z*7W|iuyjLNhKb>%u31M9I7LbK9*ey{?$g`ihrY2ZEsmrvoBC9vWA!P25&w%G@4u}T z5xvoS$Yt-6LDpspd|NZrf>NjD)Z|Qb-SK6)j9sU)Tixg#V|$`qbe6hY?QJ`9sJNl} zY1op*=p>{{d zycp`Vb@KdpgGG%^MvDr2lTKWpdi>7%xFb@JQw^oo?!0zaF=Z&K#R>5+3L8_kU4$)?rn2-=n9I z5R{Y@L^?!Dln{^>lx`)Y1W758l2S@qkPuP2Q&bQEMN&~hN*X~4ML;D)?-|(hzUQ~U z@B4f1{oOzAbNBNc&dg`lti9LTYwrop%%ZF~{BX{>bl67BpYYp}>tx1X9p00?2tMXS zBb!yDV`$pvQc>ff)v0EvF6>{Bv+ucWNW4}y3B4oUaIok_?LSSnX?K4Sr-wNV29Hcw z_c&<1Ac~c=pIv$CQERL$wYK@r8uT@=JBd{dCAxlY}@V@ z$3(AWaMI|%xi;6%KfS0mGkPjXMd!@%qR5GsLCa6nhiX{nHm)l&D@eK66o_x_Tf&Lr zsvCBqo=8sFHu|2yiCcHUPp5!;aE$F#H}~6ThC^#@&&-2x(-gcP8tLRL_WI+f6bOxd zjhs7jA?1rLbM{k@=dm1mDPKaYl4%&#hK{^f&5j7Az`gv2)3SIYkJ(sp;$Zp2BMsHX zcN)p>uTm*is=YN{Ths6~FZlM}JR$eXzVXbs;+BbE=cf;^O*FEfop{$!Z(#dbD$V;R zMFe%|D1}G>;;hD{o)r9q!{md1#TG&h!mK2J@S;+Aj)3JRF(4PP`2 z*AB8-7$PWMAb9q0JEr>lGFjU;xwE2~+vz_SAMxRppSVuF|JlR7O|qPjm=VFYDt(!k z&*TN}K2&cyTSZ^(DdWQ_DR(pGM5?BZupGr!b^J-6p4ZwGd2{x}L9^`v)Ec}};mvX~ zv~uT7zEcQ{gf_l;65?{kaj~}cru!RLEo%RlGpZBCpNX&bPc52qdoPv8tutw!y8Ey$ zUTH{7yJ_VW`|GGl)fk^m%UomDb0pTc_gjw`S>GP)zC4x0lq;Ve#jKm8(pl=;2E?VGj5+D#vdE=9Kl9SxS1 z;UBAyy!vNCw0~?RtKvtEn}*P#Ln+15;&ThGO}D=mEy+qU-CYx_HWnS&cr@zv>zvGZ ze6eWTC#R`;sb;EXZUMjFg#Cde>+D^1SM{GdG%Rv3f4$@M%SGmutaQYs>|3ju(Vtu> z#%t5Noxi>QmZhR7XBYjxFv>nbTd(_AnZn$a*JddW&-$(q)!a+@?EdJ)gXgMv$C}mm zZLyX(-*SGZXI1v1Nnncn2cxfaiHui>%9Y#7uFb_OyiW)16%Q>E$~Yg(jh{GsnMWbx zyNZGiH5ZPh+ihpReuDJieqYUJk5W!~{3>yHL}M(N_WjI@;8@!l_46k*U$d?adoK>3 z>-SS|Z0tSDKehg~uAhHsR8{6d;U9^9ol7I*<{!knqwr2k6>aQ1Op9$JtsF68s8V)# z|I(gsDnMdCNuRi7A=kz@v1}b>mBDQJz^~F*g0q@ezHhOg+t&*ozuitSs)W92>syY4hUpHNzr18m783*K4yx&Yx+fL@vj17q9+_)O|0oglAgY< z`1+$Xk>2@7-(-(#ikd0$PjagA6OZH=MbUF>m;li#e zcb<=ry{BJB?#e=RBU&@r&)fHGs-TVXGD)K3K#)HdDYKt`|Ntw1YqJ2)w z^$I+cNIxAebG>H7w9p|=gJ$cfUHaXE&0p00Th;H?kG(C{p(`{$oGZDiPFN&C}X=%+OH z(p+(&IBiRfZ@}=P>BhXOOj+TRur%>n6;9`Qf6^N!W(5WMVRi-H6Dkh$b^0h zxVZYh-eqmxcQJoO>cdZ(-z;Ao#z**NF{qs}K z6y6uU)5vyCy~(}TlI8x`qA-8Oj@kL#0`D(Miq?XAEp3}K$Jc0n)0?xY(8aHC{)wka zQ`SDZ^gYaFLJXQ=Y;4W?TaW6ugkx02HYM>ajYUEdn{12wAvbTlB+&7$op2O zkkDjub`}2t_Vf$cLBzqGLhO_0%BmK*JKZ(Cb_mUU^}Sm0zI5`{D0) z#Tm*tVdbXG(x}i%yfWMJ#1(Pey3#te0-ByKr(d!p^CXYWcH%=L@F=FvtEC>DWb|yH zB&8>PEJ%1rErs+k<2Cg(fyrrV1D(a^-QaI?{>xDT(95jrYbzTQ`-o*7t8HIK3D=PGj|w>GqCAXzD1zZX&C7 zKgqEu9NX5d_a_KMB7d^iYd-QnRzPV@9%P=d^}Zwi#tJ^QgAI8w&ps|eflAj3OwK8a zO4kBRx~V&+MwU~;WH(JETUz4j?p>PVA?vAitqHp%!0c$58#Zt3(-<}*!0a+bK*nw2 zlO3i{chTCiHjLiXCn7AxL~^*L5Xo5ezU36zqTrPZOvb7d+?RouJ|qSOp3NOsiscfs ztPDFVa3$RQ*cN+(=`V5IdZK`*ubR7`hDu}^yI7v79#^>AN4+CAbMP6psGX4yLq-k( z(-iYEWnA*rjik?~pX;SMu?pObI%u#Wv+zfkhN9_q{4dMTS~cY^EVouqzIr*#6Fa@4 zebi6rro-x`UWV5yyetWAD~Wue@~7_fY&Caix4jxI(+XUg=J%_?8#R2eEf@ah?D0cR z`EFx>+~xA?T60p~a91R)SLyqvoA53%Ys9{4No6d~jW^TaX)TUEq7@l(JvGqEJ1xRV z=>5H)Rjkz8zEP+msGDi;!Sh4o!va^Iv0Od&@(UO)_i#(rnuc`knmN7tifM8g6X))_(i89 zn`TN?G}3FPcsJO6bE*iG^Db%ZfBfA ziC4HvR)l3D`K1fm_?X7jnVV&foBh;J*$54%$|~jJEjeo1{9~Z>cFkN(UG1q=@r(zq zw(^2AMt?+Pi+|gu(;xk=<0p7tkT4>-?o`0HhJG9A)1C}%xk59FCd$u5673m&)~1~- zIIH7XGkx1McMgB<+nlIDr%s}JcUI?5O+LAN*XhDa`ffGju||{32WPcD-!896U|Ax* zuJOLsm~!Zcb|jg>bKH>PFc~dwCkq+<(OMz??6ekLCik-!?jAJhY@eg+v7xKmSQ#{) ze7<^vw;#O&QHT5o2vg8?Oxm*eE}a&+14=I3(f2uS2;)Ue;(z=|rdVCkPZf0`;8m=} zO{o)G^vJ{hq1BMy zXHyECmZFFAO4Nqj*xyn~K1r3(v?6oMsTy8pmR$SvxWjnp^%M6l)ikA8>YrsczZmh` z4hD^<#s(1OlHN=d%xCS_0x9IO?L8!{PaSp@9~E=S2%G~D6ho^7%;rbb#G-2 z?5$Y(o@$r0WZl;BUY09eTwB#jWXFuU;ge&lprHX#SzZ2@?uO0S`O!INr|sZ!?=p=) z&G&fgWN_0{x@eZRt-0%Yq;uD9;1A)(ina&K;&rtYZxgmw$qAwU909+>K-YaTYLj~$ zskINZoj7fBiPq)4PWGLJ!Wu25mkP~?Q;ztwf8koxNw^{;v;H7yoGF`LDU`;f|4jX@ z6q5+mnESVmux=Bp67nVo(^Hb_9H1;!6P>ub!KGGgA+&Za@$Of@iP03z-}h^`NqCh@ z#8xg7>#(j6wm$yOkw8&->gp{r!I`yNHRHO`CTG}v;=W&Pipo&O>(bGeFw-ll2{RKV zJMVK-ZBmr3(>}XY+OqclVG61O6%Uc|R;A-rbf+c7%t8>2MdF8kG42lh9=bQbDZ zC@UFG&L@68bUQ)JHAYv+HPdRjIo*WGsdk9NM9#b>=*bbn@W8IUzH4pwT$~068T4IZreWY zx%bZh#LweBxU#p|KjLNSmayKVwn~n<%I7G8okf3$B6+@bm6G(=3H5>FaL zUG>wHP+-nTCe_j6g`tF3y(Y)9nAP3bju$s(uLb3M=UhylSN(+7x)6o$7ttER6qhkxWX@+)~7 z{;ppR6!*$B(-<6+S;3LIS|dt4bZpf!d!mA=_S{-*;n8Pv?1mTJeeutQ><@Lo7nbVc zPH(9-zSB=S^)$!z_h>?kW=c#xqog>?imR$uM3$gF7glP zElQpkX)?^{#9ORg^51X|vM-U&nQ#-}b8f$+S9lf(vt(AerWEw$aJvlm&u19N{I0 zzxF@Z+Q%z^nWOfmD&#)@-$exaoeR1J9dGFSuF!SN{HCj^K`l>nZ>&eGJh$~J?U{WM zoZsdxo-(}^3#U7lF?3Op+K8M${cK&a&E=6{^^^OuzgcUTSiOuY{Whugj6voB_sjqe z>#TwEt1}T1uM{)G^1d}$ug-0cU*8@-;Zk+ULc=zY;ZnkSy%bx?(I<*mUh~q`WQdpF zElhgkCw_|Q8C6IAk&|6scR2Ev?X^8sS^5Q}lCSoXX$#*a@W9^c6`m@UPa` ztli=%upMJ1V{ja&YA$&@nXs;)Y*FLJJHfu$LiIJydVFEBKVhu7`jO4f&&`HQUa5~? z9hAjeddu5?lx&&#RfCA*u?9P;U~4v)rs5f)tnF26t1|{6lEWD}f(@peHq17jUF?Y+ z+&K(APbIB&WXcOfs{b&*kfKp>VKK&+zf?!`hr%G5*pn ztwC8H>x&_(3DfV_Ke4V4URcLxnEq5~6)!@|qhN3%>}&o0Z?^hvc0UeY$nj%r3@=ML zSNh(SgYtyS<;T2=-3PrLm+Ebo#A7;BwzMRKEBagy%&9U;7Ekv)^L;25As#Wa?2sr% zLw+3Zp|*uZh@-sJHWoM4OZ=6oL&3U}Y!O7c2M1FMT#OGoRJZMkS;<6~+mSa)E$30kPb!~^p|KXU*C-#dG@pm~z4Nh)QxY+ug z`5>Z^{aKUoR?G*wO9OT9&UUhPE{a9E``@AK$e_cI|34i+O4)j<9%vGiT*Je@TW%0rjZ8OfQ2-n`Lqowo!T1;@;_=<4NNA zo`OAOSNPqkg!f558g6>D%;wjrWAuB9+jJ$RXwp}@>_d1%siHCM`lH1*l5U*xjkDg# z$`11p;y*10MO<>PcT#4ADdlpJUcHt>Pd%S?blZGE@%%8+ZOxxn+#Rf?FE1Vo)(_8% zTuEJP9Gzuh=9|9O5iIHwzBbAFmG#qD?&8VekyZK%*9nh-?5U5M1FDZo*3R6#9`En% z*>L!0$xZgtUqm||T{HbypVp>R<7Z@{?b%ayNa#gNaN*4^%drjKa~b;&U1A7|>G?Xz zKp6J?ByEP_=yrRQ z-8`Y$>)(TGKgQnlTrj`7k@B_ZX#(w6Su0MO(&(PYO_QXfS4()JmfPL@=t$VPf0HhV zoGhLR-VAhhQ7~(1_IvbElXpblJXyeRX02hy=fQb13ZwlYLrP~VXjAxjxP@X9 z+pkA|x$N5f%?LV77uiPL(>RChc^il;wt3i$SWBe@T^Mg&M zvm$n06J8H$mBzBtViV=acZdy&mD==Q`ql8i#-od|i8T;x>gFh$l#|_dHGF50$~Am= zo@Bz4X+K8>A#$) zcwh4Tc^nbZ-#=l*j-T`0>0-nA>_cZNMjdIJSWh?UihXP^UWm46JC%}bFEm-+an4OT z%w%>lBeE+aaHxo`zQL=tiZ{+@bp3-Bk!~Z2lHpX6PYL~art| zE*LC-7I%3Psrrac<{UmwF?X~dt=r{8$8BcLf(0|1?gG4Bm3mv2KR< zUmP@v-`U}m%l_)lIX>~QKB&O3obvhun$1G@Pu|v6&&wT8jrWV5EBlSr0GLA?I=GRTqp5{3+G*q``2WgcM;vy zbGNO!`NQl=!ZKkcm$by}`19GXMxR3r=JTBf^z8)`32Iu> ziBcMAM;2DCJWJgNuX!_v@tNdj8fubsOMLLhdt{Z$vBJjV8Tk3u(YJ4T53Q0Mujx-Gkr*7Qv$QJpKdw2SXOZ#|5#+weZ#zjiu zdWr6rj$Go3uEiYlj10xc!TO*FN#wx(_c6!&4dqc z^r^ChP%c;Sl%Gl?6r7RBs;r=x48yk?-Ji&2C5KZHHelWRZr_X0PMPqGTHT~qT!R|? zoNouY-+dB{A7?mwXy=U0{xCC(Eq_m(_#k1e8`5fG4l%e~_=i>QkjYyJ(4AB*jJ(N1 zL`zoTG|)Ld`>MGnHa=Z)>3I39PEFv(_C~1UhEI*#ghD@~?_;%4azZ2gtA{sLk8n}{ z)(H*hFi(8>-FW0l(#gS2xx|9ovYCTg7E|Z-J4Or+FMCFNH3~oTWP3vn$VB-Q-w?9zig{LSat2GS&Ql!l207_ymj3^spF^op)Zoj zeCr_>LlQkL;Wo|gz&&~R;pzh;He!=|nZA!1q^jh(&etDI$K2U;RZy6D$}=^~rm*(o z?Qz|!A~)#RVuSx$Uy_Ia=OwiSPc1FCu=&@b}r$NH2+0A2JTb0UqL<7HkFJcnO;U2{ z*ZmW21Tu!TcvYjR_OA@g_Me}@>mD*ocrvYdY~q{A_g{*AD+;$A{KSMt@LsykzR|Vl z>ynLdj$#OGGv1eddaCU5JLR22s`;cn>Xp17uN8(|b{7k9>G%JU%|L%NO$1~3( zSDw7RvoG)xF~7Tk&=Nc2l#_{r(UJb5A!5nYrHG_LQ{Bq?Rl)P4%_H);V_lS$CqG4B z4ooSEj;MRvmBU$rFOaYM+Ll$j%w+R(jK8<{+RF0p(XrP%KkILPeIDTV{B9=WamQ;X zw<-7OT*y4nrT%NPqQl56P zy_s(88YsGGy;&b*W4A4Odsx@C`(o6k@fKPkye0j1>^R5j%F_i26O=YDh7s);I+mFcQTW?qTnbTqs(XZYb zGkQmwW~^^;KO2ZYyyz}aUPijPDfQ?{+i#I&4)=9>+@tx1x+m{eeJ`>W-#HRAph&J0 z-X{M+yJJXr3kB(CQd+qBrmB3X9Bh zx&YtFOXK%EZm>ica_~#X9rJlp=$lEkasL8u)7xXGJFdq)lK*yV{$N?(o29}1-V&`> zMlxy+t>Su)^1e^fcyga+i)Kn$?Nqh|?Wr7{JDw9Pny+(GXUoTE3o?41efBKVOFKlm zd8m`C<*lmr;jY|rrH=k;k8k!*)QH~YQh$C+)f!Xm-hG%cYA$iKU9>+1567}Hkk|K5 z(X6K9`}I08=}QqS%0-NgzP#=6Z#X{kt+$<-sHy2!4P@#|iHNfDRWpf;%p| zPg#5>m-r@We5$|A$n9bJETwKap5Ba?PyF0eE&dQEuJBR(&vH#_U@l?6W6n6pa~Vhu z$yg+Z)4oN&gr7zWpEWtA(kT9Naf9MRff4K2}3~%!G?^ zlj6VhIOgS|$o(A)ptBRRj3ZBRARJGg;!p^_1`;n`q!foR0doKoF#C{qk*Z=u&}Zp; zK^tx(F&BfxTr`rmG#rV!5F%xY`?&bxnCgWw)$?HXXTt>CAxyv>zy#c`E~L7DDu~+u z7r9E2w&4Glr@H@c-M{As1wUy2TXc8n-*baP4+w(&@OPh1hLm7d|2;P-@^spNEts&z zJS7Bz3$wgCCt$u0VLk^iAGio%z&~;18O?v<(io2DZ^C>dWp|Fie4oR7{z)DgcZj?N zXcGF)dF1h?f07UX7k>9&c;3J8Dh%KC!|vlvI5@lGAHxuT{8PQ}fV>5e-<=OIZ0uj; zmx25wB){@6@_&H5#qPsSI5?<&BnQ|(wTBtQk@iml`Q5RO(Qy*+IHaR7Wp}({zL9xs z*UumncgH0nu=}vuB^-^*RvIpsEIn*gF%Pd{@;sWWXq;D&*Dyb?tgNe~XRar&prK@r zqo9kU;_l+D;Av}X(-EDCGBh%x5 z=8u%Wg2@JnY0s`Y?97#zmY#RDan`}4X2iu}hNYDaCIu%ZS0rYmn)6i;OcF*^`(HU6uOb^U$s_-}%{n&!z8Oas@ja&SVLnLz zqB#n~5Qr(r^OFZLACxa45K|D2jB1plIpSbF=rg{EJo1bsDqoL@1Ej$6BUl`HLIsuo z4mjK%Bqu9UU_EHgDTE`>R-$@zcORG9Yd<{}zlX)K+ewR5h$+YyGB=@ml(9Iryvx7v z$N$2K!MKFmPlv^k*EFE@KE&e4c>~H{0ghCI-CrDFTq62evE-Ejhvgq)$+Ka}zxo&X zO)Por_&Ev2H*A;pzi^;t_gxU^GN$_flG}?EvyQ%F4Y3g^2tz)sh?6h{JX-x1=Kz3V zZ!>15LjOm!2Y3NTbbzMq5@9TkY&!r>Ud18q4jQWf@i-(XFhynW>#z2Rufv>JM=esyz@1@e{zVScvaF=7wPz5Kjc-FdO3Q;F5Qr%#HwAv~-@|`#KhT~Dh`WP%VFBVtfd9Wk zd=b>U8z7i%XuVH>Ja%p`WSh$F(}2g88lm z;u)a*XwF8o{b!Ja38u_J^5{GK(cC7eybtK#-;g{ycOW^uk%G#j?@pzI_&LyzM>w&mRgLpG&e;vec0r_5tOCTpNm@)xzP7rTP5N`r;z6o(PU@sAfFVx;zFkYx3 zj^@~7gE%X4Qi&;o5cdV`mx4GOh+9X9KL_o*1MzmC=K;iLf&a@OP6PVA4dU&Zc0zi zeiASrpzZkr;z0=F7l3|Uh#v*~7Q{<|e;z|z9l40Xl$Q_>0mso{h?jtN&p~_>95>e> zP7BVL&|6ceU03$1#X)m4pky9wak~X^OAw#v%aYLkiU8;TM4%p&qxXZzA^v8syKtx>ei-x@nmYp3qY2t+ z0?DIyDA8Oos5~d|XFep4zB9K5;!#UCuN9Vm&h@>J4ft6d;unEk*g3_JeFng|Gl1l8f#W!Kt}#R&Js-LZ$^QiL^AO@mV4QbA z{5q%?eJ3v3{-fZya~J`bg7Qf)zSJSk3iKO5ybJi}Cd3bc^R6U_V{R_)mTZV`f%cR^ z{2}mjJ;V=#dfOpB1N09-{5kN;G{lX;e7gd1^qta7U|vBsBOh`wAId-+op;cj-l)6{ zsP{S~uLb;E3~|Lh_u#yM_-EjsS%~j|as3Ur#S0Qc(&NqS}j=t*~&E0|8YYOJ2bV!~S z=zj%q7U0KThy(ZFj6?h`xE@@9cscO@4~XXhd+|U&pzXW?j;9n5M{|uZLi_~icP@x? zfqF$CZUpqpLi`2r!&!)jfpu4i%K-nQ??gx2FACH1;h!!aqStzalv?Ohd3b^ck2)r0rMU%IG&*GMB|(S z;(fqgCWuRcb?lsOh%RH~52olt@^3-E+d({HPaMYw;`e}_e2AX{Yt}z9^(buQN93;U#7_bK65mn`7s0 zL-xT1;|0yZi|Rqo<9i@IX<+^&0r7>(s{(&1K%5HPw>b~-VK9H1L0kY)h$)vL9uDmH zhPXaxPYA^C0)IY-cp9(=AG8Z?e<6?~f%pLs-;@w%2lF`{#EU?G9f9})7{3=Fei+36 zEr{O&^@p)h`D>&Yw_BsN8Dna}=Xn!KaBS8D_Li`4Z|15|b z0iFl(1E62f`}b&j@WFVWhU6tcoZy2vMdh~u$IeZLY+DC@z|KvEa4R5>otq5d_rZA% zc5X6+4+DFxpn9)>b?n?^hMxBs=p7&$3uEdfqVnR_k%c}hj2tAe;FSZ{(j*IuL>%H3KwbgjTwwg4hxk!&ePIT17qE`r4@29Z3C5ilBwvXh z2O%B^uD{|Sj^;AYgt!mr-y(>A2Y#!Acn}yTFCl&b*!2$L_rZ7>hxk0`uSJMo0vtPM z6XFXrr!^t)H|n3$U>s3FoDt0PhavtJtP4Qg2H15H;u65m$`Jno`d1g?>cIaN5T^q3 zfHTC=9AthFR|4}%B*a~SU8xYy2IB&~KY{uu4xH!LK=O5df z8W8UR@sH+OLiOVUzu7_Z)nHzVhxjr$k3w@Hp?cIzgs(%vLMT(U(2-!9U;))jHXij(R+)0RhAc%i{Nd7ITR|4W~ zK)*c1n}OdnAl?r+nmY+?zY{nPT0!!60e6Bp`ukWPi2DFPgg~4gjHBBSM{{%Eh4=`F zpB#u&g19Y*coFEYrx5oAan%a()8PF0EyTltpGP4c2l{0W;$onk-ynVs==lZlE-=1` z*)W}rDX9PR!1$tK+r@uzHxQpJ5FZ8dJP=<3@gNFuR-__Kk!9Qc`b)nV7{6)|R{`_0 z9>m{+el&-;6F6^ifVc=aj(9@+5b$RZ#PvY@L_r+Qad-#fB4FOjhIluKlRAj^gZZ!p z;!VImuOVIl+A{=k^gi7T#Hqk|`3`YPFz#^Jadr#Z?~}j}WDwT^^B5h(S3tjTL%a`g z5s2%9{*r;X4mj^pg}4S7N4kLHVp@y1%mT!T10-Jp#+N4+2QJvP^EwtsY<>pnje>X{ z?yfk_9W0LMG2g>D=~x`m(*^3yhj+=ld~SgA1QAFcouAbp zd9=UuusG8GOr!yrVuHmH{b+wVKpgEaFNmZ45(;r%aNZjSIBKs3h^uT!ehkc$C6GM& zyv7Si9<}QY7Dw#*1?=j_;@Ec0LL9a0D;7uenBrmnV9GicNA#ff;&AM4{%c-E?Inje z8gKMi9MMmJzqda#7Dx1>@y3nC5qb38KLS`Bk^c#fYbUTcB9H!FOB!(0|Ln*{OgRtn z{a`-71aU3EuVLv&>OBL_uRV!C&({~tf)ZSV!53fPI6L6ZNyVd{Ik6vK@JPbIh2YoI{0+L7VlE>nRUGfBbdX=#_ zwp|7gNA0qKIBJ&%;AnfqLHln*TpjRoNY4~FKY0qtTY%%pJ4hb2>jM@??1~}Svug^A zW83u&;;3CXoO}Brvd9OuixP0uu3FF@UWj)Bt`0b=hY(r76n#h@2gqN6aZzI4uGkwU-0vX@$5X;2!`-?X5=7 zOCfm+L?Nc^K=SDCKZ&{awj+9w_L~CzvZb zc|I(T$n${fI58}a$m0`X{$R>UERM*d@pA@?Bl0ysUKNWY@@Rhq_Qj_5A}yabCQhy}E>5{o19 zq~QM+^;jH{j|TEhSR9eJ2Ise(SR9c@e_z#u#SwWzFwYNTaYP;u*@!9QSR6q);5_yd z7Dwb?0QqIW(fFSQaZARHXxn>tCvxcB1e_P**5J4-193zA-Q982A^rexLx?kg@qQiR z>VV&Z_*KA@A>IJ^L%ut*GkOqS|Rx_#Cu!bU~vQ~f&S{l;)s6qJY)=u zBl7V;ej1A-@{FJ#m#{b@KL+H#VR1wr9jDt^9FgY*#}OPJ%nGI;vd9M=r=(aMk+%f$ zlvo^*N5?5E#L;mo2sj!i9+-WQq6_heJ&fZF=~)BU(LRuT6OfOEI0c?ij>10ha+B(T#jAfbl5*FI)}c=>31qf8qKNNB=Ki z{4d-R;x9p*+x!bB0(K*92ZyL#0&ZLU$8(qDz;4t(V0Roguz;8kT(C=AA>IVmOCXLO zucd+hzx04cnL!*qPfLaPB#=j6f{f}x&%@FC!6-+sr_gy6<>>We5&|#<<>-9?od5Hj zw))j~rNl-`R@B5h{mV_8^A{ITV2JPbc;kZUKKImo-Q| z`@nW^numiNE)fn6V_+)|jyssQ{{mnEk;N_om=#3l|8#!|%)Yxi(S`x#X#EM0!EpV@ zG4lUpzw4fu>FYGu1<6VW*sTBY`b4L$sm6A*8a18 z7tDr#s^0?CkNO#@9| z9NZT8Yb&}R`ke&!|4RTYh@*~!HlX{VxDc~|Fvv|fl3;)IxlL3aG7~2Uv*Dlo=L7t= z0(M0FcL4K2_ecGQ-2Q|@Yu}qVZ3jg6BrJe(8q6wk$^h4o z#MD34?}`j;O!0;s2Cd@QdkeW7WBa=Z|Gmhzx4idPLToQ1x5#mk;}W|v|NFVQ?`!V0 z1^Fwty9jb~V{*r;MZ88*Vq%g5FR7|V?G9QbU99A8mQ+F?ko!eIr_Yx=@v$cC##k zEVvOZi&aQQ$G>xHB5hKOcq_k~n-|H%DIKw@iplql$*IWp$M66qC8ab{{R=dg@_)!n zBH27KSsee~=@4coNw5ybO%SbX_9+158R&F%VZ z^85i0-+eoe8O5D5!>I3=7!8iL@R!xOx?d;D*Qjz;E)5ect#*CqNJn?LvLZgjj=8R) zyV+o8U0BKQ$Va&cC#P8X*Uh_6`pL`uV*fy`p!Kzd9`82Q7ee>bvu8@aGuoD@tgSoW zydL}3^Da|I;GgjXe+r-1n}_#NSTD6yR-c)2(8ySDy#4rb2#(4=O4(`mLwG|R(lqXQ zlT(&oKZ%_4k+iQO8N@r6I;$+rDcM69JCa0?7kzUoJ)BWR?An~Vpb_x znt-R{F{6(dFSpI!eaAR|pzP*3I_hx>NgKb@>Dg=tnp8XZejL8+_cEYdmAWa|RX0vG z4WE)vl$c;MQmkI%kLCuY6^T66Z#Mz_a_+1g&ws|3Jpz&i=eyxu6EPn6xY@x$r3gBKV5mD55C^w zxw4PYKQHV7@qu|7z1Z|ak*tade4kEx`SSRxYV_q)9XNBC?pm4$*J{~NftvS`uMyAE z^bTG#5B*N0uQ_}8fnMT>mi9RhmQ#5P+lstP-iq%zzG)JFZ97Wx=b~7Y++h=C4ZEIL zSG&qAInOmZo3_n^$A#Rh+$1RKZrwZR_51N-ip-u%^Gu~zSK>buKI2-XeK@wV*|B=^ zo1}^JrLJf1sfaW60uOF$d*0F)7RU)EObyjnGIz+ox>M915v*<5e<-;s{$K<9$bx9*BRZkzdw4@rqx$yQ1U#fq$qcg6kzz;s%Pjj5wqQ<9GxVw%${1ukh@lJdD zN#3Q9^Rw#1X61L8j~I5`OQWH_%TDZ&a70A+O+Jtz_uQ`WoysJ!p4j8+2Ac(0{|!35nCE=6f`*6bS0{b>X&+~^ zuYb|2`26mGZ!wMJefD*O;$hAPp=b4#VefOjW7Bk77JKXIP3_z7R_FDQU1i@tqkw4Pt{i|OaY)3hWbiZGi zAoUmD@G8hF9W|F04XJYu{M<8wj)Ds#}^DM0;&gQQp)G|H@DY2o!LBWJboaK zN&BnQ`yJXpiaT~CH-+wx*O)VOh5q=U(RcA4!@jIJ4++0p_LYG%EgGytC+iiw;^uMl zs(YW4R4}Zh-%f{ApJQBp zK4_PwGg)1Tw-6ItJF?x z7&Az6vD<7+9ro*MOdR~~MDwicfqh1P{23#S`=L_{XYSC`wq`%L{K3d8nwV;MnTlZu zKbgML-6$iL-Qn;lx>0V|?O>m+Q1zBu781&`0Sujnm43Rvjvk+vzWu=IsXzcO!ODf+ z5FtMnLYK;v88?c7gGuRowK8@VY*!jf|n-7i0yC`S^1s?iYC+z=2OzgcRzirsW>U)i?%VV(S z>(;)}*oCT%QR)#2mFjH4drnq$9dn}jH}Z)!lWLCtHZ-jH{6>PK%Gi2;% z6+I~#vCwz5=c-$AP4~2l^>?Z8As5WD?HZ)IqBy9;&B94>f8GC15%V1bqroq~r(e@Y zFgGO59`ffeZgUFL>ry1v%j_zOx*8m;Z*_=Nxq8xsF6S9#Z%Y|1nfCM4@99^JKAnhB z>b&UmZ2vS#|LGT7M8$Ps@v^)W+3WasxZI5gng$odx_k#CSRS|u8Ayw>#8@g9j=1d*C> z{`%JN-F^FA7rtc0`L^RLuS(>&fxDY1X8&OP}YYMOoCN6*}#-Dnn?uS2YZc zO>%zMszgW^u*Hx896{aVW9nB*hr!6aFn3vADlFxCQ&(3!o(+Z6K z&ag$7qS=qNj&Vv)_4WH7KIQq=YNU^etFA_nE9i7@rw|0% zh9q1)-mgGWOQ&EtbuW?R4=&Asakbm3T1lZ@^^UygCk?8FnmJ1;t;COQ_TNvMexzG5 zl*cz+dGJ`-fQI07@HdZA0^ODqo%aYQYtP^Kb}BpQr(nj=)j zJO0Np=~mzKQaP;29B)7ANTk{9%*66s?#=(`mo)yWcY>B^3zHzwB_-6GPqSc*>X?D; z^VVUTM?>^+FJA|w%W{|}+}JTtNP3_&p1!(yB!KjfW}ZwKWxLGq4_-g5fE1^!mYYXE zP;~2VRD`AnT_X+Tnc8x^*P?RtgXe4A4P6p%p*0#=zNugvOqxKo$0zURuNYF%J;cZf z)^RQCZlpGt)M;?9miqBzh3h4Lon_aYOS|oV?D@L^O`IO8d-+e3T)&F+9^NAPe&x>c zh1FiX3e!&GUY(e^X$zo{m)L zS)O-3|6~62@mf9CG4W^o`mr{{HGVBWam(qvZ~bnV&m(v9@a|uf&zO;PkVd z70n9|f}gmHrNnhbfY?;Z=TV3gbBRYqX~?|f(3|ET6ke_s4?{AUmzFH(iR(}K+zXkP z+8`sYKRGnk%u4aYqar2b8B0TZGavD`q)%mtKg-hmBn~n0DWjQ5HezBa$(PNR6cog_ z{(SouIzE0*w6^cCLrX9}OG9U~@k+H4=@iRCBA2k^XQ%F^J~+*IS$oJ$JN@=Kk)%v>Xp+I!1Fog?Ih7@wrZ^Iz9q z=y|SMKJA+8=T7ZwZO+&tx_Md7B9-WOgC$>!xx?${v=X^bX@~{KAM{?e?>}&#b7O+= zjs%g^hBsI5qooWgSz_l%_iMC2rS((uS@9ctC-yW^)DQ1 zG@FvE$&*SavJ=Lw)tTsZN*!L5JviHS&uf^^x@VQ=&esOh{M{HJUJo{7x6H(>+}7t2OnrUzr_UusG2W~iPo(QI(>pmG_@$3{Wm{fap z1Q8|590zD!ZxJba4|9osB$p&7F=R8tp}3*U@q~z^EG_iyQr2a!Je%%c&T~6=vuq^;F#&slMi`qZu0wc;P&##J}J zrCMj?IfJip(u1#o@AcX6fbj7+Pm;~!X9mx{b-dreIvFKL)`8i1AaEyLj+g|0IpxBc z=hOxYvZuDK?MZz1CuQS~@2iPh(!YFBM9iUi@Xz6Iar4bm+E*K?tH^#F7H5AeZ{l0T zexa@F!iwiy^N<(AR-`himTABU@wG|rb`IiG5uQp7U&t(SwT6*9tb2E8(0ebtp24|* z`etwSufHf(1Pkc8PsUXXYYPi2pSGr^ruL2WSb9|vkzh%=9CH)1oUFvVIa&8IO3W=S z>0E3dn8uZ)C*CzQ$xgp#Smcstmt$9ubvGqLH!Y#_etvmA@w8lW%O*KF!$)7agd5q9 zk8+BZE7IF%TqJ4_@2~03>29E5yGhcmrlyHsbvJvd3QscsKF@Q4H);ayq1B0NYm-YG z4c!_?m(_AVyRyEeJ|Gc_OO&BOuGLi1BN_6fh3nRn;4?f^g=5UNtTJ=z6il~m9Zmgh zFLHS*A0xi)ZhMY`{n&Q$yL`&*l~l_j+PBpMW`nWEqybLcuIa*U02N7bn_vswk;2b86EYPCs@#`vhHpx>u*SZ(2@V5LD;X6{RuS6 zLFa>$>)%+_zUuc~Wlq>PLi$sYGP;Q`WyxE=;#TCtU&5XNxtpi&Qa_)Sy`nXKHbX4% zkWj>*bo8GjBx z=%VBv?swa=TBa>>?d5G2Znop|)2ALC`t3JkbT*pJmbd#w`|*xz5zGvR8^V@?0mH)$ z)<>1Qx#;(OR|}vW#&_W0ACr?lXE)xofbVPd^GvD*&#$VT*Xp(Iie0pEtd=W9p9xAG z*T#Z$Po_L`Tgu|Q6<7cMx?_alGS$1URe5|Co->Q`fg_a?AM#Vr=N}Xdcj`(@s9S90 zQ(J#?&%Vv|>B)#^PjSMn?yzRB4o)+&=U81Y(R zAK{!t#o(E+An^%8=7kl7ZX04+G2SN6IiZ`HN?L-M>PIHCN{W80E1Tv$x;eUUs9xCO zm2^AfhF9P-QF=G^jGyWneHvABwNoxJEm6OSTn~~n5o?sU3>iw^(0h4oP|jFK{(rIe z=J8a0-{b!^lz9vhqB2IMGNsIOhA3pnJVfRpLrI2^G-#5cLTEB1lBi@ViZmD-Or;Vk zN=gIYb6C6A{p|Ov-|zeReE<0V^WBe!?mf@D&f06Qz4kum-u78Lsi#8N-`C;Wg}1Lo z8;Tf9Z$SW_qU#2;O;fu7NNQS23tE@ zQNfJ0;j~VfmHn4kW)Fo^tE&(AM5);1X%*F76j(DF-^$6^)T6yJjFwfI=7#JKN537+ zvMiA@ORdZ&R;*aL#ai5~Xwu{2&4`H166D4*qc3BJ8BgZy594J|y7}XwE!Q|Ro#E&qUOJh1*J5-G<6}oHlv{j0 zGo3D#l6XN^?)`jc{d(yUdSe@f#3eZrrzE6O*$$+(=-JtLEvicqQ*o%eoLzo`>DU>g zrW6mIV>hDc_ow(Q^pJkL+boGjIf^kvu&$(Lt?0SW1NWFy<$lknG(4v_i{U!rMB9?y z$eyxj?}c#M;PXT4;xl3oN^bA(PqN*pT*+i$*WWF@aoZwoOPUM23fED(w5)YmA~H{v z+4SDC_a9vJ^|RPfBHt9Xs zYSF~1-ulMA&R^zZb(FA28NHi7!-IAKk7v>2V-a+ZXih4A5>(J%6mk3k9pg&(seu)J z-ZxBtW^5KJ7h9?X6T=0$f$wYhJquzJ&mg;@(yY}~!GGgrwuV_|&%1a%| zJ!MWQ%-^tqhU2z_W%`Hsq?Mk7u`>l5l8%*Hm5p5=UViYN!0cM=nsw=$>xuyQMC zcAjMWa5$HDhfMbV3zwyH&L-Ymb?`cU1jp7R9>eBz;q!X6FIek3mCA(o73#TIo$B)G zx@@ZdFuaQO$njzN^<93UVuC`_(w@ucm>RC^biW_^n?|o|{n@;F&+V)gD(MQZv*dS} zNyI5UUo0QLf848G?y;Vyp>cs}b#$Xpx!t2>A$_Z)(fy zGTUnQ8L7M0RjN67AC?eVL6@<^JZ*eahhMkV3Abp~@4l*)XEUqhE`kxmZkRxu zo*gQCGQH?TW$A|XUjlSPeY~}IRB5Y!*{qb&{!`gMw#e3gL7NsQh3=YC%>45L1FsV$ zq}J$rYCqOAJbWz5O3xVTMH=6TKD zH}3ZnwoL_Cs$Dwiao@~P!#ShhgZW~lMi_nLlJ%ptrUglciq~5nI4@DuQ>f9p7!jP( z_dt9qTaa_hs%xnY+hb$P5{ymG-j~dv6yNS@8gtEch%*+S*Pv(Hlfdh8&BN6!AlXUH z^_#TOnS%Me+xp9IcTQQ~)JPsr(`<6xn9(vQP9v3LXx>gTF3rEiX(7FVl9{oGZitPuI6G-zDJ>~NLJncfZ&`@}G*YsQi`=`6j;bjDHE zk0&43E_SAyTZD7k%Wj|pLXcJrf*g~G(b^UB+|ds+n+>(N}Zn}6S2?!nBy z-64;gEDiUnY0tNQ|K#msj-KmWJ@<1?T)HTBB)j^W%cIsb56$E6VmMVE?MhcR+fYWo z$M&{>x}QpV!OD9f&nU@BZ;oapp1v$>wPu}!t&En=ro?Gyo1J$Vb_m2K1Z3X3ACXle zP~vmiVVo^m@4>M{-o-Of+_@aDON!FyBORrW%cV6Jm^Mu8*vx2Lo!GW8VsJyShRqfZ zz3taRyT7IsRMX@wil7zHJbYPg(eL$ET)sw3NlEF==kh}sn3?!TR=$}jP32ID7ZBca zaKkmvfJL_6t6cYOJj2$!)}m}rrCF|VcZ_G?8a~-|ljjEg+16F>k=}n@>c_LSzMHDf z9GJ>9*L#%tyinkSz@wD|hgSby$tHHgMT%xxh1PRdjl6uANM@V#fzr2mCpSco`d?VL zm3u>hMWp}8Juk&2EM;FUd&2ZzcUw+Pmxm>+9DbR(;7qxTy-qBvFD;+LQkPz>M@2vP zXRcVxzUIisG@sMk(~mEF#5XZR32d8s;8%0HQ+xPoex}`(I~fMSy>6x=@&~zNa)H}wZ81Cv}RMnAbTM<>%%P5uBQR+ z`Gb3fvu`o|e{Nz#{+};dXm)L;(1df+2(mITrV#hl8wdu=BPhp6fq(Yl(V^alC!CpG zir7a+l-NgxpV&u+lh{XwQJ+`@K`Ggo%TSq}g0O<4il6Zk>$m?*e> z-W>if@__#1h5SnJ|MsYvbIX5cj~a4q61i6iDzkk~9FUJ9l4}z1qCkLuGh6E?| zXA`evneAiZbu;lt^2a13%4|#!uVn1Z+5;vb`5nOJfFpTwk%244(9bKx%h|_km%F}? zzl*bvp})@TE+>EAT4nBYLw~f}2xYUovzwWJPzYsfkQccV3h{0hxq4~)`+0b62ma@f zu!k(<+6}TSC;mvkpuH-bNk|lulj}GTM{B{zHH7Fr@fJO*{bx<=XLwc-9)bJAGvHYO zcx3Spmj`)RNOBS9R9Va_%Xs9>F+erh65h{?qj?Zt;xi=2iSw2K|%e(2%S8P$;*NNzhZnH=tn~y z=_v+zd=H2-5Ty7X5PKQt6fXh0kRBCy))L^;CJjxZh3*({CFVPr(iTV-azrg>8Fdh%_mWS~XIKGVWvtWM-#t*}@GuJVm4ac`I zj(+s6!+1X|uxr9N+B2yY;~L-x^lUovXE^lZb4*?y=AV9yH=;PiI6uV6D8^B4#?KgM z0Y87o_!F3CW-yL&NpnNHk^Sbxy(3wcV|*FR1Bw{00{gWvE(dW)>?=N7kbVL1j~&K8 zLcJas?|^we2;<1kD2$_LT@PTq7wo@)aSw>Y_ZSypo3r~9#&bardgc|iYY=Wgeq!=d zFb~s!Kae~P$T49299)0dFphEw;(JEim@|{I2$L6tc1d7d0LGCs#-X{C9E@|oe24D= zfpW~<#N-3X1`?$SA-ja+&_$B+!Dsi6vjV-pV7EP{zQ8KEP!}NyawXl9ODMi zuB{lahU>3A#!=38d{2i1pg#bUPXLEr#`p*vKgM_f)H@HxJ+eO@=2Z!duYmc-9OFAd zuRX>C!H~I{5akST4DaLi?!kqE|!}kap9u0OXAF`@&yMWE zLPK+l*y#pAxfO(IGtdJ}6s4XC~N9u4UJ!3ERP z1LMdK<0#kaE{wavF}~M>I*i*iO#T$aPXWfQ!2cB(Pl4-N1IDdkJU+sB6pXu{81Dvu zGD1D%#~?E6cV3K-!*yXP#=GG@O%CHvA?~+fd;t30597hJwGuhcF#Z+v6l44)7~6*N zYVZ#m*oE449`q|=+yUgbVtgFNDarwc^lXRuwg8j=0P){~@iJ&HH;g}|XBqShKgK)3 z&czrXgJUs_-v@aajGIEc6ftfE{pf`8TxeG`#)ZKT_?`t4;Qw+=UKXwwH5f;GOY~!0 z9_Ha+82<$Gm>kSE$Zv}w&TTP{a$26k_)G9JzIVWP&~p`&M|<4d!T4#=(~R*Pn7@8w z9OYzQ4EH<8{u%JUA;!;wJ?Q=j$;(6hT*BmO!5);;9m&4}J@nvL#D&4mK4-`Hk$Ufc6-IKE&Tb99m)g4d{2pcs|Sz0T^!rJEAb2 z5A*o}jIRQJ-ov;Ej3Z{S3)y)TjyW-Y0OEiT<7j>q#yAbcIiADc5%joW@@Nm2BN(Rz ze_q8n%5jSJ5J2{S1pU*P{C8--I9yked=dB)<%C1r0_;b7bs|0=^k-vw@*&>NV>}6X z5ynr0|0^+$_6|mS{-ApQ?2!i7H^e6)e&jLk3VzeX_+F4V#W?z%(GKIL&|WW$vx5CQ zG0p+)MZYT}JCDLV_zIJM2J`TrcqHb1@*EAge-KA;3fu(ZSr+4H9#qCS9rUj!#*i5 z#!&I|rW-%F4m!r}fQ50mGDc)p791#n!A@rN)@ znlXMH+SQHm-=O~u#;-#^e#SV;Ju!oE7l?CK@Hc8#GsKAi#_8eyM*`#5;CL;@OQBsF z7*7B{n_zqwjCZuxJ+emz#`|_mJ_h(sjHA7X;xPUM^y7O{*g(6oFnJ5`PZ7rNLBHR` zI1jYzKE|V=AGq8GWYNUpaEup2KgMCa8~ld$xI_LydqAXP^1C5U@-Qw6@p%Q~ zqtMh$yHwIW#hWto9pnsP`epdx3Xj9PPpR8snZYUeI1` zsDC}+cLoaNN|2M$6+uU?Q*$kWv zC(>nTotYOVkJ=kd#UT`CHHA}gvds&i-dHM5%CDQ1rce^8I4K_q{eF~+lk!0zpGw6^ z`AV4ov#B^KkJcOIQ*ly08paFCjfdK60sJKxX`0^2k37i{}g`>m=>@ zI(JB6rQ+mg$UoG3j*#*z!5%?O9{ER{ij(r_>B8kyoZ3Ii7)O5429DY#0`>Z1^1ESt zMPTxep7^{;9!uX9JGpvx(2hB8JH$|E#3qq&*kG zp0!k*)Q{psm5P({10b(O#YuVOAL>0#NclxDZs>7sC+$S*QSMQ3vR$??9;x>tA?1^xT^*SG7+iPys5mKK2l9hd zoYar{v?H z1`zBb#?kfV|K-L6$H0pQyy8zlqy9wFqXJIH*#=H{wz%PHB6TjxV-)~ zHzwNK0#5()Lh7I{vcv(Y6Nb^BkN$VhS0v7u)rkxP4d{Gc7$-)=)q4 zGg&`*Ym3((O)yd?o*R=5?lTnOewYxMEvSC5d3ojkW^PP=t3TDlJgGt9Bc52%+^T7{`l%+7A(Kpx`ST9hheWRTBc{QTXgxDCGtxSn$@9PD;w0KWr|!_~ylZgCf>7D0Bc{PfRBntM zvcVvku*5=46dE{VM$}sq&OsVvfHV*W5f;>^{G)%?%Y=iG&C$w~oxAT*XwVt)Goa5P z+0@z~>FYhBy{L6^2FZF(21&F?B8fRfj_e!cVV&MiqF z4U+oi-p0QOS%7Lto@?+r#t=rrZe=_B`jkI$ph`5J0%zA7BsKmyy922jX{P8>^eBcD z9f~`}g|d^fo%9#Qnc_G54n@7x5>gY)xWsGt>613QLr&b~o$>GpyR+(CHb^`^SmgI7ep=dn9Dcw zdX}HRpwR7NS@N_p>}~7ltK1LMtEYO>`)&t++VCmTEAx}G8bj3LxHW^@CIxF(yp^Tw zrGFJ$Z5DK=NLuz}{-bwUD!*6SZ;|KPxGJVCLh<>yk4c5QXJfg7sz~C~Q)X==?>rkj z_a_Omo&L2yW=jHp_|Mz(d!Mw`cvT1}-+WNB?q1recfNG4hvq9*j6E=#&u7~mbwfz? z&V_yKqV!9vr;j|iGgRiULHEl%Tr?!-+!r=lA+vC~$EuBS)ry8`rA!?Q>L=L*mW^z# zkombRA)wUe*Y$FBZq~8>Y^Ecif|YGoMnj6+5$;WUijtS>C`EFDTlSR>weTEdLNEO{+pX zqowVpZ`lp@l~nK=4T+7~*Kwa_-d!?W=de7rL~E&XLX3D}<);}DoeKiY1>MrmGV8o; zltj8eiZ>rz`mENP>72C&hxwQkGrMl>0z;uy-fJ~?M)vOswPLne=9m7KUd@R{nX}X{ zV}M>wN9g|Ybmb1F(|SwJD!6DJTA*C-VUXjk7`i9b-5{red%EGeQBD^3bjx8w=ZoBG zE@}}PC#42ltwiIOOGJhJzg z&iV9;w)dj3e60p&y~o$aOQ6Y>M!3I(}$apg2v z>)MqtD|}t$b4%dOO!gh`+#jwntACaDINryB>v3{^SU>yp70ScMtPa9*ZI*Ft zXSqE-M^Qgaw$lj|VoLrHoD`9Ln8y?(n+gqk4-SV-^+MKWTrznBVeY zR^!(G?8(NSsFu+u+Z&j!1wZHrp4eJKCo8!riY^t9_iG%)6Jn0<~AJd#84I z#e;QWXZTMTwN{Q?)g?d@3F2ir+(F$rYwF znhkeu|4NsZQwqB@0xwLM#xSrm~~8~;$@o5=CFT?65jKH8kDzD&ab zlZKpkwXUSbY3^~kcPn%>(#)UvN=gy?Q}*%au5r)19T==wy<$FQv&FfokIvJoisM@{ zOiA&v@jET;!tg|(+xcORg!@qFhKN@u#w&#nJh7c;lgazz>?~4D_|H9h9v*mm9?YSt&o_wTSr_SuY1x@pVBBDr>m8&z3MmELjuWHnh_6 z!^y2KyY+Y6S+^okQ`cGNv7kwoMbbo|PS(*$;XR$bae4Df4;InVwivlwFv`-X+v4`7 zLw^C`l8|(OIK5!3zueX(4Wh|C^F+Hn-gRYEab#t9zr(lbV z#>l!Qr^@a+SLM=|eJdQ%uDw97p1k&WWEIVP4_@|C$&$tk7aLU{FXQ`JuRNeF_uA1% zeoeRF#c@Ti)8cF<`>$>~8gQ1;i>t{++d|Cjbzubk#iC^y&zGI!IHS{P*16CoE=l2G zN&lilAI}YR{%jar>9;O3F{3=MQc-K;@^|I!fumk|YTE7f3AS#=FT`5x>v}b(cQ?$m zkBwWK7g~t)Zq zx6Ae}8SfIPmX`lI?>g_LJEFtu6L!V+&S%PCQ`~>*nOFO-H2FOOh8fo{oKD-lkF6Xy(zcu3znNSi*Pttx2A8fxQbZeQH|M>FJqJ;Pr6ooxx4UYX%<2%Jq!A>+L*fi%cYX zcBS`K6In>NGF6x*6*hHzF>l!JFfR)0F7Td-TK&+pVOrcKs8`BHAnb6Df~&p6(?|6T1c zM{8ZkDx)w3Lt@^UG!dHg)8?KiXqWiB`>F@mC0}E!IHz-FlIzx*Y!4gjxmbScnyJT= z!t7XS&n+(>K5`e|6ni~{L)|N~GOPY0`|kJ8p6_V%QK<-Uj!W8igyrL!Uco6P&O0jW zy}~kg>R(uq75nRbgX5%c_4(pA1xJ4*XnO zDJ*-pdvbT3czNc#H~rtTgnmpP*N*(feL`c;(Y}4{M|IAm9p}k>@T8|+$f0P@{k={uCu=?wib?+O;7YZrn z5@Pp1HOn7)&GKteWy+2d0Y|$GoQt`u-`eGuXfRCrM`_%9%ssa4ZPlwxJ|6pxuiDgQ zQ}Z&1meL;66}G?5&%fr$8^-X&p&=Jq2LY9;x39vRbh@-^=rr{gE=)N-GW7Xwy!--t zK^ns=hd(mYRF)ntE{YD>s=rnAZGPs^frc*5Gu$f7-P@W^J~pgrwaMStN_+jTt$2v0 zb1rukbN9R#Cmx&BsPtXh_mS4>vxE2qXNeYv^uQvTbuXO7C%95FZs+gwp66!wY59Q4 zuht-2rY;tPVm0$R4VuKUb>ghtDSCUJF~`@^mWn4zd!NQU{1ea9xF*Yq!MXqQ{8=-<5J$y0io zg`Ou<{dfax4tG6uqX~P(v%-Wc;A_WYFJ;U2#ui0;(W-Y(m)c2j7bog|Ut)CUY|q`L z3JXPQzPA?M>ssy8P{P2XI2yxs_hqa|&sfLl47Llq9U|fv+wn{Zk`%b*+4%S4#@wdt^uboHGa;0o+7mI&M$(8uuvZMY38Y~QU$_;gbD};6onDF)b49Kx0+FAPy7_b*aqxLNtTW4c=urxqkD2LgqmL`KE#W!r?%H|pOk*$OG#RLY}Z}jzt%{y>s zpG;DhrOf+hMpB2iJ~b6L@iLlZwzfG?qII%e#>rLePIRB}DV-pvMS=Xw7!F?#JuSm! z+IXb@b60WD<$4dTkaK=^MW6lnA}%znPbz4*xpLi1^2J+Ohh|=*m*npWNGo5ZI4gI#GY-7Nh@!<{JEp3h|T(U+2%VA@4u{L z3ROS(mF;q`dgG;?&v{Ciqb|^?P6Qm-|MjHX`zPL}J3qBa74MZX&FwmOXR)aG+qxxg zt{>@j9Jc1q&kO$S6q-{jAH#a&_33j;L2C*M*DtAbIN1Ma6QktPc=149i6Kj|d6_bH zN(ELoH~XxWt^cj}?0p*l?c%s2(b9+8h#X?|H|}zEKI?ydeb?C{c3y$BRCj@*8(&0L z%KPp`U)+q~_Z@UhCNq7pnMh`;N+dJYp%tes>d$AM=dav4)_-vsyZ>(i^;o4nU+(wq ztnk_re&46{Y_p%%>W7Cqa?;b%=6{&xXY_ddBW{VP&=UD8KTH<#d0K|kUtD~u=BRj4 zzR63!Fx7AIySdDr=c%`vbxZ20tZUF)yJ|~eX+V99^@&Dn%FV1e1IBThgO`J8+bo=FMPVB2oJ2IeEEBDq;>S5hj`sxt1 zgN=+zYWzLjo2BeIlvwKLJv95VVVfa;)v*9p@vCW}jps%(7>UgPUJ~=;rsNds^1`*A zN1NVj=Zz~apbQ_D3HU~+yc%yb5*S)pcQu|i#G3VjFE>C~YEjp9;Ui95U zPS&zwErs63GgeNAOXD+zosvBiQ^kn?R1Od~k|n;T&sok$eslj*OrSY`0K7rXJqmBo zarkMIlsl&Na-4~e)Oae*tU1>UZt;l`)rvLs@sU%o*ZOjycJrWK5gRWZ9q+Qu>uU_M zqLYqF_Ny+n5)+f)JDsN!{(b7F>ExMF23idoAMVd(SN)D#7jH`&H*j0SL=@uTZ&Ocy0@@d?DiRFoOWtx@BtK1{51yU~My$xmHAF*Ek;d#QZ($hy--J~pi z;;pzP>6&j07Th`-Dc^o*BKTQ=yagM>#s_=5w2v!#WSIxEjcsiyt1iAkckQz5!YJC> zN$DMjKL`vLyT7HgU((uA%O}(Q^KRs>_N%k2QPjWZ~bmQkeGg|P`GPZxcdG2mc9txVe#); z8?7d8U)uEO%&v^YYQdsgb%$bW?*EcHeORq?eJJ1OJ^HH_T1{~=*?e0*nEYtH#F1-m zQFp_)ig-)7N~@S3NVpMOan4z-Z?l7fvB@iX%|Vs)tqtZpDLw3+Lwe&|j@EDEaJ+xu z_hloG-bcf0BM;rTwb*${@27J{?LsGm8A=T4=sYpz-5rSJYO>wVJE8--sJU7o8J z#H4>)D>Hrn_TZ)N+Ql8W+nW#QO9odIcy4jp#{KebsejnDcoXr1R$^6hYNHHY;omfN z^>#|OUe3%2bL)A$B{?{3kI}9hU*1#?HJyEsv3OBxs8*@-ugiXpk*l}e%cpb9&>8v6 zzPeN3m-ov4%8GAwg^al^j_OBwQt7@J=}pjvDSTS5_j0>cb@&}oGQsKnuu~4ttDVP^ z7Z0ERxT7{^*GCTc+E$j4Q{y0 ztY*YdBq3a8x7FgH7~_ixVXZw@xh`Q8zfm{4{f$#gl?&DKwuh?kV^WJ>_GXpU`;*&0 zEexHP=RY={Q6cQRXuV&Jv`wvk$G(r9!Fz`cv}oPOmK&OhJS|oqytUFf>2+F(x=7l= z!vYc=ug^4ee-OB`@8!f!-B(K2^H$XFVPokjVW-)UYn35ho6CMIUz6LN%Psx;uG=@O z-wzwrs}hiRCa+tf~R8dN?=a02B-??5Xo^xL`B2u5HmVKS=AP3je-IC+HJG2=> zS#L5KYD^j4{i6N3e5@hD>etv=&ZTM$pC6x}K4LkzDQHCgkd#-W(6rjUtun0~tB&lv zxRd{+NBSWD{ewSRUs7}{cT2Swhfes$hUe3&|87~ck|WI2_;l&0_=>&@oJKL#AFUQV z+1&V%oA&wRV!qs_OFPx_(<|0iUA}lM{JVIOO7EspuZ9@KYU?lDcQ?IVm}E3_*KJ|) zqGkFoi;hS0#h=jju<(ivX;=1C?4VbVIL&$6yT3E3ip}@MK+nN)VPlIgZ7GJCI_GqC z0^9WJ19NWWmkD&5rs~SEC1v%!sLDIEoL}sYMT$i3A+fJvt8290JDk{_Hj(4NI`m9e z^cGhn9}mOw%e!vutmBn+XVHzj&yyV^knBurY*k~La=b?~d7gw3%g*@?u@)B=n!Psc zu}J&8MJg!gorm>kDgDKH!;9piXglJ~!noHc1uWt!mY5eZpE+zx>5HBIzaLty=p}w{ z`Z`uVAv`pT(plg9gvM|u1|+_I;CdUv6)(&Pdw#cOKbyN;QQ zur@!P4vMMTcp_gaD(ANdmT@%!~#KqE{K4aIt z*~^6aY?P%Etcz`x(q&3KaW(~I&;B?5~cxnzHJk~M4oHV|l=wS@hi`Vrbh$Bjl0 zEUle=&+jkl&QY)JdN?g9S01ktW4A&gIKXGVrS)I(I9qK@w;^wP0zxF${8Y`yVD(jaxb9w(J?)(5c z+pxk-X6>9;^j_<`cRW3^^?VP$+WX7I43tU) z-q>`1S<%h%6!q@)4OLfz*(QY*-4qjL>L;X)gTME#6-@X3I-S}1v@-3Np?#4Z|Bjb= zXEQguS_l@XO<&3s>`H1A3ShW%CST-xI>+(s^7kj1G&iyBuT^vn^U`OlO?lsW|8@A5 z1zcR84IHian(J8w$~zA&jFO&^dU|l5NQs~9E{3<~7UggA-`gphc6ohQ=ChT_?$r(> z_hjGgN%mg5^k!s5YL~VBw%$9PFF0a%{NQLl*kZ)sU|gfJ#?8aNqxW>pL%MB8GjH6R zc&-?7iXmNOlc!p1rpu;odHSbpAGUaAZ)b>#?7OFxPj`r2Wo^E}gXv4gA#Z}kP4$+0 zZJA_KS!h#t`PzB@PYSudoSGN6&Xf9fuWZ-!J4+uA0i`B|^08I*C9y9rWqlidx6nu- zg~>$q;_vk6J%@T^Y>e(*Q_>TEY8-NTV<}(5z?!$lt2^uV2oJtb-6jxea;oM2=MX3M zrjuM{HeBtUIeQX<3V(d7y)cqwsHQmhynKnM-W&Y}rP!=?>vFM!G7UWS#-W9|PHjsz z9p65jG%!`3CD;+UVZLX!SiX2eLhhs2g`;{mmFCZ@U`$XPKNa!TzWh$V>=l!n3fG@Y zK77R8uFSgCpUrtZhbemgLe4HB&vjOXFSZAIR3y$+y*MfLb8XtW$?NlC68F8F9JTH{ z8%}(iNnVwuw)e-b7aEnm>z~P)`YKO49ODhlOLgTe8+Yz>Yv`WXpZkPuabC-HCMm7A z-$lPF z#7BMAk<~V*E3FNzR!q~~eX{l4m(1y0-*NVM)6qiyD$YG&vGJ$*EY8}7w|_moCvhrU zWcj#>joRM5KPOAVzZ2P1dt}f3%+!5h*=Lj%8hERJz5cxJyWUgA;@bwqM7i86D9g0% zzF(_msta&o@w}cLq@~#ZmMdW2!j3WaZ6{YHv*^&Lh>v;yFipCk+gDkV$6y|D!iiR| zDI({opVFqyQq!Ef?8WCdE;{w~B$v=4*UvYXAKtF^;zBz^{EE{Z%WD(Zs#W+7rdfpr zH;h!$thsdLE_dIJtUEbX<$OB~FJuh579ErBiMdhMw*JDcc30jI@wgDL6yCj}2d{oE zT$Fsdn7ituscEh3zP6?FH8Rhsu5Zt{yHQv}tAX~Nmy5=D3eRx+56j9W?2~;H+FNg@ z_`ahNS#TcWSvoc5y^F+Qq zTHLy{)boSedEa&|ITel3tR~CXH0-qV7`)`nk39LjY~H0pi`|M|55I)xpN`k#czfYt z!yV%TIWLzm>v80@S}U7s3%-u?x!uOlJ)GT@V7Q{4Pua)T_)yuj?4FM|H{Q}Z^Q86O z%c#81KDJkNZasg#h<;0$;&IcFFtHTAx6;*#OT2y~T_#;oqI(5NS zoU|H~Tdaqcs=Z!YUGeR>Y?i@;s`oFpkGxT+oOvFjeP!qS4>oOj1@aP(x@+eJtDjY5 z`~B@@`w_EeuOq}+hGH%i?@pE7IX?8=hGwXur*wFMmh(vF@4d8x!gd<`InQeaIP}!N zZC$^El>sFw2b-F9FitB({Ww!R(;75re_8ATxYYblQO1v_ZNMX z|2-BS**V2__wGRv+q3~6K6huIeQ#|nGvbZwt!K_xY)vvU4WTYO?dk(do0B(dII<^Al=03AKz`*wPX>>z^0W)cTE0!Yzgtl zNhOEgD*c6%@$_%S z&;JWACOD}-0QAqsHNkHEMZWnj{Mldl%fIlkzi_(0_=o#1T<`<9&n0c1j2M}6Z>TAId=oAmUy=vp{hXlfbjI#NJL+uz5>ImFA~?@vlwV=otD ze^=)acLQfXHy?M3))q=|NRW@apEE_<-#5TH$lb){jzNGRkAv;~5-G+W4?m-^T zL^TB0cMthvDFv;8TTb*RIa*N;UhgJpyK30D8!q9lX}Qy--tg4PTI4OiZ3MMge;^y`IrZiUksf5C5~LRgt#u1Jo#81 z;^>)9QV;19#3QNX$z^|tCsT29IUM3AsW`QN&@+FeesUQ&lCPkWr?$U|ii=XozoFtw zs5p8Cg7go${txLN2YHe&rQ*M+_%bSva^>Rw=YXFyNiIeuzl@4g`*S&P@`dz2ESaUO z0#4c^PNheMij!9dWIxKGO3G9BJGufg6P#R2j|#eSk(|7S+moF@6m%s*9Obl{U4%z` zj(9k%EhYPcETo&jwAo|n*?<38s}F}1IVw)pi=ItWz<3Yo45Dbwz5JN~b&hC~Zy^663U!WX5=Fp3r_K>ga+FhyI!83gxuAbhE)!(`pLqm6 zNBkLiu_6j}j%ZR3%Jog1Bbww4&|lO!qDj7<_#+FN-;n;FpdZa|i0gqLsB=V*A_{emXcCn{yiwHwFfSlBcLY*U;=vi&# z|3SD=QRj#zBs6dfM-zNV%&{5hb+`NqDeg)K#n>`G|7WV1BgPMBbwxIz<%l+ z(Ij60_E6`DCiy+`AEHp_h$fL7%mdUpqDhXPHKWcEO>$-MGj)z=lAi_tpj@HIZ>}&N z(KC67%ft1TI!83A2iZxTBbwwW$1HV@Xp*Cxt<*W9Nse-uQs;;!c{cP5b&hC~mw+Fr zb3~IIP4BbwwAP%m|kXp*C6wWxDMle`1wAL<;@ zB;N!2sdGe=JOaie%0Y$V^AY%gI!81q{}irA7vTbjKxIeybi=Ob&hC~N5lEl zIig9P595M5M>NUvAa37d_4>m6Pn{#0l(&O;qs|dc@+`22I!83gD?u-Hj%bn#Li|wY zh$gu%_?bFKG|6>{KeABgh$cD81vCNrkl$or9;1QwA?^=xPHfXOTM(y#^HHvM#9QXX zC@7Z?;sWqRTmjP~3+>gyI32WW6UI3qZnt4P8{*RoTHOyo4!Cs_4 z7ut)itB4ze-$XI_FA)FKxuZ$bO<>%qVDheDr#{B>U_P|N_#)819phcVk74`@9G}HF zxb4q;jM}vc{BRwUe*^JWhjEmfsTJd)=za;~DEHc1jJLvl=4XtDf*+$GBG|1^`6K0R=7^x!+0;WYYgL#!08~~ z$&bmmnsCg4anxQxjHCN8NsPaN@wFD?Xpbj#j6VSTj4^Hu^O!xx*FgLPV7wWQBQZ`7 z_X$ZDcY<+>a-}0bd;$3yOx_auoEr zt;KlgT(uM(j4y{c4#qgz8zl|nYoNVPF@6d3|HAlF@PiPv1KHUF^OX_C%fS8sjE_P5 zqnxQo4-d$9Ve+|PXAj1oft{~0?g``fJ;qV)sWFV#LA!opd>ZCwaWo$g^^sji3)f{` zjNgFx^vC!ivVla|g>iY9pW`u({F{&QlQ0k0Vtfqd&#xGlfH)U{c?kKr9oo4K#%CZt>o8sbetV7ab1;tBq20*-^UyAogB_ff>3!2Fhp$$y6VvjgK%(64CE z5Tr*J;!qIA4dS0czZAyX;J!ow<7f{TZHyOzJ)1Co1^k(e@#8R#9$|b8j?vyt$j(V< z*9%NOALhqb80UpJ{D^Us+g%#`f%KQc__DybAH-QG#(zQ_reWL`KpGz#OaaC{Ks5)cn*7{3H@RfchNe_4ZZQE1mgj7P)q zbBx~rKfl8`%E>!{@w1?x2IgbbUpru2vt!&4#-||0YsnLdB872rI99;;AdEXLjMKw? z0{Z@n?BR$0+J?!aJ(IjJ&I8w@P>f%P_EYDACZ~p-5XUK){10f?8H~?^IJ}H;8SrNX z#?kka28?%s{1c38!@SXpaR!*@M=+iV{q-H=w$QG5@Hz75VX&VY<7iI;5saUL`BoO= zgTSeCM3eq}4%cM^OkNk}6Dy2wgLb)L{66?62;*YVFVPqmf_5Fo_&bn4jd4?$AJFg0 z$UpZWer{m$XF$(AjDH0`v}3#x+Vu+KKOz3dFzyNdq0Ti;`g1SzD+~ONi0rfn`}r{* z4)%*vaRh_kjN& zVf+&K`8mejpj~e;J_YuVVcZGo{fY78pnpCrW<~zDM)#i>R{*~WVI2KlFNyJXkY9uG zD!3l0Vw@HHV1RKG7%y8eUIOiMz<3o-ap&!LCehT7Y6~-0edZB{x_25rkjDLdf-DVi~fqBLb<7lre z4~#E>?_-e|_l5qV&h1Qgl{VCS43m$C@puN~VGvgrF&+%#r3&MIaQ|=@EI+wj7Na~U4bKejG^8DDh{rht@kjd2jy}<1G;Xt1-R`;!_DY z>c>Z5j|Rq90>^VZ?*tx=$tMF(!}v|$)fn#u-U1x;%Sy6wM0twIqxFREG5H#Z6YAW{ zq~E;3Z{IO_^#8N8qGT;|^Drsj5AqD6B>iW8HivnPS9BKtnYYon6QSay9$5%#F)B_r z3B~hDDo)C80{OMTQNMJ6Jti1OzuVhl{425Bp6-5Q9rVhjU&nn(b<hbJ7p{509c)AXRFR{}2UF{ek*v?$fzv3&>kK4Fup-N__6k4d@*5wwSC3 zhR^Jpeo{gLI85Utnk{G@6FNq(5Dw^&B1^m@b^cG!Urn5g#}=vlFxU;ZyCj+|fYBjE zjd(X}6KWWIg4T;x!u=dN0k?l0@xj0OuU~TRj3KgtL?Qi0_7SQEe%7IEB-p>z?+P8I zja7&pQmp@S{(1P`bBFkxy5Q$~5+CA>ly`@DPmcQJf01=1*uS;E$ztwAbUxXBat_1W zA4#y;`q2k-r%_Hq{c4zT*dZm1kpH*(zeD}V&t(0q#2=~#@%;oNb>ca_+u-_|4cC1_ zWVWFC(d%)7&YlmSqnBW~zQgp3@E>2J^H0P1e+1yoVK^V>=sd))5^qR`$8`#ve*+1^ zD{4Q&g~XeG^BoP+@glKvw@3Z0MqM>2fulBZb1`8UY}s)F19Z?==-2BLE(rGRqs z>k#?X1h1dGo&C4^yO+(KkDfD_JAzn42gEBe!F&IAa(b^`w^m_|C|R7C_v#w!(bD|W zA{t^g`RC}LO04z%d9N}1R)bj1!%d{6Rx)VRpKTHGIy>O&J*aX}zb9q!V^qPm#j~3J zRQM-7b6@(io=--hN||n7tZDODxY?4Jn*{Tt8TH;AO`)%=U&bTLWqyvA#daPKCokt+ z?rYaY7q1Wvui2ry+B3(thT*`W=jT3~6?E^?$yYNode^%?%wu8u+0TuG-!i9qc5i>1 z*?1;DN1l^$et*`g?1S@7zjv)=GvZ26XAXQuk#cY9IMFqMi8@ky&YuhiAgHLlt3&e$xMx;RxW)yCSxRiJjw0e9ABp#|eP z9>U_=7Qb9$IxeJ^)F-o9)oY{ZcZ=lAiXw%lt@qm&$hV5Wq>VG??wzmf9;tpjUzD@P z>^}3P$d29JQCG~?*Te?wPBE~h7G&<5sDNG^}LeAch_@aWK?OS)rP~VcF%&2ls6bkb~rYuSqQuF8naw-qLXmi`sCE} zfo*q|2h}@S@F?oJ`?%5j@As1$dKkN7gm+Kva`~qm4La+OJ08%JzscQlcsRqZhBaCB z0Z&zgVYh6m+Q9qI$#Q#h1cJ1>qlzVb#*(&)uOCu9ZZx=Ko%M0Cqv=6;64Fb%9z1*|7mRLPv%Tv#WbA z2d1WEtX{}`UFxLKW0!Sd?!g{g3oku+lxh^PnPI@M&-L5Tu8spylM!zP_s~aa=pJ9+ zYzmir-KEAhynO!wQ%Rio$K|bE0EW^I;=hK@EcAk#A zzFl4?erwh3pC$2=`QPk(a`wD0+RP&FC0c6RQ+!`%sW%U6+0iDtVbh+cI{I0C&T&T) z&-y2Py)~anc5_JQt)WcU>(3o6j=LYWnz7<9sIAae5bl|NDB}eF4G@MD_hTsY>Q|CMA>Uj)2@7j_Jr6kIxHh-pR;S zFPv;}h~9qLn#oZ?XhQv&bDVHs(%~8Dmph+&s@om+RgCGg`XwwZ+&>@`Kj7qS)qK^b zOytMkv-ZnVTEQX1@Ekm`~P&4=m^2 zvn;1s8+&{8XX$3M>ex3UxqS4EN<2d1~*q=<9*Eas3f-*u78 zq+@K9kBS}>J(^;`lvxqsOykF--!Q^IzT$8={Zf~4UG}K4oHSYgGQO$0BibgWFRlL< zd2b$1)%X5?o5zfaP#H2$kz}e2kt38L^AJMjp^Tx-91@YCD6=wV9*WFUNM=PDLXlY{ z<9)W)et*t)f8XEVeShzN?mzC`<8;n`?rX1gt!rIt?d|NnU#BdJnfx>=`~%OA#sEI* zu5jnaTxw{kCy#E;#kt)5k(rm}t>7D-3fFHu@6IK^D@w@UY)z+X z+TbRD@@B~lHs+*Hzc2E0c(h2^@ma(ZHHX^rsi;>Eo^2H9IFX2JB~8)5x2>X%fy@=6zK`k*Ss? z5LR*5=%PMyLdKhNrNv!mp=e6J}bOwTo}sTSzH~ zjQ1G>7iUdb0&WQ(?5o{>bRm5ER(?;PzWNj?w}dV|yBqWjUF=+2o5@mjgLEF@w^MHPU<=vr^xu zR>Fw{12)}6(i;6UZPpu-hBL?3bmj03SF*RV@&&qfNm~2eXjMtad59SThRMkyhjW5` z948xz7;KjBEYtrXALz02y=&IGRPpoCb;Cb6^TWmWcRKE!Hs-x~W$vc_woCRo2k(OT zn;E|(R3^KXa%s31n#)VHXi)s&4_!TbsTO{hsmyCg(nkuJW#|vd?1#m0`Ck2?H0L0& zXROgW!lU%t{i^57zJSl1BE@IF3l<99ZGPv+Vf$h9*Rek_T@p^53cM!MwY({3W?!z1 zTYT2?tQ&iNE2WWmx>9nJ*GFC6-SkCcD2D~!Ebnew(68YO!Bi^kZrxg2M@c0UyvSG{ zN1HxN$6%-e5x+!G6t(1aIi?M5Z;s1!7Am-M3+#kBkDW$@ z3DMUJ&BVz1o@JV4&{+uaHrWmqJd0x-fpUYsl@(zb8%2neGKO0DSS#GSXAA9$#G-ATF?WSkU^dEoyDhpd6CY`#xb! z+=kP9aPE&POQeiQxf)B^tp;sMlf?;vt&Y>dE0o&3r*tTGzeYwDYw)_WFN|e|G7cLd6(ASuc;DWRz%8lKe+3r%lO^TN=iYuUf5lads$?QvSIzGJdoF; zc#$B0Lhk-{$^y5}`}_Cr#iY!;%1pC$I1mouEAU?)A-WKDkDap!a~3&qqoQ4ZdP2?r z0B>@Z`wjf33H%H+ypEBR)#!!erq ztEv9(PxZADVzbSk_)f_5)^a*MsM&gmQ|XIklqi!oN_jZ>?CmkV@NN-b)<|;}qFUMu zKe=u+Mz)sSc{i9_vA~yEHt#ZA;Pabt6A^kfp+9P(~zn*Y@j-MFk(>3bq zRy3B}%sWv*7IE*Jal?xpzOV}h_SWBhn%;M?_)I@=8{JKnzuSDUwpGsk{zs+zbycBv zzk_%Va=f0+prcb}h-mk0F0^MIlo|8FUuNRm`TMsU)*o-8rhYg_A$ei4ThHWe=tFuQ zrmZu6^uv3iBWE2XqP=QMfTMDba2yUP{Iv?a?wQ6`j)O}{WMTT=4|BDTas|g8 z-VEP`46j21zulAp!bkk1!_ciig2~Smt5L9-_~70QsPZ2vI)c~b{5!JtUh%F)TIlA^ zvvNasOvwwpqMOpEctp*Q8^0-xBZ?C!k8cv|?h6us#$4t&k>z&w7=uf^b-9Zdt~{B@ z`#S^DemQQOukc)bA60xWQ?F^24(H}8lT;Q~Ho1Uq3LcM4$S&|c6Ge3K=jVGL1g30_ zs{5EPzA->Q^CC)o=CC}9c@#CC5S@f)xMBqkHgRiRLbx3#j z)1A>O+Lo7F#B^=f-p3_eP^aT8Zgi+>|K?>T$H7soO7n*GxZ(OnKZRdX^7Olr*^sQA zUy?5;6U$X&f{xYjDlg@K@tIjL8twQZ>=8JC9*$q6u3@j-^>@`l4d!8Lu>ltZS!&)0BKzhO9$-RbDh0UB9Vp@cb$2HN$MbhcAtY z#%c-Qz_4R^ad(PfszT!);sc>kvk~x{yPq^?mu=0sq~p zgt5?zx!&m5*&ZERC*4V|wyNf;Zp-0qjPP#D!}#WJE&QZs@)^$ullywI7eCbRw(cBY z{`u^b;qK>>)4IfbBb=FeOn+uX5-gMy6@QDVa4^^(x799xEyN;}(P;bGmbSL@SV$k^ z-Yv(8>e9Ob=cpP7jO(H^rOw}Q51^?XY9As!9v{w~_p z)IQh0Ma!EiXciPidLq5ts{{2A=XzoElhSRz65=o=oj1X#=VxmC9SDAPoeDK>RNubP1<*gQxv{jOm`yZ@@e@SX>L`k>L~Q1OEwD|n4Tzq!J67mt2gEY0RKb^G>H&f}{n z%_+^UvVN5R>S%HHw0XZaC;ICrTAV;brlBe`T8&G2bsUkk-}S!C+i_C%Q)^x~s=ZN{ zXX(axR4QL?hJPuQy2qYgo=36LzxEV=ko$pgeVX~}%sTtDA+D@99b*_JUXuCT!B0U~ z*?wM49)D$e&$}wpueS5lY$CBX&&^X#9<%HL=yj70n`g>HHRpE=dh0dDafAZQzWHss z9p7Q%jt<|Nq37Y}<1Lo%y<@iiMp~SOn9aT0Fne`hMAa6j+#xj>$E>#0T$fF}$h55} z$uFOcO{P7x%g#2uxx62Bca#-7f8hDJA!J;wktNx~>=++AuXn zb4VGF=BAeSQN$QuZ4Wk+jj6g%fYx20x8k*OkB-D;xliK5+*l;b&6+w47oD4O8G>p7g#j6agWeg0!y3=?B$AHInyQfuRh5nfvprpv21q4)A7 z@hau@vixeg^D1tB9r|KF$ke^Yx_SNP-A|#jpNw(c?vVvFJ-KRkpSSRf$t3@ed4q!c z0k$m-(P2+s=iKPnJD+e*aY6de3Px}DF(;dgH+5RY_eX+T)G6XCCva@m3w!z1PCIFu z_`QqE6{(q#zE5(m(DIg*V18t*>K{>D-;&DN?(F3D*y5AEpQby7Rh7Ig2rgPFs^ygm zi8lQRpGL2d{5kXSY<%^Ow43s77P)M*OGudc+Kn&L^3JQ|s;UKHqbI5)^3q$3b1=UR z@FmPC%6nW{a9HW><;F@P)uF7Rk^DGW0sn_4PGlc98=D8D`kD_0UnoR86~0iD_n9nk z;OLhU=@S!aA<0+rs|Wp;CC}&A;6IEJbhw_ONPA4Ut;F^!&-&yNc}4*1>g4-g3t!PH zlR!d|xnZ-!1(L7Jy6LI*xsDaLjNfIL3%qXnmMPU#82R(0B#F{hvd^zr@z$BO^^1Ky zf_l3hxh3b~L_-VRd$Fflae;du>-tqRyeV?)f@)YAp_a;)SQo zS!SxK?WT-L9m3yALUDIciYHn>tzGNN7dc)i>ZH2%B$x6oQx(40$=uUnl<8W-?}JFn z6Poz5sPK1hbrRNZaI#3h3NZ+1FQhH`*|Ggp=T3JEm3y%B(4KQ(RESv8#<%H2Ho`ul zOESg9blyb!**44BzaCr;szvoYY5n++?ZM?Do|>(fOH%gySI_#m%xl`rp9|4_~bOtmJsYMAY(%<=yedM}=P4_`a9VE@L5I;UCkYXXfkO1Xoh$xmG} zJZudLbSmF=Bz(G8Af1svXJ8aI*)UUH8QXeg%3vRt#c{}q#CiHQ;o5*QQP_27@c>^d za&3Bno(~s{9-ka-Rp0bYP4UWMR^xL|7HX{q&=ZA5bW_RuMx_V#aj)lDgS zgoM1Tb@Fd!WBYwl`o{0JY{UBHmW1mmGQPF1^L$xCo*#YbMVD)Ne9Yb`QSj8`^A{~% zxrr0z^v!4Dd`mii(M8;U=BcrP_YYI4KWV~5jLD~rc$FkK)ycAlXspgMRgsoR?@UfE z&GmnK8Tz)Zhw6Gto$nu?N(pfvHofXC20hfx=RM2YQ57xHbWCZbd_#oG(=Oi85Ee?$Fl}zSSXbFBwjY` zAvmsV^hD9;o6CO4{1b!rq#Gya(&Q~K_kYy=(Y2)ClEtL>k^V?bhDO{$_Su-FJO1^h zeHq=w%m&|0%p%KjY8kt@ya-6nuU(K9#OUZg$CYos@Y8aNYc-kniS6DH^TNAZ)pI)A zSC~G^X75TFFlGg{7qm)p#x|uya$WglYkfjT+t4R9k|^ZoQ|iMP*l+s!wOKD{UP$S?`ju^o-7k}7Enh{ z?&fZ*I9I2B*mY~}_~mE)qw~`FM6Du=?oT8hILcquwDOL5=)`V){Seu2FHipSjotOy z^&!ITws#EAQdEXhdhE}=Heb^|ceH4Vj9`7!!?8i>)xwHGl$UGIjecpB_&1&vsUE}x zzq@nqZ0t=+TQEx(SC4OJ++DaHwT(|0n5@9QR+9i_C^3oHVsaY8Uf2pZtF*SUb zysyrEOh>*y)C;;5C=yj?PMA;n@cr_mjy`9HtZA7#)54DbqYy6UFA?b49<<=z)5O8` zq{d}FLQE2kIje@QNWs_7VH=3Se|$jqX=!h1cK7cZ zaF7kWL)W9B>&md^q6ij;F3ZClzUKwHuK@lGnL^k3p#|d5YYp5>0F?=Z7T*zimkZ_@kgK^*%0M$gZN`>E<*OtL7rf1E<*eh zCjsI2C${Dy#4W+IBYueX!dgDqnv0M z;Ctv``xn4}Y|TYzn=g3w1zU3w;@!YMY|TZ8Z^C(k@E_K=!`57c?9YKXU~4Wy9M+=1 z)?9?RCFna}nb3t*U9D-yjCP{!Mcc;v8V!z}8%Zcq;TCX2I56gpd`m$JShg zcp*4{z}8%ZxHlLt*qVzFUjlK))?9=*9q1Qq%|(bWg7Jo}xd`!p(_Dmj5;$ICYc4|E z3gjoY<|4%5XX~*w7a<-E0*bA<2ys|z1Y2_v;+mjdY|TZ8`+?&lw&o(lPk?zCTXPZO zDPX)~Yc4|k1?X37%|(dASB0=O7aV#nxPeIJ`f$ z<|4#l?G|j!MTje4UeJQAxd`#2AU^Q3PY{D%u+|zOXdld7LBG%-`kp;n@V#qINvBn@IVlM zSYrZiZwRP&5@GKN=2cwC5VOGcW}qB?1pfu*?Mn#$8?3{>VE~r{w^s*Y51&7nBRCnz zb4LVE2J_@S1djphp$M)8jw6W(?gjEE55eJQ_bU-R6dc!@5j+6+*@NJ{px<{8d<4Xk z1oShs8JHZ#{TPCeg7&f__!>BV2_yI<$a^CMuLJ$=h~VyrwPG|H5S#$y2Rv`Vei8$_ zeuRAkhz|wu3%1Vz<%=UYtd*#X;2*#^4MA{4aNY=O=)>j14?A=r>fS;!jd>5>9Ab1zB=SOfw5Qp=6s2ge5=j2B@r-@sf2}f!J z>JU5vlmlzG!R54p{MuYtIo0_W+l{TwJ?8Nu5@yPOdG49K4x1SbUk3?MkHeF$p} z!1cnK0em3dFwX}5s316ecaArLUjqK*A@~UBuOS3y0PVuoAcX491b!=n@?d{vK_2QL z_#aUIEd(zE^9;6TAyifq@Z&zhz7L$wz#89hy|A`uE5e>0j3YAO7i=E@)~ONP1LOfc zf*XQ)>Lh|Qfc)V_a8*zatRVu|I}FBG6vBQP*cT%>H<-uz5quQb?<4pSXg?=7uEO=c z0`XKuaBDD*o*_6bC_fd!VGWyX1os4aSb*RuApX?|J^<#EIRv)@c|rz`Z?OMlAWzOA zxH`x~IRuXd_*r&C1eXTwwLx%v;J+J!?}PCRf3FPtnFQvsDTI9m=tmYfA2B%& z?ZXG=8BPRO2jvSOIIP_$f#5434%P^M2Jl1#uLQga!IeOs!x~s{yYxYxF#^9}ejl{= z8iE&reDFf>@0d12OA3PXg81hnIQ*M7)d*e-{AopSxZnE`91Z-LKyY||UqbNb;5?QZ z><72E28`d62wn~1$cNw~AkN|lz69c?fZ#@8oN6F=IvA%W2rdT3ksX2uf_V}im$3g! zpnroA_H|%<#US`3h(ij3D}wQrkKhWxz8b-`z zP6Eag++Mi8V+gJZ;>?cV&S0FLLGT+O&KD3o6xb^xIIIn?gWzb$G0buc!R^7iGlIK= zJoiO#UT|CvM{r3H{{#ewHS;qO{1V9LVg%m<@qLHjHDH`{A~+kUcLc%tKpxH@_$25r z_&f{lujhcn=dCc01o1xt;tlgQkSB}?4r>H*A$UAk7e(+i&@Nd7F9rUqAvmlJYk=U# z!Fa!o;IIa;8-lxn<2AMxBh()_UAe9AO7tJn8Uw$;)p0m8{}Ieg6o3$ITOL*{&^6eagL>~Ecm^on7s1zn|6vGz3B)-T!J7bof#BZ(&q448aJ(x+ z@BuKs>JS_swD&!NTY+{BBKRwihZ6|C5Bl*Zf`13?-9+%yAU|=zO;&I|kc0ElBM3eQ z`jG*_&w%m8j^Mb!PeBBSzqgV=a0`%cmk~SzjMHlfUI6U%5gb0QSRgq38?sIao(;zP zJp{K0JQ%^7!F(8v;4eWxCL#C>kPq1i{szRq7{T9x_}3tKCCHyP1c$Ye`w;vQm_NTD zcovu^*AX1ntl39!Ay6+V=BXZNf%Aj_=-B+-aiSmM6BYdW6J!u{m+7VQSNW` z|NM{K-}Haj|1Q}7%s+en{eaxx5QG1%{nUzo?XmkGIy52M?}}mn=6^b;NU@_w^0!|5u^v|vZ&zts>97x%Fu?uW{D;&jW5jpJn;VLKbU`=4`>6XY!tf5l^lg$LZRFKqQGVn6neza7*m1* z=HA|lzQZD@Sc0G({#$u++HyDkDH9dk=Xwo=9#%$gpwRuGhDBv`vnxBMCf8%Cl0Q|^ z^H60}SNi{{5WW0Q#j5BDLt{B3IjHi#^(l%>qk<3IKL4DsI`rq?+k;-mH0d~|dQ`+E zS665UCsfs8P;qelP-sO=Y%gJ`D-{ZTg99`@0`m#u>)*Q3jVLt!q2@WJ5H}uF73pDX z;hm+SovEocgw!21Qn(Q?O`O^7w5aayc_Q>hV z=_sRrLt#@!e}E#_|Aq%s7sh{U6xxSF0@bF#fr2VmjkMrUht{C!9S8cLcW4-C&w*0K z{HOO*kctIUFUXx69O}yGPip8bRrDMt4OG#t9IOZGnB2O-p@%|a%2Y+qqClvF>fPE< zfj*deJZVu8n1V$xfm6lQ{aX};#)XJFre)TDyF$)H?q(Ch|KY#>?`vyey84X;@4b#V*HdvMH+EPK&?Uj6pF_3S5^%@sVGvfieAO|3v~=DCOM$=#kh=uT$VUY z%kjgIV_a^A9D{~~E7PHgGMWM7r5=`-n0P3+9iFixHdqP4@juLy$bXUm(|?#$!}-s4 zOg1Z{e}O?FdssDQgrKUxp~w#vJnAYA8lfoCAy)-er;46J9Y!6B04o%M19eQ$#}6Cv zw+xKy5*VjsA#V}m7asr0=-$7@q0noG5mDt}MWO#dML~o9Z~kNa|1b8?IrRU@9_lDL z^oF(;X4FSsgj~avfC=&8)QG|a0u$t~hb}4xK_e9vfyqHv5h&jUpxNOqm{|Q>NmS9_ z|F$Kt8Ph$O83GJczrUrn;T`7hp@}lO1?nsbRPPT|;1;f{r$`@|kL0K-32s=)p%t_- zse2fcM%+WIAGj#Vj~){sv=|F}Z5%ippH&aDGxBhLJWOtTD7i5qZc+s)trk2@6>M;D zaDa&wmUsUt&H)pqzvX~Z|66Hl!HdvjSpG8)YrYhzxAL!p9stnJl{*wHQH@j*c4hu& zeo_v^_#fCttsJ;bNEKv)G4!iDd>+AdMvJNG75feoP%r@u;Rj4XLq3=HA8YW2^CaC2|8!(_10*9YEpq(a;V^&ZRS4iX| zZ;&0JB4m#%qx(^kjZ~pin1V3g5KslhVLqYITZi+eUsWGwHyl?Fs*31Q%qOafura8d zf1C>Yj9G=83i|?a$SK#Wm^J9jTdIo0kwZw*@Qs@E6J~V?GKM~Ug7~-Nq@Uy@JMR$6 zNp`sVLJrAE_IezVlkC6i1o|BnSWm4iSx*&w7t=?F6D@Y+T$w@CsDj(}4-T+5xy=}^ zH~nXPVm=?X2X*n_fEdS}8ikqu2ymc=hY({*juxpm{Mm!mf3j2+2jBqahiN|!a$Qab z8X>9?oX|$hbQVFtfeQ4r#&I=KM(-)3H$_H87Jr`jPyK%lS}=XybQ~pVZS8&@Gk#F` z&dzWmVg`-d=R>OqS!Ya&AE#DE6JfkM94&Gtn8fjesxth~l=7b~3Yad2{6TLXPD8tx zX=qRm-Hn+9FoRb3pQ-a0RKVZU1kCY1IuWymsnt^%8c>*%0X-6tdd1*PHmjG9Gb^cJ$KUL5-PK1^!~UpP2oF7G0_T8Swu(H4y%% z9jJ)QB$%=GA0Ut8g!$)+a~-2rV}WCNs9A$aj>AP)@b5dkju9U<@N&JO_@+*~^6m0s zru1_zLt;D*j_6|~L7W2b+4KB32vF2l6lE{_u?d)I;I(u8c<9F?b?t<@lK<1dP?zHj zM9tqW_@-7-Z2vm>Vyf{%WG8M4yC_~$-g4e{t|PbEg;<%~2R8?oM{Qp(-EgZENFjV6 z6nNI6e9OCAEU^^FXC&+`rGLzhnwne|kME^}v6M5~VlAbqt{0O}QCPQ$iPbJ$k$#jj zx6aSw`{LPtosx8R>x**3rqSj8BKIdD>pC_Pbx|SY^XKee^*TR2KieshW0tSqq>BI6 zxL5dqk%C;+!L0lTs*XRHof@y>omo`)^&{iryCgm+pOc=k=wl&A}|KMH38M)&ZD zerLR?B=*U$ig*(g*tZ{a_1bwS37duM1o#(Rn!DoSU*p}4-iYgNUFN92kIs9hb|e;8 zn)bSXV%FX9fhYyWm?|a-W!hn!N3SNb_lP-g#MZ0H#&y(~)m}T`9bap3-Z{Ta(=2?W zGsdi=>8x4D!HiVlA8FCWy!GN=W^-+4{jvhHA}pyp2?UN7A2DNWJ*({HGtW3FqCVmM zt|9x9FK*kJV)I%1PLCg9b8Rx0vvZ>;&oD^nPo0joP@Q7Hz0E(Wv~E8irdz~9vpvef zrMpkreUE2P-|uPjN&iO6gBL~G2WM?M$LCB|8C|ZMlJ2uF9TQ-C7iQS~q+ixaZ;M8p z_5HND#;A!O5B;Yj$4Y$pUiHZu2VN(nP5k|klCQ`#IOPtdzy&9*5B~R3JCpGvHc68O zSEmB;7>bm5kT6gnYh(HzPo_m; zFuzh(%z~?pUmaiX!%lsq-%JgaDzU(KUsEE}xN$X8B@FEL(=HTcQ;+*;U(YuzSs`|w!@Bvr z8^uvd#W++N$2G3&DvfQX^B%k5MC#N2EGYWC*#|uS6&i0+O24vV@`8Gs<_?=ih(Qqt$axbe@<6bHZhB>T*;jLZFv#U8ge zwSFDfP{cFBom+J0FG^~5xBik|5W8_N>B+U&81|Z;ck+#u3Ml6ezRv;A>|*TBaIg5q~V% znlnGv2g->=Wfnc8qLufj(^+{Z&!hd=*eq0}B%y&azgNpafh&jd;6%>2UqYwLxfYas zNVClaL6QZ^^oRaR9jzwv8Z*hQsEng5kxWMe_?~z*RH>KcPQ9Ma5P7j$^||tg*tWDc z|7S1ZSFJxPO^NkN?&?a6F3gdduSPzt9l296x^ruw`U53%SG$nwsUox2kBxsUlr{J* z$bV<^mZdLH`K~*{KAg24c9A1uD62n6@Q$%mlzD_v!UrMmOlsTAqR~^_L57(tRTMTu zS0_o|YL*Rjc6WDI3*u6x5X21`;HK-n(z4PDkh0_(>qet(U%FSy7LtvV58h#Lf1vRU zCH>laJXPVd*Ovk}blLiw(F(4<4?n*igw?I8i`*q14mJ`o6NzxtIe`ipQF<-%Rh1Li~IwpNpnm3z(lP z%lj}+(v*;E?<5tW;b*D8D*Vv4{`(7ufe#;^dgts2Cc7EA95`J;3F1}ad$SURoFdI} zeL>F}9{fy@__FQA<}sh46PhaZf~HBA%TA5S+earw8a8K>c3aG(l1oQX3dIDX5>MdJ z3PwsLn!8h17ri)}#%0zeXH>@hI8lv(_ocP{aXzk)xNgG9Jp17olM1}KJoNnsdJYXQ zdhZZj3eV&Y`(>NR6)UGV-Co4}Lul^deHJkpj&7Dl7yo22e^m?Rde;~_(TluGB{QlW z4Vyl;EKjGO>#W5S_3~^lkY!%yyl1S*d};U`>)bVs)+Iu`hmVHmvY(@@+4+@X+XsbB zhcq5)SW_!}Ot_Bs{oR?^`}3re3!a?l3l}*|_?-_Td9FV{O-DJ>&>3L9#3ygXD-uer zRW9Rou|ijUXN<)1QE$@B@&d66?S5~4!m`|+Ln@X2Qur%Z?VaLrvmIQG*8Q>c#eUu5 zMS?$a|DB}9l^gUeP{B);8t;&b2+a9I0 zCS|U&+3?6e6gxdBKr{A=^+{;Xih8NOE!}dRhTV()Bxk60IX*L!PiHJ-5&S>(}UCkH&~*8kWXm|wWJwrVq-|IkVH_V4J@TGQhLqbAdVf8?fF*!Nvh?_0mQ zFY$ni^kvwJC6k-ZmH4~(p)dWCn~wgG6CLEQy6vu;9?ci5%+qXrFm-c&G^4}RFq=QNdXHfl1y z#P`VW8%@2o>((6z{o{-B^?SARE$78dc~YIm(T!|9BgeJur4!#)4C0Q?OSDDAeRgtj&k@{o zqm#F-+xXBf?m2e9vq7cR>O1~B-q=&k2i+H`ruuhZSnRRxC$d}{qMEucF-AEMxTQrY zj=RCSAJDX+doe6Ya?EWoa7!RmI^iC5$~Wf*O{ys;$+2XN9bRb5t5eMnzVr9}3fxlq zs^oW%*Jyg3K#wh0Wmg1uD7RT?ok4+8-%nS#t@xnVzl8i=$_|aUn!@b_`zA{b%LK=p z%tN0nM^-2`KDF3;TE1F1yLi;>xv@9%DH6W7_RLGud~Z+e_{4lDjG#y`i8C&w@UV zd%+Sd@5F4iwyw!jY8LX2BN+Gm*r!LzW~mgqrIlI2?IEK>#G1$LUo-S?-QqR6)ig6t z&TDkLiOc62*=hT#D|@x4$xb^|3F@m}{bpaqRDG4nsi}oqUpel)k)8R~XBJJ}oQBHU zn|dN+gjaKm#mRDRDEBX%3A$03$-HP(>=(jk^M-vY%TW z^l>Tu3pX}zN+n*xDfke!gZIaaEBOA(dXE|BuLGkZlN<7qK4PoaxgIbEgxGIc{*ctb zl{EQr{6Nddy8euU+OA)g1^Hw(o?@r6wfSCU++&ud47cn|FxKNnEz#p z6IK&$M32rnKk?6?IB{!25C65ebF%+8ikgOcG?5OIL`OXzJ~y+(V7;y1mZ+J0g{7ND z`G&64QM1SX5fnzaH#uk6$84#3T3HH>1{2TmCUtRZGfH@osHJ7{s%YT9JDqS$iy}Yd zmRci|#K0O(iN&MeH#a;`z9rcwCF2K=nLYWI(am0c@@B$JoYq#q%N@QRon1$*Sp$K< zK;C!0s+THS%PO9T{&^}=J>9;W ze*g5)bs7U5k-?j^8_vd^=?iB>*N7hco?mG3%(36^sMxOkWNhYn(7*b5H@uIJP1Mn2 zuDX|9{JVbXsyShKlFR3As%O2=t#kTRC#27})b_nl_4PfbC0(B5WRNsJmYvh4SHb;9 zM&ztESN6>)(n_Ia;JtU55#MZs$>v36HxuPM zzn|){3)yGVc$BB$6+|&-y_5P_;Pqsk-CeW%s#o!O?r!m-uV$}nR6A?cO+J{?ZEzSj zSgU8%XcDKs9LaKwcN1ZFD`u_5+113Ep8qf@i=6OkhuuZyI^IpyHBwaKbh$RV!dCA< z{@n#;E3M=fNw0hH8|S4CKKsr0%(?6->*#AK>(19P+N+G^ALvJDJI5}u@{V`qKCP5- zQl!dnWPU1Wl@g}xqZ*RBeXPU=PgmZ4>Mkvz_&i_3$>D}bN1Cxj`i4jcnz0SRfTWfF zhK;(b&VO7Qx_cWOmacptGa%4?6&S0Pqd5leO|L9JN#yuVxl% z!ZoqfsLH1cu*|Yz3DCzoAFoGuKi-}40k71qiq!5S!N%pxrUc)F4En1Dn|GA2@JTzD zEXax+*a_wx5qr1(#z*I^&$Y~P;>q9B8sXn7ThTH;*<7wS=?-vfEuF^SUI~|(svEVJ zNo|hUaxx!HxtZae$9r>g$abON%0hu=ui?imso)L50gZW9jkFX`F?;z3*Fq^>8ONCE zlIg}DGK_~ajDH~Y7L{a7>3BQQX|ZOKr)o=X!Ig-A^OhVfyQ$u%ywP^W>nHM9n8t9J z*}av^HkG_G{F5dWVpklU4IepIZYxqZKKbH8?C@ztDS>F{h6#%CE9v-X!?<5=OQ}G` z)rj@)yJO~&WqcdOHwJ1WbMQMqln|viY!7{X(f5_Uw>jo3eVeyo-+ROHlr?u|k-3{^ z^|h|hc)fjIqg)){rQ+h4ciO|+@M|-!5t_Kjb*pq}PH=$IDcr;JZk|tT`I@YIURX@d z;?l4?ckGw=Q5K4IoaKOmetM>ej>h_}cA^%K7E@Z{G>ObNGn+(hCJE-XVsrNrmC9RO zRo}<)YzsJ{2dxE*?+o{`*!?2oB<#9+-KKW#skYH{cPQn}pV})%D+Tr(lc?wZr4$09MI-e__@(&=#8x}`@XaMS&%igx|M~96GDcYkPlP(;07v6o zUl`2~cLK$FQiX39{9ch$PKaF~kp5D=;$@sii}HApbYFWz*H|#F7eFr_pr=Ot-}J)Up-uG%MWo$w8x+v@EJA zT6x~{XM6Dznydaw)|{ucjF@^%|A!|lq55>fYaK;ym+A1bda>)#Ck9KOa@zfTVO~C; zU+G$F$C>ip(YNA}T4Xg9GkVpVA~uv@Bn;QSVy@J3?v6>x^9E(pQ0F_B4jgBtGQ}1& z+O3%$P$-St(Rz-1#za)yGf%9dcIvq<7XF~ky&iuq_UKwgW|`&iWEwF$#{O@cw4^^pByFYHM}e{`(_uJ9UVSm(@OQG!VE&F(!m~&i9%H ztfe*ATRl3$xXUcVziM*Zri*B$5pU%)zRZHs^b%eTAueAt%Ts#YV{jKKKv!BZ3%u@` z9I2~jeM6V-zG$pOnmJ9lLV}tiTON;FZ*X)R4SH*-%Qp}$8jDiRiI8_bMwpSh6dRm+ zjF~rvZj7KfTAuea&%ja^U2|QqIj_U+sO!wbWuNaBOOneipOTlKd%s)W9oxBYb@%$O z$;v2uwyQW!#d(xlqMr(XsIfh58@xzLu$ysOnCyO%wkB0oSK(~Q_N6=AuV={giFxk@ z=sU`jp7j67Mt>*t$>wAAo$Iuoe4ouoq~3ORKf=4TaHaI+hpyl1@q#mA*Np7H(O$u= z(_^j-6moy<77{lwz~@JW7#_qdQl1_MIHGe z^tKkHwH%}G-uin8cL!fxEK;|P9tugM$A46mM<&6gaW_|W!}&yNOpQIy1dqP=WwBmE zh1xV$N|9a)-U1pGmAZ^nZ8P&MTI*vO)h;Tkb(QP}UxYGn7J5zwbKQ%0rG#t#`eC}R zO{AW|J-Uzcu^PV!4Hh-@%+dxVO@apFGaup%CF@7lc^cu`EsrP6!PW2NfNhM1Vo z$4Fh1;`NWcqUpPnPp|n_x0SpKRYBKnELD1`2Vbbj&Yms0ggI0v>KvtKobg~@$WYra zE!>(9g|lv#Rb(iLP(M5I!bm4x1W-qM1hLAaWs~-kAx#3=mev#9TudCS zlXVnb=`|AWMJ}X2A=|p;nDgw1V7id@(dUW-S&w2ba%JINn~l$f+M!9@F{S_YJxQ3% z5%<a*iC$6_t1md&#-O`*=R@f z>>g_4a`v|oNzKd;of^75Pxq*rK%5c&y?noc`ByMv+Z6= zNXPj-t@BZ-LdMWLIz;2~I-aNQ2d0VIN2MWo477=yGJ@X;ofRpY!r7K7yf(BmXHHHW zSza5PWV}4ixIJGa*w=TaZ!&fxiBjK2N^LjHRl8gBvL}_=*Sm4>d;#C^1F!!VwRvZ< zIC5f~lc~6*@aF$+Zup@chiE7D7e3G4iK`j-I8GM$|H!ykgWFu-y)oMKnsU}hHK_M? zlp5_7?8cai^vd*T@ZQ>mlZIGDh7-p|r<=qKn%ld_F3OK_BpFAZD(9=^97!_$m`5hR zn$DeNO4t)eRy#A&znM+EmlP6tAiVyyYgc?d^x!eAyz-ONLErXITxu3*6JD)esBoxu z)UmkSKm8%tLek5`-q!p}+1Mj%y~5-tvzb-)1_oaS^Aut@JGe9Y{Ept~vA3gL4=OwP zrR>CG(yN{KqinnL6XQRSoTRNaxOM!>)_qY{wYQT57CAOVdUkra?roDLmd_4&wT*5G zlv_k)jjV63USe%ZT_iA*_q=+A_?k2M@wY)9vYTrTEjatJI9|)aQm@-tSVgG)eiKy9 z?x|O5G3vK8iWU{SGHNE_CI5Qo6DoXavF@wT*VddDZ-`p?snr8cCkB$NM`}`T_4Rzc zrjb?LzH~IX<+T8>Tq%K1VJJFXzJ=t(iC-z-e&HJl{#so)lWd%MJ3BS@-42nbDuV&z ztZjWAbJ~WR=Z`U2OOrpzUZnkfTCdCsE9HOSk~mN}^i(>nX4f9MaIw1}U(T-cUGQ7g zbw1T2tX(a#W~XOAEqt6Wv8Cj?*6aD?MN(I;K4H3X@@ht!V_0~b^_1re5i-iRx3*?n zo9YEPY>UFGwLe}&DN8pxJvK-cb)p_;~h_EGVm|kFTR%fa!%ihPsm@A+~a@nYMWgb>95-MFr5+O#Lf z?mo)m_F{W>OgDM4^NL$d_%SCs!>c&~5qy>oVia{}Z!cO^%zVnZ&3VmAX>(Y5+kR%j zc(h}T_3mCXdMJLe-uQl;;BJgp&81Hz)b^DROFo9vio4*;M4XTg(-Gk9Nk=QRX#Y_u zLKP^Oyzt7J?lTd&S<^gI7r@y)D79K*_4edg6J=wYK(O?e2e+8hd{%QSX69_T?Q$%P zXDb$LTl!RRxy$}!E%M2|b={LFzHo*-gOzllKFR*Pj+%Z-%umJo@N(<-KE^tY1yM1R zGOOjsq2YdF8h*0ZOHOC6_npVy~IbWCyF*`tW))avH{p5W&&V#xod_I5maOD6p> z-G-PhI%u?{Fn@5-H=EV8K)o!LVdVJu{S>YRv*df%D%|qpj*6tD5E{yb-JN`29HDu*{nUJjbs}BjXs}L+rK53}F2w<>p|?$qVyc|E0`0x3S^Nj|UkE$Z0~tke ziVfWtAKjwI!Mm-0=Iu9)bFM8(!ot@FxD{8q2xL}fyJ%l^q-w1ari*aJur*P$21LBt zxn7+AOjIepcXEtP|KXOg_}T^K&(tdS7=j+js4>a<+@`6+>B>;L(xp>%o22*1cYLEJ z9I}Npe}`v%*HqMq-h^up*PCpW;{|9?Z{oW&6{~Gy8RGiGQHHC+*A1sp| zyyxD!wy?-IqV97#WPvchDF20V$980Snl%@(+kQxlF%j;^@S~GYanWufIX`FIBxq^H zEZz{vc353;f1u!Q^x}*x4sE?u2d(Ci$Mo0AUny#gc=2nlnM$goarSKz-`M0>!?;;f z{=Crr5+oubAgzb~)0e|GP2%ENY^hx=TsdEH!XxPCytT*5pB(xYwf$yhD-Sh(+;nY^ zLJ=v)FMKB7rzm#3R3aAhk5}a2+m?k^;Aso%#w~Yg7DZit`O9jt0N*IftDj+B@qCX^ z>(6$7Z}Jf>F9Gh})0_J84ltn2 z_g=it?8;W(c6I!j@=HALS&bil!rM?~GO1L5{pOtbN@1R#)Ii+8?7m_4$bkyyjb%bI zy#&1H3><>@X|=_YZ`|^{Bdd3|WNaiY)xhhk*o8WC{c5pj_SdOv<$6`pc7aUzRyZG? zcE0&Iy&%ulpy>GJOsH7>ky=ffqu!otggjljBqU$`FO$BQITQ3W+w*f+;8r*b+nn^) zI|b8+-Ym53=dNhPYe+tRNO49h?RDquZX>fuBBQYg5z(y=#8E5KA{(dJucUfr458d? z_C~)bzK>7fUwT-veoZQ4KuP|oaL{DZ$>h(nK^rO$6-68yzOad_UnH`j&F&z;BiL`3 zi|6=t`TP%2J!za?W69!^)n>E`LAlE~xyM=M&5qaNnw{7nsImyzSrvG~S9|xWZhUI| z?`MQZSZthQNMafY#<8P7#)l;LU@zDyb(>Np+vN26&qM6r2v{dy@jcJ!~ zE{dc?U66OdD-k4j9%F5BxY=sT(k}ieZ8!uc;Clu?4io1wF2d5sN{{amI!&E0LQy36 zofta((DYO4*SJN-xE^O0j++nnSrc(C<}JKjZ@G6<|d%!+ojsw`b~=+_oUTc1Md*Qv5zaX}3ZtY;9VrU?yBYDK!(!{6pAS@3 z$`Vqtmy5o->K^ZP-Z}nuvzc^id)v-|0iCZ@bWy=EpnzT$mw@lVQrZQ~z}NgeS`)c?DixkpoJHTgx8&X?m)6R-dQG2mv*?e_?{V>!)3u@{dl|22Qt9*Na;#`7&TF)) z*?F#d)4PM$BtA6LCx-sK?;}(^f8G*i(#_Ka``haCdFtI?_A&J9bIy70XzMb_V;HRE z*pbYylGDoQ^h)zQU!XVKo0-@&Ah>qN=%JAD+R+ACynH;DO?w0i4{WqKx?B8ivU1Qe z*Rxz+YXnVf6qa^%H-{+)wC&;LII;SLU8}^7yf+K-b2qy>+r6zlC3{5U?G3xV{ZSfC z3rFNq7M7fOJ~egW;zfyX^%i8NJv122ev+Qk{LD*Ww(gPH{j$fl`!18S^PRq`S8{$^ zyjQ>X;RZ#IFnj*K zX}x}3i!XAm8d&67T6}#*nA!Rv%jp|-@dj3}-BEvJ8y9oZILo7BTQ-Dls;rE^a7^jJ z-HM0b#c4IK!=K-_GT<+9d2vRHS@O1BG9u2$)I-(UKRI^&>g>b<=Dd+vyK4ETtx->mC?CGXCSvfh%s>59; zRh$o16{+29tl(aKxu>KrrMcs%LNGU<-ii5{cURnMd&QS|?nZ#*p6S18?W-K8E8beK ztEVc@JjQXva=mx#7JB@lS(dp^=E_PrTbez}m~FvOI{WeQcjfg)BHxb1Z{}@x&Hb?9 z)u(mggAK!+3U*l%Q}=CY@Vq;Dps}e_cIAGTY9Sr(m8!!>)1;hbL#mvMKBT_AkgW5L zyQ#aj#m}v=*0)QhEL42cK#a&%`O-9R;V*%8v>~yH?`mCxOLeX&4o=b)H{f}-HgW%( zZ#@g$PiyO|#9Um|{=S>R+w;iOL}AK|C;MD8>3wr}H|MRlx1OzisPCB0A(L0j4-9S_ zU!yu`+8}p8W5L1t&bz%cEYTl8aw>i7!jrlD znZoC;{Cv$>6rH*>^sRm5(r3+_j^a+b+rNG73$m4Q-|75TI=eJ#T}RyMz}{zlM^)Z! zb)VCtc4GdUG|2gRTW!SMt$n~wEFvKV(U ii`OW{O{H9aI`-SBLg; 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

S+GR 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 literal 0 HcmV?d00001 diff --git a/x86_64-efi/tinf.h b/x86_64-efi/tinf.h new file mode 100644 index 0000000..106203a --- /dev/null +++ b/x86_64-efi/tinf.h @@ -0,0 +1,117 @@ +/* + * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) + * + * Copyright (c) 2003 by Joergen Ibsen / Jibz + * All Rights Reserved + * http://www.ibsensoftware.com/ + * + * Copyright (c) 2014-2016 by Paul Sokolovsky + */ + +#ifndef TINF_H_INCLUDED +#define TINF_H_INCLUDED + +#include + +/* calling convention */ +#ifndef TINFCC + #ifdef __WATCOMC__ + #define TINFCC __cdecl + #else + #define TINFCC + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ok status, more data produced */ +#define TINF_OK 0 +/* end of compressed stream reached */ +#define TINF_DONE 1 +#define TINF_DATA_ERROR (-3) +#define TINF_CHKSUM_ERROR (-4) +#define TINF_DICT_ERROR (-5) + +/* checksum types */ +#define TINF_CHKSUM_NONE 0 +#define TINF_CHKSUM_ADLER 1 +#define TINF_CHKSUM_CRC 2 + +/* data structures */ + +typedef struct { + unsigned short table[16]; /* table of code length counts */ + unsigned short trans[288]; /* code -> symbol translation table */ +} TINF_TREE; + +struct TINF_DATA; +typedef struct TINF_DATA { + const unsigned char *source; + /* If source above is NULL, this function will be used to read + next byte from source stream */ + unsigned char (*readSource)(struct TINF_DATA *data); + + unsigned int tag; + unsigned int bitcount; + + /* Buffer start */ + unsigned char *destStart; + /* Buffer total size */ + unsigned int destSize; + /* Current pointer in buffer */ + unsigned char *dest; + /* Remaining bytes in buffer */ + unsigned int destRemaining; + + /* Accumulating checksum */ + unsigned int checksum; + char checksum_type; + + int btype; + int bfinal; + unsigned int curlen; + int lzOff; + unsigned char *dict_ring; + unsigned int dict_size; + unsigned int dict_idx; + + TINF_TREE ltree; /* dynamic length/symbol tree */ + TINF_TREE dtree; /* dynamic distance tree */ +} TINF_DATA; + +#define TINF_PUT(d, c) \ + { \ + *d->dest++ = c; \ + if (d->dict_ring) { d->dict_ring[d->dict_idx++] = c; if (d->dict_idx == d->dict_size) d->dict_idx = 0; } \ + } + +unsigned char TINFCC uzlib_get_byte(TINF_DATA *d); + +/* Decompression API */ + +void TINFCC uzlib_init(void); +void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen); +int TINFCC uzlib_uncompress(TINF_DATA *d); +int TINFCC uzlib_uncompress_chksum(TINF_DATA *d); + +int TINFCC uzlib_zlib_parse_header(TINF_DATA *d); +int TINFCC uzlib_gzip_parse_header(TINF_DATA *d); + +/* Compression API */ + +void TINFCC uzlib_compress(void *data, const uint8_t *src, unsigned slen); + +/* Checksum API */ + +/* prev_sum is previous value for incremental computation, 1 initially */ +uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); +/* crc is previous value for incremental computation, 0xffffffff initially */ +uint32_t TINFCC uzlib_crc32(const void *data, unsigned int length, uint32_t crc); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* TINF_H_INCLUDED */ diff --git a/x86_64-efi/tinflate.c b/x86_64-efi/tinflate.c new file mode 100644 index 0000000..fc609fc --- /dev/null +++ b/x86_64-efi/tinflate.c @@ -0,0 +1,475 @@ +/* + * tinflate - tiny inflate + * + * Copyright (c) 2003 by Joergen Ibsen / Jibz + * All Rights Reserved + * http://www.ibsensoftware.com/ + * + * Copyright (c) 2014-2016 by Paul Sokolovsky + * + * This software is provided 'as-is', without any express + * or implied warranty. In no event will the authors be + * held liable for any damages arising from the use of + * this software. + * + * Permission is granted to anyone to use this software + * for any purpose, including commercial applications, + * and to alter it and redistribute it freely, subject to + * the following restrictions: + * + * 1. The origin of this software must not be + * misrepresented; you must not claim that you + * wrote the original software. If you use this + * software in a product, an acknowledgment in + * the product documentation would be appreciated + * but is not required. + * + * 2. Altered source versions must be plainly marked + * as such, and must not be misrepresented as + * being the original software. + * + * 3. This notice may not be removed or altered from + * any source distribution. + */ + +#include "tinf.h" + +uint32_t tinf_get_le_uint32(TINF_DATA *d); +uint32_t tinf_get_be_uint32(TINF_DATA *d); + +/* --------------------------------------------------- * + * -- uninitialized global data (static structures) -- * + * --------------------------------------------------- */ + +#ifdef RUNTIME_BITS_TABLES + +/* extra bits and base tables for length codes */ +unsigned char length_bits[30]; +unsigned short length_base[30]; + +/* extra bits and base tables for distance codes */ +unsigned char dist_bits[30]; +unsigned short dist_base[30]; + +#else + +const unsigned char length_bits[30] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, + 5, 5, 5, 5 +}; +const unsigned short length_base[30] = { + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, + 131, 163, 195, 227, 258 +}; + +const unsigned char dist_bits[30] = { + 0, 0, 0, 0, 1, 1, 2, 2, + 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, + 11, 11, 12, 12, 13, 13 +}; +const unsigned short dist_base[30] = { + 1, 2, 3, 4, 5, 7, 9, 13, + 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, + 4097, 6145, 8193, 12289, 16385, 24577 +}; + +#endif + +/* special ordering of code length codes */ +const unsigned char clcidx[] = { + 16, 17, 18, 0, 8, 7, 9, 6, + 10, 5, 11, 4, 12, 3, 13, 2, + 14, 1, 15 +}; + +/* ----------------------- * + * -- utility functions -- * + * ----------------------- */ + +#ifdef RUNTIME_BITS_TABLES +/* build extra bits and base tables */ +static void tinf_build_bits_base(unsigned char *bits, unsigned short *base, int delta, int first) +{ + int i, sum; + + /* build bits table */ + for (i = 0; i < delta; ++i) bits[i] = 0; + for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta; + + /* build base table */ + for (sum = first, i = 0; i < 30; ++i) + { + base[i] = sum; + sum += 1 << bits[i]; + } +} +#endif + +/* build the fixed huffman trees */ +static void tinf_build_fixed_trees(TINF_TREE *lt, TINF_TREE *dt) +{ + int i; + + /* build fixed length tree */ + for (i = 0; i < 7; ++i) lt->table[i] = 0; + + lt->table[7] = 24; + lt->table[8] = 152; + lt->table[9] = 112; + + for (i = 0; i < 24; ++i) lt->trans[i] = 256 + i; + for (i = 0; i < 144; ++i) lt->trans[24 + i] = i; + for (i = 0; i < 8; ++i) lt->trans[24 + 144 + i] = 280 + i; + for (i = 0; i < 112; ++i) lt->trans[24 + 144 + 8 + i] = 144 + i; + + /* build fixed distance tree */ + for (i = 0; i < 5; ++i) dt->table[i] = 0; + + dt->table[5] = 32; + + for (i = 0; i < 32; ++i) dt->trans[i] = i; +} + +/* given an array of code lengths, build a tree */ +static void tinf_build_tree(TINF_TREE *t, const unsigned char *lengths, unsigned int num) +{ + unsigned short offs[16]; + unsigned int i, sum; + + /* clear code length count table */ + for (i = 0; i < 16; ++i) t->table[i] = 0; + + /* scan symbol lengths, and sum code length counts */ + for (i = 0; i < num; ++i) t->table[lengths[i]]++; + + t->table[0] = 0; + + /* compute offset table for distribution sort */ + for (sum = 0, i = 0; i < 16; ++i) + { + offs[i] = sum; + sum += t->table[i]; + } + + /* create code->symbol translation table (symbols sorted by code) */ + for (i = 0; i < num; ++i) + { + if (lengths[i]) t->trans[offs[lengths[i]]++] = i; + } +} + +/* ---------------------- * + * -- decode functions -- * + * ---------------------- */ + +unsigned char uzlib_get_byte(TINF_DATA *d) +{ + if (d->source) { + return *d->source++; + } + return d->readSource(d); +} + +uint32_t tinf_get_le_uint32(TINF_DATA *d) +{ + uint32_t val = 0; + int i; + for (i = 4; i--;) { + val = val >> 8 | uzlib_get_byte(d) << 24; + } + return val; +} + +uint32_t tinf_get_be_uint32(TINF_DATA *d) +{ + uint32_t val = 0; + int i; + for (i = 4; i--;) { + val = val << 8 | uzlib_get_byte(d); + } + return val; +} + +/* get one bit from source stream */ +static int tinf_getbit(TINF_DATA *d) +{ + unsigned int bit; + + /* check if tag is empty */ + if (!d->bitcount--) + { + /* load next tag */ + d->tag = uzlib_get_byte(d); + d->bitcount = 7; + } + + /* shift bit out of tag */ + bit = d->tag & 0x01; + d->tag >>= 1; + + return bit; +} + +/* read a num bit value from a stream and add base */ +static unsigned int tinf_read_bits(TINF_DATA *d, int num, int base) +{ + unsigned int val = 0; + + /* read num bits */ + if (num) + { + unsigned int limit = 1 << (num); + unsigned int mask; + + for (mask = 1; mask < limit; mask *= 2) + if (tinf_getbit(d)) val += mask; + } + + return val + base; +} + +/* given a data stream and a tree, decode a symbol */ +static int tinf_decode_symbol(TINF_DATA *d, TINF_TREE *t) +{ + int sum = 0, cur = 0, len = 0; + + /* get more bits while code value is above sum */ + do { + + cur = 2*cur + tinf_getbit(d); + + ++len; + + sum += t->table[len]; + cur -= t->table[len]; + + } while (cur >= 0); + + return t->trans[sum + cur]; +} + +/* given a data stream, decode dynamic trees from it */ +static void tinf_decode_trees(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) +{ + unsigned char lengths[288+32]; + unsigned int hlit, hdist, hclen; + unsigned int i, num, length; + + /* get 5 bits HLIT (257-286) */ + hlit = tinf_read_bits(d, 5, 257); + + /* get 5 bits HDIST (1-32) */ + hdist = tinf_read_bits(d, 5, 1); + + /* get 4 bits HCLEN (4-19) */ + hclen = tinf_read_bits(d, 4, 4); + + for (i = 0; i < 19; ++i) lengths[i] = 0; + + /* read code lengths for code length alphabet */ + for (i = 0; i < hclen; ++i) + { + /* get 3 bits code length (0-7) */ + unsigned int clen = tinf_read_bits(d, 3, 0); + + lengths[clcidx[i]] = clen; + } + + /* build code length tree, temporarily use length tree */ + tinf_build_tree(lt, lengths, 19); + + /* decode code lengths for the dynamic trees */ + for (num = 0; num < hlit + hdist; ) + { + int sym = tinf_decode_symbol(d, lt); + + switch (sym) + { + case 16: + /* copy previous code length 3-6 times (read 2 bits) */ + { + unsigned char prev = lengths[num - 1]; + for (length = tinf_read_bits(d, 2, 3); length; --length) + { + lengths[num++] = prev; + } + } + break; + case 17: + /* repeat code length 0 for 3-10 times (read 3 bits) */ + for (length = tinf_read_bits(d, 3, 3); length; --length) + { + lengths[num++] = 0; + } + break; + case 18: + /* repeat code length 0 for 11-138 times (read 7 bits) */ + for (length = tinf_read_bits(d, 7, 11); length; --length) + { + lengths[num++] = 0; + } + break; + default: + /* values 0-15 represent the actual code lengths */ + lengths[num++] = sym; + break; + } + } + + /* build dynamic trees */ + tinf_build_tree(lt, lengths, hlit); + tinf_build_tree(dt, lengths + hlit, hdist); +} + +/* ----------------------------- * + * -- block inflate functions -- * + * ----------------------------- */ + +/* given a stream and two trees, inflate a block of data */ +static int tinf_inflate_block_data(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) +{ + if (d->curlen == 0) { + unsigned int offs; + int dist; + int sym = tinf_decode_symbol(d, lt); + //printf("huff sym: %02x\n", sym); + + /* literal byte */ + if (sym < 256) { + TINF_PUT(d, sym); + return TINF_OK; + } + + /* end of block */ + if (sym == 256) { + return TINF_DONE; + } + + /* substring from sliding dictionary */ + sym -= 257; + /* possibly get more bits from length code */ + d->curlen = tinf_read_bits(d, length_bits[sym], length_base[sym]); + + dist = tinf_decode_symbol(d, dt); + /* possibly get more bits from distance code */ + offs = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); + d->lzOff = -offs; + } + + /* copy next byte from dict substring */ + d->dest[0] = d->dest[d->lzOff]; + d->dest++; + d->curlen--; + return TINF_OK; +} + +/* inflate an uncompressed block of data */ +static int tinf_inflate_uncompressed_block(TINF_DATA *d) +{ + if (d->curlen == 0) { + unsigned int length, invlength; + + /* get length */ + length = uzlib_get_byte(d) + 256 * uzlib_get_byte(d); + /* get one's complement of length */ + invlength = uzlib_get_byte(d) + 256 * uzlib_get_byte(d); + /* check length */ + if (length != (~invlength & 0x0000ffff)) return TINF_DATA_ERROR; + + /* increment length to properly return TINF_DONE below, without + producing data at the same time */ + d->curlen = length + 1; + + /* make sure we start next block on a byte boundary */ + d->bitcount = 0; + } + + if (--d->curlen == 0) { + return TINF_DONE; + } + + unsigned char c = uzlib_get_byte(d); + TINF_PUT(d, c); + return TINF_OK; +} + +/* ---------------------- * + * -- public functions -- * + * ---------------------- */ + +/* initialize global (static) data */ +void uzlib_init(void) +{ +#ifdef RUNTIME_BITS_TABLES + /* build extra bits and base tables */ + tinf_build_bits_base(length_bits, length_base, 4, 3); + tinf_build_bits_base(dist_bits, dist_base, 2, 1); + + /* fix a special case */ + length_bits[28] = 0; + length_base[28] = 258; +#endif +} + +/* inflate next byte of compressed stream */ +int uzlib_uncompress(TINF_DATA *d) +{ + do { + int res; + + /* start a new block */ + if (d->btype == -1) { +next_blk: + /* read final block flag */ + d->bfinal = tinf_getbit(d); + /* read block type (2 bits) */ + d->btype = tinf_read_bits(d, 2, 0); + + //printf("Started new block: type=%d final=%d\n", d->btype, d->bfinal); + + if (d->btype == 1) { + /* build fixed huffman trees */ + tinf_build_fixed_trees(&d->ltree, &d->dtree); + } else if (d->btype == 2) { + /* decode trees from stream */ + tinf_decode_trees(d, &d->ltree, &d->dtree); + } + } + + /* process current block */ + switch (d->btype) + { + case 0: + /* decompress uncompressed block */ + res = tinf_inflate_uncompressed_block(d); + break; + case 1: + case 2: + /* decompress block with fixed/dyanamic huffman trees */ + /* trees were decoded previously, so it's the same routine for both */ + res = tinf_inflate_block_data(d, &d->ltree, &d->dtree); + break; + default: + return TINF_DATA_ERROR; + } + + if (res == TINF_DONE && !d->bfinal) { + /* the block has ended (without producing more data), but we + can't return without data, so start procesing next block */ + goto next_blk; + } + + if (res != TINF_OK) { + return res; + } + + } while (--d->destSize); + + return TINF_OK; +}

TM_i^^@fW6p~=VzS6VhBxC)`3tRILB9^ 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 z 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