From 7d57001c0fa08b28d3da08fbb98b2d05d17af858 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Mon, 24 Mar 2025 13:13:42 -0700 Subject: [PATCH] Remove Android ExecuTorch demo --- .../android/ExecuTorchDemo/.gitignore | 11 - .../android/ExecuTorchDemo/README.md | 132 ---------- .../android/ExecuTorchDemo/app/.gitignore | 1 - .../ExecuTorchDemo/app/build.gradle.kts | 77 ------ .../ExecuTorchDemo/app/proguard-rules.pro | 21 -- .../app/src/main/AndroidManifest.xml | 49 ---- .../android/ExecuTorchDemo/app/src/main/BUCK | 65 ----- .../ExecuTorchDemo/app/src/main/TARGETS | 1 - .../app/src/main/assets/corgi.jpeg | Bin 8696 -> 0 bytes .../app/src/main/assets/deeplab.jpg | Bin 30146 -> 0 bytes .../app/src/main/assets/dog.jpg | Bin 36999 -> 0 bytes .../example/executorchdemo/MainActivity.java | 225 ------------------ .../executorchdemo/TensorImageUtils.java | 150 ------------ .../res/drawable/ic_launcher_background.xml | 170 ------------- .../res/drawable/ic_launcher_foreground.xml | 30 --- .../res/layout/activity_classification.xml | 39 --- .../app/src/main/res/layout/activity_main.xml | 75 ------ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 - .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes .../app/src/main/res/values/colors.xml | 6 - .../app/src/main/res/values/strings.xml | 14 -- .../app/src/main/res/values/styles.xml | 10 - .../app/src/main/res/values/themes.xml | 5 - .../app/src/main/res/xml/backup_rules.xml | 13 - .../main/res/xml/data_extraction_rules.xml | 19 -- .../android/ExecuTorchDemo/build.gradle.kts | 13 - .../android/ExecuTorchDemo/gradle.properties | 23 -- .../gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - .../demo-apps/android/ExecuTorchDemo/gradlew | 185 -------------- .../android/ExecuTorchDemo/gradlew.bat | 95 -------- .../ExecuTorchDemo/settings.gradle.kts | 27 --- .../demo-apps/android/ExecuTorchDemo/setup.sh | 12 - 43 files changed, 1486 deletions(-) delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/.gitignore delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/README.md delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/.gitignore delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/build.gradle.kts delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/proguard-rules.pro delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/AndroidManifest.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/BUCK delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/TARGETS delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/corgi.jpeg delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/deeplab.jpg delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/dog.jpg delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/java/com/example/executorchdemo/MainActivity.java delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/java/com/example/executorchdemo/TensorImageUtils.java delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/layout/activity_classification.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/layout/activity_main.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/values/colors.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/values/strings.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/values/styles.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/values/themes.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/xml/backup_rules.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/xml/data_extraction_rules.xml delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/build.gradle.kts delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/gradle.properties delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/demo-apps/android/ExecuTorchDemo/gradlew delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/gradlew.bat delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/settings.gradle.kts delete mode 100644 examples/demo-apps/android/ExecuTorchDemo/setup.sh diff --git a/examples/demo-apps/android/ExecuTorchDemo/.gitignore b/examples/demo-apps/android/ExecuTorchDemo/.gitignore deleted file mode 100644 index e7bee2e2b1c..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -*.iml -.gradle -/local.properties -.idea -.DS_Store -/build -/captures -.externalNativeBuild -.cxx -local.properties -*.so diff --git a/examples/demo-apps/android/ExecuTorchDemo/README.md b/examples/demo-apps/android/ExecuTorchDemo/README.md deleted file mode 100644 index c6ee756458f..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# Building an ExecuTorch Android Demo App - -This is forked from [PyTorch Android Demo App](https://github.com/pytorch/android-demo-app). - -This guide explains how to setup ExecuTorch for Android using a demo app. The app employs a [DeepLab v3](https://pytorch.org/hub/pytorch_vision_deeplabv3_resnet101/) model for image segmentation tasks. Models are exported to ExecuTorch using [XNNPACK FP32 backend](tutorial-xnnpack-delegate-lowering.md). - -::::{grid} 2 -:::{grid-item-card} What you will learn -:class-card: card-prerequisites -* How to set up a build target for Android arm64-v8a -* How to build the required ExecuTorch runtime with JNI wrapper for Android -* How to build the app with required JNI library and model file -::: - -:::{grid-item-card} Prerequisites -:class-card: card-prerequisites -* Refer to [Setting up ExecuTorch](https://pytorch.org/executorch/stable/getting-started-setup) to set up the repo and dev environment. -* Download and install [Android Studio and SDK](https://developer.android.com/studio). -* Supported Host OS: CentOS, macOS Ventura (M1/x86_64). See below for Qualcomm HTP specific requirements. -* *Qualcomm HTP Only[^1]:* To build and run on Qualcomm's AI Engine Direct, please follow [Building and Running ExecuTorch with Qualcomm AI Engine Direct Backend](backends-qualcomm.md) for hardware and software pre-requisites. The version we use for this tutorial is 2.19. The chip we use for this tutorial is SM8450. -::: -:::: - -[^1]: This section applies only if Qualcomm HTP Backend is needed in the app. Same applies to sections with title`Qualcomm Hexagon NPU`. - -```{note} -This demo app and tutorial has only been validated with arm64-v8a [ABI](https://developer.android.com/ndk/guides/abis). -``` - - -## Build - -### Ahead-Of-Time - -We generate the model file for the ExecuTorch runtime in Android Demo App. - -#### XNNPACK Delegation - -For delegating DeepLab v3 to XNNPACK backend, please do the following to export the model: - -```bash -cd executorch # go to executorch root -python3 -m examples.xnnpack.aot_compiler --model_name="dl3" --delegate -``` - -Then push the pte file to Android device: - -```bash -adb push dl3_xnnpack_fp32.pte /data/local/tmp/dl3_xnnpack_fp32.pte -``` - -For more detailed tutorial of lowering to XNNPACK, please see [XNNPACK backend](backends-xnnpack.md). - -#### Qualcomm Hexagon NPU - -For delegating to Qualcomm Hexagon NPU, please follow the tutorial [here](backends-qualcomm.md). - -```bash -python -m examples.qualcomm.scripts.deeplab_v3 -b build-android -m SM8450 -s -``` - -Then push the pte file to Android device: - -```bash -adb push deeplab_v3/dlv3_qnn.pte /data/local/tmp/dlv3_qnn.pte -``` - -### Runtime - -We build the required ExecuTorch runtime library (AAR) to run the model. - -#### XNNPACK - -```bash -# go to ExecuTorch repo root -export ANDROID_NDK= -export ANDROID_ABIS=arm64-v8a - -# Run the following lines from the `executorch/` folder -./install_executorch.sh --clean - -# Create a new directory `app/libs` for the AAR to live -pushd examples/demo-apps/android/ExecuTorchDemo -mkdir -p app/libs -popd - -# Build the AAR. It will include XNNPACK backend by default. -export BUILD_AAR_DIR=$(realpath examples/demo-apps/android/ExecuTorchDemo/app/libs) -sh scripts/build_android_library.sh -``` - -#### Qualcomm Hexagon NPU - -```bash -# go to ExecuTorch repo root -export ANDROID_NDK= -export ANDROID_ABIS=arm64-v8a -export QNN_SDK_ROOT= - -# Run the following lines from the `executorch/` folder -./install_executorch.sh --clean - -# Create a new directory `app/libs` for the AAR to live -pushd examples/demo-apps/android/ExecuTorchDemo -mkdir -p app/libs -popd - -# Build the AAR. It will include XNNPACK backend by default. -export BUILD_AAR_DIR=$(realpath examples/demo-apps/android/ExecuTorchDemo/app/libs) -sh scripts/build_android_library.sh -``` - -This is very similar to XNNPACK setup, but users now needs to define `QNN_SDK_ROOT` so that -QNN backend is built into the AAR. - -## Running the App - -1. Open the project `examples/demo-apps/android/ExecuTorchDemo` with Android Studio. - -2. [Run](https://developer.android.com/studio/run) the app (^R). - -Android Studio View
- -On the phone or emulator, you can try running the model: -Android Demo
- -## Takeaways -Through this tutorial we've learnt how to build the ExecuTorch runtime library with XNNPACK (or Qualcomm HTP) backend, and expose it to JNI layer to build the Android app running segmentation model. - -## Reporting Issues - -If you encountered any bugs or issues following this tutorial please file a bug/issue here on [Github](https://github.com/pytorch/executorch/issues/new). diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/.gitignore b/examples/demo-apps/android/ExecuTorchDemo/app/.gitignore deleted file mode 100644 index 796b96d1c40..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/build.gradle.kts b/examples/demo-apps/android/ExecuTorchDemo/app/build.gradle.kts deleted file mode 100644 index ca06671f328..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/build.gradle.kts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") -} - -android { - namespace = "com.example.executorchdemo" - compileSdk = 34 - - defaultConfig { - applicationId = "com.example.executorchdemo" - minSdk = 24 - targetSdk = 33 - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { useSupportLibrary = true } - externalNativeBuild { cmake { cppFlags += "" } } - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - } - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - kotlinOptions { jvmTarget = "1.8" } - buildFeatures { compose = true } - composeOptions { kotlinCompilerExtensionVersion = "1.4.3" } - packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } -} - -dependencies { - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose:1.7.0") - implementation(platform("androidx.compose:compose-bom:2023.03.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("androidx.camera:camera-core:1.3.0-rc02") - implementation("androidx.constraintlayout:constraintlayout:2.2.0-alpha12") - implementation("com.facebook.soloader:soloader:0.10.5") - implementation("com.facebook.fbjni:fbjni:0.5.1") - implementation(files("libs/executorch.aar")) - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") -} - -tasks.register("setup") { - doFirst { - exec { - commandLine("sh", "setup.sh") - workingDir("../") - } - } -} diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/proguard-rules.pro b/examples/demo-apps/android/ExecuTorchDemo/app/proguard-rules.pro deleted file mode 100644 index 481bb434814..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/AndroidManifest.xml b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/AndroidManifest.xml deleted file mode 100644 index 8d71b156398..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/BUCK b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/BUCK deleted file mode 100644 index 371c991ce88..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/BUCK +++ /dev/null @@ -1,65 +0,0 @@ -load("@fbsource//tools/build_defs:manifold.bzl", "manifold_get") -load("@fbsource//tools/build_defs/android:fb_android_binary.bzl", "fb_android_binary") -load("@fbsource//tools/build_defs/android:fb_android_library.bzl", "fb_android_library") -load("@fbsource//tools/build_defs/android:fb_android_resource.bzl", "fb_android_resource") - -manifold_get( - name = "dl3_xnnpack_fp32", - out = "dl3_xnnpack_fp32.pte", - api_key = "executorch-key", - artifact_path = "tree/models/benchmarking/executorch/dl3_xnnpack_fp32.pte", - bucket_name = "executorch", - sha1 = "3e7af1d8f5ec4acb6de156d361715e16e5f53783", - timeout_msec = 120000, -) - -fb_android_resource( - name = "app_res", - assets = "assets", - package = "com.example.executorchdemo", - res = "res", -) - -fb_android_resource( - name = "model_res", - assets = {"dl3_xnnpack_fp32.pte": ":dl3_xnnpack_fp32"}, - package = "com.example.executorchdemo", - res = "res", -) - -fb_android_library( - name = "app_lib", - srcs = [ - "java/com/example/executorchdemo/MainActivity.java", - "java/com/example/executorchdemo/TensorImageUtils.java", - ], - autoglob = False, - language = "JAVA", - deps = [ - ":app_res", - "//xplat/executorch/extension/android:executorch", - ], -) - -fb_android_binary( - name = "ExecuTorchDemo", - keystore = "//fbandroid/keystores:debug", - manifest = "AndroidManifest.xml", - manifest_entries = { - "min_sdk_version": 19, # Android supports 19 for minimum - "target_sdk_version": 34, - "version_code": "1", - "version_name": "1.0", - }, - package_type = "release", - skip_proguard = True, - deps = [ - ":app_lib", - ":app_res", - ":model_res", - "//third-party/java/androidx/appcompat/appcompat:appcompat", - "//third-party/java/androidx/constraintlayout/constraintlayout:constraintlayout", - "//xplat/executorch/extension/android:executorch", - "//xplat/executorch/extension/android/jni:executorch_jni_full", - ], -) diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/TARGETS b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/TARGETS deleted file mode 100644 index 5c4f482b5ea..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/TARGETS +++ /dev/null @@ -1 +0,0 @@ -# This file needs to exist to avoid build system breakage, see https://fburl.com/workplace/jtdlgdmd diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/corgi.jpeg b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/corgi.jpeg deleted file mode 100644 index b7cdd3bf73deea2fc8e9756a1099c8d34d388366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8696 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 diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/deeplab.jpg b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/deeplab.jpg deleted file mode 100644 index e840b670002a40a3994df8c7031a5700f16e9f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30146 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 F|JjT=%QgT2 diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/dog.jpg b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/dog.jpg deleted file mode 100644 index e20f0ccbc487bbb2039677b5dfa7f1e6ea6b7cad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36999 zcmeFYcRXC*_cuCPkVr%)YK#&@?>%}adJSO=#$b%mYeJBSUK2HfAX@ZJL>ayJE_xY6 z@9rd@@8|RV-RJ(E=RU9Jb^p8HJ%I2g>+I%s@^%sMP*qVy5rBaK04Sq> zfZHWZUjAp!|H#sy`F>#V{h>+G^n54;fc-Do1N0T3Afv0NA*0ElrX??< z#vrGq@mxmJ81UDfyb-@B4-bQhmX-#Cyo!>Fo{Tz!oQ#Hoj?8b#-w1wN^Ve0z8fFD% zcy0%Cg(2)<&J1$80t|)_Cu^7o0>H<^BPxde;}u}w;}hc%5aSU604M^J|F#^HATaG8 zn)EH>zfnX30J!KkVDs?t@kC?&jRKP<8v7rbCkEp$9t=z@Kr9B}?q616%Ew~;pO4^gz<0LPniFB_2LuOzv<6p z|HwLgruY{>x^%Ms(u484NVER3|97qUJN+j8&<7Fvz(IQt?J=|i1sHe*#d!F|c!Ym@ z^#75E=Kbxf-?G22ziZL&^!xrX`uOb^e)RFX=2)W-jN7IA(RQw`&SKo$P6#f`-{r>z zf;n<~S~_#{a`A8jB&0o^EkRJQD}xo-7UCqyxL4oI$N;gHWHc1i;L&iF1KUBAy}tv2>FD5u5c8B|{G(h9P5;j3W@Pxo;tG{yG}3s^ zAO~{+GYE1CaPcsrrCqFT#B}5p|0RpQlVtptkscl%Tps*fFc({HUQtm|ZXP~vK0Zz~ z2PeYI$<@-6(+L6mTZ23p0dj#jyFy@248Jv6TEX00B^l9g{>vmsXAO;i6#uvA9UXt$ z`G*_fs^E?m{$KeDq37ic=GFltU~VoTu!1|-$rbpwxbxp_;=fn%&*MK%|62&{!vCKA z@6!33(His*pR=2b!yorpgSf#CU`MnO2((h(e}JHs>OgGmToM0>{I}3u{_y;fLc2*! z#R=hR=>!6+$V)P!HE=;7*60SzE2=2ZBO}W%!z-`A%PY$xBO;?H%f~0cFDD}+EAZR8 z-?H*BklSxNe#`z<39MltwERDy#e_jN{5Jd`9!`*zwE!nCueB(r6_{6m(^3FrWy1p! zu(A{Y|E*06Z5hPL(&7Irt^c+{4(0%J(STWlB^mh{8UCHGA}9CU1!esxXyoJ({x>VSy;xhiTK;b_|9L;mMGppZkYxN{#N)rL_{-XV6#vf* zwg!pWz+4}Rtbh7>ZDsceg_eB>07#ktr@w|D7b$Il)nIR|BqPzJo_)f=Wlj&MEgzt6B?x$ z{*(UWf&X~mKOXpx2ma%M|9Ig4e;)Yv;0o-7?$UUmhfaW76d>^V-=hTvel8w>h^&eR z_V4jJ0H8vHVFJLSW>%s>kL)l3m^7HufP1`xJp4Su=*}e%4-KXi0PlCtlSh7{l-Pa2%TmhxjqC%pDSK zOI$`cDc|duOgx}$X$zUo&^{Btl}jN0U2+Oasz=N$tWVh31q6kJMMTBq_*)5|;PO>ju)+jn8Haq$U>NgqBYf6mIz`I4KL|Fx{V zqOz*Grnc@!Yg>BFi{H4=WB9*d zq0fII`yX(joq&Ofjg5tk`x_SqrpIsKMA$fwdG8R*XyaPKNf`NFv2oDGkkPe_aUvy8G`mp!06$ z&{H7{x6=RuEDUsI!Xg4l1Fl4?#*>HIJn+D8Bk`6R*-2rwQDuYqU*@t+-bCQjnPt8@ z8PFum%r7i1CIe;01%Nrj`*2!tYD8~Ne8%I~vWwrp*D;hQR#*+BJdDxci~ef-U{TcM z?&_d@JrL#)H(xMl@RaHn;2Ha*)8be52#u@Nbm6DMZ&6{+oYKJcG#%7idFdRG}v?7$fZzc5vc`TTst#8ds=&C7woSE#buWPHczd!3z!25#2T#CKc@F=*Tw ztKY8~ni3fho2cDTZXXr#%)TKi%bcmzyn~1I^%>Q0u}6q!CVzQ*@*ZbI9_3kHxc=0g zp7Zs0WVZ*Xc3{bDKcB68#?C{xNMl&#%G8@Kimm|m6-i#$%~`#RBUMU-njYXdotFkTee?@bn5-&a9u$ zHcgnNa{T0+`6f$#BI{MXR`uc&X+uW5eFgJbYogtdE0&$l<6+`ogOSglW=f-&$~pka%HTgzNL#Yh|j_8$^I*2TSz}k$|!+UQ;>yR(lu0srlK-vyz z+!S!8x6(~mKBifu|4DT$@yc&|OlLKse_c0L_&{;}iZMz12E}Dzzb`_I!?Ez0=cK1h z`gZV&r%r1wODy5#gPn_U7^-ZpxUKV zc)EO+Ae36bBR*_!dg-`Tby?U7=O9au z1n(sTHC45|{w(~}Ex_$9@O3y;rSX`|#K2veM6lK})*8ypo>$Yg7?=9X_E$qkLqh~*s*soV7X3{h1BJP9XfDt(%j(^H`9-TUbbGl#_zmX++$WmI@E-jE-wu# z&aDa)8U?C5^9`HURdUQySSpP9LRW*wqNrXz15U&kYZ~(8(^>Dh#X&eMDRHxwyky@(jDON~+tTp0V9&RVJVUQHy6Mj%$T^}1zY5Rp2n zn~>f-*2keBGW*l*(!i8o;05jHPS)sWkAt1EAlx6dHpxws`s4upO~>twac^7K;#iNnGg}@A`Clw6>6sy}V9x4pml4fw|h-Ve=2QZAwEq z1RHpZ6}}V>y-+MJr&(D%z*YCJ6wIIhQJ^rO*PkRm7H=k;E|HyL_m=JOpU zJ%>|(qJzR>>QtxzE2fHXCiK!+CxA!;npyP7<9*Yd{BVOI%<*C1l5Z{JclLtRj+CSrR{H&1dKdFy z(Sa#pCVcU5@Th3hO0v0r%AcjXAg|U!BjT}})3c{%l4m6fdSw*Aoq*e+E3KM0%2d>} ze9wyQlz)b-Q>+vsDgu547x;&ofiv@cTomFTlKd!rDIO3rUG|1JiI*tHeQKcF_}#n; zsB56n6=+lR>CD=*j!x`n3R$ta!r{kAK26^A&#`xQj4LY=4;D>k9^1N*VjSnzLZKOr z^kp{hy_Ted>V%R6o2N6Uusf2E=rUU|C~iaD~BtO<;v;|q}p{`a?CTK^DZxyww@KG4$yDlQqLK_Jci~6MR zlw4{*@SLkeBp1g<}w_TFSW|S!b$zcnMxTqJSO^1fJp#!%)h#HTPGnY zy*V98yG&&>@@S3=q@P^J5~AK!SxlF8YZHQ!|AHm;9w%dqw_+ADLO0sLg&rp$H6w0bU&8iSLsam2l9`L-&VN`n1o65 zNvIseoEn{;WFN6{ggYK$-7Ox~-3+?X5D1@jaOD8Q18l1KY7N8_RE}-|1O|qX)UUp= zHhx9D7c!oF?%e>eZY$Yp0C4ynGp7$N*<(M=dd*P-HLxvk6r z6H^+UobJ8S$BA0I%Ue)WhQZt6E5+sp@^+?aBc2vu5n?!^Urc$mggHzxW|>}Ggdy?+ z@@%|||0@&tednjRN=3FDYqN)u*dG=WBr!7W%)@n^p6^QJ)6lPLp5nD_NpOEQKMOor z&=}4-=7=&wn@S%Ka}5zN>AQI8s!J{WXpALR?Vim#r4LwAeSvd#R>TmAG?8^pV`>I)xLh7J18z!q| zny{*yUFgqVX4z|Ujn9%_osDIt(sCd5Ar#cA($kwXFNnxMhfN*xo*=zin?rc4RK|Lo zS?P;NldwIxQP+T177zU&+mU#lw$f3I?p;Yb(Pn4|k{-;F?2#HcAFv-LMi@E6lZW+^ z$4$HfOp+csA*0UR!J*oAEH4vv+GeOi$U0jH{GvppJ{%XaRE(yoJ5nb}I4RcbLqpuFwFDys6O6U*zC?x-DT_k`c0>co=Fx+MO3 zw(aU^SCW|?PbT39UzlTnI5N7a?whC=+&UAD2fW7tSQ1tDog<6)6T#Lrib3IvmiAAHhtxW{W8LC|GwI6`MuU4drI;lXkmXKyh0W%`j-R=!^05 z0(_;!o7Uq^d z+Sp%ce{2!!-ib}eLzsKGw`n2^(uIRQk8{5aZ$*%(NqFg80rZvRkkZ=Em-5}5H+{M` zC)d7AiJ!-Hkfuhrexqxu*&Nw6QIdn`@2E3`P(4mumFNue-N2oe1YCGdH?{5P@sn73}EPw>69?f#*%3o$@ zjGuLNC|IvuQX)!#ww-ioG#9LEE`#z;xvgoRVj7me z5Z(ezilp?Q!kxvg=`@4D=2-VeP#LDC5-njs5yt{ZtkTP!F-4KZi!mS}o&q=H14xok zwQm&u*w8L}oN>Z3<~_&5hH%g*XwuuQ;7y!&%2!k)VU@I13D%ib`;G8{1lWpeXHkX; z(?H6kJNGOO2;XgVkBRAXw_J&)`>6(0GqKPjAi=$_4D*hz2Tc{(Eu8@UGZW4&oVH zD&$KXh=gp|^u$eb3BNrlEyQSgpFVHA_l6z-i*5{NUtdQyz8l-<35y=+2ZKsh7igN z`yrw@&!ed&a)oRDBYCi!GbfXjq)2j+$jDA`t*Ui>6$&Q=_Ix?E(2{QV(Nsk2z?dWzW<ZYEcp#fE&8Mvr&cG;bPrG1QMw{u5c+Qp8o9E=jq ze^8|4-mel5zXbqI5Yxh1ds`r;<@~jDV5Fmh12^mon8<(4m^Z|kn$C{01iLEA`L_-(1;EkeSPIkF@RZ4EpIS^3~<|Uh@@iMMk}QbMZ~6;?hx7 z$h^k9E{rf?R)$s?$Z*&p7Fih7=--vllo;fE!L}bQHDX|0Z26zu1L+wIlcu*A8_%< z$HrZ~<-7tqW*f8A`tS+Pm0R!lb+F&+7+YE2-N~45)J%>TbK(G{i~;K* zi*>OZ=8%^6!tp}k>B?K)E8`8P5tUjBCC4?H_r9b@qeOx58s08w=PYm_ckR%(=(wTS`)wl~MPDt~;pxoj&T$dYlOA z6(+pTj@M6G^M8HwJ%G^3ZQ&8E%W-f8`QTNr5#~x2uK7csxSDjp&-(o#;UH<~jfgMq zgp`ooBahd<-1)Zv(6oY|Biu*)v0L(!6nNC#?zv|`T#pGNHu&2xf&M5LhBN6M-d>n*CruEm6_`;nHRielVvIju1 zJ5AT~h(6^)U$skBd#m9ERNcF{ol;EW_*Vt9iCtLq-QU^@vZlNJIe>lAwnj_8z#&Ea zDow*TbEqtEm12lJx4aWW|H3PUvzh%Lr;7vcN_+*GI8Tg% z1o+;5)a|){@Je>4ACFpQLkw>E)6!A<*TEOxl_)sE@1#D5sL*HBkqWokq(?J+*jd|P zSIxmX5YBgpVI^iVGDuppLN8$%VvhokC~QJ6_SS5{J^3YwYzyW0Fz+CKQXhAn1`1?= z+~|7dinjp|L;x0AMD22Xty%Q62z7rH3{v|r^gO|_vtNXO@KTa+g7&NR9vF^vj>Xe13=sxAya1Z?->7aVgBzeU5vPsR9d?a!APIvS9A{a7t z;zaT-R)~f#L0U)&KA@#JRRq@7%5PxLpJH9Py6U53Qg148i+O5k02T$LwZ3X}_Ci)c zl~L9@*{cEEo3zzYSIpLRR@){zl#51faa_+L7~!X{B!c@fXgN|a!rYj9vd*OvZ^?3;r1P+NkErB8T57@PG@6*O-nGL?-aT_i->$$2L(XFi7f69k!LS^h!KVjB>ppV7Mz_Sdik0?(^%t0fner{R$_HSwM7sJmTgMus2PDpUL|ES zzMb)tz$cc!bHIL#)6Itc&B*DS8Xvn=)8nU{tJBt4K$s{F(n_3edAf+pnoSpSkcROs zUDjHTn!^QOK@@jBq4(U6@OJFVsVc(1cY=m$U;oC;*_+N2i>!CkLboT?)SHUp9n6jI zGeatiGsSNBh4)bR&;A5W*JYo{ks$Tgj#1H{x{Z9Zurao`V`g=A5_)wL6fK~l20+?K z_2~G7AQ!^C6Vg@kQ~otA*B6z;35gtOnmWT?wPvjQrAvyE>=bofLsrJd#;%r(fnqIYTutT((T_YO1@ zZ+UD(U!Tl|uRx%TsX))=JV}$@ozK6%C9WdXdlgr=KXzPPfBg|rsSoCj*2MkP?{jf^ z+QHwqJEGAP=oY7@b%yz3Q^#cBDbX%C!mDdQ5|8ecTj6Nq=h_6toRTYEsPWi}7mDHe zU0H1kx}cz|d{x@FfmO}p$jptkDNy|U)oL7fGo{`DEiTr=cscxq`s(b@%1dO(*=DjO zy^ZxDzLm^&NQ=dZw;%uWd^RX^>6mJ4Z2jhW#5l0Np+4|Fqff1RwnXXq8=UE8U%D); z5)sj^l?m{Z4R%M#`+nSQ%{Gb5HiuR`ec0I@zAG`x)26gaxW76G1^djC_|9khbI2#M zgpTJFmmGrQd+AuLV-)A=pFcnr8{Gney+%U0TQiY6UM~t2pq|ykGu@nXX{M_&H2{Lw zF{8`H0e6Q6=58tvB*~a5r}BWVe3gNUs*@TeDYP)v@@r;*M8Pv4VsS zxXFV4>QsW({hcDoxl5?+Y?e@l^rXSKnuKgdBVML%bdB~amnqa1w2pLwKjAoF;tFf* zqD-TEdh?8G*skgn;xwJgNuc?uBnh8gRJ4;yJT%K=(-a{9>#j@AZLQMP5}(m{G$SiK zlff1*_2BL+FC8DJ?XJzR4!1|;mA3#b-KQE-b~C@|1n?LcPnLe#S_$RfFnSX{^N#g# z-!xGzvEq4dPZ8h&p1HwKoDLqC;&ODjM?%8h@rfj4E-)pE3P^L~M&fM;AN%2w%Uq^# z52}L7Nm4a@(Dm4cJ@^&p4SX|obXZlasV*5jzXkWHc2O(h{cx^GdqxwgPEz4^oR|C7 z@t{X(q<1?)$=`UR-)i?lfFo;wD2&xWUrD(7pmfn?mnNzk~^N zPZ9f?;ySugO@n;Q|A(Hy8{WlR0PjtJ*lvXUveh=H*66mQHW%l(Jj4Ej>6N(BkoCuT zki=6b>ndjbvb!V)2i`>5KJf_=b6gmX56CsT8}+XxBY42{B*ra%j%$hqEF+zu?M+pf z?4~$hXsDw+UKRQN+n?`bi|_Cb*e~bQ78%o%+$=O>2ui>8r=okjpRI;K*e2Fg!ZU;< zXm*aACO4GsG?LM|fd=x51EkH_o9n`vyaPLv-{AImSXQ=#Uj>(my%JhE2H1)ed$llK z^=4x0XS5R}tJ+We>X-i1k0HBTqu#`H5Q>7 z)7oQr`B{)SWj##3$9w6`s`G5~?WPI!=@DPH4isKGtvnXW#CS{3Z~c<~Fl;rS+Un%l;d-s25T2>)PS{(}3TkG}fNSd-W9y$j-NX^3^nIUC4vCS)j;GxX zY9iD^CL*7C z7xT)eMUd1_xD3pE4(`2=o%zBaBC!sZ-aTHwUg|Sw=i|^Y)v9uNY^YvLbvG1iL{bdn zIN$!~WLExJ;Ao2*AAgWN(2esRK}AHR9%uqrWJ7Ep(m}!8vOJ*UtSaVGfgkt>ZI&EG=);?QZ^{McnnqV0s@si`gauctyDuqG7zW?D} zO6B8)+66N$5=vT7?{e&?qjf5?!#>ML8jUY5X-PM`RBBbPOGXBcj+h*U2N)qlv`QlJ z)=|Cgd!}2F@r4|o-tAp3SxoEK=rDRW-F7YkbUSfn{Vi5@_{AJOFT8&@0AoAyIPH=B z-7Xs9go<~W9zRuzI3Ggxcc&@v`^EQt;!tw471v*)ZZKYOIdRFVw{d@X_Pk+V(evV3 z@+*yAq#xOitGl<`n_!I}RKRL5j5Cx9=Ja8&PkllQXt&X*aV9{k+m<|65-P#$z&g4+ z&5Ol~K^E0rsOT&f>y1N&dfM;E-w&PSh)W;sI>udfINsF5j5?+tYx7K_bE47YZNUG95kkBf=VjXu9 z7{H!QGZ`LQ;WH6sxY-V!TnD(GdrdDCIZM2Vg~?xBr27N8a&(tq-P;zNgpCyoGp~)08P_Bg6_`PR@~MGYu}Ziw^fXLG>vDoMs%-11c16G2R&(BV{08f+8M0i&x6oDx zheO?kE#t#!mR{2;;;nd3Wa85~EdJaXa2YO%SkVYQ|0Y6r&7M-rMv+qi?0uD*1@I4T zUe}dsebLv)H?VUH5Y}fRI%=15b|uJ%*?! zL>q~y1lw7>^?T8H>kG*xwk1jDR5ep(yGK1|+^#z&sc+LhyCR(fN?=7?nvPTnMsr&) zMvJa4Z7X#?%db-J-N8-EcDtarH*h|E7i9xas*1Hk2so?$pwf}(?pAibEd7x zp6zsWeLuFG%gip{xpb~$O*vs)0qi3DWIKd*U|m~hTXyNr)TR_&Y+q&qb~D7{7+R~T zx|~~rn^!D0RF&%rq|BaatTeo8dht$2jhEe|EeE9hCKktx=1wa{WK+Yz9r5I@?rk~I zpI(itRpW=~Sq-OYQIMCw$F$`f)0RqjN+VaT2Rqpia8Z6i$XkMau`ZB^PA8 zu+tT|PZ-@_#8^J?2<#rd7_IeOWqqX5CTEmn&CsM|``Ua-`Bp{Xbw6o45UOL0B{**J|;;3G8d||*-ftt{&3Gn zOyXHYK6_zqZV6~2^_Njysm6>CrNoc)ssNy$n=il$XVtcqK?3k8+%|6@;0rX_C?cug zxN4mX$ag8J88$!IN38C|dOj-L{V7t>^Q2h#1Cw)rT~9B13EPr6amrYXx9bQHkkOH& z+PM@vd<&R3o~{2fGiy#!`mpjtxo{yK9oomguANkT@%WtTk3FKYsn8a z+s@I_P&Yz#Ya)^y!b(lQ_cz|Hi0LQ^T7a^heolRPA>AxzkN$?cUshf@`Drbp=%n!> zzwB;k%K1!8EiJ>I;^-fhsIb;9_Zax8Eh+jywIv4(R@k=qCr2CcJj5U0#5|4(2)&Eg zP$DBXd?d7E_Vw-L@?exnUOjRDTds{(?i}M3X|ZOQMev138$E8{gRdo|I)ohH^fp0>6F$4LLAn`m5(=e14Odqs)tH)Do3r2&B@v8?`Z$XSQ=oUA2eiI8hy7_ z2;ENN?FRY0naq??T+Y0qKkO__@8D1h(7i)VR%YAy+!PNLXwRa4MW=b}=SHJtq8e zJb}5p*rl7rsovJZ1B$71_=JJYKYtChJyaKV@a-%KmwCaW{svn`fc}1fb)lA@ z7wc3kj5qMGv&BvO)OqfXxAlrmvFH063(5ZOie)X+qbtp}O&dyV15MB!nP7U))h5)RWfY4pn zZ^rGuF<(3JJ`g+sMN?F{h|$3p^4Ai?A|ws3=;g8q4HFG4CNeW=?!A1E&0lW)dR2TE zP;#n<7|@M{Pgl4lyI*N3dY;lg^4Q#-Ii}@oN#>zJqMmMC}E)e-wIh^bK6s&)5JO z!-e{eb0|cy91efIBWZ6dm0!>4XZW#)O%mN>!@LE=I1#Ic#>lwMH%5B6E|>I7oDWB+ zu=?BrzHgsngL7ui{T2Pne+2EsE$%A1yD==j3MdW`>zV1kN%L9IW#bSh6FAX2{y@dV z3#N3Ca&AuY4<*aW5V!CK3(c+}qeb?y{D>OZQ8nEjF2o5DR{0{4fCGDhERBo@D|T##t%-d%BV5!&@x-$5?DH=Wa)p8|#? z>MRixZ@v*1=3fN#Dyi>_Zb3(W{J1C|is!17hBR=)$WuVH-x#EZzKcpq7SuUyc^Cbq!JK_Q}Hx639E+Uap5#{PnR~f;|QiQ-dFe?8F?~mpfvVs`z7K#eP=gsNq zR!%@FOZmGfzSIAXj} zrhBe#$X4wapIfOSMKVC4&c=6BiFri#0=*-D)MmYncWTJ!UZ>%?nA!~3nh&Oi;X=lX z;Q0T7e27v_E9CNrniTB9#(hg(Qk`e~wNSFqAb4pM{qWpGO*A3*)x zV+!GXe)NvVb*S~(fEd~qFB|I+ULejvRo=N@U8LCS;RM6Z_{#H}pf*{F>V&z8FOA{% z25_h5->!Ofr7N*Wrh1&44lX`OLrUl=5zSGKIGb;4flnP!=gFH(K1E`>UiX+j>vu*m z;UIMym8sT&uOy)gB3%}+ffdqJ;rHeBGXbpI3*VH8-+#zSc$LT&ErMghN1uf;0sO`U zPYs{o)SGei&A5^_M+!0e4|SDn%R}tRQ8po4ZN$AZGVgd4}FzT(4|IFJzq4vsboY=cQj;otd*mO}{+&oG@h#xtl2Q0E-|TYh+trvl-NvnkBg#yCHr_yksMM zUp(+TUk8~i)?PY%NBlpcoOk87#77d?yqDMbTrcolWA;tDM`a|i3qJ*bfd z!MWhnY}O}TUK#mxr1-W@r4LQjChjz)FhXWBF2aYkliK&fR73Z10* zb*kksPUp4K@eKob3yEwHWyjjU94QJU8C^kdgD#pZc005!G z>!!|qYD^H_fu?@cVZMWMh#+q#Z~#~EO|_t6U-`op>dZZP(^?@hkxXK?h)~=}KMw2O zsq@B5>ziJKn#(x9gt1|yR_0y@y+i2By?PI`Q%Sh~otb7tusJ?*e_>5b?col0 zTB1bF^IjJZenhl*>WXbtuQqzRfMupS=S_WSRhWLv>jx1bDNjQw`=8OQmtOoD{+6K9 zKI0m(^fr|&No&)$L(Qo?if@kUQ?=`gi+i*t^@fsE&|#)ttjFGs0qL&?r#Eq%r}yAX z+g@41ycEXtYi7i}ku|uFo18wZSKE)1&4j&2!IHP!o*GK%T<#h)Rn{qE^OfydJ(`Q& zqwH`|#uDuia>pIijklWH%N)=dXgAEi7B^X}nGnfHu4Y!r(UiwiV3c-7?B9`ucV8on#F|ja+W|U$ISC2JR}tc-mCa#m zDvWkFAgUzMnLzhM^AEQG*w_6#GGBug&x?whU!Yc8pQl=XI1U+?Ot>OO%%rDf z)q!pHLu5Ax=_7TXavIC7=J0idau`JJwWvwMvURt|v-SGhx>4r6>8UFlO$e79Lzq>aunBKo= z8UxJ-BG(ke-nh=*!=y5L2p@RvMcI!-tVup`VFgRRHgviL>~}aGig%Kh=Yg3V8LnCo zk?@OSN`d$>>GYdM^%Gg-QV-)->)P{9s%4tfWx?JpWc7-ak-PNm$eE(WJ*|Ko6VD)7 zn{;d|7$b6z(PPE8kycYIs*bnaldC+cZFsEsw0bq*3>SM_l{=YRsU)*U!TQ%;n(k@o z)vp4Y)y~Zzhp{O!i^%mCTz)U7vN-m$3+G;Gr>|!+!W%{ zR!y2RwQv=cb3o8(Mgz2z`zv&@M6d4xg7ZXr;wQ0=+}EM1@ztHQBGw+@w5~arQ;| zSQL5zRYor1t=&kRE~S)_lwo(6RskHjWlt0G+1+4g{N2+<-!{ds(sQKQJNRZZPi^d$ zXq>R=djyF+9x0?KXTN-8(U6Nh4!K`XE5Pd%&a>lLVD~;{Kl&NKXY7j_wT~n1ETQ9* z?wXc@@IpC5Y5rS)LvxVH{I@#YGcoGi5tR1u(#y$~@X)b1v8@YK6KR2t(Up`6~{ zcK**igId|LC8`3Se_=H`C0u^)-1Z=V=4jiTbh*bfRVRt#fWPSI{8NR^D}2ggd_{3j zq}*Q1fIozj;`rJ@&B?+)U4G(Gq5CftJBDZ!8&!97FG$pus%!D+!jD6gB`wB7<=kI* z*XF)UkFJsm$!Tdfz<`n|{egF^k_gttIHFN}p(eH}?H0fpYC0fTfY%-ODE89>{QKeL zv|gt)23$GlrRVfq1ei6MT!n7QgoQJZx7Kjf{iJhy(k6{+L9?!0xeqlK&sgh8cw(;% zs$#bBOf9DRb#QP;hKeR=23H`9!ZDx#y$C|x`f!t#JWj)8p~UBE$42FTPTS#t7!gyJ zPq!#e=q%F%3y#boY}ip*Q+e!W-cB9wy9Qp1@p$mz3#x=q{ zdWszHn_^ouUzpZ2ex&Z;F&2<9_1v-V;PT}Dcp5&-^&-VH<{$EJ9A8?q_F-GXBOB8B z!-rIz)DjkQ=c@#B1*zvO)VL;m9zC_H#GY2nOjCCO(%hdM&^>BF%CcML#;G)?jH+2* zp-zw3?33&I2ndCUsa>oiIy|0q2t|8|4p=yG*gNWn1?*qAGy8P+RL|W4a8CI$>kV~I zCCZipA5Pk=Pwh#MY|xpV~uufqWmwH?w@(Dt+^UB=s`OVu_;W%UVES7j1|`qj2yiAHVnI{5rF z!0gJwQaVsaS}rixIHjk3Z)97-uHJ(NgGVXi@5{(OctN7- zctlPG2Y`0vUrTGCc~>dmdz2!qXDQn^-Uc3b`fTpVV=?6&?S(yp$+`rXi<~ct8qaxWZ*R=Qdk&qU z&r!Pr%__q{Z~aJ~*Bhd;A&~I9~a_l#~8Vb5+v!l&Fv8Z@_N@DN(KSW59_3-QG62__M$@>xy{OY1laxmHR{O z*CKbPq(cyU;|=jBcNc}qsDFjp|AcHmJKW@DRYyle+^=S&TijeS`G4v$85Vkj)S=p)g-nDng z`&}WHM9Qo0U(3!NfN|IlJgM>5C60m7-sAC*?2_`wU8ot0hVF($vI=s7OOP)yM*rQ+ z=XgNrXFjorcC`xOo91kYSk=@cgOe^80ncXa?g0>>5m8hnfqC~9Kqvuk84xY9pN3X8 zOK-I%WRlk{Xldr(1aoT67M=|C#^O8vdeZv3C@G7OOjX75 zge&{R!clrzR;~h$li&LE-}G#>?#5`~r^A2QF3lyi?cLox_6*kKx6nKsG) zSv7>IgHPmKg|4-FU7reqV6#K-k`5(T##ZL+4o&JNzBABE7QYWzq+4zh3m^Abja`6k z?`@uvi9!RmcQ?-y+T*7kg2Bkx{iiT)Gory)qLfS+dwQRiIoy0MxDT5bnZGoFB_I5> z<629+1*|1X?h%(=<Jd+#Yy+E`6JAEKd2uf4Z7{4K1(WEXWd z`%VGr+>~s*a!;)629@m>gbM+}G*?`&A$^w`4e!Htg{CQ*<1SSn~2H_b!{SBrf$VsWpvVb0ow_rbWUcMGL-w?tT@x@&DYnk=?2c33^~vCO+S zgzr2oE5Gv$LsW!rIrqHpfsQuhsCmBX++FZZvLU}?I^I(3MuC@h_t&=+;@xr0B~ER0 zlMKh18Z&yw=np(#Y4>k`1C$6J7tqqPQO zn}}s7 zkRIJdACbTs4cqNuyX;G&^!6>hHr(&E5lMt7-UGlhIs>9s&5u5A0l%5XQj&x?z4Ey< zFr=C^QHdvtJ0uG9le9OfF&hnj^u%oPAgHJ&w<$$&3GFhR}EPw zN4qAK>uvMiW+g(TZk*vW>FlC~hHP9(?%b@w*H(e6K;NUwMLs&$P_3QHF=1kPfQ9znV zfICUOHh={c;}7+Dhc`V*$!sG+{rcPtph&qK#M8>gSKn&O z!8P*D@KrvXSlzo>aWw!VE)396Rix*lVW@#b$%S8Y0p-svg!qM*V+nfUXIJ1}UWPZd z7iaI&PGVS^zsuWpaS%=TK96XhE4L4NB$B&@=Ouv#u@oXIO9EfgT-;d+AXe{{NGY}pY{3~ zg55N@j3P-M&?_vG44gX^9r-62I6swBos(;*HFoXy{)MP4r4n6UJh`}nRF2L#C>`T%vmDbyKr}NoD~2J zgPuDI=Bl}tnyviw-9Ju*y*2#&_acW=zJfG`V&f_?q%)CARncC{2wyEm*RLya=i`9YZp`YYnOHM5mosEZc&1$$5D`Q-N#{g$=H-j|imZe_HswztbByPn39EG5x0auNtkFU< z)xY>JbLmgn{tJ1vMwcrhyO{&>MpSKXa0WB?c*>{g$6>hj z&N$6$hknZU{+OcmO&8in6Px&1%!XFnR|FjA<{hztkb05Lbg8~wJKS?_S8S*s>;m5A z&Gx&p##xbf9l(>c0mxB+3FimWrA?@&y1&fPJubdqui$B1*nezqyjaUzOsN|Hzyp!< zFj3naXX~2ZowaW@`0h$gt9;V+Ih&R-Nd>)@3LU5+Kti%9*fx>;SU4PH@y&5gvV&=L z+t0A%mY#_a-pWyB()`6)LKX#p#!}k<{?cV7n^IMq3JKgkl^3(doN z+pJbmE9_{KBp;PW@e(>?I6d%BsHZ}2SJP$Z=2G``?oY01ivpPR*Ha@(%vC|kIv=M`FO*M%6Ue2)^GuATaR53x1f zl$wRqj>;0!GODnz-w_X#XB?Io$;VO8IW;g!Ki6CQnJ_O{d|vb_$8~27UB|&3QLzm$;bl-1Mwr%9M^URT$&x& zSs$T#X0n%1#c<9UMgoq-k5m2?-zIu-XJ2Wk{h`hqg$F0oH9Xg5i0Z$#L{LiL^cz?3 z=zf$+dI71XYFsZBop6UoDih@DD)owwbKY#i93^canj;Xwn@(YiyDqF2Oxi6#a@Ds9;@Npi2?&kLy4h5RJev>N8T%u4qKVj0{w!CdjU> zmhLBpKnP$*BaVH2t3@jk)z85n+Y{k@-VyPflG`j+b{Eb~n!5oYW4WZ-qd8ohsXUF? z>@(%&loizbo<<^Q7^idi1Xj5NTa@{{Vn;D06OU z%YJ<4mnGS}u;xz0F473bFaW?f=jtgmxsvU#=sBxD>-zbS+ZLW#V4V3eG>9QX!j|Vd zha3!W4^F)+I6=98T?Z+qXu*3Wv{69kY@18$#z_URGJCEE91LcyCm5u?e)3$KHEraF zOAeOf3}QmQW;Y^-$Jc|xgX@;AsL4g?wU^7()+wv5<~#VJC?bJ1B$%wvBF6EsMU8@- zG{Ez-9YEwZI*ivWCn?>n*0%h=Q(7)Fzc!6(t<|oN$fKy`ZXvT(405v>0NUPI1&#+& zGmK*ab5l++o!@q!pLC4tS?&FQ!w}tH+lNb3*s+CVE(m5ZoPha0{XH;o$)U}^d(-jU z&C_@OwJl3%Vz-j!%}BSwSkynw76AF2_sJY}>?^LFHj+zgFY_vs=DK~f^8WyaAxFB7 zHl7%qPZrT4I0I|SF@v7?1d-@DtR~$z8GOF-98=W8yf0{ic|Um4d4eDZUzA~!Ju%Nd zhowbk)L(smR{sEpDJHb*`QQAD@JTE?NOIQ!@?Y)+X6kmH4>(?XbJnh!aEtQ&MH@?U zDK3J$FP90yBRKy6>(qT+cSU6Vn5L21a>3>uPs?mj0||7T&$igFw6cBBNVP z7-#@ZnE{GO$1D$gV+RANJu0tetZhlzpG^2q;s_UUSzbQaqEMl8jGW^i=jmP1te)qo z3d>{Z?GsjgKr2ANMsi38pdCKBtqs#Rt~CP;1tZ-fxeNF&C-BLsY`dL?op9e~LdWif z{Q0X&V0cUa3!$6)O^SjOF}%! z_hb)d0Dicww;4YA*R1T| zmi`FA5|~TM068EqAc5TdGftxCrqRiXh4nuS?KBAdK|BI!S|kn*^<`6>5~l}(H)AJ; z!N?h}o|P+U<@has6U~%e*&O;jv0hDUsLitI!s)d++*N=>AtM;$BOP#aj8_z>xVHZQ z9@g6b0I%F)t-r~Ck&URv*3&yn0hWF4%P4*Ef<{SjJFlth@5NmO%(UHaBKI|4OJMqW^ zoSrzW)i(({X>^yX>-}~jF8cQ@Se20-yrq(ORbxJ8Raghk%=g0ZNI1v?JXX}G^3A2T zmM3rPxm#DVvb%=Y>=A?I#CSoUF|tA2dD=$-fyW^FR?&=a%KCLHo$UT)NN%QzIAjq- zsO%vbUhBqs@XC61$K#sCO8)?PQdVChq1EoKWtDF&;V`_&Uw#O8l~|SzqoRNcfsUJ- zl50gSew*vxZ41&W$3J{6o!&AbbXg3LeB9-iB;@cr=ijKMDWt5t{{TZCXR7b|5J?Qz zZujvGzEbRzhAOJW0>MG=k-_!G4>b;>TCRx~%Vl&>Wj7?;7qVj~&A6iybIwT|AFVsl z>b2|YQk+l!(){t$_4k6|bw`G5b0gbrDY&mrap}$vQ^>Ce-h;ny_;1VcJVhQ|ANg;t zpVj_GrLLsT(=4sDU&8MLF%7Wo%7#3F#&{XR@%O35os+)eocb^L7G<)ww|3&jNY>=U zpSqP>Y-|@CA6y)cFm|4L*3y!)v6K>8dB3|&enzCzT3Es-wGPrl36KrP-S$AAG`t0dHAdsB5o`G2EUQz$~x=)BOgJq zz42sIXzMXePB=lgk;X>DkCdMIR>|%GIn8!UGAr*D__T3pR~mO>Jd zV6#YK+_C~l;GPHv+o>7#tuV>X)_pZDddJYcs@h3BV%GI;5#YF%7nGnVO91h0Bb<)e z<8K{BX&60Q+3($XvSA)%<=Dx-(4>dTyJ;3bC1IGzP@kGM4YvcXag1Zs@-izbsV!f1 z)3&He(z3ei=1|mZu4MC@QctpuPw$8U6}J*tWZ^*0;yC1EwOuN0-g4`IPE^ZO`IloD zI-!=q+^F*mj*Yh%zyuwqjP=3BMh{YIX89WP`@D)vl1rQZANpnOM@qUO6-r41+N{VH zMLtZahAdwl9ZuXF;g=+w)xy$A`M2e^{)p1f$w~V9bZhSU6yma3#E{#&7Eq&p@48ET zxnq%m%9a3g?rS9%HlLU0xT6&}ccr(!opiVS0}4GN_rhq`S64Q2TV0t666ei9zpHK= zLSPa|B%FQ}REk!%j_dmMG^tM8TJ77-FHgn!34Ijywx-VYUN@2uk~lvsWsfA1MnM}- z86%8fbk3wCrDfY*&f5MaYMZ-X*MG%qbg>7tMYLFAltcmvJdAJK#_W6bu6beko$tAu zi$DL<_$nJY@1eN4aXhT@C!PU!fW`&7ht&Mv~RaPV7SG5`ErA0ARzD z(;N|uVbNAr{x}tVr}=&*cx@wl$iv&J#^?$;g_+EF{opV6SDmFm1gXvr-YZzXX#2m{{6A9XYis>2 z?Q))xEykayK#HNGSs6#nI)VzHOm|b?(>x4lO3Td3jJaRleb4ak#-jElv5aRbt>$#z z7-xalW7nMZuU?&AWn)fNen0xu)}U-#VU<{LO-lo2-9rT@s^m}x z^MXjak3u5NjEvEog`4;y-@4+AVM!a*Rc+W?-cx@)THoA?GB&*`6qPo;>$*7!m{=crrp6b?r z@QdEsT%dHghDBl{{{UF0I}apef-}3g$OE1$3XtSWx_@`{or(C?y+1ZolF{ICB1Xd7 z$nye%fm3ExKmcc<=ub}F>z1X`(`L5x>Gx~$6fI_@)B5}DC9UGcrzPA_fygIgZRwK0 zAnFJ?z|YO=$U0J=H9Nik05aNb>(<}bm!T{dR+e_nsH!Zu-vgmIXH140k+@}HkjH`u zr8%fapR@kA?XkUTiN7|#%TM#}$fbfUQ|*?z?8UAj1jf>#kA6rYS~Hvit@5`Rz#}Tc zx$yJ%sb|Z(iN7GvLP4mA2B~uUw0z z8HZwr+yQ(XE=Dns2L~RR=QWI)TCSUsC|^bMJ;UKgh=snb4YI$M453*VmS-igf$5Gv z4n=q2XL)_cUK*oTN9jr?`!tsyI)HIr)RmFwqlLTi3>Hk$%-dx>2hyVJ;ehx zAeCDoPeY0cXtuodq`?qRDyBr8C_v95@wbEE)fqLL6~)w9EUSPdPNiGd)Os9ORVnu{ zs|%l>AGMFcme#Md?-l9l`zBcJt~PZ)yafXv;R7de9Gu`{xUu+eZD;cP&MMSXcmA$@ zo8Zp^+h`UxmZ=C)1W~9A21eDu{A<0wRm!>@6zSO;nvaF8^#W$PiCvF&8ROF*=RN7h zMY!DaZx(zwZGJSey?El&V>`U1OqM>t-~sv7yG>ZeRPKE1|@Hi*Z_+N(wzcuBYdBi0wRICFHVRS(_w<-^z~K5aF@NBjhX_ zJ^B&Xn(#3m(aQF>$mW}CWO-JtZL7l~Lw9YG=ops-ADD5#I2@ih$n`xd%Bu#nYj$Fr zv-5W-JIg1#$<9vzed2o#Yo3+8pDf<5Pe=W2+`V3`y<>HKev(UjKFFC@B%D4F z6^ntALFhT-K9#i?xxQxgYhRY%hvHmx_@De6ZN8*RCzJ_A!;Ql~>l?joX?YFe($N3a z{Qkr+GE861%O5u*g0py=vFb}1CzcQfx?Vn%kZ&SdO6Wh^|>oY=-PBh3J#^}Hv zaNZ+Q0SZXu?#T4PLALwf*7|-$MJa4#YDoHQuN15wYnF|3^99C1Ja*)9&UvYC zw##2jv2xhIYKtr;cPr=2!5%Wag=NlFhDQW^+2yIX%12^6%58_8P=u>w&kAOJC8gJXWO1@D)Qwyrq9pc5%`YdTb5a@qm)hZp;TfS6#-%w0I<$6lfVG-F<&o< zug@pnqVqYN({^W=PK~cgYxb85cNdnfs@nsT^W^01z#TdQLCDFkGQFxhF5icLCc1Ya zOPT)wTK0aYC#qPzw6W?|vQIstOT0?hR?Li6HY?5*jzN)w24o9XBdfT10ntgTu056b9S)BH!t>^sL9+$9IEk*_wUsAt!qV2 zR`b8eYh8PPR{sDl<{a|NZ9IQ4mffFej1t8dC>bhqjDyB8)0(AEop}UlHncS4)c(l7 zX1AVV5=f(t7GlX6E)UA5JajosW8SVQw3p}VR1%h}$o-MhWj3}^yS78dr01z14A;J* zdZ}232-5a*yOtwqKaE0(X9MEv2;%t&!C{ZY8p@eoB)659#VeuT7INyO7!mLZxiS<3b>NhPOm8452%W)~$ z8eoJSI)1*jT%mK+bi{c!&ciY{EJ-=%r}^zt;yaxbzGP~4O3K_h1mqAp{{WuVlZ}R% z*4SUkA_6gwa(LpYB5Y|#e8IndK7U2&pFu^1V_w%%R>J~uO2BOyqF^M>8Haij1DMrA zC&+(@;Xvt%)d>|&BLy3vAFU0Hk9j!b0<&XUmjDE0nsFvW7yvLi_p7-q<@I|xrB?E! zRrX}uD`>Mhqvk(|`US&8^4mvh@+c%{EAw{h4}Z$ElIA(8E1#Ty61406Dp@Y0(XHBf zHl&iWt^qwsDnP&l|$SB-rigbTR6;@H%^cc%emcn+MBu(%*w0K1Kzy%CsUcn zqQCimx)%iRW!TG0o2v;5%O1&P#9}7_rj3xP1cQ;m8?n=mY*uren_Rkno@Gt)eqL+j zbay@=xLKrGG}&ih>t|Kk!*p$nphQrHkdkU;`t4?$`hv4to>Qrj7SqcmBOPmj%DQ?Vlzv?cdz>is{jBW_DAHvYe_#9IwEJ$qNvw5X8gTkB{eDspzqaT>Ar!sL=V z3c4+;U9R^2x_+ckNxOP}XY0F4`@~5u4;TdgKmMxIlrDOuo&0bT0T|j36*jQZ zttO(g1(UM3QSLvlddfwke#&sT3HAIbBqq*^7g-NHk|<~{OeGLVM+9-!hJ$kZ+^npy zFGXG7o+wBbgC@FAJedwa!!Px!uo)9wk1ohghZ4+pEDp&? zBy`7mN!TQ=ST{HzagOz&nGMDy2Y2aKf=Kf(73m9k69g=$w$uF&6}%bEDA@e>_}AdO zNZ-%YbmzDk0L~-|7q~2-gV&}y9(rcEaaeUVc5_upE1w7Wuf!IX(u->}^5nL-SmTof zGb<})!RmSLeM!Z9-YPu4>RKhIt^WW+K2E)Qc^qz|tEQN2=7u#(l?M`J=X(2&pyV75 zgezw?QwFUpa0PO!~0du%-&IQ%%fonMp;yF57($ao<)4xo4S41R-U^{atqTIbD)Wt1L1`l3Ls>MK92(%Ao5EfseOBrxxNWh5 zpa(o2ILFj?^{oA^%1XzkS?d9VZICjt=nr-7KME5W-&yKnCjpPk)MMOLY)eOFX{al0 zDt$jARdE`#KbXWXLIx>XDP+vvMukgcmG>NfpRI2VOl6_--;XV#zPFS#dx!*lytWUZ=-*Guw0ff% zTdDbb@q5BQYr7W-ro*UNx@>vW$qdTCoyD1c;6QofmCtd{g^P+w-G5$2a7nvA>-tB_ zdXAO$sXoJ{#Uy7>xblp0vk*MPfZN7%9(gP{Rqb8{NTjW+$>wvS>QZ z!!+x0V1dbCuX?J(Jm8JI5!`mHR-f1W0zH~%|Iz%|)bz*}X&%Xn+3?Xav2s=Vj(G(D z8-eYH9c#s@NAO>+r-v4s)YH6{XI%L$*KllYKy!s`E@-~DCW`0x zTlDkt`I#EVma$Lg%D9Eunk6wfJ5T(xkl<_}jDf*i9-P%emY0|G{{T}*KO-AZz4Iky zv6eZdczn&0Mt4S2B!b`F_dP)Yxj8bWcFK*D($*3i2fBjZX*|-FQeq&dF~u1lEM%Sl z+z4M`fO2WYyKCobi=C_MyE-3-!DI1;o2ab2mOH4Yn6`H8j#X{g{^#!8dJ?D5;?#L! zpK{@Nq~CS;G|$mL5qwP(O?5T=f+dOI#3zyq!X}fSV8DGruXYs`xq9jMrK#O2_me&{ z@pr}pJohm^}OCd7K6U=l+!2>cd-1r3YIK~Eg)M4sLyDpph4OhA7 z{uc35UC#{8NW=6ezE2;30=<~Z=A6l&Z+tM<80qug=Lx^bR`n+(vFpjL-o-{nmanc% z?8_nEgbl;!E0%8Bvbm1;!g~6;!)eTXhWrTVX>L2%_YVx~K6yiLhK!Ke1Q33PuA40N z>pO{vWzIk!A@&@P(;~G4s?#pzv=0=dk1P^B*SFUs7fp{TvW#^tAr{N|97RG`bZ@QQ^XXzFzT02Cvj z4vsl#^P?{?(Dq|F~!q(nPowykDOFwnM`FZ0f7|F$ao+9-dwwl`h zsN>9*zS?pjN`FrZ!PPG`XL3r572?~*ttHJ8?4a=Et8|I+;7xUgM2PSeuj zUohXmbDGi)&i?>|{=WYJEd>dr*Uslh z;-83jn${t|2yCpUlq^c9gsjJ%yKpycB@>(?k5WlhD>=P-KlpQAZe+gudc8jblJOsn z?==g_HCu)-TiqGiB3A?z?+x)-amo408V~~w zPS3e9Czls9xYv1e$vKw zhrTf#Lg2@E;z?I(Iv_8wsLK}HoxOktsr%~ZLXq?>uZzw0m2-b&;7#Ndgb+awA@bAT z?=Yh-0gnXXEAuhgM4EL>C&@s8kox+LTgzXI9*=Vg6$ySf}*WJnMk>N;z%uGX1#UU z)P^8~&1j%cG2y;5_^YRQe(no5k~K?$$O?``fMjxb!5n>PlTqKP7v*+mhj_E&K9-TU zoh&k`2LKX>IPIPfw`z&W7NmH7pYeVx9Zp}dq~h9bvPg`qO0gUsdmfx*A7jOG=!%rA zPpSNQ`!rV**-CCL8J8&${p4pLXK#FW{4rS6pCabmnbfj9SHeFR?C+sevbYY)pp|?8 z<+F?uc|3AES4|4>dUn(1VCt=ok`IekBJ|w6lEl%g0vjbzk&}=)83VRObUCE#X63EU zmfz#;g83o|VVS0qG$Vc+YaUx^!Qg&f@k)4z#?QDpom}2EwAbz4^TT%$O|jV|fylui z^1it}v(~qS)YgFHeCOjk`#oAVOI3Sov|?HkGQbX?W2nY))Ewg-#~vr~Fq7(!jeKRc z!A~RTkic2FR-<+zw@;l zn~CJGW_0snDnl}jn+Iho-FE}DyS1ZST?6I`<4EKVLb^umcM;A^r0f9q^c3l?gwekK zSMvUudgo2HPuyEeBE7>25?4T=i81CKtAG%4K^bBIUZ$d^iKXfOe{p=5eydCL-Twf= zzsRcgmbTUnsl3s`iy?+sl@F10CJGUmxWh-za-{X&5Mhqd+jHjoA!1$I5qL^a7$YyXNk-^4D`Tx)+kob?I&OJ1x@v zl3mWMKjot#W((_&mjq)ODn>aaHw&P4d2${CgTxcaDqa{{REib=>CdwH-&p;%lcs1;e~PTdM4m z6vG@INCe<9Yt|X{L1=mg`JFgul7?sw$cUM z@-m4GY~;otXaKNpyu+>mJe=2UD#~zAXSdJ#zx0Nt?WgtqZeUFW+I@}Quch2WKAdu{ zp}>)64p64eq?S9e9u6NTI3Nb9%bxLGpMKx)dlsX3X>UY!IzEMYs>=3O)=4$q*kZMc zNenvzVBAiuPB%x_3^-yLPf`F@wvLg5}r-SyMa@A$9C^#1^czYcsctc%|f z__AlZznUA#;FZIdszaH1*zBPtINm48uj0t= z?rrXw1TJSXHLBzS5j@2mGJbK_zB62quBX3u_-px@s@~On{{SU(=+B1V6D`psyp_VI zl&(&CVaM|v*Rw)ttCr=>sq6YT#!EYSMU~8;%jP(E!RHyk$Je*7HNDez6Pez4U*h(e ze`eZ{J5gnLHxu`lI1GIOJv)x{sI@h7DAngUJ%9F*(X?iGt*^X?AP|$U4l~Om1BL^k z^rq^?Xr8)h*HZ0s=KlbTU$o`z)w9Ln@>V88<~SS{1QU*U!i@TR@m_v28kN%Y`H{`j z`nmDK_~*rXrNyJ`_wz}ni@So;x%m#=+f_5wlK{6PX(NN4JZw%XQ(V`wR=4%*v5e;G zMfTF(tAE73CyTW!%fUNLl1|b|AC|-nC{n@D0gc4qH%u=>ikFIVZc=)sw?+Q|1)4@& z(dPU+CH`dcYqM!0JKN!lyXYZ?c$l5gvdl}AeZ*{K0k(mV6bzh-a>d@*k{b|&w^39~n1Qy0g5_{&6h$j-GrqDn=Hm}XsjB{Kxu}!BY+DlKp-tXt9q0dsI zYnN`%zsTsctLw`RMi6qgd!k6CJfkuV>fyb~1aqDnBOQ71*ry0xJzKl{%pBT}GwS~0 zoZ7a%rr#Sae&H5*M3Zk4233!H09>fb;Bv^rDn4PJGuMj7Ir7=`+x-6ks~0)*+n0aq z`hANt>iWKusmBw^8-o){v%~Y1JHTD1jH`fIasyy|;d6@T#ADqw<+Iw|le%xznI{E# zZ}+eGE3u*BPl$TnkEvg3LEhf$%`C~g0(CrZU^?#Op18pkz6%*RG~)MBcJA$F{#$&7 zDwb;fPh0Un#mg;CHeF88YLPPtNNtHDt_dV$F+fh-ZUMgV#d`RhTBxtr_5FLANpEd- z{7xF`4xcPx@Mk~juS~Ax9{{UNeUCg0onv?0F z&niB(s=*c4mvePH7CGbnP|SqI)Q%Wiy733ysmbKI8l?hFyh8JBC3Y zFsDj9ve%{G%&9jYcly-ZywE1QnqLpbC37mH?p56oIW6Wm>^#r{k~!Q6$>Oq=e`uPH z{{YwKWf(g&Wwn{qE!qcwBHP=b@|nX)8)P($nLOZ;o}dFtq`4dI?*4B70Psh%cmDu} z^ENy;;oW6!Eh5p@0M4x<#8I7ASAX5JDwDe^Hx%HjU@$oqF3R@u`;vG3UCxN%?zyzz z*Ye!;Jre6hnoGM4N)^hz3ZfefgF)-WZ}g{D6hspSzrld3w&Zp37D8()};d z?qdbY+;_I!8|uHy)W4?57l`d3hhEU_?e1m1H`YICNkmaO8#z)Hom36*jBF3KLNXSX zDsqIKI6Jo&7jBBzZM|)^pI3WzHTKFewYs;i`sr^=T!+MZ1e)#T$om{NVsdZpH3=2v zmT2Q|BqB&j95!~sxEqg{3xW&kt)g-L8)#{sDrR(|`*|qcg{eQ#wv&+-NRytL! z?e3d-y4FOS{btnpQPiQpIOm<-hm2zx^`SdX&2PHtcANgMzWzpattllQ{{YwCbs8k= zr4wbV*%q4S#thH20c#_ZD&wf#u`%3Xvs_cHJ!(G7Mb)m$rslfAJs+2rq_(=C)UNHc zD0J9T_QoUjo07l1@~183v2DjY#_ybQ#xT7F)2%34QPwT@zv15RZ}@WLoZ#Y@tMBXm zY4aj^^;=8jySSZO?Epw6jFMF)8+@`!<QL(*g+fDM~Sj1qECXL8qMhMR+R17l(IQQ$JUDI~Gm6ngX{Y46vk1xyB z?!IjvZua+)IMi;Wo9#C0uuE|iiMgdk$ti=3usA$poc6Aob4lL&{{WeAn}fez=EZ|u zTL~%n3tO*HyHxoKkKS;f2TVCx#rviAwBTPwqM z%DcjXNFg~MhXfP29ODFWRfos6o!#u(zt2X#M)9epy$;sf;w|@uuB3wga`u{?qCd;? zDP~c~d=Z8rh~RQZ60X(yr+)XkOYmlND)T9M8Tw9OHHUU(@dy|jHgzqpTTlbVwa2bM$+!BwT(b2xPj0Zq z+PrS{&lSy&qh-s{CG*#B>$#NMoKyb*fp7CP@5Z03B%1!9i?i(QZ?Wen`7gABSCUW; zxyqB1$g7i7mn`&Yt9m`Z56I3ixAkvJcmDu0DWiu>)~<|-5KSAoQ6^t=V{_*u=dnKd z=xc0LG;gC@`XSVl(X%dV0i^11TwNlymC%i)^7`!{1IflnABR8=dS^nHDulXntG~Zs zl(t>1ul42kogT7bTWBSo8+mNREb-zJW@aSsk0UGqAy@;Gk;fUXnzi|Fe!Benehj%K z7^i2g+Vxku`3>=IlDbSE*w*sFb2RZuBSir?Pcb(s^9lKw<0KEeo~Hu2r8N|<{dfMm z4yGH}TU6Wa)8_j596jEda>VKK&%LeS5|)X^^T*5>Hr7$l4y1rej+NI!5ph@9yRH2{ z;f-SlZhddB+_q<36xyD}*@j#U5&nrxlu%C7w;wCy=R9}E&0*@fNv|aRFa0yar$6h|?KI6HKGAQiL7QkyZevSlD{?>w z=3v+noun3GShAKJ6$JEhsLJba>r+YEH@^Enmc~_{lX@kFC>`Uu4du;qaG}4_89_-@ zec-Hc8A;4z=On1eu!YZ-4<|VJh^uW@jrwTq_*waHZ&DoGwA;VS{szPK4O-_!)2vd$VI7oL z*D^ar9?rpf-L`NzM;00S$~`O=>EO_g=cawb!qk^4h^xt@rf#bpHT{J#YI~OT97} ztYPyNY;6A2w(+yIyQBQT7Cb8yT$7xQ*ygf$Zd9c0zvuq|52yJWxh*{v*K7X(!yX-d z;xG6|ov#uY(@(XzTb70XNat4Fx=9@4aaUzz0~=XKY>E{YXX}Q?4e}2v4w8q3}Xz|qXmyYA#iw6fDcUW;%dgtDD2a>-mm?6 z6s6A9_UrwBUPd9*TTIjb-*Sr{pEQd)w8RED1I$gwqU5K_cwoSc5nVWVDMss~e>**2 z=kxLu>vAU^`}z5ccV#A{c&6r23A2#Of=qRIK?#xkUpE}`54f(ne6m-!f6qo?2+NhP zllA>HWuFR2_ZD*LvlO|v^Gm37`{Qvfk?N;89Y_n`HH2iPqwlZFLTW@;hR?)Btz&`< z+x^m`30+b(l0^W@yM_aHMmfn*k6PVMFqNL2b@SO8LA$H<^1YJs{87lhhkc=1>E;)a zq`bHD(%NM#*2{u6%1-1DjsmIqanE5_Ql~7ex~qKF%(+Lur;*Uvz|Cf&^2**xT@p~t z?SxH?K2*;N0r`Oh61-M1qsdWUs=M`H@C>IZM%~|@-gflS{sfm+QX~iMYxZbni2}5% zfQcX?Hev&94b)_Az|JcwwbUl&_ICchXv#5gv-3wksd?6WG{^+^U+D11b0xC3mxzYs zLi^RxU}-Rn@<>yp}OFL5QLMk!L-?Lrii zNgR@{#N@F#LD6Fe7&)%IJQYQLitGCHOGBa+J=no-XZPOi{l_(=oj&gB18nlOq%lJj z(Ofnrm6WhDDFloK1D4C29!SM?N=j`trMC0)II2#`Uta!wKO-ktipDGJx3@3m-O7y< zI}sw7!lSm;>RhN9Bjw|02b$u{B$QRVuft#XA3aT-OY|qdGh5r++Up6o&PRCjz-_EY z%FXw;ZUwSAhI9U+4a{|Z|l&=)-{ke4Ne$NJ-Y>|TmY8hpARC3JB z+qV)xej6MCo@vyCIlPwN*O}8+ueE62~_6RU7PtPxu4^)lWP{0r`%7g-PuPt zdwtUa!aUs-7%b_BWkt>vfeoA!&{IvdX+MQp%IjU%uKxh=0aj|sua?_h-*w&lk_(v} z2aLE=$N&%kKG@^wQO-k||JM0q!1i!Q;#lmXi5A^#V+$Bi5CID}3)Alaexp5W=VGl^ zU*TVw;8fB4zsO~bYb~av@+f8&{1P&LX~;jA;QETSv-JH%C!;g<3z?3MZ84Gj&nz9= zj(L(L>+~dj4l9PX{{Z&)>dm9F`I>$vi6YbNnk5Qk+FXH+#fLfd&IWyOD~?|W{ks1E zGY7iQ+f-+VkDzQLtrJHu+j+s5re)RC&Kf=EzX%(SOB13Uu5mB%_m|So& zJu9+@Peu6-KN398#YC<3&|Uy@k8QF5KOitY2NlBpAG`B0`v*y;J4&;8q__H1G5p6r zCz4Lzrb#&Il54tu#9!fH_I``=HheQHi=h}|5=aPfo)`czk>ByH@ay+*{{Ro@WqryX z6jhvQNjMItRAnK#8$-4SJ-w^vak_Ig-TtPK=vwhiNV48WssgFnqXPhKi-GOQ{LOkZ z>FECeGof|{^@!z&?z&lw6}^a8s==MZ9Y_T9t~xK>UZ1HF z(k=O%?1-^VsH9*jrk|AnU<0%qk4|~|*H$;-lk!HjmA>QAejuo~Z8|sx#cOsf7l3f% zt}94t6*f4Q0ks!X$lEI8{gC62r#&lNPVxEvL|5tPU`=%~wwm0?{!yMVQ*qn!gSUUIgE|*PMScYVG%aL@6tqS>i0)8uiq!cp+pvK^}v*rF!^P?!TAj2->`n zd_UJ?S$_@x0Er2wO7ZE}ts504TTGBh&kDcGkEa#oP||GUgZ 0) { - return file.getAbsolutePath(); - } - - try (InputStream is = context.getAssets().open(assetName)) { - try (OutputStream os = new FileOutputStream(file)) { - byte[] buffer = new byte[4 * 1024]; - int read; - while ((read = is.read(buffer)) != -1) { - os.write(buffer, 0, read); - } - os.flush(); - } - return file.getAbsolutePath(); - } - } - - private void populateImage() { - try { - mBitmap = BitmapFactory.decodeStream(getAssets().open(mImagename)); - mBitmap = Bitmap.createScaledBitmap(mBitmap, 224, 224, true); - mImageView.setImageBitmap(mBitmap); - } catch (IOException e) { - Log.e("ImageSegmentation", "Error reading assets", e); - finish(); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - try { - Os.setenv("ADSP_LIBRARY_PATH", getApplicationInfo().nativeLibraryDir, true); - } catch (ErrnoException e) { - Log.e("ExecuTorchDemo", "Cannot set ADSP_LIBRARY_PATH", e); - finish(); - } - - try { - mBitmap = BitmapFactory.decodeStream(getAssets().open(mImagename), null, null); - mBitmap = Bitmap.createScaledBitmap(mBitmap, 224, 224, true); - } catch (IOException e) { - Log.e("ImageSegmentation", "Error reading assets", e); - finish(); - } - - mModule = Module.load("/data/local/tmp/dl3_xnnpack_fp32.pte"); - - mImageView = findViewById(R.id.imageView); - mImageView.setImageBitmap(mBitmap); - - final Button buttonNext = findViewById(R.id.nextButton); - buttonNext.setOnClickListener( - new View.OnClickListener() { - public void onClick(View v) { - if (Objects.equals(mImagename, "corgi.jpeg")) { - mImagename = "dog.jpg"; - } else if (Objects.equals(mImagename, "dog.jpg")) { - mImagename = "deeplab.jpg"; - } else { - mImagename = "corgi.jpeg"; - } - populateImage(); - } - }); - - mButtonXnnpack = findViewById(R.id.xnnpackButton); - mButtonHtp = findViewById(R.id.htpButton); - mProgressBar = (ProgressBar) findViewById(R.id.progressBar); - mButtonXnnpack.setOnClickListener( - new View.OnClickListener() { - public void onClick(View v) { - mModule.destroy(); - mModule = Module.load("/data/local/tmp/dl3_xnnpack_fp32.pte"); - mButtonXnnpack.setEnabled(false); - mProgressBar.setVisibility(ProgressBar.VISIBLE); - mButtonXnnpack.setText(getString(R.string.run_model)); - - Thread thread = new Thread(MainActivity.this); - thread.start(); - } - }); - - mButtonHtp.setOnClickListener( - new View.OnClickListener() { - public void onClick(View v) { - mModule.destroy(); - mModule = Module.load("/data/local/tmp/dlv3_qnn.pte"); - mButtonHtp.setEnabled(false); - mProgressBar.setVisibility(ProgressBar.VISIBLE); - mButtonHtp.setText(getString(R.string.run_model)); - - Thread thread = new Thread(MainActivity.this); - thread.start(); - } - }); - - final Button resetImage = findViewById(R.id.resetImage); - resetImage.setOnClickListener( - new View.OnClickListener() { - public void onClick(View v) { - populateImage(); - } - }); - } - - @Override - public void run() { - final Tensor inputTensor = - TensorImageUtils.bitmapToFloat32Tensor( - mBitmap, - TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, - TensorImageUtils.TORCHVISION_NORM_STD_RGB); - final float[] inputs = inputTensor.getDataAsFloatArray(); - - final long startTime = SystemClock.elapsedRealtime(); - Tensor outputTensor = mModule.forward(EValue.from(inputTensor))[0].toTensor(); - final long inferenceTime = SystemClock.elapsedRealtime() - startTime; - Log.d("ImageSegmentation", "inference time (ms): " + inferenceTime); - - final float[] scores = outputTensor.getDataAsFloatArray(); - int width = mBitmap.getWidth(); - int height = mBitmap.getHeight(); - - int[] intValues = new int[width * height]; - for (int j = 0; j < height; j++) { - for (int k = 0; k < width; k++) { - int maxi = 0, maxj = 0, maxk = 0; - double maxnum = -Double.MAX_VALUE; - for (int i = 0; i < CLASSNUM; i++) { - float score = scores[i * (width * height) + j * width + k]; - if (score > maxnum) { - maxnum = score; - maxi = i; - maxj = j; - maxk = k; - } - } - if (maxi == PERSON) intValues[maxj * width + maxk] = 0xFFFF0000; // R - else if (maxi == DOG) intValues[maxj * width + maxk] = 0xFF00FF00; // G - else if (maxi == SHEEP) intValues[maxj * width + maxk] = 0xFF0000FF; // B - else intValues[maxj * width + maxk] = 0xFF000000; - } - } - - Bitmap bmpSegmentation = Bitmap.createScaledBitmap(mBitmap, width, height, true); - Bitmap outputBitmap = bmpSegmentation.copy(bmpSegmentation.getConfig(), true); - outputBitmap.setPixels( - intValues, - 0, - outputBitmap.getWidth(), - 0, - 0, - outputBitmap.getWidth(), - outputBitmap.getHeight()); - final Bitmap transferredBitmap = - Bitmap.createScaledBitmap(outputBitmap, mBitmap.getWidth(), mBitmap.getHeight(), true); - - runOnUiThread( - new Runnable() { - @Override - public void run() { - mImageView.setImageBitmap(transferredBitmap); - mButtonXnnpack.setEnabled(true); - mButtonXnnpack.setText(R.string.run_xnnpack); - mButtonHtp.setEnabled(true); - mButtonHtp.setText(R.string.run_htp); - mProgressBar.setVisibility(ProgressBar.INVISIBLE); - } - }); - } -} diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/java/com/example/executorchdemo/TensorImageUtils.java b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/java/com/example/executorchdemo/TensorImageUtils.java deleted file mode 100644 index a5c7699df9f..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/java/com/example/executorchdemo/TensorImageUtils.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.example.executorchdemo; - -import android.graphics.Bitmap; -import android.util.Log; -import java.nio.FloatBuffer; -import org.pytorch.executorch.Tensor; - -/** - * Contains utility functions for {@link Tensor} creation from {@link android.graphics.Bitmap} or - * {@link android.media.Image} source. - */ -public final class TensorImageUtils { - - public static float[] TORCHVISION_NORM_MEAN_RGB = new float[] {0.485f, 0.456f, 0.406f}; - public static float[] TORCHVISION_NORM_STD_RGB = new float[] {0.229f, 0.224f, 0.225f}; - - /** - * Creates new {@link Tensor} from full {@link android.graphics.Bitmap}, normalized with specified - * in parameters mean and std. - * - * @param normMeanRGB means for RGB channels normalization, length must equal 3, RGB order - * @param normStdRGB standard deviation for RGB channels normalization, length must equal 3, RGB - * order - */ - public static Tensor bitmapToFloat32Tensor( - final Bitmap bitmap, final float[] normMeanRGB, final float normStdRGB[]) { - checkNormMeanArg(normMeanRGB); - checkNormStdArg(normStdRGB); - - return bitmapToFloat32Tensor( - bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), normMeanRGB, normStdRGB); - } - - /** - * Writes tensor content from specified {@link android.graphics.Bitmap}, normalized with specified - * in parameters mean and std to specified {@link java.nio.FloatBuffer} with specified offset. - * - * @param bitmap {@link android.graphics.Bitmap} as a source for Tensor data - * @param x - x coordinate of top left corner of bitmap's area - * @param y - y coordinate of top left corner of bitmap's area - * @param width - width of bitmap's area - * @param height - height of bitmap's area - * @param normMeanRGB means for RGB channels normalization, length must equal 3, RGB order - * @param normStdRGB standard deviation for RGB channels normalization, length must equal 3, RGB - * order - */ - public static void bitmapToFloatBuffer( - final Bitmap bitmap, - final int x, - final int y, - final int width, - final int height, - final float[] normMeanRGB, - final float[] normStdRGB, - final FloatBuffer outBuffer, - final int outBufferOffset) { - checkOutBufferCapacity(outBuffer, outBufferOffset, width, height); - checkNormMeanArg(normMeanRGB); - checkNormStdArg(normStdRGB); - final int pixelsCount = height * width; - final int[] pixels = new int[pixelsCount]; - bitmap.getPixels(pixels, 0, width, x, y, width, height); - final int offset_g = pixelsCount; - final int offset_b = 2 * pixelsCount; - for (int i = 0; i < 100; i++) { - final int c = pixels[i]; - Log.i("Image", ": " + i + " " + ((c >> 16) & 0xff)); - } - for (int i = 0; i < pixelsCount; i++) { - final int c = pixels[i]; - float r = ((c >> 16) & 0xff) / 255.0f; - float g = ((c >> 8) & 0xff) / 255.0f; - float b = ((c) & 0xff) / 255.0f; - outBuffer.put(outBufferOffset + i, (r - normMeanRGB[0]) / normStdRGB[0]); - outBuffer.put(outBufferOffset + offset_g + i, (g - normMeanRGB[1]) / normStdRGB[1]); - outBuffer.put(outBufferOffset + offset_b + i, (b - normMeanRGB[2]) / normStdRGB[2]); - } - } - - /** - * Creates new {@link Tensor} from specified area of {@link android.graphics.Bitmap}, normalized - * with specified in parameters mean and std. - * - * @param bitmap {@link android.graphics.Bitmap} as a source for Tensor data - * @param x - x coordinate of top left corner of bitmap's area - * @param y - y coordinate of top left corner of bitmap's area - * @param width - width of bitmap's area - * @param height - height of bitmap's area - * @param normMeanRGB means for RGB channels normalization, length must equal 3, RGB order - * @param normStdRGB standard deviation for RGB channels normalization, length must equal 3, RGB - * order - */ - public static Tensor bitmapToFloat32Tensor( - final Bitmap bitmap, - int x, - int y, - int width, - int height, - float[] normMeanRGB, - float[] normStdRGB) { - checkNormMeanArg(normMeanRGB); - checkNormStdArg(normStdRGB); - - final FloatBuffer floatBuffer = Tensor.allocateFloatBuffer(3 * width * height); - bitmapToFloatBuffer(bitmap, x, y, width, height, normMeanRGB, normStdRGB, floatBuffer, 0); - return Tensor.fromBlob(floatBuffer, new long[] {1, 3, height, width}); - } - - private static void checkOutBufferCapacity( - FloatBuffer outBuffer, int outBufferOffset, int tensorWidth, int tensorHeight) { - if (outBufferOffset + 3 * tensorWidth * tensorHeight > outBuffer.capacity()) { - throw new IllegalStateException("Buffer underflow"); - } - } - - private static void checkTensorSize(int tensorWidth, int tensorHeight) { - if (tensorHeight <= 0 || tensorWidth <= 0) { - throw new IllegalArgumentException("tensorHeight and tensorWidth must be positive"); - } - } - - private static void checkRotateCWDegrees(int rotateCWDegrees) { - if (rotateCWDegrees != 0 - && rotateCWDegrees != 90 - && rotateCWDegrees != 180 - && rotateCWDegrees != 270) { - throw new IllegalArgumentException("rotateCWDegrees must be one of 0, 90, 180, 270"); - } - } - - private static void checkNormStdArg(float[] normStdRGB) { - if (normStdRGB.length != 3) { - throw new IllegalArgumentException("normStdRGB length must be 3"); - } - } - - private static void checkNormMeanArg(float[] normMeanRGB) { - if (normMeanRGB.length != 3) { - throw new IllegalArgumentException("normMeanRGB length must be 3"); - } - } -} diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_background.xml b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9cbf1..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_foreground.xml b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 7706ab9e6d4..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - diff --git a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/layout/activity_classification.xml b/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/layout/activity_classification.xml deleted file mode 100644 index d896adb54d4..00000000000 --- a/examples/demo-apps/android/ExecuTorchDemo/app/src/main/res/layout/activity_classification.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - -