From 52e0b757a2dd26c5b82ac6e4c86cf3785b9bc255 Mon Sep 17 00:00:00 2001 From: melekr Date: Tue, 15 Sep 2026 17:19:35 -0400 Subject: [PATCH 1/6] feat(apple): integrate Cocoa 2.2.0 across macOS and iOS - Use the backtrace-cocoa native artifacts and the shared V3 Apple bridge, UTF-8 allocation handling, and process-lifetime session ownership. - Isolate new macOS pending reports with the flat universal plugin while preserving the existing iOS pending store and OOM Light behaviour. - Initialize native capture independently of the managed offline database. - Wire iOS framework linking, embedding, privacy resources, and bridge-only compiler flags without linking a second static PLCrashReporter runtime. - Preserve native bytes, importer identities, and host project settings. --- .gitattributes | 9 + Editor/BacktraceXcodePostBuild.cs | 269 +- Mac/BacktraceMacUnity.bundle.meta | 6 +- .../Frameworks/Backtrace.framework/Backtrace | 1 - .../Frameworks/Backtrace.framework/Resources | 1 - .../Backtrace.framework/Versions/A/Backtrace | Bin 1278592 -> 0 bytes .../Versions/A/Resources/Info.plist | 48 - .../A/Resources/Model.momd/VersionInfo.plist | Bin 242 -> 0 bytes .../Versions/A/_CodeSignature/CodeResources | 161 - .../Backtrace.framework/Versions/Current | 1 - .../Contents/Headers/Backtrace.h | 4 - .../Contents/Info.plist | 20 +- .../Contents/MacOS/BacktraceMacUnity | Bin 35584 -> 3708032 bytes .../A => }/Resources/Model.momd/Model.mom | Bin 1736 -> 1736 bytes .../Contents/Resources/Model.momd/ModelV2.mom | Bin 0 -> 1913 bytes .../Contents/Resources/Model.momd/ModelV2.omo | Bin 0 -> 3424 bytes .../Resources/Model.momd/VersionInfo.plist | Bin 0 -> 414 bytes .../A => }/Resources/PrivacyInfo.xcprivacy | 51 +- .../PLCrashReporter-LICENSE.txt | 54 + .../PLCrashReporter-ThirdPartyNotices.txt | 50 + .../Contents/_CodeSignature/CodeResources | 78 +- Runtime/BacktraceClient.cs | 12 +- Runtime/Native/Apple.meta | 5 + Runtime/Native/Apple/AppleNativeBridge.cs | 203 + .../Native/Apple/AppleNativeBridge.cs.meta | 11 + Runtime/Native/Apple/AppleNativeClient.cs | 157 + .../Native/Apple/AppleNativeClient.cs.meta | 11 + Runtime/Native/Apple/AppleNativeSession.cs | 223 + .../Native/Apple/AppleNativeSession.cs.meta | 11 + Runtime/Native/OSX/MacNativeStorage.cs | 146 + Runtime/Native/OSX/MacNativeStorage.cs.meta | 11 + Runtime/Native/OSX/NativeClient.cs | 277 +- Runtime/Native/iOS/NativeClient.cs | 275 +- .../_CodeSignature/CodeDirectory | Bin 153 -> 201 bytes .../_CodeSignature/CodeRequirements-1 | Bin 201 -> 0 bytes .../_CodeSignature/CodeResources | 426 +- .../_CodeSignature/CodeSignature | Bin 9175 -> 9094 bytes .../ios-arm64/Backtrace.framework/Backtrace | Bin 1128776 -> 1595944 bytes .../BacktraceResources.bundle/Info.plist | Bin 751 -> 750 bytes .../Model.momd/Model.mom | Bin 1736 -> 1736 bytes .../Model.momd/ModelV2.mom | Bin 0 -> 1913 bytes .../Model.momd/ModelV2.omo | Bin 0 -> 3424 bytes .../Model.momd/VersionInfo.plist | Bin 242 -> 414 bytes .../_CodeSignature/CodeDirectory | Bin 175 -> 223 bytes .../_CodeSignature/CodeRequirements-1 | Bin 223 -> 0 bytes .../_CodeSignature/CodeResources | 36 +- .../_CodeSignature/CodeSignature | Bin 4867 -> 4786 bytes .../Headers/Backtrace-Swift.h | 83 +- .../ios-arm64/Backtrace.framework/Info.plist | Bin 782 -> 781 bytes .../arm64-apple-ios.abi.json | 1955 +++++-- .../arm64-apple-ios.private.swiftinterface | 90 +- .../arm64-apple-ios.swiftdoc | Bin 36520 -> 38780 bytes .../arm64-apple-ios.swiftinterface | 90 +- .../PLCrashReporter.bundle/Info.plist | Bin 778 -> 777 bytes .../Contents/Info.plist | 2 +- .../Contents/Resources/DWARF/Backtrace | Bin 3925824 -> 5044688 bytes .../Relocations/aarch64/Backtrace.yml | 4965 ++++++++-------- .../Backtrace.framework/Backtrace | Bin 2216528 -> 3157376 bytes .../BacktraceResources.bundle/Info.plist | Bin 731 -> 730 bytes .../Model.momd/Model.mom | Bin 1736 -> 1736 bytes .../Model.momd/ModelV2.mom | Bin 0 -> 1913 bytes .../Model.momd/ModelV2.omo | Bin 0 -> 3424 bytes .../Model.momd/VersionInfo.plist | Bin 242 -> 414 bytes .../_CodeSignature/CodeDirectory | Bin 160 -> 208 bytes .../_CodeSignature/CodeRequirements-1 | Bin 208 -> 0 bytes .../_CodeSignature/CodeResources | 36 +- .../Headers/Backtrace-Swift.h | 166 +- .../Backtrace.framework/Info.plist | Bin 762 -> 761 bytes .../arm64-apple-ios-simulator.abi.json | 1955 +++++-- ...apple-ios-simulator.private.swiftinterface | 90 +- .../arm64-apple-ios-simulator.swiftdoc | Bin 36532 -> 38792 bytes .../arm64-apple-ios-simulator.swiftinterface | 90 +- .../x86_64-apple-ios-simulator.abi.json | 1955 +++++-- ...apple-ios-simulator.private.swiftinterface | 90 +- .../x86_64-apple-ios-simulator.swiftdoc | Bin 36532 -> 38792 bytes .../x86_64-apple-ios-simulator.swiftinterface | 90 +- .../PLCrashReporter.bundle/Info.plist | Bin 758 -> 757 bytes .../_CodeSignature/CodeResources | 103 +- .../Contents/Info.plist | 2 +- .../Contents/Resources/DWARF/Backtrace | Bin 7999990 -> 10211432 bytes .../Relocations/aarch64/Backtrace.yml | 4969 +++++++++-------- .../Relocations/x86_64/Backtrace.yml | 4878 ++++++++-------- iOS/BacktraceUnityBridge.mm | 432 +- iOS/BacktraceUnityBridge.mm.meta | 12 +- iOS/CrashReporter.xcframework/Info.plist | 55 - .../_CodeSignature/CodeDirectory | Bin 157 -> 205 bytes .../_CodeSignature/CodeRequirements-1 | Bin 205 -> 0 bytes .../_CodeSignature/CodeResources | 232 - .../_CodeSignature/CodeSignature | Bin 9175 -> 9094 bytes iOS/ThirdPartyNotices.meta | 8 + .../PLCrashReporter-LICENSE.txt | 54 + .../PLCrashReporter-LICENSE.txt.meta | 7 + .../PLCrashReporter-ThirdPartyNotices.txt | 50 + ...PLCrashReporter-ThirdPartyNotices.txt.meta | 7 + 94 files changed, 14522 insertions(+), 10501 deletions(-) delete mode 120000 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Backtrace delete mode 120000 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Resources delete mode 100755 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/A/Backtrace delete mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/A/Resources/Info.plist delete mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/A/Resources/Model.momd/VersionInfo.plist delete mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/A/_CodeSignature/CodeResources delete mode 120000 Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/Current delete mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Headers/Backtrace.h rename Mac/BacktraceMacUnity.bundle/Contents/{Frameworks/Backtrace.framework/Versions/A => }/Resources/Model.momd/Model.mom (96%) create mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Resources/Model.momd/ModelV2.mom create mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Resources/Model.momd/ModelV2.omo create mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Resources/Model.momd/VersionInfo.plist rename Mac/BacktraceMacUnity.bundle/Contents/{Frameworks/Backtrace.framework/Versions/A => }/Resources/PrivacyInfo.xcprivacy (90%) create mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Resources/ThirdPartyNotices/PLCrashReporter-LICENSE.txt create mode 100644 Mac/BacktraceMacUnity.bundle/Contents/Resources/ThirdPartyNotices/PLCrashReporter-ThirdPartyNotices.txt create mode 100644 Runtime/Native/Apple.meta create mode 100644 Runtime/Native/Apple/AppleNativeBridge.cs create mode 100644 Runtime/Native/Apple/AppleNativeBridge.cs.meta create mode 100644 Runtime/Native/Apple/AppleNativeClient.cs create mode 100644 Runtime/Native/Apple/AppleNativeClient.cs.meta create mode 100644 Runtime/Native/Apple/AppleNativeSession.cs create mode 100644 Runtime/Native/Apple/AppleNativeSession.cs.meta create mode 100644 Runtime/Native/OSX/MacNativeStorage.cs create mode 100644 Runtime/Native/OSX/MacNativeStorage.cs.meta delete mode 100644 iOS/Backtrace.xcframework/_CodeSignature/CodeRequirements-1 create mode 100644 iOS/Backtrace.xcframework/ios-arm64/Backtrace.framework/BacktraceResources.bundle/Model.momd/ModelV2.mom create mode 100644 iOS/Backtrace.xcframework/ios-arm64/Backtrace.framework/BacktraceResources.bundle/Model.momd/ModelV2.omo delete mode 100644 iOS/Backtrace.xcframework/ios-arm64/Backtrace.framework/BacktraceResources.bundle/_CodeSignature/CodeRequirements-1 create mode 100644 iOS/Backtrace.xcframework/ios-arm64_x86_64-simulator/Backtrace.framework/BacktraceResources.bundle/Model.momd/ModelV2.mom create mode 100644 iOS/Backtrace.xcframework/ios-arm64_x86_64-simulator/Backtrace.framework/BacktraceResources.bundle/Model.momd/ModelV2.omo delete mode 100644 iOS/Backtrace.xcframework/ios-arm64_x86_64-simulator/Backtrace.framework/BacktraceResources.bundle/_CodeSignature/CodeRequirements-1 delete mode 100644 iOS/CrashReporter.xcframework/_CodeSignature/CodeRequirements-1 create mode 100644 iOS/ThirdPartyNotices.meta create mode 100644 iOS/ThirdPartyNotices/PLCrashReporter-LICENSE.txt create mode 100644 iOS/ThirdPartyNotices/PLCrashReporter-LICENSE.txt.meta create mode 100644 iOS/ThirdPartyNotices/PLCrashReporter-ThirdPartyNotices.txt create mode 100644 iOS/ThirdPartyNotices/PLCrashReporter-ThirdPartyNotices.txt.meta diff --git a/.gitattributes b/.gitattributes index b12177ce..0bdb274e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -23,3 +23,12 @@ *.PDF diff=astextplain *.rtf diff=astextplain *.RTF diff=astextplain + +# Preserve code-signed native bytes, including upstream license whitespace. +Mac/BacktraceMacUnity.bundle/** -text -whitespace +iOS/Backtrace.xcframework/** -text -whitespace +iOS/CrashReporter.xcframework/** -text -whitespace +iOS/ThirdPartyNotices/** -text -whitespace + +# Keep the existing CRLF ignore file's diff limited to added rules. +.gitignore -text whitespace=cr-at-eol diff --git a/Editor/BacktraceXcodePostBuild.cs b/Editor/BacktraceXcodePostBuild.cs index 01983225..5a22caf2 100644 --- a/Editor/BacktraceXcodePostBuild.cs +++ b/Editor/BacktraceXcodePostBuild.cs @@ -1,116 +1,241 @@ -#if UNITY_IOS +#if UNITY_EDITOR && UNITY_IOS +using System; +using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; using UnityEditor.iOS.Xcode.Extensions; -using UnityEngine; namespace Backtrace.Unity.Editor.iOS { /// - /// Links Backtrace.xcframework and CrashReporter.xcframework - /// embeds, signs Backtrace and sets Swift/iOS settings. + /// Required iOS project wiring only. No downloads, re-signing, source rebuild, + /// project-wide ARC/Swift changes, scene migration, or macOS build callbacks. /// public static class BacktraceXcodePostBuild { - // Runs late after post-processors - private const int PostBuildOrder = 500; - - [PostProcessBuild(PostBuildOrder)] - public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath) + [PostProcessBuild(500)] + public static void OnPostProcessBuild(BuildTarget target, string buildPath) { - if (buildTarget != BuildTarget.iOS) { - return; - } - - var projectPath = PBXProject.GetPBXProjectPath(buildPath); - var project = new PBXProject(); + if (target != BuildTarget.iOS) return; + RequireIOS15(PlayerSettings.iOS.targetOSVersionString); + string root = Path.GetFullPath(buildPath); + string backtrace = FindOne(root, "Backtrace.xcframework"); + string crashReporter = FindOne(root, "CrashReporter.xcframework"); + string deviceHeaders; + string simulatorHeaders; + GetIOSHeaderPaths(crashReporter, out deviceHeaders, out simulatorHeaders); + var project = new PBXProject(); + string projectPath = PBXProject.GetPBXProjectPath(root); project.ReadFromFile(projectPath); - #if UNITY_2019_3_OR_NEWER - string appTargetGuid = project.GetUnityMainTargetGuid(); - string unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid(); + string app = project.GetUnityMainTargetGuid(); + string code = project.GetUnityFrameworkTargetGuid(); #else - string appTargetGuid = project.TargetGuidByName("Unity-iPhone"); - string unityFrameworkTargetGuid = appTargetGuid; + string app = project.TargetGuidByName("Unity-iPhone"); + string code = app; #endif - if (string.IsNullOrEmpty(appTargetGuid) || string.IsNullOrEmpty(unityFrameworkTargetGuid)) + if (string.IsNullOrEmpty(app) || string.IsNullOrEmpty(code)) + throw new InvalidOperationException("[Backtrace] Cannot resolve iOS Xcode targets."); + + string backtraceFile = FindOrAdd(project, Relative(root, backtrace)); + string crashFile = FindOrAdd(project, Relative(root, crashReporter)); + // Remove any importer-created linkage/embedding before installing our deterministic arrangement. + // Removal concerns only these two file refs. + RemoveBuildEntries(project, new[] { app, code }, new[] { backtraceFile, crashFile }); + project.AddFileToBuild(code, backtraceFile); + var appRunPaths = new Dictionary(); + foreach (string guid in AppBuildConfigurationGuids(project, app)) { - Debug.LogError("[Backtrace] iOS post-build: could not resolve Xcode targets."); - return; + appRunPaths[guid] = BuildPropertyValues(project.GetBuildPropertyForConfig(guid, "LD_RUNPATH_SEARCH_PATHS")); } - - // Locate exported xcframeworks - string FindXCFramework(string folderName) + PBXProjectExtensions.AddFileToEmbedFrameworks(project, app, backtraceFile); + // Unity's embedding helper replaces this property internally. + // Restore each host configuration before adding the required runtime search path. + foreach (var runPath in appRunPaths) { - var matches = Directory.GetDirectories(buildPath, folderName, SearchOption.AllDirectories); - return matches.FirstOrDefault(); + project.UpdateBuildPropertyForConfig(runPath.Key, "LD_RUNPATH_SEARCH_PATHS", runPath.Value, + new[] { "@executable_path/Frameworks" }); } - var backtraceXCPath = FindXCFramework("Backtrace.xcframework"); - var crashReporterXCPath = FindXCFramework("CrashReporter.xcframework"); - - if (string.IsNullOrEmpty(backtraceXCPath)) + // CrashReporter is static and is already incorporated into the dynamic Backtrace.framework. + // Compile the bridge against its headers but do not link/embed the static archive a second time. + // The .mm file uses -fno-autolink and resolves PLCrashReporterConfig via NSClassFromString. + AddProperty(project, code, "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]", + "\"$(SRCROOT)/" + Relative(root, deviceHeaders) + "\""); + AddProperty(project, code, "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]", + "\"$(SRCROOT)/" + Relative(root, simulatorHeaders) + "\""); + AddProperty(project, app, "LD_RUNPATH_SEARCH_PATHS", "@executable_path/Frameworks"); + AddProperty(project, code, "LD_RUNPATH_SEARCH_PATHS", "@executable_path/Frameworks"); + project.SetBuildProperty(app, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); + project.AddFrameworkToProject(code, "Foundation.framework", false); + project.AddFrameworkToProject(code, "CoreData.framework", false); + + // Static code's privacy declarations are resources, not executable content. + // Keep them in a separate bundle rather than overwrite or merge the host application's PrivacyInfo.xcprivacy. + string privacy = Path.Combine(crashReporter, "PrivacyInfo.xcprivacy"); + if (!File.Exists(privacy)) + throw new InvalidOperationException("[Backtrace] PLCrashReporter privacy manifest is missing."); + string resourceRelative = "BacktracePLCrashReporterPrivacy.bundle"; + string resourcePath = Path.Combine(root, resourceRelative); + Directory.CreateDirectory(resourcePath); + File.Copy(privacy, Path.Combine(resourcePath, "PrivacyInfo.xcprivacy"), true); + // Unity need not export ordinary attribution text beside a native plugin. + // Resolve it from the installed Assets/UPM package, not from an assumed export. + string notices = SourceNoticesDirectory(); + foreach (string name in new[] { "PLCrashReporter-LICENSE.txt", "PLCrashReporter-ThirdPartyNotices.txt" }) { - Debug.LogError($"[Backtrace] Could not locate Backtrace.xcframework under: {buildPath}"); - return; + string source = Path.Combine(notices, name); + if (!File.Exists(source)) throw new InvalidOperationException("[Backtrace] Missing PLCrashReporter attribution."); + File.Copy(source, Path.Combine(resourcePath, name), true); } - if (string.IsNullOrEmpty(crashReporterXCPath)) + var info = new PlistDocument(); + info.root.SetString("CFBundleIdentifier", "io.backtrace.unity.plcrashreporter.privacy"); + info.root.SetString("CFBundleName", "BacktracePLCrashReporterPrivacy"); + info.root.SetString("CFBundlePackageType", "BNDL"); + info.root.SetString("CFBundleVersion", "1"); + info.WriteToFile(Path.Combine(resourcePath, "Info.plist")); + string resourceFile = FindOrAdd(project, resourceRelative); + project.RemoveFileFromBuild(app, resourceFile); + project.AddFileToBuild(app, resourceFile); + project.WriteToFile(projectPath); + } + + private static string SourceNoticesDirectory() + { + string asset = AssetDatabase.GUIDToAssetPath("3dc91150f76c2497c810a0e3f78ff34d"); + if (string.IsNullOrEmpty(asset)) + throw new InvalidOperationException("[Backtrace] Cannot resolve the iOS bridge source asset."); + string physical = asset; +#if UNITY_2019_1_OR_NEWER + if (asset.StartsWith("Packages/", StringComparison.Ordinal)) { - Debug.LogError($"[Backtrace] Could not locate CrashReporter.xcframework under: {buildPath}"); - return; + var package = UnityEditor.PackageManager.PackageInfo.FindForAssetPath(asset); + if (package == null) + throw new InvalidOperationException("[Backtrace] Cannot resolve the installed package."); + string prefix = "Packages/" + package.name + "/"; + if (!asset.StartsWith(prefix, StringComparison.Ordinal)) + throw new InvalidOperationException("[Backtrace] Unexpected package asset path."); + physical = Path.Combine(package.resolvedPath, asset.Substring(prefix.Length)); } +#endif + return Path.Combine(Path.GetDirectoryName(Path.GetFullPath(physical)), "ThirdPartyNotices"); + } - // Project-relative paths - string relBacktraceXC = ToProjectRelative(buildPath, backtraceXCPath); - string relCrashReporterXC = ToProjectRelative(buildPath, crashReporterXCPath); - - // Add file references - string backtraceFileGuid = project.FindFileGuidByProjectPath(relBacktraceXC); - if (string.IsNullOrEmpty(backtraceFileGuid)) { - backtraceFileGuid = project.AddFile(relBacktraceXC, relBacktraceXC, PBXSourceTree.Source); - } - - string crashReporterFileGuid = project.FindFileGuidByProjectPath(relCrashReporterXC); - if (string.IsNullOrEmpty(crashReporterFileGuid)) { - crashReporterFileGuid = project.AddFile(relCrashReporterXC, relCrashReporterXC, PBXSourceTree.Source); - } + private static void RequireIOS15(string value) + { + Version version; + if (!Version.TryParse(value, out version) || version.CompareTo(new Version(15, 0)) < 0) + throw new InvalidOperationException( + "[Backtrace] Cocoa requires iOS 15.0 or newer. " + + "Set Player Settings > iOS > Target minimum iOS Version. " + + "This integration does not silently raise your application's minimum OS."); + } - // Linking - project.AddFileToBuild(unityFrameworkTargetGuid, backtraceFileGuid); - project.AddFileToBuild(unityFrameworkTargetGuid, crashReporterFileGuid); + private static void GetIOSHeaderPaths(string xcframework, out string device, out string simulator) + { + var plist = new PlistDocument(); + plist.ReadFromFile(Path.Combine(xcframework, "Info.plist")); + device = null; + simulator = null; + foreach (PlistElement item in plist.root["AvailableLibraries"].AsArray().values) + { + PlistElementDict library = item.AsDict(); + if (library["SupportedPlatform"].AsString() != "ios") + throw new InvalidOperationException("[Backtrace] Use the dedicated Unity iOS XCFramework archive."); + string variant = library.values.ContainsKey("SupportedPlatformVariant") + ? library["SupportedPlatformVariant"].AsString() : string.Empty; + string identifier = library["LibraryIdentifier"].AsString(); + string name = library["LibraryPath"].AsString(); + if (Path.GetFileName(identifier) != identifier || name != "CrashReporter.framework") + throw new InvalidOperationException("[Backtrace] Unexpected CrashReporter XCFramework layout."); + string path = Path.Combine(xcframework, identifier); + if (!Directory.Exists(Path.Combine(path, name))) + throw new InvalidOperationException("[Backtrace] Missing CrashReporter slice."); + if (variant == string.Empty && device == null) device = path; + else if (variant == "simulator" && simulator == null) simulator = path; + else throw new InvalidOperationException("[Backtrace] Ambiguous CrashReporter slices."); + } + if (device == null || simulator == null) + throw new InvalidOperationException("[Backtrace] Both iOS device and simulator slices are required."); + } - // Embedding - PBXProjectExtensions.AddFileToEmbedFrameworks(project, appTargetGuid, backtraceFileGuid); - AddBuildPropertyUnique(project, appTargetGuid, "LD_RUNPATH_SEARCH_PATHS", "$(inherited)"); - AddBuildPropertyUnique(project, appTargetGuid, "LD_RUNPATH_SEARCH_PATHS", "@executable_path/Frameworks"); + private static string FindOne(string root, string name) + { + string[] paths = Directory.GetDirectories(root, name, SearchOption.AllDirectories); + if (paths.Length != 1) + throw new InvalidOperationException("[Backtrace] Expected exactly one exported " + name + "."); + return paths[0]; + } - // Swift std - project.SetBuildProperty(appTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); + private static string Relative(string root, string path) + { + string prefix = root.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; + string fullPath = Path.GetFullPath(path); + if (!fullPath.StartsWith(prefix, StringComparison.Ordinal)) + throw new InvalidOperationException("[Backtrace] Framework is outside the exported project."); + return fullPath.Substring(prefix.Length).Replace('\\', '/'); + } - // Obj-C Linker Flag - AddBuildPropertyUnique(project, unityFrameworkTargetGuid, "OTHER_LDFLAGS", "-ObjC"); + private static string FindOrAdd(PBXProject project, string path) + { + string guid = project.FindFileGuidByProjectPath(path); + if (string.IsNullOrEmpty(guid)) guid = project.FindFileGuidByRealPath(path); + return string.IsNullOrEmpty(guid) ? project.AddFile(path, path, PBXSourceTree.Source) : guid; + } - project.WriteToFile(projectPath); - Debug.Log("[Backtrace] iOS post-build: frameworks linked/embedded. Swift stdlib enabled."); + private static void RemoveBuildEntries(PBXProject project, string[] targets, string[] files) + { + // Unity indexes one build entry per target/file even when a framework is both linked and embedded. + // Re-read after each removal pass to find remaining entries; only the two SDK file references are affected. + for (int pass = 0; pass < 64; ++pass) + { + string before = project.WriteToString(); + foreach (string target in targets.Distinct()) + foreach (string file in files) + project.RemoveFileFromBuild(target, file); + string after = project.WriteToString(); + if (before == after) return; + project.ReadFromString(after); + } + throw new InvalidOperationException("[Backtrace] Cannot normalize duplicate iOS framework build entries."); } - private static string ToProjectRelative(string buildPath, string absolutePath) + private static string[] BuildPropertyValues(string value) { - var rel = absolutePath.Replace('\\', '/'); - var root = (buildPath + "/").Replace('\\', '/'); - return rel.StartsWith(root) ? rel.Substring(root.Length) : rel; + if (string.IsNullOrEmpty(value)) return new string[0]; + // GetBuildPropertyForConfig joins the values with spaces. Preserve + // quoted paths as individual values when restoring that list. + return Regex.Matches(value, @"(?:[^\s""]|""(?:\\.|[^""])*"")+") + .Cast().Select(match => match.Value).ToArray(); } - private static void AddBuildPropertyUnique(PBXProject proj, string targetGuid, string key, string value) + private static IEnumerable AppBuildConfigurationGuids(PBXProject project, string app) { - var current = proj.GetBuildPropertyForAnyConfig(targetGuid, key); - if (current == null || !current.Split(' ').Contains(value)) + // BuildConfigNames exposes only project-level names, while the embed helper overwrites every app configuration, including app-only ones. + // Read names solely from Unity's serialized configuration section, then resolve ownership with the public API. No raw project text is edited. + string section = Regex.Match(project.WriteToString(), + @"/\* Begin XCBuildConfiguration section \*/(?[\s\S]*?)/\* End XCBuildConfiguration section \*/") + .Groups["body"].Value; + var names = new HashSet(project.BuildConfigNames(), StringComparer.Ordinal); + foreach (Match match in Regex.Matches(section, @"\bname = (?""(?:\\.|[^""])*""|[^;\r\n]+);")) { - proj.AddBuildProperty(targetGuid, key, value); + string name = match.Groups["name"].Value.Trim(); + if (name.Length >= 2 && name[0] == '"' && name[name.Length - 1] == '"') + name = Regex.Replace(name.Substring(1, name.Length - 2), @"\\([""\\])", "$1"); + names.Add(name); } + return names.Select(name => project.BuildConfigByName(app, name)) + .Where(guid => !string.IsNullOrEmpty(guid)).Distinct(); + } + + private static void AddProperty(PBXProject project, string target, string name, string value) + { + // PBXProject de-duplicates values; preserve settings supplied by the host. + project.UpdateBuildProperty(target, name, new[] { "$(inherited)", value }, new string[0]); } } } diff --git a/Mac/BacktraceMacUnity.bundle.meta b/Mac/BacktraceMacUnity.bundle.meta index 2fc35c20..87eda9bf 100644 --- a/Mac/BacktraceMacUnity.bundle.meta +++ b/Mac/BacktraceMacUnity.bundle.meta @@ -6,7 +6,7 @@ PluginImporter: iconMap: {} executionOrder: {} defineConstraints: [] - isPreloaded: 1 + isPreloaded: 0 isOverridable: 0 isExplicitlyReferenced: 0 validateReferences: 1 @@ -16,7 +16,7 @@ PluginImporter: second: enabled: 0 settings: - Exclude Editor: 0 + Exclude Editor: 1 Exclude Linux64: 1 Exclude OSXUniversal: 0 Exclude Win: 1 @@ -29,7 +29,7 @@ PluginImporter: - first: Editor: Editor second: - enabled: 1 + enabled: 0 settings: CPU: AnyCPU DefaultValueInitialized: true diff --git a/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Backtrace b/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Backtrace deleted file mode 120000 index c38038e3..00000000 --- a/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Backtrace +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Backtrace \ No newline at end of file diff --git a/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Resources b/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Resources deleted file mode 120000 index 953ee36f..00000000 --- a/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/A/Backtrace b/Mac/BacktraceMacUnity.bundle/Contents/Frameworks/Backtrace.framework/Versions/A/Backtrace deleted file mode 100755 index d7c4435cf6dca86c7baac2f658f809f1959c6ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1278592 zcmeFa3v^V~^*?^@On^H9M9Jg{ngmo5P|?b>qRb>b0zP?I-%Ub9l8EwF5G{kTErQw% zU}>?IP_50}*8ZXf729tOpf+kB5Grl$w>7~>gV7d3fEi58@AEn5-pQTGOo(0m|JM4i zm8>?I*=L`}{p0D+zZ@ilCh*rEzl-pzNfqMTzH=BQ(($VwAVgu|{OLE( zmr;@bd`Ptanc;qj<1fujD=b{OaP`WrjM4B)Z%}DR*Rzxm3_Dbm`kx?t_F!S*ij}Jt ztO!R%!@Idb!O1~e_{Xpvo^HZJ+vQ(j;gSXAC0#(H;rWgzcv&O}{uovS5m)*5;eBsJ9OBXI*cvm!j?Vl=m zm1ijk44X~2Kt?>le+u4RWeXSIdC#5E@E!{(c>9$Y35KI_vI8{xcaZ|yonLMrsN}3B zLzQBy@FS~V#Sh@m20Bm(d{Y@P?Z}815B3@-x(6bbD*BQ24Dj>Bn%d;N7!y;k~Qw=?3qj zD-}H5Y%jw-!;|{2WHI`K0vwIsI1}DaOdwX+1m6v|O&_qu-S9g!RpFOl%9|DL0p5zm zOBRK7Ry2O^-=N?fHSx2;@!_qy_x`eb?<_34_pT+#6b#v)qMssWY_L;e(!i32m zwb|MDVcb~KH44RtS7VNA0`Tm35zfDCinaT=7KvZY7S+yI=b|9~7`DSxv0eWG@2+sC zB09RgrJpEx9ySJl4EGGLi;p>wN5iW=Y4(HJCWfQnnKh~UOg@%cB^JD;K?Sc!Wfu%b z!821L;FaA|yl5d=FB-r7COk`S8SaVi$S1IkOuE^tvLINUXNK!k9^%Mflsy$TS`=O? zulldbPnvGU>Ah*^iiL|Yph7Cfo%V!^xFglCOE4BO$Mnpp5wtb(-?3!ZPj!tYfRKZbh&uk60!<+4O{dnetf z;FX%)%WzM8V)F5w#VdpHlE@%vLenGrW=|_uRAO zUNd_)cvU}A@anA$c-rBaXoph^3m2?_ScLzg@mu<|f>$*qoF&5Ei-t!%P=H@y;We|a zyL$SxS!%REjLQT73E*Fyg6rFxD1(G!heh*}a5xWC@hXRB`O@N*rDOAoOYUB|ytriH zC3390f64N@$9`ks@)c#6?2PqxC5v%F_@scKzGkrSkL*zUA%sJq;gwc4~1)OTC2tUG7XpBVEMcUYTYgVjWc+c2t z$`&jyUcP4R44MEW%ZjlxmaMuLLITpnB38aF9WV+1W*ht@_Yic@#i9rJ-la>gE?XHJ zwn{VM7TMqm@g1mEttYtoOO`L320alAvUjYN3Yh#O-jnd_qRU4J0sg8L%f~J*TfiSj z<%H#*De-GP79sdSSTaY>%NCYCF;*CW_( z-#=6Pd+s|$g|0k+A6-wPb{pE`Ia56|mlrQBEh||OpVn3m)WN^#dW3ifTz|&?oVRfK zePtyJd#K0Cp{nV|k3u9tRC=su*7b4N(K}Wqh4EjCH>=;ZocuHKqw3cDCHLM{wrJJz zxB}%hMI|DmY=_5IpG3mWXL8z2E|o9jZae!BPoJd^rQF}S8X#3(d7q=C^?J7V_NZY%x399SYnCjsm+#(wj(_pXFDPGFva;;H zh506s?)7u9iCccos^aA$OIkaLZZ#E6Ss#LBlZE{^4jp#~+E$!qp2)R>7&dcwwQmaxS@KY}Yu>+$w(#o-+U9 zCB=6xT(0s)WxNo1&c^TN$6O)@#!Rjmrk%sTbIow0J4saCBcuBM^--XY0(}(dqd*@8 z`Y6yxfj$cKQJ{|keH7@UKpzGAD9}fNJ___vppOE56zHQs9|ig-&_{tj3iMH+j{tY$H-gT7#wlllank8DPCFe&yHhg`JB5LJX)1?Z><#fLZuEw<#oE>m=eb7J zo!ZtA(i@$_kT2aBbC-(Wj`%hipKffzyDWE^H?#=vhn;TYhh^H<#*sq78}AJjBmN7s z9x>S)T8%K_b~?ne0^yt6|C}A$S;rS6J)y&Reu%o>aQf!FLJB z#CMbkC87OAv%R75i0>RLLLZfA{=?2>CDrLYa4?-a;+VmSoc6T5o9Yw_Z-nUZm()05~Ur*9ZN@va9=v z`5|Y@=r-qY^i_uOH^5x`Ooo4Wf~ei*@Pr=FMC~h1QM&-|3-B)6fxh}a>R?|H=aYbi zL;CKMpyB;O?822@^4-cyT5L4)=ORC8)rj^TcBX*lsYXjV+J$Ed(i#!x#&g98;opiM zu1!0(^NY^;jc6BXvLAUR+&SLR@v)xW3%>PI;ui}QE<;fccvq4~)}d|e*PlDtzNFEo zooPnUA!_rSo)GRRtKBlTi|NcL1?Q$E9GGDUs55hU<4Uh*y13e+O>90&1<_Z0oPxSYDGH<$ZP(D+Q z1M-<{{82uK8NZiLxA88X9c!S6(%#q^10ow&Z~SUq%xzB9wGYrgHx&`Z>*dl8qHmEnKHq{A5Gr!Hna z!|_g@%Q9j73UWs{zjpYbkB1x2BHo=KfRo#J4}C*@N4ac58uk1k#F2MSf*$uhoEc<& zgHfg(d8$oVzml+q8GakAy(TQSs|jTYYo7@#1XyeOYk)P}XhR(FY{m0bf8oz`rna1( zmltR{**U*?kvG7)b|%Qk6Zew$Mpy$U+E>fyqm2Q;39vQ^OYd>@bZU3t*K{lzh@6FLoY(y=xVu)N^Y zebpDEJ=8JnOMZ$(qMLm?8ZFsKgFKXRRF|OGGd*DP~M^(kJ_8g3})z0CsW)Qdh;jij*d~=%zh)`QT z>bYF(t{SNwIE?oXM+*OXF@M9u0=((jUFy7f;^nq6>@eE& zk%>nI;1gf!$%EkC6+g-F6VKbt^tDK5UsRwyB{$CqJ?j*ek9dY)oK7;5kcYf_7xIu! zcj8%HaeMGld`TtFLt$J%_*D-U$@LeAf)CLNzfe>DMy>U+(Y2N>it z6;3j)j|jVsFN+`-D0h0%ub?wDz;Xa4=)X1r`bzUtSCOt6ptt90Z)mjHj#+@ic3y#J zaz9afJVDeleT13rMLg@A06C(ZUx_gF*E<*ssaGgFRT$&t7!12&B+?m2dESFOguNQ+ z439usBgWk<`Ajv=lTWuX9M4qXbqIaY_zl=B7(*X6>(53S>&I;v(2LX1rhK$54{h{9 zFTN>h^(XYtR`ic5n{2Ew%ML}^uJPLq+akq~_7k3+pfCHV15dX16I0LiGwWkN?xwB9 zK9G6I@7?SFyjXLSt{his^YEQEz&}xj{iVXF8)3>a!xlaMA>pPO{~M7v)%Xj-7A*1~ z%d`O>;&MQiNj4rve`5?fDke>qV}hjrEN_VR=QE|6yM4)PppOPRIY2Kb=mtJm+b__O zulbR8zy9XT(39n*!QF|TP&)ejIAC);S&H_*_7mZM8T@=GFWEo;gLMJc`yArg-(L)c zor3U5gvr}YXzOA0Debl*=hQ=&nlP>F0Ognb+9Q-<05+yHCmY+$PW>OJx12vqBu`SPR{Tx-GTlr4oSTi%IjzxAUbewV~t*Xl|KM@x!EcH=205@Mfgt@DtOfO?7JsX z|CaIz7`Kv)qevs|kKu{yYZ^Y2Ve)ZTU!X0L7V-23X-fHH`I>L4y3&1x!5r94N1VD* z3HqLW*Nl*GOg(f2_#|E_{MUT`;O2?ipm#B^@<-=EyZp&W!<@;#HBb0=mS_jaGvr$* ze!rFc?KaBM7BN7L^X!L=rkNpk=>x%W7!zcEq>~@{PTklH{-bVr1voP9YQ*JW9Ax{O zkVbhH+SEgTDhCXVgUoXbb*Z_B+sH$H+VBsdycPF##Qj+l6A2?r@e}5)nv|3K5ayhf za0tH*a_~(}NEknqZAdXb0bk|}uy9cIQ=X|GK0w;*P7VCpU8ksVG`{?H?h^;7nG zFWX(bQ*N?IrL2!|3gg}8$JfjH1uIZ!f;9yL?AL&gpuiKc#KGa1m+b3}b|INF*H0ZfI2eRchUY32FWV|4s!;Ej@Nx80d zrU%<#E1vqYa~pAK22WBJ{fz=Vnk?VHhj;R76T)iFn-2aNW;6kR;@J;!TJ5|wsP}`7 zg#NU6nEd-nMH>3)mS8H<2%{Zs++A^NkTh(B46^RO*y?rxrd2QQl8UMqwk_&?+pPDW zpcU)dS#dM?=++?XQ+O)aq}w~lTkE_<(qK8-{CYllxJ#edbvyaE6FeSm4<3i!ApiXJ zcGWlQo#^+)-Vk)(e*NhgA=+~Synvg}{0}28Z>2Z15Pi&XP{wCD{F5Mmr0>~?mvT5# z_?yk~=tK0+M`*`;z}0SB0hcrCx|1j?>!{NFnW%$uVUwqrygiP*4SmKoEkd2-gD4#t zQO?ql<4rwi>d0^&>c~`6e}eap>T_m<{sLK1x-u=SD<1^Es{U~sJAi8r=Dg(1Y>YFO zzJtxXjCQ7!8?=e(&mnIX@{EBlQaUmfyvX^S(ot>DXJ11*s9!DKKZG&xq(jt_Kc7Lp zmQ1zbUGW!f)fD3GP0zdK)tNqIge3#Ql*pc+@R$L4slE* z%|G2ZU`Iwzy0WLSi+0UP%sr^L*&eHJtNZn?Z!KN9qO)^b)j%;p(gXUd2>r1KZNvq% zwba8h9=3xH+rb6i&CSM`SXLIS(?qQdr_TtvG}orl*`CRxF{UIU&+P2W{Ij8V^s@3v z8-$pUgZE4=rR8GG#b__bYxCA3%{>=7LiGXlNUG$CXV9k~f%ad#uVjNT9tDo<^L*rg zxu1zYblFPu=Stb1ZeuL+D7^`tjCa+aDaJ>TPnKQHcA`IO5dM&DrA(Zw#x)If!hUfx zy*frZd2s}O>{E-ESA=;v$ru4Uj^qB@(l${%@jm*d3U)yY;^NUDzHV{LzDPkEx55_M z3i`7RCjrZ{#b-*IBpXkd?eid9guJxZ*^YIvpRO?5yxA!z&$J`=TXy6}(37$Birt?4 z)EsyI48E~!N8)VHLp@>f6K-YSw1qrr$~*bXlG)c(e2tDa(H3AVr>B*@yN`6=M;*In?@0jDGAvm)4PVLJUcshUxS5eE`C4Sp=?6(XG&PsrXfFdWhUfJ$zqc6JYdp}T!b>8c6O%5(@o$f zL+Sqk#JL_Z890}LSW8v!)Q4_c>{ThpeHr} z7hm}#jQhHADe^pR!eoBpv>xdrfQR3N8OyF6@lDOmd0G)<(k=&?fI<3U9FY3Pl9v?Z zmvX*OI}j{%V(yrLIT+@!Yx~1@rNMXQ=K93eD%fc(uj{avFlWdrd!j+yS=}lw{#~o* zU!S#R|NilYra@J$T2V)9!^L9j`u<|VhVwijkt{YfiC5;v0dFr_bke_o5D^BVVAI5#a ztp*+)YiEFl(?QE=n1{osyieIgR^3&odxu#!c{m4k>ZtPwaLC;Q`@Ns==c4{x)XzES z3D{~r&`9X{A!)}A$`7@HPQM3?6Bu*Zp4V?BpCudf0FU7+=zJ}!yLdr^MunIErm}!5VK>d^vKf;s|*`KbN zp=6A)7XKeX9!pl%A|GYtpJurVvz(RpBg9iymPzx)k-GftFFWz|HD3c|vDcmzPuDKQ-atTjpBmCsEG}lI#8JBCu6(BBCbF~x!$Jv_8*ys?j@mwv< zuxa7bguSjCgrOtBa`+iHh53#i6dp zc2aW-_ziYAZK4y<)zlX&(XVQL={A0fbjwEag5Kpw;sM7B&I=C>V38H)Woz1eMl!kxW~Qw8KclxLH&3Y##iW%ICp3ioMThTV+AE&xnIh z;!tyFxlr{~T`KD-w&PG`;&ACmnRe?}z@hUNEoR^AH+bM*)xnQ$uQghYtmPQHNv?+Gi98%(|Cl{dP|aVp~S&$oR4Rf z)H{)KZ|Rgq+CXBs|1Q`G8uXNtc5y7nA?DwihczC~(KXHgHuB}JN4}qlz>y&$ z^r2JHU(52%eHiWBf_k{tF3#SuJsUsj`=$Y1^B_ylNAm~AUjZLvk=ceslxxfc9YOCV z;Kx30#QS=+Hdv#>eij`&>Mfq3{)wPn)&>65DB5YLBio}XA7I^3e}PlDWn7UN=S%YE zBQEwBByI6Z9dkw>=cv*aaQNYS*{bPkEoM9FBd?H_V*Q>gMS|~2_ScgbAN~s4RE7H%TD+$>9?DJ za`caJ9c47$Ij_A;KJC6c`19bq%XGS1(695G$%E??{M_F~7#G-JWSTItOcrXb$rHp*}t%LOmV%LVl4{c6{Kjb~^L)ej+ z*Se=a_G%!G{vaLm`X}YubFy(0>LDC8ujIItY-}SQn70oCJl5Tbd8w=yb9mS*HF-bE z3q6A8Bd|%Fz@rIc&ELPF;Iwlr0*tF9T=+xyM8A-)S^p0Bp_6xR1@E|xYQSgS!zNuB z_cY?3Jl%;s4oSwvCT>4K9C^l0M@yC&&v9=_g<8}2y_}O|{V5B+5$hMNZ#lmCMDP{6 z{%or7y<4<5Ym>Eh`WEUea){6=bG~ff|KX?23%Zgv^pijr_2?(rkSn$}IU@Zex10W% zV$?%F3G^oYBsHd=q$cbqncC$iS;o9mJ(DrUEaUuAobzY~_a9pR3DWOc-;8QC`MQItG2+H4!jMz#(9 zjc6ax*O?deJOW-}`?9eASJT8??gg>8FS&>I<)dEmLw1ZdM)H6LJ{N{#5cb`kB|-&q zeCHfat=aHt=Z(m+!l(oeJ?ByLM!|8iO7j@qih;AkBp{yESWtFnJtFQ(pKWS2luD_jkrN> z>6@_d@#P8sNZDs@BfNJ6^VO}e^C>f1Pj#l|X5|H3Sq?c*IfZz5GeZByQ`$&AbL~{5 z`cH!&5m%XACF5%Hs#5(YthhQe&XeXpia4u&w7pU^I_MXv%w8(zEH!za5q`*N*e;FL zUZIIy-0R2oWr?YWlr5-y3#7lDM^^#=1u6bysQ|#Pb$CBrWRV*Xe~X zn6$`rV=n^y>%zBwitzcSuw5}}Q)jDR^i#B{JI_B1^;`4^w>2w%z2QEHS5KC$o-DJT ztZeDOw96yMCF((Iex~-%a~@BhhQoLc_L3JmGM-HOkWO3VgVUXDcBW8SU+`?Y_8M3xrA>fm63d?rrR>a2(j>Ob(ucj-*Wr z9;*~ty8jm)o!jIXk{!0&D`U-x;EQ{=+Bq}`->%%x@yom6Z|7Lsn{pLN;c^G(e1&pO zcevb?dGIq-3^n&-x#QMr?IFpjAh(rnSFQ;!yb&CBOS7y5$4{3*O(6YXiuf~ z{LD}Yc6~GY{|U5ZBYwK4=)8Kl?~8l&aApC1{o~+K!cGNG9)~?ub%mJl>z0*)`$l*J zf5IOB5Be9hjF=+kuS^u7(z8-F>F0=!a2+pT?vFaEfX7~izu$#50qlhg)1I^)0K2nO z2!EhNJK)kXgRm)U^!4ZX(-A+y>3tFFoi%Uy&X#=U9Y{aX>DH28KGv}B@n5t$KYq70 zf7HjV38JH6A=)`FS!`X0`Q%B+80UN=fOpXlHSdB=U-|IMGgbQoGef(9o98Ss;Z^Jl zTaS3QlY4YuLOj>ReupRL0qm>)!8_AC(T-B+D)hxyY71>^2j! zvn?+HKj`Cz)cI=t{6XNtIlm5>)xBfDo1Rb_*1WLaP@dt_vsIjqxLKeV*FtkO?EvQd zHM6xOIp?1ZTwJ+A`C5uq{zoy6xk___VZM>$8ul-u&FNTwNCJG);33pc927sM8~5S; z<%1Kr4pzzapQ;kafrW@uv`aGX#d{M`hc&t0%l)~akHDUy zS1aaW|6iH`=N({T?<>mF?s~~NKgd0C?B^4ZukRI5rjm_aL&UBhU~lYe2baTkq)d=M zGNk|EW#~@gxRGtboSU>jyDInormIcafS-jm^jhb40|7vkl`Z_hX*G z{>}L_RlmN6eGt_Z^X0x#wZ~QA^D_8P;sia?qmH^~Y9OqaiiY}&K!=|6(#QRMb1yb= zVxM%N59=TYVV-%di)Xgp2z{xE2|TOxC-gaGXb;jYo_P%EeE&OOke=HRrtQhNzaWn7 zY{Rn(a!@Jrx@Fs6habS&e|qY+eAonefiLdH*#gYTn+MEjr_IH>I2Tm=0HNPN%Wibo zqja?k>w+%ryh+-lR|TYguIgR?Ob0DKO%hu>p`%{`j@uoc&D3p;bCqtJ4xG*XlwsYL z4m~zChHgu`B~pK7KzF@XG1t^zI7egZuXez^9Qtdb)L*H_wFqB>-_`ih-^e~;9?~!$ z&sPtQ@6u(@I1YRbaY~n^7@x^}sm5gUIT6n)@XZF${1xz29oA~Y{kpfSU(aJc=(atG zv-&b!!bmd8QMMW5ZWUy|$&?NDUl!6UVLz7Q?1_f`B%qTi%SpzxVRG*Qbdd-R$NmDW z?;mU2wj+Z+10|P9#uc_aX~<*Qj6T4FFSsUmeX{fgkHlE89^*|O_OLiGR@mpR^dH6A zPjUih(oH@A&*%pC=5&q}0niEKu4eoN`mTADC(t~~ic@RW{Sn{j@Ps~_Z~0p>X5fs? zA%v+5|BWYU{T_Hs z{d8Wa9JWj8g&*D1sJ>i-c=n}*_dDpzdfAs<=K(FBG0z;u zI?JVSR(+{>RqY{bgs#6>;tl&7`?T8fg}k?!}NR=&p)giCzWLU-c%$RpE2jU$y` z`84vgyw(4s5N;mj4b!npCL+%zSZAH$)6#+d*B}?dC`FytIn`#Yn{sZ;d8ikC$a+ss zhYuMvJ`CNp0qr9_7(XbJzGW5vFyg86I|qtT=QARx=i#hsl2}9jKa6<^Y0Py9mRp0q z!d~(a&ea9BorkkukZ)1!4ZVVVvL9f7?!&vp3uh!Y9MS^yuI7df4?6-|Mj$`-3YGz9 z`}tD%qUW=Jtntx0duP!h0q~-9XJxKt)140JPV^CVXD#OSmM_je=jXUey~Z|txJd2& zkn`m;_2hujTp7>(bKFB&iun33A3T_Or8u?^>xL2+j0??Uz;pj}26&G{GkIyDH#F6( zOUY@9F-NX>a9uXVs0B^9R@aF;P9&bcpBeh-L)K557kje6=Oay=>7yXd#O-3dH^L^r z1W#;csBJD$WsXXG-9{Pkwd$L}`jFlPxW#xM3fx%dJk)K$O9z}2sB?`h=Qch^*xn`! z*5xQK_1!bhKv(w14X$Y?fs{^ac0(?!ohHw58~z zXS3z|9yFhRuC6tRoOblzWN~a3@=E_I=+YawZJ>=E?$LRXaJ50$PY6GbYnFF%nb0RX zuzunZneg{|LLVcqfL}BVK3Li{tT%d34Q(WAe35hw^Z2=P-cFve`^Mtg441>FM&CuV z$%jvqZjyhL?UW2S)P=8Cn6d-jdv>Hc7s~T-Tqk)1WhgH!OP-+)eFE=Q=)3RX`5xAO ztDj++WMhuxy=3DZ(5DJ1E^cV zQG7oVe814F`&)QgeEJe$;~d^n#ErvRD&^#p>l7@GAq?MzG|s<^(LN=|oFgU~H<|pd z_9)RtNHO3~-A3HD;0anCYjkei&b<(%%O=339$}m30Okq6cmeg(-o60OL8ct759h<) zDKp>C%zVR$FW|2QeCp~X{HiPN=*IU=;6d6fuUBvnK;&Mh)fi{v+s(9{lpT^veOIXL zV}Y@7AZTpa%*r-QiLjsQOgmt_q?6)_JAmg@K|1)hpKz?-4!UEnSh8`ENy|F4k8x}Z z?cxg&Z?~noY=GEyG37#^@~g(jH&KpuF3V9C*?(3U%4KAkuKHfF)yKUMR(-Uc`EJ4J z3FqhRFtB(0KY{V29R~J`|0ggWvBQw-%8GWe+JgC7Wl7fM{#A3M_cnIXW~mLHGrbEZ zize&~?DNLm9OL}^dVupy!1>VZn*@2bP2oj(wP5)G%d(fC%Zww?7g@Li47wy@A73`& zvzK1w=UNNr4wmiFxv%@#tVZnJn~J)*cdr^_&YiF`rB21(J)VR85aSj3M9WfhWa=Wt z^R&yXy?T-R@_V}bfpb5W|Dma?hJhDL&Am)#(%&q%0p+LzC63u@eIQ;rYp%$0pQDYv zDP!$PW0@A{XlqZ}pHN-k+iD9gsS?zf0FuF_^L0?$yVUxGdaFI9?ryrEx1Pu6n`f~{YVcc#a~={3-U zNwD0z7I6KHPzf^VZ*N&)g9_-2h z;+_PKTd?-QJg*?E#-C*41-!FwUc{4W(PISqqee91?3i2|pXh%RW5!{dP0qGg$+D6A z8g84@we|-X`$gSA{}$x4ul?~(t|KFz_r$xC%ktgGadm(rum*4@|7>~)d=jeW87kbR z0h#K!RTGuBmR#j81wHgV7x+)(92M&HpN}zw^ElAws3`M>R-k_JAKSSD?T~bPk90}{ z&!ifKNT*G*8c#(Z+*!x*2|nS+ksoIjaNm+6!1`IQtgraOaDBR2Ur_pxu@(S0$~Tg1 zu{{C3&=hm7q>5zVn zk|+CGa&$Rs9eXm?q2UXcYuNTYpo@PP($?WwPkvhF4LuII!TWyg%KXr`@J<=rh9~vE zjQ@OQ2%9zL{sg*=_WLR`&l7kmdCoA_;hpkDKjbffC(AOt2Jr>(Q5Ik>Tc78h>{>7U zIj{-6PJL57bQf(N%0BIt;ecH)*I{TY3^)DLDvj&eso<@8x$bS<$)M7>F6G6#6z48y zArE1uzz2GP=?C?3Jjfd4cYubN`^^0uI8ncp;vITnGW9<7uorrvUhav--61Ak)z?o7 z5I5rb66Pn=2kLG+RX6B~dxXp}VSpSH_Uk(b``yK!0Q>A9^bTpEyM4PK#2IYfyQ1v8 zH28Uj8Jn-hxCeXt^^so>)K+K*;KQ4n1o@<2|8KxEfV)9BpAI0so;p`c509rFb3DBQ z^sXv-0BaHHz>RQ+8xI05>HiL3)XTMcwn^b!FwD1`=i#|_Puf>IZy zzmaP|GlG;=@Gy>NjWPF^o#)R2?I_=N`IEkWw0Wy}7QP(#SodJi%z`S{Ukp|>c{;O`IcBoD~=zvqSO%=o|JNq%5Izk~N=@GZyx zU!i{Le`}7p4{2E2a=)~AL&N2Zf6N;BI=RDT1a`E%6Td(^=>$t_AwSqqs zKU~W-g~<8e+dKojKHbmrzjAE_{?9y|J)nQ^9Ke?8-i&bi9;82Prn7F9o)%8uiSz|# zx`y=lbIYFBWLAKmtobG9gw`0k6Eq-CV;}ui9evYg_U-Z6ie|X4RE{g8*G|BouY={c zpd8~yffpGj49+nhN4z=5+;3lJh`07)8;>|w*q?PG-duq=W1k%Av*rr6virsVM2%(e zVeUm6!sFOcPv}~dm3`L~IgUm0sI-@*J}+(Soqsg~k2fRnz*=vms2u5E4}FyleZ{%C z#3B2vh;ccG<0teMWwF>H#!YQ^E_(*{XikDS=g8EwukrjM_h`(B4cz3> zG7mwoPu3h_yc@WUZgKs8X(W~QJ)l8 zeh|k7++X03e*7`uE&6geUrV*=KKkN#$5eHS(#Pu|PvN+X?s34!4VwmcXjBXx3@FY8*s>5UJH=dhyBgEqpCbS28uk5nJ+M|uW#Iq>Y~$Sz;f0_fTX*llWT zv-^_N+OxIp%yHQ^2Goe;yomL*Dx9|yH%#^yV|>eo&iOfDVhpI!cVb_oJnyOY?MCA) z^Q7m6s0*4*yi9wyVFq9nL2p>HVc`-F#umzX6pZn`ghAQ1aB+umQF~3e?l2N?wm^TK z2^Z>83l42ag-;ipbK=0U^8&|n3kKUn{Wtc zZ`e7#rY&H^qU}F=2_sBfz==iM-vQ27qAlRWqU~#O;KZb@*(N(}4V0I(6@$Cc_MK~Z zwmnkbWFKY6rth|1(#C=ji@x9KC5$kAflDmxlW7GBs;PhHA07fj@{-u{N!n6gPShRf$aK4gW0GwE~t&IaGCT-0&*=hSM%6}!k zy*M^)=`-myZ2=<|ZP)h_MwqsM6N|P>;?N{6-vUl7+TIZdPE6XGZL-t$T9p4vw7o1g zZLd&tnS7@4S?UD9h(+7cy@U~_E#SnWZJMIV8F2~gTfm7$+x~Ij#H6j+COd6UVty2l zww5i&`BE10)x%b^?zY0b&)q54{nef5l4h{ccHsUD`HrzO{0==IfDQSml?L5ZW)DN2 za_wR8K)5V$#``4rgy>)4z9@-9BYZ7`ffIdfz(d|IW#L-~`%=_R@SlZr``STgj5SpY z?@a8Qw(t(Wn|Sj)h)gr_4u?&=!(reZE(^TzKIv~*TR|U2;Qaw?Z_8f>oYdV|Hd_8c zt;eV`JGpiv{0*{9S6eTKt9${AK~n}=4!F-kLm_{atzqwDh0dfBLDxfVDE{99b?TR zWUY^UKC^3m#Crc1;(D<@65{$uqs-gm`iQLSpsgP3{ZBFKfzK#38uT86AI{Mo`z-0v z?RTHEBV#J|p3l-A+y1F@Q-(_up~P(Et9cZ26NcFrMdVA+m^>K{gDzJ1XYe!Q9CIq~ zc-V;FV%&dv6iP7w(Tx5yNs*-+1THRJoKT^$5T2&K)-ag-GWofITzN(GyCPW zHenAB@Tw8d;x29CcT0cFU(`HI#{XzW=xd-u1+2#Lv)Eh0I7ew)F zEcx4ka?$dU8bdyyqmBxkcfJ8UFXu5aWSM&EWP!=Qb1()#ZX4%C%ASY;+ujbz`zXtM zfP699bQJLIIww|}EEo>dza&QcK9DdX_hGP2R{zv-p6tms?@H_E_hMeR5B$cvr!GTT z`ty2|_d+wTq#f=QqrBSND#TQtcZtw5uST`cs;5xi2fC;FX9b%3_5|U64ZoiDj_})k zZTNQI3Hj|l?ti5}*=bZwSLZzj@uBao zYkg!m>WsxVxn_}hr_;5y{9U|M5{?B5u2VZkClz6)5U zyoF(15d)T;Pl(rLpko*Zb4n{2d9n~%L4FG`LI4)jCA^aKE(SYc<26_ zkI)ZU2|O#7W@w1N9(Y#az80)YVtqKx!1{2+Ia?R*o5}t7!OiKKORgc4SIAez)N%4% zegA`dc(}Ki=l1B|CjQcH0{lY29*6s5nSLw6xc3k|gZhPUb1uRmXU zux^$|`!)|lcpUajn0t*Y?fdj`*T8(PS+VZd;cKwglTO{1hx2Us&e4GBLF$q;)Xj0V zeTjyB$PVmBj(sQclNg_>alRR6*jwCt_zgAA50m{ZpLcGfe~~h3ou_I8-){%KNsnr* z8RwiWYLCO8Uj49V@+9)#I3 zw}@{pfPc8R^lZ?tOsji8_nf--^`-|l^IlU|NB+Uwk008c2pD(YT^5|J4K&K{&JDhe zHS%$5a)Mm5=KaF;*mu+pT5WKmEXqGRKpdE&4d1AzW4|ll;(q2A?iz&s)mlbNxi01( zd7u>M8+9YsDRw2H{5nTQ3qF>H_!YrN9f)(OxI{DV2==DvgYg|Vmd71aEMF$~WAVI~ za0A8*-*Jiggj0_1VG<7Un$_7^n}aqHr_uey0onfaq)h>de`&BT#S=Ogw5$j1NGDy4 z-sl2t?p|9Kya?e<+L%v^Pj$}6y4Bnk+_6`#CB8cw>8x|Ame|sQ`#z62AKhN6>7!X@ zoq4w{){y*6Z^E~f>c1Q?VI=Z5JI5HhiHn}@+7y7UBmI|v{>QNf!v3TEodem+>=4I( z0h_>u{$scqwgk>Ly4iO+`b0yYP|rR&19v6LJzvSj9e{)VORyUv?~6XYC=cIlf_}jL zj^s&>Th{MP-+<+P-7$HyD%n3R4sRZxX5-DFkRMySK1F+HJ)R#t{&Nu+hPIWPyjc$3 zyvgLv;h^t9lQ%Cxn=-(gJa-U}H>s~?gGP6koBUa>_%r7meN);(jH@;tJq4a=b|`*0 z(q9~ysHK8OGmO!IUob$taN$|x(cvwL_~zmf>?z4zQyM%CJ`I3RGtj4n&fzVi!DlM% zf#4DFDlP?<@sh7)nFoToh*$hNT=BIDi#$tsm`Aw*?}fKe4`FU3Pn%`Qx4BV#D`}IS zA^BFd%M&2)^6W-`@NXlY*0}smKE?<$o_tLjhxz(}vfyHquh*aGC10aVJig}lvZDEV zyUEwPq5ER-_3vza%{J%2F7L+Mi2n!LW%2fNfTei5=kKLje9h;7%-gt8or2LRU+A zrKd`sp9DGl6ZoCu`>{MVw$oO%&Mr+yzbF~texnS-Wy%2KX~)q9t%9zkJg`qTIJ)%w zW2QW0xAjsUdeHN+QY%zayFq`$esj)3)bb z-GlIJMqDCv^uYDsoW${HO!m9m2ZNV?iRU`l5zp^@;{9K0i5tr?7I7?WfvrM)_BqC- z=P@pg&Hm%|qviJmhd729|1Q5ccnEy=9rX1*u%ibe-ybms{u|@*evHRwInLVn@AN@N z4aVcMA6ODR8|5+`&X(spI_Ll4%g$Zj1JB%r@w^jbDGn9QKWojB;AhSu#uMPV&%moY z5Rbb=5WhJ1FW3nG29GlDY#FyCcrW;m`8i%A{|gra2FuKb{l+r?1`OPHR~rMTP4F4X z@%eGkTAg9zK0;Qo>MY2Yb-dvX=}Vb^mrLU-al4gCoH)9@O`QI4}X z{8g))wwVjI*(5CudSN*3&Jb?cYA-wo+ia?q+5$nH|0(3NU`<)D-Ra`J_PeH#&iH=r zJCON;H4g@xLFZi1nfXV{xUyg=;4?qzjQlUm034PX4PC%8xqyNFJhd*m5y zbJB-zDns9ALB4lGzFpvPC9mnmE0A;QR{QvMHDu2kzv|HTXq$j@fZo_@gcEN}%L0t( zG0n1rEnDMiQxDIEEv#(GoFHv+j@{L;$H4Q)J^_z?qfOm0dJ^s89$n5|zKVUuajd8L zJ?C`XXJhSi@p{!f{TA#enmo)KvY!>X0dcYR|61P%tm7V}x@7+!KJDCQ-M4%d@Rsuo z+|eM;#octcZ`r<=6#GNx`p{3WVJ|7~hdB@ROE`_m{(QhI8SV`=VecFL1!edq64%Rl z7K8Hi0?M(kl@B7rn1s4&7kxcY3jU*>xAu~9&#Jg{Q-dex7p+B$f8Xl6?q99hiyv#) z`HP>odI!AGs$oy$7SyZeNJ&N|-m6DF5SWenx##a4oXxJkkasTP4jTAy99iuR`Iw_7 z;8_bC7@v;1?R!#Voe7C|pELJk3`U*wJJ|1Vjz@3n`(!M4(xdt-1N)*1Myj(p@yc2I zwCg!HT;mO$i?OX5ZKN+E*R)IOBE=fFJi!%ls$kyWqLTG-DXYO+0h( zdwONrP*>SOX4!OEHraR^y3_Z~A32&dPEhyd^(h9_f;wd(k#YcbojAU|;I%x2e6@9`Iw0$*9UmuDyZWtR#6X^CzJv-fxvG44}HM?HT)e<*l zX_<#od~FTl%Pn&~b6;9M2)Z*I-u&WnjtAlJ@|TwLTueCpwU?Ij9PP8Hhx|ARIEZN* z8nUq0x#;mfw0bW2thM+Tkn@4hwiXYpYt^bcT7QVVJfBY@I_oxxr_v++%&+Gn%_ z8>C$0UK7B1K$cH3&LW=ZH=gBRg}AEk-XBFap>~oRy5nZD6Eb!h5e7UFXPQc-~0e_CT6h9As zS@>OpU*|sOf%dC;7h@v)R0H8790VWXVC)+|3wIjCag7#9UV=sUlHypSxFAqL%DH}!R zm{6Y|`o#QBM)NZod{EReDaKrsJ^9RxK=Ux1z4~xw;ES2+KJR+i0G1!51^LQho3dr1E{?B}O}OD)b719z^ap~E_E-J~D-DKeI4#f*Y4Dj@Y431eW|n&!bG?jn zy3#)7T+B>6LSIL6SDN&}nQ1PjrFW%`rr*L$qt7GbT+mbEskh9A-QJ8e*O~`{v*^DY zrOHj!^p>Iot6XW=PX~XfS(cm(lYRW?gidZu0|h% zzEK}fyMbqCh8u^!mmm0O+qA$ZV?CjNn);G_b}wKA(GOohzkdH{=gXU56F3=W`lyS3d5VI00HDVUPB4v_r~;C)vNO*|PER{SxpPZHa;pAKH8)Xv+QE zH-YXif>#Qi-qs{-J7g}yXhmDt-iyrqjQc0zR&;dkng{+~fw=%-BxB8x<=keuk7PNw zaURO4aU#R`E8=c~KVvQC3xxyoT2DbH>cB7bOH2U|pN3xGeYDh1#o*`DpbPJ>>2&BV zzH{gc=ba=O#*cCL>M6|k`VSTJIqns~rl-C426S|(DaR8augPM<#_BI;94uQ~8r(SY zz3qjX>(eao#J6#tiu$7zeJ<9l3ibnDmLLCRz>so>zH5h$d+mz>6HhuP7}dD@Gg(WC zfHzf3{L}~g+k$f(`7Jol+TeVO_zd`G-vJ-6P59Q6QMNWG$Z~0G#s@hs(@nocDeU@v z$OoT#1L-=e0=`)E%@OR?{W@r*=#yf+2biZoo5=$(N5UKk>zDJJ0eh+wd=L3-29Jp~ zYl165o8KcZbt`$3cWFIfqtg^grzzof%{J-O2s&L6MW=^hSGMRBu)(?22B!+~lR^U~Dq44kp~271Hrwf!Vxu4DLZsiX+0%Xj)uV}0~E)<=WpJ#w^-qzwi=-sT)&)M0&A zju*J2M#Ff~i1>w9sd26ydF!!WuP;>R^KjaBely4ATd=Oru@ZW{ZKR<59z6wlJcThs zhaTYm5cf{scFmN zmu`$lU(pU92snh1l?Yg))Om|ltS?{lH;v@?*wf(4NHsn}**263jiLU;{XfXFVP0M+ z2j5Q5)P}WS|HJ&#m%}H3`?{#Rt1<7!SsZ^G=r9X+J~7RMv60_ye+P6a_z>$Z6`sj= zk9d2#ON`k#8a|>yYs!Q7Ap8sMqEG8kek1h!Z1{k3vCc%E;k+GV{M^s5#uAuZruK;<{C{nJ0OpH00ZNTpXpp(zxM?(e zQnTTcdKYyMDk~4(tqn2;mW>V;K-Z_Q$qg1jE+OCk0_eAwz?)Bl4m^9w@8|t8*tv}| zMc>vbwDIKi>aNOm+*L`Nl6}W~ZJ1Z^?#?GrmgC4{@|k38#1r}oY1EC%M*k4`J_4OS zM!ru#f3BH7g?p}<=W|(ZxZwpIR-3R^n6Q@N*|GLo@a;9=->bpLv%$}^ATtHnchxlx zVLYi3Sz~yXAK&Ac=x;!|+tIFSp6gtn6PAzXbR|1`(KeZ;T@+4x%aom8S!sK^(k!{E z4X2F`m%Gb^i3{5m%=H(C)1K?E>U$1pI3sne3HL)bR`|BlXJ+kfr~)sGtSkKwV_d=- zZ1{UzRyx{NDXN5@cDOxV157IqWl`MNZU0jxze_Lede0^PC7_9v*_}fp_EvdVKhg=? zj+d;r(doZEs$Q#3nVvPkKR+s61U;M4kBS!FNnu)8^eqX~X<|6-Ig|GIZi`973E{L) zOd8%8P8%OiyKsP_?{(p{ap5$p+{|#=<=xUKJCYCfbm`Cwan6(amG_Y;9{F0hoW%!U zv(ol-rQKz=VT_fw{<3hnPvDOrO!~fCrDp7$^3}8Yk`tZ&5dIxw31V;CrlbVjO%3)LRl4%yGg=)Vi|0 zfn3KxlAD(ZmIIFHTp{l*%r||dw z824cc+qgpeGM-PD`yMD0%zxV7b#Ex`b2Z<08~=c7ml?rz{-TD~$^R6Y*# zeccEm|0;yX_Y<{~px@G<`(zv6%)|G_OXZz>4{ii}*gc1V{{rN9&&M}Yus2^-M-R$;-ff51`$uZ<37r@y`AuobN&(^0~yMi?v_xblQ(e#$6_ie}~%;c}L#q zMQ>I&qb=1|A6^iL?%pYqm#jW~#_Yp>xL-XMy+6R-=Vr7c^3Ly6V>Q-tsPl?|?;oKz zGQ)R%r-koSSz^n>`L#TkTX%u~n;38Z6Pk~aG{C*5k_L+AFYWE3`6gLGBg`Buw;dLyIzP|f%EONpbvAg zzuh%hguKX8YVqd9@p$vf2;MBQcoVvD8fao4o7S25;hr+ccGrE1_g$&Q{64jXA7vSP z1#4G=M-W$&{O#$GFSn5?`#4GV_3Q9o@jI4CKdSE>=jVL|oUe1;<~@gRJIkd$Iz2QL zWv~waLbjE+sVnaxVP zJo$%vs7@~$fbu%#oi5BjahLMif%sOm!=I#kLi17A)*sIZ9ULHPsT*stkGK{-aEzOC zx$cL3v~wSXuWHxB!cQOgA>=-n!(&&TW?eY7E}x z{#W=En2$aS`YY-sz1)TycnVES++gY`tL_oV^G(#tI=4f|-fYVH!|+4>06ME+Uiwpw z75k<%RlG6faK)Qbv`4k)h0Ay4uD!y)0&DlhUvy&cCFZK8UL#!YuOr+76Yjr2AH{p! z_oRVt(l^X+Tb*9i5A^E~`V9d6bkGlXQs+m~Z-q%e`f1wWo3Yamci(Mo8|4YT3g2u2 z`j6l4Oos30KFo&??Zw=x;#&dN2kQdO75HBC2U=jU$xG#YK4Z~M?OP%3)|j+=6Hhzs zta{nTE6qB82-;0F$EQ5dF0DfNw}E~eQqnhR>(Ot3|2M36l4g6NXhwKkt0cT!6CTge zD4NXzEeb%BnV`)K_%iUF@CtQDGw%$HcVD2%b2a3-FwL+|)%Kyh^C!%6gIOQ$xPBG= z*_~#%-^#fzkcxdX%{X^)3c5ejq}jQAmT)g6d990P7nw9$9ZfT{UbgWlGy^<~X8&u#>!Mi!Xf_ixn*o|l2hFAhtULdp2ao27@&22@v$5_Xq0XXR z9oB!47sORs`tJkGQ>mZO@mp>BZ+{&9S4sWXfHF4yhkF7e_1`-ZrrUVToR1RzIFpY5 zBhylhU&&{(v0FZ4>OXw1y359g9lBrlUKKG;So&`|zD-yEh17pFJ?OtmQ~%)`nWO!Q zz{k{o*l#cOUu8D*UjpK(|FC{pnI~NG%#MBh;knX(T%l}Cj*Zsb<`Cj6ev>``wE4?P zmMx0!N|-dU=03Zw=(t@qd&_Ec%u_^ZY49!JEqMs@jv|bqd#x~diealg zzn;?7o(indy@C23DN6OfiRVu}ss0(z`EQNG{gRMRpWLgi&bV3a3YWq6PGy<8RR2Se zgLrwT0p25k_uQG_`O^H;iNiEc$iiV1*7xGU#dse#O|~g3&1_SeAO5(wc`f`V^?=_K zQRTazby9X3#;yrvuv>CEya%z~-7*^bI8ih=WNL{&zY{h{PH5d`#_N05<$o0k=?(w>@sdHQXr)v*VhaZOSdIP+`x$Nh#19hJ`=1LF;a$eYg zGeFa~=%IB7-y5L?V86S+0U92H?ybXkUX0&3;FRM|-t>VZsl_1*PM5$h{}aG%0-SXi zC%CWMk_UdnoA>sZA)m*aAMh;OaoG5@HF}~)0@kx*(c?ZzkCc|w zJ>TCB;jV4Oy3bJ1q8VqLELyAwew^DF7A@|yXpt{zanhv4O`ydo&>{#rtif*;X)z>a zQzvQREI9oPXt5V?xn|0H5NTtRCiF#e3~Xz(_L!@5jyHFkwE0v%Q)AA7EgHqr^P~;u zy*<%pS{&Ngc?ElmYeOZtgYQz$Zda*ijgEDFebqyowZSQyMz}mLP6B@9m*N;S$^}2= z^wW)Kp7}Fqv>Lyapp!mC@yua|qSH?#ow!bddzx)@qW@*^3b9q%fN~v$XAhH&Y?Dq^ z@<|@*`u>h(>ynS8tolq{l4a_jt(aS(5909{&rF^GpV8;VHj;?Q!NcCQP5b#0XX6y@#{w3W8*5JkrWM~-VRmfiSd>#Q3;Zq*-}^%VA< zZprB=*hCpj#hu5L!JEN%X**_w(kq02JLvf`=?S>a<@!^ZPIt=)@ZLV~UUUD{O^(kW z1pjf*SccI)S=+iJ%zw$o{4oEibl%hXF7P04s`*}8kNhWfn@P*qyqF+qXvu0k8phLI z-?z!?L`!#xRR4v*yZK)ahUN81;7ob_4caGl*ECCBr^S@lM$l|Me&Z>xXH#C?VcoSC za9=d(#68v6!&+1FqdeTjjPE@}(1x-Zo9F&pbU8ncPPcd~1-up3=~Zd|#t)#=ZF=l_ z;7k5pZP6u4kNr7@P7l*%P%3nK7hMhm?qZWJrYu@Tm@vSx_`2itx6lcrse0lVM< z=@(8gZU7A_N7T8(IrR|lYD~WXzIU&>Q~3(q1DU-f<0%L9Ki8{YK^vLB5%%rm{-RbF z!`^j?qp(L@Em;G-uT{aXrVsw>cIvJZQDdf62lYDZaiNaUutjERxf>fDF5JWD+Vp+M zCuQ>)*f~1!=$HIdrqEkPAk6qIJUJHZ1Rk_A`2G~$xyO|6KgK)tT^Em1W@Dc}x5iYC z8T|bxJUcCpyxMs-EU%4e{CYTG1ee%;ts1Lz~P-&_l{B;Kr2MV-Fqt zdN;bHOS%j)>5}r_rb`^Yux!y}*rMZ=F2fu&-G49WQhoAU;qmS7z?Wlae?^mHu9epK zmM6!zmrdEa5%c+7ut%#fwuNnTJ!RADHrsqJ;GUkS_=0+z;o}ICAN~UP^!M6*yOv!1 zC;adTy;}ybav+;JSm@yL%vBf6F359$7se~*;=g=SlyU|V~hdqwcMYVFySkCyxMO&VOQXz>4u+)s(5%l;C4Czy0O%cM)% zf155}Megg;{7XTXYMcG`0q~{V>xw4FTv7I0k8(dKO6~!-eS%Hy5k7%1<^FxZk0^O-ZlGk;7|nLl4XCRtn#%xBk%mQV8psVZhJ3b(9dVViFJS62Ef5thcn_r|DXjY z*8Oq!#erj|FZW$oFxV#2a0J%NdDrY+C|?I3aBuFKl`zJ~rtSP*(#3)ii?;c_gb}7K zaEV3R%i_=^npeWK1)Ny4&5Q#lCT#&Dnzlnw{wvXTa%|dmK;C-Iw}26gwx9J9MwqsM z6N|R*1I}0CTfm7$+xj?gV$#-Zlbvs0MftBpTYNtz*8S7Z^^z`rs1vEZDL7%?Wruz<%;N z5#W0)*fIMM^e0{HeRyo+$%8 z!eP|E0rk7E&mr>y5y1MlwPqB)qiiVfv9B3L*aw~={v@Q^?SsyJ-M^n`$CY<>+Hnns zO-Sa-Aia~yGvyx-5hCUyX2%r&t}YfbEZS*GhQ zHHn*97x#gD4?JzPS=u>u!~BO(rl&R+(3Ua3!`nOn=M4Vvc*6>O)BX78e`q~8xUp4! zUk~%Y&H-X~QO zIbvB6;;=4?_1%7QT~x#VJbr6MYiw`eeH(he%%S`iOC!!nWMA`G!}{lc(W?16S`U8y zc*BCa)ZVvA zW}Zv&q~Be%NC7{7O6 zzZ}nf!9VsT_yylS-nAC{D!4Xu8e!%Q;u(Zrtx*&?bW(v3zNq*Iy2tR=`(5 z`2Ux@caM*%y88dmWI!h2B9QwkXrK8u}^i8p77ll^yG};^LmOed8!WI*I0hkmrU-F zX9lm~qa*jg+r8vjaNx78x4)?KP}%OMO#ON889aAZTVBtH*Damqxna`p1kV2rIjw@D zivNo3HU(Oc-Aeve)3clnqM<2XU6Xj8FaM)p(ViyO(+wkv8uQ`581+2P@A_cDeHU@Q z@*pxqe{w{44ZPWV9!u&Tj^}qE_Q3#s-24ByLa*~ zf3<_)^O|^fYcq9*0tNTse{hy!#K`YNczBoZ;zJ(~N;^Q>+sKjqh97g?7my#~!4G?G zas}(;a{10@ijG3=KPLrpOd9@~rTAqk?M2eM>jT?ki!<;o3L?)3A6|x41~d)`84-LyXC`Y#|}(D4{ z&RU+%a~AOi<`Zwg#4s{38HwqJA6fIbjP0RHVgTU>*?~V>KJOh{h&!MsXR5yie40~c zK=U)$!~G@C^MUKLqn!=f!)Pb(I?~G8OCwSG{)17@hFanSd^?x(^7sU6Zv`h&6GKh$ z0p4T$qQnO%<_x30-$;A_CR6YGb+MD&6e~V}_igvc zo^P4@ruYEfx2&XZ6~qoGR(t^O+e9y>oa#iLZ75cJ0Pov;;wk#=nK*Iy5$K!xafxCc z7+7p9PxU1W9MBgNhtaQNBJoH3I&@YuHBQ`TO`L$@#uXE*qZPz_Jnoa>=zV{h77gcy z8rR|fsd#W_GsiU5KYz-)`WH@VA2RrXruzRqrF~M}sRyr`AKh847!-;(TjZWjzK&_| zKJ%tI|5Wcp*0V2m@TwuvcHVb##(6FO#S^0qt(CYVc}jLEZMf2?Py6jN7(eF~=koUY z-~;Uw>P~Hk9?aNoDvg}Pw~kric*EZA*7omIKhQoTK%Pyfwr7(MUEp)nQ`kZozN;_1*_|fFSF!s`z z=6(GR6>miHWEa1~;kC~wURV;Zb-*_XUfY6yipOL3qt__*na^Y8@RNLIi^`lx`uKtmVv=JA=n%}?+IG1K6)5|7XH?UDo^TyOZS#N#u4GciL9FI{irF(&buV!9>snff9= zqc0C#98lU$0Y(Y4>=QBqn_^k2;_+kjO{2gd{9JHKoV}*5( z%ZMJhyc!)L$DO0~Iea8pt@Cp~Io|#c54qXI<5|c5o%#-+i66%?c1!DK$H()$`R3X2 zTIBtEi>spTjJM$>?97YRE<6*V?l61C)8UyMcxH^wcCa>@49}Ej7c>@Mm=T?{w|m34 z`{9Q(JbIVEZ4W=#`@mkN{@LF5*9|}9xyxx!?OJ{~bc_)3L-M+RHFNV==E!6_c=C76 zYwY1*r;vTQ@BIPI;Ka$C-Ro|*Ti>@jK7NfYPRp>!WMEXjP-SVav(856XZ>UL_f!w> z_hk}Get>(X6~9jWnjb=^P@SCZ(0W#LGP)7I*ZIcZ|5omujzdRlSWmscex7{#e|I9f z-doZW-?MTQo12Qud%na2y=qk)@%Bf67(nlHQjb|jy!_S%qqyxWtH z8I1MG8tWrV8i{QaFIewHh()rmlC_l9!Ty-49?_oa`Mg(8r#GfQ0#3nuhk0sjwa&CY z1L^K5{%_!`G7Y}2OTpJ>_C{-wOa0-ijr;@QtNg!&ue=m|E%5L)?=bP@uUDYSZO*9P zw2RKi9#d)L?&mEHL!;c&Q5CPJZsiXx?@hxW0{5KJPEV^@X>eacd&#u=dEp*;)F1Az zBL6_R-^abZ;)nl~R{!bMYpoSK;EgMh!R>}e z6eAFO%tw*YUb^=4#2>m_A$cuA-H|eQOlLP@iwCogI0F4(2s$Fxrp{-a z=__kLsNNCU`OVup@Ldlbv*WH>?k@1pcdllw+%P)35qn>BjFY>k)H&zfO{^P*3#}0c zAvZ$6g`I1v>?FBrH#ps`B@R(GaaB|6ZeUJItuKr%F1fz_^w%MViRKp8-V3EmCfm1s zpVt0-R_{#e<4pQE$(fmeLvdWx$56O4e;Qcr`K&zmbTcOT?mV844R)rz8=UFkp{Q^B;Mi}wj<&R3 z^xM9k|J@n3ZHM)-+K!pFE)$ibwSCv~vyj+#ISM z@o3lOLCy~i;v7+WUNy3~sWfu>U+fzGtLQ4y+49AgjE!s=tar`56LlW#2_L$v;1T}Y zdkRk5@$`sLY#Y~4>+JKj z#zXfnATCfoV>s7~(>ISeeKP|^#EC0(i}7`iN;eG@H=c4~IGVldx*g#_cB5<*chL{g zUWjic7cw?SGd6r{=i70Njn;oZMz=hl*lFdg11^I8#{>%Y%qP~?)7&)?M`x~JZCi-` zKMVWMN@(=yZ(M8cswh+}WYTuCK2zE*#kwRebC`nF`E(eM1V*x`=5Qx$l&sgM^B*wj@anh1-G~bMSz8Uv>&>O1i0+F-f3p@TLjoC~5@y|Eoe;;@8NX8uv zK8qRuxry;FOpL$oY|!}IJ0J?Z@hASGVjeR7i-U#U_;V*jV*DweH2$hXdc{ddpGb}-tOzK z?AtLlXXtmR*hLy!&Et0t9%uD5GiEtX-+NrJkG_4J z6CLoL3)W+QWj;`!9;Z*D0gdM}FGgGHJwp?jL(E++Dfe8+t~ZmrT%Kk;%dqPy2H&q4 z!>x8sjcjEONpIUJFn3>QoL`kq#06m+b^k@;J{aQQ z`}bcgdHX-V|Kb>6N{yYr!lUUajKA)`;4IJ7e zul&v9mA#(4JRDwW^mt{ZcQ2QC<>Y0(d8L!s3dy{}Mr&(2nW}qY#4E?j-tW`2cV~wvnmxV!%tCv2IENp`2KI|MNeMEYPKTov}-E^vSk7T~>2R~Jm~Y?F81=w9HsBfA!e>I->->f>YL^$@7r$ijQ0(CGwTt*-mJv8 z+88=*t9ZIp?KAi8A=b{nd&gZRb)?FE#Z=YYr~7|=*s{=leb@$?`;zs$nO}sbrP~dy zJ9XN=A=5PHoy1%q9Q!)mO7;P6^7!U1zG=V@ct7P*tl;TdZUoH-nF2R4v#lzvBq29ce<;`0@|M+tkG2I)p59|KE5?B1wpm{5ae~g}H zc);%8iGR%g9Xz7_E);Z+4%vs(H;;ex&CEHbthu|W7ysict`ol52dROz&~$7KR*9FLY&VUC_hZp9<6Z7DWx!5W`fvut^hH;OsHfVd- zQu%2NXODRVd(B5ub|m~W3g47Lkq!7*#ITcf!4HbJXYQ}{bjaP@4Z*!+?q#e|bVtNT zJsxQPSSVV)?$#G~-IOU+%>b@1tGsogXq`kWabirN0vWXRe@NG^Y z^S+pXEVkwBqAqcUqHNM=o{1i=%g8n3Rq<4dWp4Ok?vsDf8Gm_AsXkM$g&VHhK`a=(%QXl1a8%(_OB&w z&ZF-SnI;%&iOb)B-A?wnin1NO?VGZpjmmB;M!z&RG}T30=Tn#Zi#&hm+vskx>G`;u z0`A@ecZ)KeR>djD=cPqHFFCZ`19y@8I(1mMi`?DY1b4Cfa4)z^jJ;+7`TV+%_UgWl z^T%%|jmcEMlmobq|UpP5Hyw&77TBsv=OqO6bP@V4( z7hm}rx-H(G9{aa6IK%GrB_C(>1Dp*{!kKIY!kM-8h2y)Wx4?r}ndjW-OGnO&zVexH z{8C~^wJ&0Cob(O&w!DAc0(jy~c;nOX$fxkb_++$eDSjCBx^pGzu2*pG5Xa!v3DzeQ zpAPob3nQ=aym`|J5$VS!t)|STedSaW^Jt)R=;FP1;k|><*?aJx@F;&0?Q4G#T$#Ow z6dpJhd#dh}@p<5M^x^9=oN3~R`*^<_`qn)NVa}h+hk1$Nk33iB(f>@n;y3Lxf6^NZ ze2NTz5YO%`wYS9B^0hbB*KX2v`BTPc(#RJNANP3pNVjj47sBV2HXo%Av5dU?WD^z- zYVG+o@V_bOOg8ou{0uHbr>P}h`5>qDQO{?vAdvri`3(N%811X%?YWP>zfAem^X@%9 zgZXzaF+PLD^VR&04^p#uDv)=d=%X3>kS(D*qhQa@Cx77iEatjzzGZQ3+VAS#a1QoI z?Pt6~9d{(1O-qgg=*w9Dc{u(5DfI65e=7ZVlKOu?@TvV;=ELS=iP?+KB)TwHGv)0$ zj(#_f4mCQ1Rh$KMDAM*!}E#ju|^$7`Tw>xo3u>{u)t! zkz4UO{OUr-_^l-S-L9^Xzog?!i+_KXcjp1VqualM zFVnojOm{2$6`@g?jYH4ImxevlaBgO!{F(xlP6Sw1X}$VW;4m~tKjD|0a%AjN_z7hN z0}A^+EedqDWf}w_k82B*rnJ4 zI)cMo?JEyQ2a5ClguXN0d%p1{@B46fx5~4x5f2Wx}@pks93LuiloVwJA7 zLnC`8Jh$s!7VRq}{OyYCPW}GpoahfO3PkV1hx(4TDvj-`s?suZe~0GoGr?;I@%ozO z>-U{XeDItH+Vk;SVvW%r#9tF0Y9h89enzXxHkC5hJCWIcvUWGMQ*)E^Kut#7sph*^ z?b%F_p7s5&v)!LF2WkJV19);P zok)=rh&+dH)}!QA4Azs;d3N$md*ibIub`i?i*@GD#wNQ0-?y?s&a_Y$eiPiMvTWR@ zyXNCppu1b%MiX7i!--*ZnhlNe!CAkXfgBI?i)X+Sr%N@ypU)=44=4 zeUHw9^!4lbclR>;;KM14{2&P*mkx-JvOf5jlY)ur^Ux)=mXh8sK6y7bWSZ!22kWT2cz>IAx3c!BO{{&M>!runnzc_}V+neEt^5aa z^Nb!}49wDfMB^73J;;eaiQE({KY>nud0@!2UHornjc_A4JAhvA^ZPrCPG`L4qqlRH zPqp;+ly$Ip8NEF=-sB*tY*RS8f*~rE`&(A~e#b+azyfHeKF`7~DM6}*Av7Xb) zp+l@6wC@^JoZ|HN{i*M_C(GlSvdA?_eLvmnd&fBBaT)#%$@2InZ03^3eDmcodjzXv z(2eBr1aN??PRL^6V4{bE3J(Vb*OtbTKi3^(>hAGR^UtU!j{!8{`u$Z|KQ_o>>TFVMkTh`s@T*-Fs+=8H zjNcae?*FgDFY>4U|9SR%GymUN^lR)5#1y`cGr#bV^$8EK_7_j*xYu~|s`yuaUhXOWO$JE7riC!IQSM495et)gz z*QGItEe>FFOpO`P6Q5FadkJ-DUQj(3^KScO<&I$2+2uD!_nc>3WZKMk&*OQ3HN;g~ zN04ttnO{$?I}zNguhYqsLwVUir3)(GIKC;(>ODPU8(YlzbLM8z&%q;)iuJ{}h4Cor zw6fIV`G{V4&T}Uj_t;IaO*+3vHvOTLINlrEYh->Lw0=^VM_{Vzz@z23j~%IUkayfXe6|8-u% zyu6!uzGvz!a3A7bcBnk`w*WEHUt(^V3rw;_Sw6LQ6KY@Sr`TOBY{l++ z%9*xKt&HEqdo5=^0>}#WYbkZyLRu;NwiBiP7I4djTSNUa!&j!XE z_XhrRt{GjFdtO!NjM?;)JA1)_UsiC{lTUbD&a+%N-+5f*z4e2mUE}ZE9Y~{#WijGI@6<<*n|WSG20}5w36JU2R`Xo0k8J-7oO2el>XGBD?G- zNz<5I#8Wm;^Nlf(tzAAhbG+}LgpdN_p-HLT6TN<9vLb zi@76`GyK%GpID!=^OjZVd@VA_$e056^9Ig5cP8Z}>!j%vH8lM31 z5H;?iu`wae$OwPSkBRIDpY7oDe0VgIZ^~Q7n3OdIB4c@0wFe@v0GoJ6XQ2KCjFPeE zcs%XP;R4FaHhYSJtH7Pf^IYr}f@Kiznw#{VF`RSOz|m&%`|{fQ@ARh&tK8eXxd`!>u&$)wJ4_8zvu#QjK?K}VJPax~Zd9}liSkXK_RA3R@PKgu^Vere)P^qsGC zR;p)S`~~${+1N8LCd;A3Ty>ao2wcQHS;YKpWl@2ZMXN#s$f67AgJ@m!Dp~Y1;Ij0Y z?Yg{cA546pbjg7P%|nZ;NE6LRc_#Q9IrM%0C-}q2p%V97Ufv(`w0ufp($4SV6cIZ}qF>fD+EEq!@k_CS|3|Wxl z;YT!g5$#%jDsUz1Bo~$>_2+ZE`*;WhEbo7UG~uX*XR>V8dRcx&v%K%0=Ob>h7_Jk`qMx}DKcc(7@xm$ z-3L5aAE%sfn=C_q$~UF?>lW?F0FPb&Y(Y;gcH-|W8ibBb{Dtd|K*tVvI(CkDac}7C z*(OF)KK{-D)>h?%?71|ZoowQqQM2UwW;@sI*Sr|)J=a}8`wbc48JvZ@VhMhGrp`ID z$&PWfr0Ht4ka@Lkald`FO1^2vwq5&m2F@{PPQ z@YQ+nwSN@&@(p~?82IuHd^b_Xo)bNdahrqfZFV%q{nFiA?6~@89?hBDa42$92Kx}) z?^2d@zsrx%gEfyGPTt$RyxsLZ_q$v&((qZ7KJWEoSxtccl4ErxuN9?p`Z(3vubjN* zKWjbR=Q7^^|4IA5)c+5y=zA4?Hu<508t7ml^4k1|K9lc*89lZqzKr=!`4H`e$~c3D z?eRkDQ5>4L%K|z6cXRir_x<+hrgXL4LEd4wE4Z$PXo_*tcd<%&`i8GLaJtx3>8FsrM z&!zWP#qU4bmk-(Q4dk_JKD&+)|36Is`-5jS_)Z7UvLtvmdhj^Fa~bKrd{NzIy?1W! zb$f@g19P`I@Kpfw*fcO}5AHv9PM8+g^7rNYTtXwa@(u+N>M{Yl~0##&QsqSfk; z+V!}#vZup^JAjrJJLr?{Xd}o+-h)dboAVW4dZzFl=simunX#pLY_Ou(!1M% z9ae2CO}ew>pzP1{$WNWCoG(_!zwE&pAg+hXe;Hg!zHNKm?k6jD(irmVOsm$b-@`vx zvTUI7obKU8LBnrO*0vr-)6YIr3{BJ_OIBqE*V55-2Ks?r3x5LGeH|tM%n5l553Pa5477_747| zhsG~D(#A!KPt=&^xKDy#s}pA%J;bN^Qha0D$2pN(3_c3n4dhE5qjxW^iu&Uudstsv zn4zC-;_>eT-=7okVe9l_42xF(@}l6gwDfV{Q-8M__{4*`hVBdx0#B{MUyohOw`uhk zYs#Jxmp_s9CDOe9QqYNfk$UzA!_l4a%SLdibHTDf=sfZ((D%P+cRw^j3?AsAz&+Nq z+uMHcpPABqmR*-0f!|^JJ1rGo?``hZIEZgkjCIJnz#@M1*7)0e{j0bi{R+4@v z2hoq{gYYGIrPp*ZHopEazz+K5+Jyeu*z0 zJIdl+>sC)TZwpl(XY5b;#KhzrwdCoxP?=3roXiUDSjZ%nK}`NWCL ztYBY6d6(F{%h0zJV{<3-hV;6z{1@DRq^)*zD%EY;{Y+50#x@gcbBhx>$Fn_{y3h&Q z(Fp>>m>=OM!RUaOWWBJN`g-)jeD|~JoAT66js%ErBwNK=@<=x;_-r7W{e_HZtEV?s zkXJHcf_WCYUFhE8FLbq4&Z=zblB=qk#wT>O#mE)qe~Wygk8D#e-yOyCc;FUJmwGte zN}dmk(~3Dx#Nc&v|9G9(4_>cH!t3wU_73(IeY}q2ZYK{O(f1~E2XC(XYtr7ouJ4_r zU6-H6TEe?`bU-;3WIdK)Y?-?M>@(h6hR(80I*V}i=Msxkp9e(?^}xD+X*e2(4@Hl2 zD5vxv0*_te=ec+CZr4rLZ{S%Y!+n0mC(Yy686&Ju(=<~@jypqmpw3C=KX)xrkLte3 zJh>~5?*qxSf6EH~m++_suic{gl_Q_q~4k^Na7B_s*F9 z?;{uN@^kj>N}B>stD%*3vY+O=<!J#?NR8?@!t;suk1LAm2L4m$lVAIgtH#p z=D0IGoNMeK@^BRbPL+9^{)rX`@!#*~Ti{=PR37#1&0;G@G-iVTAm3B_m`@+4)5ikS z$6R-fX~(xWWkWML3A(&}xTVX8$&>HiPCJ6_R`WmCZ8Xnp_iu&{^4u5AQ~Osv^PGCiAJ^7C0X)TXz5?!k=njcOxc*1X$ zC+pl+jh~qdnA`GMPl-MsH+f{=%Xg>EWIvlcO8>b@FEBcdy>|}&H}Dm>H}OpM<@M+C zjv;kzA;vVYfW3S})5V6SGZ=64zw)TWJ+YGUFOxq={=vC*3+Mc!FaEWj&ZckcUUs$% zH-6uaH1K7+ztEGp*wf|Aye+*}^Sk7g)(%bdOaH&Y|FZ`_5S_n`E?5)Gchc(-Khp| zxvuO{YcrgPjTMpYo3hla@9TLVre7K#zdv83Kb?QKcDm&CxyB}SP2Oz!o9&(soOQ^HbYpWA-@a$Y zCEI<|qyN#Q`LfqvBmdj*7St_#7I>3w5zu~1&KKvz|3Z6$X)X7}FUS9t^u0OfSzkBN zws871dDQ>YxGzO{H+OfhDhm&a)Il>&O>QKEXVuo~_^97n{~oJ;QaeI)v=^{n4-)$ijkH%)yvQr`jUBmcG#b~5=$AXjtDf9zzk zqb*MQukUB`e;_|0zpQLLytjnDWXGeDv!DFm8wyN9M%eXm>n+xgVhsKF%@;b(E|FaHZ?cOM%!k_B+o76sqvS-@EhLk`ln|d@hj287^7dLjQM^~ z$M`Wed(oFa#(PS7+Ygh+Vjk`L`O?|X5^{!dw{t*-`y%bwz7sFm>xcR|)$}FT{S#^G zQ}Ueq3^1hAQ>9NEdZ2#UG8seSgfoB0?t`2&{|kwkjs1IKS$M{L;$JCd)JpQrFFVnU z^?c|iwCs}Uvh|k+X21Iev<{Ch^yQwfbE-xH7vxhIu&DO@CxMv0EG1=~dA6Oa` z9`7a}F=|IEW?8yEXdS&Dm<~|4=v6*8Hx=5of^<^!z!uL&+9DgNaP<=D7n8^0G0*)L zZP>Dc#oqmE^)=Z*^4y0QQ;mgmk*^#4vi^r=RM&W(f-hZvQ)QUi>kr@3vs3Xs5q$TH z>&&WmpH1Mp_k1h;>C6OvWy`dB#yG}hw)k~T4}PmX{A$lC6<*ut4EK0&C0Xg)3};Zr zezP_jts8#}j+95Vcf7$-uKRbM=xN}lH+-q>{NLflu4^)Z%ff2yyo&Mdrdyn*c z;7xt9Yp-1QF3S6S>+j`jEuuZsUnTgIwUogje%j#fzrmmV%fpNTaMwSNidHU8;LOsY za3(sG3>=w+v-3TiiAV7hS#|TsoXCl+vH!p3qiJd2*H}o#w12-x#!U3!7av*p^Ub-> zbo8tF#jXRbEI%@3{EMh7b^JBjjRgTlDb}u*h zlOIHq9^v_9_7@ve_I}ycrJpa$w>Z-o)DU~DyV&DnZQA0mO?R<24V}vGjq7il!uic7 zSVQV;gTYhfD5F>8p>wQT8eol_wEhRKt=MPLHTDHK=Me(%&_kg}^Pgr!L)0Jo$((p| zeSU0i25Xvl)%#7sg08K~v*hEfkDYB5+`rQNv+2>MaT(h`#+)X6nR3MKZ4TzgjGpIY zXkWFZ?6S%@YoeB_t1IJw*lh2t*4(xp7=A!{!MF@;69w)MH`)01rffLF_!gX!<*a^* zx|^yqws(NzoyOKK`%k_*6?ztqP6kJT6T%xaYQxw1G$wsQy3mPy6MZxV&yOuPV`29m z2yh8qQM#h3mH|A5|iCduDcdVy$}HDXJdGd}Wpt@%oaDXw8a#>17XgI>R@02Dta;1Fv0`37GRJ(%*92-4P@KwIs z!MpOk%5xa_>T-!vQB3O4vI z_J!ZOG=sDt{2$SrMk58mHd+VF?Yy8B=6Tt2L>El~P?=iQ9Odwe%|Juw^~ z$5|-rt6J=;tneZqwV&#p^RmjPalYC6mO8fIp+2=|>N8_o2>y%Q?{N-OW(XLAA8u>vmEZnZ{Y!0Ze9?7~IO6YQ#vWDN+ZZuu zwq{k`*1V zyY%fzQ!dx-Vtge(l=diT?;PkRenFnw%6oz2Irrq;?bUJU`$TfttIaTb9;(xfhv#R~ zTwfG3be1At|M7%fL;CV{1pj^cdIK;BfBnf<`Pf~OYscliB>6fQ`T7nqXT!+Xvo0S< zzRJft+bsbH(vd{t;=7+R7ip|Dul#KbY}=&YvbF3-U zDdD9zALX>xWQXI+DP#Lq?0&@1PlFQK=}R6 z3&4})o58~|nk(dsTj*XuIqfBVHL1>vc$X~rg3^Gy!|a2XxE1tEu-`+QvZNcYf2H+-$esJR(}y#h!^>av`v9pG|I zfOx|AVk)+qV4F+ZRvs6)tAJheY=3<_#-oAj7~>_!sc({v%w3Gfc&{%fnkR8k&9lh; zD9;Aq3T^(l(GfbJ;R51AscZ$`EH7$*tjL{$%~`yy_aEf+z@`7Q`6jrWHy`K>fA^1_ zb>+-A$KPUb-c4S?ZDEpMw|p83T%y~9$9#8~fu+#RGS31x#It*vnRi+OALT3yc#>Ru zTY3k6Th3r-s{RMarx=yO(|f9me8Jq*d`g3BTx_lD*(r{egeCIo`Y}+@5@7 z2DZy$_YLxkb_A1&`2!8#|8YCdBRgA_o=qJ)nM*8gi`*Lx%-QZ=)joBcWZKSgU*x~~ zEI5bKf6Xz%-FDK&8z)ka>U);|<2`tvF?D3STg@}yjZt@UTcX2a@`?|L*M#i68`)Xx zUS(jw*O>A5`JtAyQ(l$qEOx)hJLiXt{^Lldv}fWMVfN}4p2j!9HtTvPDqVJ{fh*hn z889^0pC3aXUzL0Z=uQ(`M`yqWzT-wRL370E;6C4z*Dt^~sp~JvvK->%pJnFS9K*kY zLwI}E>sJx|(*LLUFZuWve0#3OH@Vd-b2;gDO_}3vGG(&eEU!$mP3w^Y`JeV)qYZRs zS^J;w(QZ?)FsA;T#5iiL)Et~14Iu};_0p>3^->n=r88JBRRo6pKFS(rR)9E+c3qXo z*AYaYg|z!Mm0^MGrZQ;p)?>1Y_c{j4oV{RnQNkD6lma0uzroR0D>0Z-RpBwu+aZ*B(8Cs9k7ivAW%BdNry{T1I zXH=WLz-8nWZy_L8t-fiT;op;gZO`wU{7vJ~A#&Wm;$Qg^`I^=TSc6&L&Hc#Mm-)Sd zocJ?+(7Y!bQfvL$u`lsob73=gD%FE2Wo<Y_^XS*7QMsxiE2GjXyU)9{vG5Oy**lgF7f2@ z-Dq}T_2WUk7aQ3j+jI+Q&B4#c@&*geeDZ!4KdOA=x5L=kc9z(7{BvSW#-~Sd)f7CBdb8a*9-huHPhxNx8DjlzRPPhjT8H-bgM0VlO5*L= zI9R*JZTwQ#?=U(|u6q(V ze}H_V`%u>nJDNY^Y$!)o7t!u7&mtDq(!lmSV1jmhKY#?TI!N>V01EK~U=6-4wAt?U zN7<`aU*yX`Y_@GronZNK^HA1vtjnue=hc7t{?6bhpXpqG%bT6EkN;lVpksd0IjHXa z&N=vNwi1&Sruk)Odx4(8!1h8tw>aC2c$Rzf-aceJ{26&TcouVq@pVYs$87r8T<>fT1CbN&Cxe5gp^+Qtm-MhMBkQ@Fn6}r_&!*sl*q?akzOTqXGm7?Xn(Lgkf3&l` znSQA~yROonNTKV_au88YPU&@DkG(-X;_L6T*Zl1{#3@_qYa%jIz{oApgkZ{nMwI@K zyR9#b;+YU@(!{fToS4;;JHMrEs|%L6chNuTAip+!w>sHBfboau%)cl9PGB^1eW}i? z*t!06J2vhqj>CDL9Cu_wMijY!GW{!bqo%$R_eSzI4*_oEm*6f1M)`J#<}D3?M?(WV zw}=MLU@rC&c_1O6#6nXq{yWigw3~m?yp$~6c3Vht5)OIfUoHx6t zsC+*3^bU1t94{pOQ2dhfZ_?5+_?B8)8WP#V*;w&N^SA)?eP%4=&l_b)^TxQ0Uh~E< zU_)PwXzmz>f4s)}SHYavos6aA3AWS(?MoI;+U#ss8!r8yc;d&S<-lDI-8WyAJN*fC z0mh41zf%%EuP-qc(jl9Fma#n)V$Oi~LkqGZp+5wo&DEskIB`>^W@;qh-H-hj%7}(d z-cds%p_)L{ye}UbX%0?`hJeY~Um2g~`cbmGZp*C9j*#9G+B_B6a8k61vDwc2rS;se z>OW)X_0#lKy!Hv6wd4)p6YuN5!wt<8xxb@~Xm~k30%hSNBUK~n7B1y(`a#HnW9X;W zO_qMS@0a&GCpyzMGH?3ya~{58s`F*)JHWG+JWYK6o2kFRE$6?!zhM67xX+nqp4-Ko zr@2M6sq+lYSDih*`8a2q^zC9(Cdd7~mv^6+*UB?!_hrem9$G%gylQFi%-CN1^8EGA zi;AO4+pkbw_!TZTdT?p|(~VvB>LUfe<;6dm{MqgcN%^Ip3qRXP^JReM`Ew{Mokq3_ zzx*E3l;^i5udVY{FKv@aD{;SX>ML}=#B=`$XR2sX^ecH1VvR3;d<1&bxui_!V=s2y zWLTl~Xq(L5s6!BZU@QLXlyS(6(N*xXLM=nV`j!1ec}7me4wA z%+g{@XnD4w#SYn-wHMGsi!DPfEpi@xX5>DP7LSLnL^r=Qw3y@GZ~9&2-pdnOTxDrd z`?rPeB?dQz?s!9sIf?9~#t{<}jv;*|UtcDw1W=`rb0>HR|_e(kS%((7~^%zYiUp$k_IlNu2wfo}hyk%6KyAu<5{)NvlHZrYB_5{pf%_bdc>%^ypx0 zFFKIjtI+K*<4nKp36Db#nr42uzO!# z8QnGRcb92jL$+M~c7kXBUC-1Q2;KD#`;PX`*aRIfv2$y_)?~-FBcCBZ>4Zej3VlRKFxaG3N{3o%?_d*{B zu$OB8@$=yD?dqPm<^S5amz0nAa41RfAy~8 zHR>o&id(*!`{pGF))3b@kFmLcSbJ;uwQs=|TJ1zyH!|n(UIi>#6F*8{LcpZhgV~BL z&X}C6Z{*dQH_UrJ^~hHD$Cta;JpUiWEdMBVi7rEm+m{lve2s^Sjg^CoSSaqH>U`ddS6=JID_=40uf5_N+E|{&joFD9@AOII#lDD-uUEZTo+e&7 zwu=7&2imjwgq}ls;+4-Lu7u*1KSKJ4iC5kZZz=BKFPSUFQ+;iSz2i3Pta2ISk}h6z zc{V<{$l%ye#a77RjDC>V3WKJ`kkY#_*cV|<^&NBt>nYYLC@BQ`rboxCA7?S%PrQgag9n2vvR2TJ|{wKwSI)XAaA*WS+68wS;%yNvh0piBAH%4b(` z_q(7+;SJpG&BnJ-I1iU#pP+7wgCh4~-qk;Y+aG-bnV;wWkhJinlT2JQl?`!jb0>R2 zqN&-$yESQ?--%sP9y9NZaom3=&V%-i3a@aY#hI2*zRI0+YVYgRYw|x`6(56-xOv~4 z^#0qbxO|&(^1}@=UbId*1t}QQVpTpj#`p%-$ z7=t;C1^1~co=3IyIrqn~TsF`J;f)PW!_+eY zjegN|QX+=R-wljTJP&(-!KH`$k_BOKPmEP#E5^6;NQ*DouH<-JB4vHdD_Y2okhN$JmQ}adS+M{@HH8JPX|CJe(Na zG(0%+66bJ|&n3?=`UB_s)E{W`cjOmeN*0N(ck$HTqVRmOhv%jqJoh>C4eqw3JM*pc z$>4g`{FL*_CclU4{>~?#DOfyQuT|TePX^ca-1j&q@?Fw2{#((b1iSWk%=v%h>_*d% z95+IqL!DRlc}lT3PV(s3k0B&}sve~{F!(p|J%iY~VP_0y&YoZncOrFFPUN>NU23 zd6hF7oY2(gfeD}1xY||SsdYBTy7MbatD>2u8SLSQ+$F&49rJMhz3I|% zz^7-c-0pq5s)li)?lsh1-gW(sF*BTf^VoCI99Zyciz9ywenXk$I}TeJH7{=->G!@rsxW{CP3e*1l}T!cBvl zt`saz$ceDG#hE&6SCXr>vg2!hEMh-`|Kq*?fue*Ttjfub;rChodW`R0r{-j>|F>!V zzY{rV*8jupTBQzo*+w6dWsRYeJJO6%(})OkvbT)-=J{i^uJ;)E?MY8G@Kk3IS7|VD zm3r%jrZ3AUCt&Apk~aD9mJG9V^SR8CJEw}C?77_%L9py?ua?@TKqE%URb+5IaYPx8$~|(JpGlr zn;d6y`;ghuN#I*L-7M&$W@|%RxcR}(O}FB+`oQa*n=5WH6a7YA)VY9gliAd6H+CGwRZ3-eFAMVN70P9DG@1#)h+Y-vzIlw>4+0tk(7A zoL3iZTtL6Azk9ZO)jzoRBZwYJoGmBUX_U?86UZm!t7J?+B^tEU!s&V?P^@ZP`1qP;K_c)W^ z)_aDRcC1Oual3fZ&(Yd1*M3#1jX~?%_b&adS+iWK>=92~=3Ask6&`1>C&b?KYn zP~N(%)cudbUi%;N9rou9=?DSJ*WtHtjOk~OE}{A4mm_*~ff~)9n~sTeB8M%l^q$L% z48FFv3~nD&x9}`r7tD6fEQ`EGd&(Qy+NoYn_rcqU zkCbGJj0iFwLyeLUkdW{`75C3mJ7I<1)yx%y#Z&7DxUaVvI|oKJ?MkJg_T>p-{O zh!2@x$0PV-ikG#Xu)b!hTl06eyMZ%Eqp;J+2jwr&rtZ&~3hj$7{>4*%VpH%{>M(wD z7ADoB`@lBRRyqFEzD#)7v}4yT<=77&sXrGO1iO59ZTi;Cjy5N7@sB%bU*E)I`$Ncy z-76N>taPso)OEGJ#{Y6-kC0rkzmrTAjBZ2f zO)st(;%q-9P_i;qSnRIAN49)as4@3K`E%#H%P8BiMe}hkILIen5kC8$u8tlgjza9> zIZM@)1WmXGOue?joPheS^E0=XDqPd+^57oO>z8 zUtQmC3+tn>MeD z&EtONV(t?3znQzwy>H97-@KUn1pRO3?sM{! z*#dC230x@*9BBDj4+{pi@b z#uK8V;pX5-Gf#XBK9^5iAu_kTN9MNp^Pl9UFRSI7iQkd&%S86IIL?U3lwTnGWH0HF z^J&Y@r0inq()@5GZ8in7V|kR@IyNEadzDL`m)vS+`#k*0e1B}@c_Oc5w*0Z9bgUTIbpEI5J2T+BfZK?S$#3dvYh91u@!;>awSVcs&bkry zTx17%wdZ=h=ct9uU{CO3cVUw+b2X` zeyDrRx^cnnPfDN|)CAA4s!fS{~U1ELsPvZUP|$?rO!J1iE)xc}C`_@0r~od5Ug(_Zc^ z^!?GG{LXs!8C%ulttQ5AQ9?)5-kRny45K-kt6J+9P)@#`+Ap$lz5|{0o78FNB7L*z zTal02XSR5?^=Mu$njHq~w>oSitv>hOoMnGGoG@Y{&i2ewZ^W@t}MYnFGJA6_7Ks$vJKomZeK;aTnY zKGTPiVbhRdzK;74I1rB*IN7@qt@(P=+>Tq@n*aDfXTwMS&^h<`w>qPPiP>8EerNN9 zsmA8+L@MJ==;!B&PTA+WpLfAHS2lndoE_!A>>`_aihiU^{epM##=XF;yjuV2zsk1O zXTY2CH{hHm-=#mD3mrYY=xg|ocC|e*ZfX>nv9LjMxBi^inS2XDAK2UWR#Z-p$o^Kr zIz{mL^*ls9O-sMV9K{_q^ykT2AMCv656^bq^x(fb>nDD%Ey&sAU>$v08ZbWOI6&B1f<;Ty?%<(!x=&xI4` zj>`C1^i#N6!m|los#fbdY=|Lj#?k5kdeg|*?d*%K+tT}d$Y|QA!H&l~=9Uki9dm;L zGnWjcx1E=yw?$vJ^Gc{%x`%ylt`2SwRpKYcTxk8wN5%rQgZ|fMcEBLo? zrHk)ns4&YtgR*ncSx&nModtL+;BBMpaqcoofAwGb-X3^h8M@g}>3d$j8>LH?B3>Oio+<2|Clj4*sPw?3JX{i)1kGROh?lbrrYR*ec z1Sj(<4+l+8Yii)?HjXU`(I z__&JiHAmjexM@A}TX=xLpvDf>S|2oXreyU?jC&QfRGpo?5n2~tYahrz*HB{i2ej5I zcI$`(Ui*RFO9|nhW9LMCCaGI8OFR)cmGdy@!Y`5khpd}5S3h14Z023_BtCGDCp3X~M7lJK}5R@J|EpR^*}PyJqwr`O3=oxEUQ$bSU4Y7Q@e+4<&E--sNrKb?Z9A z0jv8&`PRJX%4qYVlhAwe-S3#Z`DR{9?(1yYlf2S=X4j~;e+^#$I*i|iWLJ*cIoR6H zdiSr${etOJk$Z)C+Pt^XH^F%nu=#ylr#>=H&0C!98T17^X3Nq#{CRlZeDm!1>A+&} z;K`h8Qu=UCKYhqPL?7n9)Xf-KxHi)V*&uuOp}?JFU@vgPNqtyCAA;!m{#lj9^d*`^ zUs2??aC-u9oeE98OuasCtvt2(UXL8wO&%Z5K23#^Xi9$C(zVjzeKj!4&fFX3Jog9# zYo42(1oLEI_UR^cC-*aG4p}~<*Bm04gTRv>)&;RAl3?{|f^%H`!gpCe@cqN+-|VxS zr^WxUWcZLh2ENTR`@r{C>g*4`H6Ieb+5N!xhzH-6B=}yz=3Z-jIqaEj&0UhuI>+S< z4o6R9O|>EUsF$GkdPcs4`7{@f~DH`~6fl6>h+7Ykxv_>g@W)zg=x_Ve6&uP>{T z`tp$N3w{(m^RW8DIn>5=o=)P~j@wRvhOS~B7N1Pz{j*nD-B|xWV(2T!ZLSY&&!zm2 z-?RR!I^U7Yye|1Sjy&S)Z2n(`4!dKl(<*sYvW|I}c~tbrxwjbH)$1$Zk?# zWNmXU>n_$)sv0Q z3E7|L-Zx0HzX&~+JM`#_Cu5SvsK6~UZR?xzC~vVl-lS%17bH)3eM|*i6ODbRJr9GhX_by);4m4e_EoyY0M*o`p4f=*-v-^Uc<^ zztzq=Hv)GuF6%fe)dEaSoO8K`Z?)*mThW=D(U}|2nVYe9G@v(!(3|HD`AuhN6S{MK zHh3*^We-u?nsaxU{ua3xlP2A`sdAmM$39DXGG0Uv>F`qP;l;*^CssE!B^-#ZLLP2< zbczBumwG&%B8irYUFiwFPH}sp{{?QV*Z*0-CtlF`t7P5^P@l$yxg@E+9QP`(jyj%_ zU&2Qy%=!Qvh)=#wx&HWMlGi7nPt+fOzVLaaqg`{brE}~y{v4bHLxH={z{xo#@X-lV{;6L+;;cb6h#N&ffVE5@X z0k`M-EB^ciaLXRk8+ZBccmrp?dtws23(YuWyMHIG6+KXW{|N7zJM?}Jb@j*=?vPF@ zt2J9bPCHmo|XzE7hs8iPLT!RRe*Ti&?8 zvwp<0ok8eY^}b5Ik`Eh9yX+zIwDSDS*rDtKzCF|5JJfvX>`U426MW6aH)oY%&%RFm zW?o%Bp_gyYfOdkQ;_2n$yD5LFy0+(mS?l@cdSc!6*fUq9vxWNmRx#$H{lK#N$EU?( zBc0ZVi5t<%`m~k#hdLK({mdM=@KfBCX~!wweTuzR@mwZtzMjDukIx4o*U+*F=&F&h~I*tu*91{p!TE=^ny}{bIuHUh1B5NS#>nT@+ zqjP!27`tq<=TPFFVa6`sozJs_v9x;+Hhz$7cQ=_a#{OsWmAEr`s_(att&CpJ`RyBz zz~)XotRHemz1w(gbZ%wkjLhYn^9hu%Y+$c!-ZA)}m1W;Om-E%4e zKYKtc=*uknQOEyxz-iWm@WyrQAuXmq0n#qX58rki`!AQ2J#$w@AZvHo!S1u>5f3X1 zTi)sHzsw2@-6Q;EkiPQTWibZ4b*{HQ3>9WJ;&+@sZzz5&G=o^ML=< zK5yzh-SQog-HbRQ|kc3^Bv(h_R3XG`|ya7YkR}-r4LwprN2iviFOp1 zR_z``9ioqo=o9*{`U1c;hIGNQ8y=beqpJ8N_*vE->#(QM_wMh^Qud{=bI6Y3(|#zB z)fgBb-Y9=a@sa$dbjB(xH+)+K|I4BI#YZ_;y!=7;S()QGW68K?g*Yz@-WQiSSBz77 zxtBh&ZsBgyGe6?}C*J?7`VWm%h(<;^`&LqC#pacF9XHC^J`5keEbTX@}t#Is8 z>E06} zKRBYVpQ>cJaC&>7$L<(3albU@_0(76jCl?pIO5ly6nS-kdX`g<){}y7kU6_*>(L&u z4_h5|`7*eJyvv}6(i7*z>%cL(Y~rlLI@Z@^ErsaVA@>Hx-}et>4&iLXsS)Kh{%%`z zPh-!0s2$@hoop5D@V@+v@3!q6{$OX|!9R2^e|-=3#_zV>^M?mIZ~F2dJ2RM9z72iu zC*PCg_x*=_zoA2w{dxvxhtjlzSwJfeVVrW`jUj)oU_7FLkrGvk;|ZkN__Up zI18`<{Mh~TT(^q4G_K;CJ7a*VV^o7^b?g7Tnhj~^4=1Gz937E6p z+yuehnV~j&^NQonPx3GF>Fu+@RJzBPCr!T7$v4ov?w?gPeW{rk z8Ae|;$Cp6s4Ly6DY3Fr+FYr#*sxQ7-iG9!7!gjD%qp>Oh9ym?ZzsANP%XZtL9l_L)@L{lfCi2BP)O_IcA3EV)XTh9aKF+0r;VXsm30zeM zEcY=U$`@Kbv6l`c{BLIe4ZpxqV=BW}tYBQ`^P6|#ilQ-rL06O?v$kl=DCdfH{I^B7v}pheZS+Y zY1(1$%(Tn%TD4EQ|1{~EAC0a`|9v?_-ke@|J39^DwiP7scA<~Ab-nS{r=IiD)N^KD zqMpy2GU`rk$a0tud+zU0*#NXs8Hh~_kw4R^<6580J)sj<+(o>=QTiSt zE%9Cxp0V|V?#blcnCY~PMmHYne_QUvrd3hTl7KTs<;tDF!ZBSA`(RG|rta>k<ly~4g0-UpW{UJ?w^l5crJI5RtF;ew`2XA{kj#y+V+FH zNWHozQePc)-|;CYs`qqtC)3qV=+&=JcoClcdrk8NXLt8DCp^`hG56;c17Er^T$X+e z2df_V;d5rL@44G~pnB4c5&V^~dCoEOf^@5t`qGY1hV3KpZN zys10at>Bpsf2nlk*_Zc*s6XA9{FZv^y!vxYoxNdBJ08@PIvx*G_Ct*acP6FdDdIAi z@#urQbYn^#>BeH!Vb-C04h?-#PdeP+Kt00ypYRV!v@I86mklfb8%Y(&f{QeLpgJ6!rMB zGM{(NJz6u(?e5uw80w`bk87BA{5}B3D(BA1_$TRu-UF54_{Y^>{4~zBX?vY-4TdhP zuX<|VCNr<8-D1Jw@olnv(mV;ADd!V)7QvPqPC3aWl^tSW?OCTuE|rtdpTkny);HB( zOIZT;_0bPL)ZAM-@Z39=xwkTD?iEb;`15Y5H}CQcbf=kjIg8=zaOv(X(H^qs>_auC-dh26h*6Hc+b%U9L>qQ2Q*m$y^5; z`Sdm6+m~cx6JLf{D~t)TR-V*Qlq|oE&5bo^CUZt#p11b_&thGCV94?!@#2ZJ(bxW_ zd-Ehmdd~mI2A3+&RlY0RDaRzPapq$?lkeEmdO_D6LzlJGpMAy!xg& zfVyXhkN1z`X`pk6?@YESe zKkqoorRMD zL_0bw{cNB1dT@bVcXD(0+Jzn6KfiL86S_30aSJp5Gf#wAdq?@Ui*F9=ZzBgi{P=74 zOxEt9OlJXhb;B>p1MJ40lw5BH^)9AHiY?JnQw~73(?k zQJ&+B+BK`-B>Hpd3gGr_W}$C}J~QV1V8U)z3jDI0Z5Dn;hOg;xoGJ1<2_@SsMuu^J za3*Iu;Th#+p^2eFXMqo6Xi#{@-0tov;B*G*SA@#ep6`E~dl)b*2HpY;U7OEz#J*vXX5L@1@q_!dx@j69B0Nv%FN$c9BJh2{TZCSzch1LV@+Vp zbD5M8UO2mdjlm=EgvjruJ+>UU^`1G>dCYrWqo>vu*w0KpgJbT%@^PHXtEb`PYIr6o z#zuVBmCLHk5Y-7f7y%=anxZJIE`%Ikcl^Iq?qtGFC1e z*)Po^ud#{Q7#aIN{iNBW@#jm?q4R7SdOhJ7&&GRXWD{#oL$6DE)9aO8sr!nu&sv#Z zioLZ4+v!D=O`W$KzMT&(rP6IV;{v~$xl8g-bzCi5EcKja>dA4>NK;>GJw6Pw`Kqm2 z%6~jfxd6B~c3krK^UnXN9Tz*e#?p*mQ+8tf?vouit*uRW?)rP^f$08f_Ru*Scq+O| z$An7u&;!xA*ik}(pz-Ms;LEQ(?VRb5uiVA&an^Z=6Ax?5YeJDL?zQ{ATR6WZ-{ar# zl<#pncH*6sn@GJX4=!G)Y z@$>pyA!it>dwf8y!+u*nf%7h$^zYOLQzrHXw!N}KackR!6&VQxCH-!4Si94$p^bMXb ze4s2~&UD?|_|<4VX*$<67@rDa&98cD@65=Vzq04M)Lyw+H_B(<-UpyHX%n#Lf&W%~ zR^G)&=2850n(uxyM zz2P9V^Z!_T^Z2T&tN;JpTp%~hm^olch(dzZRz(H{y-AoHtAJB&YmjOKb*PF{aR^3h z6!qa+tQOnHL>zLDV6g@;>QjQ$76&YZY8}4TAZmlC#R!tC(EQ$?z0bKh2?^5I>-Wcf zopblu!`f@Fz4qE`t-ZGHE~u}{GUIS2xRWoJ11*WJ=%7(Ha*Y7kp~e??>sk z;$F!AM`I|QoU_r!5v*qXw}%Tx7l)$vAuB$q7_EvSQB5oe&TH;K_Lx;)DBqbp_uS3C zpOmd*3U!Dt7Zbzcq)_DN!e=dKjRos-;j#1+Y_i@H5{YiY{o`iNL5Ie6z zF=&TmEz+8ICotDta9#XbWMKKuWKnj*f2MA!7!X-hjEq-Y@MfnNsuk@2UjF>XE!dbA zrO$Tas!Q+BP)FA3{O9afgfl50b6&WDbH(z7{15vpJ-_0qdtY~%|2BTWT-tA#Ge2%= zM`LHlZ8c|}L{rzmr-X~tzX`YJw{7IVrHypAg?fVX!qDS17Q=HZ_;Ya$fcpdflLw+02Sp|K`7un|>M=v`#-Z2*5ptui;!O(SH z+WVDq%sFH6vP+=T8s>B`E<~`*c6d!Eo&>Myi6@!5xd%z-gtvn;oe7JFv)a<|I~xri zyF14}GjJZPj=Axy;Zr&8ZQ!{d@M%oaIL{yCQ@SJ9@Fw^X>BOe8>xcaOlpZe}6JHJA zD=>U2)4k85k*lAQ9A@Xc9arWb`mMF#S@T>n<2>>d`Day6$9E9_GQ}OK!%t1|M#||& zp?4MK(0S*f{wbZ#`Avr@zk$?fMV zz7u{=PydQ@TRN9_ODM8~Ni$1l^&&U?yseHiUUTtB)Hmkmj#o1MZ*w`z$2ZQA`QJXt z==cWC=Hx0kOV$OZ_ z#a~Nfr@j>B_FKeV$XnJNaYNjk`@+|80yYNuJPx}o8ejY6(DCOP9-L+Lib329cld}g zr!DR-0(YFl+$`Q_&&k^K6lh@^b8Z!U=+QP}Y<|(cO7lZLB>V84)40NeJI?JguG2g5 zcg7kWllZ&Fx@Kqltn=XUtGPQ%b(nLyl&Smjg7K1x*J+O$paYHjql@Op{jtB8GoK4g zJfK{63v!1K|8(G=Zq_av7esB|1fMyAalRxCe0t+N55G!(oY^PFBKW<<$*1*WI_tG~ zjr=zK^TRdV8#DquRT6ulj`wV0FMN$3XghwOtKnrY0≠SI2({pH%$Y>e3EbK;v-d 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