From e54a2cfb4022035684d2b94f970b67db7617dfdb Mon Sep 17 00:00:00 2001 From: Andrei Gherzan <andrei.gherzan@huawei.com> Date: Mon, 22 Mar 2021 21:48:35 +0000 Subject: [PATCH] docs: Add structure and initial content Signed-off-by: Andrei Gherzan <andrei.gherzan@huawei.com> --- docs/README.md | 17 + docs/build-flavours/build-flavours.rst | 40 ++ docs/build-flavours/freertos-flavour.rst | 49 +++ docs/build-flavours/index.rst | 17 + docs/build-flavours/linux-flavour.rst | 60 +++ docs/build-flavours/zephyr-flavour.rst | 48 ++ docs/demos/index.rst | 14 + docs/demos/smart-panel.rst | 30 ++ .../adding-hardware-support.rst | 84 ++++ docs/hardware-support/boards/96b-Avenger.rst | 414 ++++++++++++++++++ docs/hardware-support/boards/96b-nitrogen.rst | 107 +++++ docs/hardware-support/boards/index.rst | 16 + .../boards/seco-imx8mm-c61.rst | 182 ++++++++ .../boards/seco-intel-b68.rst | 212 +++++++++ docs/hardware-support/index.rst | 18 + .../hardware-support/virtual-boards/index.rst | 16 + .../virtual-boards/qemuarm.rst | 63 +++ .../virtual-boards/qemuarm64.rst | 63 +++ .../virtual-boards/qemux86-64.rst | 63 +++ .../virtual-boards/qemux86.rst | 63 +++ docs/index.rst | 17 + docs/ohos-build/index.rst | 14 + docs/ohos-build/visual-customizations.rst | 49 +++ docs/openharmony-quick-build.rst | 79 ++++ docs/repo-workspace.rst | 77 ++++ .../assets/meta-ohos-arch.png | Bin 0 -> 54898 bytes .../assets/meta-ohos-arch.png.license | 3 + .../assets/ohos-build-arch.puml | 28 ++ docs/yocto-build-system/index.rst | 16 + docs/yocto-build-system/ohos-build-arch.rst | 23 + docs/yocto-build-system/yocto-project.rst | 63 +++ 31 files changed, 1945 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/build-flavours/build-flavours.rst create mode 100644 docs/build-flavours/freertos-flavour.rst create mode 100644 docs/build-flavours/index.rst create mode 100644 docs/build-flavours/linux-flavour.rst create mode 100644 docs/build-flavours/zephyr-flavour.rst create mode 100644 docs/demos/index.rst create mode 100644 docs/demos/smart-panel.rst create mode 100644 docs/hardware-support/adding-hardware-support.rst create mode 100644 docs/hardware-support/boards/96b-Avenger.rst create mode 100644 docs/hardware-support/boards/96b-nitrogen.rst create mode 100644 docs/hardware-support/boards/index.rst create mode 100644 docs/hardware-support/boards/seco-imx8mm-c61.rst create mode 100644 docs/hardware-support/boards/seco-intel-b68.rst create mode 100644 docs/hardware-support/index.rst create mode 100644 docs/hardware-support/virtual-boards/index.rst create mode 100644 docs/hardware-support/virtual-boards/qemuarm.rst create mode 100644 docs/hardware-support/virtual-boards/qemuarm64.rst create mode 100644 docs/hardware-support/virtual-boards/qemux86-64.rst create mode 100644 docs/hardware-support/virtual-boards/qemux86.rst create mode 100644 docs/index.rst create mode 100644 docs/ohos-build/index.rst create mode 100644 docs/ohos-build/visual-customizations.rst create mode 100644 docs/openharmony-quick-build.rst create mode 100644 docs/repo-workspace.rst create mode 100644 docs/yocto-build-system/assets/meta-ohos-arch.png create mode 100644 docs/yocto-build-system/assets/meta-ohos-arch.png.license create mode 100644 docs/yocto-build-system/assets/ohos-build-arch.puml create mode 100644 docs/yocto-build-system/index.rst create mode 100644 docs/yocto-build-system/ohos-build-arch.rst create mode 100644 docs/yocto-build-system/yocto-project.rst diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..76c5e1dd --- /dev/null +++ b/docs/README.md @@ -0,0 +1,17 @@ +<!-- +SPDX-FileCopyrightText: Huawei Inc. + +SPDX-License-Identifier: CC-BY-4.0 +--> + +# Documentation for meta-ohos + +The documentation for `meta-ohos` is written as reST files and can be generated with `sphinx-build` tool: + +``` +sphinx-build -C -D html_theme=sphinx_rtd_theme -D project='OpenHarmony Build System and meta-ohos' -D copyright='Huawei Inc' . build +``` + +# License + +All the documentation is licensed as `CC-BY-4.0`. diff --git a/docs/build-flavours/build-flavours.rst b/docs/build-flavours/build-flavours.rst new file mode 100644 index 00000000..bdd41bc4 --- /dev/null +++ b/docs/build-flavours/build-flavours.rst @@ -0,0 +1,40 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Overview of Build Flavours +########################## + +OpenHarmony can be hosted on top of variety of kernels. Currently supported +kernels are Linux, Zephyr and FreeRTOS (experimental). The build system +requires build configuration that is specific to each kernel and OpenHarmony +provides all this configuration as build tamplates. See `Yocto documentation <https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#creating-a-custom-template-configuration-directory>`_ +for more info about the underlying mechanism. + +In essence, a flavour is a build configuration that was used at build +initialization time for a specific kernel by passing the associated +``TEMPLATECONF`` configuration. + +All the available ``flavours`` are available as subdirectories of the +``flavours`` directory in the root of the ``meta-ohos`` repository. + +Generically, when configuring a new build, one should pass the flavour as +``TEMPLATECONF`` to the ``oe-init-build-env`` script: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/<FLAVOUR_NAME> . ./sources/poky/oe-init-build-env <BUILD_NAME> + +Notes: + +* The command assumes that the working directory is the root of the repo + workspace when issuing the above command. +* The variables marked in ``<>`` are to be replaced accoridngly. +* Mind the ``../`` prefix for ``TEMPLATECONF``. This is because the path + provided needs to be relative to the build directory. + +Once the build was initilized, you are dropped in a buid environment where you have access to the ``OE`` tools: + +.. code-block:: console + + $ bitbake <TARGET/IMAGE-NAME> diff --git a/docs/build-flavours/freertos-flavour.rst b/docs/build-flavours/freertos-flavour.rst new file mode 100644 index 00000000..add6005e --- /dev/null +++ b/docs/build-flavours/freertos-flavour.rst @@ -0,0 +1,49 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +FreeRTOS Kernel Build Flavour +############################# + +OpenHarmony FreeRTOS build flavour is based on *freertos* distribution (distro configuration). + +Supported images: + +* freertos-demo + +Supported machines (default in **bold**): + +* **qemuarmv5** + +Build steps example: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/freertos . ./sources/poky/oe-init-build-env build-ohos-freertos + $ bitbake freertos-demo + +You can test the image built for the qemuarmv5 target by issuing: + +.. code-block:: console + + $ runqemu qemuarmv5 + +After successful bootup, the output of the application will be similar to: + +.. code-block:: console + + ###### - FreeRTOS sample application - ###### + + A text may be entered using a keyboard. + It will be displayed when 'Enter' is pressed. + + Periodic task 10 secs + Waiting For Notification - Blocked... + Task1 + Task1 + You entered: "HelloFreeRTOS" + Unblocked + Notification Received + Waiting For Notification - Blocked... + +To exit qemu, use the following key combination: *Ctrl-a followed by 'x'*. diff --git a/docs/build-flavours/index.rst b/docs/build-flavours/index.rst new file mode 100644 index 00000000..a4de7214 --- /dev/null +++ b/docs/build-flavours/index.rst @@ -0,0 +1,17 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +OpenHarmony Build Flavours +########################## + +OpenHarmony provides default build configuration for each supported type of +kernels. Each set of such configuration is called a ``flavour``. + +.. toctree:: + :maxdepth: 1 + + build-flavours + linux-flavour + zephyr-flavour + freertos-flavour diff --git a/docs/build-flavours/linux-flavour.rst b/docs/build-flavours/linux-flavour.rst new file mode 100644 index 00000000..2c1d0df3 --- /dev/null +++ b/docs/build-flavours/linux-flavour.rst @@ -0,0 +1,60 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Linux Kernel Build Flavour +########################## + +OpenHarmony Linux build flavour is based on *openharmony-linux* distribution (distro configuration). + +Supported images: + +* openharmony-image-base +* openharmony-image-base-tests +* openharmony-image-extra +* openharmony-image-extra-tests + +Supported machines (default in **bold**): + +* **qemux86-64** +* qemux86 +* qemuarm +* qemuarm64 +* seco-intel-b68 (SECO SBC-B68) +* stm32mp1-av96 (96Boards Avenger96) +* seco-imx8mm-c61 (SECO SBC-C61) + +Build steps example: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + $ bitbake openharmony-image-base + +You can test the image built for the qemux86-64 target by issuing: + +.. code-block:: console + + $ runqemu qemux86-64 + +After successful bootup, you will be dropped into a login shell: + +.. code-block:: console + + qemux86-64 login: + +Default login is *root* without a password. + +After login you will see the shell prompt: + +.. code-block:: console + + root@qemux86-64:~# + +To exit qemu, you can either shut down the system: + +.. code-block:: console + + root@qemux86:~# poweroff -f + +or close qemu using a key combination: *Ctrl-a followed by 'x'*. diff --git a/docs/build-flavours/zephyr-flavour.rst b/docs/build-flavours/zephyr-flavour.rst new file mode 100644 index 00000000..fa95b289 --- /dev/null +++ b/docs/build-flavours/zephyr-flavour.rst @@ -0,0 +1,48 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Zephyr Kernel Build Flavour +########################### + +OpenHarmony Zephyr build flavour is based on *openharmony-zephyr* distribution (distro configuration). + +Supported images: + +* Zephyr comes with multiple sample applications. Take a look into + ``sources/meta-zephyr/recipes-kernel/zephyr-kernel/`` to see available recipes. + You can extend them by adding recipes that `use sample applications provided with Zephyr <https://github.com/zephyrproject-rtos/zephyr/tree/master/samples>`_ + or your own applications. + +Supported machines (default in **bold**): + +* **qemu-x86** +* qemu-cortex-m3 +* 96b-nitrogen (96Boards Nitrogen) +* 96b-avenger96 (96Boards Avenger96) + +Build steps example: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/zephyr . ./sources/poky/oe-init-build-env build-ohos-zephyr + $ bitbake zephyr-philosophers + +You can test the image built for the qemu-x86 target by issuing: + +.. code-block:: console + + $ runqemu qemu-x86 + +After successful bootup, the output of the application will be similar to: + +.. code-block:: console + + Booting from ROM..*** Booting Zephyr OS build zephyr-v2.4.0 *** + Philosopher 0 [P: 3] THINKING [ 300 ms ] + Philosopher 1 [P: 2] EATING [ 575 ms ] + Philosopher 2 [P: 1] STARVING + Philosopher 3 [P: 0] EATING [ 525 ms ] + Philosopher 4 [C: -1] THINKING [ 475 ms ] + +To exit qemu, use the following key combination: *Ctrl-a followed by 'x'*. diff --git a/docs/demos/index.rst b/docs/demos/index.rst new file mode 100644 index 00000000..c8edfbd6 --- /dev/null +++ b/docs/demos/index.rst @@ -0,0 +1,14 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +OpenHarmony Demos +################# + +This section details the available demos provided as part of the OpenHarmony +environment. + +.. toctree:: + :maxdepth: 1 + + smart-panel diff --git a/docs/demos/smart-panel.rst b/docs/demos/smart-panel.rst new file mode 100644 index 00000000..3c0f6661 --- /dev/null +++ b/docs/demos/smart-panel.rst @@ -0,0 +1,30 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Smart Panel Demo +################ + +.. contents:: + :depth: 3 + +Overview +******** + +The Smart Panel Demo provides support for building a PoC for a home automation +system with components showing the capabilities of the build infrastructure in +leveraging different kernels for building an end to end solution. + +The setup is composed of an Avenger96 board acting as a gateway an running +HomeAssistant. The gateway also provides UI as a browser connected to the +localhost HomeAssistant server. The gateway is connected over Bluetooth to two +Nitrogen boards exposing sensors and/or emulating device (eg. light bulbs). + +How to build +************ + +The Linux Gateway +----------------- + +Set the ``DISTRO`` to ``openharmony-linux-demo-dashboard`` and build the +``openharmony-linux-demo-dashboard`` image. diff --git a/docs/hardware-support/adding-hardware-support.rst b/docs/hardware-support/adding-hardware-support.rst new file mode 100644 index 00000000..9985001f --- /dev/null +++ b/docs/hardware-support/adding-hardware-support.rst @@ -0,0 +1,84 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Adding Hardware Support in OpenHarmony +###################################### + +This section details the addition of new hardware to the supported set in +OpenHarmony. It is intended as a checklist for adding new boards to OHOS build +system. + +Before starting get familiar with OpenHarmony Contribution Process. + +.. contents:: + :depth: 2 + +Select OpenHarmony Flavour +************************** + +OpenHarmony uses a notion of kernel specific flavours: + +- Linux flavour +- Zephyr flavour +- FreeRTOS flavour (experimental) + +Flavours have predefined `IMAGES` and `MACHINES`. + +A single board can be included in more than one flavour only when it has **well +maintained support** in targeted kernels. + +Add Required meta-layers +************************ + +OHOS flavours configuration templates (stored in `OHOS/meta-ohos/flavours <https://git.ostc-eu.org/OSTC/OHOS/meta-ohos/-/tree/develop/flavours>`_ +directory) consist of the following files: + +* ``bblayers.conf.sample`` + + * set of meta-layers for the specific flavour (it can be unified across + multiple layers where there are no layers incompatibilities) + +* ``conf-notes.txt`` + + * text snippet to be used as part of build logs + +* ``local.conf.sample`` + + * default flavour build configuration + +OpenHarmony build system uses ***repo*** tool for cloning required meta-layers +into appropriate build directory structure (see :ref:`Setting up a repo workspace <RepoWorkspace>`). +To include a new layer, it has to be added in two places: + +- `OHOS/manifest <https://git.ostc-eu.org/OSTC/OHOS/manifest>`_ +- `OHOS/meta-ohos flavours <https://git.ostc-eu.org/OSTC/OHOS/meta-ohos/-/tree/develop/flavours>`_ + as part of the respective flavour ``bblayers.conf.sample`` + +Test Image Backward Compatibility Of Newly Added Layers +******************************************************* + +New BSP layers cannot interfere / break already supported ``IMAGES`` / ``MACHINES``. + +Document and Advertise the New ``MACHINE`` Support +************************************************** + +Newly added ``MACHINE`` shall be documented in: :ref:`Hardware Support <RepoWorkspace>`. +Use an existing board documentation as template and populate it accordingly for +your newly added machine. + +The same machine needs to also be advertised in two places: + +- Flavour's ``local.conf.sample`` as a commented out ``MACHINE`` variable value + (tweak this step accordingly for default machine change) +- Flavour's ``conf-notes.txt`` to surface the support in build logs + +Create Merge Requests +********************* + +Create Merge Requests to ***develop*** branch according to the Contributing Process for repositories: + +- `OHOS/meta-ohos <https://git.ostc-eu.org/OSTC/OHOS/meta-ohos>`_ +- `OHOS/manifest <https://git.ostc-eu.org/OSTC/OHOS/manifest>`_ + +After meta-ohos MR is merged, update ``meta-ohos`` revision in manifest MR. diff --git a/docs/hardware-support/boards/96b-Avenger.rst b/docs/hardware-support/boards/96b-Avenger.rst new file mode 100644 index 00000000..103cabf4 --- /dev/null +++ b/docs/hardware-support/boards/96b-Avenger.rst @@ -0,0 +1,414 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +.. _SupportedBoardAvenger96: + +96Boards Avenger96 +################## + +.. contents:: + :depth: 3 + +Overview +******** + +Avenger96 is a STM32MP157xx (Cortex-A7 + Cortex-M4) development board designed +by the 96Boards initiative. Due to presence of the application processors and +the microcontroller, Avenger96 can simultaneously run Linux and Zephyr kernels. +The application processor is responsible for powering up and programming the +microcontroller with the appropriate image. Linux provides interfaces to +communicate with the program running on the microcontroller. + +Hardware +******** + +* For detailed specification, see `Avenger96 product page on the 96Boards website <https://www.96boards.org/product/avenger96/>`_. +* For hardware user manual and schematics, see `96Boards GitHub documentation repository <https://github.com/96boards/documentation/blob/master/consumer/avenger96/hardware-docs/files/avenger96-hardware-user-manual.pdf>`_. + +For more details on Avenger96 board, see `Avenger96 product page <https://www.96boards.org/product/avenger96/>`_. + +Working with the board +********************** + +Supported images +================ + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Size + - Description + * - openharmony-image-base + - Approximate 100-200 MB + - OpenHarmony image including the base OS software stack + * - openharmony-image-extra + - Approximate 100-200 MB + - OpenHarmony Wayland image including the base OS software stack + + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Linux image +----------- + +1. Source the environment with proper template settings, flavour being *linux* + and target machine being *stm32mp1-av96*. Pay attention to how relative + paths are constructed. The value of *TEMPLATECONF* is relative to the + location of the build directory *./build-linux*, that is going + to be created after this step: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call *bitbake* + to build the image. For example, if you are using *openharmony-image-base* + run the following command: + +.. code-block:: console + + $ MACHINE=stm32mp1-av96 bitbake openharmony-image-base + +To generate images for eMMC on SD card, refer to the :ref:`Flashing OHOS image <Flashing_ohos>`. + +Zephyr image +------------ + +1. Source the environment with proper template settings, flavour being *zephyr* + and target machine being *96b-avenger96*: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/zephyr . ./sources/poky/oe-init-build-env build-ohos-zephyr + +2. You will find yourself in the newly created build directory. Call *bitbake* + to build the image. The image name is the name of the Zephyr application. + +.. code-block:: console + + $ MACHINE=96b-avenger96 bitbake zephyr-philosophers + +3. The output file will be located in the build directory + *./tmp-newlib/deploy/images/96b-avenger96/*. + +.. _Flashing_ohos: + +Flashing OHOS image +******************* + +For Linux, STM meta-layer provide a convenient shell script that helps you to +create an SD card image. You can also use the `STM32 Cube Programmer <https://wiki.dh-electronics.com/index.php/Avenger96_Image_Programming>`__. + +For Zephyr, there is no automation as for now. To have the ELF file in the filesystem: + +* Copy the image manually to the filesystem using a method of your choice +* Include it in the image before flashing the card/eMMC +* Copy the file manually to the card or just *scp* it to the board after you set up networking. + +Linux image +=========== + +SD card +------- + +The Avenger96 board supports multiple boot options which are selected by the +DIP-switch S3. Make sure the boot switch is set to boot from the SD-Card. + +To set the boot option from the SD card using DIP-switch S3, set the BOOT 0 +(Switch 1) and BOOT 2 (Switch 3) to 1 and set BOOT 1 (Switch 2) to 0 on the +circuit board. + +For more information on Avenger96 boot options, see `Getting Started with the Avenger96 <https://www.96boards.org/documentation/consumer/avenger96/getting-started/#starting-the-board-for-the-first-time>`__. + +1. After the image is built, run the following script with flash layout TSV file provided as an argument. From the build directory created + during the environment source. For example, if you are using + openharmony-image-base run the following command: + +.. code-block:: console + + $ cd tmp/deploy/images/stm32mp1-av96 + $ ./scripts/create_sdcard_from_flashlayout.sh ./flashlayout_openharmony-image-base/extensible/FlashLayout_sdcard_stm32mp157a-av96-extensible.tsv + +2. The following output is displayed. For the image to be flashed to the card, + copy and paste the commands to the terminal to flash the image onto the + card. + +:: + + [WARNING]: A previous raw image are present on this directory + [WARNING]: ./flashlayout_openharmony-image-base/extensible/../../FlashLayout_sdcard_stm32mp157a-av96-extensible.raw + [WARNING]: would you like to erase it: [Y/n] + + Create Raw empty image: ./flashlayout_openharmony-image-base/extensible/../../FlashLayout_sdcard_stm32mp157a-av96-extensible.raw of 2368MB + Create partition table: + [CREATED] part 1: fsbl1 [partition size 256.0 KiB] + [CREATED] part 2: fsbl2 [partition size 256.0 KiB] + [CREATED] part 3: ssbl [partition size 2.0 MiB] + [CREATED] part 4: boot [partition size 64.0 MiB] + [CREATED] part 5: vendorfs [partition size 16.0 MiB] + [CREATED] part 6: rootfs [partition size 2.2 GiB] + + Partition table from ./flashlayout_openharmony-image-base/extensible/../../FlashLayout_sdcard_stm32mp157a-av96-extensible.raw + + Populate raw image with image content: + [ FILLED ] part 1: fsbl1, image: arm-trusted-firmware/tf-a-stm32mp157a-av96-trusted.stm32 + [ FILLED ] part 2: fsbl2, image: arm-trusted-firmware/tf-a-stm32mp157a-av96-trusted.stm32 + [ FILLED ] part 3: ssbl, image: bootloader/u-boot-stm32mp157a-av96-trusted.stm32 + [ FILLED ] part 4: boot, image: st-image-bootfs-poky-stm32mp1-av96.ext4 + [ FILLED ] part 5: vendorfs, image: st-image-vendorfs-poky-stm32mp1-av96.ext4 + [ FILLED ] part 6: rootfs, image: openharmony-image-base-stm32mp1-av96.ext4 + + ########################################################################### + ########################################################################### + + RAW IMAGE generated: ./flashlayout_openharmony-image-base/extensible/../../FlashLayout_sdcard_stm32mp157a-av96-extensible.raw + + WARNING: before to use the command dd, please umount all the partitions + associated to SDCARD. + sudo umount `lsblk --list | grep mmcblk0 | grep part | gawk '{ print $7 }' | tr '\n' ' '` + + To put this raw image on sdcard: + sudo dd if=./flashlayout_openharmony-image-base/extensible/../../FlashLayout_sdcard_stm32mp157a-av96-extensible.raw of=/dev/mmcblk0 bs=8M conv=fdatasync status=progress + + (mmcblk0 can be replaced by: + sdX if it's a device dedicated to receive the raw image + (where X can be a, b, c, d, e) + + ########################################################################### + ########################################################################### + +3. To unmount the card, call the ``umount`` command printed by the + ``create_sdcard_from_flashlayout.sh`` script. + +4. To flash the image card, call the ``dd`` command printed by the + ``create_sdcard_from_flashlayout.sh`` script. + +5. Put the card to the board and turn it on. + +STM32 Cube Programmer +--------------------- + +After you build the image, follow the instructions in `Avenger96 Image Programming <https://wiki.dh-electronics.com/index.php/Avenger96_Image_Programming>`_, +pointing the program to the +*./tmp/deploy/images/stm32mp1-av96/flashlayout_openharmony-image-base/trusted/FlashLayout_emmc_stm32mp157a-av96-trusted.tsv* +flash layout file. + +.. _zephyr-image-1: + +Zephyr image +============ + +**Prerequisites** + +* Linux is running on the board. +* Make sure that Linux is built with *remoteproc* support. To check status of remoteproc do: + +.. code-block:: console + + root@stm32mp1-av96:~# dmesg | grep remoteproc + [ 2.336231] remoteproc remoteproc0: m4 is available + +1. Copy the Zephyr image to the board using a method of your choice. + +2. Check what the ``remoteproc`` framework knows about the name and location of + the firmware file. The default values are presented as follows. Empty path + defaults to ``/lib/firmware``: + +:: + + root@stm32mp1-av96:~# cat /sys/module/firmware_class/parameters/path + <empty> + + root@stm32mp1-av96:~# cat /sys/class/remoteproc/remoteproc0/firmware + rproc-m4-fw + +3. Configure the name and the location to suit your needs. For example, the + firmware is located in ``/root/zephyr.elf``: + +:: + + root@stm32mp1-av96:~# echo "/root" > /sys/module/firmware_class/parameters/path + root@stm32mp1-av96:~# echo "zephyr.elf" > /sys/class/remoteproc/remoteproc0/firmware + +4. Power up the Cortex-M4 core: + +:: + + root@stm32mp1-av96:~# echo start > /sys/class/remoteproc/remoteproc0/state + remoteproc remoteproc0: powering up m4 + remoteprocroc remoteproc0: Booting fw image rproc-m4-fw, size 591544 + rproc-srm-core m4@0:m4_system_resources: bound m4@0:m4_system_resources:m4_led (ops 0xc0be1210) + remoteproc remoteproc0: remote processor m4 is now + +5. Firmware output can be inspected with: + +:: + + root@stm32mp1-av96:~# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0 + Philosopher 5 [C:-2] STARVING + Philosopher 3 [P: 0] DROPPED ONE FORK + Philosopher 3 [P: 0] THINKING [ 25 ms ] + Philosopher 2 [P: 1] EATING [ 425 ms ] + Philosopher 3 [P: 0] STARVING + Philosopher 4 [C:-1] STARVING + Philosopher 4 [C:-1] HOLDING ONE FORK + Philosopher 4 [C:-1] EATING [ 800 ms ] + Philosopher 3 [P: 0] HOLDING ONE FORK + Philosopher 2 [P: 1] DROPPED ONE FORK + Philosopher 2 [P: 1] THINKING [ 725 ms ] + Philosopher 1 [P: 2] EATING [ 225 ms ] + +There is no fully-featured console available in Linux yet, so typing commands +to the Zephyr application is not possible. + +Testing the board +***************** + +Serial port +=========== + +To connect the USB converter serial port to the low-speed connector, see `Hardware User Manual <https://github.com/96boards/documentation/blob/master/consumer/avenger96/hardware-docs/files/avenger96-hardware-user-manual.pdf>`__. + +.. warning:: + + * The low speed connector is 1.8V tolerant, therefore the converter must be 1.8V tolerant. + * Do not connect 5V or 3.3V tolerant devices to the connector to avoid SoC damage. + +Ethernet +======== + +Wired connection works out of the box. You can use standard tools like ``ip``, +``ifconfig`` to configure the connection. The connection seems to have stable +1Gb/s bandwidth. + +USB Host +======== + +Just plug something to the USB port. The board seems to work fine with an +external 500GB USB 3.0 HDD. + +:: + + root@stm32mp1-av96:~# lsusb + Bus 002 Device 003: ID 0930:0b1f Toshiba Corp. + Bus 002 Device 002: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub + Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + root@stm32mp1-av96:~# lsusb -t + /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/2p, 480M + |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/3p, 480M + |__ Port 2: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M + /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc2/1p, 480M + root@stm32mp1-av96:~# mount | grep sda + /dev/sda1 on /home/root/sda1 type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro) + +USB OTG +======= + +The board supports that feature. For now it only works in DFU mode with STM32 +Cube Programmer. Using the board as USB Gadget is currently under development. + +eMMC +==== + +It can be used to store the firmware with STM32 Cube Programmer. It can also be +mounted under Linux booted from another medium: + +:: + + root@stm32mp1-av96:~# mount /dev/mmcblk2p4 emmc/ + [ 3006.721643] EXT4-fs (mmcblk2p4): recovery complete + [ 3006.726627] EXT4-fs (mmcblk2p4): mounted filesystem with ordered data mode. Opts: (null) + [ 3006.733931] ext4 filesystem being mounted at /home/root/emmc supports timestamps until 2038 (0x7fffffff) + root@stm32mp1-av96:~# ls -l emmc + drwxr-xr-x 2 root root 1024 Mar 9 12:34 bin + drwxr-xr-x 2 root root 1024 Mar 9 12:34 boot + drwxr-xr-x 2 root root 1024 Mar 9 12:34 dev + drwxr-xr-x 17 root root 1024 Mar 9 12:34 etc + drwxr-xr-x 3 root root 1024 Mar 9 12:34 home + drwxr-xr-x 3 root root 1024 Mar 9 12:34 lib + drwx------ 2 root root 12288 Jan 12 2021 lost+found + drwxr-xr-x 2 root root 1024 Mar 9 12:34 media + drwxr-xr-x 2 root root 1024 Mar 9 12:34 mnt + dr-xr-xr-x 2 root root 1024 Mar 9 12:34 proc + drwxr-xr-x 2 root root 1024 Jan 1 2000 run + drwxr-xr-x 2 root root 1024 Mar 9 12:34 sbin + dr-xr-xr-x 2 root root 1024 Mar 9 12:34 sys + lrwxrwxrwx 1 root root 8 Mar 9 12:34 tmp -> /var/tmp + drwxr-xr-x 10 root root 1024 Mar 9 12:34 usr + drwxr-xr-x 8 root root 1024 Mar 9 12:34 var + +Radio +===== + +Radio relies on proprietary BRCM firmware. It is already included in the image. + +WiFi +---- + +WiFi can be controlled with ``wpa_supplicant``, which is a standard Linux tool. +Please refer to the tool manual for the details. + +Example ``wpa_suppliant`` configs look like below. Assuming the config is saved +in a file named ``wpa.conf`` and the interface is named ``wlan0``, WiFi can be +brought up with ``wpa_supplicant -i wlan0 -c ./wpa.conf``: + +:: + + # Access Point mode example configuration + fast_reauth=1 + update_config=1 + + ap_scan=2 + network={ + ssid="Avenger96 AP" + mode=2 + frequency=2412 + key_mgmt=WPA-PSK + proto=RSN + pairwise=CCMP + psk="PlaintextPasswordsAreGreat" + } + +:: + + # Connection to an open network with broadcasted SSID + network={ + ssid="0xDEADBEEF" + key_mgmt=NONE + } + +Bluetooth +--------- + +Bluetooth be controlled with ``bluetoothctl``, which is a standard Linux tool. +Please refer to the tool manual for the details. Devices scanning can be +enabled as follows: + +:: + + root@stm32mp1-av96:~# bluetoothctl + Agent registered + [CHG] Controller 00:9D:6B:AA:77:68 Pairable: yes + [bluetooth]# power on + Changing power on succeeded + [CHG] Controller 00:9D:6B:AA:77:68 Powered: yes + [bluetooth]# discoverable on + Changing discoverable on succeeded + [CHG] Controller 00:9D:6B:AA:77:68 Discoverable: yes + [bluetooth]# scan on + Discovery started + [CHG] Controller 00:9D:6B:AA:77:68 Discovering: yes + [NEW] Device E2:A0:50:99:C9:61 Hue Lamp + [NEW] Device 57:2D:D5:48:8C:D0 57-2D-D5-48-8C-D0 + [NEW] Device E4:04:39:65:9C:2A TomTom GPS Watch + [NEW] Device C0:28:8D:49:67:7E C0-28-8D-49-67-7E + +Pairing and establishing connection is possible with ``pair`` and ``connect`` +commands. diff --git a/docs/hardware-support/boards/96b-nitrogen.rst b/docs/hardware-support/boards/96b-nitrogen.rst new file mode 100644 index 00000000..0c1da4e3 --- /dev/null +++ b/docs/hardware-support/boards/96b-nitrogen.rst @@ -0,0 +1,107 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +.. _nitrogen: + +96Boards Nitrogen +################# + +.. contents:: + :depth: 3 + +Overview +******** + +Nitrogen, a compliant IoT Edition board provides economical and compact BLE +solutions for various IoT projects. This board includes the below features: + +* Nordic nRF52832 microcontroller +* 64 KB of RAM +* 512 KB on-board flash storage. + +Nitrogen hardware supports the Nordic Semiconductor nRF52832 ARM Cortex-M4F +CPU. + +Hardware +******** + +* For detailed specifications, see `Nitrogen product page on the 96Boards website <https://www.96boards.org/product/nitrogen/>`_. +* For hardware user manual, see `Seeed wiki <https://wiki.seeedstudio.com/BLE_Nitrogen/>`_. +* For hardware schematics, see `Seeed Document <https://github.com/SeeedDocument/BLE-Nitrogen/tree/master/res>`_. + +For more details on 96Boards Nitrogen, see `Nitrogen product page <https://www.96boards.org/product/nitrogen/>`_. + +Working with the board +********************** + +Supported image +=============== + +* zephyr-philosophers + +Building an application +======================= + +OpenHarmony OS Zephyr flavour is based on Zephyr kernel. + +* Source the environment with proper template settings, flavour being zephyr and target machine being 96b-nitrogen: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/zephyr . ./sources/poky/oe-init-build-env build-ohos-zephyr + +* You will find yourself in the newly created build directory. Call bitbake to build the image. The supported image name is zephyr-philosophers. + +.. code-block:: console + + $ MACHINE=96b-nitrogen bitbake zephyr-philosophers + +MACHINE variable can be set up in conf/local.conf file under build directory or via command line. + + +Flashing an application +======================= + +Installing pyOCD +---------------- + +pyOCD is an open source Python package for programming and debugging Arm Cortex-M microcontrollers using multiple supported types of USB debug probes. It is fully cross-platform, with support for Linux. + +* The latest stable version of pyOCD can be installed via `pip <https://pip.pypa.io/en/stable/>`_ as follows: + +.. code-block:: console + + $ pip install --pre -U pyOCD + +* To install the latest pre-release version from the HEAD of the master branch, do the following: + +.. code-block:: console + + $ pip install --pre -U git+https://github.com/mbedmicro/pyOCD.git + +* To install directly from the source by cloning the git repository, do the following: + +.. code-block:: console + + $ python setup.py install + +* Verify that the board is detected by pyOCD by executing the command: + +.. code-block:: console + + $ pyOCD-flashtool -l + +.. note:: + + When *ValueError: The device has no langid* error is displayed due to lack of permission, perform the instructions as suggested in https://github.com/pyocd/pyOCD/tree/master/udev. + +How to flash +------------ + +* To flash the image, execute the command used to build the image with -c flash_usb appended. + For example, to flash the already built zephyr-philosophers image, do: + +.. code-block:: console + + $ MACHINE=96b-nitrogen bitbake zephyr-philosophers -c flash_usb diff --git a/docs/hardware-support/boards/index.rst b/docs/hardware-support/boards/index.rst new file mode 100644 index 00000000..7ec39867 --- /dev/null +++ b/docs/hardware-support/boards/index.rst @@ -0,0 +1,16 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Supported Boards +################ + +This section details the boards supported as part of OpenHarmony. + +.. toctree:: + :maxdepth: 1 + + 96b-Avenger + 96b-nitrogen + seco-intel-b68 + seco-imx8mm-c61 diff --git a/docs/hardware-support/boards/seco-imx8mm-c61.rst b/docs/hardware-support/boards/seco-imx8mm-c61.rst new file mode 100644 index 00000000..a84230f7 --- /dev/null +++ b/docs/hardware-support/boards/seco-imx8mm-c61.rst @@ -0,0 +1,182 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +SBC-C61 SECO +############ + +.. contents:: + :depth: 3 + +Overview +******** + +SBC-C61 is an SBC built upon the NXP i.MX 8M mini Application Processors +characterised by HEVC/VP9 decoding in 1080p60. As for the memory, it features a +LPDDR4 RAM. The range of connectivity options is particularly broad, with +optional Wi-Fi and BT LE 4.2 and optionally soldered on-board LTE Cat 4 Modem +with microSIM slot or eSIM. Interestingly, it also features a Cortex-M4, that +is real-time operating system capable for serving real-time applications that +process data as it comes in without buffer delays. + +Hardware +******** + +For more detailed specifications of SBC-C61 SECO board, see `SBC-C61 Specification <https://www.seco.com/en/products/sbc-c61>`__. + +Working with the board +********************** + +Supported image +=============== + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Size + - Description + * - openharmony-image-base + - Approximate 100-200 MB + - OpenHarmony image including the base OS software stack + + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Linux image +----------- + +1. Source the environment with proper template settings, flavour being ``linux`` and target machine being ``seco-imx8mm-c61``. + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call ``bitbake`` to build the image. The supported image is ``openharmony-image-base``. + +.. code-block:: console + + $ MACHINE=seco-imx8mm-c61 bitbake openharmony-image-base + +To generate images for eMMC, refer to the following flashing procedure. + +Flashing OHOS image +******************* + +Linux image +=========== + +MMC Storage +----------- + +**Prerequisites** + +* USB To UART adapter +* USB to OTG adapter +* Download and install `mfgtools <https://github.com/NXPmicro/mfgtools>`__ +* Linux Host + +To flash OHOS using USB to OTG adapter, perform the following steps: + +#. Short circuit pin 1 and 2 of CN52 pin header to enter the Serial Download mode. +#. Connect USB to OTG adapter to your host PC +#. Navigate to the inside build output directory: + + .. code-block:: console + + $ cd tmp/deploy/images/seco-imx8mm-c61/ + +#. Unzip build output using Gzip software: + + .. code-block:: console + + $ gzip -d openharmony-image-base-seco-imx8mm-c61.wic.gz + +#. To write uboot and image(p1:kernel, p2:dtb, rootfs) into c61 mmc via mfgtools: + + .. code-block:: console + + $ sudo uuu -b emmc_all imx-boot-seco-imx8mm-c61-emmc.bin-flash_evk openharmony-image-base-seco-imx8mm-c61.wic + +#. Power ON SBC-C61 +#. Remove **CN52 short circuit** +#. Press the reset button + +Testing the board +***************** + +Ethernet +======== + +You can use standard tools like ``ip``, ``ifconfig`` to configure the connection. + +:: + + root@seco-imx8mm-c61:~# ifconfig + eth0 Link encap:Ethernet HWaddr 1A:20:58:83:70:F0 + UP BROADCAST MULTICAST MTU:1500 Metric:1 + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) + +USB Host +======== + +:: + + root@seco-imx8mm-c61:~# lsusb + Bus 001 Device 003: ID 058f:6387 Alcor Micro Corp. Flash Drive + Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub + Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub + +eMMC +==== + +:: + + root@seco-imx8mm-c61:~# fdisk -l /dev/mmcblk0 + Disk /dev/mmcblk0: 59 GB, 63585648640 bytes, 124190720 sectors + 1940480 cylinders, 4 heads, 16 sectors/track + Units: sectors of 1 * 512 = 512 bytes + + Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type + /dev/mmcblk0p1 * 64,0,1 893,3,4 8192 114403 106212 51.8M c Win95 FAT32 (LBA) + /dev/mmcblk0p2 896,0,1 1023,3,32 114688 558903 444216 216M 83 Linux + +Loaded Modules +============== + +:: + + root@seco-imx8mm-c61:~# lsmod + Module Size Used by + nfc 90112 0 + bluetooth 409600 8 + ecdh_generic 16384 1 bluetooth + ecc 32768 1 ecdh_generic + rfkill 36864 3 nfc,bluetooth + ipv6 442368 26 + caam_jr 196608 0 + caamhash_desc 16384 1 caam_jr + caamalg_desc 36864 1 caam_jr + crypto_engine 16384 1 caam_jr + rng_core 24576 1 caam_jr + authenc 16384 1 caam_jr + libdes 24576 1 caam_jr + snd_soc_simple_card 20480 0 + fsl_imx8_ddr_perf 20480 0 + crct10dif_ce 20480 1 + snd_soc_simple_card_utils 24576 1 snd_soc_simple_card + rtc_snvs 16384 1 + snvs_pwrkey 16384 0 + caam 40960 1 caam_jr + clk_bd718x7 16384 0 + error 24576 4 caamalg_desc,caamhash_desc,caam,caam_jr + imx8mm_thermal 16384 0 + snd_soc_fsl_sai 20480 0 + imx_cpufreq_dt 16384 0 diff --git a/docs/hardware-support/boards/seco-intel-b68.rst b/docs/hardware-support/boards/seco-intel-b68.rst new file mode 100644 index 00000000..0e48e84a --- /dev/null +++ b/docs/hardware-support/boards/seco-intel-b68.rst @@ -0,0 +1,212 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +SBC-B68-eNUC SECO +################# + +.. contents:: + :depth: 3 + +Overview +******** + +The SBC-B68-eNUC is a flexible and expandable full industrial x86 embedded NUC™ SBC with the Intel® Atom X Series, Intel® Celeron® J / N +Series and Intel® Pentium® N Series (formerly code name Apollo Lake) Processors. Also available in industrial temperature version, the board +offers wide range of connectivity options through WLAN and WWAN M.2 slots as well as wide input voltage range. Featuring Quad Channel +soldered down LPDDR4-2400 memory, up to 8GB, thanks to its versatile expansion capabilities it is particularly suitable for embedded +applications like HMI, multimedia devices, industrial IoT and industrial automation. + +Hardware +******** + +For more detailed specifications of SBC-B68-eNUC SECO board, see `SBC-B68-eNUC Specification <https://www.seco.com/en/products/sbc-b68-enuc>`__. + + +Working with the board +********************** + +Supported images +================ + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Size + - Description + * - openharmony-image-base + - Approximate 100-200 MB + - OpenHarmony image including the base OS software stack + * - openharmony-image-extra + - Approximate 100-200 MB + - OpenHarmony Wayland image including the base OS software stack + + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Linux image +----------- + +1. Source the environment with proper template settings, flavour being *linux* and target machine being *seco-intel-b68*. + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call *bitbake* to build the image. For example, if you are using *openharmony-image-base* run the following command: + +.. code-block:: console + + $ MACHINE=seco-intel-b68 bitbake openharmony-image-base + +To generate images for SSD Disk, refer to the following flashing OHOS image section. + +Flashing OHOS image +******************* + +.. _linux-image-2: + +Linux image +=========== + +USB Storage +----------- + +**Prerequisites** + +* Mini DisplayPort to HDMI converter cable +* HDMI Monitor +* USB Storage +* Linux Host + +To flash OHOS using USB storage, perform the following steps: + +**Prepare OHOS bootable USB** + +#. Connect USB storage to your host PC. + +#. Run the following command in your local host: + +.. code-block:: console + + $ dd if=tmp/deploy/images/seco-intel-b68/openharmony-image-base-seco-intel-b68.wic of=/dev/sdbX + +**Run OHOS** + +#. Connect bootable USB to target + +#. Connect mini DP++ to HDMI adapter to HDMI monitor + +#. Power on B68 and press **Esc** to enter **BIOS** mode. + +#. Go to Save and Exit submenu + +#. Select the bootable USB device under **Boot Override** and press Enter. + + +Testing the board +***************** + +Ethernet +======== + +Wired connection works out of the box. You can use standard tools like ``ip``, ``ifconfig`` to configure the connection. + +USB Host +======== + +:: + + root@seco-intel-b68:~# lsusb + /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/7p, 5000M + /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 480M + +eMMC +==== + +:: + + root@seco-intel-b68:~# fdisk -l /dev/mmcblk1 + Disk /dev/mmcblk1: 29 GB, 31268536320 bytes, 61071360 sectors + 954240 cylinders, 4 heads, 16 sectors/track + Units: sectors of 1 * 512 = 512 bytes + +PCI buses +========= + +:: + + root@seco-intel-b68:~# lspci + 00:00.0 Host bridge: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series Host Bridge (rev 0b) + 00:02.0 VGA compatible controller: Intel Corporation HD Graphics 500 (rev 0b) + 00:0e.0 Audio device: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series Audio Cluster (rev 0b) + 00:0f.0 Communication controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series Trusted Execution Engine (rev 0b) + 00:12.0 SATA controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series SATA AHCI Controller (rev 0b) + 00:13.0 PCI bridge: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #3 (rev fb) + 00:13.3 PCI bridge: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #4 (rev fb) + 00:15.0 USB controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series USB xHCI (rev 0b) + 00:16.0 Signal processing controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #1 (rev 0b) + 00:16.3 Signal processing controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #4 (rev 0b) + 00:17.0 Signal processing controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #5 (rev 0b) + 00:17.1 Signal processing controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #6 (rev 0b) + 00:18.0 Signal processing controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #1 (rev 0b) + 00:18.2 Signal processing controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #3 (rev 0b) + 00:1b.0 SD Host controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series SDXC/MMC Host Controller (rev 0b) + 00:1c.0 SD Host controller: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series eMMC Controller (rev 0b) + 00:1f.0 ISA bridge: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series Low Pin Count Interface (rev 0b) + 00:1f.1 SMBus: Intel Corporation Celeron N3350/Pentium N4200/Atom E3900 Series SMBus Controller (rev 0b) + 01:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) + 02:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) + +Loaded Modules +============== + +:: + + root@seco-intel-b68:~# lsmod + Module Size Used by + nfc 73728 0 + bnep 20480 2 + uio 20480 0 + snd_hda_codec_hdmi 53248 1 + iwlwifi 299008 0 + cfg80211 688128 1 iwlwifi + snd_hda_codec_cirrus 20480 1 + snd_hda_codec_generic 65536 1 snd_hda_codec_cirrus + ledtrig_audio 16384 1 snd_hda_codec_generic + intel_rapl_msr 16384 0 + snd_soc_skl 114688 0 + snd_soc_sst_ipc 16384 1 snd_soc_skl + snd_soc_sst_dsp 24576 1 snd_soc_skl + snd_hda_ext_core 20480 1 snd_soc_skl + snd_soc_acpi_intel_match 36864 1 snd_soc_skl + snd_soc_acpi 16384 2 snd_soc_acpi_intel_match,snd_soc_skl + snd_soc_core 200704 1 snd_soc_skl + intel_rapl_common 20480 1 intel_rapl_msr + snd_compress 20480 1 snd_soc_core + ac97_bus 16384 1 snd_soc_core + intel_pmc_bxt 16384 0 + intel_telemetry_pltdrv 20480 0 + intel_telemetry_core 16384 1 intel_telemetry_pltdrv + snd_hda_intel 32768 0 + x86_pkg_temp_thermal 16384 0 + snd_intel_dspcfg 16384 2 snd_hda_intel,snd_soc_skl + snd_hda_codec 98304 4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec_cirrus + coretemp 16384 0 + snd_hda_core 65536 7 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_ext_core,snd_hda_codec,snd_hda_codec_cirrus,snd_soc_skl + snd_pcm 86016 7 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_compress,snd_soc_core,snd_soc_skl,snd_hda_core + snd_timer 32768 1 snd_pcm + i915 1888256 5 + mei_me 32768 0 + video 40960 1 i915 + mei 81920 1 mei_me + +Video +===== + +Output video tested with *DP++* to *HDMI* adapter. diff --git a/docs/hardware-support/index.rst b/docs/hardware-support/index.rst new file mode 100644 index 00000000..7c19d138 --- /dev/null +++ b/docs/hardware-support/index.rst @@ -0,0 +1,18 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +.. _HardwareSupport: + +Hardware support in OpenHarmony +############################### + +This section details the hardware (including virtualized) supported as part of +OpenHarmony. + +.. toctree:: + :maxdepth: 2 + + boards/index + virtual-boards/index + adding-hardware-support diff --git a/docs/hardware-support/virtual-boards/index.rst b/docs/hardware-support/virtual-boards/index.rst new file mode 100644 index 00000000..f1d55ccf --- /dev/null +++ b/docs/hardware-support/virtual-boards/index.rst @@ -0,0 +1,16 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Supported Virtual Targets +######################### + +This section details the support for virtual targets in OpenHarmony. + +.. toctree:: + :maxdepth: 1 + + qemux86-64 + qemux86 + qemuarm + qemuarm64 diff --git a/docs/hardware-support/virtual-boards/qemuarm.rst b/docs/hardware-support/virtual-boards/qemuarm.rst new file mode 100644 index 00000000..ce6634cb --- /dev/null +++ b/docs/hardware-support/virtual-boards/qemuarm.rst @@ -0,0 +1,63 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Qemu ARM +######## + +.. contents:: + :depth: 4 + +Overview +******** + +OpenHarmony supports running the software stack into an virtual invironment using Qemu. + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Building a Linux image +====================== + +Supported images +---------------- + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Description + * - openharmony-image-base + - OpenHarmony image including the base OS software stack + * - openharmony-image-extra + - OpenHarmony Wayland image including the base OS software stack + +Build steps +----------- + +1. Source the environment with proper template settings, flavour being *linux* + and target machine being *qemuarm*. Pay attention to how relative paths are + constructed. The value of *TEMPLATECONF* is relative to the location of the + build directory *./build-ohos-linux*, that is going to be created after + this step: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call *bitbake* + to build the image. For example, if you are using *openharmony-image-base* + run the following command: + +.. code-block:: console + + $ MACHINE=qemuarm bitbake openharmony-image-base + +Once the image is done, you can run the Qemu usin the provided script wrapper: + +.. code-block:: console + + $ MACHINE=qemuarm runqemu diff --git a/docs/hardware-support/virtual-boards/qemuarm64.rst b/docs/hardware-support/virtual-boards/qemuarm64.rst new file mode 100644 index 00000000..48a39a34 --- /dev/null +++ b/docs/hardware-support/virtual-boards/qemuarm64.rst @@ -0,0 +1,63 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Qemu ARM64 +########## + +.. contents:: + :depth: 4 + +Overview +******** + +OpenHarmony supports running the software stack into an virtual invironment using Qemu. + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Building a Linux image +====================== + +Supported images +---------------- + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Description + * - openharmony-image-base + - OpenHarmony image including the base OS software stack + * - openharmony-image-extra + - OpenHarmony Wayland image including the base OS software stack + +Build steps +----------- + +1. Source the environment with proper template settings, flavour being *linux* + and target machine being *qemuarm64*. Pay attention to how relative paths are + constructed. The value of *TEMPLATECONF* is relative to the location of the + build directory *./build-ohos-linux*, that is going to be created after + this step: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call *bitbake* + to build the image. For example, if you are using *openharmony-image-base* + run the following command: + +.. code-block:: console + + $ MACHINE=qemuarm64 bitbake openharmony-image-base + +Once the image is done, you can run the Qemu usin the provided script wrapper: + +.. code-block:: console + + $ MACHINE=qemuarm64 runqemu diff --git a/docs/hardware-support/virtual-boards/qemux86-64.rst b/docs/hardware-support/virtual-boards/qemux86-64.rst new file mode 100644 index 00000000..64761b5d --- /dev/null +++ b/docs/hardware-support/virtual-boards/qemux86-64.rst @@ -0,0 +1,63 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Qemu X86-64 +########### + +.. contents:: + :depth: 4 + +Overview +******** + +OpenHarmony supports running the software stack into an virtual invironment using Qemu. + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Building a Linux image +====================== + +Supported images +---------------- + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Description + * - openharmony-image-base + - OpenHarmony image including the base OS software stack + * - openharmony-image-extra + - OpenHarmony Wayland image including the base OS software stack + +Build steps +----------- + +1. Source the environment with proper template settings, flavour being *linux* + and target machine being *qemux86-64*. Pay attention to how relative paths are + constructed. The value of *TEMPLATECONF* is relative to the location of the + build directory *./build-ohos-linux*, that is going to be created after + this step: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call *bitbake* + to build the image. For example, if you are using *openharmony-image-base* + run the following command: + +.. code-block:: console + + $ MACHINE=qemux86-64 bitbake openharmony-image-base + +Once the image is done, you can run the Qemu usin the provided script wrapper: + +.. code-block:: console + + $ MACHINE=qemux86-64 runqemu diff --git a/docs/hardware-support/virtual-boards/qemux86.rst b/docs/hardware-support/virtual-boards/qemux86.rst new file mode 100644 index 00000000..29c2a29c --- /dev/null +++ b/docs/hardware-support/virtual-boards/qemux86.rst @@ -0,0 +1,63 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Qemu X86 +######## + +.. contents:: + :depth: 4 + +Overview +******** + +OpenHarmony supports running the software stack into an virtual invironment using Qemu. + +Building OHOS image +=================== + +To clone the source code, perform the procedure in: :ref:`Setting up a repo workspace <RepoWorkspace>`. + +Building a Linux image +====================== + +Supported images +---------------- + +.. list-table:: Supported images + :widths: auto + :header-rows: 1 + + * - Image Name + - Description + * - openharmony-image-base + - OpenHarmony image including the base OS software stack + * - openharmony-image-extra + - OpenHarmony Wayland image including the base OS software stack + +Build steps +----------- + +1. Source the environment with proper template settings, flavour being *linux* + and target machine being *qemux86*. Pay attention to how relative paths are + constructed. The value of *TEMPLATECONF* is relative to the location of the + build directory *./build-ohos-linux*, that is going to be created after + this step: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + +2. You will find yourself in the newly created build directory. Call *bitbake* + to build the image. For example, if you are using *openharmony-image-base* + run the following command: + +.. code-block:: console + + $ MACHINE=qemux86 bitbake openharmony-image-base + +Once the image is done, you can run the Qemu usin the provided script wrapper: + +.. code-block:: console + + $ MACHINE=qemux86 runqemu diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..d94c0175 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,17 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Build system documentation +########################## + +.. toctree:: + :maxdepth: 1 + + openharmony-quick-build + yocto-build-system/index + repo-workspace + build-flavours/index + ohos-build/index + demos/index + hardware-support/index diff --git a/docs/ohos-build/index.rst b/docs/ohos-build/index.rst new file mode 100644 index 00000000..f5f07067 --- /dev/null +++ b/docs/ohos-build/index.rst @@ -0,0 +1,14 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Build Configuration +################### + +The build system recipes provide various functionalities that expose knobs and +primitives. + +.. toctree:: + :maxdepth: 1 + + visual-customizations diff --git a/docs/ohos-build/visual-customizations.rst b/docs/ohos-build/visual-customizations.rst new file mode 100644 index 00000000..b7c6955b --- /dev/null +++ b/docs/ohos-build/visual-customizations.rst @@ -0,0 +1,49 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Build System Visual Customizations +################################## + +.. contents:: + :depth: 2 + +Weston dynamic configuration +**************************** + +The build exposes mechanism to tweak weston configuration through build +variables. These variables can be provided as part of any configuration (eg. +*local.conf*, *distro.conf*). + +The mechanism is enabled by setting ``WESTON_DYNAMIC_INI`` to ``1``. Any of the +following variables will be ignored if this variable is not set to ``1``. The +configuration file path can also be set via a variable: ``WESTON_INI_PATH``. +The default value of ``WESTON_INI_PATH`` should be fine for most of the cases. + +Additional variable to be used in conjuction with ``WESTON_DYNAMIC_INI``: + +* ``WESTON_INI_NO_TOOLBAR`` - remove the shell panel when set to ``1`` +* Configuration for shell background + * ``WESTON_INI_BACKGROUND_IMAGE`` - sets shell.background-image accordingly + * ``WESTON_INI_BACKGROUND_COLOR`` - sets shell.background-color accordingly + * ``WESTON_INI_BACKGROUND_TYPE`` - sets shell.background-type accordingly + +Epiphany support for Application mode +************************************* + +Epiphany is one of the browsers supported by the build meta-data. It provides a +webkitgtk-based browser. + +The build exposes the ability to run the browser as a system service in +application mode. This can be easily configurable and extended via the build +metadata and variables. + +Available variables: + +* ``EPIPHANY_APP`` - the application name +* ``EPIPHANY_URL`` - the URL to be used when browser starts +* ``EPIPHANY_RDEPENDS`` - additional dependencies needed at runtime +* ``EPIPHANY_SERVICE_ENABLED`` - when set to ``1``, build system will enable + the systemd service for starting at boot + +The build system provides support for using this mechanism with *HomeAssistant*. See this support as an example for how to implement a custom application mode for Epiphany. diff --git a/docs/openharmony-quick-build.rst b/docs/openharmony-quick-build.rst new file mode 100644 index 00000000..b8464d9a --- /dev/null +++ b/docs/openharmony-quick-build.rst @@ -0,0 +1,79 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +OpenHarmony - Quick Build +######################### + +This section will guide you to building your first OpenHarmony image targeting +a supported reference hardware. It will also provide the steps for flashing and +booting such an image. + +The steps below will focus on a Qemu-based target. If you want to get a feeling +of OpenHarmony on a real hardware, checkout the :ref:`Avenger96 support page +<SupportedBoardAvenger96>`. + +.. contents:: + :depth: 2 + +Prerequisites +************* + +Have a **Ubuntu 20.04 LTS** host with all the required host packages. + +.. code-block:: console + + $ sudo apt-get install gawk wget git diffstat unzip texinfo gcc-multilib \ + build-essential chrpath socat cpio python3 python3-pip python3-pexpect \ + xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ + pylint3 xterm + + +Clone build system repositories +******************************* + +Install Google git repo tool: + +.. code-block:: console + + $ sudo add-apt-repository ppa:openharmony/tools + $ sudo apt-get update + $ sudo apt-get install git-repo + +Initialize a repo workspace and clone all required repositories: + +.. code-block:: console + + $ mkdir ohos; cd ohos + $ repo init -u https://git.ostc-eu.org/OSTC/OHOS/manifest.git -b develop + $ repo sync --no-clone-bundle + +Build the openharmony-image-base image +************************************** + +The following steps will build a ``openharmony-image-base``. The process will +build all its components, including the toolchain, from source. + +First of all change directory into the one where the build repositories were +cloned using the repo tool. See above. + +Initialize the build directory and run a build: + +.. code-block:: console + + $ TEMPLATECONF=../sources/meta-ohos/flavours/linux . ./sources/poky/oe-init-build-env build-ohos-linux + $ MACHINE=qemux86-64 bitbake openharmony-image-base + +Booting a Qemu X86-64 target with a OpenHarmony image +***************************************************** + +Once the build is done, you can run a Qemu X86-64 instance as it follows: + +Once the image is done, you can run the Qemu usin the provided script wrapper: + +.. code-block:: console + + $ MACHINE=qemux86-64 runqemu + +If the host has a VT-capable CPU, you can pass the ``kvm`` argument for better +performance. Check ``runqemu``'s help message for all available arguments. diff --git a/docs/repo-workspace.rst b/docs/repo-workspace.rst new file mode 100644 index 00000000..cfb6c4b1 --- /dev/null +++ b/docs/repo-workspace.rst @@ -0,0 +1,77 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +.. _RepoWorkspace: + +Repo Workspace +############## + +OpenHarmony uses `repo <https://android.googlesource.com/tools/repo>`_ to +provide full workspace setup that includes all the repositories needed for +building OpenHarmony and developing on top. + +.. contents:: + :depth: 2 + +The Repo Tool +************* + +OpenHarmony provides a patched version of the repo tool published as a +`launchpad PPA <https://launchpad.net/~openharmony/+archive/ubuntu/tools>`_. +The patches are also available in the tool's `source repository <https://git.ostc-eu.org/OSTC/packaging/git-repo>`_. + +Install this tool by following the next steps: + +.. code-block:: console + + $ sudo add-apt-repository ppa:openharmony/tools + $ sudo apt-get update + $ sudo apt-get install git-repo + +The Manifests +************* + +The `manifest repository <https://git.ostc-eu.org/OSTC/OHOS/manifest>`_ +provides the manifests available for configuring a workspace. The project provides two kinds of manifests: + +* develop manifests (where some projects are following a branch) +* default manifests (where all projects are pinned to specific revisions) + +Setting up the Workspace +************************ + +Once the repo tool is installed, you can initialize and populate the workspace. +This will bring in all the needed sources for building Openharmony: + +.. code-block:: console + + $ mkdir ohos; cd ohos + $ repo init -u https://git.ostc-eu.org/OSTC/OHOS/manifest.git -b stable + $ repo sync --no-clone-bundle + +You can checkout latest development source code by using *develop* branch +instead of *stable* as part of the above repo init command. + +Workspace structure +******************* + +A fully set workspace, will provide a structure similar to: + +.. code-block:: none + + ./ohos/ + └── sources + ├── meta-freertos + ├── meta-ohos + ├── meta-openembedded + ├── meta-zephyr + ├── <various yocto layers> + └── poky + +The *sources* directory will include ``poky`` and all the build system layers +that are part of the build process. Any new layers will be included under this +directory. + +It is recommended to use the root of the workspace for the build directories +using ``build`` as directory name prefix. diff --git a/docs/yocto-build-system/assets/meta-ohos-arch.png b/docs/yocto-build-system/assets/meta-ohos-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..076fbaf855f6a45a25066b0f323f3ee8e9866a74 GIT binary patch literal 54898 zcmeFZcT`l{6E28e5d{TB0VS#=$p|8nl^{9iCMh}R92!LgQG%o<C&{5fpvg2SAgM`0 z1CnEtbCf*0z4xlW-&=3iduz>_nKf(p<Kj6q=j>g(>Z`B5DsGUHg5*_va(o;doU77O z;wm^e7u<1h&f8o%5AHPRC|v~Kn4BfFoQ>@4J*-VkopB^hY)u?rIGY&XG4!}&?(A&O z&%t4D{leDS#m1W5$j;_ECm$sa4j!L{nwImw_i@gF$G9i1LYD1D9$h<Q|9tjW%$gW6 zItUZEa=}I!6{>37M*h$u(1z;#u%R_uNsh7#vD?B~9qsNX>L}w1k6T)b5?0E`V^m>o zE&0xNdPLmaDLUo~g1Xt<O9KxQIxO22vxJJhU#G^+^Q}#t3OBlWsrDrt7){Vyi`s;J zA0PMc+NUBINt7Jhy@H}#CmP;$65iQdarO<>3*)?1O^$Ou;n52(!VWkS4<?Z_W_aXc zl}}K4z${D)eb<`6_HfT{_`+Bm%w$+~R{7zcJnG4KaO(d0xIyXz*PvG&e8~~;q<F_- z9HwoXx&W5Ci_fnY1#Ww-Upt~Qb+Y8RmU?m!dmYtaZtZF0E#~)C$NgOIs{{p~k<Zq} zt33(0sRtrD0t*xIelO2!YfA2qyIu-pn&Mz*=|R767S$zF=45aX3J_v;H+%ef>-Z=i zH_82G>U1Id+T-kr10v_Hg$d*7v_2F89YZQbgSDY_WzcS<7iVP%oFz=fitDdP$$_`Y z=ov;wrj~lBc+2Z^4dt&C6h)HK-0M(ppdl;BsDn3;OL5=NUT{m?r<o?x6116QJ&wQL zP>U&-*iZa=3F=$vZA>~*bycwrmk0A#vEOIy!&F(;mo=9}w}%rCCmk7Zzhv2XGVHx& z`6%f=FKc|Q<s$*_+dI?-$G0>5m^L5#b_tm#1~W_HNAX2nhRQlsUz!dY741m3YFA3V ze8K$rJw(a?6XRW*)2Lv_nb+T~8r}-sb%bY9D1Q;LSrqL4KB(&bqeQ~=<0Jf9Va~Ed z$p#&QswRDk?OZ0iAe*<dxwUL^qeCd<0~<VU!9e-?<~od?pZXz;uWbIq=WiEI@39JP zhQ65R?b|TT88WA%>DWBEZOpR~N3c!s)G|B#VsZqNd5)^-wMVI>1sAzeRvW}V+>3k5 z$gA31x{4nuX%D^7ryqPFQ-b@uh_xac@w|l=Y1(+hUCP@FBUh-axUG8xpe4FSDEfPu znOEKjbtuN-J>LyeJPw@fGYcM<@D}AZ_w!5hcPVKsPP`(ESJ0hauT}NTFQ@{iuR+>w znD1Hfq5+aTP;x$j_rb_YL!QZ-Wpe`jfJk<Fk89>;&)uE{D<QKhGZ^f})gw8dSi)}; zb+PjCC0-3B3(>C`>Zji`ch;$XM7-Q}w9$N@?%q^f8PoTYAF=KaF$n5<y7t|}W9HEs z`99XsrcR~&=e&B#Awqr%d3n1#Y2w)fsRHB=@p&D@ZsPB+X_w{Vf0k5Td(z`}VKTrR zcJ;HFI*TwKm8s{26H4R1cFbzrCe~K-hYfV|o8xzs-tN5;zO_@+seXO<+kHA@8NMi0 zFfkhbEJrf^<}UN~*UAA1d~sfaTOnu_|9HG$LYeFF7alN6EO3d}TydZib4Fd`deZ!P zBIH*4HOTFc^?U6m145Qjca58uqG<>Ah})=L$w@Bp7!~TilrmJ}h`bXvtiYO8G?&uO zEtWqrxciqp*V$A_H~CxB?2%=96@~1<zG2G;A1T;9+*8YR;I6zS@#8Ss;a+?E2YDCn zZiZdBn!xA(kdbads`Czn1V@SW^#_LVhb}5_Ew6uyx;gzEw<#x1T#8#1hM+Sfd2*}n zoG2`H8*M<5W=D6gitvExL#8dUGA1xl)FAjcPxJDva<1{ha)Hd7fm?mE5k&|11y!P# z_tFK4chUtt?>B{Q-G6%aeoN{m`%o{vPA%QFF|9c3#Rz77Lvih?dz?chA8YNe`z0_n z4dXR4t4kbC>ZI9Ep@XjH2VHtk_DU-kTm)ZZAz@EMTq<UMa)C^;z;)88mzVh4*<7^m zYnK@+*87svQ>I<A%-0%g88z;}l5Y_(Nzx&O-sPx>XI)s<xW}bTVH!Xz&dz;dDEr!7 zlyG9hm6%NH0G*@PkvsGYbe11H{3|?GHS8X*6r3%2IyvJTcnepEs&jmzQ58Xc<p_fM zgc$U%f8v#_TCrN0A1FA6?2%d{@z37x&Xt}Vx{Q|Y4V_x2m&Fe#P0QYQ4S#B@YN%fy zI>LWpornCp()0}?*O)PZ+ovCMuV&VLZ?qOBw|Qded0*<jYVTBlaSFpryGt>g3J-NI z&ykF2NSr5T6DPili`2wDkBTpPH%o?~xIEvUPrP&O@@5HXmCD_78qGXQ%*5U%@^+ct zv^$Xw(BPzrD7_-4Yu|G811*%_Qhyv9!?XN0G6rY5u5*``(D5$jY5a~O7qM%Xtah2a zVxh;lU%r&qT3Djhwfi0l5^zsP_V8`kwlwdugF>4rGKYeEtbzTdO?dU7^}~MTGoz!1 zif@+#!Y>~4S-TQaP&s?M2L0HkGCBHje6tE|cEj(=jfeuiy@R=x`;0$G(~0U<<D4At zhXzJYaeTw!FR_z<Ch<DOacj|<@2S<GOP?5-|10K&zBsNcp6Aa!NV`a>6Sy#g$r)Ew zxckoAzE(`!+62eUzlC&TMf8BET6IK2`eSAz4$ey)Y4N9O?)ocZ9$IRPNei1t6CYe` zO_%B1OdZW8BH{$N_ZcGN+B%Fq72QUJgvPY1`=t4kQvE6sm3J#sQ_Bh1zvEZFzn74D z>21j+=H5&Aeji`@h1@x+qqX<dvlGlM#C?CB(B<9wya!E+s$CL1FTAiwo$|EhKFHQM z&s9!{P?xd)`rLF4g8k0fc8Lx9J=WNt6#HF{OOycno#A#G?m`AUpZ5rY`}#rnxAA_n zgEzQ1IJ(5(zPLX9S#v$>b4~^>$3jgl=nFsvV#LkQ@hhicHrHhZ>uM6e+*<z;;%gvd zeh%mP9e>i)NP{=9TJzKH=qt^YExxRb2=MA_q69sc)4s;`+`(Sm{D1is&)$!YzEcBt z+vr`v8O_%{=W#wOU1EE}$jywX+l>4mK*I|ch*IADv<vkak(DL1+%^-b?(6-gs;0cp z)~&>I@Ttn_bWgQRp2~N_^V9m8@lZxx=JIoyFY_r^KX{$_=xdF49<A#6Xre4nmsa7H zk#l>=nKW6tHL4>+eP{1O90nLC1Af1CjS7NY%F;&;WaYEd<F><vS80-4^Yh7<Kip$3 zvWRFaLKZ(gzu5V*l|#6~aycl`Z-mHLWq9%1hW$pk+|ULl6Yo6>O?!uG>43D4&vs0W z@xfE07J~QtzF!b+aid&Avm6t{_qylf|C$%sM%2&aZSt-OtIcodWQpaAjM-zI=N3M2 zg{Ba(Wg2K5EvDV3E&Hlu>9{r-8@GTV$5&(0e6O>~-RD8<+TWd58eYxjTdLsam6d9e zLM!Kf>~2ALs%9H!M<bT%J<Jly=QsLj*hV7rU}qj{fzd?qCR0cGq3S}`>U#S^6MtzB zuH}(%;j>`myv4eINM=}g*{3|kde(j5SvTCS!q0XMp7KfT*X=b22nBhF5DKO-aFA+t zjzy%x>V?eqlfpziB=ajju01u9+-=n0>4G{-GVne#1qYV4%FMp}%<k;@BJyxhgAx`u zoE3Vu|6Xrt-0ihd-xkW`?hmP~n@RDy*Iiw`IwZ=Dsn&&ZJ=~z%2mRQS+QFmAk>0<J zjhz5d5C9H?J%^2F<4Uge%J(D>=UazF;|^B(PLqUAy6fu=;FDyou4i$I<E=|eR6j~- zY&9Z%PiEi-K5SB?bRqit0`~~&PmpD2KgJcbKd3}_M+_Vum!8|IZL1xgeJ=9~IF0t> zNS(bC^%k_Toav_GYeO_4H$IDj9`x};Vcz2%$tC>?@;}!Su}NlUbD&uyRI)KJeE(p3 z9a`>VY&>gkITfR?OM6aZqL-e8Zu_9ZlCC);U0>hxQ!e~S5&EgE(V6~A*#?J`i1qr? zQ93U#bhAo*#E8Aw;C^^p7{#!uoiGz-FP*0)pSt{X4fTraAhlR5G>1@6zi-DETCPW$ ztcOsHSl`zt^fno~yUgtz`1`bY3EAFn+S;$=zUNgmsHUHC&fKX(z~ay9*H>8!y}y6! zOVLp|vD@DBj2*vfwYZ?X51q3(J25M4NA@ZgYx6?ScAv+2pPrnM5XIB?cg@0bsgIVd zo|fp81vzVKu793SK9~(G8}<F=pvH6l1BE|EF<!ndxCG4^SF!LWb{Bz@)REXzt*dgf z<9BJ<quKvr8ZOSuv}=%;3Z@F?LKWr{cEa_;p2-i=eyuz*?gk{7>Gx6JMclga+t_yz z)}drRL@ToG-S>0u*KR*~Hu@$addlo<Yt=vxnY6k5>p3?>QHJg|^5&~6W!~}BkvoTb zD`NvXouhwzK$gNFxvX%b>n{{zD-1jY&YP0<JM{fw<SN=mwc#c<+nd(QNgYjp{^nJ@ z2^80S8P69_5pLUGM)2>6DCRmYz-&*)a&$w?kQH$}SlGYvrsuq~sJS$&wlEXnNKBL+ zvhhED;9(>G$y=ql(KC?S>W^o&-;Y(It6lK=?3u!C{>Odt!LJwLojbC~8~>t%e@}_` zvu2AdgZZRic<B$raC0g6lVT123TyC7aIZ2pm}0wo$Ie8S#ILXxWmyvq!bEaW>t6Y} z_a|7e^&b#tUmqVHvik3p%1t)B=03qgoJL|_^!(>%VZp$5Y$;?d-W~(|%gD}x|1cCI z)Miu1D!pKzd*=7yUt;5_6SNwuWEXkd=c`!!=npH!5#db?P9qBph<>@yH3+HLJ<H&V z@@e*{4JYlC|8xht?r|hAy0QARr*DFNq!09UZb-3G{Be$?Mxy`Is{w;LBnDol%+lCx zE1b+WGg9iNQ)DD;Y*LmrIN%RFtz)PA2JydkHf9KfHAQzW>$hecrm-&GUu3^sa))K4 zh9Rv3g+FkVa{c#vxVaG-?;!$SY$@-9!bjtS)@`r<ddkIsf%c73Sa$<mmFCD+jGbMv z@JE5)+wDN~Yz@ahKe#EEH_$a6w_Eq~4F3)qHFF=YJzG?Z2rd^sa{<w6`5$j&My%*{ z8ulW~9<?7XtnvM_DVLL|Y)VCG6gYm6+>-zJ4MxNsJw`|PNA5$_!gs$;4I6=vd`$+> zn_v|_gtm|Wd=hFaT(P*br4-)%<tpCqV3soX0f#fd%NGm0Pg7A;iQ#H=go&Ccz z2W|pjz<Eh<55U7Uh^jwuB^>s*KVwAxI`kPpj><cLrL<kS%yt`|goF`6nc-JNtp10k zSXudDUZ-#oyMQq6I;0%^oh|_y!Gggm*=WvgRstKZ4%NWJ*8bc&GeS^Kq+s{s`m2h8 zXY$`-p9W?Ac284?`2z-zKSIt>?#}@HU%hIwPuu<08CDiabNhC#%~C6S^*#V|_+Vla z;CYOJUfg$j4-4ajf0@^Cp@*wtO(|fvJrdwX&F_P{cop7?uuAb_m?Y?i9|oqZOQASo z;_6<diFi7t?;b{S{r9J7%?QfkCQiqPLzAI#qxKJFJH0__NeI=eR3Gc<6VU=>X}tL{ zkMI4=CmNBQs=R=E_{vI#b^P#8BsXFq%I`Uxil3>X?_VAB*<T(}FpW9g4XemID5@jP zNbV;iT^ETlVAsKn)!LmFH$Naud*to<t!|95X!M{`I>BxCmnYrey~K7~MSv?V)=70t zuCs>Q(lac7M<3}K%hK3qd>U;Mh(5+<NZxwPZD!s;$!Dh<^}NBw(Jk3xRubQ}UF`In z%-kkkvbLu99`#)#D($hfUZ%d~i5?Njv8|(^6xa*$5F~_mG{_v3Rv{(5%nN_pa+*4= zj73<J!EV&&K5AlH=njgQk2wWe#RNs89~pSKoB%$kWcLDDef+6q#<-omns-lw+BA)R ze=l~+qVv@@*I5k*UfwpJ&mt^P+gy(=-(xA-CBkXG2&!_YB99{3{ZiQr8`VHx@nLQP z+76l|+28S7X<&{^)fR<m$Lq}BPl>tiP3L56EN-f=vnj1hB~{0as!`MrH&K5|;F<`X z)_|Cw#7tb*{*cgXz0_m(gC;tzyh|T!wO82q2aWIx%V!bRD`GkQi2b@N+`l{p>@HK7 z-+gJCk%mez5n_IDM;`j(@KsJs40ROd9bRYs!ST}g>6fYS@FL`9+mWo1UFI8@S{!TC zc>W;aN!a?Tnw5-<McQts!J5i`dslx4FO-;T?=E`Fw~L6^SNGzr-|Xgf&mo*_5aH%a zEJ{HuQgtifn9s7BHEp+?3!zBlX(RtZ#7QoN!W+90r0s6#K#^(nkzmL8H_yhioa%jn zaj$3cA{X~W477y6^8+U6LF9i{!$$rseuVHg;taew!W*-fvly6k`r{};kUFOObu(cb zb=84<cMo9Gg|Pmdl;DWsvkt}->H@pP2obV)Vcs82a754HFa-sgp8c3sxa#fK^;*QE z^*Ns^ruoSiq!2D9x0AW;{QiE9!l-fIY4B$3j$&1?MD}$6jAz?G%e%PJ679Sy%#?Wg z<*xQPiJNwfre2gGdgoc+*`uR=9V2TKX#bb!DGST(qg|V&k}aW=*QA<M){6__)T)DY zl%5X@^hOPX#d5A*205NH6PpX45y7kHx)MKn&DH0(H}1R;y&MZpBjU+d5|{B2;?DJx zQSNgQ{3USXu-7`;$JB6uJ<?2NZu|WY%Nf5P3PCv7_+quSm{?ke>OQ&G(*`P0U~|uN znd=~bUm=4O3L<(`?Cd+={*EwFD`G4R<LFX?D#5=e{wGVpA(I3o`7VON!F$i*Oyu;G z;r8&?iLu{o&A;b=6~q3&{>i4Q9#5OEFNPk0%4)er*U5Xg><-_Q$npABMP!Kr>FKd# zLK*HV`!c+lM|fZEvsv<9MRElnAl^lFnJCZk@lV3O?@8(eL~5&$EuLbl1=xzEWXj;o zJ%5+~58mp)jtEU;TUlA8x#dY$bOc{_`LdZwHdrw3ds<OnF~E;N)D%>Z58f}#IdYi1 zyzG%+RGVhvb4tqcoq%n%02}w5pvJFuxQD3Q7|jC+QU9rw7_xq`1yVHG-pG$A7<90e zvoN=49Jj!-!q3;Sj?O4*HBcf(OH1p!GuPbF(B2ngn=8G`e+sHqP+c5e4A`>kKOXBY zM;#|O)&3x$A1)t~*!K%FZf{6AoqWw*WkPJdzXb6MHHNOmy?o$$Z-z*pD75Rot>rQ- z@lr^)`f@@T2+;F;NvbFekNn^oIuAn>s@KYvtKnm~o&I`Q&xrD*8(PVSO#O(g;Yk0~ zD{@c%6!F*-RN#%Yv?s5{KtkI1w7t*~h!0OG2&?m{F9wAx^>B=V9>=yLxg+85kw1Z3 zBFwB~#=$__+j%1)Ic=+l-}8_oM$HRwW<s{@QkAf^t7qw4Lu0(0h4Zd|P)|nDWhI#} zlDs0YH}o_NvLBASWK+Bs6p*1Y)<0sZXijIm1d3t?^DcUQ+kaxFct)0@gL#p6$z$w{ zNMzzJ2L`pq%U~SS9$&;Npf-ZO?#}5GoCJc&_j2})MG4=twNT%L3e9*+JHzC!+R{py zm>92EXrhJv!ngFP7cPcm@AC(!+CLGJc%_+aFMxajc$RFO)In=9TnyE?f~55d>++T| zzbZry!=rCGTsz)KP`}!iMdR)yh)9kvQxIKyvZd~!0Ij=Qp6~XVAJNe*BgF4<=S*<F z@oc+vbqhf^H@aiLQbqN<UNEjr+dVM*3nHIF5rwfkrW4<Le#(Dp_Vj^ena2n*hQ6-+ zw7?|L*aL_o^!rOfa_d3TJ}024v@}_~KyrD{74%1rOc)I~`{RS{x`)`l?0JRpYR<g* zdL-a^NbiU(nn@h$>sGz$@aQ(^aL*bUJD%lyzs$CrUSGTO9B>CqiQAxHZzg2>duwgQ zb(q_Ew$K)@u+ig48f!;E#P~$C+U_THuYC*275e3Lcda)AiZmkCLkWtc<Iu^e?@j^( zzZ9xAcd=za4~+ADQ^@xE2mMY5eQ|w8d$NRY=jgYbP3*ho_0N7q=H0v<ZZX)P=sWx3 zaCDNnFZ&1x7qervMXTF(<3kK1!aP<<$Rt2&JRb^<j`wE=T!=2%+jT3q@KR#z84>xR zSn6iS@A_hUb0ufzqe~#ysm-{)wzgq6zuL+h*zPwUH^%u`OUV$RxBRm&lgn&;I;(R4 z1=eXOBjy|g5qorVR3g55BaI2?!bANBM2@`!<71N5(lD+6y&Z6(?}eQAuO1J)w?Z%f zs6VlI3+WU@WSm=y7pUKBzUcAvOw-QS@xjISH^ZfeG}=4I6*BM<$dCuU1kA?WDhy}H zt%X{fpa?P4epX)CnRehiWKW6k;k!?zd9G+J-^WI}X_-R&+tKt0Phl!Zuiiuw4X8PK z-S<RU9t!V&uQCW601iNTnQhhZ7Q~$I$LKKCuPlFC)7<BD=p`&PIV4<rxT9iz1(tOD zeD{G@^z@7BhgITVr_c@gCOnpN{g^=D5B=RrZ9goOf>#D+9Ij}s&!(8JuhCE*zFTy> z&ILTha9h*;;7yWzwJyWd{!tO$S!1`G^DZHsK^4-z#ezsDZQ9)&IpwQH{_My;iPCVT zr(_>sz~RCquWyy?*ztT7jm(>N3qV5qXuMPB=&e@Y4ERxHulJXE?`_(xMI1Y^BPhLX zSAUln!7K=Uh@(B4RRUeP?a&vrbI&XKV>6IGFykQh^AiAbPOZ&iVqb2aII%u@Ux!Ei z5V~Y|>ycZ8s<UFmj81Y|DU2!)`n{TVFXDhN=Wgens(W60oJdLZ@DK}c{br=%o+%Y` zXdsME1M_;0=tiMbCRSQlUlTB^UJCenKQBk;@I^a-5R>(9aYQ7L2>z|Nbu-B9S$*Uo zWh!NUg|EGx;rQVA_d5r}yqv}y2;($lKF2+#v*mT`qi^vuyKH)o#AF3nywWfr46NLK zRUXE=X=NNt^^=?VPBsNXvEx9Z^y2U(#u)(H<9O5@5*&QIxzB6C9f9AbX)DXDCS+Y! zSzFVY<c;ay{dW6nFY#5lUfO0=Nme<F4VDUk15URXM0Wyg=LuQ095T&`<p{nGq0T}< zb*q)>%_ySv5sTk(FUu~cb4(-*f9oq^*SFgSd%6stZVxOe@t0TC*#{b9{q8im%b>vW zM-f}|Nbc~Kdo3kofOA=3RVKj$58m~9!+DSZv_q~#LIo>ae;10)BoKu#9=xsu1H}fd z87n*Mjp6uIAF1`$p#~d9#{$iS(an(w9f7*ZxWZo?Co-21KH<Z+VSwC2^SE`5MLhQ@ zy4wsCRhRv%tOuM2xtasWPwu{EiuHS?>Q}IJrx8|ol5;VaHYs!4O_Jj1g%U+yZvkpC zsU}+5aIErZW1hkgt{GePyTnqZf?VOH`4tfVtvdawL4D&!K-V#!^){=P0+Rqe^|oJW zIP;zwBpaylsdpGkR@>e^L#@9}Omnr_Dds(!cFG4SvS!;s)otSQ?$$7<lg!EF2AfOY z@AX$WYs)Eo`>}Rxzq}0h-7QO1?o%Iz5ArVk0>U8Mv|S)B=6ZgIxF3B1Qsk-0T44R? zO#}Tt=hD2XeFGv5mS8G~;;6UeN+w<i)pkY7;Ydn=U@7Ocp@aIf7Z@^OAKXw2A~+DR zO?OYXvBKxTGKI@87Zb1O;dj~0Y6?484>%l)`71N3LBS`(HWd3z-MnW@vNikpMYvbP zg1x)<Umg%<3nBifv&B<-4intU0oczVTMSQum@Gt24YeHL4|^bn3h%T^;D1EZ{iuFl z#Jd5pUxQXk+l}1)=2!q^jfLQ8j{0i-vE5a^n$q`cfCHB~?=+c?eR!w3y>1hXHP_#2 zu_la4B@(OUTaTaz*qBJjQ}TT(Hvtm><tdfWNsMeBvYbIHa6q-FfP%-zS?QfJDM&PQ zfswDN<(PgP3XEjX)f`>KGM$64M`1o1zI%<Gi?}3QDau-lG~o=sp+1JHzZH&;iss1M z*M@jGcjB^7*yifDmOS|aL8>2Yya`c}!K%o^A2e?Byn)ds*afvy-@Yvks#-T$KT>8= zF;T09ZyRL-WoKObjq6=R_1gU(yfNj~%P*Yfi=76~COBMyo7O)Z8GgOUb>Jp4A}q+o z<$IJ{@9Wkw-c-9+D9jhvExgL%^*CIgF4A!UP^(#XqP}$=+vOFZ58mo?zCYQ(WKf#A z`_U^wIS=O&Ru&QDooN7HG`xt_cQt~|+HIFd^K8GzL~&$S0H~FgCxPrKSX=&%zn#nQ zuW4p$1La!XsD(uuZ!<kaAQOUBu}gfoIlPm;5lVhD(z&W2J=>r>;%!6%DT}Omn;tRu z(wtlEeru=5!Iv!1=a6}a0WOhy0H7ozMo`W!S9&tH;wyAMvkb5$x>q}ZN$3c8m8F~> z?j?>98`bYSP9D`n<WZMf+TB}yi`;4I@wBpuisz`(EDF7EwBN?USSl+d7qkD#LxY1u z=zH(C^po@E7P8p2%LyDt{S4`!TJpjTh}}i;y*(mGJ^e1aK(S%Q04aPRH+hSO%Gub- z#v7!tY%+0ivzsWrlC%RoVn_+iYSzjpUwf&;rbe_f@T*AvcGdz)O3#dlXAGb*<GM>I zo=JA%s9O7uH06V8SU})N%^_MzZy%6^Rp|}^=xKGi6W`7av1L17@{e<XccN_jw*u0& zf!3B3y}mXJO1)uW6CdnSJEkfB(2TH=QN0*g!1_+Anc`G3^J<-OHQ~{%wB4r8`o-Ix z_cK3FkAHku4P>1;ZeoZ~3L)EKA#j?Q=QZkMA6!<~rhB+K4yoTtwGWOPL|A*d98C56 z7>#e<1Lft}$y{>^?$?`|Xl+W_fC8tL(IPP{(VxMG1E$wsLJHaIvXuBfWL??=@qH}z z28O(mF#HQmZ}^DHKI_GlU{{Ve4o+_nhyoM7bDGlJ&&-7!wt+ha790SH;Niq^ZwT{y zlu=F?Ary43(4D@?M`_N(>-E&fK*pkfhe)E4V^Wgd2FH!0+3zMx*6BwNoPZYE*+Vb4 zv&kM!Y6FQGmwH;JESeq2r<omOHLP10IwF5)=9gx&UO>lTqJQ)@RS-1xR+7G>e`oUr zQi$*F-T)|3K-AWjJz4?|4k{fPZRt2Ej$D#vLO7#s@&`T0;3(7G9Uv0;?hfA|PZ=5G z-2g#lTPH>Wc~e2tO8svF{xrdYB9wMOE_h7>uLaF2!2H|~d)ZvhgMxm-z-5JFe0aKy z=Y_lR?1+;qs+P{c^_$R88{kTLH05h=k+Uz}<?I#Kz0Ei-sxOr%&#lX}`g{Gw%rp;u zW9=pMI5Lnm>$=dY;eojz`PDz68}s6jb#yIK^BoI~3^HoWZj{<dxu&|hB~o-bD8Uyb zWc8yipe-#fQGI9yNMhu}=YE-OND%bG#HIepv?hn>kHJaBF(9I79=XYUZgtS%_XISz z^|)H>HfVGD{3QnJ3s5O&z>lLf2PMsJ%1ZJeT&2HR)Q`#H&&w>HbS0nGChQx;ZAjv^ zJkAHD!7Mn}#cDu#<y+Vjr8vlsnzDXNr{di}8)*Llq?Ouo2J;kULC13Yks!+De&;`B z_ba@hOew6fd)^k<1`6dhY@OhBSeC+{5b)d6L{V>NGU-7BbcwFmcGM@wC)L68x5#>l z?ay}5|J_$=<|obd9MPH`SDM`ey)i%2;UyrU%xb26eJ=O>=QS?4&OqiX>eF*K-%3tS z9*DfMeb+z&W}pQsY<i&Q>%IY9mYYDzet^9IAIHHN1snXVj{Wt|HsHVi|IPnhgUETB zt7~eagu9c4tULmJfO>KF?p<kVX_%YbtDPNZ1A~cApEw!2`mWD~nY<$e6A>$b>{a4x zUV=|ey%;iHA4g(8X~N(bvAVh%Ar>7S4YQI9J}`>=C<f*&ynvKa*s$3XVX9T_oEsL_ zoh6?@r-nARwY7cn<fYu&XjN%Vjn_^e5MPS!GcjGhawV#5a&of9ZN0rCPd#5yK9rKr zaQzASa;JoZ#MkB!3KJDqm&IQCxGJal&=pPwhG(5%1zz^{pVHHfrW)RG_4W6gK$9^T zOul9j3`bT@E=qbxOj$XcbrypO5r&GlwY6EMFflQKO~%E=f!#VdIMmhEjgOB%efo4D z?CbG0!sMwLNia;32m;HVBsuhrhJ{6L!R_nU9i|#^b5o;PG~10$OfuzU?q+0Xb7+0K z^YEcFniXL^J~BGGg2B*-&_$wRI1FmtH+y=NWM$tM<QjI&y?XeF*Uri+QfYI0JMza+ ziOG9wb^+zv+`gyB3k&8<x3#;vx(1k~H2S(qv$G}lN)5l_OXu!S_)cs~r_mop^+uB5 z6A)lb-QC@vJqwU)*KTW{3zHD=pD{B(eSQw-v-{8B$TmvL{Af5*Zc}pS<j!>-E-vER zx0xaxRYgTT#b72+^9d66lLg!qNM&SXp2=^Ll913x&e2qqdfZukXl)BUJ@)8sQAVTD zvlj1Yq8|XeaA~Wn)1x*wH%nNV=ySO(N&OEF4oW^mM$$%FSXd-0;<F7^@y9hcKjRBL zJoMD|0QN`0*eFhRB=O3`f|swH!+F{F^ZfgYd&ns%1??waR#a3Jh`6okM&k*%t?e8m zwzeGM?AGHHR8(vP#1wM^ykR#I@Or<G3WAemSYBE}cS^h`wHd8cHj&fN7|6+eD@el_ z;$ohek<sdx(X}uWwjDwRxqbWg(vx2Ir3dT=b>1sI<b$_CgDd-Alk^V{Lv(aT1_w2@ zv~JzHbzeuCf>O}E2ZfUD71dZ+UteEX_+Wxv1j}}E*hECN%Q7tEP5j_=)7&dW->0go z-6M$?FJA0%HS;6b^=t1FR8>`_XIT+@#=n6L>-xki6R`0xbtUrA^0F{98xM7N+Xesk z3h3kRT0N7H(5rH!zkgo}Kd+|d2zWA=$IgPX^d(<kU#5_>w7b|9=olD?m~|zB0O;uG zAYsv9)vH!(HwIthwH{c1ZYufvtj2qLr&m|m0$aPf#>;IIto3zutvQSe#PZ>A`Otd_ z*_oMbghKLZ>Z+==1QCisK|zi&+3+5I*Ol1p#ck-4SOoC+^ej}3)!#mJU#D%+A`nFD z44C!!>GA`Ulc{u(2>*vcYT_?mq{YWfhLZz77^?HBQR`XAF5)-$DXN5?9LDolWjuRi zJL-OR>ciu4xU=|%fULQx>AS#(=D9gyHWdTM)R!-DcKb9Qahsww%-gogtOjQVF{#DH z#mop}l>viK&tG-q@0Aj=4Xpyh8z(ge66JfVq==xY-yhti6cls84F~bzatY|M?4VfG zoO*6vRU985-`d&=f^2_hCx<4BnS-N3S6Z?cme&Nbz|T;?P2&+1^gjOKz`?=c!A!~q ziHeW6tO^KST3+V08Agwf+j`*P;Mn8*ojclFTczymiZBIh=rRCWFP*SX>xb=<+Jb_0 zk{K%pPhxxKf8L}+bQFo&%GbCV8`FU=CZ;y;UPqf7+dN5=KVDg@)Yr?NoS!bX5UB8o z0>Kd{=&_Y?kimne$!)f64_XY<*vE<LZ-Ri3?N`&#fQ*}c91{=}WMx?&s~P<FQP1nD zZpZ`m#v-g?PMMPR{(t^@L*EJ&+b)Z<k)a_tgN2!yQm_5BFJGRnj;rTuc*IlkIW`^J z6joL~HZU--vs+J1O~vA>aOYrDLa*StbLUDLlLXvc-Q4nLWTvpL#sF+X=fy2Tzx)@K z2=w?hk+4>+y8{@kNtX;;Syfd|qqk~@&NdO>xPhU2|L&bJ7YB#kj>9}1Bjbp-<nnNt z)#>S}qb=~0<UNA+Im-dF%utr)0=*iIE|Eu%G`c2^?MX;TmWE)Z>h<?M08*5ib+3Wo z!w`_Mx5j5?W~Lhn8{yzQ`I%o7^Lye&e4)<Hh}y##%*u-O>NpHWs;zW6O`epLv|aRX zB(%OoNy&Qj(4e%WL<N>P)Z5ob#;SFVoSd0Oim%mJT-@K^zp1f3nx#{*?eNL=Tqjs{ zghn{#_}Dw)2%XcjwY3$|Gz^@Y6~OhkFQDCNoycw0wbY-ls-i;IE4b<p>+H8qj^-~^ zTUhMNc3b&=7X`A$@YL||FkRyD@v*VWVS681t)w8yQcEjVFkehe%t++VJ-mDWKJp+h zk6E!#=fN=Yk;pg3w!2rA3=B9VitVQwOi-{8=wYdEczF2IHDZ!pqY_pE=I(Nv5e5Rs z7&_pVZ(U^u@FJ309ksRNSY=1Pk7k!w;luyJBWx|n7+x7F#XKPl&`?o{U>&XXP}PWZ z-a&v-0?kqnjit&!LaGQJFHcW&n|Yvs?`f^8hP=Fda+Yy4+_>yD9#OkfiTkEuT)0;Y zv>CYk&%n>Sie842K(w{B)3bPO1m(Z+xSC6otc+Hv!azc^<wl^9bL}V;9v&XOe=QP; znH#NgQXjUkrk2uyJt?VDv~ePVEG{lC%>j#_oSaZyVPm?dy|A<t(Z4p1T()3DSQnaZ z7oZ)uxw-oT9Jv6Z4G@yuxIs(c;^MM2{twWT&UR<Y#tfj*?(ySaBIAlv9^l}lVwv5W z`6kijjyUcTC1vHikx(dfAkAfC@+pY$xNr>cywFfWZCe`~I2^vZyv)MNdIfNaXpH?Z z(~#hYa@JSIPAS840CcFd*H%}PxXnWMLSdffOGfTM38XG!9j$he)u?gb{Ft58Q&JV* zS*p?^<o#nKXOW7HFK%_D!YZ&7DhZw{2kYzYH9i1+hhDX<YsRK4W>;`<z`P!SrbT;m zAP{yW@Y?Mz^>4j1ND%x9xHkfpUOW8++~ra$tGtzP(+`Oo`};A(6y)R)t>JAsIXNtv zg%@yfrBh-JdK%_lJ?j)j%?X!v_9Fo+A%0cky1MmH@0Ai#fQ~6PHuio(&WTna3=zqS zjVu+jgDp&QmS05Qcfct;AvY89hXh$x%@BylaIdn)G6bSkuf);SwH%!)M@mK(CLGGH zZnE_DPbUo&lVwm$5k>-kjE%izqoScxVLRrBOF&2?T%eMcm)Gtsuie$r5!C<!JKQ>_ zsECHg=bD0_c%Gc!Q@^}VpL$k;g<trjDwhJgDTd%v=f-0*mwxRJbgt@BOWbU6t4F&A zGsHSzAZKyDC?jch6g_{4$k!E@luV%c>RG0&W0on(0sw+K%av;`Fmhh-@nfw=moHsv zZEO3sS2SMUyR;V6eG3d`f?jqdp$Cs0A1({=qdAh<$J;4aDaaP9hf2*V%F7|+SaM2> zC8wa;`vd6%|4Jla8*1<FR@A%o7Y@$j(4UwNXXL8yZFbMK8md4bw8kG~9c<6zUAPcy zAafmj2B81{1os)}5gi=q*<m1NKYaL*kwJ$ND2OduZ1UiTrf$Yp3;l(|X@sR7Uo-qQ zyu4~IhykvMp;B!=jv){094``a{V;<^UX(k+jf2At28}+e%gLBqoKuBBm<g_5zb*@7 z)dtKFtmOtVG00o9^Yd==T}jG)Bai<is&4D!>R$IbI1G@UyCo(lfXF69G3<H~ZKI>3 zAmP%`qyS`x97BI40&!anH8pF%qXwcp%HW+m{T|eRBm9TH_rby5I}6`(8u3azww7YT z0Jj3LX>4j5%73iIN)57L>|;@am-!osemxNZ%1`g1UcGt+5;#C_4KfxER@SJtjg5`q z;9#r)@$gW_ii%;@C5B($&CbpO25ay&=#b|NNIVLPiXh!TH8;;WxUK_%%<7Y{+1S_+ zbM`v+^68XYhkNi{O|Z(_PUN-IS5rfSY+}MEA~Lc0*N~tG3B*yA+5)innXs?k-E)!` zaBviU9&|U;B{qvIae@xh{;c^{QL_G0Uag`=M(G8r0Al4!{)X7L40LEgE|k_D0*QYY z339#m2O(KW>5<kFR&&XRXQN|a;X*WLg?U+74E>^y2G!=7ykMA;5-!C)0p(Dd*15L) zp5D-fA4XH@ufZfa|G&mip@F>z@NN=xLz@sEUnPzHRk72&LLA_rRRhdm3P)94o#(Jp z$C${H$7!x!v%OZu(9qDhs<2RDtjzq|y={YCD=Ns683JAMFm2|i@%_2ExX_28BBVf6 ze<=-S3IG{93>b*xHZv~y_)!#ga(t|ouUqS`%;4nYWWpyTq_;XX`Q^2~zW!1S?*9J1 zo3nH5+4N-b#5YhalvZVR_Bb9td8DY1B^WTs#AXYCc^u9~EcIwmo%l%z<(gYs@)i3I z4i7`)$C)AsH~04yWo30hu{PWoLcwc11&~ff$uUN)v!~~SYZLH#kL@|QKC-&JygW1W z>&S@CK-)hoR2{HTC;5al4B$V>wG!rhr&=BR1yqE<W*4xI?!H6;adaB1b|D~TeeC_? z)4O}SOf^=6g`lXAu5M~>w)AQRFe43|7vSyS;9vrca-y)0C#WhOJa~|vHGG+n5XSS@ z`Sa**$syf7Q}Ymh?>h;McGn^4GajsSL?HU*z);4|fRa}N$qo<~3@Qej0*Q3v&Z44< zEBlN<tz`dm`y`@P?(RQ+Y|a4VIdZ)xWs{MYFVk&&Ji1s6*xBQsfR3M*3EX;TZx7N% z9w{IM23oFw*||w(UF?`Y4g;8=`=4M0c*Fll82=x;+30F6WP}Q*m1G^Hpo*48?P~Sm zTa_?a@t0)z!(LliYB>e-u&o1R<S(Isz*KQKzq(6W5pUX1;=Ei0bF20w{sVN=Bad-# z`riMIoYGAd4mdbjWPh{g$ksVUdtm&r-||bqYR`0v=(&ZkpBx&z|J=*d|Bda#rJHy{ z0PN^vPvNP#{5_~FVC#J-SMyE9G@Knta0eS8izWhyA0iKNPOd{D-`dT9<L3}1;MR0= z+vjFbS67Gazu>?2=TFGeFqW6Vv;SHAo4EHqjy!+t&9B(S**Qn68q_sg7?gq6Y8e0q zGc&V<qR7a|(&u0NG!1-qS1Tq6uUsjB!_~J*)1o6H?x9LeJF5Zj25N<|M_UB_u)?^{ zzFu5VSlFN`2(>@<5-d*u=N)&Sc|)e}zL*(<?ga8mnJ8em@dsaspc`8#4wT>V!Db6h z7?d9&BP(mNJ)h!x3dpFVrm1OG2TBeA>!`K0byPyP@KFJ4EEQ#B@V^EIhT+6#L(Fw1 zFixQ-ChDz+xT+4uz1G{1fDbVv@6pm?veY8O!oo&%%PjkIw9PT|^YsUF2_+vA6AN5N zMn>`<)jBUmjLON&M`OUY&kjGwo(JZ~v8N~(Bfvgd?RrpeuL=*Xc63Y(BS8^zZx~bs zXe6kHElq*^QFnH-j!Nl$K5Q%T{CTRJ?MS&iY_Q0H0|nC79Lw`wkP?3?bexaa5P%Kl zn?fKEG<aKQu4=aN6j}X`H|0=u_2_C%E;$0W5b^kOQw4?4j^m9$5z5=QJx+E94@Of7 z|Mj6;38WD0i?a#}R&Muot6sfwMYqZk6Q@|8o@uJ@v)iv+>V`P~*IxiEk{|e-DwW8< zhbAV@+F6RgAn|DG*CV}H{J%HnPl`Piu;Kl^Jwigl!-IpiPFw=g;P~+|6%k8NuJBkM zwy|i-+a4Yrg+UJuZ;1}e!2n7llI*^Jnu=?oVGRxm>7RQb@#oTt>QAd5MpqY3Zg-3L z&NN>wYY4i*h{m_8KiMnLE;W9tQChb&xiC|3_$>?y4y&kK-OiWk>eZ|D{B&7Y(s+U@ zvj7DF!RA+Nk*2Ps^vSp_0=Qm(OUwM>?(*ESv6)%^L^}QTGS^jzSG}a{TxQSgT(MCL z8XuG&*n{ED3cD#hemm<LcvkXMg)=Cg;nsnqXE*WFdqicC(madkuhYPu!oWMhpEu!f zBC$UW3{aNSGrtNz76z-^>6HaeX6@sH#Ebz)_zeJl#qxUQJ{w=~EV}^>05N9yXN)yJ z;^OKx{;2oarzGPiji6&-upDgutVWAqxIWQ*?vI$R3js_C3CsqH>UeS8zDvK*<{z(n z?~9L{DuQh<S6&?fQtu(i_&6^|fZPuV-p{+(M2uDc|Lf*w=cUEPO;Fn%KeV&6i>uHj znfdZBp1iauH*O=|ZpR1J0TEG!?&X;#yF~!_o<oFer%X3r+5#%oDTV?Ogg~Gj>4R^8 z7k}O<p@JOKkiWFOc=4iXcQTyW>Wd$)Yz#XUHFY`m3IC$u^Fz2nz5W{*Yg0>$&Unb? z%)g+?d4i9RuV&7sUt3vN*tKOFO!LbYF`Rbewb;_<`=>8kgpc3+i(@Zkzt^}GWoMfK z?vA0d#~*xn9;_0~B|?EGiUd#rIaF9!80efZx6k5r?yU96zzzhZV4<q_IZ0+QTX>(a zWe7~wUGC4H;$->Z!vQy3yGU7XHOP*&V<V`yPjY%9V!B?uY!p7;5c_rW8pQrQ*#FDx z*w<cSd;AKZ&F8mZ?oz~`G;vbb+(Dl9?=-Lw*yDEtknBHk`m@>{#N-9+vuOV|A2#F? zpJ4wELL3as(TEZ#{OsHSDDNRk!)3%u__wZu4gmI9*k}p{`E^Ik{LAI8H>AIJ50>$z z3X6LGq=V0D_6a>8cO$(IN-!%;t%R~NGOT8drp#TczSt0dW-Nffk;ARH3<q_YezkL( z<A4m%1u#)Qz;>XPhn3!#ne?az3>PdEjLDu<Ld}yNJBTWj6crWa<}wKj>zjT|Pd_?3 z+FzgGK+!V{7V1$@Q-eZN$Ym*N_wZwO_WbnM_hVyYlA)C0HHErW_x1shn3|a6l0-yA zkW)~YWTmIm($h=GmzR~b6{Aba07viYQW$aqHT_P)%F^k{(GvSm!peka5@WI%@K}BQ z<bpd1AaVd@Zxsa<t*a8*&nC}LyJ-@@FWt~qqH@8ihv5js!#GxE<_J=id}%MK??5VS z^&1u^x0tB&c{CXI?j1Q$fB{4I0c>BFdbdAc)8w?_4FMY)+mhC>M(=ZGYeH(l$DEuS z`F$l3iHTrktX{DGj5pKM(}+r9A{t?U&}I5&E8EyoHZj3cM4B~7dT8(StG`NumV|Z_ zb40QM3;4%FbeR!=;I2*7bFAJ~j!I5u=LWW7VPR3-mvNEu%E36zca;ITtGt|A*jvjM z@J`v@?>Yt=1H@9pS*4|_Wut)Ss;Rbh(n^N5Hl&FK0+||3O_$j0&cejYt7$1inAX`^ zf>w*Qr~p{`Xz=!tAm~{D$+U<8Gae><D8(kb-WJr>0K|=1rfT30u7l3NwQ)GH9u~Ij z52I7n(;NGiE-5Q3t8Q|+En;nLt*d3$y5HN_I3w{G<beLpm6a6`8(>v=S*fW{;M(RN zVcT0<K*VX3OOc5BYy}kjk_afOtu0(SC~kSMD4z%3HU#<)ZlJ2k%%tbxQ8(RN9pM!e zq@<>1FOEt~w024=?%oDDe7MRYg)!>N^1^~r<mJnk9g`jJT&^-|3C(S@nEEr4T3keB z_20-YNy$oC=a652{rWXTS;{eIzv$k*d%$k@l{4V3+jH_ROd<)(vWYoe*ZceXff#RD z1?m-ATBEbm6FogW<`94JaOOn7N<gS9$U{EJ8yXok$~n-NWeNM<KRi4vDJhv9U4e7& zd1$Ds=hEgW-pZ>OqhrV%KwA<~3ra~#gAPgfNsdkSd#ALoe*$DIe&G$sG@#AIkQZ6i zO5ETidi8pliA5tGfYN}=V|f4$d<QTCnUEau@O}^hEAWZFzI0M?H@6B(2{v&4l9H0L zgl+M?5_m+^QTKp@hIeB0b2+@$$&&;<9G^dbqVNPF)g}H$DR$B3{!ldkjfCZ3pX8*Z zq@~e}9Yi<3emzvrM`>ecv2V*pNkPS`!2+AZo{N`@y+0HCOZ7{pC@Nk}$;qkoCJLy@ z>aR`A%m(}WbKSf$^yxy3r@E2^kVqu4-oSD`>PjB64S#r-4K2aYAP*e3sPNQnb6O&o zV<@{I*TzH@MCgi42^@%vU-e@b*_gIzmP_=_g0~;m?*#}xTV<@A75U&wB0l&#I?0IG zj4Z6J1pzi-3IqV2{Ox{3X*>Zy<s3zPJb4>a1<K{bM9S5D^D3cVumiH_M<5bqWj)jL z_hI-CWPD5p`IR0I?*dSr$NrWa$4J^&kvHd6U;T@ht$=68;;-F=0K=*gF*7hUZwW`f zdUdW!Q?GM+wk@(G6`H+qgBQ`Vcr^rQApbx)_aiJHV?puSj$U$lF6Nau-m~xve!0^{ zWluZ}%jC@EK?(OyoR4xLdV719mX<&|1TGm17$iIuncm;ilPdIAXJ@D4C?_+sOhW-c zMi6aOR8(KTeg){sEAkN^4uo87YD!AA6sh31Zz}<Tv9ekQZ8B9=RZyXpi=|_8{NDkq z69Dt?+}QYZ%!DdQrH>?qsEGH9l(2q{j*R5q3pm<ajjUAR23}#=84*FeO)Fzg&%i*K zU>;cGdsa6}Z!^%_`%&X)Aw7&brJ$JaPYXJrdMqt1`JESf0P<Q{T0WEK$<%P4?lvD9 z#X1$StdEb+(*AW>);7Ifi#dv{j0{i#w)@c~@?#6}XYv>Zm%F?`a0Y+HgrTlSf3ND9 z{z<WZlBk>bAlF=h1E|Z5^Y_2N<23pC6(^o3YCK?iW2!MXH`l|%V`&Ty@PGR%s7#-A zzEijf<m}*rM7xi+_(MVEp$=H4d@CGOP-i_LxuJUAg@tKyt4LZh@bmL`yaFQI3vux# z5ZBMZm%L9Vv<`I-@euTQEQu=YCdw;i9l}!3zZ@@2Ctv`JY#nWpjQzo{*TE*0e3n3J zQ`Fm>231bFMjE|WeqkXskC!S|!FN=}mmhQH{+T&JSRG=G1u72A+qaio_})E$KFbG` zJBT9B*wV_1fQTrj2Iy>(a8Z^4apZDzc=%nn%&e?-M^J)IH3ni#b#)V0bX{|x#;D&e zH3LiIv8-Nc0!^-*MU_{e(`<>m-BS%z1#r1i!nqevQdgZnD6Vmf2l>SWD!yx~DIxKO z)y>5v_kBG!ka;pY(HcuvAM*a@62Rg>j0f_~VrD?VMR-XA7|3N*Nc`ZE;X8ZVeL4Ua z7gtC~NJZPk!~_7FB{maj`-AKnH5)e^HX1b=QDSLlM?+3-X=~dBL`PS1=l|dwqfCfY zivQD~`@fFa{Fg5Qmh^$+mZD-eR&~)THpH|?>&We`PxvnMqyaG)kZc430n#>5kVhX_ zn46p1+Cuk+%-HHr0UZqeoAk@!{(MR-kV%gY4=>{4t`3*6+`BjJ-v)Xbk#Yd9>8c4S zAE%Pb8OlYh#MB>W&JKN)cyG+d$*DBwwl>O?PsQgbZWC?wakwBiS9;jm*tls+7I3S_ zKo9uI(3a9))6>&~Y6(a=AQ>quD|0c8mAP+DgDyQNsiY;T1l>7-h{MP@KLFPOIb&(W z9pr<XYVz_S=%|&a?J^o4+9RYQ7b4`<65yQSiII<hA{fVtx^4mmOr``PD(YwL2-^Nb z#~{6yund`5S><B}c>z|40Vf5R=wIyn%nBso;$r1#N#+I6CXfuHzIyqxc9ml$T_13C zdRRu3u`mZm5lDS-c&DQmi;7aOGO<gE;*gAMLSiCon#+%k7emo2_MlCqV%Tfsc&SZL zoAA=5p793)Kwd0JjEiHU0Hsl01uBON=kpb8bo_j=7>fGf5jzq{Y_5yFnN3YiK1X|? zWBm;%SSXZLf1WzA1TYBbQ3Df!tt<GND{(1?Zf#77tx}Z&3E(n(rX@_)*=C|n?|cUk zsnz2^lHB8KMtbe%?YGmNH_7+&J3rJ2XpOO57`0G|AZR#T{O9c;6`;m>LN4OrfnK@o zXyx5#dU%;p3*qH7KBqY;pEm&kpc|`OX+H(buDVH${`~nRcydF7=&pX8c<Rj<=NR-L zwujp^7u)JLijI)ekd>AWmwyMEd)v*;&7h@%0=m$o%x}&gf&w}qI_6;qI9i}8fL1}Z z^P&pqE`rYP+E6K@u<$A9{s2+}8bB}|g%B_#B3%MH@D_Ps7rVKwk&KEm4$@ci+}gZ- ze9H2DtjBA$-zl$!goMb;$Y5EU=ld0a9iiS3Vw{(`&jk=GC#v^f24QOnDp3?eTOMfs zHZ(MVF@?8p-?}UhbOKrrS|EV61qTIz;f^Y|b$x6v*Ypr1s0g|~;mTMTj3F%(DM5Pe z8mOd+7mKl?v>uoE>0a)B3z}yW&_O^_O^B*_=y0CTeWHTkWPz%OQBKo*2>t!LmaZ;q z^t~!#Fuve>>J6r0fHs-(*kKy5Xiz`^+7BD4d<lj(u;5b+7@@3z#b8qm_e7<`%sUbm zZ*On(JjrW6KT%Q9S$6HGK3dAe3SYm2W57Vq;d}!6*w6T3CxHxr83lR?(7*&EDfAFh zcHR4nz@qGzqp@AGfdPJ>%&SR4o;y;Od3kwDK<4SyH0w^5my-H0JzV9K{q6y%8$c&a z`}?OCuMaam7TB+i^6f6SQVY6&Zn=35XYStvoK7>5@687-VS0KKFgSx9DiGGLha!!G znzR7hv8uyhQb7kfs2B+LSZ9Cl0USEVK(gGllYIAq#G;(b?J&@O1ic#+|B}rE>BmC@ zj$t@B`#>lBNlhBxz}^5|0N6e;F%fjO!0~_)ndcxd($dmE0|_AU?(Qy(;+8JxjZ_B* z?(}1`lL-lEtzN%*6XAW}sBQ=(;W04P;HfBg$SopbpeIvYRMhS01}ar-eFlnBKc_TI z``|->*6e_2C@74BN;xGZB_l>n63Am<SVK(gHD=g0J3T!;D{Bt8{*qAf4MqiVaq%2k zro$gUur0c;??@cE1qF3`)lQO&!F4+s4vqYUpOftWyuu`PqW4>0ALz^gm#YTW24XUY zZY3vZ_5&vexsrRM)D?L7QZ*HTJ?sq1)dwD;Ky~UTS&d=SAqCsPwgW_b4xItFxnSwx zQ6;De6dG8~UpR6!BVY?akhulQC&o%2bM1w-wK|8HXO4~~$MV`BqyPZZF%uIL7aG)e z>F|F9-SO(`>Wqw80A(O$0<KM*vqb{BEcn<7hibYu*Ol)M0KlsDdoyK;i_6N&0#3g@ z#^Jm_l4ddrXmO!+ZJG<1&qz+DMrj|-X7=YS(#U|??><3GC{?M}6zJ6f+Cv(-24Ki% zOHEutLVNsy!qn6hOjU8ZiQ!QvqNk+i+c#wp4V|FBUJbAvG_Tv7B9fE!)zx<wzR{w} z%xVh@3*+O-+djP~<H$2$A|)m+G3|^8BO#t%UPZc9Dteh>4Lsc3+rW1FYhzY6Hf5s( zIM2Dj|11HT#g7144ICo)YYRwx8$Nt)&eX%fj!%Gr@lmlwKp^Z5fTP;lS^$+rIu%_l zEoOaL@}LO?B*qx(QeBdiN1U8JfPfbEh67EuJI&hy7Y~m^uNvLg=LC+L0<hZ}H#=wN z9gqYu(lDNc`1l`>@8LWS0TIaEpOzW7(-Wavoap#qughLW3^o3gBq8BDcXQz-HZP#J zpxWCrZi|YEk+JJ8%+E6_8Ua04P_wbI5oTp1w}ruW%$1bx7$AVwxg}>iR3fot1tx-k z6@XL>dgSv!dk2+JM&GPOjA{B8oafe90c2j3g_brQOzh~Z0xCku?<_Ufuc#~|pWDw4 zW-)YhDE2CgScUoT7sUaR4Qli|zNThoI)O0C%(AjwU_u`Tkem7JC!fSFo;(<m22cZ7 zG!$Cb(Mp(~pO29PbP;rc%EFqdu(f|YrRbg$7+~XJ%D&53u&1q}@)4dG9ZgRpss9ml ziNOp<*aM5Mxiolp&!L=}d6JM<d0n0U9!C)&h@yUBDiN_ESI|%agno-vn??<WIf!`; zhCwp(Joh?y9gdG}?jb1Y45q-GKxlAq6!Qk?6)Q-|$<=~ss^jcpAi;eb8e%elf^z_E z-EcdyEj=kcS_d%y2a29AU%r4+H6$pA56mfe+i0q*Z?4_LHq}#Uz@JpQyKCvcNdfaS zz(<LRfC@uIp=jRbcc|&>aXae&pzFKiv3}dXBQmr17P43N<}$NIcD7uJh$17xg+lho z4n@gMB3YO0O*YwNCL|&~$JO_H|DOAKp4ao={k>oLT%YqikMkJs_xm_L>FF}k(nzst z4ZS}(+41pg!n!LwK#pDv$imuNlz@8N#_}qoRuCM%Ffhz}1t7hGV!X-{AfS&V#*wu^ z_`6;D+1>3ml_+|Jx8B{&?W5m*VTnKj$1(exu8+N){B{;2t1ph}r{t>J=%?f<sV(=O zFUusKhX~gd^cnW0RpjmaA^{RUF^X0Q2wr#Kc23o$do0c$zbP$&!b9vdLu2p0(4XVw zO~~Q;HYg+ZZ0oA4P0nP^%c2O79v*4JZtMK71&-^1P|X32PFpl>fS=#-$%)78hwC>O zjIfU&=h>6eKl8HK!9F(w4&!UblR*ZFhNZka-Tdlx;Ca>`AiFjhq3Og5po;DA)O(LV z@M<Q|s#Z~^V1aGADgyi@tJiRYgLC?G*)ncwa)erJMw%)l1}cfFHbbsSpk&DPGQCCx z`GqVnbGqGSCis(CCX9TCB<^=3BnQ;OO+j~<kxYM!&w_58KEfhA)yHr$O#YAS!@Fz! z%)AQkO59<^(@WM!6%K>OkKJkI`+`<ATK53fR5|lbOHMxcJ{?jNBfkb2(4MbKBknDa zP{?P|a6KV<Uu)VM$GD(9U(K<Ero_O{l#i?cG!#3{MTGD!sv+Tz(g(E8Yq3kSSb`^n zeV$r{JQI`~HY?8tI*pbk;=3O~td`&veg*}}yZib1`JZK|sHk53ob0^;eCY@0=9rSe z#ZLr&_qmSQh0%O`e4HYmRV!p}^?%6|>>pfBe>E8O<cX2g%UToU(@o;m5`>N%^4a>S zv)=j#D5pEcZZTVu<TNP&5}w#(xF@v;872rVlfDA5o496sHvI!w!m_B>?7_mHab-TM zlS5*(v9=}^aJYr>ljC)#FX1+rV2#P|2SqcSlXAqMlHpGxQ)iNKs_+H<x*UY70q^Qn z<>%sRyNSGNk^b+p&TU_zki5MB#Up@eZ;FeDSE<+O{Sur+Uqd+Syw&*xv@<^r4ww}D zKYw}A{_kSUt%+5MO26misUvU6B^P~o_wIU5u*_Az<DktkK|Ix-U#Hvb)rF4(v&~FR zyMs3&rO~+u&@}+cHfKcIH?3eH<HN(3=1MSdW^mlHM@Ool6=%b0Z~D@=Z^C~<Ao0UM zZ|3IaH*N?9^9xE{_&X=<7qm+|VUmmc`v5mUBC|)K28Lp!;^*ukj1f;x3=QQyyjSu3 zc{8xL84s0>XqF2<hpS)c+#CX&0-8uE_*~5Zl%?RDVqbPz=Bc85BDK91d(GH*G(d0I zLq<l%^_suNVSGx8v-h=GlP%_{MPm1yCk+_EWyB<D>HgY4kL;8tSLs$)$&W|?5n zA2S2cKi3docDC7LtN=NjpL1?%>fwCL`JNxog^#~o196<CC9ur6$NIJ4Iv}SM6i*OI z&AgJHo&6A?w&MWzI?;2wQWzA`JC944?FAvk<<Ct=5$V`=NTimHl@<vGW(#ex0k`z= zQxiM^!}r9AOcIqsS|}4$oyDZyAncTYMIizj={*N=S=nD;KdWZ<;%B@0*=0~4=@Mx* z_FS*8LKeSV;*^_655NYXCiaCn31Vq!6&-P`X=$3nPpd-vx@>djo<&M3sb;!>$)MZ4 zBd!P!41g$kIsLsf64Hl~g0qV@V`=X1d`GMGAZdji$nKg;$j`rYya}h*1Sv4@^2d+z zWiQsQEejig`KYM0Kvaa|Qbiy>r+fv{%x8OwYYyv*m>7WRoWn=!!skXXVEmFAQbJ0K zmWD?ALT7Xn0FHjQ&i+gWP?k&Q95(*+c)%>|u_YCoG+t?-pS2>Z-~TSjx?}pu_6bWz z$JMQw&6%H5;{;P&WcWDPA<9}>2!tH*-~WkVBh$jiaiFBgRK_QZHviQ4t+%58x9djH z**jO)jP#tG-^W>sSvkd!RIa|>Sex!K7I>4N@8Im*hV&w|va%8+5X@d5y7=*FU!UG- zI3F3IASZ&eIYpd~c+hL>rJ6VWBf`kY$h?_B7QY9+Un3!l*}|51&XW2pC#OHO2(XaW zrG!PRW~tC5oV(IWN~A7Y>_)Mk<Ew(=9#29Ct6qo4>rTk|xHpbK>{<FK`V=oaf^c(l zb0za@$(<%L3QHjz*E%?7Uf%VIO2?t0p@Tbla&O<glTcIy{Z{M(`RoQn>-cVftXgeL zfKN_KOXHw*u0dW931!Q|CJ+quWT_!6RR}366B#N^5y@*SqPP<#o2M@NwA$I%H!a}( zE`$W2paW&lea%XDTwRMHB*X4YN&SRE08&9bsNU~yeEzXH&MN=F@cQ-9$w`pT40v26 z!?Bm*tj0(CA%&{NLr|%i1^UP#0p{4S2CHW&Db!%bEG#)`Y2za!s^zczXvn(00S5Z& z708P9wY2a_NE8E)Jn!ARckS9W5XY;kw$9J9sn4?EqxC-_qVI%Lpg24Y@_s-eD;X)g zkP|=X<+2-$5dlL=4|(yonY#VMZL7V01*))?M}Ka5dy8c%!2juelnZQxypWKPnAqEo zADPf@H*ZGF#lT~)IOM6DAwxZJc6h7tr6N(OniUWz&CDXdJOqK#(a{mDuniCr-^1|@ z93h*All$;N7IpzxQEr1Ad3ae}U0rQ$!UJ<1ot}w_iNiz5CVCYz6aj@L&VsxalAMn% zZ^gpx&K;k7_dwqifkJ@~mG?h*Y$I@RnfO90;Ih;2Jy?~3vYtKbY&=5S9*h92B<1m? zqC)EQCXUJx=ikkYAG~CujOg(W8Mt9>-D`u;(bIeQbB9@7;6U+ten)#dRB}*Lf`Sy- z5E5otoTpE7tPBkYXJ%rouT9}BWWwL$uVL99LkS7b%Y=8r6%Y`Bb=m@l4JHI>U5K%M zR8REe>?|`YYez8s6*+*d`1m$J>jU-$RW6w$NT&`gc~y?^F|Tx0Kv)<=-wR#=z&3wL zxs2cQiqev5q*I|q8lcryDl-TzIyywWLbi55VF2AxSt+Wd^ard5iY4H!o;-cp*Vzf> z+Sm2<JUTv{g%r#?M!x;<!P3x>jEwAD(+2P(2Wrt31osiqp5CUWrf?a-e4f`PCM9KN zX0Erg<RZ$)Nl8c$_t%z}F^B``hM?rDl?8Ycq(Z|S!lAn)|C-I^lJas|T3Xm>d4B%e zK|wi<Lw|R)-r~lM@Wl`QKlrF<&t^fv^P)B|3Bmz*Wx$s5dQ|VJ_=8teiGYR`(u)@p zu9Km-FVR@ys7yR*vEvaG1Q`HmB+?3P*z?q1Jwm0%ool;pYa6^hCBah$NZIP@YH6up zBiVu&{66sgje*B|z}-OBrEu@7p^1qJz`{VQ+S;-TiJo4-QK@Bxy+t_IynhdIH#9U9 zl2tJo8Qy_Q|2)0CvZm%jTS|O9Y*2i9I)O)~u*wljeSJN6Qjr)ae<2#N0z7_?R;5-6 z^CTURJfK@!%Wu?2@L$T+L_{0n5(wrx+uJX|h1o4?MWX?CDJ&{Fra+ZnS}%jN<5OE( z!p<f9pC}ZK3Q`p+{4yVS+wGm5)%`{^Y7F#QcPLTR%1KMY#1XLEus=aIHa1{tP;wQ& zd1Gc~29NS+y*CcHMEZ`b*RmE|=9@Qf0uA={E01jk8@`JQBARW>IWRCQd=p?R!7`t~ z8sf{<_%fbMKewkliYN-jym#kY0HH6juD*dZ(&hN(=;8u}H4vI@b8||fqTgrheGkZK z*>MU($qPW}EGW1QAUc3=fKBl5@E~vBwz9EV)uF^$5P=Jb@(0ra1P-d?o}Ql4?+@VC zxhz^ii3MC^ZxO}i`Rl3<*|PVGfhHgG4MC=o2y2v&w{k8nEyb}a0STlaBGR13hEES> z413EXBm_nC1rvYBM7+Gb)YWkXIx_faRmh6Ti3C4TYm;@md3dN=t2jW$IHZ<zSW!_y zMnQotqPPNg^llWOE$;sIF{o5w5g-_^U8AtiFDZ#(F(n%lk&!uu+X06NZUp#9YtX|% zYF<!q9y>=^n+)~vaX8J5JOTukb^QF8byH9_5ues8yTCx`Fite!YHYI;sW7+)ndq@R z(V)nVF^CO-nLRo=DFQO#;9z$W#~v$25Wpj_W*`H}ZU8n)W(NkpzrP=76w2ln2?suL zE}8m(+JvT>CRg(nHpwCw$*~FI)7n7p(&8eNh~kox?Q7{Ot+k|8P^np1&{I=mD*UJ@ z!c3MBicf$^4GxkCaKocTL`1~J#U&)(efThyffdPy&yH~#d<XsyZERS|6l(F^Jv{a& zQI>!(z@0uaL1Tjz?*`aK!k&Mbn3#X-42$SF`1!L{{qV0muvIo!kIYmA$}3yj+=K+s zt%itl%gE4&ky0Fc;i#Cy@F$fmJx51JPfyRAH&?s633D|kG~vu(k8`zos;aATq-4d# z4}PEg4E$n-q~kV)4z!*gP$4r@Q(w2RfTFM;PI(iK6(DUb1A~qVki%kQ{Q*y3S0~fR zq(U}_0Lx7V?&+h~ingw9Z;?UnkvxJ3_WbVmRbv8vz*Ax$KL#d~d?PsOmYNo9d&Toz zsFi?G4U|-wKm+pX?k*_62SzF{FAt%pvN8d?k_-g_9fuu))mvzL17aLNA2~U>K*>CE z=?0)i=Zy(AAEhYzAAJ4vgc7)}Ko*riBI^Z+#t+(Ir#+K-%cSg;mX?;F4-Pn)`0vop z(={;g=jb~}I*p1Jn9VF9S76rRA;uPylat%p)D`0flYzp*w^U52z+h+4+5)QL53hC2 zRn5%CORe66>w&Va>n46FbUS={5Ck~*V<9?o$osdp1Z*F(1rk?+x6Z}w=7Tr5bSb~S zK68MBNjWI!3_Q@W30edEFO(_svQm<gdww|V4*vcSHKky6Vq)HK^#?BFzoR3LfPV!n zU1WH8w&FwhP6Fvvkhgb|uqK(}IY?2Casb1v#i&jWR>MX*ySw3r!Zu$gzIZVkpk}C0 z4>(gRC>m^Rjg0PYe0~icr<HN_Edg5b^5x6j-Q7?~EPne&%Gio*s;FqDy@dZQ9Bd@e z9$p2&Gzc!@_K%aULLl8=y_l>0$~hq51Q;vW4JiF!kIn6XE&yRapkELG%Wazq<@8Xi z@X~-$!a>I91M&ieAtp&;58agoPtyqY-w*2t6Sgrj!tw|kxXjcGXe3D8U`rGggU^^K zDZ{*Vq~ZuN=@=LQMI<302w~OTXQqrjH$DlO8-#v*O28{YMuvGP4Lnrw;^`1n=`c_) zrE&5;HQ<>*D+Th|OMzX1@k0E0ffs=)h2|~LKI7ovfKqG35f6R0`2z%Cpy0vwAj6s) z9evl(&<C4f02gJU07M5=)YL<arb2jW6M&b49WYAjbbwG9Vv?8F-qaL>Z73TRCODds z5)y*7ztGo~PM(~c1dS7bOqgtnpa0GK_i4f^WI0dFkwy=E(e?C<jB-$YLX6<K`KX70 zlr%RZW6_wPKA})`W@@UtuTQ~mj}v#8(*#=F03)EMpzs1-sIgH|F_TT)IVgxFY7>ry zu4-?8UsFTlhyrK92&`AnT=xM#TnJ#&;BcUL2xM6x1OtV00Kajk*8bz0H$;tlK)mzz zW95ZHxdW{-kXJ$S21zA6y85P%&moi>a4(+3#0c>6LVRD)fk3W|h~8x{EG!g)<YA?o z`q!nNhaeK(ZEwGjt3C1bSfug8hm7Q8DoRRK+gY-WiOESnpjkjD4)7ZM#F1O5=Q#+x z0ALW3ki<qu15f#aP7s9&aJvN1<0Pt#cj3aKa5&99*7^6_b4|GhT-D9PA~wdxs=1db z4j-`}Kp->R0!R@~XblV(t9b+bA(Wnw%7R_Nn%A%CKfnRc`OW3lt#wH0!R8JG<Le;} zh<I~3R~s3E7EzRxgtp3*)YO|IbVu@`6&V2CLqk!PQt%mU2^g|;1i;^rI{^a;YKN-Y z+GjT_*k+h0EKzAALqp_DOs7yeXJ<1j#(7GB#=F*h?=^~sr$c;dVgmdEP#(`c`UnCh zW@p{++yS8Nqvry)x)pm?7c|NF`1mL*D?_esW=0F{c?XL?5Pf@cYRVs)WROT6^=>b# zi2`cH6i*r;Td3$FDp)%OCx(Fn1aAfMreoMax(i`>kW#~y1vgSvm6$V3xf5ZI<eekr z!vBfK5_s>PxE|~BYT&N}ULm1a1Fo#j<z)zLob7>88d?*e1Mi1>4-hvXS5W=*yHKJy zT1M51Mwp@307xCGZ&9ACkOQ*GX8?=Q+}sR}af)G{V*e9&>flDh&4HK;US2Vd%?&52 z0ZLVH(FzLL0#Tk<AU?tghn{~Vx(#<5{J1nTY@J!&_-0aK;{26sGemLEq4E+HO)%iH zR)KsV%Q4DT8HpXS2n7OMNT?Cw7w=N)x7&#*Z{y+N+1C4%78ON;2jqr$vde;T3s4dz zC8-Ll_z{Aifu@BuV**+r^YF%BKyom^hJRf^P!KdFU{3I_vm%_)UCqmIqM*+KghMOA z65kACa}*O>%9!|YVWAzEK?L3YYZNA&JqDgjM~CD6v%x4313<L_{&wg{S2`Dx0if>@ zciK8SAT`~a#96Qdhr<%rVy6WpX>4raIIco0$S#0IQ%o7e9u<8mDJ2DV3Aq5~?#YK5 z>KGUpKp=!#5f*kVAL=OrHVf_(Kzxj5jhT4`tlAzDd-+VTa<HbD7-DF}XIVIu4>~=9 zD;da_hwIZn3>bgl-tyI78Ciqz@K&G}0;(QZ=Hp{OxW7!jhlf7buTw{VMu;&}_Nxd~ zn_#TN1zwGUj&5Rbu-S!-1>xf(DHQPcd4z&X<7cBoLoF_3C}ucbK;|AjdIU;hf7KLE zMgNAzii&s(wig(S&466~&^C_%owv2Kvv`e}fkF1l74#Z;j;f_4!@3h*UYCfXwDbc& z@iK;<4Q7G=gH9!NH8sOzY&2IqE=7L`cvC<44WO(*ohc|Ryzht74Ef`D`!+x3dYZN# z0c{9+;~d3@-S9fI)$iZK_CvqRV1PABCtkqw?%jj|4tznjJoN{3Z{NO!Py;;0+aFK< z0Oy&TJBJCU#J&!`zEbS$d2n?HDq;ceUZex7oE(5o=3|4~6>qU>LLY)({0{dPDIFs$ zDA?BC4mtPE*4D0HYzM7>nXKE?>*<_!Fb=RuCZ!;zr4$|FnBBW}A>rYe_z#)GS7S_y zf(I8k>Ff5k!ret24OPWfLTKPxNPskKpMD4Dlvr97pyt4c`)=;;;V2X&myE<0tVN)} zAZ3<y8u3<=W3=OkWRaDQ4w4qZK_9wE^&8Mj26PxBBV%Ar*!S?9Hzb)p8#Rb%Q3;9r zpez8V1g_z`AI`#q%iP?+b&;{MD#^+9tdXObF?JIHMA-A^Y@_AIIzbu+2BfACe?UC| zE&AAV3F-n{U%x(%jnyC&I?Ppk=wJnouF?V0vYWQW6@5?;Lk0)qxTdBij0?ae;=uKR z%c$Tw?X8NR2lc|j<LBWJA}3jlCI)bbwDuv@1JQ|z*Y96HMn|uYaY|<cO`!GZIu>3V z1s7B|m41+nxVUhedU<<WeDDj1$yZ%vV4Kla1#q&XqXSZ9BJsFeIPcGPX6q~Px~Q_l zgb!w*%CMV;v<uk4=b}&)KzN5fSSW%g<oF$JiUNz!rd<j81r?m9Jx~r+J~}J6X+T^R z@8X%_^_7f?>Tu?FlT|a(kE_973oHA+*hXZ|wiOR1^A58;=dAC6(JUmxJ>2&*ZLPZv zs|v>t(G0);I0=ju2z<0rn3@cP-H0hr<%fskJ|Nw_KX1@XZr>kSEfZKTNqIz&_7bXa z2rlND_O~V7Zry4b0EY-xc8R=RgJW%VHNG=2<LoS`q%~75DVA9dqXjJJWe*d>Sz86u zp0P(;5KG(z6o85RWKU&+Wr4kik!>bwIy)PBx(t(D2C%Wu<-8a3`1K1h;9Q54Pf|AT zXng*gEy(i)4_k?Gqp|&)WvwD3bBd1WPXK(_-6$GiXD%|THQsUKVND|xVVi&4pQE4? z5)0o%QB;i84-pM%WaJbFHz3{w^;U5R>0Jok)=NM96>?pOvg$8Hwj&9PS6x25`3<{O zQlT~G$qbd6NN1Ht*0X(4F|pQ<lr=J@=I?rMfdA_F1-T9rNA+07MRtbDg08NspXVWK z?6N;Syz#uGM4+T#5=l^lmNk8rgt}peYq5*!o#QQk^JZTR>wfn&)HXRw)kiFJY2(~e zn)&9t!;q0QyoS<UXIorpg4SOs3BYwO^Wfcitg(QAfJzckN|5}#)<4z{FHPjg*08_& zIYP|y=gy64LjO4C63?QUNkc`U(a+=K1@us;9U!AU6)R-#X_(sql$EPVCW*lw7A^zk zgbEL*rlOh%{=PaRA^DIpkVGkIGc_|an!46>PY*6hJWs<k$PdV9X*(o?kN3EAoOUt} zCMUoZfw7iOk_q(yc9-A<UN^74-D{=!=hV!Mu8xk}y{}|JEYhBjWU`rF;oQ%EbTIKh zN2+Zz5d@5>L2NQNcDXDM558;Ufakf!LGScI2M@kWM4Mad58d1ZC@s;lD{|B|7|B41 zNPprzhHx&d*yME=CkaVOON><~$Mvw7%ME19xeP=T<K$&PxPW{Obb1-vPb=^sx}NN< zk8n$STlT$uu~o)C`)%{#_p&mf7Z3&0=e~@s-`neZYCHQ5f=R)8qjYjBXpBoIcOk7f znj9aGy#M&Bx9>JwK|nK{WIx%7JXbIWmY0>0ab)wy?mYl9e>ciHF>ST+U2Vmm=8$(< z;kKOEIC(hH2YfH243Mj<K3V~1apk-Z53KGd)xQfW20(ij2bF|bkP4))!_ZWmmo_#& zF1Vd6$JpKBtYnB5dHXlPU}GXBmILnK^5vVZu2FDXH^ITz@<MJ}+XzY19=)rP&p0@| zg<AmQlZ@YgAPJtvlNaD3K<}tnSZr?GcnC(Fto8=A!w}W-u<q_sL~fVP+ncRWFP)@+ zdFb$MP5Byw9_tb!Kutpf?d$jFOkqF3ki9rmsT!!4Yu7?Qf!_10fwaA67%G84I*-dO zZa04ABH5iE+d*5{L5y;)Xw~(d9S!d5%(?B_fq82HfTHeq`|`P^Fs+MQ@^zuOD6<6A z|GkBm=fAQoJm+4Qa71(2i8m{Eu<TQyO2GroBtVfSt*d&7Td`>9GhTsleXm~eNDCSA z0$1(EPZdGxyWE)oZk6VV*4HxVZzkIzX~(2S74MmT&XCo|0tM@{Wv-!d!Fzoo+8i7# z^i_jmQDbCw2FhU*>~TDjmqQ2nB&RG#8lK3C4rs|YWyIsIj>$iy6J+{(`KldUT?xN1 z=JKijO8ZW~^QlbGn?8Mic%)Eq>FefZ*yLM0Z4xxC|4t5~ho^XiXZrO^)2p3LLsce; z3W<rapZ|K=<TxFEwq0=Sfa*@}OI#@M-VJB(MEdVN`Sbh(Ee(XB!EdoF3Q=c!K;r<o ztagZ9e0n?B{Iye8YR#35I~7%5B87l$)%*G6M;r&j7*cwVO`IG_mBSitM9*FC01hw! zW~kUO8vY{r*DgB@0ppJ=o($wFwJt0fJ0GEOv|}@W_1+SFI$yX{Oz^JNrB>>*cVEb} z$@d<)(-*L}x3-8$NQ8KKEB_?j;Qx+!xu`QjlbJ~;;T?2A8?rV3o`aTVKr*wfj#W$F zY*Vn(FeC}U&$G`C@kxe<$vq$6^Z=y=l=7MFE}3ir#_fqKwRH^%aESQNf&e6gyPMhH z#=+*RCjoNhTIBcFS86rsZDc|chwP1We{av7m2wm+QeyXESj_?dcM<+Vc=}q9VP=hC zc~s-(@L0bD9nGz?(0npmx=_z|;bu|4%SuY<N|9mJ3urWU203&F;NrBCAE#r#<dJS9 zw1Sp7d-Y!|qycI=wN_=R87^n#cX6cufDuTO#XJbip^0yx@0((Ce`P0g=Z=R%-b%Gq z9u7N}qaLvQ{y&NjOvX9vLNXyl9T7VSe`yNFbUrCwzu-Iiy_+C8h9vXXR*}+g-f4(M zVRVd)twVl>gV-B&Oj`{MG^Ss&Awc?_9*J(v1zx+^2OFxjmsx3i8-5PhZ>uH`Tk#uK zR*r)9vBK8-iRJTl=}T`as7+A0>s_rQMFy3&-h!nw^2bdP(}q^Nw#|P&yng*;pn|bV zYF|=|k<UCfb2`%;IfQCMC55cRs0YY*M)QP~DetH|I&!o-{C!J%*5wD2INC9?c)AY{ zxr6t(_uA#KvgobPetz5_L;bEmUiJKTM6CBcf&DAU-*-8l(nK(qU8E2oA*5x0(sh6J z$V;Td%$~pCR%|1rH}k0H#Aja`A6f-1UC;BIY0{Ybq%wbQAsEQB4ARv@<-?m_E)d}U z#}sowKm-?+uB^t9W?>bQRA49e;K1LI(BihpT{d*slD69rBVLMq_Dh$(`Xb(<%D_AP z0o?2rU{gFFN=ix|$v@pqVAt{rEWH(m!(`axkxLC2_eocdNax&Bw9qryt(4^a@lC+> zAPtKraWT_2L$drVPmsLJ1mZW~RX)NzrHHp~2@UD*RS+#+Gc#YH{1Ce7;DG(m{LTz2 z?oqIR4zF4!S8}=R7Ll1juJYB;22^v6MAXj9N!cHhtbe|<zJ<UWY5WZIdFfD_3+Aej zS)ON=0)zx+`Fv2#6I8r{!z*tu;t_^Z>}=blMT!NW)TwT6CLhN7?7u;(7zB<}$Hn70 zKoe@kP6MkJ>qoA*RJi&lfWl3F^gdMmKesIr67>0byPF-wDszV?-Hi`VL}&m>`5rFt zXyKd{H4V)keJXjoq&n-NScA8KLGl;%)G!4;O{$a#%UkL>w@KYhvp_$zPd{aEoOzcd z<&SZ<8S}Siuri36hxnuxU(OwyZZQhF7b(6?1gr;=#_F1yJ^DM3^e(&dqgz^#w$hHb z4euJJX7J%eME(Lkqt~StPuR8*)$l`_ZLdC#SS4}kwjSeha%$=&A|Yvpb{72RN`RJ3 zJp-w0U?S3|<4?}y>(cGUMfwYCAPO|;%ISMM{C$)x>vU#j1}s9);eI0KL}I!AV=6HK z5FJc|I!dus1B%GUj~|W1r=@k+v{Vgu0n*-X3U9G2Ccx2@&B0D(`8DcQ)>A{^3<M>I zpvRNR$b`XFBJN=04q_96E1degu``eD{TLh3kVKsSapRsFV%5g`uLnx-%oLfbbewXo zNT$Ck#mB=dU|xtRRclkRa4ja2qP5f*nVGDR%JaTS3P*c2wtOf`(zChs=E_1G`hAUf zdBV*1chxCF2PV+LP1K=lr|v(+mNz5M&urVrD=e&u#|kB>m>X*A>B|S{7|&<j`ux^T zwxop?{V0&2=-G2TQc5EVbYrZ`Du_Og``x)nf`a4>P2&}Z%qu8FbjwAo>jCOi62bXx zB%I%-J@ehZI+32Y=mMqHTA>*c+W-KXY|=&#TBy*m>;!@hHgN^b;aHaaJhGlUp9vr< z9=se$>R73h{OI&EdF=W2M~YuYN84PaiT8!d-SSuKpd9}KY+$rp?@kXoY>v83n#PB4 zVg9*nR^<>P*=heKKWp+()Lq@$>rh{wQiwmoRr7Jla~5xy_FnC!XNo=1G|6Z0JbAQ) zb+KUKsnJFD0B=DcI2UFKB12p7RVe~SCxVs{L==~}xjP09u!X#BU$Et&wXzcjDKvPg zHH=d_BvYpB8V0At@?UY~wS`ks6AC_{1G;y2<Jsb34y|Y&?o$xf+ym90kCN_#`I*<0 zlFGGtdI*e!giB0#=z7PkikvS?k9<F%Jbm7{<)de$3WbZ(Eo@*86&stKi;E`RlKBKL zDlBZnvwbTQOGvw_VzL|W-J0~}8CQRQf9NHmGkAWE{mSnd8zjBnlE@2yU(?3N#*XBD zLnGMAUjWpX-IM-4wFI@*_YS~86={+O)KerHdmhzvp4#&YB0tp$DO}HPa8z;Tam8HY ziz(y_Txs_QMI!&-C9xRjEU1Meh&I7yokn3oR@a=W7!05Rcp|7OofU=GpDk;D9>qAt zSv^0HuJqa$Ti|SqN$>eGm3go)I$5*5Jc4hswCV|=H)yT%t^%FIt_~^NC+tfG(GE;R za^aqyB78xorDXl)bX*n_ZYyC^-b|EtU`|0y3ZRh%>l{2v24rByc$|>r3`SaeO1_7M zdEjQ7yfM2kj#(9CRat~W)4Lz4vnh?wp3=N}{W_uP&t+T!YK@I#RH}&fYmtoN!L+KY zNKpZGs&|~#wZ5UCM<4@iId|1#MKrH1zOjdvMcQ`*1?e6#X%M|WJVt^46Q_Ztzazf2 z(J*m-%XCsLyw2?nc(Rg{hZni3*rM(VY*B%Kc_o=uDe_;3LU@Uif9t;HS0^P>a!cYv z;z60c9JXbUw}2oS%_V%BY=;0K1Ha}W-%mQdGg6imUIv{!AJT{`!Tjx$uN`9NAjI7X zHp9nq$kp8`ECmv-qfs<gbC8`Rb4xYhQDStATZIxQ#n=DKnl@p~P_9xifc+jgQMi`T z5BavGrR%Rt8rhe9-&`L03hWq@{oEx&$Ny}&;?Ok`7dMvw+VF4(o@N_`SEZ#t_IWTD z<i*pTr^k^;I15N<0u<GLHn+(c2p@eyB_RRIC~C_JaId_EB;dHOjnJWcX+o!Won_i& zik8yS6Rq8N&D6BLN;*%X)=bTaKb+=Gs-Aw_g_Cp?%_+j<arYZtcBvOG*2KJY7c3h+ z<`h?t2}oxc^0?rx=Y^M=Q;{9_<l2xuw>AHh!;>q!Vl6Y4cJB%R6(Zxf7WZiS7XCR4 zjS=}5UlS`-*Ka7=$2i&-k&%#SyjzF~H%bieGgW-0&>^~D8gH&8@4ZSKafPOP^erlN zNc=E=W!P{_<warPuZKjskA<D+Pw=qT9a>zT*$1^Gu6+ppsEr5pZdl{0spW0Jz!{US zwA?9w_2`Bu*TgtsZ_C?zvudW0AzE9{fXI>qy8YxIussyd3%vT{-fhl2b?Ng5LJzn} z`~&S@4m$8!ztFGCyu<SHGm<@{SiXigjPc$%!U}<XGrSazsEjx&L>kHFQ8dG|5Bp+W zeB#9Xo&qBNi*yUaU30XFai&{&H1%EXLGxqyf(sGop*{)`g41s?Hnjh>F~cS2Rz2Q) zV5(M<m7Tg9LfBjXvFb_2+LdQGi8g2C?b0=$d3zxsOnJ7a=5uCB1q}Riw{TSvE^6l| z7~}c@OvgjB;GKaygl1sMxcO^`24noQXOENO3g(F{+J7yeDaPt+h97avynbVC<$I3S z_8u#Z#b;(a1QEv*Crjn~O?GCw)_6t)8i}AqU*smD;{14LQTzAI0g^d$e(Dnf%ig+e zh2qY$J+9G_(gcA1Jm*<)@bJ9f^UUDT5PkWz#*K<--kzSA5XrdeY(P3VFzWH;rhWb? z+V0EE)J)KJ0e;imtZdy11b?`F$4md9y`<cu^fp#0%g1y(;)6MWA$AGp<184mZ4KR? zZ+_kA_YHC2{~N0IdH<?1SH(}2zMZ0$IWpcCIL>o&X<S(F3~9m0r?<Y0fv*14iCnm^ zh$jAvSjV|=@(bq$G#D2mTVTDcE%LV=&UJ)rVvC1K5VjCNteeFWmpbRoNO?KKR@9yw z5UF8<oey;t6^}NloLF=-UW!aVz>IlHGckCtQ90<<YL$nI3}p$84H4>qgo94{v@s}B zS(;K>0SZ!=O)n6XVEtP8K{PF(n=C|(mV9fiWt_$Iz$B<}O%PqNlr^}x7)QhrAxCM= zwy+0D>NI784O%s%qNCFjv=ZyrxeP)Y{2%2tBiXBzyrmY<Kxr(TtBf^Lm$qh`{r1MO zcw}AVik8QdOasAYYb#<kI!l1bqJBW}$$!JjAd9Z~uCBhm!wYBbzIP&dpxoekIM0UL zcrAxQ^;zc)Q6rhN_1cZA^-E=$Py+opIjs9VHI<ROj;LG1oTQOJH4^QBpk%YlqIB1l z0LqNyHxgBWbHQSLTl-kbk~ofJP`KQ70*>;YJy}iq$|79?@FCkSAMj)Z3FZ0;1P>K6 zse-NPM6F%xyy1K55t>@>_wijqZPF7G?!u5u8qFaNaO2;T6gFr{?)J_)?UUIVwt1qy z2r>y7(n0^o7xgq!Ancd;q}sJb#w9^lvPl<Z@y_%^O<RtP=%Xd*yK1H`#Z(xcLaTGg z1*JCnM}zICC#$(SpeL$Wdr7?Wp-a)z?yfc0M2BU2gV5`oJ5PZ((gYS^?J->#%2x!` zS*VbqP3(i7P1+iZXFNCPQ0}Q-FYjBM(5TsW$mF#>RO5`H+X?in!2mPH_>`d)xxlhP zsT1(2?;R-E4vg=)u3u>KeC)VWcrZ5i50Vt#iaRFS-@N2<p5X*1fzgrc+3lX37xa3g z5s{Hr>r?&*pU#nBkAskb&F7@|I?qShSMppDA_*rNo6x}?G^bdx2uGsp-O@vZDIU^u zkXLzA|MT*ZBGS_MDdCE(0Gtza5=-N_&31cUUL_5k5mRp3qZF+EcNH}L`e0(+;JGpT zFV>PmI&67nfv+MR0!7C2x1Lg0W-bzI(m4TkHQ+C$D*Z{+SB!(B73rTJu2*K$z{ez1 zVPk5#>Ov^&H{Xm^Tc`0>)HJlNW};wdnXJHaogSNCppVyKXUhK<EXKjkuKC^j9BNdm z(>Vm@`ZURQUhlslb$8u<4tX`M_-}!+cWXeWxX6lwKoAiy*kT>D-(K2m7)p7mk6f2d z&nz22{kQk|!&61XYdEVX%-wF=-M(eJRn>x!zG8y+HEmqj?X8H>2NC>ffrBiReMd^T z=@TA@+Rt9xVYkK3^cec@IX(2`8}0l<?lsSk<gs{3-a5RqrKWg3B+O@_|M^_Y?(*Hs zvlmyH!B1!~#M;@R+4X;EYyv(8Qutl5*%opV+V=AI_n*-@%3Y(e+;bf&ozS8?+|IhR zT2@M{OFYju(Lq)A%W2k{h`x_l8R>{t(?>4IhUNmNljJHHObHEu$&;jI)?1a=p}hfw z1^>7S2&e6UOlCo5&^<Auh<N;jUFyuV@7V6B)v#x*l*&?|?f3Zu#-`G_k9}yhIuEBW zH}lpwiRFY+oM<`qkrq*OJA9sZ?mkShHQsK49IZHI_WLN#txxg!)cagps%L|vD)pY; z3=9ktI`;x20_<+F2=24T5|l=gvgXSb@IwWM!)GaNU6C>A?RLvhg4L0}gx{W+;Nr!U zVu`3#Dp6ner#7OZkHYL!o=JS<byR>*RL}{RC~FWMA3B3+ASW&9Ezi^#Awq4T@opu< z&{=BJ#uxq{BoYTNRpYecot{6`PZn;zz`HW|%8-1wZb9_zdsH8hIcPr|S&FCSNoqa4 zrEspvW4OR~%!GsA)|(?1{F({o#oRP0Ed3kKK&C_&{rpl)K1<7eS)JcKfvS0ffGjPd z3Gn3#{d9vDf>t;p0(}8}@hrS+2;7X8+C_9ZRjn#zKNeeVh;kzlztzzX9tFnQkJ5sc zPXf)@-(%hG?CZnuc&DfGxhm4p&<uk-?>B>wt_MBR{y-yvg8`t5&`1JOm}BB^;ePDh zc}85hmqB-J-khQR;>w=kELwUV-8UN#eXKNUo%*qckAen@ii-&;LLZ7dkm@2w$H%$3 zxR^m#ra(+}h+j5BaFXT;ZyuVHa5+TO@|lS;-H2_i?eSyw?K|%77k}723Qv{|I<1`p zouaJx0@JxYdi)nR%;ym6S_;fx?Z<;89hD>r1gYBp(EiZ`GFIqo5v1S4`%Hh|IkX}L zWEH!+p8NCaUoP$=l2r>XF~^bzpoIkN^teihX^XAs@T_ZP-b|K0@&L_pU(pl^?$@6r z^BvrroD;`~%#@b9cFX?C6CAbr+*`Kji(pAn;R>>jm@USk`pi31ZY1fTRe#&f?Gs@@ zPja}pA&up59>LnV_$FDNZFC`x|3!GL^mNXfcXpP8!-oBV5%@HE^`LbaV9V-<7D;G& zv|oFy`Inf#IJo%(BrwBP^Nr{KzAJ<CourCK5-Al|W`0Wk-Pje}85ESmGJme$Lc4>$ zvH|*2vW1Ny2FE)L;0NH0ucLnJ)aKO<0s;@@dg#FjlHzI5O=jc2yIP=yto+u=em}<6 z>Wx743soz!J}fpWOUZYGnU6TzTl~w$F3FQ0v|t+8nu2o&*glfLHEaNa4m0|fn>%t~ z7i-z(@el%OQqb#8K~qskkypQOP4({%0?qyCTW1l4B605zNV;cQFJ;;x0G)|ec;rx} z_CH(L7d{4;%&vFXfNks9>OeFbZup5r6pDsOw|6lR6eCAnD4J<&LeF023{R4Cc^Cn+ z&4qr>>QwnuSrusppU9~k^0-}mfOmW<>+6YfFN{0V;Ixm=2Qt`G{nvYO#GDtJ$r{}< zRZbsa(#Gk4rb|%dT<<_6huXu;Bj_0z`1Q}3_Jx~5C*Im~BDq45!Y0oqjf6pTddNoW zDu_g04GwTtqp)J@{&Q=l!u13X6hVFmvWly>$@_7BGpMQ=8&l@0JRpY{S^og!hEQeB zj->cvXBjwBsjEnI&s?_0y3JR)yz{IBi}ub=1kBy;S;8aBa9q3npbVY!=-b}z4y3dJ zB~D*BO2{qI7h#J)E!W4&KqPlF&O$d>=R^X~iX;kU$LGn=O!d`;!cxQNk>k!_p}O}u zI%hGmPG9?nL=6;2_0rtelC?rTv4NPN`yPQjq{Zlz@^Zjr)HOAyS@~mjRRCWwQL1Gt zY4LVhx5Jv_#eT>1b)clA1c-8w9vq6M1Ox@FuYY`aBFV<4Jlu}6fCHo_^ndacC%p&8 zh{c~j+4C|;3rL8Fk~*d?;cs5m(t7@Ei=@pvJavf59HWr75pz!Z4YDB64}qeajDkpe z9>dQQAUMF`f_4%_#z({;*Z4XlzUapfQ0$Ny5={W&PM9KEw|)B->V%S(R<r!8G?f8s zJ3KHcBcr?Mmn5Kn2NyypU%hz)9nGIUf2IP6j^upn4UkOdYClkf?a!pAqr->XNB9>d zN*1X4uQ`>f-w*5qf$)-)JOpV$-~|=w98fzz8!xCm_ULgI=tLH?m4b6Zzx#t+wr4di z0cJD4y{e{Sf<F!FJYqsZhumkBDA)N<<}zKE^GJm0+Sk_BAgcp$!ZEBt9s@hu+XFw0 zd2|HuY#^v*`2LX?Zq7wJs^;)W+#i?l17KjPt(Dc1F~Rn3to_IGa$z2x$2N<XtP#)# zq^lcaQ@$pKj~0dS=kTe(Q27fE)WMb$neqqLnS&@$8D`?OT^9dz+ks*9^Jk!F65s07 zqJWaI%|W9)6~RnF$^*hM5No7E!C!)5_(9DN><PTnL~M(lwAV6zt~MDB2;&>UVR-aM z>DSVj-+*ol{UVNij;!+n+n|8M$OFaj2h;?rKdzec<WYn4EH*B#sNNrS8OSoAn!mrs zu@Bkac8^hlXo6WTi}eu*<FMZiKvLys4#U6iZ<zdZ7uWzPBJ%<@BM>(j9WQaHVH+Hn zK$HO&eh;X<BO@Z9Y}tqXe*iL02=rI462NK3E<id18Upbrv9utlnh1k_&x|Y4gQ>vk zL4TBD3L6!iaI?8M5U=o?OBR-v&?5-#f=ig~Yo353$Dql?=mMa~cv?d1RBwN$$Faw& zcy)C20RH+gA0)oOqk%FIlrSA)3JT0jOfzF+?U)6CPP52wS^=ZTQ3pXMyg779z?)aZ zK~@4SwtKLAToAW+b#{Ux0nH2ALEH-$Kv9ZW#yOC)z@>v%IVMJX!>>OE=@N{-2nJFB z76v?bAL9p|HRMN$!h{yP$5B!FQnmPIL!+ZWykeBF@B-%ndJe6LM1v`if)s>(6%G(2 z5>$h!o;c912jB)MQh06Tbvl-pIpyPk?7{pn6^v*Cn(6A>Zi@aqxWEDeF{=~@hMy2U zRvzILrq@7w!pNw@iXi((fqQ)X_aOq+${?thkApu@3}eeegA5PU{=^r~W3JRZ3>E>q z4CGrNcpRSU3z8OR;6qrU9k#Z%6JAsUH1XG-J83TcXnkN~^959i>#yY&_~3Ol_mPzS z_CQL2{;IAneSmF-g~IZaRE0<wNGcY^@DXx=3heH!=zs=@s+_gm*T)CbENW?q(X$vs zv4hdHL-K_24(C9K<v9Suvf(%zKoK7pXHy;*6Z4|Hmq0TqCr2L|L7oZ|FYU_cXGue4 z(t&vb^m9E0joDC)CkasHAWc3X8+{9h5s3F;2b8E)Z{Nas!beX(eHt4x#k>P6eY>2j ztbUF>K`=yQ{37MIdKCH~5nlty7b-uD{0VMUV*!X7pfUOH9fN_6;0-Y%HEm?nw@>1r zr5%E2ADM)D(tzG*&~jvC1TF`%ueVp%&W^25XkG>Lh{3TjpS|TSn6d;L&eRP49TZsb zM}}=+T_6Jd`bG&I4%7*Z49!5>QRqJhDWj~c|Lxn+u!|IxgL~OPSJAPu7On5%yTFGL z2;P7<K?rUMecRm?fm7?h1fA6E?Dj4$k+6``tDv&v5y%NO2PtVQ(8y5PsjB`xT@GpK zX9#Zcso|L!(2D7M`%{#G!}tjk{h>byY!7i8j2~L5zV;}`K@);Os}M2FD#Tp(L^zp5 zRb8Y$@O!SVd{*4&IkHGgcAypPfQEko2lOzQ)@sl`yO7<v0IdOq6%}ySJqN|-7jWQO zLYL3{PeF+Ng~I0vN+)J!P?=UR?CIJyY*7Q&Ub21|6?X`#WY|N@_UQq&4eHul?OJ-y z>cF(v*jN}>yt3kq**(<<4{EKQReXo;VWVnb&$i~8l*GlUE?lT<1I^wN%<v{4Bn(}| z7@RTKbo&R;&Fs>n<Wvwnn(4W@9VyS7njpQwk4#8QgKSsvDiQ{K#Iv}_kl04w!fBF( zwg8YZ0*l_;3~9p=0&W@14TtLu3S=<NL8@0J;N|^|r?T1eR-!?p-_h0vvL|pg3tAuQ z>*JW^+OzC<g#6c9@{T?WFdJGx0~{z{r<#JBUMz#WNv%bYz$^jO`H6`j=0}aac=^&9 z!<eC_*=Q^qefU3*Lmm#P-Pq2K5XLJyIXW&u?@TX&qUZcMg?=v{MXu_YLi}%#>F#|y z2aC(f%^gVNz%Q~Bp~FPIh|3E|I7FD+0MbObJ_=++g0}UD6Dk;-2EpneU3!56=16sX zVS#p|#eICe?|t^r{7&*qd)N}ZFV$A0CpAEM0OU~7g?WmD)N6P1>-Fo<$C2t0ayNJN z@?~o+dwX{II0#K6O9GlpZ(ENbeE<<idX5t4gC6qg*T#ccL(2h1br;4azJiG_tcuIV z1X5sAq?L7b^pun^&#Vt_?OV{gN1O!w*to73Hpsxr+MZW_`ujKgI;aCNGQdl~;6i+Z zMmdaGKpuxsR&M@l^R)~VmNxwx8^zT*>FHPJR;R*R?2dFNI)I4-P1o>W(Vpo!qUEQ< zS2iNPQ~x&IoDcOC5Ipal=E2FTusS!Wa3@D6`gYp&hI0HkFgs{R0kM)6@80GW6{Nbm z`!*ykFVkMGzay7|<})c!*x%ins07iYhr7FkxHtsjspVJXOuP4lDSW(t9o$lUQbA(Q z=8>FgL_31dvfC6FxT4qdEnMk$m~r^(dUdUjpHyu#WA4wYni?7wmNSS5*3p!dly`3w z4&1`;3whB5tpG5@!lt~V8`!ONqU*k}S5hOhvwelhGSK~EXE#4FL1!CUfqS_c<|+h5 zvt{*wKH81ia>EX>X%=Vp`)j9;CGzg4y*C~F5A~2Cn1Ki3AUKWU_kw;n^-eaXmfqf& zrY0q#MncC{gGQW%d!G<Gv!#aUSsoZTPfF@C^d5i>R#sL6@6qY=Q2hAc$62txGuODS zn}_Rhgm-c)uZ_JYF7_9cxhbF`RLKaKhdQ)Yc0U{+tqAk9o-d?7Jx+HhJA^KgaQq?; z8cUQfOtB7EjU>6+0MB^{nzEO>n#JJHYY8bVs~_|&-bN6O&%h+PuA*T@$WzMt17$)h z!l1EWBE`w^oT-_uEtqx|34vg_v!kPGS=FiTd#SAXSAL?9?_s2>H02h7uvQS2!KX-$ zSLn=Ke(6RJ(pa;_vMLGro&tt)gg}kJMSXYA*H?!$fs{!)J~6TCuY%nTBe~?$LJloT zM3WK<KHBtfaL7Nf<_8z4IC4oGgwnjw>k2(>y}g)07HMpM-{U1{Ng#h~5Q2W-78lAI zRp=?B=B!43&uEhhrzvP?_}!VnQ7Z(~*auxKQ5@ju08fkvQ9*`BMna#;$dEE}Xc@87 z1>?9xGIC*30Y<{RuaQMocP0jjpZY5@%MAyHgu(o_q397*YJe<v?WLs;F>m0r@SM;~ zgC;Nw{#nh13(*YL;tBkjVps)3>6Z5SydUY8X}y#{f?g5)=L}fc@AO}KT&w~O?~537 z0|d`X4W})@46l0kU{O48rN5t`tiM)cNgJ+VjpIo3D-z!tE*<4A)d7(Ejv}4S9P*q; zN)2xYi`T_l!MJ#guw8Lf=k64h>i^#SEP?8oF_{(#1~XSs{^N4n{+=C66(DD2{dU*g z2e0}af8}7+I-%Yd?gdMeqvsoJ#@yE7gdFd0(WOCPjxM0(CK6<*Y@nk)Um)9=8c68A z4YlCHcjPn|)&KKPAu}_5MMpQPQnPG~yln>W5T`jUly@#&c7e}?u1>GD77}MmrUr<& z)rdA&P8C-!!m1t`-X6$L`4HfCekL%>LwC9}v~yw3{41t5qUO7xaX()0m}+W@8a97v zs78lpUas&ADp-vAYE;qCUQ-h<*OfIESrm{De;jp-Qw6qhFHLG1vG3nEa!b?}YEjEP z2RjqI$wY&^(i^}9%d@!Gqp%wtH=z2*bQu)WLkDDFqBBeqfr|Lp<fNi1+vd?oOcpBj z!%F{~Axaqq@DR_0VM(Q)Q_WicEbyQ0uTnz4!)(VcwlPNg7YmJw1JI$dw#LCFB{gm* z0+fwIL#rB0qJxqKx;~(`>Fo)F5h_r(f%KG^s?!yTRNev39dyt9hSt{d3JOn?0T%%k zb80Q1^bafVd&5*hkgCUIK#i3*XE+M}wFlw;YVKoi&bBr5AVOOUp<NOLL&!=>pnSe6 z_k%6#<}znBde1-d=2%gx<dx0#pdGuFkc0lUZ!YFzxi@aPGulWBQ`*XcF6iWL;17c( zt04ZWywldLnT?w#Yb$e4-JKZqg+0_1cfPUMW}Azj7De}wGICd5`+fII;J3yK%qgO8 zo#*&xQ=f#V>c#&iFH?sDf7FrgA4O0i!khwqi@ZRoMSQBMkwmha5>K5+uR{54Zl9^l zF<a-YX|Bl4?E<|wFJI!`hw&pz)zC)9{u?xY(463AJ8U{=r#mqN^DiO5*56Dwx_0e~ zoLqE<5wRt-e`+SyVuO2z_DV6~f|-8cCJNkjPgERKbRDK)ZmApkfJKgbtNdh1oa3iN z-jDrAzP#j$y`OO=3*T(51I9(G_L{<*&Qcz2bhSPG<9S%hSyu6J$Li=!ru(Y1VOO#J zNo3@kAca~VALspG&c;9Ct=Gr9BP=6RD@Hv~V@sb{y1%0Rzf3<l9@TR@DR3+|J(&I@ zS&a3h>A^wD!8k1q<}ygT+i_a$@xmp8|LQ1kPcv+OtE&K?wR!M>Zt8sgtNeUyUXbcS zY!jd@K0g&!+5{g>fnXXGq{zW>UI{c^?6(9`H0`fqt4u>xCMNjvVBNUz_3l3Om6~5Q zFo17M*-0o%^U7=c|NbTMnaYR#r5&@Ywo9>(tE;xTMqM@(A-P#uPER^9-IrF8UsPKw zuE@$p8JocO3!Ll3^u@e#DJ+{FuIgEI2&fIc9Byf<-^b#$Ck>c85I);{JbsP7L{-mz zWuUyKhB$~^f7Llis)l@+h(9g&;+Hp!j!z7Y2Tjb6o9?`q3bJ&1l78QDDEzniar${- z+VS^iL*HFXnl^G&b>JQjPz84F{rY>M^%?29{!d4;%Vr$u1epa~o73He^TrnEs+{0f z9`j2xrRJohgctA&3%e*m?FJ(a1yUl5Z{4|blgmoC;s;2GL1e$F`|T29UQj?l*+QiW zDsVP(hgImdDS07-+=g5ObQ*w)<|qV2B*PdlfIVOsjjBLOax#7o&-=G9an3dKK#|>P z0y+$I1bBFq<tjPw>%f}cs=aT!rLiLip*zfV!=DyxL2?C<c$aGy0+rAGw43TiBx-(v zn~C3R<+yGoSFaRMvA12+)>M0_Z@!AW`SbVqlDVH!)fGt(x}4FsFHc(qC<bUrl{+hc zO-H2tS*jEMMu{l8*kAJYlhVh*gM7zBFgUj5AdYIAFIwf+7^k&R9g^VIRWvwO2LHtp zS91e_MSA5246{+$P}Wg)6Oq7%vX)C7tE(l)7WxdJPFJS7+9oR}XThUn@AsIp(7PFW zYeBwh1>Ye9Ww5iW>jrd7CTX0@f6SW&sU(ml6>21Im}zm@SFKe_D}R!P*p!zS7bB(x zQjG4bK}Y^HM?h=5f=}2pl%->v1`JmP;jpZ%A?fs3_T7wxli0yu@8+j+o?L&N70nf< zd-?ZprCAf@?+g5c@<sb6&kM}E(o_0W>2G-aYLZW(NWEIha<S_-1%cye#qWXEMq}+J z`tQFwLL|(2gQR{N&jys7q8Iq6nr%z|=y`P{rSh6?UH>@~TtAd*B9myU&|ULm=l^Fz z0>%UV{Skx1>7Q|R(xFn{2{jEN3ytaO?nXEO!~u%zn>R0i#!uqmF@+CFygmgfxD^)I z)C7^0E%e#<^@TGbu71r2G8jP)Ezl0$%ZP^-{;mh0#(VnoqWC#Wd_jAJmWw}ec(J(- z$~k$u?&HVasS7W;8#a%2X5|j^?Tn1bt9clBZy}^K!xN^dMzqkrD4Nt@zv45}#f%`k zL<MM~Sj(h=n{i8vxq7f~Zvl}+_A6vvl&TuzkKdUT-m+U);tuR`XE6_T3%hU<efwKQ zml9E_>f&z6nQeHm-@vY~BjdDE@XxyO6c^PkW^}Igosi`d=RX^NyngpAU9mO)|Ao4o zI~#^7&^}-&04`HE3_9FlSpVB11w-L@4Ra{SENpEfzrv^wG;!6Gp>mW*OQ<eqCLIgQ z&7nUqiZid#kXu{ZiU1=bz8>!m*sAW<x^CQy<=p$}X-3E*`NIpbM!!Od{;2R0=DT1* zcm~YkDnik`KkW@kqkrev^Q*MduXU-gE12S7#g8gAu_k>g=i4P5!X7877z1JVQ|XG; zxwennbQUT*nP+WEA9mHzzqOSmQ1sJ>S~q=H$AxS86noFc8EtLk4qE=NydcFKIeCx& zbJ5lSIpvFCwKAW4jH4~mon3);eW-U(20yNw(8&-8>e2AL8OwXA^wdLiAYXkJTCx@% z_f(hHQDSn8+B!i|rti6X644HjyI?{)^%TdJ0e?vrTZ+P^3W|)*QT^&|3c{o0*SGtD zfS2uySNxusl$B)-pTX-ZQ2%N||8ItKy!RH5|NKs{z~&LfNGMGygn}6TO`(xxeV*r# zg+yjfQ?$ZxHjB?Wf0Lxf)<Co|Jl%K@liDyB?wmn73e9&FY+E?0U`XOII`M;v!cTK) z-h5a+tK==j6|@wz5r)qM)i3Ky<6{ytYiAweeK7-?6+;L$tkjmgm+y%uyje3?E*|*+ z&wNs-{{W9KW~R{IIuu1C7;E!U7nvZpfbjjBgsn|bgb8$q)3kw`2{b|usg-?!KZX~^ z#BtdLiB}?CnGttk$VIiZ|M$yz>N}|0vjmu5&9c)WuHqTDq*Ar2-;>Exr>ygzR4bD$ zh0H3)c>^Vdv4g+aSTv2Munk9bXSQdZ93~HoEO39KLbKxacc&G(tC5$?gfly@7u|<r zdsldN^xct;`ovcbi~CzFl+Ypj0za5#7-}@_g}q7yZpLn0r1s26NE-YVa;vJON#D(d zlJa(~K$*t^aly@ffn3Xv8kog-`9f||@ZUf5Pqwx;ksC4iUrW5L$Na~-dI2iszz9dr zy&XD23iZ}Qo-Os*l(t@@hCFPDkrbBZIn}xgCNn|Dlkz<|V18EcBkQo9cXHsOhX`su zu|<28s*C=UO%oJN<}Qik?j~RM`oV@VncA_>5+)2|^UJfMRGd)}+eQ=7O#IR5t-s_T zZ~gmxC79AN-<F9=m03-@;l<4qIdVZGZGxipv^Pmzh5?gvr>?0`)_Gy_OhcCq=<Rdc z2lfw$A}cFQ9e#WaYV&MST(j(q42Oc4{)5_&@7~>qF59+v{<a(H^snjP7Ls1|hRzst zS!pTs<3r;Z3`;MveBA2zTEC=%aB`cAxWs%8RMH1u6OMNTu49{50#pI84)hW6u0W+t zXC->gF}|%P@z4-?9D(cZ_=P2Veba_`aKg#i8JBvsQ}O-v{*}Yf%_ypoLkPdtjy8>f zPl(RPV*h~Y09q;LepKB>Xn)8`Sp=(t)+hLVsIY!29U7FC($_F537&O$KMfB0F<ZZ| za=q23XMUK~2I&wUyx=*y;u6N%VKy#RGp!`ds`brjUGKck@Z<xfs?g-Qm<Klo<s~YS zB5pgx{Uvh`L{A~VOaGQFs5IITJknHK-T1>#pR^^y{iVR=>NA&($gPO)5RZoZ9;yZ9 zrc9rW#D6FmUz$*ZST0vdbFw@_D)_#okM<jlWlnfeJ>}n2rR39yVAS8T!Ak)yM)tpF zkT`fH!-?1`M7Ys0^f#)hKg;9P`#WXh3BYze4hFptS=haHDHG32dcp)V>7ONN0LM(L zTG0pFsT-fu7h4y(Q7{;a!Rg%C^wiY7oAt(JsNYO5%-YuHe9TL`hvPUW1ajl)Uq(%l zbzFJQUsx^^JuNiG+m56@O({Gv>`(cI+tH(q(5y@e3BmFc^`ROLj&gVYZB!w!@VbJa zh`!DjU$CO?_v~cEot6&=l>X~3q^9}1(Xke%D4z`mD`yL%xRZn+&bN#kL`r$JY!lC2 zE)<S`_jbJPg1njioAiDP$7(=_mu!>46p<5)>F&=tHOUI=%hha^K0ZwzaR-ld?5A^O zcB>qhqaQAs57sanb3ldB%Q#O?L?GC)aC-*@7R*}B6;W=1aSxaBR<6RWLtt*hE3x}m zk^if=uMCT_?ba3*C6o@4MjA#C5Ts!c0Z~AZ8XAdFX{1YHM5G((Q9`<g7LaZjk(TZf z>5hF3KF{;+cOUQGzrN$+7tC>U&wXF9uC>l}u5$rWoOEwgY;30&5GO250l5w5qn)hp z%(z-n>U&MNqwh{z=YRJAh?kLeU9{6@L7F11t=#R*$1Z7@V=&mjltjRHN9$3o==|ea z)C62tPfwN~&C7w!xel;#Q1XqBZy?4=Q(#pPqeB9#vi|97#(UUgcDeqgN$6LgX1m`t z(7qQD9o<Yu_VWcm%3ce*oiu*{h%m^A0WGgsT5L77L3->Q6=zP12H*qILRXDu=Oj10 zcF$Rz3R6O#NS?3vT;JO+R}wlo9B|V5ZoPg2vw;YTMSV9F2)HXKRCF>>56))kqp=m% zP7yV9DEAlI?V8WoyTLp)9DD6-CrxxCjYSb<R2pw_^PCzx&pA(a3$8xjSIV6>k5DM# zu*R=!hV>-do;H^{sVP#ccs#l1ItGPy(ryr7?Ao1?zGP?r3w!f-U?G*1r3eiSAUZf* zV{<bC<9Uo}A_xj-azS$Fe!QV%a0X@Xn@^!pe0+Riy8zqTdxOoVU>-qLY2a;Npqtr4 z_B1;E(&20L);Nb|!yt%)(=D|>q{XTPd{3KCyW9}7YC?h##TzgGRbTe#hnn<WL{*Q# z;WgFahcq3PTQ!$HFK1CInzJx^Am67MgLDXYPIWc4Bq;n&Z*ZeS^n6e=V!@n1agRtQ z7*VMq8{2XQUS}iG8Yg~bMv~`^BjuFI1cviJc8*5aQVMmssZ2t%&$i5d5<Z-SpFSwO zrX3!7Jn|!NTKkmn$qEk1d&s$1?pcAAr;7;Q{at&5-QIJLYFZBb*E(x#q%b-D>XBYI z2ZLm`MWLt0dM-Lkci)SjB<haI=g^(5HaVurTW(kU4=3Uua3Qs)p9P7{VS1)^7bW3& z(l#hOeEpeSIu<SvYi-n*_4Vpa9_E#+105wsZH$efl}dw`_MZE@F|bZ1*|AvYoxucS z8~mu$DDfae?aX*iWMK8F>F5MHa3tsU>{Rk{-Js1$%!&M!4w^#4UCmgcqwWkTRu!<t z;6k`Up_yR8K{02(qQ4*5!15g1Dd#GzsAB!l5{D4qWj)CQ4Y>5-oWPU9^4)i4gF4sh z-oIi+rMjfuq&}kXv8#O(nP2pq-tkmv$El!@Pp=8P(J+A@S-M!}&tE0+QGo76cVV~3 z<h(T4q)@KsH-c6e{)DF(3`m20gnk<K*A87pXaL%|hHI@-U_GPe?X`LF8vT^mSpSqK zyf}y$yCe~{spnZ=-CJ%Pu19eh{e*F#$YA*;F!)Ewk_gp3%=T)~pN*3I&dI@H)ca$u zSt~{tuI)l5(yV4g%87whe9#|wXq)iJqFh)oFI7~IXRaaWb=(#EvJ`}i!4!UjUUj?k zR8c2cWQy9b^M!yI75J}8h|ZZ_*Uu7V2?hG-)4)Pkm;6j_3?`#;k2l-*PoxAgYZ+Xq zq2ZJ<@fmk+LfJ-P{c$P`+OzUx+!fip^KE5?GtlQl6mWV$|CNP({`C6G$$axbj|KFq zx*>c|Somd>@R42As-I<Ht2W3aKZ=}_avOeku`fog)6uF{mC(A#ayEYcNDoBwWjl}^ zC~_S(ujr^08PNxz--sHA;0pz5X)It>w4X`CwY|u4p%|k~{>bVF@7?J;(7^UM;0=d9 zHPAn$H=iscfRx_2TclhThwk`tN@6*)RU)0c|0MUU=1R1r*O%hWAD=dJ&@(Xxg!uyr z`WvEZ8!TU1LPKhd5h-=&3)B!KT6KcLxWLIcFU|6uM-<{wF`I?g&V8Rx<`8BS_q0T; z1p+yIF+z<c77C?|>6w|cTPVOgDlTqVeEDI8LgYHe!5G|kPC@gXXSZ@;AU3cI@+e^k z!V+im!K^j<gp)~#tgthWuJ4m$V<z{!hBa1MwG<T9^tG}{nY?SZ1^M{wz%jSPKC8*{ z`Pk73FM6p9<>&H2SC7417ddJB%V?7=C<E?o!R4YWJ+FJHFCtRgr1*Bscv73nlyIHQ zFJ@P+{sXQu;^|-BCOt9iKzs7I`Fo1qi2L!&?}fXvbMo}2>G90y51z+8IXv_ai}EsJ zg$fI;(+dZBX{Po=SXMS;Rj8)66Fs%hWi|4wH=bQbKowndPE2ia!q2RnKh8Ub7MwL0 zg$8XXK|4v-?b|hOeHh2Xc(P)hG0&-0Wg25EL@Pdd9Eo5R`KpXV7gI4<;St?oTZ5U+ ztfKR6E2|C|62un3*8XHhg$15dCRhQkbqs>f9HdPR&CIUdVTkum0r?m}z}nbi3<j!b z+ALd6=giy#?fTAFK*qjBIjtmx8-Bf9RPoOc;bq<hJIBUhar6qvVIhwMpYWRkp%<HN zILDlwn+t$-LU3BK^AKgy_IQEqh?t(0&xXq}N{HRR25OQR1`sFmDE0IH+dEyy;pFGJ zzm1<89_F>ZE1NcjXMZ3pIiS)M<1Izqt3lZoSgqBKA6QAeO<9>p5W3Vk$?POm3CXh# z?pY0lWp*!qFJ?wXm7n@nWPk{56Z?t)qg@Gg%egk3w*0lSwme+B!Q<`-o=lO>g&S`^ z67fpL)f#VT&X4F<w$2jG1<*BlhhDo&k7YXQGmx#})~wRDI%D*ICcwDnRDFWyW~;dF zS;ULB!5UFUjA%MgnCYtDYt8Y$2-#jgN!obu2PpQF!-v4cj5j5aEaMXP?YTPx1C!&@ zVQSBwAxpmUv^#j)gLCY1?4_G#)++pQ_{@p<dLw#9109P6PVAUy?m=se?rZrk-Zj@k zMSvcG!>99%^dwGm+ugWwmCU6ipqKzeDTtT9P$dZ6zpt<_L+e-OC<|S6i$cWMbUZUf zrk98@a$kSP|5?Ge=nEWVUd;!Jt!1Ok4N3)Ov-9k~y57YA)?ZutaYHdN8VL6PimbHY zRC@Qg#A%{O3JiI2nbn@g?6Fkd1x$r6DTh}cjd0U;VH;Z!3h7lBS2qlfGzG;>m<<tK zL{l#m^Y1fPo?(f6_xjPN6kSr`YO$+iH2mm?%QuZK+}K)M8zKw_p7;A11+0NX4wNe6 zkv4SHziqY%{6);!1CKDTsxdQAPqtM*v(c!e3w?w^Vu#{HrfnZ|w<%!o^yWZBjG|e3 ztdzonYNHDfuX;8dJ6HAXW`*1S-BC$CKBj_{N~wnBQSveJaZN7;39lL%+tF`JG&**b zj76H)(+N?->uKj14NBz2U8~<mW|A7J%@X*_%hJ-W8sDfz$<(cXAI!(tUmavmktACx z;IPF;e`G9PTyVpKBq4B(erv~tMz_DQusS(nm=Mz_b>AD{Yo^ki&&bscmAimPFP6Xs za*fG>G($UCO8QD7Hbg&a!9b#^qoa>QNr0#FZp4c_<LS}Lg7BABj*9Ca)^qBZQ|cy= z0B?O00;wDe^MfiLS#z#EXYBk+mjs#MP`d1<izOE;d-(<H3MNJd=N&GH1W5rMu%UM( zj~M18OWIIud_(Xl8c;2QSerwqBWg_A*7RNW)aU;^VDJ7<XNG?!z47HEC6L<!aV<A$ zFUUDf?6CSIB9E7=s`5PbSmX{<;>~5@h=y9`A=x8ip#Bw^4h)2pImHcMdkgMLE)jmO z_V54sVS^`@0l1J>`0ddTd;aA>>FXDf#}S>IUyJ~(J~em}4>IjnxUd&YS6W&5Qo!TX zR6rbU&eC04>wfX5(Z8wMRyX08W8677i<HhElf=Np{O;Ot4&}4EbtWaT1v{U#zjvQr z&v3u=L7|jmP0>y-S<<UVb(q`7rd2x*%M@wauJ`@pp<+l2h@tH*+UMV;aiho_v%}K) zbL28RL=i`rt}POmB2hJWF2G5TP&_1diQztOYDQr)NOlWGwcG*o-MzfJ`oeTWvv0Md zq=2)xg43(E;6KlFCp6F{EQZx9)}T1rTs9VnK6aWA9>39r8W}{Ojl-)L^0k<+EUR&0 zcIH(6Qr8KK+$@N^h0Eq(GJU^TE*{QQKeUJ9HyM;T*dM=Jq63QPT8{q2BXarA=?1cP zRRy-#!5O`0K^Z@<wG_;TZ-Id<1Q@qnQNGx5c0*8(g$>FsM6>rIhw<+_Cl(Q-WV_{b z$dcgk))EEgnPx9K>idpM!;Yqwp^4&ggdat5*^^s!9>0KQDHuH?4rWyU^q*&Y^FdU- zjjy29^*5Q<M-L_sAPqX-(4XFF5F&+%jCRFW{3zbtO2mo+IHUy}4mz6idD4bPvH9J< z?%24;<wex166c|A?$V;Jv*^65@~^1{X*!OK@IN`Vg9`NHQm_iEw3kO3u|hzNkvy<G zxOqVO?E$|H?vz8}d;B1AL=1})LR}H6NDFLD5=b{1W#VZs><-T*fqnv@<QypMe-g6; zFuPU-W$T}qmq)9gLC$M&(e&R^elY}p0YVbUdE2<wO;vBv3a)>p>i$4-QESSiK-E%B zORFt8Ol0Sd<ZqdOr2_#T2OF~od0)FVGT8cT{(nmxUVv}$;GeZBpr6-}5F?iVoE?nm zEK-A4hE{+2@3}oYj5cL;RTW?n0(GrJF(@&{`7>GZ%TY0!6TCS~a*<vIvD7@s1DJnQ zp?vnuV~iYQf&YJ{H~+!J{)gxK55~{u(4hXe&Hi_|`!P4l0tip;$yHGN{Z<!P7)V85 zxb%sFyb%|<Qp^Ng{o9`p%OcGOVeB7+_3tT6@Yla`w13-O0F0vXGH(W%C`uqO$70}y zGiK5KKfDbl#`)*W{NFHZ!H=#wIzIsu4ATyw==0|n9v<Ql$kXHsHXu>!9>D|%KdK3U zq6Ro<K=11S8Utur1cF`d?bG~w4XUC5^apy^6%Q593jn{CQHX_Q9<Ykx!adVnT{n7k z07FXi$`!jAAe;u;Y_kK+d_RXn;mP4)P=6CfJ_MSf;J6u;cK7rEYE*|kP^u0K<Y!Pe zVgHQ-B+1-Q4#LUf5)x(!w1u6NF)mBV8+l-1>edXB4z{+B!=uShF(4K|=_SQfP4&Ba z(w&SUC(lyE<_oOKko6!{)c3Wp8q$%uL`k42OS!lI6oZ3-ybu6hFd0M_mh4ynAbf<4 z@+z0x9r|MpJm@`V%GHP6<9YGpVt)R$V*kgY5d0|8-w(1I?yotp`>=~Mfy%B%2WRSa zAWDDmyi*De<lN`t+j@IJOBcCW(D<Msw&c<d$($U9%~eDhGs;1RDb&nGfX1QTdxooT z6&O%dIs=1)Oh7sa?(R-=9ecM~-45v3!0DD^IyxTHEQ2Ex=*os)R&T_Uf=>^F4&@w{ zpOiqjb|(lBUg0L-b{7KAR~#Yg`H8P@0w6#bx@wS|O&_mqO$$3S$fEZ=cmIJ5%0Fu_ zUEdt=B6<Eoe>fR1mIsqFmoyGHhQBiM9?#YVSR6?5l=tu7{koETd?*u7ONk4q6(yeV z`QZJG_RnHvp@0eMA=}SzhAuox4K;tYTEIf@O+GyVL>R!XNpF?F(<0%Gc`F0zkKJ54 zPEOo)bP~jxbrpw0(;e{;F;}0X7ZzA!zYML;D^I7I+pq#^Bq!Gv0@T%mc=51EN?Q6{ zKuD-01<el>NL9Y}sXcUnzV4-UaCB69@}w=Df$V-rpyj7OuL%(M1`VY8iPi0fDS!Vu zFNtl!69Z}4G>y=B$})3cy@Y2N6QVnlGvSV=q$`RYr?!UOJ?rZ!1|H`6(N)d2k?A&` zV0%~v{_73@*^Xa$cY%UY8(l8YSG#o|2on_TfUG4DE~dJ1?ZGObl0_VK^z^joGY~Qa z14+r|S8rPYgA-J3s1K`zRHEaPlR@$16%^Je&>kbKX}$WcQ1CFv7bubeXZ1(I($Z34 zZIaz{9EimhNN>43HZnr)9K82#tfvFpWj=rbNO+nj<b6f}dNV#genii6M%3OIamVkq zwZd3B7KUFo{qPdIe6eR(f5KiP0N4)^7ZkMvTz97LJSA=ar)YH@iONk%`VUOCZ-`)* z6&)K7LPI?ERmTdFzIgOM5PtDkIh)4F75CLu^0UyU{X6!qjSEWK-}>r;Um4CvBL;sb zz0Uph(Ev6XuQTpGCV<Q0+hicJhldSv)J3P;TL4JXnrEyOXZMW&iRn6rDl8IscVRHC z!qK!4bTy^4mpj)IWM2)OMN-EKqcrazAZn_S=yxECx%Ft><wK!Ft)V<%t@oZPQzlf( z`P5P92D+Xhv&3Qm8Dw~fuvYNNVQL)uC?$*DhG0=s$aeJn`zFt>&EjIG{=;)JB$_1I zhKmxz0{Cwy+u!E)EuNZxws$B2o144)2`IbcCbq-QKL?V9z#2`D$UFx$h~+2rtUzPV z$;qkFw;=CyMw3yK%}v$hr3^tO+DHCN{@Dy2@)|1&h$*6zfkvrfsR9%qo1vWng-!+{ zeqTyK1$q+suQ?TfwiT=V0)&y<g!kL#`OwU>n(ZdII1n1{`0H7~&&p9_!Ax9_@AsXS z`zc0H;i1QWg<wyis|BP#ks_W8mr~9`ue??npx1-@1lCo*Uc063-S^h{?Gh*aj7jlq z!n*@tn1CB{zRz#1lIs9p1_64gQ=G+Hx`Wg0ryw1iVd-26(20S7hhM@0Xb*w37FPuu zAO`1VT6~2_&m|Uqc`3mWR>GP)%hwGMO{=xo@_h368ZN77zA}VKgUDP{N=v!aODTzQ z&qJz&)UxD&flq@k*G}tnz5KI#C<)mG)&NH#f2rK7eg}mIgPS|;m-l`RPx&COOgvZ+ zb90)zW+_fQe#COwCA=7|D#3n2S?1_y+wlEBvUX>_ZsX)Mw#9z2wNFx(9p%S1*71LU zgTS=_s?tEE5Qq>eazG#mRG7XQkOS>s-PHoR6CfiKsn7e`+S;5jkQwU*m@XII8<*1k zv){0ON2K&|xx~DR^wY4ly$8En>L1Vo(#`85N(AK4z;v*4i$Zf376J7}TLF8Hy4HCU zDq^yX;zc5&0oN7iASZDGC@-WCKk?&lp#zF}U9M+;JQ_jVyvR!ND?e5jmbC_j$}re; z#laU+Aa>$6=0oOfc2L5Vx1E#FXD(molux`|w|1UHv8A|bvJ4V1we;FXt3<-OYE)s5 z(85G?k_0E~#42Db)>IYIyOWb#@2krRRzDMJr(H8&T*BjeC#xyE)wE-{Qa1tjwTVdX zU90<vJI-YJdZI8zR4d?0y@nQH*V%g!ZLF6g+hj)Ad~06mp6r$>+Jn|cJVelgc5)30 zSjY9|GyHQeH}kW^)@KWwb<%5hqix6&xK;3v@yRTTsuLB;@V<zvV(X~jm#P#NMoSSG z<KQNIE3Q;9REv8MMB3@Nb`Yj)1e*9UwO3hm#<;gdaJPprbq-F;4CNdT6d82CDAnN~ z|LoHGdEX;_|2XUJKu$8|$Gj@#_Y-BIwAiLu&Z)^zasA~i`k%6!_z)e0{|z!2^Iax^ zpzo=Wd9uw>as-9;R+F3JRif^GAmftqgjIG02UL>)vd)Tu{B08gEc=<J0I&|o3sf$* zl+AXh-90k7^~x33TnTOo+S8wv&S&^(0F6+xhKg%5<rX8whQi_xNnw}gbOFZ~fU5*R z-aprRw8l+{X<$i|{gJQ%yFwk>rvou4OF-;5=yM$!-4i#VJ)QcccPcMgo|-sFEL}L5 zi~~2%y2jP4f2V4}H($<kf4jsQ)e<R0I@PLWx6;WoAW^(LHrM~=Twc`&CrJ5h=6%~c zFXxrGwDa{<a|a|j@0$$|!f0vUuXbN*a<iO_?O>F!l#iWH`Of=!tb=65`bPbY+kR69 zjy{YO(?_e?BMoSw*UqNjT*fOql-I01E+voZRjcOt;=#hLCF{y;@>5ekdtCoV@Y6~6 zT~sZH792Z;EdO#xYH>u)CGGh?qnjtD_<s!VNIy~lKwkrOj}TWRYe578dR8@a`5<D> zMd{ClU_LmI`_|PEAr=&aw+%d6st62Y8Ye0hu`_ZT0YYV{_{u%d7TA|yho1Nd&4ZEx ztqYjKi3XUVtDsZhD?$8e&`!GT2Y<~p7|~!xti6Hqj!f+^$9kRJwo83xa~!x3=V^Y4 z(zhGGbCeoQ>rTB@D-K@7qoHqG&wK0gj-@?)NjP0M+TMjh@juP$E~2OHYeFq8Yxn1? zO6OzWAa?`Ua)Lj~M4lWxEnwZm$qSXd$AwzgeMYCkE1#8rRun1*^HzK0T3X<TowH=G zO#f4BV0py#Xog`Yfo_%<CdmUY!iAhGOmhYWDQD-}2-}d??#$pSpAO&sU;rQC6f;Rh zGueihy$dgkQfqpxX@-pM`>Zlb-_E@`L4x&A&><8J96O&&Dlhg@1)2<aI5@mXR7jP; z0TOTn?N4yqX@^J^K4PZ^eGNLXfmHFUWG8kCm+;a*qd51Ob$8(@h&Z>NgicrZuY;4n zE*Uxv(l)_R{B{)!`KFJ;$br7T8JGM1G7K`}kF++Vh`fR3QWdn3+&_whistM68!!2{ zqWmbJ-<NZuAs$=deK&=Uki{*XGOJu>;?`8Cy=HUk8?Z*glj9-DoRfx<`$UFLUBTkV zEnJy_s|E9iCNlEK-CqN{LnNfxH>f#z<S1b0Wn2AIaMkYN&C~nl1%%@?B5>|oO(Z5= zEh{~vWmo~5ep8%BI|U(3i*@IdE(VV3<$Ep}twhLOq0q?#AAGjB2sAXlSHfeqdqA&u zKx)=wiETdls7Q~j4qdG7+$M#Tonf-PdB>6?^ZihM7f`fOEtbrm$>w!UDO<hmNj?Nx zBQl*PSl8mxTeS!nE)No)|D>*d@a4y*75e>t3=RW}+R!ErB<`yF4(PgUF<#{WdL6!^ zz|-vpbx=US8?<Ok&&|D|!O1^94Wk#fyQ(=^_SruS+8L8zg<+fmz0DSKe@<%9sCd#9 zJ9c}4Q7?=?YS`?iM_Zx++`D|zliL3qZ580`0Y%mNe$zaNG9QZh0rnVi+f@#b+QTXG z_Xvh|ewQeSpf(3e&+P7?c7(v&9<)!buWK<gs=vZm518ovsku>zV>0cmA=7%D#xTJ< z%Ia{BlYo_w)z54bbO${vN4=72+Xja>RUTSu%00|^ALs>^W#U0~vZ&{ts&Q{SSMeRx z^|Z^5hoc>8zlI(e2=^y1M&4vZ3~G8gk#tN?#IAyMem3<k<9k3>O{Q5Wi8P$Ce0#jH zT50Fx*Ex;!yI8lyr|*oowUR}>Ma$0Ibpk(pm$4ydJSkd#ta(0sx_Vo3f2XKAMe@u) zB4oNq;r{q1Kd1A;tBbp?Bk5q@Y|{69EDFeaj?fqv^?h(8&O>8e5jE^;vFGqH({qcP zvY7{EK~BeKl826XX?=3lN$L@k=nXu92>3p_C)H(bc^QbIrb(m;2l3kk4(n1<8;PtA zE9f-FWkayuBu(g=nF(5rEj^7D0aA^w$xFIKcUsJH@CFF`@*9W>^wM?Uw&a?KXYlbO z&ioGcB78iW<EJw!a0I^tZ7AAq%w^y^AM~13%~A<!wqqv#6E@AQTPi|`T<bs+EYTG| zGFS+U(75c|`p%toARG?2R}cJZDC}T!lpO!?ap?d%YR*wc=<QSZJr(%_sbqo6+*czC z%FCU`^!QfMNSWb%AdX%<a0iuGdHwE6trR|Jj_6JLuw#AQ3W!w~DQ$Su>@UdbAz5t~ zXY%)TH>dLOBQEB5zA}Ycn1yziHXwYneIXw?N&hN#q;Xr9@*HM-x%S|v<|9{s)~QLa zscGtjb**Q$H5t@81vi3ZU}Folbhv1KEGT}R=IJui*6($C1HDo2gH;*QP)gK8A{Y)4 z$@L!HU-SyKvk4R9TD(``Y0JwWLnSn_jKvsJKWvQ&-%1(vK$ck=!Yzu;4NnYD@1MWf zz?pPA<-SV&!Mo(R`>YI@34+sA4@<O?CMl`)bA8WVU!lypAw<mPrvrpWa(csV-!;En zau|H_c?#E*hAb(dbTd}UB1>QXU`3H@=IcstR{#}ZAO;P}2?QioXq|7FPf-+A-W6<k zGguT^_U@j#j-4(t-HRL2WEYHP{IvSaW&LM4VIR(TdPx|eLN%VkSI1~8<h%{}kZ=${ zzjh?#WO8TXuYC^UMln6Nj{6aS+1~1E2A{@01xiu)qNrT1BFTv!!VhO-wVg9Ipr(o` zlAiZ2_lGZ~q*E7bz+Jv%XM?K#V(}SVRy!`v8WYf1(OtKu6?EG5Z)L)_crcylt<$tn zHH`B^Tkg&`dwHG4TlFyvs32uAhs#QkOE?fy+{<E*$W-Ym&2|`HYKmY*(--KOO2LJ7 zn+I5Y(6{l5KIHH{KJ@<dxE;h@qybkS10AZ80a_mxgPFV}>Lx@(s@^xkw5CeMvbO8Z z8(;T-ASjeb1Lo~-zbJLi9@4n=bKPjY$k{sJ5>wof>ec<(E~tZ2-;>dxL?~DK#+iTT zy62fQ*o?l^@h3V|K}HHVc_4h)Q8^m6ctMC5BpDY!atg4vvZ658bgcrdS-)MEXN}Cx z^zB4aJb$BWKqK)kGj?pPM{$nQc}d9B`zBi=KZEI8T^fhUVUSs|94W^3EQ^vW-Dug~ zs<_Ke{o%utum!NTTL{H>dPd_WoYzCrFL}0h$&cP{!6`E#g`KJK4@yaWHGtO(PGv9W z7fkx6=?Q0a2$6tMc?AD8#hD-OrxB;FYYD|?!`2Rrgif1wJV-!aMt^)j+<N-F1qf5e zqa)mOOycrjVgs+af-Ifz@&rmi+g^6_$|GjC_l9#E-7nMLYr;JivR-)QDo(E^u~4QK zAIU}hd{wnudH0r&%pN{uXJM&gnvAn|U{I$01qbsZW?j|ycWqy$Wj59=Ei)8Nt)%ih zj9sHh$_Q$1pv9BJp>lOqc$3?5@6NCQ|027;?X|QU?3^bQbHcOv$Np!x#hrmm;?(A- z-{U@H3aaA(-(7DHP?9a~#!P5a|Df(2*SMsd)Fs*f6yt!tH&o<%gFfXvyf$NX=%MuD z=I{({3L2U;s|ED4Ia}@>hM~AxH4nE59U`57aq>eur!k`v({#OH<`pT7(-gFKyzkVr zehGAwD+cUM+ee(<P(KQhI0YvorT~<BV5X}jqUe_rD1s$zZ&QP%%Mcf!jSV;a*C=6` zN=Z<{3T^5G^Ht<Sxb#y6F<p_S<7&MJS8R4^G#eP{E2u)MC7M7f8Ep!ws=E4p&^WYC zoH<fqUWt3@hCJ2O$F{l$F|IxufMD)}cGM49s50alyRr+rGE;xRtmH6Qw$ox?PX0}e zP4KTbjrE8$n(7d#?X=9n()l`@aN|lU-%!^%!{l$7zI;B@KMoHXXKxYg*)LE<=kD5z z4S|HYJNU47`2f9DHo<QivtyTxi?;@~x?dUQP$=(?;=TB(mlTpFMDiO#EG3}EHa8ex zI7bG%F+x?W3$K@zF=y^oATOiCgT4k#d1av98!(~mS_M{qz(fDL;GVP(T`EEdG_Ucv zxGL-{Z-mU1hwQvdMjBxCyp58++4Fm4r9r#xH;^Q<eQ&uq-{qtS`dCaSG#L5PBerik zzNd9_J+J(UH<d+7O?<lr{;)883hBGjZ*ku+(8)d0Xl=Zj5)Y3_PVxh0d7E}%e2{cH z5ua0B8Qtdl<VbQma?J#^suSWV958iPp^6g>^y041o7q8si!pNtcF8Wy>`@I!@=7Ur zOPMHwf>DY2j&c^2rV5aWb8It1BIww{<=c2AX>|x$?uhQ(Iw%f%)nODSuLrNUq@|;q zC^Wi4BdsvC%rZ^Tb3kKYZYAu%Ot5_8fYx~4mcxJeV%k!bKrzfT-8WGmWdMq@6Rhj3 zU%esqN@`y`XqooMzrUOzGX3YfqH7kLA=XQ&vl3KtNvrof=_4HH4>%_u0gEdO?JRR& z@yYo->iCyC`YYo`V&|y3t{OS)abxPY$M9)S85W>p`Kfm!kR}VO)nfsxIySt%>=iBt z%A#5g-V6o!(`H5?74jZk9(C@_?jh-Jsu8FTZz7E2$~Emi`Hs)`Rww0(9&$bEIj$gX zs8<QYDy3y*r8Ag!j{CD8EQny|I|-x7-nL#RNn9Pz8VDs};fr^jck_>ZNPad@rsPp2 z#BH_mII3V1Q0-Lq$7*B7u?3GV;aoZ|&p!g`JDeRcZScSyoRGoH@sFKReDvi_O98a| z{L27pxxdkFn=+qs55}0}%}Y@9>nlySgD}w7t|C;AW2HRI`wUxnyK{zF`37u{{#yBr zh?qRgm?^;Pbz}<iS`R$r{T=6X+^IK5)hTfE24d#bhPY88*_LvI;8KWC&3M;>x^5#r zgbcTO)={>=26W!Im5u}Hzf|Q13iPI(Kv22<1ahn$g}w~B0VX6T$B6#WfVf`l2Jzt> zikTXg%kM2#sMsiw*rFf54~mo79L_zi*EPaTzIP3<7TycsL4IC&kBuuB@EkE1FRNp9 zSD)#Y%j50}rUb;`FTyAZJ?H6~b&)!A5t2!dQwu3$owg{nDi|<!lvUDm9SfHz&<qE; z-zimP{eqAMieDo(0}AqSQ`E1OUB!X4CYe&}0AA$0LEX0hWWdAA`gal)=X6z7`-X-< zyP#A$EMPYq9yEo_V@5ArpKhIKXAx9d+A_>e(GKuk&)iR}e!=m!PATXi{MP62Y=|%t z5%VI;`>itwo4sA$Vc+(UAC0ct3I<`4HZzK*b1O^f{lGKJzrC@VaoyPFoQijpuq|q* z@gUKcPxSPXa3Ew?_LJX0Hu9c1hwkU%Lt1MVP32yc`ccAK#(isEF;3_(y=}`#wlyY( zh5Srg=}olJGh2Aa^o<piV(s3$#;Zv~R&7#(hH*aR-HM90l@-K?h^xS53ChL8rg2G1 zG~h_vZL?`6+L$7LA2jqvmD`&mfExpNcI%sf7Q8;Z8PjL2qt279$(CA#2KyH?&EuUm z8`52czJ>=^7-@}XU4*ywC=Zk#h`L05^*Z-t&bM21K!4W(>nYjZi5r`DFdzlz<_iJU zQWiFHq-pNOa73g>?A#q#k`Y018O&1$4CV82pkgRG2fXcdJJt5TsWM~Usw@78;0GRw zaZGcDLwlL^WC#V(@+PI{H#iM6r$bLfM!Zexwt&kP^{*{ZY_;p+nYymRDe&GCSSMPs z7hfmVjx_Tl@iuu3X0<rc+hPq`k?{KOjEv==M@wh?&1E*9@JxZsa3(jv<jNQR*>`_T zRG_FP<CuqDI8i85T;c>S+l@HOT3#-i>$l!3A0b(+jL-g5>14?4;sG~a++5$66g%d8 zLJ5;}{aj@I;P7K+$n?Iy7tGtEfR#0$h4oCOZ*y@!*7>o+&(O!VJ1LfykF474W#;Dr z<{_`HIJq%A7f^mZiivOGGv%-buQD1DbMN%EDQ)#@x96_R2fMW+UBTGSzhz9@er@;m zC)PeVcr%TCKHWzJygFGaP}u9p2r5)3Mn;x{yKl~j?_<We&roqrqs^@P6B-X+)3zIi z*-&k{S%e81VMH!d2C+AejJos)azI@*phR%CE!`Zx8V%8x5RAT8glX<3^4N2h2$V~! zJbZ;w=mI!9CW@PY=auE^ng?n^SMUGma8PADn}1ECi0$eZQ^y*Pt3-7;%MRMCpkKC7 zE(AUu4H8rI)3AGWWO6*E*Gqfe7swVb;!luR8J~%p_w~>k6%;^Rb=+D`^UEjXXy`m= zb&c9>FO+gi0J+<(sm%6>t?on>;(0#e!O~`=^K?Jc%VCG!;DP>r&$m_6Sg~{xr22l( z6kBrc*<g<O2KD0wE}j8s%^O{Mz1_j)Dfb;ASc{K~&s|i|@^6nyg8A6pY85sjJFoqm z&t;e2qqD7k9UuKx=3tD^3hRV&NlJPF6)|{Ve_ZUC(Y+pV%bPE5TLe73bNs7=8>Q+> z7LUKzs;*n|5#yZl!B+~jF{8K<W35*VR6yPnvEZh<1WmkssxmS|>y-HRJr~MqMdo2E zISeffDunf!swl`{vN6%C7MqXZRGRtQ&)?U&2Nzuyhjto7f<y?YdyArdcI&%c1Zz@S zcU#Frcy~pC!Q7;q{(}%N$vx-vr*JA#8Sj%f_S@h*VDbDB-Xp}xv)GLbSwqyJ6^nNb zJavXd1vb~|C!7Nj0%!=mvvV>7F>*I)V0X*9G2PGP{Z!N&vMQd~%UjQ|%gDP(qtM0a z=YhwHHn|0PVu(pD!6X@%tu<^Sq{C#@wR7)2`j|-cXqjb#*N28nQ^Y{KrM#@{Nb;xt z9(PM+W}eX#Ur0FIq)zW6LgO*|Oy2Aw6e-C_wuVVV=e)i2_}UTxoww8))CcN96>m~T zalDO+Aw{ZdX+4<h@puk8#5dwllEGTA$y2@l8k0!8dv^_9<VuC2w}zPa8VD0<M{U<? z2g{`lT;&tO%|V;*0g2D9Lmt+_ESU_97SPVPTXmEBDpYCBT>hh-@vdyFnbGL@#Q55n zING!Qrag_3)$pf_L?e<BQM?c0o4h3s1Mj$IJ%oF##0oKmqV|k<4o{7rCE(<}{d=jL zJ?f0{+z!t_X)NK%<&1X&AtGbyCD6w?%%r6e6jm^oq~#f<{X5_qCaq@hTKnRq?ZQEk zuO1xmz?)f6COcF4devcdXCaz?F;CtWfk+S>dkR>eaPxpa`g0~4&6lscco?IK3(@(r zeQ5VBZ*dZ-$ICOn8*dh2miTKS1Ouea3z@`_jzQWI(0r_CQ=x<@t283+`TIqA-TSq= z<z*)kB(S!*<JUcBZ|wO|gZ`d;#~Dl44{x@i4M@Zf5QCwUJ9ywVpL<(kH`dzWnwWeh zftBsxOuFtq0nwBkUEbS@qXW_bEHM25AvFJCBBlZluK?knyiNzlOeq&0q<HRPhJ7=v zbfg<t2?2@+3iSI|Gk^|w6AOyQX|Nv%y)($P5t4HNhqUt=Za?T|4vu^_KQw3YAA`|Z zVVCq2fP^;E$WrrOy8G!Qj&iJ^a(K&HMB!q7p$ZbmJHbOdPU1qx1b83XSb=@0tEoDJ z8ABzEpu;LI+VmoEiv%^kZ@sPRfAcW#2|KioZG5%<YFAZp7S9>##|!0RpjS84sTY&R z&3n63E~$bSURhLCQf4V-Y=I4+$<7GW{UB6&B9lI_icE^he{JS6a%PLIOGj9o=|GjC zGX}B+i3IzN(!Qh_A8iO=$TkCdl03gbz}7Evv$NVXPC&zKXvK8ClE7NPj)rz>c;n+i z5(!8^A6M&96s{;!B&~g5WJV+i$oFvas+_J#o<HgS8xYFnvOY7pmB~YJw!f#*MyNAW zaJJ4&HdMniG+z1Xr2gj9&!lQ@%6jbylB=m{;aCm;rX=sKX`6e^rCe%2?J=)Xo%!6z zPeV!~`&$_>ZzQn#<^9C3J|>crgP)9p{@1sBz0!ht%Wt;k{J+=NlWk(leYy&9A-%#K z##Uv{(vJv1<>^G1JSmKw#51QL(*nxXCF0!T4CWS?c|qj77G~b&D}G;j#)ysqd|V)j zL-NrK<8ayE<|uv$A8=y!tSPuDGX2VUCb*;Xw~LJ<)LsuRUisO<Mj$|-tO+OQ>`jpq z{8P1;yTi-YAuq3$BXrX&HYC{rMKEZ<Wxd`UDyk7>U9b%HZv`JO24(xXFu{<8L4<+L z>M0@XvVU+&4d!*f;B{hh^5N2p=vQ(tu-H*;#mvygTQ^5lm52-Up25Rel)sigyd>Zd z!GU?aoHy*n((rqJguP_?Uo4ilTg~k;AT=@4DCpWhm}<Hl5+xa-jX5Gyvm&1m*S7%| z#L4-*(bP%O>uZkJ8km=}yb&69l)Ns+pOgNxFG|plv-~qo!@Dq%+oh*TCLeGfC9Cr1 zrveWPi!;ZIxiT+9r#rIf`DFw}Kp^H&hARroesz>Z%EpLcAaQiRLIx(tzdwtI2YJ^_ z@b6h2bqnZg(26Ptr~PVS%`I^74EIMoDdOC9luS3%l}0uf4l{N`1AE%}Si5T^Eji=> zK5R@1^D~L5unM>Y9yLQt7F?tYjR)DGy|jMbN4{lIzD=f@_i*w+sal|)$?aj}kihH$ z6M~|hh}cg9GnMS9TNI*cPvPH%+ll+o$3J51!YbA{uOVgSLu|sKfhO;9pj@{>Y#K=0 z2YTZ&GS9{#G*EI#KW=Nx7p9_(wFJGPfkY9aaUjxbA_R9P16Oyls=$e%cGvMB&;}?{ zmJb_2(O8U22J;IW16PL?0(0{O^FkJ2pct8*zyvXKGodOXt|>@v-d!bri<4L9ns#-9 z_e!JjRV_-)HFAGlgVT;lGQsU{2LMz+YYm{~IPKW%C>&gT%|3>YEa|4=pYr<d3B>zd z@A_6aj1{wRUjmAw?fBPI6G4mp;NWqgIE=PN6tFcUE~AM;qgf*Opq(2$9#QcPBYq_u zMn4k@@aQ<&?+U5d{D`1@_}~%zxMhZeNWp)8L}2a^!<hKv{XhQ)J_g-W`OT2cU~DkA z2Y*qOpqc*p9dkSIArvQo>VN-L`<;!_9dI3U31;}(`22F-VD9y?nHzP$9tFNr0P~Dc zd9!=?d2a5v(kYp0mgD-atMRd@@udst!Bky^Fb~KajG2r-Umezlxz)v2%Xj_fUr!`` W;z;O+nY8UMfgc4~B~S}x=<{Fp?!q|$ literal 0 HcmV?d00001 diff --git a/docs/yocto-build-system/assets/meta-ohos-arch.png.license b/docs/yocto-build-system/assets/meta-ohos-arch.png.license new file mode 100644 index 00000000..b23a85e2 --- /dev/null +++ b/docs/yocto-build-system/assets/meta-ohos-arch.png.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: Huawei Inc. + +SPDX-License-Identifier: CC-BY-4.0 \ No newline at end of file diff --git a/docs/yocto-build-system/assets/ohos-build-arch.puml b/docs/yocto-build-system/assets/ohos-build-arch.puml new file mode 100644 index 00000000..33094667 --- /dev/null +++ b/docs/yocto-build-system/assets/ohos-build-arch.puml @@ -0,0 +1,28 @@ +' SPDX-FileCopyrightText: Huawei Inc. +' +' SPDX-License-Identifier: CC-BY-4.0 + +@startuml meta-ohos-arch +!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml + +Person(dev, "Developer", "Anyone willing to build the OHOS based image") +System(meta_ohos, "meta-ohos", "OpenHarmony OS umbrella bitbake meta-layer") +Boundary(poky, "poky") { + System_Ext(bitbake, "bitbake", "build process orchestrator") + System_Ext(linux_yocto, "linux-yocto", "Yocto Project LTS linux kernel") + System_Ext(meta_external_toolchain, "meta-external-toolchain", "Yocto Project LTS GNU GCC and LLVM toolchains") +} +System_Ext(meta_zephyr, "meta-zephyr", "ZephyrOS meta-layer") +System_Ext(meta_freertos, "meta-freertos", "FreeRTOS meta-layer") +System_Ext(meta_freertos, "meta-freertos", "FreeRTOS meta-layer") +System_Ext(linux_yocto, "linux-yocto", "Yocto Project LTS linux kernel") +System_Ext(meta_external_toolchain, "meta-external-toolchain", "Yocto Project LTS GNU GCC and LLVM toolchains") + +Rel(dev, bitbake, "selects configuration, initiates the build, deploys image to the target") +Rel(bitbake, meta_ohos, "incorporates meta-layers relevant for selected kernel / configuration") +Rel(bitbake, linux_yocto, "incorporates Yocto Project LTS linux kernel reference") +Rel(bitbake, meta_external_toolchain, "incorporates Yocto Project LTS toolchains") +Rel(bitbake, meta_zephyr, "incorporates for OHOS on Zephyr build") +Rel(bitbake, meta_freertos, "incorporates for OHOS on FreeRTOS build") + +@enduml diff --git a/docs/yocto-build-system/index.rst b/docs/yocto-build-system/index.rst new file mode 100644 index 00000000..8bea38de --- /dev/null +++ b/docs/yocto-build-system/index.rst @@ -0,0 +1,16 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +OpenHarmony, a Yocto-based Build System +####################################### + +OpenHarmony build system, the foundation of the build infrastructure, is based +on `Poky, the Yocto Project open source reference embedded distribution <https://www.yoctoproject.org/software-overview/>`_. +This section details both generic and OpenHarmony specific aspects of the build system. + +.. toctree:: + :maxdepth: 1 + + yocto-project + ohos-build-arch diff --git a/docs/yocto-build-system/ohos-build-arch.rst b/docs/yocto-build-system/ohos-build-arch.rst new file mode 100644 index 00000000..b2fe3a3c --- /dev/null +++ b/docs/yocto-build-system/ohos-build-arch.rst @@ -0,0 +1,23 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +OpenHarmony Build Architecture +############################## + +``meta-ohos`` architecture is documented using `c4 model <https://c4model.com/>`_. + +.. contents:: + :depth: 2 + +Overview +******** + +OpenHarmony build infrastructure designed to run atop variety of OS kernels +ranging from RTOSs to Linux. + +``meta-ohos`` is a *umbrella* of meta layers containing build meta-data +required for compiling OpenHarmony images. The architecture supports plugging +various kernels. + +.. image:: assets/meta-ohos-arch.png diff --git a/docs/yocto-build-system/yocto-project.rst b/docs/yocto-build-system/yocto-project.rst new file mode 100644 index 00000000..09f3a9a8 --- /dev/null +++ b/docs/yocto-build-system/yocto-project.rst @@ -0,0 +1,63 @@ +.. SPDX-FileCopyrightText: Huawei Inc. +.. +.. SPDX-License-Identifier: CC-BY-4.0 + +Poky/Yocto Project +################## + +OpenHarmony aims to use standard opensource tools to create a build environment +that is both familiar to users in the domain but also flexible enough for the +requirements of the project. With this in mind, the project build +infrastructure is based on the OpenEmbedded build system, more specifically +`Poky, the Yocto Project open source reference embedded distribution <https://www.yoctoproject.org/software-overview/>`_. + +.. contents:: + :depth: 3 + +Build System Concepts +********************* + +The build system uses build instruction files that in the language of the +system are called ``recipes`` and ``layers``. + +Layers are one of the fundamental models of the build system. It enables both +collaboration and customization by defining scoped meta-data. These layers +become a collection of build instruction files that have a defined scope. For +example, there are BSP (board support package) layers that enable board support +in the build system. + +See `terms for reference <https://www.yoctoproject.org/software-overview/>`_ +for more information. + +OpenHarmony Build Layers +------------------------ + +OpenHarmony bases its build setup on Poky, the Yocto Project open source +reference embedded distribution. The main hub of layers, is `meta-ohos <https://git.ostc-eu.org/OSTC/meta-ohos/>`_, +a collection of layers with different scopes for defining the project's +requirements and capabilities. + +For example, ``meta-ohos-core`` provides build recipes for defining the core +policies of the build infrastructure (`distribution` configuration, images, +core packages customization, etc.). + +Another example is ``meta-ohos-staging``, a layer that provides temporary fixes +and support for changes that are aimed upstream but have this place until +upstream catches up. + +For more details of each provided layer of ``meta-ohos``, see the relevant +``README.md`` file at the root of the layer, + +Besides the ``meta-ohos`` collection of layers, the project is also the home +to a set of other build system layers. Explore them all in our project `GitLab <https://git.ostc-eu.org/OSTC/OHOS>`_ +instance. + +Aditional Documentation +*********************** + +`Yocto Project <https://www.yoctoproject.org>`_ provides extensive +documentation on various aspects of the build system. For the general usage of the build system, it's components, architecture and capabilities consult the following resources: + +- `Yocto Project Documentation Home <https://docs.yoctoproject.org/>`_ +- `Yocto Project Quick Build <https://www.yoctoproject.org/docs/current/brief-yoctoprojectqs/brief-yoctoprojectqs.html>`_ +- `Yocto Project Reference Manual <https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html>`_ -- GitLab