1use bevy_app::{App, Plugin};
33use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle};
34#[cfg(not(feature = "smaa_luts"))]
35use bevy_core_pipeline::tonemapping::lut_placeholder;
36use bevy_core_pipeline::{
37 schedule::{Core2d, Core2dSystems, Core3d, Core3dSystems},
38 tonemapping::tonemapping,
39};
40use bevy_derive::{Deref, DerefMut};
41use bevy_ecs::{
42 component::Component,
43 entity::Entity,
44 query::With,
45 reflect::ReflectComponent,
46 resource::Resource,
47 schedule::IntoScheduleConfigs as _,
48 system::{Commands, Query, Res, ResMut},
49};
50use bevy_image::{Image, ToExtents};
51use bevy_math::{vec4, Vec4};
52use bevy_reflect::{std_traits::ReflectDefault, Reflect};
53use bevy_render::{
54 camera::ExtractedCamera,
55 diagnostic::RecordDiagnostics,
56 extract_component::{ExtractComponent, ExtractComponentPlugin},
57 render_asset::RenderAssets,
58 render_resource::{
59 binding_types::{sampler, texture_2d, uniform_buffer},
60 AddressMode, BindGroup, BindGroupEntries, BindGroupLayoutDescriptor,
61 BindGroupLayoutEntries, CachedRenderPipelineId, ColorTargetState, ColorWrites,
62 CompareFunction, DepthStencilState, DynamicUniformBuffer, FilterMode, FragmentState,
63 LoadOp, Operations, PipelineCache, RenderPassColorAttachment,
64 RenderPassDepthStencilAttachment, RenderPassDescriptor, RenderPipeline,
65 RenderPipelineDescriptor, SamplerBindingType, SamplerDescriptor, ShaderStages, ShaderType,
66 SpecializedRenderPipeline, SpecializedRenderPipelines, StencilFaceState, StencilOperation,
67 StencilState, StoreOp, TextureDescriptor, TextureDimension, TextureFormat,
68 TextureSampleType, TextureUsages, TextureView, VertexState,
69 },
70 renderer::{RenderContext, RenderDevice, RenderQueue, ViewQuery},
71 texture::{CachedTexture, GpuImage, TextureCache},
72 view::{ExtractedView, ViewTarget},
73 GpuResourceAppExt, Render, RenderApp, RenderStartup, RenderSystems,
74};
75use bevy_shader::{Shader, ShaderDefVal};
76use bevy_utils::prelude::default;
77
78#[derive(#[automatically_derived]
impl ::core::default::Default for SmaaPlugin {
#[inline]
fn default() -> SmaaPlugin { SmaaPlugin {} }
}Default)]
80pub struct SmaaPlugin;
81
82#[derive(#[automatically_derived]
impl ::core::clone::Clone for Smaa {
#[inline]
fn clone(&self) -> Smaa {
let _: ::core::clone::AssertParamIsClone<SmaaPreset>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Smaa { }Copy, #[automatically_derived]
impl ::core::default::Default for Smaa {
#[inline]
fn default() -> Smaa {
Smaa { preset: ::core::default::Default::default() }
}
}Default, impl bevy_ecs::component::Component for Smaa where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component, const _: () =
{
impl bevy_reflect::GetTypeRegistration for Smaa where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
registration.register_type_data::<ReflectComponent, Self>();
registration.register_type_data::<ReflectDefault, Self>();
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<SmaaPreset as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for Smaa where {
#[inline]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<SmaaPreset>("preset")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for Smaa where {
fn type_path() -> &'static str { "bevy_anti_alias::smaa::Smaa" }
fn short_type_path() -> &'static str { "Smaa" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("Smaa")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_anti_alias::smaa".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_anti_alias::smaa")
}
}
impl bevy_reflect::Reflect for Smaa where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<Smaa
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for Smaa where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"preset" => ::core::option::Option::Some(&self.preset),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"preset" => ::core::option::Option::Some(&mut self.preset),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.preset),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.preset),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("preset"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"preset" => ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 1usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
-> bevy_reflect::structs::DynamicStruct {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("preset",
bevy_reflect::PartialReflect::to_dynamic(&self.preset));
dynamic
}
}
impl bevy_reflect::PartialReflect for Smaa where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for Smaa where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<SmaaPreset as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"preset")?))() {
__this.preset = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect, impl bevy_render::extract_component::ExtractComponent for Smaa where
Self: ::core::clone::Clone {
type QueryData = &'static Self;
type QueryFilter = ();
type Out = Self;
fn extract_component(item:
bevy_ecs::query::QueryItem<'_, '_, Self::QueryData>)
-> ::core::option::Option<Self::Out> {
::core::option::Option::Some(item.clone())
}
}ExtractComponent)]
85#[reflect(Component, Default, Clone)]
86#[extract_component_sync_target((
87 Self,
88 SmaaTextures,
89 SmaaPipelines,
90 SmaaBindGroups,
91 ViewSmaaPipelines,
92))]
93#[doc(alias = "SubpixelMorphologicalAntiAliasing")]
94pub struct Smaa {
95 pub preset: SmaaPreset,
99}
100
101#[derive(#[automatically_derived]
impl ::core::clone::Clone for SmaaPreset {
#[inline]
fn clone(&self) -> SmaaPreset { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SmaaPreset { }Copy, const _: () =
{
impl bevy_reflect::GetTypeRegistration for SmaaPreset where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
registration.register_type_data::<ReflectDefault, Self>();
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {}
}
impl bevy_reflect::Typed for SmaaPreset where {
#[inline]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(||
{
bevy_reflect::TypeInfo::Enum(bevy_reflect::enums::EnumInfo::new::<Self>(&[bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Low")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Medium")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("High")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Ultra"))]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for SmaaPreset where {
fn type_path() -> &'static str {
"bevy_anti_alias::smaa::SmaaPreset"
}
fn short_type_path() -> &'static str { "SmaaPreset" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("SmaaPreset")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_anti_alias::smaa".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_anti_alias::smaa")
}
}
impl bevy_reflect::Reflect for SmaaPreset where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<SmaaPreset
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::enums::Enum for SmaaPreset where {
fn field(&self, __name_param: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn field_at(&self, __index_param: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn field_mut(&mut self, __name_param: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn field_at_mut(&mut self, __index_param: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn index_of(&self, __name_param: &str)
-> ::core::option::Option<usize> {
match self { _ => ::core::option::Option::None, }
}
fn name_at(&self, __index_param: usize)
-> ::core::option::Option<&str> {
match self { _ => ::core::option::Option::None, }
}
fn iter_fields(&self) -> bevy_reflect::enums::VariantFieldIter {
bevy_reflect::enums::VariantFieldIter::new(self)
}
#[inline]
fn field_len(&self) -> usize {
match self {
SmaaPreset::Low { .. } => 0usize,
SmaaPreset::Medium { .. } => 0usize,
SmaaPreset::High { .. } => 0usize,
SmaaPreset::Ultra { .. } => 0usize,
_ => 0,
}
}
#[inline]
fn variant_name(&self) -> &str {
match self {
SmaaPreset::Low { .. } => "Low",
SmaaPreset::Medium { .. } => "Medium",
SmaaPreset::High { .. } => "High",
SmaaPreset::Ultra { .. } => "Ultra",
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_index(&self) -> usize {
match self {
SmaaPreset::Low { .. } => 0usize,
SmaaPreset::Medium { .. } => 1usize,
SmaaPreset::High { .. } => 2usize,
SmaaPreset::Ultra { .. } => 3usize,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_type(&self) -> bevy_reflect::enums::VariantType {
match self {
SmaaPreset::Low { .. } =>
bevy_reflect::enums::VariantType::Unit,
SmaaPreset::Medium { .. } =>
bevy_reflect::enums::VariantType::Unit,
SmaaPreset::High { .. } =>
bevy_reflect::enums::VariantType::Unit,
SmaaPreset::Ultra { .. } =>
bevy_reflect::enums::VariantType::Unit,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
fn to_dynamic_enum(&self) -> bevy_reflect::enums::DynamicEnum {
bevy_reflect::enums::DynamicEnum::from_ref::<Self>(self)
}
}
impl bevy_reflect::PartialReflect for SmaaPreset where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self,
__value_param: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Enum(__value_param) =
bevy_reflect::PartialReflect::reflect_ref(__value_param) {
if bevy_reflect::enums::Enum::variant_name(self) ==
bevy_reflect::enums::Enum::variant_name(__value_param) {
match bevy_reflect::enums::Enum::variant_type(__value_param)
{
bevy_reflect::enums::VariantType::Struct => {
for field in
bevy_reflect::enums::Enum::iter_fields(__value_param) {
let name = field.name().unwrap();
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
bevy_reflect::enums::VariantType::Tuple => {
for (index, field) in
::core::iter::Iterator::enumerate(bevy_reflect::enums::Enum::iter_fields(__value_param))
{
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_at_mut(self, index) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
_ => {}
}
} else {
match bevy_reflect::enums::Enum::variant_name(__value_param)
{
"Low" => { *self = SmaaPreset::Low {} }
"Medium" => { *self = SmaaPreset::Medium {} }
"High" => { *self = SmaaPreset::High {} }
"Ultra" => { *self = SmaaPreset::Ultra {} }
name => {
return ::core::result::Result::Err(bevy_reflect::ApplyError::UnknownVariant {
enum_name: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(self)),
variant_name: ::core::convert::Into::into(name),
});
}
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(__value_param),
to_kind: bevy_reflect::ReflectKind::Enum,
});
}
::core::result::Result::Ok(())
}
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Enum
}
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Enum(self)
}
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Enum(self)
}
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Enum(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_hash(&self) -> ::core::option::Option<u64> {
use ::core::hash::{Hash, Hasher};
let mut hasher = bevy_reflect::utility::reflect_hasher();
Hash::hash(&::core::any::Any::type_id(self), &mut hasher);
Hash::hash(self, &mut hasher);
::core::option::Option::Some(Hasher::finish(&hasher))
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
let value =
<dyn bevy_reflect::PartialReflect>::try_downcast_ref::<Self>(value);
if let ::core::option::Option::Some(value) = value {
::core::option::Option::Some(::core::cmp::PartialEq::eq(self,
value))
} else { ::core::option::Option::Some(false) }
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::enums::enum_partial_cmp)(self, value)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for SmaaPreset where {
fn from_reflect(__param0: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Enum(__param0) =
bevy_reflect::PartialReflect::reflect_ref(__param0) {
match bevy_reflect::enums::Enum::variant_name(__param0) {
"Low" => ::core::option::Option::Some(SmaaPreset::Low {}),
"Medium" =>
::core::option::Option::Some(SmaaPreset::Medium {}),
"High" => ::core::option::Option::Some(SmaaPreset::High {}),
"Ultra" =>
::core::option::Option::Some(SmaaPreset::Ultra {}),
name => ::core::option::Option::None,
}
} else { ::core::option::Option::None }
}
}
};Reflect, #[automatically_derived]
impl ::core::default::Default for SmaaPreset {
#[inline]
fn default() -> SmaaPreset { Self::High }
}Default, #[automatically_derived]
impl ::core::cmp::PartialEq for SmaaPreset {
#[inline]
fn eq(&self, other: &SmaaPreset) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SmaaPreset {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for SmaaPreset {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash)]
107#[reflect(Default, Clone, PartialEq, Hash)]
108pub enum SmaaPreset {
109 Low,
111
112 Medium,
114
115 #[default]
119 High,
120
121 Ultra,
123}
124
125#[derive(impl bevy_ecs::resource::Resource for SmaaLuts where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource)]
126struct SmaaLuts {
127 area_lut: Handle<Image>,
129 search_lut: Handle<Image>,
131}
132
133#[derive(impl bevy_ecs::resource::Resource for SmaaPipelines where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource)]
137pub struct SmaaPipelines {
138 edge_detection: SmaaEdgeDetectionPipeline,
140 blending_weight_calculation: SmaaBlendingWeightCalculationPipeline,
142 neighborhood_blending: SmaaNeighborhoodBlendingPipeline,
144}
145
146struct SmaaEdgeDetectionPipeline {
148 postprocess_bind_group_layout: BindGroupLayoutDescriptor,
150 edge_detection_bind_group_layout: BindGroupLayoutDescriptor,
152 shader: Handle<Shader>,
154}
155
156struct SmaaBlendingWeightCalculationPipeline {
158 postprocess_bind_group_layout: BindGroupLayoutDescriptor,
160 blending_weight_calculation_bind_group_layout: BindGroupLayoutDescriptor,
162 shader: Handle<Shader>,
164}
165
166struct SmaaNeighborhoodBlendingPipeline {
168 postprocess_bind_group_layout: BindGroupLayoutDescriptor,
170 neighborhood_blending_bind_group_layout: BindGroupLayoutDescriptor,
172 shader: Handle<Shader>,
174}
175
176#[derive(#[automatically_derived]
impl ::core::clone::Clone for SmaaNeighborhoodBlendingPipelineKey {
#[inline]
fn clone(&self) -> SmaaNeighborhoodBlendingPipelineKey {
SmaaNeighborhoodBlendingPipelineKey {
target_format: ::core::clone::Clone::clone(&self.target_format),
preset: ::core::clone::Clone::clone(&self.preset),
}
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for SmaaNeighborhoodBlendingPipelineKey {
#[inline]
fn eq(&self, other: &SmaaNeighborhoodBlendingPipelineKey) -> bool {
self.target_format == other.target_format &&
self.preset == other.preset
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SmaaNeighborhoodBlendingPipelineKey {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TextureFormat>;
let _: ::core::cmp::AssertParamIsEq<SmaaPreset>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for SmaaNeighborhoodBlendingPipelineKey {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.target_format, state);
::core::hash::Hash::hash(&self.preset, state)
}
}Hash)]
178pub struct SmaaNeighborhoodBlendingPipelineKey {
179 target_format: TextureFormat,
181 preset: SmaaPreset,
183}
184
185#[derive(impl bevy_ecs::component::Component for ViewSmaaPipelines where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component)]
190pub struct ViewSmaaPipelines {
191 edge_detection_pipeline_id: CachedRenderPipelineId,
193 blending_weight_calculation_pipeline_id: CachedRenderPipelineId,
195 neighborhood_blending_pipeline_id: CachedRenderPipelineId,
197}
198
199#[derive(#[automatically_derived]
impl ::core::clone::Clone for SmaaInfoUniform {
#[inline]
fn clone(&self) -> SmaaInfoUniform {
let _: ::core::clone::AssertParamIsClone<Vec4>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SmaaInfoUniform { }Copy, impl bevy_render::render_resource::encase::private::ShaderSize for
SmaaInfoUniform where
Vec4: bevy_render::render_resource::encase::private::ShaderSize {}ShaderType)]
206pub struct SmaaInfoUniform {
207 pub rt_metrics: Vec4,
217}
218
219#[derive(#[automatically_derived]
impl ::core::clone::Clone for SmaaInfoUniformOffset {
#[inline]
fn clone(&self) -> SmaaInfoUniformOffset {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SmaaInfoUniformOffset { }Copy, impl ::core::ops::Deref for SmaaInfoUniformOffset {
type Target = u32;
fn deref(&self) -> &Self::Target { &self.0 }
}Deref, impl ::core::ops::DerefMut for SmaaInfoUniformOffset {
fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
}DerefMut, impl bevy_ecs::component::Component for SmaaInfoUniformOffset where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component)]
222pub struct SmaaInfoUniformOffset(pub u32);
223
224#[derive(impl bevy_ecs::resource::Resource for SmaaInfoUniformBuffer where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, #[automatically_derived]
impl ::core::default::Default for SmaaInfoUniformBuffer {
#[inline]
fn default() -> SmaaInfoUniformBuffer {
SmaaInfoUniformBuffer(::core::default::Default::default())
}
}Default, impl ::core::ops::Deref for SmaaInfoUniformBuffer {
type Target = DynamicUniformBuffer<SmaaInfoUniform>;
fn deref(&self) -> &Self::Target { &self.0 }
}Deref, impl ::core::ops::DerefMut for SmaaInfoUniformBuffer {
fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
}DerefMut)]
228pub struct SmaaInfoUniformBuffer(pub DynamicUniformBuffer<SmaaInfoUniform>);
229
230#[derive(impl bevy_ecs::component::Component for SmaaTextures where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component)]
235pub struct SmaaTextures {
236 pub edge_detection_color_texture: CachedTexture,
242
243 pub edge_detection_stencil_texture: CachedTexture,
249
250 pub blend_texture: CachedTexture,
256}
257
258#[derive(impl bevy_ecs::component::Component for SmaaBindGroups where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component)]
263pub struct SmaaBindGroups {
264 pub edge_detection_bind_group: BindGroup,
266 pub blending_weight_calculation_bind_group: BindGroup,
268 pub neighborhood_blending_bind_group: BindGroup,
270}
271
272#[derive(impl bevy_ecs::resource::Resource for SmaaSpecializedRenderPipelines where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, #[automatically_derived]
impl ::core::default::Default for SmaaSpecializedRenderPipelines {
#[inline]
fn default() -> SmaaSpecializedRenderPipelines {
SmaaSpecializedRenderPipelines {
edge_detection: ::core::default::Default::default(),
blending_weight_calculation: ::core::default::Default::default(),
neighborhood_blending: ::core::default::Default::default(),
}
}
}Default)]
277pub struct SmaaSpecializedRenderPipelines {
278 edge_detection: SpecializedRenderPipelines<SmaaEdgeDetectionPipeline>,
280
281 blending_weight_calculation: SpecializedRenderPipelines<SmaaBlendingWeightCalculationPipeline>,
284
285 neighborhood_blending: SpecializedRenderPipelines<SmaaNeighborhoodBlendingPipeline>,
288}
289
290impl Plugin for SmaaPlugin {
291 fn build(&self, app: &mut App) {
292 {
{
let mut embedded =
app.world_mut().resource_mut::<::bevy_asset::io::embedded::EmbeddedAssetRegistry>();
let path =
{
let crate_name =
"bevy_anti_alias::smaa".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/smaa/mod.rs".as_ref(),
"smaa.wgsl".as_ref())
};
let watched_path =
::bevy_asset::io::embedded::watched_path("src/smaa/mod.rs",
"smaa.wgsl");
embedded.insert_asset(watched_path, &path,
b"/**\n * Copyright (C) 2013 Jorge Jimenez (jorge@iryoku.com)\n * Copyright (C) 2013 Jose I. Echevarria (joseignacioechevarria@gmail.com)\n * Copyright (C) 2013 Belen Masia (bmasia@unizar.es)\n * Copyright (C) 2013 Fernando Navarro (fernandn@microsoft.com)\n * Copyright (C) 2013 Diego Gutierrez (diegog@unizar.es)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to\n * do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software. As clarification, there\n * is no requirement that the copyright notice and permission be included in\n * binary distributions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * _______ ___ ___ ___ ___\n * / || \\/ | / \\ / \\\n * | (---- | \\ / | / ^ \\ / ^ \\\n * \\ \\ | |\\/| | / /_\\ \\ / /_\\ \\\n * ----) | | | | | / _____ \\ / _____ \\\n * |_______/ |__| |__| /__/ \\__\\ /__/ \\__\\\n *\n * E N H A N C E D\n * S U B P I X E L M O R P H O L O G I C A L A N T I A L I A S I N G\n *\n * http://www.iryoku.com/smaa/\n *\n * Hi, welcome aboard!\n *\n * Here you\'ll find instructions to get the shader up and running as fast as\n * possible.\n *\n * IMPORTANT NOTICE: when updating, remember to update both this file and the\n * precomputed textures! They may change from version to version.\n *\n * The shader has three passes, chained together as follows:\n *\n * |input|------------------\xef\xbf\xbd\n * v |\n * [ SMAA*EdgeDetection ] |\n * v |\n * |edgesTex| |\n * v |\n * [ SMAABlendingWeightCalculation ] |\n * v |\n * |blendTex| |\n * v |\n * [ SMAANeighborhoodBlending ] <------\xef\xbf\xbd\n * v\n * |output|\n *\n * Note that each [pass] has its own vertex and pixel shader. Remember to use\n * oversized triangles instead of quads to avoid overshading along the\n * diagonal.\n *\n * You\'ve three edge detection methods to choose from: luma, color or depth.\n * They represent different quality/performance and anti-aliasing/sharpness\n * tradeoffs, so our recommendation is for you to choose the one that best\n * suits your particular scenario:\n *\n * - Depth edge detection is usually the fastest but it may miss some edges.\n *\n * - Luma edge detection is usually more expensive than depth edge detection,\n * but catches visible edges that depth edge detection can miss.\n *\n * - Color edge detection is usually the most expensive one but catches\n * chroma-only edges.\n *\n * For quickstarters: just use luma edge detection.\n *\n * The general advice is to not rush the integration process and ensure each\n * step is done correctly (don\'t try to integrate SMAA T2x with predicated edge\n * detection from the start!). Ok then, let\'s go!\n *\n * 1. The first step is to create two RGBA temporal render targets for holding\n * |edgesTex| and |blendTex|.\n *\n * In DX10 or DX11, you can use a RG render target for the edges texture.\n * In the case of NVIDIA GPUs, using RG render targets seems to actually be\n * slower.\n *\n * On the Xbox 360, you can use the same render target for resolving both\n * |edgesTex| and |blendTex|, as they aren\'t needed simultaneously.\n *\n * 2. Both temporal render targets |edgesTex| and |blendTex| must be cleared\n * each frame. Do not forget to clear the alpha channel!\n *\n * 3. The next step is loading the two supporting precalculated textures,\n * \'areaTex\' and \'searchTex\'. You\'ll find them in the \'Textures\' folder as\n * C++ headers, and also as regular DDS files. They\'ll be needed for the\n * \'SMAABlendingWeightCalculation\' pass.\n *\n * If you use the C++ headers, be sure to load them in the format specified\n * inside of them.\n *\n * You can also compress \'areaTex\' and \'searchTex\' using BC5 and BC4\n * respectively, if you have that option in your content processor pipeline.\n * When compressing then, you get a non-perceptible quality decrease, and a\n * marginal performance increase.\n *\n * 4. All samplers must be set to linear filtering and clamp.\n *\n * After you get the technique working, remember that 64-bit inputs have\n * half-rate linear filtering on GCN.\n *\n * If SMAA is applied to 64-bit color buffers, switching to point filtering\n * when accessing them will increase the performance. Search for\n * \'SMAASamplePoint\' to see which textures may benefit from point\n * filtering, and where (which is basically the color input in the edge\n * detection and resolve passes).\n *\n * 5. All texture reads and buffer writes must be non-sRGB, with the exception\n * of the input read and the output write in\n * \'SMAANeighborhoodBlending\' (and only in this pass!). If sRGB reads in\n * this last pass are not possible, the technique will work anyway, but\n * will perform antialiasing in gamma space.\n *\n * IMPORTANT: for best results the input read for the color/luma edge\n * detection should *NOT* be sRGB.\n *\n * 6. Before including SMAA.h you\'ll have to setup the render target metrics,\n * the target and any optional configuration defines. Optionally you can\n * use a preset.\n *\n * You have the following targets available:\n * SMAA_HLSL_3\n * SMAA_HLSL_4\n * SMAA_HLSL_4_1\n * SMAA_GLSL_3 *\n * SMAA_GLSL_4 *\n *\n * * (See SMAA_INCLUDE_VS and SMAA_INCLUDE_PS below).\n *\n * And four presets:\n * SMAA_PRESET_LOW (60% of the quality)\n * SMAA_PRESET_MEDIUM (80% of the quality)\n * SMAA_PRESET_HIGH (95% of the quality)\n * SMAA_PRESET_ULTRA (99% of the quality)\n *\n * For example:\n * #define SMAA_RT_METRICS float4(1.0 / 1280.0, 1.0 / 720.0, 1280.0, 720.0)\n * #define SMAA_HLSL_4\n * #define SMAA_PRESET_HIGH\n * #include \"SMAA.h\"\n *\n * Note that SMAA_RT_METRICS doesn\'t need to be a macro, it can be a\n * uniform variable. The code is designed to minimize the impact of not\n * using a constant value, but it is still better to hardcode it.\n *\n * Depending on how you encoded \'areaTex\' and \'searchTex\', you may have to\n * add (and customize) the following defines before including SMAA.h:\n * #define SMAA_AREATEX_SELECT(sample) sample.rg\n * #define SMAA_SEARCHTEX_SELECT(sample) sample.r\n *\n * If your engine is already using porting macros, you can define\n * SMAA_CUSTOM_SL, and define the porting functions by yourself.\n *\n * 7. Then, you\'ll have to setup the passes as indicated in the scheme above.\n * You can take a look into SMAA.fx, to see how we did it for our demo.\n * Checkout the function wrappers, you may want to copy-paste them!\n *\n * 8. It\'s recommended to validate the produced |edgesTex| and |blendTex|.\n * You can use a screenshot from your engine to compare the |edgesTex|\n * and |blendTex| produced inside of the engine with the results obtained\n * with the reference demo.\n *\n * 9. After you get the last pass to work, it\'s time to optimize. You\'ll have\n * to initialize a stencil buffer in the first pass (discard is already in\n * the code), then mask execution by using it the second pass. The last\n * pass should be executed in all pixels.\n *\n *\n * After this point you can choose to enable predicated thresholding,\n * temporal supersampling and motion blur integration:\n *\n * a) If you want to use predicated thresholding, take a look into\n * SMAA_PREDICATION; you\'ll need to pass an extra texture in the edge\n * detection pass.\n *\n * b) If you want to enable temporal supersampling (SMAA T2x):\n *\n * 1. The first step is to render using subpixel jitters. I won\'t go into\n * detail, but it\'s as simple as moving each vertex position in the\n * vertex shader, you can check how we do it in our DX10 demo.\n *\n * 2. Then, you must setup the temporal resolve. You may want to take a look\n * into SMAAResolve for resolving 2x modes. After you get it working, you\'ll\n * probably see ghosting everywhere. But fear not, you can enable the\n * CryENGINE temporal reprojection by setting the SMAA_REPROJECTION macro.\n * Check out SMAA_DECODE_VELOCITY if your velocity buffer is encoded.\n *\n * 3. The next step is to apply SMAA to each subpixel jittered frame, just as\n * done for 1x.\n *\n * 4. At this point you should already have something usable, but for best\n * results the proper area textures must be set depending on current jitter.\n * For this, the parameter \'subsampleIndices\' of\n * \'SMAABlendingWeightCalculationPS\' must be set as follows, for our T2x\n * mode:\n *\n * @SUBSAMPLE_INDICES\n *\n * | S# | Camera Jitter | subsampleIndices |\n * +----+------------------+---------------------+\n * | 0 | ( 0.25, -0.25) | float4(1, 1, 1, 0) |\n * | 1 | (-0.25, 0.25) | float4(2, 2, 2, 0) |\n *\n * These jitter positions assume a bottom-to-top y axis. S# stands for the\n * sample number.\n *\n * More information about temporal supersampling here:\n * http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf\n *\n * c) If you want to enable spatial multisampling (SMAA S2x):\n *\n * 1. The scene must be rendered using MSAA 2x. The MSAA 2x buffer must be\n * created with:\n * - DX10: see below (*)\n * - DX10.1: D3D10_STANDARD_MULTISAMPLE_PATTERN or\n * - DX11: D3D11_STANDARD_MULTISAMPLE_PATTERN\n *\n * This allows to ensure that the subsample order matches the table in\n * @SUBSAMPLE_INDICES.\n *\n * (*) In the case of DX10, we refer the reader to:\n * - SMAA::detectMSAAOrder and\n * - SMAA::msaaReorder\n *\n * These functions allow to match the standard multisample patterns by\n * detecting the subsample order for a specific GPU, and reordering\n * them appropriately.\n *\n * 2. A shader must be run to output each subsample into a separate buffer\n * (DX10 is required). You can use SMAASeparate for this purpose, or just do\n * it in an existing pass (for example, in the tone mapping pass, which has\n * the advantage of feeding tone mapped subsamples to SMAA, which will yield\n * better results).\n *\n * 3. The full SMAA 1x pipeline must be run for each separated buffer, storing\n * the results in the final buffer. The second run should alpha blend with\n * the existing final buffer using a blending factor of 0.5.\n * \'subsampleIndices\' must be adjusted as in the SMAA T2x case (see point\n * b).\n *\n * d) If you want to enable temporal supersampling on top of SMAA S2x\n * (which actually is SMAA 4x):\n *\n * 1. SMAA 4x consists on temporally jittering SMAA S2x, so the first step is\n * to calculate SMAA S2x for current frame. In this case, \'subsampleIndices\'\n * must be set as follows:\n *\n * | F# | S# | Camera Jitter | Net Jitter | subsampleIndices |\n * +----+----+--------------------+-------------------+----------------------+\n * | 0 | 0 | ( 0.125, 0.125) | ( 0.375, -0.125) | float4(5, 3, 1, 3) |\n * | 0 | 1 | ( 0.125, 0.125) | (-0.125, 0.375) | float4(4, 6, 2, 3) |\n * +----+----+--------------------+-------------------+----------------------+\n * | 1 | 2 | (-0.125, -0.125) | ( 0.125, -0.375) | float4(3, 5, 1, 4) |\n * | 1 | 3 | (-0.125, -0.125) | (-0.375, 0.125) | float4(6, 4, 2, 4) |\n *\n * These jitter positions assume a bottom-to-top y axis. F# stands for the\n * frame number. S# stands for the sample number.\n *\n * 2. After calculating SMAA S2x for current frame (with the new subsample\n * indices), previous frame must be reprojected as in SMAA T2x mode (see\n * point b).\n *\n * e) If motion blur is used, you may want to do the edge detection pass\n * together with motion blur. This has two advantages:\n *\n * 1. Pixels under heavy motion can be omitted from the edge detection process.\n * For these pixels we can just store \"no edge\", as motion blur will take\n * care of them.\n * 2. The center pixel tap is reused.\n *\n * Note that in this case depth testing should be used instead of stenciling,\n * as we have to write all the pixels in the motion blur pass.\n *\n * That\'s it!\n */\n\nstruct SmaaInfo {\n rt_metrics: vec4<f32>,\n}\n\nstruct VertexVaryings {\n clip_coord: vec2<f32>,\n tex_coord: vec2<f32>,\n}\n\nstruct EdgeDetectionVaryings {\n @builtin(position) position: vec4<f32>,\n @location(0) offset_0: vec4<f32>,\n @location(1) offset_1: vec4<f32>,\n @location(2) offset_2: vec4<f32>,\n @location(3) tex_coord: vec2<f32>,\n}\n\nstruct BlendingWeightCalculationVaryings {\n @builtin(position) position: vec4<f32>,\n @location(0) offset_0: vec4<f32>,\n @location(1) offset_1: vec4<f32>,\n @location(2) offset_2: vec4<f32>,\n @location(3) tex_coord: vec2<f32>,\n}\n\nstruct NeighborhoodBlendingVaryings {\n @builtin(position) position: vec4<f32>,\n @location(0) offset: vec4<f32>,\n @location(1) tex_coord: vec2<f32>,\n}\n\n@group(0) @binding(0) var color_texture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> smaa_info: SmaaInfo;\n\n#ifdef SMAA_EDGE_DETECTION\n@group(1) @binding(0) var color_sampler: sampler;\n#endif // SMAA_EDGE_DETECTION\n\n#ifdef SMAA_BLENDING_WEIGHT_CALCULATION\n@group(1) @binding(0) var edges_texture: texture_2d<f32>;\n@group(1) @binding(1) var edges_sampler: sampler;\n@group(1) @binding(2) var search_texture: texture_2d<f32>;\n@group(1) @binding(3) var area_texture: texture_2d<f32>;\n#endif // SMAA_BLENDING_WEIGHT_CALCULATION\n\n#ifdef SMAA_NEIGHBORHOOD_BLENDING\n@group(1) @binding(0) var blend_texture: texture_2d<f32>;\n@group(1) @binding(1) var blend_sampler: sampler;\n#endif // SMAA_NEIGHBORHOOD_BLENDING\n\n//-----------------------------------------------------------------------------\n// SMAA Presets\n\n#ifdef SMAA_PRESET_LOW\nconst SMAA_THRESHOLD: f32 = 0.15;\nconst SMAA_MAX_SEARCH_STEPS: u32 = 4u;\n#define SMAA_DISABLE_DIAG_DETECTION\n#define SMAA_DISABLE_CORNER_DETECTION\n#else ifdef SMAA_PRESET_MEDIUM // SMAA_PRESET_LOW\nconst SMAA_THRESHOLD: f32 = 0.1;\nconst SMAA_MAX_SEARCH_STEPS: u32 = 8u;\n#define SMAA_DISABLE_DIAG_DETECTION\n#define SMAA_DISABLE_CORNER_DETECTION\n#else ifdef SMAA_PRESET_HIGH // SMAA_PRESET_MEDIUM\nconst SMAA_THRESHOLD: f32 = 0.1;\nconst SMAA_MAX_SEARCH_STEPS: u32 = 16u;\nconst SMAA_MAX_SEARCH_STEPS_DIAG: u32 = 8u;\nconst SMAA_CORNER_ROUNDING: u32 = 25u;\n#else ifdef SMAA_PRESET_ULTRA // SMAA_PRESET_HIGH\nconst SMAA_THRESHOLD: f32 = 0.05;\nconst SMAA_MAX_SEARCH_STEPS: u32 = 32u;\nconst SMAA_MAX_SEARCH_STEPS_DIAG: u32 = 16u;\nconst SMAA_CORNER_ROUNDING: u32 = 25u;\n#else // SMAA_PRESET_ULTRA\nconst SMAA_THRESHOLD: f32 = 0.1;\nconst SMAA_MAX_SEARCH_STEPS: u32 = 16u;\nconst SMAA_MAX_SEARCH_STEPS_DIAG: u32 = 8u;\nconst SMAA_CORNER_ROUNDING: u32 = 25u;\n#endif // SMAA_PRESET_ULTRA\n\n//-----------------------------------------------------------------------------\n// Configurable Defines\n\n/**\n * SMAA_THRESHOLD specifies the threshold or sensitivity to edges.\n * Lowering this value you will be able to detect more edges at the expense of\n * performance.\n *\n * Range: [0, 0.5]\n * 0.1 is a reasonable value, and allows to catch most visible edges.\n * 0.05 is a rather overkill value, that allows to catch \'em all.\n *\n * If temporal supersampling is used, 0.2 could be a reasonable value, as low\n * contrast edges are properly filtered by just 2x.\n */\n// (In the WGSL version of this shader, `SMAA_THRESHOLD` is set above, in \"SMAA\n// Presets\".)\n\n/**\n * SMAA_MAX_SEARCH_STEPS specifies the maximum steps performed in the\n * horizontal/vertical pattern searches, at each side of the pixel.\n *\n * In number of pixels, it\'s actually the double. So the maximum line length\n * perfectly handled by, for example 16, is 64 (by perfectly, we meant that\n * longer lines won\'t look as good, but still antialiased).\n *\n * Range: [0, 112]\n */\n// (In the WGSL version of this shader, `SMAA_MAX_SEARCH_STEPS` is set above, in\n// \"SMAA Presets\".)\n\n/**\n * SMAA_MAX_SEARCH_STEPS_DIAG specifies the maximum steps performed in the\n * diagonal pattern searches, at each side of the pixel. In this case we jump\n * one pixel at time, instead of two.\n *\n * Range: [0, 20]\n *\n * On high-end machines it is cheap (between a 0.8x and 0.9x slower for 16 \n * steps), but it can have a significant impact on older machines.\n *\n * Define SMAA_DISABLE_DIAG_DETECTION to disable diagonal processing.\n */\n// (In the WGSL version of this shader, `SMAA_MAX_SEARCH_STEPS_DIAG` is set\n// above, in \"SMAA Presets\".)\n\n/**\n * SMAA_CORNER_ROUNDING specifies how much sharp corners will be rounded.\n *\n * Range: [0, 100]\n *\n * Define SMAA_DISABLE_CORNER_DETECTION to disable corner processing.\n */\n// (In the WGSL version of this shader, `SMAA_CORNER_ROUNDING` is set above, in\n// \"SMAA Presets\".)\n\n/**\n * If there is a neighbor edge that has SMAA_LOCAL_CONTRAST_FACTOR times\n * bigger contrast than current edge, current edge will be discarded.\n *\n * This allows to eliminate spurious crossing edges, and is based on the fact\n * that, if there is too much contrast in a direction, that will hide\n * perceptually contrast in the other neighbors.\n */\nconst SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR: f32 = 2.0;\n\n//-----------------------------------------------------------------------------\n// Non-Configurable Defines\n\nconst SMAA_AREATEX_MAX_DISTANCE: f32 = 16.0;\nconst SMAA_AREATEX_MAX_DISTANCE_DIAG: f32 = 20.0;\nconst SMAA_AREATEX_PIXEL_SIZE: vec2<f32> = (1.0 / vec2<f32>(160.0, 560.0));\nconst SMAA_AREATEX_SUBTEX_SIZE: f32 = (1.0 / 7.0);\nconst SMAA_SEARCHTEX_SIZE: vec2<f32> = vec2(66.0, 33.0);\nconst SMAA_SEARCHTEX_PACKED_SIZE: vec2<f32> = vec2(64.0, 16.0);\n\n#ifndef SMAA_DISABLE_CORNER_DETECTION\nconst SMAA_CORNER_ROUNDING_NORM: f32 = f32(SMAA_CORNER_ROUNDING) / 100.0;\n#endif // SMAA_DISABLE_CORNER_DETECTION\n\n//-----------------------------------------------------------------------------\n// WGSL-Specific Functions\n\n// This vertex shader produces the following, when drawn using indices 0..3:\n//\n// 1 | 0-----x.....2\n// 0 | | s | . \xc2\xb4\n// -1 | x_____x\xc2\xb4\n// -2 | : .\xc2\xb4\n// -3 | 1\xc2\xb4\n// +---------------\n// -1 0 1 2 3\n//\n// The axes are clip-space x and y. The region marked s is the visible region.\n// The digits in the corners of the right-angled triangle are the vertex\n// indices.\n//\n// The top-left has UV 0,0, the bottom-left has 0,2, and the top-right has 2,0.\n// This means that the UV gets interpolated to 1,1 at the bottom-right corner\n// of the clip-space rectangle that is at 1,-1 in clip space.\nfn calculate_vertex_varyings(vertex_index: u32) -> VertexVaryings {\n // See the explanation above for how this works\n let uv = vec2<f32>(f32(vertex_index >> 1u), f32(vertex_index & 1u)) * 2.0;\n let clip_position = vec2<f32>(uv * vec2<f32>(2.0, -2.0) + vec2<f32>(-1.0, 1.0));\n\n return VertexVaryings(clip_position, uv);\n}\n\n//-----------------------------------------------------------------------------\n// Vertex Shaders\n\n#ifdef SMAA_EDGE_DETECTION\n\n/**\n * Edge Detection Vertex Shader\n */\n@vertex\nfn edge_detection_vertex_main(@builtin(vertex_index) vertex_index: u32) -> EdgeDetectionVaryings {\n let varyings = calculate_vertex_varyings(vertex_index);\n\n var edge_detection_varyings = EdgeDetectionVaryings();\n edge_detection_varyings.position = vec4(varyings.clip_coord, 0.0, 1.0);\n edge_detection_varyings.tex_coord = varyings.tex_coord;\n\n edge_detection_varyings.offset_0 = smaa_info.rt_metrics.xyxy * vec4(-1.0, 0.0, 0.0, -1.0) +\n varyings.tex_coord.xyxy;\n edge_detection_varyings.offset_1 = smaa_info.rt_metrics.xyxy * vec4(1.0, 0.0, 0.0, 1.0) +\n varyings.tex_coord.xyxy;\n edge_detection_varyings.offset_2 = smaa_info.rt_metrics.xyxy * vec4(-2.0, 0.0, 0.0, -2.0) +\n varyings.tex_coord.xyxy;\n\n return edge_detection_varyings;\n}\n\n#endif // SMAA_EDGE_DETECTION\n\n#ifdef SMAA_BLENDING_WEIGHT_CALCULATION\n\n/**\n * Blend Weight Calculation Vertex Shader\n */\n@vertex\nfn blending_weight_calculation_vertex_main(@builtin(vertex_index) vertex_index: u32)\n -> BlendingWeightCalculationVaryings {\n let varyings = calculate_vertex_varyings(vertex_index);\n\n var weight_varyings = BlendingWeightCalculationVaryings();\n weight_varyings.position = vec4(varyings.clip_coord, 0.0, 1.0);\n weight_varyings.tex_coord = varyings.tex_coord;\n\n // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n weight_varyings.offset_0 = smaa_info.rt_metrics.xyxy * vec4(-0.25, -0.125, 1.25, -0.125) +\n varyings.tex_coord.xyxy;\n weight_varyings.offset_1 = smaa_info.rt_metrics.xyxy * vec4(-0.125, -0.25, -0.125, 1.25) +\n varyings.tex_coord.xyxy;\n\n // And these for the searches, they indicate the ends of the loops:\n weight_varyings.offset_2 =\n smaa_info.rt_metrics.xxyy * vec4(-2.0, 2.0, -2.0, 2.0) * f32(SMAA_MAX_SEARCH_STEPS) +\n vec4(weight_varyings.offset_0.xz, weight_varyings.offset_1.yw);\n\n return weight_varyings;\n}\n\n#endif // SMAA_BLENDING_WEIGHT_CALCULATION\n\n#ifdef SMAA_NEIGHBORHOOD_BLENDING\n\n/**\n * Neighborhood Blending Vertex Shader\n */\n@vertex\nfn neighborhood_blending_vertex_main(@builtin(vertex_index) vertex_index: u32)\n -> NeighborhoodBlendingVaryings {\n let varyings = calculate_vertex_varyings(vertex_index);\n let offset = smaa_info.rt_metrics.xyxy * vec4(1.0, 0.0, 0.0, 1.0) + varyings.tex_coord.xyxy;\n return NeighborhoodBlendingVaryings(\n vec4(varyings.clip_coord, 0.0, 1.0),\n offset,\n varyings.tex_coord\n );\n}\n\n#endif // SMAA_NEIGHBORHOOD_BLENDING\n\n//-----------------------------------------------------------------------------\n// Edge Detection Pixel Shaders (First Pass)\n\n#ifdef SMAA_EDGE_DETECTION\n\n/**\n * Luma Edge Detection\n *\n * IMPORTANT NOTICE: luma edge detection requires gamma-corrected colors, and\n * thus \'color_texture\' should be a non-sRGB texture.\n */\n@fragment\nfn luma_edge_detection_fragment_main(in: EdgeDetectionVaryings) -> @location(0) vec4<f32> {\n // Calculate the threshold:\n // TODO: Predication.\n let threshold = vec2(SMAA_THRESHOLD);\n\n // Calculate luma:\n let weights = vec3(0.2126, 0.7152, 0.0722);\n let L = dot(textureSample(color_texture, color_sampler, in.tex_coord).rgb, weights);\n\n let Lleft = dot(textureSample(color_texture, color_sampler, in.offset_0.xy).rgb, weights);\n let Ltop = dot(textureSample(color_texture, color_sampler, in.offset_0.zw).rgb, weights);\n\n // We do the usual threshold:\n var delta: vec4<f32> = vec4(abs(L - vec2(Lleft, Ltop)), 0.0, 0.0);\n var edges = step(threshold, delta.xy);\n\n // Then discard if there is no edge:\n if (dot(edges, vec2(1.0)) == 0.0) {\n discard;\n }\n\n // Calculate right and bottom deltas:\n let Lright = dot(textureSample(color_texture, color_sampler, in.offset_1.xy).rgb, weights);\n let Lbottom = dot(textureSample(color_texture, color_sampler, in.offset_1.zw).rgb, weights);\n delta = vec4(delta.xy, abs(L - vec2(Lright, Lbottom)));\n\n // Calculate the maximum delta in the direct neighborhood:\n var max_delta = max(delta.xy, delta.zw);\n\n // Calculate left-left and top-top deltas:\n let Lleftleft = dot(textureSample(color_texture, color_sampler, in.offset_2.xy).rgb, weights);\n let Ltoptop = dot(textureSample(color_texture, color_sampler, in.offset_2.zw).rgb, weights);\n delta = vec4(delta.xy, abs(vec2(Lleft, Ltop) - vec2(Lleftleft, Ltoptop)));\n\n // Calculate the final maximum delta:\n max_delta = max(max_delta.xy, delta.zw);\n let final_delta = max(max_delta.x, max_delta.y);\n\n // Local contrast adaptation:\n edges *= step(vec2(final_delta), SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy);\n\n return vec4(edges, 0.0, 1.0);\n}\n\n#endif // SMAA_EDGE_DETECTION\n\n#ifdef SMAA_BLENDING_WEIGHT_CALCULATION\n\n//-----------------------------------------------------------------------------\n// Diagonal Search Functions\n\n#ifndef SMAA_DISABLE_DIAG_DETECTION\n\n/**\n * Allows to decode two binary values from a bilinear-filtered access.\n */\nfn decode_diag_bilinear_access_2(in_e: vec2<f32>) -> vec2<f32> {\n // Bilinear access for fetching \'e\' have a 0.25 offset, and we are\n // interested in the R and G edges:\n //\n // +---G---+-------+\n // | x o R x |\n // +-------+-------+\n //\n // Then, if one of these edge is enabled:\n // Red: (0.75 * X + 0.25 * 1) => 0.25 or 1.0\n // Green: (0.75 * 1 + 0.25 * X) => 0.75 or 1.0\n //\n // This function will unpack the values (mad + mul + round):\n // wolframalpha.com: round(x * abs(5 * x - 5 * 0.75)) plot 0 to 1\n var e = in_e;\n e.r = e.r * abs(5.0 * e.r - 5.0 * 0.75);\n return round(e);\n}\n\nfn decode_diag_bilinear_access_4(e: vec4<f32>) -> vec4<f32> {\n let e_rb = e.rb * abs(5.0 * e.rb - 5.0 * 0.75);\n return round(vec4(e_rb.x, e.g, e_rb.y, e.a));\n}\n\n/**\n * These functions allows to perform diagonal pattern searches.\n */\nfn search_diag_1(tex_coord: vec2<f32>, dir: vec2<f32>, e: ptr<function, vec2<f32>>) -> vec2<f32> {\n var coord = vec4(tex_coord, -1.0, 1.0);\n let t = vec3(smaa_info.rt_metrics.xy, 1.0);\n while (coord.z < f32(SMAA_MAX_SEARCH_STEPS_DIAG - 1u) && coord.w > 0.9) {\n coord = vec4(t * vec3(dir, 1.0) + coord.xyz, coord.w);\n *e = textureSampleLevel(edges_texture, edges_sampler, coord.xy, 0.0).rg;\n coord.w = dot(*e, vec2(0.5));\n }\n return coord.zw;\n}\n\nfn search_diag_2(tex_coord: vec2<f32>, dir: vec2<f32>, e: ptr<function, vec2<f32>>) -> vec2<f32> {\n var coord = vec4(tex_coord, -1.0, 1.0);\n coord.x += 0.25 * smaa_info.rt_metrics.x; // See @SearchDiag2Optimization\n let t = vec3(smaa_info.rt_metrics.xy, 1.0);\n while (coord.z < f32(SMAA_MAX_SEARCH_STEPS_DIAG - 1u) && coord.w > 0.9) {\n coord = vec4(t * vec3(dir, 1.0) + coord.xyz, coord.w);\n\n // @SearchDiag2Optimization\n // Fetch both edges at once using bilinear filtering:\n *e = textureSampleLevel(edges_texture, edges_sampler, coord.xy, 0.0).rg;\n *e = decode_diag_bilinear_access_2(*e);\n\n // Non-optimized version:\n // e.g = SMAASampleLevelZero(edgesTex, coord.xy).g;\n // e.r = SMAASampleLevelZeroOffset(edgesTex, coord.xy, int2(1, 0)).r;\n\n coord.w = dot(*e, vec2(0.5));\n }\n return coord.zw;\n}\n\n/** \n * Similar to SMAAArea, this calculates the area corresponding to a certain\n * diagonal distance and crossing edges \'e\'.\n */\nfn area_diag(dist: vec2<f32>, e: vec2<f32>, offset: f32) -> vec2<f32> {\n var tex_coord = vec2(SMAA_AREATEX_MAX_DISTANCE_DIAG) * e + dist;\n\n // We do a scale and bias for mapping to texel space:\n tex_coord = SMAA_AREATEX_PIXEL_SIZE * tex_coord + 0.5 * SMAA_AREATEX_PIXEL_SIZE;\n\n // Diagonal areas are on the second half of the texture:\n tex_coord.x += 0.5;\n\n // Move to proper place, according to the subpixel offset:\n tex_coord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n // Do it!\n return textureSampleLevel(area_texture, edges_sampler, tex_coord, 0.0).rg;\n}\n\n/**\n * This searches for diagonal patterns and returns the corresponding weights.\n */\nfn calculate_diag_weights(tex_coord: vec2<f32>, e: vec2<f32>, subsample_indices: vec4<f32>)\n -> vec2<f32> {\n var weights = vec2(0.0, 0.0);\n\n // Search for the line ends:\n var d = vec4(0.0);\n var end = vec2(0.0);\n if (e.r > 0.0) {\n let d_xz = search_diag_1(tex_coord, vec2(-1.0, 1.0), &end);\n d = vec4(d_xz.x, d.y, d_xz.y, d.w);\n d.x += f32(end.y > 0.9);\n } else {\n d = vec4(0.0, d.y, 0.0, d.w);\n }\n let d_yw = search_diag_1(tex_coord, vec2(1.0, -1.0), &end);\n d = vec4(d.x, d_yw.x, d.y, d_yw.y);\n\n if (d.x + d.y > 2.0) { // d.x + d.y + 1 > 3\n // Fetch the crossing edges:\n let coords = vec4(-d.x + 0.25, d.x, d.y, -d.y - 0.25) * smaa_info.rt_metrics.xyxy +\n tex_coord.xyxy;\n var c = vec4(\n textureSampleLevel(edges_texture, edges_sampler, coords.xy, 0.0, vec2(-1, 0)).rg,\n textureSampleLevel(edges_texture, edges_sampler, coords.zw, 0.0, vec2( 1, 0)).rg,\n );\n let c_yxwz = decode_diag_bilinear_access_4(c.xyzw);\n c = c_yxwz.yxwz;\n\n // Non-optimized version:\n // float4 coords = mad(float4(-d.x, d.x, d.y, -d.y), SMAA_RT_METRICS.xyxy, texcoord.xyxy);\n // float4 c;\n // c.x = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-1, 0)).g;\n // c.y = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2( 0, 0)).r;\n // c.z = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1, 0)).g;\n // c.w = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1, -1)).r;\n\n // Merge crossing edges at each side into a single value:\n var cc = vec2(2.0) * c.xz + c.yw;\n\n // Remove the crossing edge if we didn\'t found the end of the line:\n cc = select(cc, vec2(0.0, 0.0), vec2<bool>(step(vec2(0.9), d.zw)));\n\n // Fetch the areas for this line:\n weights += area_diag(d.xy, cc, subsample_indices.z);\n }\n\n // Search for the line ends:\n let d_xz = search_diag_2(tex_coord, vec2(-1.0, -1.0), &end);\n if (textureSampleLevel(edges_texture, edges_sampler, tex_coord, 0.0, vec2(1, 0)).r > 0.0) {\n let d_yw = search_diag_2(tex_coord, vec2(1.0, 1.0), &end);\n d = vec4(d_xz.x, d_yw.x, d_xz.y, d_yw.y);\n d.y += f32(end.y > 0.9);\n } else {\n d = vec4(d_xz.x, 0.0, d_xz.y, 0.0);\n }\n\n if (d.x + d.y > 2.0) { // d.x + d.y + 1 > 3\n // Fetch the crossing edges:\n let coords = vec4(-d.x, -d.x, d.y, d.y) * smaa_info.rt_metrics.xyxy + tex_coord.xyxy;\n let c = vec4(\n textureSampleLevel(edges_texture, edges_sampler, coords.xy, 0.0, vec2(-1, 0)).g,\n textureSampleLevel(edges_texture, edges_sampler, coords.xy, 0.0, vec2( 0, -1)).r,\n textureSampleLevel(edges_texture, edges_sampler, coords.zw, 0.0, vec2( 1, 0)).gr,\n );\n var cc = vec2(2.0) * c.xz + c.yw;\n\n // Remove the crossing edge if we didn\'t found the end of the line:\n cc = select(cc, vec2(0.0, 0.0), vec2<bool>(step(vec2(0.9), d.zw)));\n\n // Fetch the areas for this line:\n weights += area_diag(d.xy, cc, subsample_indices.w).gr;\n }\n\n return weights;\n}\n\n#endif // SMAA_DISABLE_DIAG_DETECTION\n\n//-----------------------------------------------------------------------------\n// Horizontal/Vertical Search Functions\n\n/**\n * This allows to determine how much length should we add in the last step\n * of the searches. It takes the bilinearly interpolated edge (see \n * @PSEUDO_GATHER4), and adds 0, 1 or 2, depending on which edges and\n * crossing edges are active.\n */\nfn search_length(e: vec2<f32>, offset: f32) -> f32 {\n // The texture is flipped vertically, with left and right cases taking half\n // of the space horizontally:\n var scale = SMAA_SEARCHTEX_SIZE * vec2(0.5, -1.0);\n var bias = SMAA_SEARCHTEX_SIZE * vec2(offset, 1.0);\n\n // Scale and bias to access texel centers:\n scale += vec2(-1.0, 1.0);\n bias += vec2( 0.5, -0.5);\n\n // Convert from pixel coordinates to texcoords:\n // (We use SMAA_SEARCHTEX_PACKED_SIZE because the texture is cropped)\n scale *= 1.0 / SMAA_SEARCHTEX_PACKED_SIZE;\n bias *= 1.0 / SMAA_SEARCHTEX_PACKED_SIZE;\n\n // Lookup the search texture:\n return textureSampleLevel(search_texture, edges_sampler, scale * e + bias, 0.0).r;\n}\n\n/**\n * Horizontal/vertical search functions for the 2nd pass.\n */\nfn search_x_left(in_tex_coord: vec2<f32>, end: f32) -> f32 {\n var tex_coord = in_tex_coord;\n\n /**\n * @PSEUDO_GATHER4\n * This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n * sample between edge, thus fetching four edges in a row.\n * Sampling with different offsets in each direction allows to disambiguate\n * which edges are active from the four fetched ones.\n */\n var e = vec2(0.0, 1.0);\n while (tex_coord.x > end &&\n e.g > 0.8281 && // Is there some edge not activated?\n e.r == 0.0) { // Or is there a crossing edge that breaks the line?\n e = textureSampleLevel(edges_texture, edges_sampler, tex_coord, 0.0).rg;\n tex_coord += -vec2(2.0, 0.0) * smaa_info.rt_metrics.xy;\n }\n let offset = -(255.0 / 127.0) * search_length(e, 0.0) + 3.25;\n return smaa_info.rt_metrics.x * offset + tex_coord.x;\n}\n\nfn search_x_right(in_tex_coord: vec2<f32>, end: f32) -> f32 {\n var tex_coord = in_tex_coord;\n\n var e = vec2(0.0, 1.0);\n while (tex_coord.x < end &&\n e.g > 0.8281 && // Is there some edge not activated?\n e.r == 0.0) { // Or is there a crossing edge that breaks the line?\n e = textureSampleLevel(edges_texture, edges_sampler, tex_coord, 0.0).rg;\n tex_coord += vec2(2.0, 0.0) * smaa_info.rt_metrics.xy;\n }\n let offset = -(255.0 / 127.0) * search_length(e, 0.5) + 3.25;\n return -smaa_info.rt_metrics.x * offset + tex_coord.x;\n}\n\nfn search_y_up(in_tex_coord: vec2<f32>, end: f32) -> f32 {\n var tex_coord = in_tex_coord;\n\n var e = vec2(1.0, 0.0);\n while (tex_coord.y > end &&\n e.r > 0.8281 && // Is there some edge not activated?\n e.g == 0.0) { // Or is there a crossing edge that breaks the line?\n e = textureSampleLevel(edges_texture, edges_sampler, tex_coord, 0.0).rg;\n tex_coord += -vec2(0.0, 2.0) * smaa_info.rt_metrics.xy;\n }\n let offset = -(255.0 / 127.0) * search_length(e.gr, 0.0) + 3.25;\n return smaa_info.rt_metrics.y * offset + tex_coord.y;\n}\n\nfn search_y_down(in_tex_coord: vec2<f32>, end: f32) -> f32 {\n var tex_coord = in_tex_coord;\n\n var e = vec2(1.0, 0.0);\n while (tex_coord.y < end &&\n e.r > 0.8281 && // Is there some edge not activated?\n e.g == 0.0) { // Or is there a crossing edge that breaks the line?\n e = textureSampleLevel(edges_texture, edges_sampler, tex_coord, 0.0).rg;\n tex_coord += vec2(0.0, 2.0) * smaa_info.rt_metrics.xy;\n }\n let offset = -(255.0 / 127.0) * search_length(e.gr, 0.5) + 3.25;\n return -smaa_info.rt_metrics.y * offset + tex_coord.y;\n}\n\n/** \n * Ok, we have the distance and both crossing edges. So, what are the areas\n * at each side of current edge?\n */\nfn area(dist: vec2<f32>, e1: f32, e2: f32, offset: f32) -> vec2<f32> {\n // Rounding prevents precision errors of bilinear filtering:\n var tex_coord = SMAA_AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\n\n // We do a scale and bias for mapping to texel space:\n tex_coord = SMAA_AREATEX_PIXEL_SIZE * tex_coord + 0.5 * SMAA_AREATEX_PIXEL_SIZE;\n\n // Move to proper place, according to the subpixel offset:\n tex_coord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n // Do it!\n return textureSampleLevel(area_texture, edges_sampler, tex_coord, 0.0).rg;\n}\n\n//-----------------------------------------------------------------------------\n// Corner Detection Functions\n\nfn detect_horizontal_corner_pattern(weights: vec2<f32>, tex_coord: vec4<f32>, d: vec2<f32>)\n -> vec2<f32> {\n#ifndef SMAA_DISABLE_CORNER_DETECTION\n let left_right = step(d.xy, d.yx);\n var rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * left_right;\n\n rounding /= left_right.x + left_right.y; // Reduce blending for pixels in the center of a line.\n\n var factor = vec2(1.0, 1.0);\n factor.x -= rounding.x *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.xy, 0.0, vec2(0, 1)).r;\n factor.x -= rounding.y *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.zw, 0.0, vec2(1, 1)).r;\n factor.y -= rounding.x *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.xy, 0.0, vec2(0, -2)).r;\n factor.y -= rounding.y *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.zw, 0.0, vec2(1, -2)).r;\n\n return weights * saturate(factor);\n#else // SMAA_DISABLE_CORNER_DETECTION\n return weights;\n#endif // SMAA_DISABLE_CORNER_DETECTION\n}\n\nfn detect_vertical_corner_pattern(weights: vec2<f32>, tex_coord: vec4<f32>, d: vec2<f32>)\n -> vec2<f32> {\n#ifndef SMAA_DISABLE_CORNER_DETECTION\n let left_right = step(d.xy, d.yx);\n var rounding = (1.0 - SMAA_CORNER_ROUNDING_NORM) * left_right;\n\n rounding /= left_right.x + left_right.y;\n\n var factor = vec2(1.0, 1.0);\n factor.x -= rounding.x *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.xy, 0.0, vec2( 1, 0)).g;\n factor.x -= rounding.y *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.zw, 0.0, vec2( 1, 1)).g;\n factor.y -= rounding.x *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.xy, 0.0, vec2(-2, 0)).g;\n factor.y -= rounding.y *\n textureSampleLevel(edges_texture, edges_sampler, tex_coord.zw, 0.0, vec2(-2, 1)).g;\n\n return weights * saturate(factor);\n#else // SMAA_DISABLE_CORNER_DETECTION\n return weights;\n#endif // SMAA_DISABLE_CORNER_DETECTION\n}\n\n//-----------------------------------------------------------------------------\n// Blending Weight Calculation Pixel Shader (Second Pass)\n\n@fragment\nfn blending_weight_calculation_fragment_main(in: BlendingWeightCalculationVaryings)\n -> @location(0) vec4<f32> {\n let subsample_indices = vec4(0.0); // Just pass zero for SMAA 1x, see @SUBSAMPLE_INDICES.\n\n var weights = vec4(0.0);\n\n var e = textureSample(edges_texture, edges_sampler, in.tex_coord).rg;\n\n if (e.g > 0.0) { // Edge at north\n#ifndef SMAA_DISABLE_DIAG_DETECTION\n // Diagonals have both north and west edges, so searching for them in\n // one of the boundaries is enough.\n weights = vec4(calculate_diag_weights(in.tex_coord, e, subsample_indices), weights.ba);\n\n // We give priority to diagonals, so if we find a diagonal we skip \n // horizontal/vertical processing.\n if (weights.r + weights.g != 0.0) {\n return weights;\n }\n#endif // SMAA_DISABLE_DIAG_DETECTION\n\n var d: vec2<f32>;\n\n // Find the distance to the left:\n var coords: vec3<f32>;\n coords.x = search_x_left(in.offset_0.xy, in.offset_2.x);\n // in.offset_1.y = in.tex_coord.y - 0.25 * smaa_info.rt_metrics.y (@CROSSING_OFFSET)\n coords.y = in.offset_1.y;\n d.x = coords.x;\n\n // Now fetch the left crossing edges, two at a time using bilinear\n // filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n // discern what value each edge has:\n let e1 = textureSampleLevel(edges_texture, edges_sampler, coords.xy, 0.0).r;\n\n // Find the distance to the right:\n coords.z = search_x_right(in.offset_0.zw, in.offset_2.y);\n d.y = coords.z;\n\n // We want the distances to be in pixel units (doing this here allow to\n // better interleave arithmetic and memory accesses):\n d = abs(round(smaa_info.rt_metrics.zz * d - in.position.xx));\n\n // SMAAArea below needs a sqrt, as the areas texture is compressed\n // quadratically:\n let sqrt_d = sqrt(d);\n\n // Fetch the right crossing edges:\n let e2 = textureSampleLevel(\n edges_texture, edges_sampler, coords.zy, 0.0, vec2<i32>(1, 0)).r;\n\n // Ok, we know how this pattern looks like, now it is time for getting\n // the actual area:\n weights = vec4(area(sqrt_d, e1, e2, subsample_indices.y), weights.ba);\n\n // Fix corners:\n coords.y = in.tex_coord.y;\n weights = vec4(\n detect_horizontal_corner_pattern(weights.rg, coords.xyzy, d),\n weights.ba\n );\n }\n\n if (e.r > 0.0) { // Edge at west\n var d: vec2<f32>;\n\n // Find the distance to the top:\n var coords: vec3<f32>;\n coords.y = search_y_up(in.offset_1.xy, in.offset_2.z);\n // in.offset_1.x = in.tex_coord.x - 0.25 * smaa_info.rt_metrics.x\n coords.x = in.offset_0.x;\n d.x = coords.y;\n\n // Fetch the top crossing edges:\n let e1 = textureSampleLevel(edges_texture, edges_sampler, coords.xy, 0.0).g;\n\n // Find the distance to the bottom:\n coords.z = search_y_down(in.offset_1.zw, in.offset_2.w);\n d.y = coords.z;\n\n // We want the distances to be in pixel units:\n d = abs(round(smaa_info.rt_metrics.ww * d - in.position.yy));\n\n // SMAAArea below needs a sqrt, as the areas texture is compressed\n // quadratically:\n let sqrt_d = sqrt(d);\n\n // Fetch the bottom crossing edges:\n let e2 = textureSampleLevel(\n edges_texture, edges_sampler, coords.xz, 0.0, vec2<i32>(0, 1)).g;\n\n // Get the area for this direction:\n weights = vec4(weights.rg, area(sqrt_d, e1, e2, subsample_indices.x));\n\n // Fix corners:\n coords.x = in.tex_coord.x;\n weights = vec4(weights.rg, detect_vertical_corner_pattern(weights.ba, coords.xyxz, d));\n }\n\n return weights;\n}\n\n#endif // SMAA_BLENDING_WEIGHT_CALCULATION\n\n#ifdef SMAA_NEIGHBORHOOD_BLENDING\n\n//-----------------------------------------------------------------------------\n// Neighborhood Blending Pixel Shader (Third Pass)\n\n@fragment\nfn neighborhood_blending_fragment_main(in: NeighborhoodBlendingVaryings) -> @location(0) vec4<f32> {\n // Fetch the blending weights for current pixel:\n let a = vec4(\n textureSample(blend_texture, blend_sampler, in.offset.xy).a, // Right\n textureSample(blend_texture, blend_sampler, in.offset.zw).g, // Top\n textureSample(blend_texture, blend_sampler, in.tex_coord).zx, // Bottom / Left\n );\n\n // Is there any blending weight with a value greater than 0.0?\n if (dot(a, vec4(1.0)) < 1.0e-5) {\n let color = textureSampleLevel(color_texture, blend_sampler, in.tex_coord, 0.0);\n // TODO: Reprojection\n return color;\n } else {\n let h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical)\n\n // Calculate the blending offsets:\n var blending_offset = vec4(0.0, a.y, 0.0, a.w);\n var blending_weight = a.yw;\n blending_offset = select(blending_offset, vec4(a.x, 0.0, a.z, 0.0), h);\n blending_weight = select(blending_weight, a.xz, h);\n blending_weight /= dot(blending_weight, vec2(1.0));\n\n // Calculate the texture coordinates:\n let blending_coord =\n blending_offset * vec4(smaa_info.rt_metrics.xy, -smaa_info.rt_metrics.xy) +\n in.tex_coord.xyxy;\n\n // We exploit bilinear filtering to mix current pixel with the chosen\n // neighbor:\n var color = blending_weight.x *\n textureSampleLevel(color_texture, blend_sampler, blending_coord.xy, 0.0);\n color += blending_weight.y *\n textureSampleLevel(color_texture, blend_sampler, blending_coord.zw, 0.0);\n\n // TODO: Reprojection\n\n return color;\n }\n}\n\n#endif // SMAA_NEIGHBORHOOD_BLENDING\n");
}
};embedded_asset!(app, "smaa.wgsl");
294
295 #[cfg(feature = "smaa_luts")]
296 let smaa_luts = {
297 use bevy_asset::RenderAssetUsages;
298 use bevy_image::ImageLoaderSettings;
299
300 {
{
let mut embedded =
app.world_mut().resource_mut::<::bevy_asset::io::embedded::EmbeddedAssetRegistry>();
let path =
{
let crate_name =
"bevy_anti_alias::smaa".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/smaa/mod.rs".as_ref(),
"SMAAAreaLUT.ktx2".as_ref())
};
let watched_path =
::bevy_asset::io::embedded::watched_path("src/smaa/mod.rs",
"SMAAAreaLUT.ktx2");
embedded.insert_asset(watched_path, &path,
b"\xabKTX 20\xbb\r\n\x1a\n\x10\x00\x00\x00\x01\x00\x00\x00\xa0\x00\x00\x000\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00h\x00\x00\x00<\x00\x00\x00\xa4\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00E\x8d\x00\x00\x00\x00\x00\x00\x00\xbc\x02\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x02\x008\x00\x01\x01\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x08\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x000\x00\x00\x00KTXwriter\x00ktx create v4.3.1~1 / libktx v4.3.0~1\x00\x1c\x00\x00\x00KTXwriterScParams\x00--zstd 15\x00(\xb5/\xfd\xa0\x00\xbc\x02\x00\x04\x07\x04\x8e\"\x84\xb5\x0eJ\x10@\x85\xb0\x8d\x01P\xaa\xff$\x94\xea?\t\xa5\xd6\xdd\x14\xeb\xb84\xa5I\x920\x8f\x13\xf2w\t\xb7\xee\xad{\xeb\xdej\x11\x1b\xb3\x1cN/\x87\xd3\xcb@\x91W\x8f\x83\xc73\x89\x90h\xe6W\xad\x02\xf8s\xcdBI#Z\x08i q4)S[\x0e\x04\x0f\x91\x0eAC`\x06\x13\x1d\xbc\x08+\xbc\x00*\xf0\x1cx\x12H\x97O\xfc\xdb\xdb\xf6\x115\xf9\xbf\xd7\xeb:\xf8:\xd6\xc7>\x1fi\xff\xffY\xe8e4d\xf2pB\x83\x17.0\xe0\'0\x82_\xc1G\xbf\xf9\xc0o\xb5n\xef\xf4\xa1o|\xd9\xad\xa2f\xff\x1b6k\\\xab\xcd\xd7\xcd~bA\xaf\xa2|\x03\x10u\x84\xa2\xc5\x87\x10\x80\x18>\x02\"\x18\x82\xbf\xe4k\xbe\xe8I\x00\xe0\x07\xf0\nX\xfd\xebg\x8f\xfb\xde\x0b\xff\xa8\xbbI\xb0x\x0f\x10\x80\x81\x0f\x01\xebq\x7f|\xeb\x8b\x7f\xc5\xc3k\xf0B\xe9Q\xb0]\xf1\x97\xd2\x92\x98\x9c\xce\xacg\x0f\x82\x15\xe9\x1b\x80B\xb7\xd1\x07R\x89\r\x1e\x84/\x01\x86\x0b<\x08^\x05-\xed\x93\xfc\xcc\x1b=\n\x16\x1e\x01\x10H\xed\x7fKF\xbf\xaa\xc2B\x83\xbb\xa9\xe5\xd0z\x88B\xa0\x8fU\x83\xdf\xe0:\xaa\x1e\xd4\xcf)\xe8.*\x81\xa8M\xd4\x19\xd0.R\xa0\xc0{\xc0\xf5|\xf0\xa7|\xcf\x83\xf8\x0e\xecW}\xae{\xe0\x1b3~+\xbd\x95^\x0b\xae\xc6\x86S\xe3\x91\x01\xc5\x88\xf4\r\xae\xa0\x9b\x03\x8a\x0f\xde\x04\x04\xbc\x04\xbe\x03\x9f\x02}\xfa\xe3\x0c\xbf\xe2O`\x80\xe9\xf1\xda\xf3\x94\x0f}\xaa\x8bL\x8e\x06\x87S\xdb\x99\xf9\xc4\x86t\rDbQ(\x14\xce\xb0jV7\xf8\x0e\xd0\x89\xc8$\xa2NAs\xf0\"\xbc\n\x0f\xc3\x06\x1e\x05\xaf\x1f>\x96\xc4\xbfx\x01\xfc\x02\xfe\x01\xa6\xd8\xe3\x8e\xef\xfc\xe9J\xef\x05\x03gc\xcb\x99\xf5\xc4\x8cG\xa2\x8c\r\x9e\xa3\xeaI\xfd\x9c\x86\xee\r#j\x15t\x07/d\xe0O\xf0\xfd\x97\xdf\xf0.\xbe\x85\x8f\xe1\xfe\xd6\xcf\x1e\xe3\x89\xcf|\xe9\x08\x92\\&\x9a\x89\'\xc2\xde\xcb.\x06\x87\xc6\xb3\x0b\xe9\x1a\x84\xc1\xe0\x0f\xe8\xfba\xc8`+/\x17\x1d\x86\x86\xf5\x83\x1a\xea@*Q\xb3\xf8\x10~\x85\x0b\xbc\th!\xcf\xf3)>\x85O\xc0;\xe0\xf4\xf9\xdb\x92\x9f\xa1,\xa6\xb0\xf0`v39\x1b\xdb\x8e,\xe8\xa5\x01\x894\x16\x87\xc0\xe0\xef\xe7\xf3\xd5Lh(3\x95\xfd\x1c\x9bi\xd5\xactT>(\xa1[\x83\xed\x81t\xa2nQ\x80\xa7\xc0\x97\xe0v~\x0e\r@=\xecu_\x14/\xc7eb\xc9\xf0d\xc5\xd7\xc2\x83\xd1\xd1\xdcrf@/\r\xcd\xe6Ry<\x16\x83\xc2_\xaf\x97#\xdf\xca\xb6\x92\xda\t-E\xa6\xb2\xaf\xc0\\\xf4\x98\x9c\xa6u\x83\xf3\xa4\x82N\x19\xec\x0f\xa4\x144\x08\x0fx\x12`\xfc\xf7w\x9e\x83\'\xc03\xe0U?\xfb\xdf/\x7f\xfa\xd7\x17/A\x96!J\x91\xa4\x08\xd2L4\x11\xa2\x00y2\xb9\x1b\x9a\x0f,\x83\x93\xd9d*\x97I\xe5QyL\x1a\x8fE\xe3\x10(\xfc\x01{>\x1d\x89\x8e\x8c+\xd3Td\xe7\x98\xcb+&\xafa\xe9\xa8\x80P\x19L H,\xde\x84\x10\x08\xbf\xfc \x9e\x85W\xc0\xaf\x1e\xf7\xc6\x8f\xbe\xf5;\x9eb\xe6\x98\t\xb2\x14Q\x96\x8d%C\x94\xe0\xd9\xe7\xb2\x9b\xb1\xf1\xc42d<\xa1OhS\xd9T2\x93\xcb\xa3\xd2\x98,\x1e\x87E!\x11\x18\xf4\xfdx<^P\x0c\x1c\xff@|!\xbc\x11\x0c\x92\x1d9g\xbe\x99\xd4Pf\xe7\xdd\xe5%\x93\xdf\xb0|RF&\x11\xa4\x0e~\x00\xef\x01\xfa\x9b\x8f\xf3#\xbc\x01\xf2\xf7\xfd\xf3\xab\x1f\xe5\xc8\xe0\x80v@\xc3O\x8f\xe7\x87S\xdc\x1c3C\x96#I\x92\xa3\xb9x\"<\xfb`t8\xbbQ\x14\x1a}f83\x9c\xd0&\xb4\xf9d:\x97Ne\x13\xc9<*\x8bH\xa21H\xfc\x05y=\x9e1l\xf4(z\x10=\x86\x1f\xc21\x10\xe4\'\xd2\x1b\xe1\x91wf\xdc\x89Me\xd6\x12\x9b\xc9u\xf0\xa2\xbbD}\xc2c\xa0\xfe\xed\x9bx\x17\xf6G\xbe\xf4\xa9]j\xd7;\xfd\x82\xa5\x1c\xd1\x8ehGF\x18\xea\xf1\x14;A\x9a\"K\x12\xa4\t\xf1\xec\x9b\xa9\x15I\xa9\xd1i4c\n\x95B\xa5\xcf\xa83\xda\xcc`f,\xa1J\'\xb2i\\\x12\x91@b\xef\xc7kz\x9b_&x\t^r(;\x92a\xa4\x87\xf1\xa3(&\x82\x08C~$=\xf3\x0e\xe5\xd6\"\xb3\xc9\x87P+\xe8\x06\xd8\x1e\xd0\xcd\xdfr\xad]k\xd7[\xfdV\xbfT0\xb5c\x1a\x96\x8a\xa3!O\xf2\xf2\x1c\x14\x8afT\x9fT\'\xb59]J\x91\x19\xc4\xe7/\xd9\xa3n\xb9\xd3\xae\xd4\x1b\xfdF\xbf\x19`(\xc73\xec\xfc`\x8e\x95\"\xc7\x92aK\xefg\x07\xc0\xf9\xed\xc7f\xb5[\xedv\xcb\xe5z\xb9`\xaf\x07\xd8\xecq\xe4\x81\xb6\xba\xa5n\xa9\xdc\xa9W\n\xce\xf0p\x9a\x91G\xe5-\xb7\x9b\xf5f\xbd\xda\xaf\x16\xac\xe5\xd0\x86\xb7\x1f\\\x10.\x89\x17\x05<\xe3q\x14\x93\xfc\xd6\x0eQKK\x16{:\xdd\xe8\x8f\xb2\x96X\xbe\xba_S\x7f\xb6\xbc\xf7\x87i\xa4tR\xbf`\x04\xb9Df6#[\xc5\xea\x8a2\x1d\xc7\xaa\xba\xa8\xb0\t\xa9\x85\x1e.\xb3\xd0,\xb4\xb6\xdf\xcc~Fh6\x04\x9c\xf3jo?\x1c\x10\xd6\xaa\xe2\xd9\xd4\xf7\x16\xdbz\xc7\xcd\xc7\rn\x8b[\xa5\xf6\x99\x05\xe1\xe0\x12\xb5\xc9\x1cK#l\xa2\xf9\x90\xe9\xbc\xc4mr\xf8\xcba\xf0n\xc2$\xaci\xc5Q\xea\x99\x17j\x85\xe4cXn\xb8Ej\x9d\xd9\x11*\xb6H\x1b\xd2\x8c\xbbR\x7fn\xa4\xbc\xf7\xd86\xa9e\xe8 \xd5\n6\xe3\xd8\t\x9b\xd9\x11\x8e.\xacH\x0b\xdex8\xa0\x8d8;\xeeL\x9c\x8b\xf2\xb0\xcd@,q\x0c\xb85j\x99Y\x8f\xed\x14\x1bS\xf200z8`\x8d(K\xc2\x9c\xae\xe9*\x9b\xe20\x91\xfc\xa0pYG\r\xa3\xfb\xe3\x12\xb7\xcc,\x8f\xa6\xcb\x1f\xde\xde\x16\xaa\xbf\x94;rh\x0b\xd2\x8a\xfbR\xcfh]U\xde;\xa4\xc4\xf2\xf2\x88\x85g\xdd\x1ew\xb8UfI$\r\x14T\xc9\x97\xc7\x95b[\xad\xa7n\x9c\x11k@\x9c\x90v\x8c5]S|{\xa2}\xcc8y\x15\x92\x8b_\x1f{\x98\xc6\xeb\x06\xb7\xc9l*\xa5\xf19X\xc7\x8db\xf1+\xb5\xa9+\xf7\xa3\x8cH\x0b\xe2z\xb7\xe1\x0c\xf9\x82\xb64R\x1d\xb6Ie\x1e\xc3<d\x1d\xb6\xaf\xae\xfb\xdb\x1e\xb5:\xdd\xca\xad\x92\x81\xc5\xe2\x1ax\x955mE]O\x9d\tK\xeeE\x9a\xf0\xd6\xdb\xed|\xb6\xe1\xbe\xcc\xa7\xb8\xf7.\xd7:6J\x89\xaa\x8c\x93\xb0D\\0\x8f\x19\x18\xf7\xedq\x8b+\xe1\xdaw\xd7\x1dj\xa1\xd8nj\xebr\xea\xcb\xd8Q&\xb4\xf9jE\x98\x93\x85=\x85\x90pH10\xf6\x8bI\xca,\x8eu\xd4\xc0;\xee\xd0\xe5C\x06~bM\x1f\xf7W\x9b\xda\xc0\xad\xabi+#o\xbe\x90\xfb\xb0\xe6\xd3\xe9~3d>Uy\x94jfZL+\'\xba\x87\x8c\x03\xe7\x05jiH2)\xa7\x12\x90W\xb8\x89-\x8d\xd8bS\xf8\xe6\xb8\xbd(n*\xab\xba\xe2\xd3\x164_\xc2\x8a\xb3_.\x07\xdc\x99+\xae\x1dS\xe3\xa0x\xd0\xbe\xbc\xad\r\x8bI\x85\x84%\xe6*\xb35\n\xc9\xa4d.\x95K$\xa5\x10\x1b\xc4\xf60ulS\x1a\xf8\x94\xe5\xcc\x91;\x10\x87\x13\xea\xd4\xd3JM\xfdb\x97\xa8FXc\x18\x07\x8e\xfbr\x82\x1aY\x89w/\x11K\xbf\xd4+\xb5J\x9dR\x9b\x90\xcc%rI\xc4\x16\xdb\xe1\xdb{\xc2\xaa\xa6+\xa6\x1e\xb4\xd9\x8c8\x89\x87\x9c\xba\xc5>\x9bJP\xe4\x958\xe6\xd5\xa1o^H*&\xb3\xcac\x87\xc5\xf9\x9b\xb7y\x9a\x9f\xa1e\xe8\x18\xda\x85f\xa1Uj\x94\xbaL\x12)y\xd8\xdc\x9b\x8a\x1be\xb2\x8d\'\n\xeay\x1e\x1b\x17\xd2\xd9TV\x85]\x82vd\x9e\xe5\xc9\xbf\xfd\x13\x07\x0e\xef\xe1;<\x87\x0cFB7\xdf\xe2\xd3\x15\xa9\\\xb1\x89\\J\xa9ch\x9d\'\xfa\xda\x8a\x1aH\x8d\xa6\xef(SBuj\xeb\x8akU_\xd4\xc7=b\xa3\x90`\xe8\x9c\x1f\xf2@j0\x81\xbaa-\xda\xaa\xb6\xb0xW\xc46)\xb9\xe80\x8e\xdepy\xcd\x08\x16i\xca\x9d\xa9\x81oAls\x89\xa5\xc6\xf9\xa1\x1fV\xb8a\x84\xfer\xc0\xa3\xb3\xca\xca\x8aM\xe5\xd2Jm\xf3C\xbelp\xa3\xa8\xa1,\xe6~\x18<\x0c\x1e\x10\x17\xbc\x15i\xc8}\t\xe3\xa6\xc27II\xa5\xaey!\x91W\x07/\x0b\xc4\x127\x92\x1a\xcfk5\'\xb4\x15\x9bz\xd4e]iS\x1cw\x88\x9dR\xcf\xd0B\xadq\x9e\xdb\x0e7\x90\x1a\xce\xe5\xae\x94\xd5\x8a\xb8\xe0\xd0f\x9c)\xf7\xe7\x06\xfeE\x81\xd8&$\x19Z\xe8c\xb6\xdb\xfa\x8e\xbf+iFZ\xf1&\xe4\xf10jG\x19\x13\x96\xe1\xba\xae\xb8)\x0f\x93\xb9\x14C\x07\x81\xdc\xb8\xba-/\x1bl^\xa9\xfa3\xc6D\xd2\x8a\xb6!\x0e\x88\x01\xc4\x11i\xc9\xdd\xa9O[YU\xc7M.\xbd\xd0@\xac\x0f\xd9\xb7\xd6\xc5q1\xb4?lQ\x83y\x9d\x9eN\'j\x8b\xfa\xda\x934\xa3\x8d\x88\x03\xe2\x8a\xb4e,#\xbf\xe2\xde\x93\x88\xddB\xff\xacBZ\xe3W8\xc61\xd3m{\xd9\xe1\xc6\xf2:\xd5\x1f\xf5\x8fm]\xa3\xfa\x13\xd6\xdc\x95\xb3c\x8d\x88\x0b\xeez\xbd]\xf0v\x9c5_\xd3\xd66%\xb6Uj\x1f\x12|$\xdf\xc1\\^V\xb8\x91\xbcJm\xff\xfa\xd4?\x17\xcf\xe2\xd8\xaa\xfe\xdc\x99\xb2$\xad\x88\x13\xeez\xbe\xdd\xd0\x86\xdc\xa1\xb9\x06\x1e\xbeOj\x9e\x95\x93\xd3\t\xaaDE\xb2\x12a\x81t\xc8\xbe\xb6\xeeN\x0b\xc4\"5\xa4\xc0\xcf}\xecU\xff\xaa.\xbe\xc5\xb3,\r\x98s_\xd2\x8e7\xe1nX[\xc2\xa6,\xef\xc9L\xda9\xab\xc8\xf8\x08+\xc4%\xd6=`\x1c4/n\xdb\xc3\x1a5\xa2\xca\x1f\xfe\xee\xf7\xc7\xff\xc5\xf7\xc7\x17\xe7\xe2\xda\xd5F\xcb\xea\x9a\xea\x19\xb1\xa6\x0ci\x1b\xea|>]q\xe6\xcc\xb1)\x91R\x0eL\xe9\xe5lJ)Y\x85\xb8\xc6\xba\xc7\x0e\xaeu1\xb4C\x8d\x0c\xea;\xdf\xf8\xbd\xa7\xfd\xea\x9fl\x1a\xb9\xc5\xa8p\x8a#\xe5\xc5\xb9\xabl\xeb\xea\x9a\xbe\xa0\xfb\xb2V\xd4\xfd~9\xe4N]y\xd863$\x19\xbbe\xc5\xa4r\xa3\x9cLPf\x15y%\xd2\x1a\xeba\xd9\x17\xb7\rn<\xbb\xbf\xf1\xd2W~\xf0m\xcf\xfaO)\xd9\xe5\x90\x1b\x04\xe5\x91\xeaPy\xf1mK#\x9f\xc2\x9c3d\x0e\x08\xc41u\xee-\x13Sz\xb1]l\x16\xd3\xf9N9\x99\xa4\xca\xf8Hk\xfc\n\xd3\xba<l\x13\xe4\xc3\xcf\xfd\xeb?\xbf\xf8\xbaw\xfd\xc7\xd4/\xa4\xd2JI\xc5F\xb1Ml\xb3\x89\xe4\x16A\x89S\x1d\xb8\x97\x85\xcd\xa7;\x13\'\x14\xda\xa88\xcb\x0eN\r\x89\x864S\x92)\xc1\xd8.&\x96[\xe5t\xa2\"\xb3@`\x1d8\xed\xf2\xe4\xcb\x1f\xf2\xe1\xdf>\xf5\x95\xdf\xfb\xd7\xeb\xd094\x0e}S\xdb\xd44\xf5L-C\x82)\xb9\x94Xl\x15\xfb\xe4.\x9fDT\x1e+\xaeN\xb5\x19\x8f{\x19\xe8\x7f\x9e\xee\xe1\xa1wj\x9d\x1b\x92\r\x89\xa6$c\xbf\xdc+\xa8\x93\x95\xc8\x0e.\xd2o\xfb\xe9\x9b|\xcf\x1b=\xcc\xb7\xbc\xca\x97\xbc\xc8w|\xf63^\xf8\xfb\xbf\x11\xedC\xfb\xd4<\xb5\x0e\t\xa7Tc\xc7\x9cVp\x12\xd9F\xb6\x88h\xe8\x85\xe8 \x1a\x88\xfe\xa9{j\x9e\x12\x8ei\x06O\xc1\xa0_\xf8c\xa2\xcfy\x9b\x9fy\x98g\xf9\x93\x1f\xf9\x8e\xd7x\xe5\xdbXJ/$\x99\xda\x86\xde1\xabP-6LI\x87\xfey\xe1\xaf\xfe\xfa2/\xf4@\xef\xf3<\xaf\xf38O\xf3/\xaf\xf2\xe4\xe7\xf8\xe9\xf3\x9e\xc6INVl\x97Z\xe7\x7f\x9e\xe8GZ#g\x18\x1b\x9f\r&?\xfe\xeb\xef\x9e\xe4w\x84>\xe8\x7fj\xde\xe5K\xfe\xfb\xc7\'\x85u\x8f\x9cW\x0b/\x9f\xef\x9c\xa1\x9e\xcfy\x99\'\xf9m\xd1\xd0\x03=\xcf\xd7<Jj5\xa2\x02C\xa2\xf1\x19\x87\xe4 \xf9H\xebd\x8a)\xd1\x90p\xea\x1eZHg$\xf4;o~\r\x1b4d\x18\xfa\x9e\x8fy\x8d\xd7\xe9\'w\n\x0e\xdd\x13\x03\xd1A\xf2\x90\x9c\xc5rS\xf3\xfc\xe9\xf5\xb7=\x90\xfa\xdd\x07\xf9\x93\x9c\x07\xfa\"\x8e\x1c\xe4l\xb7\xdc\x10\xbd\x98dU\xc6K\\l\x19RM\xbdC\x07\xa1\xfe\xf5\xb9\x1f\xbe\xf37>\xfc\xe5oy\x9b\xf7y\xa2\xf0Gk\xcc\nA\x99SH5\xf4\x0b7Q\xb5\x98`J4\xb5\x0e\r\xf4\x1aR\x1f\xfb\xdd\x1b_\xfa\xdc\x0fy\x95\x9fy\x1e\r\xa6\x95\xd2\xcb\xce\x0f\xbd\xc7\xca\xacZ1\xbd\xd83\xa4\x9c\xfaG\xf5\xfb\xf7^\xf9\xd7\x0f\x7f\xc9\xc3|\x976&Q\x99\xa9u\xc2bX\x197\xabPP*1\xa4\x9b\xda\xe73\xe0O\xfb\xe0?\x7f\xfb\"\xcf\xf28\x1f\xf4\x19\xbe\xb1\x0f\x97\xb8\x05\xb2\x12Q\x91Q%7\x8a\xcdR\x8a\xa9s^\xe8q\xb5\x8e\xd9.&\xe3&\xa9\x94\x13\x8b\xe9\xa5dS\xf7\xfc\xeam_|\xeaw\xfc\xc9\xd3\xfc\xcf\x1b\xfd\x06.\x08>\x92*\x9fK0\xf5\xcd\x0b=\x18\xd7q\xe3x\x85\x90\xb0\xcc\xf8\t\xea|\xbb\xd845\x0fm\xc4z\xdd+?\xfb#\xff\xf2=_\x94\xb5bm\xb3\xaf\x0c\x1c\xe3x\x85sV\x08>\x822\xdf)\xb6\x0b\xc9\x86\x0e\xfaol\x0c\x03\xc9E\\\xe4U\x89*\xe5\xb4b\x92!\xe9\xd0EY\xd7\xf7>\xe3;^\xe5s\x9e\xe85\xe8n\xdc\xda\xce\x11\xa2\"\x9fLL,$\x1a\x1a\xe8\x7f\xdd\xdeW\xd7Q\x0b\xcf>v1ye\x92R\xb9aJ84\xd1\xeb\x85\xaf\xf1\xe4\x9ev\xb7\xcdqk\xdd\xd9w\x07\xc3:t\x0f\x97x%\x92*\xdf*\xa5\x18\xfa\xe7\x83\xdc`\xb7\xeb\xeb~w\xe0\x1c\xcdC\xf6\x01+\xe3\'\xa7\x16\xdb\xa6\x1e\xda_\xf9\x1c\xef\xf2@\x9fa#\x88\xcd\xee\xb64\xaf\xec\x0b\xe3\xd0=Zc|\xe4tb\xbf\xd4=\xcf\rr\xbf\x18`\x1d\x07\xae\xc3\x16\x9e\x89c \xfaH\xcb\xac:\x9bfj!\xdbO\xbf\xe4y\xbeh\x03\x88\xa1\xd5mq\\[w\xe6\xdd\xc1z\xb85V\x91\xef\x95z\xe7\x91\xdb\xe2\x96+\xec\x02\xbf<\xb0\x0e\x8c\x0b\xd7>d \xaf\x11\x96\t\xea\x85\x04\x84}\xde\x7f\xbf\xe6\x87\xb2\xc4\x8d\xe1\x86p#\x88\xfda}Y^VW\xeb\xca\xbe\xaf0\x0b\x04uR\xc2y\xadR\x9b\xdc\"\x8d\\\"w\xd8\rv\x7f\xde\x1ex\xc7\x81\xf3\xa0\x89a\xe4\xd5\xd9\xd4\x93}\xfa\x8f\x8f\xf2=J\r\xa5FR\x03\xa9q,j\x0c7\x82\x1b@l\x0f\xbb\xd3\xe2\xb64/\xacc5b\x9a\xf9\x8clF\x16\x9a\x85j\x9fY\xa7\xd6\xa9mj\x99\xdb\xe5V\xb9Mn\x8f\xdbbw\xe8\x05~y\x1c8\xf1^V\xe1\x90^\xe3c\xac\xd8\x8c+\xf4yu6\xaf\xcc\xeb\xf2\x9a\xbc\"5\x8c\x1aC\r\xe0\x06\x0f\x8b\xd3\xee`<\xe5\xabY*\x96:\xcdJ\xb3Rm4\x9b\xa1\x85n\x9f\xdb\xe6V\xf9%z\xecZ\xb0\xff\xa9\xd7\xf8\xa3\x8d*u*\xb5F\xad\x19\xd6\xa7\xb5iUZ\x8bV\xdeQ)\xab\xc5j\xb7\xdcl7\xeb\xc5~\xb3\xe0lGV\x8c\x1d\xc9\xa6`\x8d\xb6\xd9l\xd6\x8a\xb5n\xfc\xeb>%\xc8\xdfK\xaa\xd4\xd7.P\x1f(\x81\xe8\x1d\x90J\xdcC9\x0b\xf1\xffa\xf6\x8d\xbf\x89\xb6Y)\xe0\x84\x9f\xde\xff\xeb\xa6\x9aU\xdb)\xf0@\x03h\x14\xf6\xffg\x9d\x1e(\x83\x14\x88\x18\xdf|\x94\xeacE\x1f\x9c\xc0\x01\xe0\xd7\xfa\x1b}C\xa6\"{\x03\t\xba\x85\n\xdf\xfb`}\xcb\xce1D\x1e\xea\x10\x1d\xb8 \x81\xe1{\xef\xa7\xaax\xb9\x88\xfa\x04\x08+@\xe0\x8b@\x19\xf4\x1d\x94\x8f\x86\x1a\x85\x0b\x14^E\x06\x07\x95\x83\xea\x112\x11}\xf8\xa0\x01\x1f(\xe9\xd5\xdcv!\x98\x91\xbes\xfa)Ag\xf0\x1c\x00 \x86/\x0ey-1A%\x0e\xb5\x07\x07\xe8\x80\x91l\xf2K\xe1\xb9\xcc\xf4\xcc\x82bFz\x8b\x0c^\xa3\xba\x012\r\xd9\x19H\x1cN\x84P\x80\xc7\xb8\x01\x8a\x15\xb5\xc0\xacfp\x1b\xd5\rJ\xe7\xf4c\x12\xb1\x80W\x82\x98\x04Q\x80),\xb8\x1a[\x0e\x91\x8e\xf2:\xablR9\'\x9f[h\x04\xad\x82\x05\x98@!\xc9\x0e\xa6g\'z\xa1\xbcR\xf4\x15V\x0cN\x93\xc2A\xf1\xdcA\xb6Q\x89\x12&\xc0\xfb_\x8a\x95\xe2\xe4\x18\t\"R$\x13\xcb-5C/2\xad<3\xef\xe6\x98\t\x0cE?\xbb\xacdT6(\x9d\xfb\xc7.\"u\xa8O\x04\xe0\x1d\xa0<\"\x81>\x1fo)\x1e#C\x8e\"ea\t\x10\xc5E7s\xcb\x99\t\xbd\xc6\xb7\x10\x9bH\x8d\xc4\xbc\x97\xc0Nt\x15\x17K\xeb\x05\x9fI\xdd\x9czl\"\x92\x07ZE\x02\x98\xc5#\xd1\xb9\xfc\x10#A\x8e!\xc6\x11\"yh\x0e\x9e\xf8\xce\xbc\x97\x9c\r\r\x08\xf6\x81!\xd6\x89uc\x1c\xc8-\xa46B#\xcb\xca\xb1\x92W\x8ak\x85\xf5\xa2\xa2A\xed\x98\x86H\x1f^\xc8\x80\"\x85\xc5\xe0\xf0\xf9}\x82\x9d\xe0&\x07\xb3\x83\x19^z(?\x92\xe3#\x88QdH\x0e\x9a\xf8\xce\xbb\x18[O\xec\x0b\x04\xff8|\x1d\xbc0\x86\xc7\xee#7\xbe\x81\xd4Df${\xf9u\x92\x9fY/)\x1bS\x10I\xc4\x93\x00e>\x93L\xe4\xd2\x98$\"\x85E\xa0p+\xddJ\xa3\xdc\x0c.\xb4\x0b\xed>\xbd\xcf\xaf\xf3\xdb\x0439\x96\xe1\xa4\xc7q\\\x14\x11\x96}g\xae\xb1[\xec\x12\xbdC\xaf\xf0\x0b\xfc\xfe\xc0=\x0e^\xc7\xce\x03\xf7a\x1b\xcfDb\xe5\x1c\x05\x87\xb9{j\x13T\xe8\xf2\x99t\"\x99E\xa5\xf0\xf8\x13R\xa7Xi6\xaa\x8dj3\xb4\x19[\xe8\xd6\xc9mv\x97_$\x07Q\xfcC\xa9e\x9bY\xe62\xab\xcc&\xb5H\xadQ\xbb\x15rw\xe0[\x87L\x9c\x93Q2\xb4\x8b\xaf2\xa7\xc9\xa8\x11*d\xf2\xec\xd7Y\xa9\xd5)U:\x8dN\x9f\xd1%4\xc8\xfc\x99)\x94\xfa\xa4:\xa7M\xe92\x8a|\x12\x97\xbd\xe0\xce\xc2N\xbdQ\x0e(\x08s&\xf8-0w\xc3\xb9/\x17`\x01\x0e\x90\xe0O\x00L\x8a9\xa0_f\xd1&\xd4\xc0\x08T\xb0\xa5\x86|`_3\xa3\x0b\x1c\xf8\x0f\x98\x90\xb3\xba\xc6T9\xc4\xfdX \xc0\x02* \x82sH\xb2\xfb\x8a.g\xc7\xda\x0e\x03\x01\x17\x08A\n\xbe\x05=\xe4\xf2\x9b\xc1\x9d\x8ah\x992$\x8d\xc8\x03\xc1\x93\xe0\x04D\t\x86rM<r\x0e,\x15\x96\x91\xa4\x15o@\x1dF\x0b\x06\x88\x00\x06>\x80\x82gA\x8b\x8aG\x93\x03\xea\xddxY\x9f\xbb\x92\x17\x80\x030\xc0\x02\x1e8\xc1\xb3\xc0\x05%h&\x19+?\x98\x1c\xcf\xae4\xabB\x06\xe7\xdc<\xab__S\x18t_\xce\x8c\xb6\xa0\x0e\x83\x8e\x81\x02\x1dx\x11\xb0\xe0\x87\x12$\x96\x8b\"\xc7\x8e\xa7W\xe5d$\x07\tou\xec\xab\xfa\x8a\xc6\x9a\xb2c-\xa8\xe3\xd5/&\x00\x827A\xcf\x84l\x14A\x8a\x97a\xe77z.w\xe4_dM\x85ga\x00\tx\x06h\x00%X2\x04Qz4\xbf\x19(\xe6\x9cD\xdc\xcd\xb1z\xf5\x05\xdd\x95\xb4a\x8eW\xbf\xa0Q\x18\x00\tnfVR\x80\'A\xf3\x90l\x0cI~0\xc1P-J^\xc2\x91su\x8d\x974\xc6\x9c\x81P\x8bP\x02}\xc2\xa7\xf0\x018\x80\xcc\xce\xe5DX&\x8e\x1c\xc7K\x0e(M\xcc\xd9$\'\xe7!\xe0\\\xabSaNY\x11\xc7\xe3\x80\xe4AM\x02\x00\x10\x90\x81[\xcc\x0b\x06Ko\xc5DH6\x82$\xc3\xce-\x0cK\xaeR\xfe\xc8\xbd\xf9\xc6+c7\xad\xb0]\xbc\xa8KP!\x01\x1f\xf8\x14\xd8\xcc\xe40XP\x80\xe6\xa1\x08\xd2\xa3\xc9\xc5\xb1\x91Y\xc9S\xf2\x92\\$\xf7\xc8\xb7:5\x96\xb4\xf1n\x15&\x15\xa6\rJ-H\x1d\x8c@\x9b@\xa7\x80\x02\x1d\x19\x1d\xcc\xae\xe5$H.\x8e\x97]\x9d\x19\x97\x93p\x8e}5k\xbc\x137\x8a\x14+L,l\rl\x0eJ.H\x1f\xd4!\xd4$\xd0(`\xe0O\xd03\xe3\x99\xed\xd0rnhr1:\x17\xde\xd9g\"\x14A\x1e\xbf\xf7\xb4g=\xe9\xfe\xfcg\xcaQ8~\xb3\xe8\x1f\x9e\x9c\x9a\\F\x85#\x97\xcax\xa8\x12\xa8\x13\x8a\x13\x8a[\xc5\x9d\x81\xa9E\xc9\x03\x92\x08\xb5\t\xb4\x04~\x04A?=\xb2\x9e\x19\x8e\xad\xe66\x93{\xd9\x9d}e\"\xc7\x7f_\x03\x03\x7fYq\xba\xaam\xa5\xfdv\xa5T+\xdb\xb5\xfa\'\n\xf2\xd9\xa11\xe7\xddW/\x04.\x02\x171BE\"U\"e\x02u\x02\x85\xe2\xa4\xe2fa\xda\xc0\xf6\xa0\xf4\xa2^\xc1\x03/\xa3!\x98\x10L((\x06\x14\xf3\xd9}d;\xb3\x1c\x9a\x8d-Fw\xf6\x8d\x1f\xe4\xf9\xc4\xd7\xfd\xebM\xa6\xd7\x99\xd0/\xc6N-\x15\x8aE\x82\x01\x9f\xb6#\xa3\"!\x9df\x87\x96\x87\x0f X!V!V#V$\xf0\x12*\x14\xa9\x15(\x17&\x14\xea\x07\xe4\x1a\xf2\x0cz\x06#\xbdH/z\x11\xbd\x86^B0\xa0X\xcf\x8eSK\xf9\x93\x17y\xf0k\xbc\xf3\x85\x7f{\xd6\xd3\xf8\xef\x95\xd9\x8f\xbe\xf1uu\xcd\x86\x9dX\xf8\xddzZS\xe3q\xdfr\xe1d\xe43s\x06\xe9\xaa\xb0+j\xfe\x8c\xfd\xa0vR8\xaa\x9a\x16\x1a\xf96\xc6\xf8\x00~\x8d\xdc\x94\x1fy\x8e\xe6\x03\x7f\xf6\xa9\x12FU\xfc\xdc\xe3\x0b\x85\xaf\xec\xd7\xe7^\xf8K\xe9\x1fW\x18\x81\x03\x15\xa6\x13!\xf0\x0e\xad#\x9f\x16\x11\xd3G\x16\xaf\xb6\x9e\xb0$MXd\x1a\xcai\xd1ge[\x88N\xfc\x03\x17\xbb\xcc\xec\xef\xfc\xcc\xaf<\xf9;^\xe3\x99\xdf{\xd8\x97p\'\xca\x8b\xfc\xf7\xab\x8f|\x1d\x89f\xcaS)VM{\xdf\x83\xdf\xfa\xca\xe7\xbd\xfe\x00\x08\x01E\x08\x0fE\x1f\x84\xb3R:\x19oqk+\xe3\xa5\xdcp\xf7\xc8\xbcDtb\x1f\x07\xb1k\xf4?\xe6\xf7\xf8V\xfd\xb0\xffQk\x9e\xe5\xcb\x1f~\x8dW\xfe\x8e4\xbb]\xf8\xad\x97\xbc\xf8\xb5\xff\xfc\xdf\xbfR\xdc%P\"p\x99\x94\x90[\xa3\x15\xd5\x97\xb3a-\x02\xe8\xb4S\xb3\x82Q\x89\x99i$\xb81\xafc\xe8]f1\x88\xf9\x93\xffx\x8dG\xfe\xedO\xaa\xd7I\xdf:$3\xde\x95d\'\xd6\xaa4\xfb\xe07\xbf\xe6W\x9e\xe4\xc1\xc3\xdf[\xa0A\xa8=Hq\x9b@\x89Pyh\x1d\x8d\xf8\x0fD;o\xb3B2)\x91\xd8\xe2\xfb\x9b\xda`Iu\xa6\x8c\x98\x13\xba\x7fn\xf0\x99\x15\x98\t\x08FX\xe8UfM<\x08\x9bW\xf9\xb1\xf1\xf7?z\xa1\xc7\xf9\x96\'\x7f\xf7\x9d\xbf+\xed)\x95\xebw\xd6\xff\xa2\xef\xf9\x99O\xf9\xf1c\x1f\xf94\x11\\d`:\xe1A\xc5\x9b\x00\xf1\xf3:4\r\xfdR\xab\x80hqj\xde\xdc\x898Z\x05\x8d\xa2&\xe1A\x83Md\nB\xd9\xcd\xb5\x90\x9d\x07\xf0\x9b\xcc~x#\x97\x17\x19~K\xf54\x8bG\xb1\xe1\x81\xbe\xe6Q>\xfc\x19\xbf\xb3a\xf8=\xb3\xfe\x93\x88y\xfe-\x01\xf4\x08\x1b\x94V\x98P\x9cF\xa8H\x0c\xe1\xb0\x8c\x98\xc2(.nu9\xf7\"\x8eE\x88\xa0\x1b\x15\r\xcb%?\xc3Jh#\xb9\x8f\xdf\x17\xa9\xd5\xa0\xc3\x0b\xfd\xcc\x93_\xe3}o\xd3h\x18D\xf8T\x7fg\xd2Yu\xaf\x03\x14\x19^\xac\x8f\xd1\x82\xc4\xc2Fq\x93H}`\x1d\xad\xf8\x14!x\xfe\x86\x8e\xa9\xcf%\xb3=\xbe\xbf\xaak\x0b\x1a3r\xb0\x82NA\x9b\x00:\xe9\xa4l\xf0\x98\x16\x8b~\"#\xdf\xc6=\xb0Qk\xe2\x8f^\xe7O^\xe3q\xa8\'~\xb4\xdeI\x81\x85\xce\xa3|\xf6w\'\xd6\xfe\xc9\x9f\xfe\x8a\'\xf1\x1b\x9e\xe7K\x93\xd0\x01I\x03[\xc5]\"\x05\xc2\x97\x10\xfa\x9d\xa7\xa1]\xea\x93\x92\xc8\xcd\x91\xc2\xb22`\xc7\x1b\x08,^\x05}\xa2\x16Q\x7f q(e\xb0\x87L?\xa7\x9c\x14\xcd\xca%W\x89\x95k <\x8e\xa2\x16\x85\x16_\xe2\x8b\xbe\xe55^\xbfI?\x17\xf1 \x9c\xd0\xe2M\xcc<\xc7c\xa8P\xbf\x87\xbe\n/R\xec|\xf9\x9b_\xa7\xf0\xa2\xfe\xa0\xe6\xa0\x94\x81\xc9\x04\n\x04\xeb\xe8\x83\rNpx\r\x1f\xf4:\xb4L\xbdR*\xdb\x1f\xa8\xedJ\xfa:\xde>\xf8\x16(\xe8\x11\x19|P8*\x99\x16\xcb\xcbd&\xb2\xeb nOx\x0f~\xc4\xe3\xbc\x86m\x03w>\xe4\x85(B(z\xf3\xf3\xf4\xda\xf8\t0\xc0\x08 \xb6\rpq\x02E\xc2\x87\xb0\xe2Q\x00}\x0e\r\x03r{q\xaa\x9e\xb4\x8d\xc0A\n\xbaD\r\xa2\xe6 t\xf3\xa0l\xf0\x97<e\'\xc1y\x08\xb9\x0b@@\x08\x7f\xf4\x1a\xadV\n\"\xde\xe6G\x1e\x80\x00\x9d:(\xbb\x1b\x10\x03\x0b&\xfe\xfc\xad\xffG\xe1G\xa0?@q\n\xb1:2!\x04\x15?\xe2;|\x86\xf7y\x1b\x9a\x85T\xb6;R\xd7\\i;\x01\x04\r>\x03\xdaD\x1d\"\xe8\xd6I\xcd\xb0V^e\xdb\xc7\x8f\x0b\xc3\xd1\xed\x85\x01\x04\x9c\xff\x00\x01#\xbc\x8e\x8a\n\x81\x07\xb8p\xfed\x05\x0c\xf0\x04P!\x84\xbaEI\xc5=bu\xc4B\x8b\x12F\xdf\xf335Ji|\xca\xb6\x98\xb5\x16^\x85\x0fV\x880\xb2\x7fN7\xaa\x97\xfcd6\xeeu/\xf0\x80\x14\x9e\x04\xda\x03\x12\x0b\x13\t\xfc\x08\x86\x16D\xf8\x0e\x9e\xc5\x9bx\x0f_\xf4;\xf4\x0b\x89\xc4\xe4]=g\x04x\x01\xa0\xf0b\x83\x11Ev\x0f\x8a\x86u\x8e\x8d\xec\xbc\x0eh\xa1\xde\xc0.\xa1:\x8a\x01\x06\x17~\x05\x128x\x14\xff\xe1\x8b\xfe\x86V)\x85UQ\x19\x06\x03\x06\x10\x80\x12>\x84w\xf1+\xbeD\xdd\x81Dd\xdaI\xbd\xe4\xe5\x1b8\x03\x13x\x08$\x80\x857\x81\xf6\xa0\x84\"u\xd4\x80\x04\xb0\xf0\x00\xf8\x11\xbe\x83\xcf\xe0A\xfc\xd0\xcb\xd4$\'k,\x02\x02H\x01\x84\x13\xb4\x07\xd2\x90\xe9\x06O\x91u`\xe0\x010\xbc\xa8W\xa0\x8e*\xe0\x00\x05\x0c\x00\x85\r^\xc4\x0b\xfdJ\x89\xab\xf3\x1e\x10\xc3\x1f\xe0\x0b\xf0/\xbc\n_\xc2{\xf0*\xe8\x0f\xa4\xa0\x1b&\x17\x83\x80\x03\x17x\t\x18\xc0\x85\t\x03\r\\@\x02\r\x80\x01\x05\x12\xefC\x83\xacz\x1c\xc0\x00\x05>\x02\x0b \xc0\x07\xa0\xc5\x8b\xa8{Pd\x13`\xe0%\xf0\x08x\x14j\x0e#\x00\xc1{\x80\x03\xaf\x01\n,\x00\x05\x1b\xfbW\x02\x12\x88\xc0\x03\x1b\xb0\x80\x03^0A\xcf\xb4 \x05\x1e\xf8\x07|\x06)8\x01\t>\x04\x18\x10\xe1\xb7/x\x16\xac@\x05\x9f\x02\x14\xfc\t\xde\x04#\xf8\x10\\\xa0\x83\x11\x95|\xe5ED\n\x0eLx\x15\xde\x05\x07\xfc\x04>\x03\xff\x81e\x06T\x1a\xc2#\xe4A\xc5k\x00\xc2\x00$\xe0\x81/AQ\x98|B\xa9\xd4\x12\x19\x9f\"\xa3\x11o\xe23x!\x06\x0b\xac`)U\xc9Yht\x82\x84>\xa0hA\x02\x0bQ\xea\x87\x88I\x8bM\x11\x88\'\xf1)\\\x98@\x81$\x14\x1c6\xe7\'89\x0f\x91\xcf\x07\xa9\xf8\rFhA\x02@#s\xf9\x8cfL\xa79\xf9|\xf3\xa3\x81\xee!*\xb1B\x02\x8a\xca\xe5\xd3\x99\x01\x9dr\xf5n\xc9\x8aM\xae34S\xdb\x00\x9dpq\x00\xa3\xd2\xa9{\x8c\x98\xc0\xe44=\xf5\x90\x88\n\x14\x8fLe\xb3\t\x85J\xa5_\xa3\x15/0@\xf7\xc4\xec\x8bk\x02\xa0\xedr\x80\x98s\x94\xfc,\xc3\x93\x0b\xb5\xd46>\x1cT\x88\xf0\x82\x04P\x00\x14\n\x8b\xc7\xa3\xb2\xc9\x84>\xa5Q\xab\xc8\xa7\xfc\xcc\xff<\x06.ZX@\x91\xbb\xf3G\x1f\x10\xe0c(\x91\xe4%,5Ay\x86\x92\x0b\x0e\xcd\xa3a\xc4g@\x82\x018\xf0(\x00\x16\x8bG\xe3\xf2\xe9\x8cF\xadP\xf0\x8f\xfc\xca\xdf\xfc\x10\x8b\x15b\x80\x80\xcd\xf8\xfdr\x08\x13P_\xd2\xea[p\x1e6\xc9Uf\xf2\x9c\x1c\xc8N)\xad\x90^n\xe8\x9d\x0e,4\xf0\'0\x12\x8f\xc6$r\xa9t6\xa3\x19\xd5\xef=9\\~\xc7\x84)/\xed\xc70\x8e\x8a\x16V\x8f\xfa\xc7r\xf3o\xde\x91\x8b\xc9+yL~\x93\xfb\xe4F\"&\x93\x92JLMCgx\x0f\x1c\xfc\x08\x17\xf8\x13\x00\x91Ge\xb2\xc9\xcc\x80V\x9f\xe6\xecx\xf3\xc7| \xe1]@\xe1\xb7\xcb\x8e\xd55d\xcb\x03y\xf0+\xbcRoS_\x1b\xaf\xac\xbe\xd5\xbf!y9O\xa9\xc9{>\xee1\x89}\x96\xf1\xd0\x01\x0c?`\xb0\x98D2\x97\xd0gu\x17~\xd3\xc3\xe6\x8d@8\x00~\xa7T\xa7\x96\r#\xd1X\xc0T\xff2\xe7\x1e\x85IaT\x98\xf5u}a\xbb9GI~\xcee\xf2\x9d\xbc\x08\xef\xaa\xc4#&\xb3}\x02\xf3\xe13x\x81\x04H\xe32\xf9tV\x9f\xf4\xaa\x7f\x015\xfe\xe3U~\xe7;\xb0\xe8\x95\xadB\x9dX\xa6\x17\x89\xf6\xbb\xae\x8f\x08\xb8\xfdgKY\xc6\x14\xabsu\xb0H~\x82\x93\x0f\xb5\xb0\xab,\xbe\r\xa3\xc6\xb7\x08\x0bi\xa6\xe8A\xfc\x06\x8fB\x08\x80?\xe00H\x14\x1a\x89\xc9\xa3\x93I\xbdY?S\x8e\xdf\xe5\x85b\xefz\x16\t\xbfQ\xb8)\'\xcd\x9c\x1f\x8e\xa1w{\xdd\xb3\xe4L\xf6\xdc\xa1{4&\x85U_\x1a/\xad\xee\xcd=\xf2\x91\\%\xa7\xc9\x85\xaa-kK\xa3\xb5\xc1\xd2\xe2\\\xfc\xab\xe2H}\xa0@\xee\xb2\x8dr#\xe2?\xf8\xc0/\xf8\x13\x06\x8bBd\x91\x99\x9c\xe6\xa6\x7f\xfaS\x8f\x149\xfa\x16\x0e\x80\xad\xecT\xeav\x95d\x19\x1fb\xc2\x01B\xdd\xd7>v\xfa\xbf\x15mE\x9b\xb1)s\xca\xa0\xbb4F\x85m\xbc\xb6$\xb9K\xfe\xb3?cOX\xc6+\xaaKujnu][X\xd6v\xe5\xc5;R\xe3\x13\x89I\xa5$S\x0b=\t\x0c\xf8\x80\xbe\xe0o\x08,\n\x95\xc6\xe8\xede\xf8\x97n\x1aO~\x9d/\xf1\'\xe0X5~\x9fX\xa5\xbd\xfa(\xaf\xe1\x08|\xde\x0c%\x1c\xe2\x887\xe2\xadx3\xda\x8c\xb6c\rYS\xd2\x983\xa7,c\xa7\xc6\xb0/\x8e\xdc\x9c\xeb$i\xca\xd9r\xc6\x945w\xe7\x0e\x8de\xc0\xa4/\xaa~\xcd\xb3-\xef*\xac\"9\xad\x94|\xe8\x14\xef\x00_\xef\xd7\x03\xf6\x84\xbf\xa30\xe3\xf7\xbc\xd7\xe3_\xff\x9f\x86\'\x1e\x00\xbf\xf7\xb9\xa7\xbd\xfe\xabRJe\xc3\xb2?\xf3*\xfe\x85_\x002\xfbL\xe3o\x07\xdc\x01u\xc0\xa0NX\xc45kRY\xf7u\x16\x0es\xc4\x1c\x11W\xc4\x19\x8f\xb7\xa4Mic\xd6\x9e\xb3\xa8\xcc\x1a\xe3\xea +\x1b[\x04\x0c\x1f\xef\xc7\x13\xf2\x9a\xc8/b\xbc\xeda-\x8do\xf9\x11\xc87\xfa\\\x8f\xdf&\x9d\xe3\x8b\x10\xb0c\xff\xeb$\xce~\xf5\x1f\x14\x1b\x1a\x0eA\xd4$<X\x00\x06\xbe\x03,`\xbe\xf2\x8f?\xd4\xe1p`X\x06\x7f\xf7\xb3g\xd5\'\xd6c\xbcy\x00\xfb\xa3\xb2\xc5\xff=\xees\x1b\xdb\x11/D]b\x05\x08(|\x0bO\x80W\xc0\x05\xa6\xd0w>\x93\xf6\xa8\x7f\xfd\x01\x10m\x12\xbf\xa7B=o\x04\xa4P\xfa\xe1\x0c\xe3\xfb~\xe7\tB24\x89\xedqsUT\x97r\xe6\xf3\xc9\xa6*h\x0eC\xa4\x9f\x92\x8e\x89\xe6\x04\xa3Jq\x91\xf7\x0f\x0c\r\xb6\x10j\xa75c[y\x14\"0 \xfa\xa0\xe7\x81\xa1\xcfu\xd9\xfe\xb8\xb7\xaa\xa8N\xd4\xd1\xa0.68\xd1\x81\xdeP\x1b\xd5B\xa4\x1d\xbb\xe6\xe4\x82\x9f\xe8 8\x0eh\x12\xb5\x07\x92\x06\xd3\x0fn3[\xd1 \xc3\x0f}\xcf\xdb\xd0.\xb5Ii|kW\xccYn\x89\x1a\xa1\x83o\x91\x81\x07z\x03MT\xfb\x94l\xee\x96\x15Y\x06F\xe1\x04\xfd\x81dt\xeb\xc0V:0\xc1R\x87\x986Z\xc1!\n$| D\xc2\xb9WZ\x1f\xbfB\t#h\"\xd6\n\tOTB\x9a\xdeR*\x9c\xf0\x19\xfc\x88?\xa2wJ%O\x00\x16\x7fcB\x89\xcfy\x0c\x05\xc0P\x00\x02\x0c@\x00\x1b\xfc\xd1/#\xdb\xe3~\x94\xf8<\x91\x88\x11\x94\xc6f\xd4\x1a\x1eI\x89\xa1\x85B\xbc\x08V\x8fW\xa9FW\x9c\xd2=)\x9dI.5\r\x9d\xa3\x01\xf2i\x8d\xfa\xa8X\xb0H\xcf\x8cg\xc7\xa5\x18\x9e\x1f\x1a\x91B\xb5\x8a\xa4.\xadK\xe8\xd6\xa3\x8cM\x81\x98HTJ-\xf5L\x90\x08\xa1\x94\xa8\x8c^\xc3=\x90\x96\x95\x03E\xb6MJ\xe7:(%&\xa7R_\x95\xa37\xee\x91\xab\x1fw\x88-D\xa5\xe6x\xc9\x8ckph\xcc\xd0\xf0m{`\x92\x1e\n\x15\x8boU\"\xb6\xb9\xa4B\x82\xa9o\xe8\x9f\rf\xb7\"s\x97|V}\xd9\x9e\xb7\xf7\xd1\x1b\x89=\xf5\xa7\x1e\x15\xdf#vIi\xa5\x96\xa1uV\xfc\x08\xffB\xb5\x8aA\xf5\r\xa7F\xear\n\xb5V\x97\xe3\x98\xe7y#\x14\xad\xa9\x88\rr\'l\xfe\xa0\x1b=n/\xdc\x13\xd9a\xb8\x16\xf7\x8eo\xb2KP\n\r)O(5R\x95\xd3\xa7l\xf8\xcd\xb7\n\x99\xa8]\xbf\xc3d\xc2\x11\x8fAe\xd4g\xe5\xe8\x85\xf4N\x9e\xd4\x96\xc6J\x85$C\xf3|\x06\x17\xae\x1aT\x1c\x0609uV\xa9;\xcc\x88_\xf1\xc2d\"\xa9l\x1f\xcc\xded\xb0\xfag\xd6\x94\xba#\xc6\x91W\xf4\x15\x81\xc4\xe5\xef\x89\xed}{ 7=C\x9f\xb6\xae\x1d\'\x10\x93\xb9\xc4\xd2\xc1\xb3\xa0\xf1\x9a\xed\x86\xd2#\xb5I\xa5\xe2\x1f\xd3\xaa\x10=\x88W\x91\xa2o\x13\xe9\xf6\xc3\xcf \xff\xa0\x80a\x18\x85\xc5 \x12\xc8\xfce\xf8\xae\xbenO\xdc3\xc9\x01qC\\\xb1\xd6\x8cAuin\xed\xb8E\xec\x93\x12\x0c\xdd\xc3\x82\xb5\x8a!\xedM\x83R\xe3\x94I\x9dv_\xde\xe71\xf8\x13/\xf2W\xfdm\x97R\xb87\xa6<\xcek\xe0\xe0\xf6;\x8dY[\xe2\x90\xba^\xf1G\x14&\x81Nm\xcf\xa3W\xb2\x03\xe6\x848\xa2\xadHC\xce\x96\xbb^m\xa5\xc27\x89}\xaem\xe8\x0c+l\xb8\xf6*o\xfa\x93\x12\xa7\xcb\xe9\xf4\xf4\xaf\xe3S\xbf\x83\xc4\x8bZ\xc8\xc3\x84\x981kL\x9brw\xe4\x19}\xc5\xa0\x12\x08\xf5i\xf48zf\xe0\xee\x87\xd1\xc3\xe0\xf9x@]\x107\xbc\x19k\xc8\x19s\x7f\xbe\xa4\xf9\x95\xc5Uy\xdce\xdb\xa5\x06z\x13\x9fBn\xbd\xc2\xae\xb1\xd9\xb4F\xbd\xf5\xa4Bir*\xb5\xe1O\xfaa\xe1\xfb\xdc\xcb\xbe\xf5(R\t\xa5\xf3\x1c\x8c\x1f|\x0c\xd4\xacIc\xda\x967e\x0e\x89q\xf4\x19\x83\xcc\x1f\xd5\xe7\xed\x91sA\x1d\x10\xc3\x87\x01\xd4\rq\xc6Zr\xc6\x8cE\xf5k\x8b\xab\xfa\xb8MJ&l\xe83jm\'\xfdI\x8f\xd2(\xf0wO{\xd7\xdf\xff\xa5\xcf\xcbos|\xe1\xf3\xbe\xf6\xfa\xa7j\xfb\x94\xf1\xf2E\x7fB\x84\xe7+}\x8f\xfb\xfc)s\xd2\x9a\xb5\xe5-\xa9C\xf2\x8c\xc1\xe11\xf8\xfce{#J\x1a\xcdh+\xde\x888\xa1.\x88\xf1\xdb\tsE[r\xe6\x84Q][\xd5\xf8f\xa9\x89\xfe\x05V\xbfZcV\x19\xb56\xc5IyR\xa2\x14\xba\xfc5\x8f\x0f|\xdd\xc7^\xf5\xa6\xfbW~\x1e\xa7P\xf6\xf8\xb5u\xcd\xa3\xcfY\xb3\xc6\xc4%1\x8e@\"2H\xf5\x8d\x9fNf\x92\x86\xb4\x19o\xc4\x9cp\x07\xec\xf5\x82;\xe2M9\x8b\xea\xdaU\x88\xe9\xe6]X\xf7*\x8d\x9a\x93\xfe\xa2\xce\xeag\xd8\xde\xf5\xa4\x7f\xfcu5\xefa\xe3\xab\xb7i\xf8\xf2G\xbf\xc1\xd6\xeacaYX\xd6FK\xa3\xa5\xe1\xba\xba\xacyU\x8fEe\xd0Z3\xa7\xfc\x15\x97?\x8e\xaa\xab\x9aS\xa7\xba\xf4\x15\x856gK[\xf2f\xdc\t}>\xa2\x8e9\xdbh\x95\x90Jx\xb5+\xfd\n\xb3\xce\xa6\xbb\xa8\xd2(\xd3\x99<\xd1\xf7\xb9\xc4\xdf\xfd\xebO%\xe4\xcf\xab\xd8~\x19\xfc\xdd+\xf3\x87\x9f\xeb\xaa\xba*\xae\x06\xac:\x8b\xf2\x98U|\xb5eiY\xda\x96\xb6\x95ma]\x1b\xf9F\x0e\xa3As\xcb\xe0pz\xcbIyUxw\xc5em[\xda\x1c\xbbW\x85Xg\xe9u%\xdeE\xc7\xc6O\x9fY\xfbT\xfd\xae\x87>\xcb\x8bx\xfau\xe6\x90\x8f\xedk$a\x1a\xdb!\x92\x11\x0b!\x1e\\\xe8\x13\xbf\xa6\x0bg\x97\xdf\xd3\xfe\xd0\xaf\xd0\xbd\x8a\x04\xa4\xe3\xbd\xd1/>\x8d\xa4\xe8;kp0!\xc2\x9fP2\xf2!\xff\xf1\x1c\xaf}\xe9\x0b\x7f\xf5\xe7\x07\x01\xe2\xfd+\xadw\xd8\xfe\xc6;\xdfv6!\x11?\xc7g\x1f\xfa\xbcV\xb6Ks\xfa@\x9b\xf0\x01H9\x01y\x8e\xaf\xbe\xee\x7f\xf7g\x13\x91\xf7x\xec\x07\xbf\xb4\x7f\xb9\xfc}\xea\x87Q\xccO\xf2\xe2\xe7\xde\xff\xbfWq~\x88N\xfc\n&o\xfe\x90\xef~\x8f\x94/QF\x864\xec\xdc\xf2\xe7\x9b\xb3JJ\xc9\x93?\xfc\xc9\x97\xbd\xb1D\xaa\xab\\r\xee\x1e\x10.\x9e\x84\x02\xa4x\x9f\xe4\xe8y\x01\xf3Y\xc3\x1f\xf2e\xe7\xd4\xca]\xd5\x9ct\xee\x1e\x13\x90=\xd4\x81\x1e\xf1)Th\x8eq\xbe\xe8C\xdc\xb9\x0f\xbe\xf2\xa5\x8f}\xf0\x8f\x9f|\xde\xb3x\x0b\x8cMQ\xbd\xa1\x0eA\x9f\x10~\xc6{\xbf\xec\xc1\x85\xb3K\xf2&\xe7i\xac\x85\xdd\xa6\xbc\xa9W\t\xfe\xa2\xda1\xfd\xd8B\xa4\x0c\x00XY\xff\xe3\xcf\xaf\xf3\xa2\x86|\xa9\xc8\x97\x8cs\xd2\x1b\xf5z\x9eA\xdd\xdc<D\":\xf8\x13~\x00D?\xe25x\xa1?\xeeZ\xa2\x93\xd2v=K\xce[-\xabT\x90\x07\xd7\xf3\x1e\xfa\x1c\xaf\xb2B\x84\xdd\xb6\x1c\xa2\"\xd5M\xa91-\xacDGia\xbd\xe0\xa8\x9c\xdb\xc7\x1e\"\x1d\xd5$H\xf8\x17\xf4\x07\x8a<\xcdo\xf8\x14\xaa\x971I\x1e\xe5\x04\xa8B\xc5\xb96XY\x957u\x8b\x99_,\x9a\x93\x8e\t\xa8dT\x83\xa0U\xbc\x08\xef\x02\xec\x8d\xcf\r\xfa\x12\xdf\x01\xfe\xb5\x1fz_D\xe5\x9dG\x92bp\n\x94\xeef\xd5=\xd7`e\xf1n\n\x04\'r\xa3\x95a\xf9J\x8c\xaa\xe6\xc4c\x12\"\x1d\xd1&\xfe\x83oa\xf6\xcc\x1b\x0e>\x04\xd6\xe7>\xf9\x1bMeyh\x02T\xa9\x12\x83T\xe0\xf47\xf5My\xb9i5f\xd55ZX\xbc\x8b\xca\x85\xe0Dl3\xf2n\xb6)\xaaC\x04\xe0\xf6\xd5\x0c\xefz\xdfG\x9f\xe3\xcd\x9f\xf2\x1dO\x8f\xa4\xc8\x91L,\x01\xa6T\xa7\xbd)\x8f\xba\xa3\xe6\xa87j\xad*\xb3\xc2\xae.,\xb0\xa3\x17\xe6y\x80\xe4Dn#)9\x0b\x0bFus\x02*a\xa0\x02\xef\xbf\xaf\xf3(\xde\x83\x87}\xf1\xb3O\xf2\'\xff\xe5x&G\x8c\xe5`\n5\x89,\x0e\x81\xd4)\x06UG\xc5Qi\xd5\xdd\x9ao\xac\xb8\xa8\xe2\x10,\xfcu\xf8\xc2=\x0f\x9eX\x17\x92\x13\xb1\x91\xd0\xca\xfb\xc9k\xc5\x05\x83\xe3\xdcC\xa4\x12\x8f\x02\xf1O\xfe\xc3\xb7\xa0=\xb4\xe4\xa7]\xe9\xf3\xa3)^\x86\x1c\xc9B\x14\xab\xb2\x9a\xac&\xa9G#\x95X\x15R{\xd4\x1d\x15W\xa5Ua\xd7\xd6\x16\x95\xf4~\x8f_#\xb8\x08&\x82\x87\x1c\xc1\x0e`\xd8\xf7\xc1\x1b\xefDp#5\xf3\x9e\xa2\xbf\xactL\x1c\xe8\x17\xd1\xf7y\x15\xf4\xf3\x9e\xfb\xe4nW\xfa\x85\x86\x9d\xe2\xa5\x08\xf1dyUZ\x93\xd6\xa3\xd5X%V\x83\xd5_\x95W\xc5Ug\xd7\\\x8bzj\x9dZ\xe7\xb6\xc9\xec.\xbd\xcbo\xf2\x8b\x04\x1f\xc1E\x8ea8\xf8\xe1\x03\xc1\x18\xc1\x99\xc8\\Z?v\x8b\xd2Q\x1d\xfe\xac\xb6\xda\xadz\xa9\xdfiGT\xbc,\xb9J\xa3P\xe6UyM^\x8d\xd7\xe1\xf5w\xd5i\xecZ\xd4T+\xd5J\xb7\x1d\xca\x8f\xe3Hp\xc5\x06b\xf5\xe2[\xbb\xd5v\xb7\x1e\xde\xa3\x14\xd6j\xb3\x9b\xf4\x08\x1e\x85\xb5Yo\xf6\x9b\x05g9\xb2\xe1\xec\x876D[\xde\xbax\x8f\xc8\xc1\x97=\xc8\xeeD\xd6\x8a7 \x14\xfc\xfa+\xe6\xa3\xfe\x88\x0e\xb3\x9d\xc3\xdb\xff\xd7>\x82\x8cz_\x8f\xe2\x80=2R\x84#\xe3;}\x12}\x86\xe4\xb1@\xbfR\xee\x9b\xf0\x7f\xf2\xda[T\x84\xc8\x90\xa5\xb8\x19\x86\x82_\x87IcO\x99\x92f\xbc\x05\x95c\xa6\xc7\x93C\xda}A\xffJ\nY\xcf\xbehb~\xc1\x13\xa2\xb9X>\x8a|<\xad\xff*\'#.Xto\xce\x8eF\x12\xa4\xc8R\xec\xec\x88z\xff\xe5\\\x8e\xe9jZ\x94\xe3f\xd8\x05-\x02\xfd\xdf\xe2ZA1\xc3\xa02em\x98\xd3\xc5\xf0\\z+)\xc1\x93\xa1\x99\xe9\x91\xf1\xadn@\xe2\xc0\x03\x12\x9e\x06\xc5U\xb23i\xc4\x9c\r\x8c\xd0\x84X>\x8e,\xc5P\xb0\x8b\x17t\t\xff41g\x13]\xfb\xa2\xc6\x9c\xb3b\xee\xa5\xc7\xe2[\x01\xa2\x0cK\x8c$I\x10g\x07U\xc5\x06\xa4\x16u\x075=\xc2\xb3\x9c\xe8\x1b\xb0\x0c\xd9\x11w\xbb\xc1\xc5\xec^x-(C3R\xa4\x19\x9e\x9e0\xa50\xa5\xb03\xb0Wh@\xe2\xa0vQ\x7f@\x87@\x93\xf0\xcf\x83c#\xe3\x92\xf2\xa2\xee\xc9\xdb\x8fN\xcd\x86\x83\xb3\xc1\xd1\xe8\x82\'E\x92\xa5XJ\xe2\xb63h\xf1?:3\xae\x98\xb3\x8e\x8d5m@2\x9f\xdaN-\xc7\x86s\xb3\xc9\xd1\xe8dx.\xbe\xb3\xb0\x04\x19\x12M\x85\x10\x81\x1aq\x1aq\"q\x97\xb8M\x98N\x98P\xd8*J,H\x1b\xd4\x1e\xd0/\xfe\x7fxrj\\^\xd2\xda\x0e$\x03\x9a\xf9\xd0vl9\xb7\x9b\xdc\xcc\x0e\xc6w&\x92\xa1\xb6\xba\xf4\xdf\x01\xef\x80{PyP}P}H\x81H\x81@\x85@\x858\x8d\xb8I\x98J\xd8(J+j\x17\x8fB\xd1\x90\x10P\x8fk\x87F\x06+\x82\x11\xc5\x88bC1\xa1]h\x0f\x92\xfd\xcczh<7\x1c\xdd\xcc\xef\xcc,\xd9jW\x8b\xb5:\xc2\x8fTG\xa9#\x14\x06&\x0eu\x06\xaf!\x83\x91\xabh\xe8\xe7\xfc\xca7\xe8\x1a^\x19`\x19bF;Q-(\x98\x9b\xf6R\x08\x8f\x10\x8er\xdd1\xbbV\x97\xc8\xf8\x14!o\\\x95j\x9d`6\x8d\xf44:AB\x9ae\xafP*\xd6\xe9e\xa2\x91>DLZl\x84\xc9e4z\xc7\xdeE\xc2Q\xb9iF2\xa7\xc4\xe0\xb8x\x88\x86\xf6*\x95r\xdd\xb2\x12\xf9|\xf3\xa3\xc1\x05\xacY7\xce:\xed%n\xde-Y\xb1q\xe9\x0c\xcd\xd0\xcf,\xadT)\x98\x9d\x8f\x98\xd0\xf4\xd0\x0f\xbdq\xdd\x04bv\xa1\xb8\xce2<.\xa1sm\xd3\xacY\xacS\x96\xc4U\xc2\xe2\x82q\xd5\x04\xb92\xb8\xe8\x7f:Q\xaa\xad\x89Ke\xc6\x95\xe3\x02z\xb9\xf9$si\xdb\xb5\x1e\xacu>\'\xaf\xb8b\\7.\x1f\x97\x91\x0b\xc4\x161!\xa9\xd44\xcd\xeb|\xf0\xc8\xcch\xb5\xbc\xf7\xdf2\xaajC\xcf~C\\eWJ\x8d\xab\'|\x7f\x84\xd8$\xe7\xda\x85\x96\xa1s^\x89l.3\x9eN\x1d[\"\xe3\xdaq\x15\xb9\xba\xb7\xd8\x06\xb1GJ\xe6\xd2I\xbdR\xc3$\x8fL%\xd49}q?\\\"\xae\x13\x1c\xd7\x90\x0b\xab\xca\xa6\xb6a\xd3\xd8\x16)\x95K(5\x0b=\xf3;\x7f,*\x91\xce\xa6l\xb93\x9f0(,Z\xd55tm\xee\x1aq\xa9\xb8h\\B.\xea\xaa\xaa\x81o\xa4\xb4).\xea{s\xdc\x1f6H\xa9LB\xa9_\xe8\x9b\xef%\x8d\xcde\x91V\x9c\x1dgHYr\xb97\xa1/\xe9F\xbe\xcd\xc3.\x12\x97\x8b\xeb\xc7\xf5t=[\x19\xadhK\xca\xa2\xe2V\xfc\xaa\xc2\xa6\xb6(\xef\xdda\x8fK$$\x15Z\xe6{B 1h\x1c.\x91B\x9b\xd06\xac\rk\xc4\x1a\x91V\xa4\x19g\xc6\xd9Q\x86\x94)wf\xccI\xd5\xb19\x87\xcb\xec\xd2q%cI\x98\xf2\xb5\xd4\x99z3w\xba\xa0\xad\x0c\x96tE\xc5\xaf\xa9\xec\xc9k\n\x97H\xea\x95\x1e\x11\x88$F\x7f8\xe0\xcd\x16\xac\tkC\x1aqV\x94\x1d\xf7d\xac\xf9\x92\xe6]\xd7\xd9%\xa4\ti\xc3\xd9pF\x94\x11\xf7\xe2n\x8c\x1da\xc7WRW\xba\x9a\xad\xe7*\xaa\xb2\x9e\xb8%\x10\xda\xe6E\x08\xf6\x8a\xbf\xe7Nw\x93\xf5^MW\x0ew\xb3\xf1j\xbc\x19O\xc6\x8b\xf1\xf4\xde\xeago\x1f\xe3\xd7K\xaa \xa1\xa2\xedT\x17\xc7\xb6\xa8\xfas\x97\x99\xd4\xc8\xb9\x11\x9e8\x186z\x9b[*]\x97X\xb4\x88\xdc\x1f\xa8\xaf*\xbb\xaa\xba2\x98\x86R(\xb4\xb2\x18\xe8a\xfc6\xb9T\x9a$\x82\xaem\x12\x13\xcc\xe4\x93\xd2\xc1mV30\x95Y\x89\x8dd\x07\xf2\xf3(~\x99\xdci]\xa2\x94z\x91\xa8A\xd4\xb0d\\.\xaf\xf3~R#\xebB|\x1eD\xf0\x92\x8b\x00<E\x8c\x89Mr\x8b7ZR\xfdD\x88#\xa1\xd3\x0f\x8aGu\xb3\xa2i\xc1\xe8+\xb1\x14Z\x197\xc2\xfb\x18r,\xbb\xd3\x18\xe8\xfb\x04\xaa\xa5A\xfdBbQ\xf5f\t\x0fFw\xd0\x0en\xc3\x9aq\xc9Jn$\x18ca\x87\xb2\xb6\xe9\x91;\x9c\xcaY\x98(\xba\x83rp\x9a\x95}\x07\x02\x0c\'\xbbt\t-P\x9cH\xa8>\xd07\xb5i\x8c\xfa\xe2W\x17t7\xe2\\\x8c\xb8\x81P=\xaa\x1b\xd6L\xee\x02S\xa1\x99s\"?\x0f\xa4WJ\xd3\xd4.\xa5\x13[\x85me\xc4\x8e7\x0eH\x1f\x88Z1\xfaYfr\x1b\xe9}\x1c\xbf\xd1\xff\xfc\xc6i\xd6\x938\xb03\xb8M\xa4@\xdc\x1f\xa9-K\x9a\x02D\x89\x83\xbd\xc14t\xfaI\xe5\xacb(52O\\\xfcFm\xf5^r\xdd\xaa\x14]B]b\xd195L\t\xc5\x06AyW\xd4W\xf2F\xb3\xd8p\x0f\xa1|T7\xad\x98\xd7yf\xde\x81\x10\xc1\x19\xff\xd0/\xc6\xec\xd6\t\xa5\"\xb1\x9e\x1e\xa1\xfe\x00\x05*\x04mS\xb3\x94\xcaw\x07~\xd5\x956\x16B\xa03\xa8\x85P<x\x8d\xcbe?\xc1\x85\x089\xa0\xff_\xaba6\xeb\x84\x01[\xc5i\x04=CB\xb1\xc7\xa9\xac\xabiKQ\x8f u\xb05\xdcA)\x1d\x96\xccK\xc5F\x02\x0c?\xff_&\x1ce\xaf\x9e&\xa1\xf6\xa0\xc4\xe2&\xb1\xaa_J$\'o\xebY\xa3U\xd4%H\x1e\xec\x0c\' \xd5\x8d\xabef\xee}8\xff\x9fF\xcaM\xa9\x94\x07h\x11H\x1b\x98J\xe0\x0e\xa0oH*\xa6\xf0*:\xa3Y\xd4\'H\x1f\xec\x0c\xa8\x1e\xd6L\x0ce7n\xfe\x8c\xe4\xbak\x0fl\x14\xaa\t\xd02%\x12\x95U\xd6\xa2NA\x02a2J\xed\xe4-7\x91\xe5\xff\xcbJ\xacSi\xf5\xf4\x8b\xd2\x8aT\xbdr\xe2\xc6V\x00\x81fA\x12a*\xc2md\x01$\x1ad\xc0\x05\xa4\xbf]4\x9d\xf5\x03\x05Zp\xfa\x95\xecm\x18\xefu\xc1\x82\xd2\xa7b\xc1\x0e\x1f\xf8\x15\xd8\x8f\xbf\xaeK\x86\x80\x02V\xee\x88\x04\xa7\xda\xe7^\xac\x81\x9b\t\x86\xd7\xf9\xd6\x03[\xf5\xff\xee\xc2\x80\xfe\xdf\xc1\xe87\x16\xfd\xbf\xa4Ij\x07\xfa\x83\xfbV\xe8_y\x1c\x02\x8d\x1bJ\xfa\x99<\xdc\xcc\x19\xcb\xd0\xad\x9fa<\xbe\xa6\xael\xcf?\x81H`\xb1\x97S\xda\x98\xb2\'L\xba\xadj\x83N\xfcW\x97Ga\xef\xb8\xa39c\xd1\xdcy\x17\x992\xd0\xefc\x12\x7fE\xde1\xa7\xac5w\xa8^emAx\x888\xd4\xff?\xe9\xcfg\xc4@\xde\x96\xb3\xe7+\xf5\x83\x12A\xa3\xf8\xbfB\x97@$\xd1w\xd4%k\xcd\x98\xb4\x955\x86d\xd4\xdc\xb0rvp\x1e\x15\xa9CM\x82\xfe\xef/\xfa\x03&\x83\xc5a\xb0\xc8C\xe2\x98\xb2\xa8\x0b;\x9ey\xd5\xd8\xb8nZ8\xac\x1c\x0f\xf5\x89\xb0/\xeb\xdb\x98:\x81\xca\xa0\x11#Y\x83\xe6\x1bdelF\xafi\xe1\xact\xf0\x93\x90\xad\xe1\xc7>\xac\xef\n\x052\x83\xc7!\xf0\x98k\xc24N\xcc$\xc9/\xb5\xf6B\x83\xa1\xc1\xcc`d0\xb2\x98=&&\x03\x9by\xd1\xe45.\x1b\x16\x0e\xbe\x83\xfa1\x19\x91F\x8c\xf8\xb4\xd4\xdf3\x88$\xfe\x94\xb3j\xf18\x92\x0c\x99\x92L-9\\\xcb\xcd\xe5fs\xa9\xb9\xd0^f/2\x98=\x06&\xa3\xcf\xb4lp\x9d\x9b\xc8\x97\xfdQ\x83\xcb\"/*4\x19\x9a\x18\xc9Q\x93IE\xea\xf10v+\xba\x95\x1cn\xc5\xb62[\x81\xad\xb0n\xde\xc7\xf1\xab2W|\xe7\x9f\xca\t\xb1\x84I\xa7Lw\x8a\x04,\xd5/\rJ\xafo\xca_e\xdf\xa9R\xafg\x97\x8c\xcc\xeb\xb3t\xeaem\x12\r\x87t\x92P\xa8\x92\x10\xe8\xeb\xd5\xd3\x9c2z\xfd:u\xb2}\xbd\x9e\x15OqM\xa5\xd9N\x1al\xde\xa6_\x8f\xaa\x81\xea\x90\xe50\xaao\xba\x83F\xe0\xcf\xd7\xebQW\xd7\xed\xcd\xdf\xa4\xbac\xe94\xec=\xa3-\xaaJ\\B\xa2\xe2\xa4\xbe\xe1\xf2\xeb\x94\xd1\xd7\xc3\xb5)\xef\xd8&\xbbPw_\xec\xf5ZT\\\xa3\\R\xa9_8`\x95HMZ\x9d\xd7\xd7\xe92\x11\xe8\xeb\xe5\x19\xad\xe9\xaa{\xea \xb1PiTa\xf5hm^\x7f/\x95\x1f\xf9\xeb\xf5h\xc5]\t\xb5\xe2\xd8\x14\xf7\xd4a\x12\xa9\xc6\xa6\xb2\x1d\xb0j\xb42\xafO\xea-szh\x84\xd1pG\x9d\x11\xa3\xd8#\xfe\x84\xc2\xe4\xcf\xe9\xeb\xe1\x805\xe1\x8e\x8c-u\xa7+\xa3U\xc57\xc2g\xda\xe6u+\xc6\xf4\xa7\x8c9\xf7\xe5\x0c\x99;\xee\x8a\xbc\"P\xf9\xeb\xed0r>\x1c\xd0\x16\xa4!aL\xfd\xd9\x92\xae\xae)\xee\xeda\x97\xaf\xaf\x18UV\x0bV\x91\xcc\x99\x92\xa6\xb4\xe5\x8c\x18D\x9f\x11\xc8\xec\xdd~\xb8^\x0e\x83\x87\xf3\xdd\x80\xb5\xe1\xcc\xb8\'\xa3\xac\xab\x8akR[\xab\xb0\xea^\xdbQ\x7fUc\xc6\x8b\xa6\xac!oG]\x917\x0c\x06\x8f\xbf\xa7/K#\xd2\x807\x1f\x8e\xa7\xc3\xc0\xd0\xf5p\xbf\x9apV\x8c%ug\x8b\xaa\xda\xde\xe3\x12\xcb\xe7/\x1c\x95W\x1d\xb6\xa8Q\xe8\xeb\ts\xc6\x9a\xfbr\x96\xac!qF\x8c!0\x88\xfcQ{\xe3^,\xb9#w\xe3^\x94\x11gBZ\xd0\xf6\xbb\xf5r\xbb]\xaeg\x0b\xce\x880\xa5+\xaa\xd2\xde!5V\xe3\xb7\xba\xae\xae,kk\xda\x9a\xba\xa4\xaeh\x0e\xd5\x9f\xaff\x8c)K\xd6\x8e9\xe2/\xb8\xf4q\xf4\\\xcf\xdc\xa97u\xa6\xbe|%a\xc8\x98q\'\xca\x843\xa0\xadw\xdb\xedn\xbe\x19Qg\xae6L%_\x02\xdf`i\xb4\xaa\xba\xab*\x8bUmh\xe0\xd7\x95uUeQY\xd2V\xd4\x05\xcd\x9b0\xde\xaf\xda\xc3\xab8u5]MYRV\xb4\x95\xd1\x82\xb6\x9c.f\xbe\xcc\x93/#L(\xf3\xd1t\xb9Y\xb05%\xe5tU\xda\x15v\x95_w\x8dT\x97\xbbEm5R\xd5T4\xc5\xdc{[m\x16\x85\xdd@i\xa0\xac(*j\x8a\x82\xa2\x96\xa9a\xea\xc6\xfb\x94\xb7\xcbEmQZT\xcf\x8c#\x85\xb7\xf2X\xae\x87\xb1\xa3)ob]\x98\xd7\x01\x04\x17\xbdI\xeds\xa7\xa5c\xf0~\xb8\xfd\x99\xab\xe4<\x92\xda\x0eF\x1f\xade\x91\xd7\xcb\xe9\xd4\xd56%/!\xa9}\x91[\'\x06\x1bp\xb0\xab\xab\xb3&\xcc\xd9rn\x1b\xd4\xaa\x85\xb5r\x1b\xeb\x84\xdf\xe3\xd6C\x11\t\xcb\xfa\x841\x898\xe0\xad(cmiZ\xaf\x90\x9c\x07\x98\x1a\xa433+\xb1I8\xb6E\x1f\x8e8[\xbe|`T\xf2\x12\x18M\x04\'.v\x99$N\xaa\xdc\x06\xe5\x06\xb9?P\xaa\x165\xdf\x91\xb4\xa1\x90\x96\x84E[Z\x1c\xdc\x05E7\xc7l \xba\xb0\x0fL\xf4.\xb3&j\x92\x91\xeb\xe6E#[)\x91\x98B\xee\x8f\xd6T\x87\xc6\x963\xe3\r\x88\x81\x11\xb4!c\xa7\x1a\xd5\xab,\x92\x1b~\x97\xda\xe9N\x0bG\xafy\xb1\xbdxvumIu\xe7\x8e\xac\ru\xbd\xdf\xcd\xb8\xdb\xacZZ*z\t\x8c<\x1b\xb9\x89y\x1d\xc1oR+\xfd7\xd1\xa9\x17qT\xf4\x83\xf3\xb0r\xf2\x9a\x8b\x0b\xc9D\xe4\x16gYVW\x06\x8c93\xe2~\xbd\x1cQ\xe6taID=\xf7\xcc\x0b\x8b\xc5\x95\xf22\xef$\xb5\x10]\x18\x08Fn\xa5\xff4\x15\xc9t\x7f\x8a\xcep\x13\xa1\x82T.\x1b\xd8\x0c\x8d\xa69\x9b\xc7\xa7\x8ejM\xb8\xdb\tg\xcc|\x03\x03\"\xd3\xce}\x83\xa2I\xc5\xe0.\xac\x95\xfc\x04F\xa6\x89\xe4>|\xe0#7\xfa)\x92}\x7f\x89{\x08\x05\x84\xf3\xb4p^4>9%6\xf9\xd5\xec\x01m!8\x90\x86~L<.\xad\xb3^\xb2\x93\xdc\xc6<\x8e\"7\xfa\xff\xa9\x92\xd1I(\xe5\xb3\xd2\xc9kd0:\x18\xd2J\t\x05\xe4\xd4\x91\xe2\xae\xae\xaeh,i\x0b\xf6n\xc9\x97FQI\xc8\xe7\xceA\xd1\xa8bV-\xae\x14X\x99\x16\xb2\x0b\x0f\xbb\x19\xff$\xd4\xa3\x00A\xe2P\x84\n\xc2y\\6{L\xee\xa6V\xb1\xcd&\x11\xd6Uw\xce\x88\xbb\x9d\x11f\x05Qw \x11\xd9A\xb6\xcf\xads\xaaa\xc9O\xf6\x11\xdcG\xd0\x0b}T\x89&A\x94\xf2a\xe1\xc0dD\xd0:2$\x92\xdbC\xc5mQa\xca\x9bO(\xa3\x9e\xf8\x12\xf4\x08:\xc4\x90\rd\xe29\xd9\xa8`X+/s\r\xe4\x07v\xfe\xc9~\xfa$\x84\xef\xe838\x154\x0fL\xe9l\x97\xef\x0f\xd5\xd6\x15\x9d\x11}\xb4i\x07\"j\x0fF%!S\xcf\xe9F\x05\xe3J\xd9G0:\x9a\xff\xb4\x07[\x03\xea\xa7ec\xa3{h\x9b\xda\xc56\xb9\xc7*\xad\xce\xd4\xe5\xa0t}D*\xb2\x81N8\xf8\x8bn\x82\xfbP\xfe\xd3+LF\xb8\xce\x8c\x06\xaaoJ,w\xc8jc\x16\\~\xa0\"D\x8dAi\xe8\xd6Y\xb9\xc8F\x8e\xff_:\xfd\x0f\x80fA\x1aq\x13\xc1T\xa8oL%\xad\xe9\x90\x04\xba\x04\x89\xc3\xed\xd3Z\t\xfe\x7f\x9d\xfa?\x00\xcd\x82E\xca\xb9\xa1\xf0/\xe8\x166\x08\xdb\xff\xff\xf8\x04\xa7\xc3\xff\xff\xa3J!\xfe\x84\xdb\xbf\xee\xbb\xaf\xd3`\xb1\x8fF\x87\xe4\x01\xc5\x07\x9f\xa3\xb2\xb0O\xea\xfd^\xa2\x87f\x12\x11\x06\xb4\x88\x0e\xfe\x97\xf9\x1ba\xe2\x0f$\xe8\x8c&)\xac\x15\x1cS\xcf\xd0\x06?\x1d\x07aN5w\x0e\t\xa3J\x9bZ5Z\xa9q\x89\n\x8b\xa5\xc6\xa4c\xffd\xa89\xf4r\xd4\xd9\xd5\xe5a\x9e\xb9mL;6\x10\x89(\xc4\tTj+\xeb\xb1<\t\xa6\xfc\xc8&\xe7U\xcb\x8d\x89\xc7\x0e\xda\x00\xc8\xa3Nu\x13\x97I+e\xc5\x82\xbf\xa4zJC#\x9e\xca\xdb\xe1h\xd3\x17x\\\x12L\x01\xceH`e\xdd\x9c\x9b\xb4PXg\xdcE\x15\x83\xa2\xb9q\xec\x1f\xd2\xabp\xe1\x89\xbai\xb5F\x9d\xbdX%B\x14 -d6\xb2\x93\xc4\xc8\xaf\xb2^\xe2:a\xa9\xacZT1:%\xa1z\x03\xdd\xc2\x17\xa7\xd2\xa0\x8f\xba\x9b\xceZY|l\x1e\xa2\x00o\x1e\xb6\x99\xc8\xcb\x9c\x97\xb4PV,4\xa6\x1d\x12\x11\r\xe29\xf8\x00|\xd5H\xa5Zs\xec\xaa\x1b^*A\x90\xc4\x13\xe0\x0e\xe7a\xfb\xa8\x8dg!;\t\x8c\xac\x9b]\'\xab\xb3\n\xe6Tc\xfb\xd4\x1b>\x03e\xb5(\x9c\x02y\xd4\x1au\xb7\xea\x1b,.\xb8\xd9\xc1\xfc\x081\t\x82\x7f`\x8c\x0e]\xb8&\xa6\x81\xec#\xb0r^\xc2JQ\xb9\x9clJB\xf4\x88&u\x1a\xec\xe1\xa6\xd1.\x87\xb3\x83\xe9\xb1\x14\'E\x8c%\xc1\xa0\xf7\xf7\xf5\xe9:r\xe1\x9b\x07m\xbc\x87\xbc\xc8\xae\x13\xbc\xe5\xc6!\x1d=\xa9O\xea\x92\xaa<J\x8dB\xde4G\x9dYs\xad\xb5:\xd5n\xa5\xd0\xefs)F\x92\x85\xda\xa4v;\xdc\x06\xb9\xc0\xae\xcf\xcb\xfb\xee8\xf6\x10\x9d\xbcZ1\xed\xd0\x1a\xbc\xd4J\xcd\xa0B\xa7\xd0\xe9s\xead&\x87\xbb\xe9\x8e\xb5n\xa1\\\xa7w\xf9Qtf\x9b\xc9,R{\xd4\x16\xb5Cmp\xeb\xe3bxq`\xd9G\xcblox\xeb\x95*\x9dF\xa5P\xa93\xaa\x8c\n\xad\xf7\'\xab\xd3jt\xba\x8cB\xab\xcfj\xf3\x18\r.m(\xac\xb5k\xf5Z\xc1\xd5\x8e\xaaxZ\x8e\xfe0\xffe@e7\xd5\x81E\xb8y]\xbd\x8b\x14\x96P\xa3\xcb\xca\xc2zhQ\x82\xd1G\xd3\xa5.\x0c:\x08@rY\xcdp\x82\x01\xa8\xc9\xe0\x90\xb5q\x17m\xf8\xc0\xc1\t/lk\xcc\x8c\x9c\x9b:u\x10Q\x930@\x93\xc8\xc3!m\xca\xd9\xd0m\x97\xa0S\x8c\xf03\xfa\x8a\x18F\x1d\xd2um\x01\x8c\xc48\xe6\x90\xb6\xa5\xcc\t\x8b\xba\xac(Zt\xa3]\xa9\xb6:]\x02\x93\xbd\xe2\xeexS\xd2\xf2\xeaj\x8b\xc2{4\x88`\x1e\x83\xc4\x1f\x91g\xcc!k\xcb\xfd\xa9SYZ\xd4\tz\x04\x90\'\xd8*\xf5e4\x85C\x1f\x11\xe3xK\xce\x9a/)+\x8bj\xe5\xf8\x14\xdd\x19\x9e\x03\x02$=\xb6W\xe8\xf2\x87\xf4\x15u\xc8\x9a\x8b\x07\'\"\x850\x86H\xb3]\r_5\xca\xfc%\x81E\x9e\x11\x97\x94A_67yK\x87\xf5\xa3\nB\r\x9d\x8cD\xb4\x10\x00Iq\xc4\xf9\xddn\xf4\xac\x19>\xe7O\t4b\x1ck\xcd\x9a\xd7MNk\x87\x05\x94\x12B\x15\x91\xa8W\x0c\xcd#c\x0f0\x17\xdb\xbbB}\xcc\xdf1\x08$\xe6\x94\xb0jj\xa7\x89\xdd\xe88y\x8eK\xa7\xc5\xb3\xf2\xc1\x83RD\'\x9a\\<z4\xc1\xd0\xad\x8cd\x02\x9aL)\xfa\xb8\xf1\xdf\xf1G/\xfc\xd5\xf64\x9e?d\xf0W\x9cES\xb5\x18Z\x0cMf6#\x9b\x91\xd1\xec5\xb1\x1a\x98\xcd\x0b\'\xd7q\xf1\xb0|p!\x94\x06\xd3\x07\x12\x8bW\xa1Hb\x1c9v8\xb9/\xdc\xe9\x14Mu\x9bT9&\xd7L&\x11\x01\xf1\xf0\xf6\xb2=\xaao\xf9\xe31S\xb9\x97\xdc\x0b\xee\x05\x07\x83\xbb\xc1\xd8bl15\x19\xda\xcc\x8cFV\xb3\xdb\xc0p\xf4\x9d\xd6\x0fnt\x8f\xa0K(\x19\x8a\x97\xdfa\n\xfc!\xb5\xd4m\x1f?\xda\xb1\x92\x82rb\xd2+!\x8f\xab\xbd\x9d\xd7\x82\xe1\xb2s\xd9\xbd\xec^t0\xb9\x18\x9c\x0cn\xc6f3\xd3\x81\x11\xb1X\xf8T~)(@\x93`\x89\x90L\x147a\x7f\"\xe5\xa4\xb6\xd4\xa9\xc4\xc3\xbf\'\x87\xeb\xf1v\xbf\x1b\x91\x96\x8c=]\xd5\x92W.i\xbd\xdf\xe3\xc9\xd3 \x8a\xa4\xbf\xee\xb7z\xa0\x98Z\xb5\xd9\xc3\ti\xc8\xdd\x99S\xf1\x17\xdce\xb5B\xc6\x85w\x1d>\xf0\xf8\xc1\xfa\x97To\x03\x9ft\xff\xfa\xce\x1f>\xee]%T\xaa\x8e\x91\x9b\xad7z\xcd\xec1\xb4\x97\x14\x96\xda\x8a.\x8b5`\x0e\x83\x97\x0b\xd2\x8c{\x13\xb5\xcaKt\x12\xda\xf8\xe6\xa1\xeb\xe8\x81\x85\xdc\xe3I8\x9a;C\x8c\x9f{\x97}R\x119\x1ek\xc4`CP\xca\xe6E\x13\x8b\xa1\xc1\xe0\xb8*\xac\x13&\xc4\xf9x:\xa0\xad\xb83\xf5\xe9jk\xbaia\xa9\x84\xd8<r]\xa3\xb6\x99]\xf9\x12d\x8b\xf4\xb2/\xfe\xb5\xe4\xdcM\xfe\xee]\xa6\x9b\x955{}\xf0\x9a\x98\xcc\x0c\xe6\xd6\x82\xb1bmM[O\xe4\x8ch\xf3\xdd\x88\xb2\xa5.%\xef#41.\x8c\xd1\xf1\xf3\x16\xb7\xcc\xec\xf3\xa8<\x89\xee\xf1\x13\xd4Fe\xe3\x99\xcf{\xd7mz}\xf0\xa9)_\xd6\x02\x1f\xf6<\xb8\x0e\x0bv\xfb\xb89P\xde\xd4V%\xcd\x9f\xbar/\xd2\x828\x1e\x0f\'\x9c%_Q\x96\xd6\xf6\xc9\x81Q\xb9\xb8J\xf4r\x8cd\x06b\xf3}\x89F6\'?~-\xca\xf5DZ\xe8&%\xe3\x7f\xef:-\xdf\xfb\xe4Gy\x9c\x8f\xf9\xf3\x93\x18\x7f\xf6\xa4\x1c\x97\x0c\x86l\xda\xc0\xa9\xcd\xd8\xcd\x87\xa1\x0b\xd2\x90\xb0\x8c\x96\xf6\xdc2\xc9\xcd\"\xb5\x8f\\\xb8\x07\x1en\x97\xd9\x07\xe1\xf36\xdf\x87\xbe\xeeK\xb5\x97>\x08\xbd\xd3\xe1\xe7q\x1e\xe6O\xfe\xe3\xad?|W\xaa\xee\xfd\x15h\xe6U^\xe4\xb9\xdf\xfcPw0j\xdd\xe84{\x8c\xcd\x05c\xa5N)\x9d\x90|hq\x8d\xd5\xb4\x05\xd5\x97@\x1d\xc6\xcff\x8cA[\xd9\x9aS\xcb*\xa5e\xa2\x97a$\xb3\xf1-\xcc\xe3@\x81\x81\xcd\x9f_\xfc\xd4\xd7\xd5/\xacW2\xd0)\x7f\xf7\x91\xefb}\xf2=\xbe\xe4\x89\xbe\xe7i^\xa5\xfa\xf4\x89\x10\x1a|\xf0\x1d\x16N^\x13\x8b\xa9\x91PJ!\xde+K\x9a;a\xc8\xd9\x10\xd7\xeb\xdd\x88\xbb\xb3\x85\xfd\xb1yL87\x0b\xebE\xdeCj\x1e\xba\x0e \x17\x99=\xf1\xa1\xe6M>\xfb\xba\xd5W?D\xf9\xad\xffj\x80\xa2\x08\xe4\xa1\xef\x92=\xf6G\xfe7|\xd0\xdf|\n1\xc5\xa3\x10qT\xf4\xa3\xe2Y\xe5\xb8j`24\x97\xddJ\xc9D\xc4\x16gu\xe6n\xac\xfdv9\xa1\xac\xe92\xea1\xe5\x98j\xee\x19TL\xea\x05?\x9ba$4q\xae\xc3\xd7=jYxx\xa2\x9fy\x8f\xd7\xe9\xbe\xfb;\xbf\xf2\xdf\xf7\x1d\x1d\xfd\xcf\xb3\xbc\x96\xd6\x83\x0f~\x17\x19\xa24\x8a\x11\x19\x82Z6\xaf\x99\xd9\xcbn\x85\xe6l.\x8d\xd8\xe3n\n\xfbJ\xce\x84\xb9\x1dp\xb6\xcc7\xe8#\xdb\xc7\xd61\xd9\xb8\xacTZ%:y\x07\xb1\x85y\xde\xa2\xd6E\x89\xf3\xefz$\x0f+\xef\xa1b\xe8\xcb\xa5}H\x87\xe0\xb3\xfa?A\x97\x08Q\x02J\xf1\xacpr\x1a\xd9\x8bn%g\x86\xa5\xa4D\xb6A\xee\x8e\x137\xb5\xb1\x92\xe6\xccX\xd1\xd6\xeb\xd9\x92\xb9F\x07\x1a\x83z\xe8\xc7\xde1\xdd\xdc4\xa8\x18U\xcb\n\xc5e\x86\x8d\xd0<v\xdf\xa1\x16\xc4\x9f\xf3%\t\x97?!\xc2\x8a\xb2\x08!\xa8\xf8\xa3\x17\x7fp\x83\x14$\x8c|p\x1dW\xcd\x0e\x93[\x81\xa9Wj\x94R\xd9\x061u\xdc\xdc\xd4\x95\x15\xd5\x93\xb3\xe0\xeef|YI\x84\xa0=\xd0\x18\x14\x01\x95xl\x9c\x9b\xe6\x14\xa3ba\x9d\xe4\xe5]\x8c\xe3\x08j90Q\xc4\xc3\xb2\x81\xc5l\xb8q\xa9UH\xe6\x92\x88\x1d\xbe\xb6\x9c0\xe2m\'\x84QQ\xfc\t\x12\x19j\"RP\xc9\xc7\xc69\xb3J^\"\xb5\xb0o\xfb\xc2\x83w\xa1\x82\xc4\x06\x9b\xe8\xe4\x83\xe3\xe82\xb8\x15\x0fE\x1f\x9f\x84\xa8T\xcfPSR\x9e\x82\xcc\x19\x85F\x86f\x12\x06\x00S\xc28\x00\x00\x85\x84\xc1\xe7\x9a\x8a\xe4\xd1>4\xab\x05\xe9\x122P\x08\n\x02b8\x80B\x10\x00\x03\x18\x80\x01\x18\x80\x01081\xc4H\x8a\xc8\x8c\xb2\x1d\x0b\xd7\xa4\xca\"\xa2s\xdc\xf4*S\xdd\x8b/\x8e\x9b\x85\x88\x17\xf4S\xdc \xceJ\xe7e:\xf9%\x85\x95Z\xc5.b\x16:\x91\x92\x8e\xe7\xbd\xeb\xbf\xb8^\x92\x8c\xc5I\xa8\x0f9\xc7\xd1\xfb\xd1\xe55\xaf \x85\x8e|]\xbd(\x82;\x9c\xb9\xf3\xe6\x8a\x98\x14\xdb\xf2R+8\xc4=l\xc2\xbd\x1e\xbf\x03?}d\x8b\x86\x19\xc1!\xe0\xaaG\xfd\xb7\xc3\xc6I\xf74\x0eX}\xbe\x16y.\xe3\xe9\x11,+\xac\xa4\xc74\xad\xf5R\x16\x87\xcf\xdc\x89<\x13\x14\xc5\xb3\xa1\x98\x9cK\x8e\xb2\x95\xca\xfa\x8b\xea8\xc8\x85\x8a*h\xc1\x86\x9c\x8c\xe4S\x8f\x04T8Vrt|W\xd6\x12\x8f\x7f\x87\x0eF\xf5\xab\xa4leTQ\xf8\xd4\"\x1d?\x0b\xcdp\x99`\xa8\xa6\x98+A\x8e\xc7\xd1\x04u\xed\xb5$\xe2\x1c\xdfOg\xe2\x11\xf1\xa1L\x82\xf3\xb4d\xb62\x06\nYt\x8fG\xa8\x90aZSl\x87\x82\x0c \xc7[\xa1]m\xc3\xf8V\xd9\x12\x8fq\x1c\xb2\x15\x16l\x8e\xb0\x95fC\x01\x8a\x02\xcaP\x88R{\x1c\xd7\x14\x81\x9f\\\xc0q\x10\xc5\x11\x0b\xefC,\x19\xdf\xcaZ\xe2\xb1\xff!Ca\xf0R\x83l\xe5B\x16\xfd\xf1\xab\x0bA*\x1e?4\xfe\xe4H\x8f\xbb*\x0e\xc6\x92\x1e\xdf\xbdI\x85\xd1i\xc3\xa1\xc2r\xd7F\xc0\xb7e+\x83D\x83\x8b\x8c-\x19\x1e\x1f\x85\xd6\xc9\x9ab\x8b=\x89\xdc\x84\x92\xe2k1\x8c\xa8\xf1\xbd;TG\xc7#\x1b\x82\x96K\xcf\xc1\xd9\xd9\xca\x80H\x8bE\xf2/\x89_\xed\x11\x8a\x1b\x8f\xc5\x81\x0ca\xaaU3\xf2\xe9HS4\x17\xben}\x1a\xdf\xa5M\xd4\xe8\xb8\xe3PA\xa2\x8d\x86\xaa+\x82\x91\x9c\xadTPQA\xcb\xbb\xa9H\x1c\xbf\xbc\x10\xa5)^UC\x9c\x97\x90?G\xc2bO\xd1\xf1\xad\x14\xbeGG\xa5\r\x81\x11\x81%\xba\xac\x88\xb2g\x18d\x92`\xcaVf(\x11)Yd\x94\xd1\x1eC\xc5A\x9a\xa2g\x1a\xcawj\x86\x9fB\xf7\xf1\xe0a|\xd7lL\xa3\xa3\xdf\x86\"\x1c\xcd\x89\xccr|2\x90\xc5\xd5e+\x13\x8e\x12J\"\xc8\x8bl\xf0\xb8\x87\x9dm4#64\xee8;\xf0\xda\xa3\x96>\x8e\xef\x98\x1est\xf2\xdb\xd0tD\x05%\xaa\x14\x11s\xfb\re\x9d\xad\xc4\x9b/\x8d\x9a/\x89d4\xf4\xbe\"\xc7B\x08M\x11<G\xc0l9\xf69nR\\\tE7\xbe\xb1\r\xc4\xe8\xa0\xb4\xa1-:\xe8(\xd4<:\x13=\xf4\x9bA\xf3\x0c[\x99\xa29\n\x12\x01%YVa\x8e*b\xb6\x16\xc1\x8f3\xac!\xdd\xad\xf1-\x8c\xcbG\xc7\xa0\r\xa1\xa4\xbe\x80#;Q\xdf\"\x8aQ\xb6\x12\xadQ\xefC\xedQ//E\xc8\xb7f\x82\xa6\x98S+\xba\xd4\x1a\xd2\xb7\x19\x8ay\xeec\x98\xe7\xd6\xf8\xcexR\xa3\x13aC7\x89\xb2\x11\xca\xa3\x04\xc6T\xebo\x112[yJ\xa2\xd3i\x1a|JD\xb3\xf0 \xe3\xd1j.\x82\xe5!]\xe9\xe3\x80\xaf\xd4\xf8\xcem\xaa\xa3\xc3\x91\rMD\x82H\xaa\xe9\xc8#q\xb4u\xf9R\x05\x9ae+\xc1gIx\x80\x93\xf6\xa8\xc4G^\xf4\xbd\x0b\x1a\x14!\x87y4\xa3C?R\xe3\xdb\x97\xad\xa3\xf3P\r\xe5\xb4\xb4U\x92\xff(;\xf4rK\x8b\x90\x1c\x96\x1f\xb8\xda\xe3U}\xd4\xb0\x0b\xb4\n8\xb1\xc9&\xf3#\xad\x0ew\xb1N\xfa\xa9\xad]\x0f\x02W\x8d\xef\xde\xad\x8e\x8e\x83\x1aj\r\xcc\x9a\xae.\xb5/IGH\xa9\xd6\x95\xe0\x88Z\xb6\x12+\xf3\xda\xa3\t\xf4{\xda\x14[\x9e\x8e\x00\xa2q\x84\xc2\xc0]\xcb$P\xf0k!\x86\xc6M\xbc\xf04C\xc6\xdej\x96\xf3@\xf2\xb5GH\x9b\x1b\xa0mM=S\xfb(\x92\xfeY\xe3\'\x81B\x14bh\xc3PV&\xe2\x85\xfc^\xff\x87\x10\x890\xa1\xd6\xeeOv\x8eO{\xec\xe5h\n\xf8\xa5\x9b\x9a\xce\xb92-\x97\x04\xb2A\x88q\xc6\xc5\x0b\x86x\xb1t\x01\xc6&\x85\xcb\x94\x7f\xab1\x90Y{\x94N\xdcx\x15\xb8\x99\xbd\x9ds,og\x01H\xa0\x14\x85\x18\xcb\xa8\xb6\x83!^\xdcM\x80\xf1&*8\xee!\xf2u\x8cI\x00p\xb1\x8c\xcdw\x9eC\x11c\x11\xd4\xe3t\xe1\x1cI\"\xe4Kl(r\x12h\x1e!\x06\xf5\x00\xc2$\xf1\xe2r\x02\x8c\xa7\x8b\xfa\xe3J\x85<\xf8\x89|\xe1\x14A\x9ev\xb3\x8c\xbb\xc7\xe6O5D\xa4H[\xc7\xc5(D>C\x9d\xa4gK\x02Y)\xc4\xb8\x91\x9e \xb91*\"\x9d\xc4\x0b:\x0b0\xa8\'\xbd+\x15%\xf2ME\xef7U\x13\xa7\xc8l\xbe-\x872\x06,\x12$\xb9+T\x17\x0f\x17\xc4\x1f*\x98N\x92@\xe2\x0b1\xb4I\xf2*\xbcpF\x12/\x9c/\xc0\xf0b\x86\xdfCb\"_\xd1\x16\x01-Q\x8b\x12\x1c\x9bo\xf4\xa1;*\xa2\xc7\xbd\x0b\xa9\x15\x7f\x0f\xfe\xb5,F*\'\x9b\x04\xaa\xa6\x10\xe3\x8a7Z\xe1\xc5\xca\x80x\xb1\xa2\x00cX\xce\x898\x04T\xc6\x91\xc8\xb7\xf0\x17\xdd&W7\xb9.\x84zl>\xdeC9\x00\x8b\xfcQ(V\xfc\xda\x87z\x9bnI 1\x84\x18z\x91P\x10^8\xd2\x89\x17\xee\x13`\xf8\x98\xc2|\xd8\x10\xf9\x81\xe5\x83Wd3\xb5\xb4\x8f3\x93\xcd\xdf\xd1\x10\xe3\x8a\x84\xe6\xf8\x8f\xc5\xb9B\xfe\xb3S\x1c\xed\x1e\x9e\'\x81F!\xc4(\xae\x0e/\xbc\x88\xbc\x88\x17\xb1-\xc0H%Z\xcb!\xb2+k\xc4\xebD>\x98\x12m\xa3\")\xa8$Eg\xf3\x1f\x1c\xba\x89>\x97\xe3^\xe4\x1d\xc7\x02\xefhq\xf3\xd0\xbe\xa7\x02\x12Hd!\x86\x8e\xe4#\x08/\\!\xe2\x85\x13\x02\x0c\xcf)\r)EJ\x0f\x88\xfcQ\xa2\x82\x1aZ(\xda\xcb\xbdg\\`\xf3\x83\x1f\xa2\'\xfa5x\xd1-IK!>\xf4\xaf5:\x0f85\t\xd4\xb5\x10\x03-\x01\"\x08/(5\xe2\x05\xc5\x02\x0c\xe6\xe6%\xca\xb5\xe5\x81\x8b<\x0c\x13\xf92\xcdA\xa2\x1d\xae!]\x91\x87\xbf\'Q\xa8\x8d\xcd\x9fs\xe8^%I\x14{\xb9TQ9(\x85J!\xff\xb13(*\xa4\x84\x04\x12H\x88\xa1\x05\x89Bx\xe1\xcc\x89\x17\xce\n0\x84#4\x8aJ\x91\xd2\x95\xd0\xcdf\"_?\xba\xcd1\xe3C\x13Z\xb4\x166?@C\xe8\x81%\x13Y{E-\xd86n\xf5\x8e\x93@\x15\x13b\x1c\xf3tMx\xf1^-\x16`\xac\x1d\x19\x13\x95-\xdfE\xa4\xfb\x12\xf9\xf0\xa3\nnNuI\x1c\xec\"M0\xccB\xd6\xb1\xf9\x10\x0e\xa1*\xad\x1au4\x13}\x1a\x14\xb9\xc7W\x17\xf2\x01\x15j\x12H\x19B\x8c\x15i\xea\t/\x8a\x10`\x94\xd1\xddG\xdb\x89\xb8S\x91-\x06\x91/\x15\x1d$G&\xbec\xde\x8e\xf32\x93|\xcd\xe6S7\x04e\x1e\xc5S\xb4\xb6B%\x858r\x081\x14\xafq#\xbc\xa0\x95\x00\x83\x94\x1a<\xe2\xbd\xa8;\x91\x1f\xe5\xf4.\xb4\xb5\xa7*\xc2\xbe\xabF\x1f\x9b\xdfz\xc8W\x17\xc3\x11%\xd1P\xa4}A\x9a\x0emy\xa6g\xa8nI5zM\x9e\xa3\x9d\x8b\x86\x97\xc8\xa7qY\xcfUt\x144k\xf4\xb2\xf9\xa5\x0c\xe9%\x8dW\xe1\x08\xd4\xd0\xab]}q\xc0\x11\xda3\xd4YR\x1fI?\x8f\x9aEj\x9d\x86\n\x91\x8fF\x93\xfa\xbd\xe2\x8c\xe1\x9bd\x14\x9b\x9fl\x88\xbbT,\x89l\x1d\x81\xf0_\x03\x16i\xea\x19\xcasI\x97\xd4\xdcV\xfe\xe5\x1b6\xb1vKi6\x7f\xdb\xd0/\xc6\xdf.\x91\x93 ~\x7fptQ\xa1\xb3m\xe0\xe3\xc53T\xf1\xa6+Q\xfa\xa6J\x8d\xcd\xc7k\x88NT\xe9%R\x04\xbf\x9d\x9f\x1f\x13\xf2C\xc1[\xf4\x89\xf3\x14\x90\xa6\xe1\x89\x05C\xf1B\xd4\xee\xa1\xef9:\xc5\xed\x05\xe87x\x85\xbf\xc3\xd4y\x80\x04\x9e\xe9\xa3\x9f\x01\x18d\xa8e\x12\xe3\xf2E\xec8#Q\xb3\xe3=Pg(\xdc\xbd\x02\x9b\x1c\x04\x99\x1c\xc1\xf0\xda5#Om\xb5\x03\xee\xf5C\xcf \xf7-\xfa\x12\x02\x1d\xffv\x0b\xc5\xc5\x95\x88\xf0\xa1\xd0\x13;\xa0\xc8\x9c\xc8\xce\x9d\x82\x12j+((B\x8e\xc3J\x17\xea\xe53$]\x11\xa3$\x8d(K\t\'\xede([\xd4)\xe4Z\xa8=\xda\xca\xee\xa7\x99\xe4\x8a,?\xc3\x879\xeeN\x9c\xb4?\x12/(\xf9\x9f@C\xba\x15\xa9\xc7i\x15\n\xbap\xb2\xd1\xa1\xb3\"\x0e\xd5V\x84\xbc\x90\xffGL\x88\xd5Lj,\xc2\x1f?Q!Q\x1ce\xc4\t%\x9f!\xb8w\x91\xc6\xe7\xd8\xe3\xad\x15R\xc4\xce\x07\x01\x84\x8cC\xa4E\x8d\x1a\xa1\xeb8\xfc\x85\x849\x9d\xdb[3\x19\xe8E\xd7\xe3\x07,\xc4\xb6%p+ \"\r\x179\x1co\x87\x98\x8aW\x8b\x04\t\'(\x1cB~\x12\xca-\x9a\x1d\xbfY\x88t\xf184\x93yCx\x17\x8a\xd4\x97\x93v+D_\xd0U%pH\xbd3\x04[\x8eT\xf4-)\x1c\x9f\x08\x84p\xa2\x89\x1a2\x7f\xd2\x92\x8ar.\x99\xc7\xb7\xa0\x94\xc8\xf8M\xcd$TC\r\x90STw!x\x08\x13\x17\xfd\x0c\xbd\xd4*,\x8a\x92\x11X\xda\t\'h\x1cb\xcbAQV4\xb9\x85\xb6\x12\x01`\x1c5\x11\x91P/J~\x1c\xd0\x14\n.\xcf\x90;\x81%\xf3C,\x8b\x02\xc7u}!-\xaf!\x93\xff\xcb\xa3\"\xb7\xd3V\x04\x9aI\'\",\xbf\xa0\xa1\tZQ\xe6qk\x85\xd0\xc4\xf6g\xdf\x19\x8a\xf8\x08\x92\x88\x1e\x8az\x0b,}\x1cK\x85\xe8\xc2\t\xc3\x87\xcc\x89\xc6U[\xd16\x8b\xbef\x125O\x12\xc1\xb7\x9e\xbc\x1c:kD\x86\xd4\x88\x18*x\xd1\xa5\x85\xf8\xef\xf8\x01\x92\x8f*\'Z\xf9\x8b\x04}<\x18\x98\x18i\x88\x11\x8ex\x89B\x94\xc0\x93r\x13\x11,9L\xd4m\"\x89\x0e\x91!\xfb \x86X\x17\xe5CB|\xf9\\@\xbcK<XV56w\x10X\x9a\xa0c\x84\xce\x85\x80\x1fB}\xa4U3/M4\x9d\x87a\x81\xfb;q\xf7qTO.\x91~\xc9\x90\xa3\x17C\xa36\x11\x17\x92\x10\xcf\x85i\xe2\x1d\x89\x80\xeb\x8e\xa6#\xad9\x89\xce1jTT\x13Nh?\x04\x8f\x9a\x0c\xf1\xaf\xd4V0!m\x1aE\xa1.\xe9\xe7\x88D\x8c\xa3\x99$\x859jL\xc4\t)\x9a\x8c\x91!\x05D\x0c%\r\x11\xc74~\xbcB\x1c#s\x11\xef\x90\x04\\&\xf5bG\xa7\xc0BHKp#\xbe\x03c\x1e\x82\x92\x8e\x7fM;\xc2!\x96\x13\x92^ME\xeb\xd17K\xe4x$CK*\x86\xb2$\xe2dE\xe6!\xc4\xbd\xe8K\xbc\x9bG\xc07\t\t\x81\xe5?\xfa\xcb\xd6\x1fD\x8bX\x1a\xe2I\xfbh+\xa1\xa38\x0fP)\xdc]\x92r\xba\xde\x11\x7f\x04\xe7\xe8\xba\xa2\xa0K\x86R,K\x0ciND<[\xf2G\x848\x04\xe6\x13\xef\xa8\x04\xdc\x96\xaa\xa2\xc0\xc2R\xc3/tl\xe6\x869\x18B\xd7\xd0V\x96G%\r\x16\xf8R\xa4G_d\xcb\x8e8\x91\x0cY\x81\x18\xe2\xb9M\xc4\x15+\xc4\xc3\xfb\x91x\'\"\xe0t\xc9\x9a\x08,\xf4\x93\xde}\xb3\xb9\xe1\x8dC\xe1\x03\xb5\x95\x193U\x11,j\x11\x0b\\82\x8a\'CS(\x86DM\xc4\xf3\x06M\x18\x16\xe2\x87\xa9G\xbc\xa7\x12poz%\x02\x8b\xe0\\\x9aO\r\xd9\x13S~j+\x9c\x98\n\xde0:\x94\xe9k\xbaj\xbd);&C\x9c\"\x86\x94>\x11O\xe73\x10#\xc4\x1b\xefC\xbc\x9bO\xc0g\nI&\xb0\xccbj\x89<gO\xa0\xebE[\xe9K\xb0\xf4|Xq\xac\x97\xd3\xfc\x87)2\xe4\x0014o\x0e\".\x94\x10O\xa9)\xe2\x1d\x89\x04\xdcl%\xb0\xc8}(u\xd1V\xa6\x0b\xc1\x02E)\xe9\xa3\x90`r\xc8\x90d1\x14-\x97\x88\xdb\x14\xe2<\xef%\xde\xdcW\x02.&X`\x89*K\xd0k}tmE\x98\xd8\x02\xcb\x16F\xb0\x04\xe3%C\xc5\x88!Us\"\x9eV\x88C-5\xf1\x8e\x9c\x80[\xbbT\t\x85\x87\xb8\xd2\xee\r1\x14\xb5\x13\x02a\x92r\xdc\xb0x>\x0b\xe9$h\x17\xedg!\xdd\xb4G\x0e\x87\xb0\xab\x93!81d\xe1G\xc4\xf9\tq\x85\xb8\x88\xf7\x16\x02\xde`\xd1\xb3\x10\xae\x82\xfe\xa1\x81/\xf2,YM\xe8\xf5_\x08\x85\x85\x84\xa1\xf5\xa1B\xe7o\x9c\xbe\x90\x15\x89\xc5\xb5\xba!\xe2\xc3e\xd1q\x95+\x11\xcf\x90\x0bO\x95x\x0f \xe0\xe2eI\xe4\x85\xc5\xb4\"\xe7!\x8f\xa7&^ \xd4t8\x91\xc1B*\xa2\xe8M\xc8\xca\x1b=\x0b\x11+\x8e\\S\xe4\x7f\x08\xbb\x8c\xefh\"N\xf9\xfa\xc4\x9b\x17\x02\xae\xeb\x06K\x16KX\x9c\r\xd1h\xa5h\xb1\xa4\x1500\x1e\x06\x16R\xce\"\x8fB=\xd1\x1ew\x1d\xfa\x94\x8fvF\xc4\xb7C\"\xde\x8b\x10\xf0\x8c/\xba\x9f\xb0\x98\xab\xc8W\xd2r\x07\x15\xc1\x96\xdc\xc7\xeb\x85\xc2ys\x81\x1e:zRR4$\xa1\xa5BRnt\x0b\x0f\x15\xf1B$SO<\x86LD\x90\x84\xd0B\x03\x1dp\xc8\xf5\x8b\xcaq\x95BD,$T,F\xearf\x16\x15\x1d/\x0b\xed\x8b\x1b\xb5\xc7-lP\x9d\x109\xd1&\x1e\xf1G8\x9e\x00\x04\x8a\xf0\xa1g\x94\xa2\xe5\xc5\x16\x8b\x84!\x7f2\xdcX\xc8S\xef\x127t\x13\xa5P\x11X\x14s!\xd7\r<\xa4!D\xce\xf5\x89G\xc8\xbby\x8d\xd3b\x11\x16\xd5E\x9e!;\x89\x80fQn\x92\x93\xd4\xc0\xdd\xcdxl\xa2\xc3\xce\xe9/j\xf2B7\xb5G\"7\x84.DBB\x13\x8f\x95N\xc4\x15\xdb8 0W\xe4\x1cR+\x11x\xf9\x91\x16\xd5\x85\xbcP\x98\x19:\x1e\x89\x12\xcd\"}\x0e14\xca;.N\x92C\x0e\x84H\xe14\xf1\x98\x98\x82(Q\x14\xd53a\x91YD\xe8\x94\xa1\x96\x0f\xbc\xa8\x15r0\xc9\xa7\xd0\x90p\x15\x12\x93\xc8\xdc\xe5\xa2h\xf2\x89A\xa3\xccS\x83\x18\x08\x91\xe36\xf1\x08\x89mPQF\xbd\x97\xfcU\xef\xba\xa1\xc8\x91\x86k\x0eJ\x91V\x08\xafd\x9f\x15\xe1\xd9#\xe4\'\xa1\x08S*\xdc\xa8\xa0QVHC)\x15\x82\x86\xac\x89G<?\x12qP\x87\xb0\xe8\xdb\xa8\xb0y\x84\xa3j\xb8\xc9\xaa8i\xf7\xc8h\x94\xf2\xd4\x17\xb1\xc7!\xdc\xe8\x1c\xba\xa9\x069\xb9BdWM<\x92\x1b\xf9%\xe1\xe5\x13\r\xc2\xf1\xf5\xae\x01\xa4Q\xc5\x8aV\xf6\xa2\x9c\xdf$,\x87GF*\xf2\xc6\xe9raC\xf7B\xa4\x894\xf1\xb8\xc7M\xe7\x1f1d\xf9PTDa\xd1-\xc9\xbaF\x0b\xb5\x82\x16\xc1\x7f\x92\xcd\xa3\x89-\xd6\x0b\xabh\x94\xa5\x18\xcaX\x85\xc8Y\x9ex\xc4\xe15\xaa\x93~\xf8%yS\x14NT>K\x1fw\xa4\x9b.\x98F\xb9\x87K\x92\xfb\xa8\xcaE\xb6\x1b\xeaB\x85H\xb1>\xf1\xd8y\n\xb0G.\xc9\xd9\xd3\xaa\x14e\x80Om\xe4\xd2H#\x89I\xa6I9#5Y\xd7(!\xa9i\xa4G\xe1\xfe\x12\xe9j\x94?\x18\xc4\xa8\n\x91@|\xe21\xcbS\xe0Q\x96\'\x81\xfe\xdf\x8f\xfa\t\xc7\x17MQ7AQ\xb2\x0c\xc9\xf8\xa8y\x92\xa8\xa6\x0ev8a\xb3Px\xd4\xf6\x1a K\x85\xc8`7\xf1\xd8l \t\xdaU\xf5V\xb2\x90e=*\x04{\xeaC]\x9a`\x1f\xea\xd6(1\xc4\xc9\x94\x1a\x1c\xceoc\x90\xb2HL\xb0\"Ik(W\x88\xdc\xba\x89G\x98\xb1\xf2\xb3R4\xb6\x8cF\x8d0&\xa4\xfe#~\xc9\'n\xfe\xb9z\x8fz$\x05Z\x0c\x90\xb0\xda\xc4c\x97~>\x0e\x0f\xf0\xe7\x83\x0c\x8a\xf2\x02\xac\x83\x1c\x14\xf5S\xd5\xc5\x90\x9a\xec\x88\xec\xc4:\xb2\x18 \xb3\x82\xc4cq6\xd44)*\xb4/tU\x10\x0cZK\x05;\xa9@E\xb3\x0b\xb9\xd5\xbdxFA\xbe\x04\xbd\xd3!v\x91\xbcN\x10\xc3\xc2\xeb\xf8\xe9\xf8FJ_\xa3\x83\xd2\x86\xb6\"\xbe\xa6v\xaf\xe3\xec\x85$\x14tB9\xa4\xbb\xa8t\\\xedR\xa8u\xb7\xf8K\x1dw\xfa<nC\x06\x88\x96PG\xc6w\x92\xf9::\xb0xh\xa5E\xac\x132\'\xb9\nA\xc5%qA?$\xb8\x88\xaa\x84\xe0x\x02H\xb1\xd2\x8a\xefN\xfa\x1f*\xf4\x16\x1c\xcf\x15g\xe2\x90\xf1=\x10\\\x8d\x8e\xf5;\x84i\xaeH\xb6P\x82\xc5\xdf\xd0\x0bXT9\x15Q\x8e\x03G\x8a\x85\xce\xcb\xb1\x96\xdf\x878x3\x8ed\x95\xc5\xbf\x8a,\x00<\xc7w\x88\x11=:\xec84T\x11{\\\xbb\x90p\xf1\xb9x\xa8\x9d\"\xe9\x92\xf3\xb8|\x92[\x08Zq%\xe4~\xd0\x10\xbb\xa8\xc1\xc7w\xc5?\xe4B\xea\xf1\x9d\xdbT\x18\x1d\xf694\xf4EL\x97\xb4\xe39\x0b\xc5\x8b\x07\x1b\xba\x1a\x86~\xf4\x8b\x94GQ\x8f\x8f\x15:\xcfSa\xca~\x11\xdc\x91\xabF8\xd5\xf8\xcee*\x18\x1dd;t\xcb1\x1bz\xa4h]r\xec8\xac\x10b\xc5U\x0cE-G\xe9\xa1\xc8\x9cdOL5\x05\xe8\xd4=\x14\x14\x1b\x02v|p\xe4\x15\x99\n\x07p\xa4\xe3[\x19\x7f\x8d\x8eJ7\x84_\xee\x8fE\\\x1e\x9f\xe2\xc7\x1a$\xab,\x919\x8bP\x94]\xc8\x1a\x10\xf3\x1bz\xdf\xd0\xf3J(\xf2\xc8\xe8\xf5C0\'\xf7\xf8\x16\r\xa2G\xc7\r\x0e\x01\x13)_\xae\"\xa8\x10WA\xf3\xfa\xc0\xc3\xd12\x91z9g\x91\x9b\x99T> Q\xf9C\xd0lh{\x9cU4\x16\xe2\x05\xda\xc6\xb7\x16\x86\x18\x1d\x957\x04Ga\x12\xe9\xac>Q1\xaf\x08t\x08\xe4\xa8l\xbe$:\xa0H\xfb\xf5\x08\xf1\xb8\xb3\x90\xd4\xa9~\x0c\xffi\x97\xc4\x86\xe4\x8f\'\ta\x848\xbeo|\xe6\xe8\xe0wC{\xc4\xda\xdc\x96HV(\xa2\x0e&\x95<b%b/\x0f7\xf3\x16\xc2q\xdb\xc3_y\xe9\x94\x83Fx\xf3\xe5\xd9q-\xa2(\xde\x9c\xa0\x8f\xef\xed\x00itT\xda\x10\xbeGM\"\xbb\x88\xa4\xfe\x99\x89G\xac\xe6\x7f\x89\x9cEN\xc9\x1b\x85\x86\x1b\"r \xe8.\x15\rQ,:v\xbc\xb0~H\xe7\xf0\xf8Ny\x83\xa3\x13aC\xc7F\x07\x8ed\xb7\x85[\xfe5\x16-\x1b\xd9\xce\x91r\x89\xc2\xd9\x03\x84\xd0\x95\xf4\xcd\xf1\xba\"\x18y\nZE\x87npw\xff\xf8\x16\x8dEGG\xd2\r\x11\xa7\x0b\xbfGh2\xc8.\x8aZPZ8,\xdb\xca\xb1I\x91\xa3`\xa2o1\xf5\x08\x9d\x96D\xd5\x03(\xf5)\xf1\x08/*\r\xe4h\x91\xc1\x1d\xb7\xc1\xf1\x1d\xcf\xb0\xd1AWC\'\xf8\x93\xca\xa2\xe7\x9a\x0b[\xe4\xcc\xc3BY\xdak\x04\xaa\x1d\xa5\xc7I\xd4\xa1\x8f\xcece\xd7\x08\x85EL\x02m\xaa\xe8\xe2\xf8\xb6i\xf9\xe8\xac\xab\xa1\x9c\xa5_\x92\xcatW\xd8\x02\xb0\xd8\xbd\xd0\x03D\xb0D\xc6OR\x1b\x8f\xb2\x8d\xbb\x0c\x15\x0e\x188=\xb8G\xcfs\xf1\x97\xe0[\xf1\xa1_\xe9\xc7 \xb0\xf4\xf8\xcee\xca\xe80\xb0\xa1m\xe2\\\xef\xd2\x8f\x94\x98\xe482\x83o*dd-]\xd6\xfe\x86nx\x81\xabDs\x93\x87Gn\xd1\x91\xbe\x7f\x96\x8b\xaa\x9e\xe7cg\x1f\x1dd\xa3\xbe\xed\x03<\x9a\xa2_\x8a\x97\xfd\x96\xf9x\xa8G9\xf4Q\xbbO:Mn)\xb3!\x8f\xfd\x88\xd28\x87\x1c\xfah\x92\x8a\xce\xfa\xd3g\x03\x15=\xd2ve\xedx\xad9\xaa\xe79\xc0\xf9+\xbaE\xf8\x00\x17\x81z\xe4PW,\xaf\x8b\xa1\xe3\xcb\xe7\x01\xa9\xaaLiZ\x03\xb3\xe5\xed\xa3\x96\xd0\r\xa0\xe9\xe5\xdc\x95Ah\x02\xdd\xeb\xd1M\xe5(\x9b\xbex\xb5\x08\xd1\xa8\xc1\x8e\xf7v\x80\x0f!\xbc\xe4\xdf\xc3dE\'L|(\xa5\xd9\x1c\xa8\xb6\xbc \xa7JI\xe2S\xa2\xb2\x1f*\xdbKV\xb9\x84sX\x9c\xd2\x9a\\9`\x08\xa6\xe0\x14\xd1\xa26\x98\xe2e\xd4\x81\xc6\x8d\xf9\x01^\x1d\xb8\x17\xcdu\x8a\xf3\xee\xc4LC=?\xdf/\x03x\x91\xf0\xe3\x8b\xb9\x10kqR\xd0\x14\x1f\x8a\xa2\xacO\x8d#\xa1\xd2\xe3V\x92\xc0\xa2B\xf7a\x08\xa6h!\xa1\x96\xe3\xdbB\xe2G\x1e)\xe8\xd8CRv8i\xd3\x1eM\xa2\x85\x97\xedH*x\x80\xc3\xb0\x94\x03\x1a\x8b\x98s(\xf9\xad18HbN\xbd(\x8e?-\xe4\x7fd&\n\n<\x14+\xf2\x96\x14<>/\xc4`\xff\x04\x1b\x7f\xa8\x9eE\xb5\x9a\x115\x0b\xb1\x8e#\x81\"\x07b\xfa\xf4\x9a}.D9\xb7IY~sT\x0f\x08\x0ep\x13C\x89g\xec\xa1\x1d@y\x8a\xca(\r\x99\xc5\x8e\"t\xc7U\x14\"\xaf\xb8\x7f\x88\xa4\x17\xedZ\xb29\xbe\xab\x85\xf4w\x88T\xa9\x08\xd9qhV\xc8:D\xf4\xdfZ\x8a\x1d\xcf\xc4\xad\xdeZ\x01{A\xe3.\xc8\x00\x8f\xable\x8e\x0e\xbezo\xc4\x86z\xda\xba\xc1\xee\x97\x98g\x9bEY\x8e\xdb\x85\xd0\xe2\xc8\xae\x8e\xd9\xbe\x8a\xac%\xfdx\x9c\xf4,di\x86\xa0\xbch\x7f\xfc\x88\x85NGA\xd5\xb1\x96\x850\x17e\xa8\xa8=\xbaB1\xc0U\x1dB \xb5\xebg\xee\xb2/\x8dY\x83o\x97_\"\xa6\xa1\xef\"jBut\\\x95\x14\xdfzR\xe6\x16\xb9g\x92\x02\x8a\xd7\x91\xa1\xd1\x86\x96\x91w\\\xd4$TpXg?IV\xa5\xc5:\x99o\x14@@qf36\xb8\x07\xb8q\xf4<A\x0f\x93\x15o\xf4\x9cZ3]p\x98\xe4X\x1e/\"\xb9d?\xeeLq\xfd\xe9o\x1eM\x87p\"\x08\xc3\x93\x94.Kr\xa5\x1b\xb8\xb9|\x18E\xef !\xf9\xe2\xa7C=\x85\xba\xd3\xd9p\x03\xbb\xa9]\xd1\xd6\x18\x9d:\xc0\x1d\x87\xed\x08+\x81y\x93Y9u-\xd6un\x90%\xf5\xf2L\xca\xa28~y\x85\\+(?D\x97k\xc6[\xe3jQ\xcaq\x81)$t\xc8%\x92\xcb\xd95\x94)\x02xB\xf4.4\x04\xc2\xe0\x17\xbd\xf2z\xe4\xcdqa\x80\xc7\xa2[C\xfd\xa7;8\x0c\"p\x88\xc8e)>\x1b\xb0\x82IT\xa2\x9cEV\x14?\xee\x1a\xd6]^\xd9\xb3\xc8\xc6\x0b\x054DN\x14\xcb\x97\xd4\x90\x80\xb7\xc8\xaf\r\xbft\xd3\xb4\xfe\x12v\xf2>\xbc\xcc\'\xc7\x144\xba\xd0\x1e\xa8l\x9d\x93\xcf\xfc\xe8\xa8\xbeN!\xa6\xb3\xe6;\n\x10U\x05&\xb2\xcb\x8bBW\xc7e\xc8\x9cD\x8f\xcb\xc9dC\x91\x97C\xb1\xb9TJ\xc4\xc6E\xae\xc7\xa9\x11w\xb5\x82\x17\x85m@\x00\xcf\x08\xe4\xd6r\x13\xc2!\xd4\xa1\xd85H|\x89\xe2\xccO\xcb\x8b\xb3\xd1+\xc0\xf8\x12AG\x95d\x11b>\xce\xe0Q7)N\xe4Zn*\xaa\xe3\xd1\xd1\xc2\x0f\x91\xee(\x1b\x92H\'\xc7\xf9m\x93;R\xcb\x07\x01U\x8e&H\xcf3Cd\x00\xf8\xb5\x14\x9f\r*\x7fp\xcdA\x12\x0cHs!\x9drm\xd8\xc8D\x8bm\xf3\xd1hs\xf0_\xe89*\xb6\x99G;Qn\xd1\xb70\x997\xe5\x86\xd2\x8f\xba\xb9r%\x829E\xd2VR$\xc8=\x17\xb8f\xb2\xeb\xb8\x9a\xb0LS\x90`O\xc3k\x86\x92\\\xcbJ\xbcU\xbe7\xad:R\x87\x13\xa0;\xb8\x8f\x86D\xe1\xb8(\n\xf6\xfa}\xf6y\x7f\xc4\x9cHd\xd8\x90E\xd1\x1f\x8e\x14\x88\x89\xd4\xd4R\x86W\xb1\"\x8e\x08`\n\x83\xee\xf32\x02\x83A\x14\xe4Q;U8|\x04\x03\x9b\x18\xd5\xbf\x89\xe1\x9bF\xa9\xeb\xd1\xc5f\x84\xbf\xc8\xa0\xe0\xf0\x14\xe8\x96\xa6!\x88\xa9}hA\xa3\xc4\x917m\xae\xc93t\x92\xe6\x8d\x94G\x8c\xe6{\xd7\r\x85\"X8<:d\x9f\xbe\xdc^<\xd7\xa3\x7f/\x12\xc7CrG\x8c2\x1e]\xb3\xe8\xfa\x9e\xa1N\x92|?\xfd\xcd=x\xb7D\xb7\x14\x9eT\xea\x1e+\x1f9\xc3T\xe0\xf3g\xc8%\x924\xc98c\xf78\x92O~\x06]\xca\x80\x96\xe1\xad\x9d\x95r\x83\xde\x12\x17K\xf5\xbazr\x97\xda\x91\x8f\x87\xa6\xfd2\xc0\xdb\x94G-\xeb\xc3\xcf`\xb1^)\xb9\xeb$\x1a{\xc7\xa1\xc8\xb5\x90;\x93o\xc7\x86${\xa54\xa4S\xd3\\\x12NGnYh\x07\xdc\xae\xaeWH\x89\xf8\x96\x05XB\xfa\xfa\xc1\xa8x\x1adQ\x98\xe7+\xa3\xd1x:Bb\xa8)k\xde\xc7u\xcd\xfcj-4\xcb+\x90\xffi;:\xfc#h\x9a\xf7M\x0e\xc7m\xb4Kz\x9d9\xc2M\xee[\xd4\xbb\xfd\x04\xb2\xb4w\xdce\x04\xa0\r\xc1d(\x0f6\xc7t\xe2\x19Q\xdb\x97u\xa0\x01\x92\x1a\xdc\x81G M\xa2X\xa2W\x82\xad\x9e\xac\xaf\xf0M\xb3D\xbd:\xf0\xed\x82F\x0c\xa5:\x85\xb2W\x06?_\xb1z=\x14&\x18[\x92\x80s\x12,\xeb3\xf6\x0c\xa9E\xaa%\'\xbf\xc7\x0b.\xe4\x95\x0c\xb1\xdbE\xc0q\x96\xeaZ(T,\xae\xe6\x06?\x19\xf0WQ\xc1\x84l\xc7\xa9\ni.\xfep\xf0\xacEC\xf7\x85\x0f\x9b!\x8bj\xeb\x11\x8a\x97\x8a$UC\xd8\xa2\x8e\xeaR\'\xb4\x7f<\xaePR<\\\xedd1\xe0\xf0\x8a\xb8\x8f\xab\x0eQ\xf1NA\xe0P|\x86\xec\x15\xd5\x12\x8a,4|\x82l\x05={g\xc8UTl\xbc\x88\xe3\x13ZX\xe7\x0f\xf8\xe2*\xea\x8e\xe7\x14\xfa/.H\x91{@C\xa6Ob.\xfa|\xfcs2\xa8\xc5\x05\x8d\xe2\x90\xba\xa2z\xfe\xa8n\xc7!$\xce*n^\xdc5\x86&\x8a\x98\x97t\x8f\x07I\x12\na.\x8e\x9f{g\xe87\x0f\t=E\x12\x85>\x1c\x83\xa7\xf0\x0c0\xd4\x1c@\x11\xe0\x13\x9a\x85\xa2\xc5\xcb\xf5?\xc9\"\xe7\x8a\xae.d\x15\x97\x14\xfe\xdbg\xc8-\x07}Q\x1c\x0f\xa7\xd0\x95\xe2NNCDC\xee\xa7q\xd3\xd9\x8a\xb2\x85NbSl\rs\xbc\xbc\xac\xa2\xfdq\xa2B\xb1\x16o-\x1aR\'\xc2\x1a\xfap\xd18\x8e_(\x86\xe2U\x0fY\x89\xb0\x86F\x1bE\xdb\x87\xa6Q\x85f\x891\xd4a\xb6y\xca\xbb\"D\xa1\x93\xb4\x14\xc9\xa2ghK$\x97\x935)RIh:\x9e\xbaP\x94\"y\x1d*H\xe4,\r\xb5\xeb\"\x88\t@9\xccF\x89\xbe\x8b\xe8\xca\xce\xe0\xb8w\xa1\xd5T\xd0\x0e\xf1\xafgxJK\x04a\x11MB\xf5\x14\xd2\x1f\x1f\xd2D\x82\x868\xdd_b:\xe4D\x0e\x10EV\xc7S)\xf4\xcf\xd4-\x93\x02w\x0b\x18\x97\x92\xf4\xb4\xa7\xe3\xc0\xb9J\x8d\x98\x91K\xc9\x1fQR?@\x155\x87D@\xcb\xf5U\x16\t\xe2A\x80\x1eB\xcd5%2eC0E\xe0\x7fO\xa7\x10N\xc7\xc6\xfa\x01\x8c\xa8\xc4D\xf3r\xb1\xe5\xdds\xeej\x88YQ\x8d=\x13\x1e\xb8\x8f\x80l\x0e[\xd1~\x15\x86K\x83\x1a\x96k\xa4\x8fw9@\x04\t\x9c\xc9Q\x9d\xe8\xc6z\xd1\xff\xe3\x15\xc5\xc7\x1f\xc2\x8f\xd67\x17\x9b\x88W\xb4n\t\x8d#\x19#\'G~\x89\xdc\xbf\"u]\"\xf9N1\x8b\x0f\x89q\x91\xb2s\xb7\xebj\xe8h\x10\xcb2\xe95@\x90w\xed\xc8\xb5\xf52\x84y\x03tj\r\xe3\xab#\x19\xa4H\x91\x12\xe9\xe8!\x96\x8f\x12m.9\xb3h)D1\xec\x07\x17\xb1\xa3\xf9D\xaa\x8a\xc6_(\x1f\xb9\xd9\x9c8<^\xbc\x90\xf2x\\\xf6YT\xeb\x16\x82\x15\xf7\x8e8\x14l\x14<\x07H\xf5\xe5\x9c\x06H~$<Q2P\x04\xf8\x1d\x1a\xa4`\xc6\x97\x82\x8e\xf6$\x0b/9\xeb\x11\xa6DBC/\xca\xe6I\xc4AN\\\x02vu\xa7\xa4O\xd1\xc6\x08M\xc6rj\xe0O\rA\xfe\x03\xf4g\x05\xcep\x03\xe7\xf3$=z4:\xd1nQE\xa1\xdf\x87\x04s\x9b%\x1a\xde\'\x1c\x8c\xb6\xad\xd48I\xab>\n\xc7^\x9av%\x84\xd8\x89\xdf\x14]\xe6\x85\xf6,\t>\x02?\xc9*\x02{\x05\xa0\xd2\xc3^\xcb\xde\x11\xf2\x10\xb1\x01:\xee\x98\xc9\nX\x10\xc0X\x9a\xbe\xca|R\xb3\x8f\x86V\x05\xcf\xe4\x03\x87\xe8R\xdaK\x82\xf7\x11\xb7J\xb6\xb4\xc8{\x95\xbd2\xac\xe3gQ\xc7\x9fq\xfb\x90\x1c;@\\Q,\x88\xec\xf3KC\x1e(&\x03T\xff1I\x00\xcc%N\xdc\xa4yr\xd5\xd3:\x14\xc3Rm\xd2\x95\xab\"\xb5\x1c\"9\xa5$\xe5\xce\xe3m#Q\x94\xfat*z\x18T\r\x87q\xa940*\x0e\x0f\xf3\xfb>\x8e\x92\xb7\x01\xf2\xd6N1g\xcd\x08\x83\xa6\xa2\xda\x07\xbfi\x1at\xc8m\x97\x81/\xf5\xd8\x13\xb2)\x0f,z\x92\x0c0\xe3\x87\xa3\xf4}\xac\xaf\xff\xf1\x1cU!\x8f\x8b\x94P\xb6\x93\x92\xeb\xa1\x13\xd7\x14\xaf\x88\x1fF)0@\xc6\t\xa2\xa1\xfa\x84\xce\x03p\xa2\xb4\xec\xb5\x08\x92\xd1\n\xa0\xb1\xf9C\xa3\x0e\xa7\x8d7\x86\xdc\\3s\xd4\x91ko\xe9\x9c\xb4\xcf\xb2\x04:Q\x90\x11\xdd\xaa\'\xc4\xda\x8e\x02TA\x9d\xc0\x01\'\xf0\xc3i\xa3P\x1d \x95`\xe0\x86\xc0\x89m\x00\xfa&SiN\x84\x8e^a\xe8\x10\xd8\x821\xfb\xa9\xa6\x8d\xeb\xa8q\x1c\"}\xe6W\xd7\xba{9B\xd1\xb5\x16\x92\x9e\xe0\'Ey\xdf\xc6:\xc3kj\xad\x88\x05B\xc1\xe9%\x80<Jk\x80\xe4\xf81_\xeb\xd6\xc9\x08t\xc7Y\x90\xa2\xec-h(\tu\x10\xf8J\xdfy\xf9\xbfm$\xe1\xd7qQ\x916G\xe9\x92V\x9a_\xec\x17\xfb\xf8 [\x01V\x15\x91\xd0<\x17\x03\xe4\x01a`9f(\x13\xe6Ytf\'\xc4\x1b\"\x11\xf8\xd8\xc6\xd1\xb5\xb4\xe4\x8a\xc4\x87\x98\x15\xc5q\xb9$\xe9\x0b\x19`\x86\xc4E^\xe3\x9a%g\x1e\x97\x15\x02\x16/C`\x00\xe4Y\xacC-\t\xe5>\xbfF\x9a\xd71cq\x84\xc1\x81Yd\x93\x82g\x9bX\xfai\xd7\x04\xf2\xfb@\x82\xf4n\x9f\xc9\xcb\xca1~\n\xca`\xb1E\x1dBB\xd3\x1b\x92(r\'$\x1d\x9f#\x0b%\x15\x07\r\xc9\x17\x11K\xc2\x13B\xc7?\x0b\xcd4^\xc0\x1ck\xb1dL=\x1fnF\xa0\x9f\x92%\xb4\xcc\xa2X\x9aK\xaa\x9bN\x06D\xed\xe0\x14\xf2\xa8A\xeb5\x13[\x04\xc6\xf4f\xb0\x18\x8f}I\x11\n\x05\x14\xc4\x19\x0e\xc3\"\xe1\xf8u!\xb0\xe2\xb1\n\x87\xa1\xd6+\xd26>$\xc4\x1f\xf7(\xb4b\x98^~\xbf\x80C\xedk\x11.\x18\"\x8bZ\x92:0\x81\x14\x0e\xd4\xd1\xbb\xf6\x06\xd7@\xd3s\x81e\xa1\xa5%sVP9\x94L\x15mIV\x1d\xf4\x14o\x19\x9a\xda\xd0P\xd1\xca\x92\xc3q\x00\n!\x96Be\x7f\x08\xbf\x14^\xa1Q\x9c.z\x1cc\xbd\x92\x0e\x86T\x99Q <A\x17j\x01DK\x91p4\xba\xa4\x86\x02TwH\xc8E\x8a\xe3\xf9B\xbe\xe2\x83\xcb\x106\xda\x8b\xea\xf1w\x854\x8b\x03-\xe0\xd0\xab\xe1\n\x028P\xd2\xc5\xeb\x8e\x1f\x17\x1eU:\xa8\xcc\xb0\xad\xb9\xb7\x8c#72\xb4B\"\xc6^$*\xa4Y\xa4\xd5!\xe7\x86\x1c\x16\x99\x8f\xa3\n-*\x0e\xc7PM\xc4\xb4/\x8a|\x14\xd2b\x95\x95w\x88\xc3\x13r\x06\xd25\xa8\x8f\x9a\x15\x83\xab\xe2\xfa\x91\xb0p\xe6\x0c\x95,\x91\xdbK\xf6\x0bM\x159\x86\x0c\xa9/O!\xda\x84\xe4$YQi\x16\xd4\x19\xaa\x89\xd6\x8a\xb2r\xa8\xa2[r\xbc\x0c)\x85\xc8N\x92\x1d\xfaAFm\xf75pC\xb9\x86\xd0\xc1\xccf\x80\x8b\xfd\x97\xd2\x89\xe4Da\x96\xe4~L\xc6w\xc8\x93H\x13\x14\xadB\xc1y\xcc\x10LD\x12\xe5\x1c_,\n\x85\\L\x0fi\x975\x18\xfa\x1c\x8cW\n\x0fi\x17\x99V\xc5\x8cb\x8e+?\xc3<a\x08\xa8QB\xe6\x05\xb7.G!jA0r\x0f\x95Jd\xfa\"\xacB\xa9\xe2\xcb\xd0u\xf4\x97H\xb1\\\xfa\"\xf9\xb8^\x88r;\xd2\x1fZ\xa8\xe4\xdb\xb4\x8a\x84#\x15\x01\xcb\xa9\x80\xbd\xfb\xbfHf\x0e\xbd\x8b\x12\\^RV\xa80\xa9x\x0eU\x17Q\xfb\x12\xd9\x02\x0e\xb1Z\xc6\x95p(\x1aGB`\xa2I~\x91.$\x15\xb7#\'\xa5\xb7\x0c=\xf2,\xb1\xad\x95r\x8a\'<\x065\x15L\x0c\xb3[J\'J\xbf!\x13\xbd))\xbf$\xb9\xc0\x8f\xa0IsrH]\x9e\xb3\"q!\xb9RM\x19\xb2\xd1uv$F\xa2\xdf\x15\x89\xd8\xc2\xf3\xd1\xd0\x16\xa4\xeda\xc2g\x8b\xe3\xca^\x17$k\x88j#\x9d\xa2n\"\x9f\x9b\xb9\xc8\xa5\xc4\x86\xe4\x9e\xecQ6\xd7\xfa\xa9\x08\xb6+\xc4\x1a\xf9\xea\x88\xa8\xe6\t\x7f\x8a\xc2\xe76@\xceA\x11\xf9\xf3\x90n\xa1\xaa\xf8f\xc0\xe9R2)\xad>\xd1:E\xe5\x10\x83\xba\xc8xdj\x0e*EY|\xa2\'$\x9d*\x1fi\xe3<w\x12E\x89\x9d\x8ce\r\xce\xbe\xe0\xe6/\x9e\xc1\x90\xc2F\xa7\x12\xd1\xb4~,\x8a$`\xb8\x1c\xf9/\xd1a\x16\xd5EOqj\x99Q\x8fb\x8arr\x15NQ\x1d\x8b\x12n\x07\n:D\x82\xdc\x85\xdaFY\x07UY\\\xbb\x11#\xaa8\xb3\xdf\x8fl\r\x93h\xc6\xa30D\xf5K\xb3J\x94\x04\xce#\xa7\x8dBL\xc2\xc9\xf6\xe4\xa1d\x8e\x0bH\xd4\xfc$\x86\xf7$\xb4\"\x984,\x02\xf9\x15\'\xed\xeb\xfc\x08+\xed?\x97r\xf6\xf7\x01\xa43\xdd\x94\x08[\xa9\xf6\xb4\xbbCe\xf4K\xc7\x8e\xe2\x8f6&KJ/\xda8\x92\xc5v\'k0\x80\x1c\xdd\xdb\xc884D}\xc4\xa7n\xf9~\x8c{\xab?F\xad\x0bI\xe2\xdcK:\x97\x0c\x86z8\xe2\xb6H\x11\x08\xe7\x9b\xda\xdc\xc5\x1f\xa3\x92\x91\xf1t\x1f|c9\x8cIb&\x99\x08\xe1\x08\xeb\x16\t\x13\xf9b\x80,\xbaY\xdc\r\x95\xa6\xde\xcb\xfa\xe3\xf2v!\xfa5\x9fM\xa2\xd84\t;hP\xc2.1\xe8\xa0\xa2\xff\xb86\xc9\x00\xd9\xa3\x93\x18gC\x99\x06\xb6\x12r\xaa\xf6\xd8\x9f\x82\x82\x0f\x85\"\x1f\xe5\xd8\x8cO\x85\xa8\xb8\xfc\n:\xc9a}|ks\x89\xc7\xbeC\x06\x82\xad\xa4_\xeeh\xa2^{\x1c\xd3\x14\x13\xa9\x8bvn\xc6G!\xac\xb8pAW\x17\xfe\x1a8\x1d\xdf\x9c\xbd\xc4#\xdf!\x80\x11[yWc}\xf1eR{\xec\x0f\xc9W4\xb0\xd3\xe3\xe9B\xa88V\x90\xfa\x8a\xc7\xf7\x8c\x96x\x84s\x08\x14\xd8\xca7\x0b\xfdN\xd5\xa4=\x0e\r!/\xba\xb7\x19\x11\x85\xbe#\x9b\xe2\x87\n\x1a\xaa\x11j|\xff\xfd\x12\x8f\x94\x0f\xa5\x03[9\x1fE\x7f\xb2\xa5P-N\xb2\xf68yA\x11\x9e\xcd\xe8(\xf4td\x9d\x16t\x850:\xbe\x95\xbd\xc4c\xff!\x03\xc3V\xf2]N\x88\x1dw\x9f\x9e\xda#\xba\xa6(~9\xf3\xa22!\xdf\x14\"\xd3\x05\r`\xe8\xf1\xfd\xc0K<R\x92C\xe9Jl\xe5J\xd4jh\x80]`t\xb5G\x8d\x8bU/\x12\'\x04\x0b\x85F|\xac\x1e\xdf\xba_\xe2\xb1\xf2!WId+A\x13\xed-*\xf0 \xedQ\xa69\xc9\r!\x17\x816\xa3\xa5\x17\xfa4\x15\xc7\xb7\r\x961:\xfboC\xd5$\xb2j\xb1\x95\xf0\x08s9 \xe5#O\xedQQ\x87\xac?\xc2E\xd5\xc5Q\xca0\xc7\xf7\xc5\xff\x1a\x1d\x946t\x0f\xd1Sl\xa5\xf6\xf5\x88\x93\xa2N*\xedQ\xd2\n+5\xa7/?\xd8v_4@\x8e#\xa5\x8d\xc77\xcd\xcd\x1c\x9d|6T\xca\xb81?[\xe9?:\xde\x129\x8b\xf6}\xfc\x8a|\xedQ3\xb3\xe6K\x96\"u\\%\x0bys\xa0\xc6\xf7\xeeP\x1d\x1d\x8fl\x08Rf\x9dq\xb6\x12G\x9ftT\x87D\xb1\x95\xcbI{<\xa7X\xe1\xa2:\xba\x8c\xd2E:\x15R{c|\x83%]\xa3\x03\x89\r=\x91\x1c\xb5D\xa7#\xb3\x95p#\xca\x11U\xcd\xcdE\xde\xaa=J\xf9\xc8\xb5X\x89r\xd3+\"\x9a\x15\xc7\xb7\r\xcb\x18\x9d\xfd6T\x89\xdc\xcd?4[\xd9RR\xd2;j$\xa2\x1a\xc3_j\x8f;\x891\xb0\x98\x1d\xa1\xd7\x9c>\x19\x95\xff\xdd\x8e\xef\xb2\xa63:\x92m\xa81\xd2\"\xa37L\xa2\xf0f+=\x92\xfaF2G\xb4\xe6\xfb\xa5\t|\xdac>\x92\x0c\x16\x01\x12D\xf3f\x8a\x0c\xa7\x18\xdfB\xd8\x1c\x1d\x19\xaf!\xb8\xf1\x88X\xf0\xd8J\x19Kf\xd2<}\xbf\xbe(\xf1J\x8e\x8c\x04\xb5G\xa8\x92\x8b&aK\x17\xdeD\xbd\xba\x08QC\xb3\xf1\xad\x81\xd3\xe8h]C\xccSK\x9b|Y\xb2\x92\xc6QE\x8e\xd9\xceV\x026\xb1.U\x9d4\x8e\xf4\xe3U\xa3=\x9e&\x9a\x97\x14T\xb1\x19)?$\xd0#`!F\xdcO\xbc\x88<C\xfdc\xc3\x8d\xcfV\xdaMM\xd4\xf5\xe4i\xd2K\xf9\xfb&\xaf\xf0c]\xb4\xc7\xa9\xea\xbb\xb6)\xff8\xdb\xbb\x80A\x92@\xb5\x081n\xa2\x97@\xe2\xc5\x8a\xc4\x905\x01m\x8e\xf3+o\xd0L:\xc5\x07\x16\xd9k\xc7]%\x9c\xda\xe3t\xb5\x19\x9d\x7f\\\xd0$P\x88B\x0c5\x1d\x11X&\x88\x17W\x13`<%\x9c\x06\xe0\x03\x0eP\xe4\x7f|\xf7\xe9\xebdm\x9f\x99\x97\xf6\x92\x10]\xb7\xd7(\x92@#\n1\xca\xd8\xacS\xee\x88\x17\x85\x11`t\xd2\x8a\xfc\xc7u\x85\xec\x8a\xef\x16\xe9\x0b\x0fl\xbe\xad\x0e\x19K\xe1\x0f\x16b\x14\x7f\x0e\xbd\x0c\xf4Z\x8a\x04\x82A\x88\x11\x8d\x0e\x15l\xe2E\xe1\x04\x18\x8d\"\xb8\xfa8\xc4BB\xf1\xcd\x82\x8cX%l\xbeE\x0f\x9dE\xf0\x9e\x03\x02\x1c\xe8\x05+\t\x04\x83\x10#\x1a\x7f\xa9`\xc4\x8b2\x05\x18m\x8a \'tR\x02\xe8BK\xf1\xedu\\\xd9\xfc\x9a\x87\xbc^\xb4>>\x16:i\x06\xfa\xc6\x90O\xd6H\xa0\x10\x85\x18\xda\xb8K\x06K\xbcp\x9e\x00\xc3\xabR\xa4_r\x80\xbb\xd0UAt\xda\xc2\xe6w\xfe\x97]\x94\xe9q5\xd0[\x86|\x96\x04\xaaA\x88q\x08~\xebD\xa4\x19\xe2\x85\x0b\x02\x0c#\x91_B\x91\xe5fX\x14\xfa}\xe4\xb8p\xc6`\xb1\xf9\xb4x\xa8\xecC\xfc\xf1d\xa1\xee@\x7fd\xc8\xb7\xf5\x9b$P\xaf\x84\x18\x88\n\xc2\x14^\xd0V\x88\x17\xf4\x17`p\x97\xd7\x9f\x16\x15\x14\xa2\x1d\xf9PP\xac\xc7\xcb\t\x076\x7f\xb5\xa1\xd3\x1f/B\x0f\xde\x0f\x05\xeaR\x0c\x85\xe9p\x90@5\x0b1\x0ey\xc6&\xbcX%\x89\x17\xab\xad\x00\xe3\xcaE\xcev!k\x91\xab@M\xc7\xe6\xcb8t7\x91l\xd1\xeb\xc2_s\xde@\x1f\xcct\x0e\t\xa4(!\xc6\xe2\xb6\xae\x12^\xdcs\xe2\xc5\xad\x02\x8c#\x1bD\xfe,z_\x12\xb0\xd0S|\xb0\x92\x7fg\xf3Q\x1cj5\'\xd1\xa7\xdfP\xf8\xdb\x85\xa8\x17\x7f\x87\xf7e\xc1\x05I\xa0\x91\x85\x18\x15\xd5\x07 \xbc\x88\x85\x88\x17\x11\x0b0\"\x11-\x89\xf8\x89|4L\xd1\xae\x90\xb1\xb8\xc7\x10\xdd\x91\x08ja\x80l\xfe/\x1f\xda>\xda\xcd\xd7\xd0X\n\x7f\'\xf5\x90?:+*\x12\xa8i!\x86/\x07\xa2\'\xbc\xd0\xd4\xc4\x0b\xcd\x04\x18\x1a\x8e\xbc\x89\x8c\xa7H\xe4\xf1\'\x15t|DP\xf2\x8a\xcd\xf7e\xc8]P\x10\xd0\xeb\x07\xef\x80\xcf\x8d\xab\xdd\x19\xe8\xad\xa5\x9b$P\xb7B\x0c\xf4\x84\xf2\x17^P\x83xA\xa9\x00\x83\x19\x91\x8fm>T\xa0\xffTT\xacBrH=\"\x81\x9b\xd7N\xc4\x12\x9b\xff\x05\x86n`\x92E\xbee\xd1\xad\xe0=\xbb!\xdfh\xd3?\t\xd4\xa3\x10\x03W\xa9\xb8\n/\xf4\x17`h\xec\xc8\xa6\"\xf2\x8bE\xd5>\x9e\xa6#\xa6\r \x9b\x0f\xf5\x90E/\xf2\xa9b\xe3t\xb2l\xa0\x97x\x0c\x11B\x8cCz\x04\x85\x17\xa8\x16`\x80\xa4o\xa3\xe0\x8e\x9c\x0f\xa9[\xa4[\x08e\xa8\xd8(\nGd\xc6\xe6S4\x14\x04\xe8\x8b|\xbe(\x19\x0e\xde\x17\xf4\x0c\xdd\x92v\x1a\xb5\x84\xa7\x8f\x89\xbaD\xfe-:\xb5$\x91\xa8I\xaf(\x11`\xf3\xb3\x1fr\x8eVP\xee\x04\xbf\xbb&,\nm\xcf0T]\xc2$\xb5mX\x82N\xe4\xc7\x9b\x1f\xab\x99[*T\xeb\xdd\\\xd9\xfcbC^\x9240\x7f\x91\xaf\xb9\x8a,\xea\x19\\\xd2\xe4{iF\x92\xd4G\xf2\x8c\xc8\xa7R\x96\xb0\xb3\xf9|\x1dr\xf5X\xe0\x01\xbd+:\xa0T\xd6\x9c\x8dg\x18x\xf7\x04\xbc$K\xa2\xe6<\xf2\xc8\xe6[5t\xa7iv\x7f\x1c\xd0\xe3G\xd0{\x86f7\xc6\xd3?\xa3w6\xffF*I_\xe4\x92\xa1\x80\xbe\xb6N\xd1\xc8}\x05\xe45g\xad\xf7\xa6\x15X\xe4[\xeb\x0c1jZeN\xebW\xc7\t/3\x80\xaap\x8d\xf4\xc5#Orv\xa7\x0e\xce(\x82\xbc\x02\x0bP\\\x8b\"\xbb\x01V\x9f\xa5\x98C\xb4\x15gh\xa2h\x94\x90}\x9cLr\xf1*TbN\xa2h\xaf\xfe\xe5\x05\x16P+\x9c\x84>\x84Eu\xd0V\xc4\xe3\xd3\xb7\xd0\xc2\x9a\t6E\xa1.\x89\xc7\x97\xaf\xd0\x13\x05\r\x0e\xce\xdcE\x93\xbb\xb0\x02\x8b,\x88`\x7f\xa8]w\xf8\xe1\xd1V\xb4h\xf4\x86m\xdc?\xaa\x10\x16\xe5\xdcU$K`\xd9\\\xa8\x16\x17\xc1\xe3P\xb0\xb1\t\xa031@[\x11\xae(\\B\xc0\xfd\x0bx\x86~\xa3\xf9\xb81\x15?\x12X\xc6?\xf4.\xb5\x15s\x9a\xc1\xdb$\x9b)n\x80\xf6NNio\x91\xca\xef\x80\x1b\xee\x13(\xb0\xe8{\xe8|\xf0\x1e\xd4V\x82\x9aIa9A\xe4\x07\x8b\xcc9\x8e\xf9B\x13<Ce\"=ZrZ`\xe9t6\x86\xd1p\x05\x14\n\xf2k+\xa2\xe5\x0c+24\xa1n\xa1y.\xfe\xb934\x8e\xe6\x9d\xc0\xb2_\xa8\xde\xe2\x02\x0f\xb1\xda\xd0\x9b\xa0\xad\x84\x898\xc12\xd5\x90i\xeb\"3\xc6\xa1\x1d\xad\xb2\x9d$\xc7\x05\x16b\x87j\xbe~\xdd\xfd\xb4\x15\\\xb4\x8a\'\x11\x05\xcfqM\x8b\xa2\xf6\xb8\x7fC\x86\xc0\xa3\x18\xd2QTCB\xedH\x88\xbb\xf6\x1f \x92 \x93\x04\x96\xf0\x87\x8c)%\xa3\xad\xc8\x9aI9\xea\xe6\x9a\x8a\xe7&\xba\x1b\r\x8d\x87=\xd7w2\x94\xc2b\x88\xa9V\x9c\xe3E)\xc4\xb3\xfcK\xbc\xd3#\xe0p\xe4$4?\t,-\x0cy\xdbj\x13h+\xd9\xa3\x00\x01N\xc6\xf2\xce\x88Y\xbf2\xce\"C\x9aK\x0c\xe5N\xd1\xa1\x84\xf8\xe7>\x10o\xc4\x04\xbcm\xa4fO`\xb9(\x0e\xe0\x90o\xe0k9m%\x9fH\x8cO\xc5\x86\xc2s0\x08E&mdh\x16bHb \xe2\xf1x\x87\x15\xe2\x93\xa1\x89\xf7\x02\x04<\xdeK`\xe1t\xc8m\xd0\xd7\x88\xb6\x12g\x80!\x94\x81\x13\xb2\x94\x08\x12N\x868B\x0c\xa9O\xc4;(:\x0e!~\xd5\x1f\xe2\x8d\x1e\x01\xcf#N\xea\x04\x96\xf0\x86\xf0[Sv\xda\x8a%yD\xb0\xb4 1\xec\x8a{>\tD\x86\x80\"\x86\x8c\xc6\x898+\xc9\xc5\x08\xf1\x07\xca\x89\xf7\xe8\x04\\\x10\x0b,y\x1fr\xfb\x17m\xa5J7\n\x0cbH\xc2\xefz\x1f\x91!\xb4U\x89!\xe9A\"\x1e\x1e\xef\x8e\x10_\nM\xbc\x17\x12\xf0\xb4\xf4\x13\x02K\x18\x87\x0c\xcd\xda\n\x19\xc1\x92\xec\x0f1\xf6\xe7\x936\x0e\x0f\xc5\xb3dd\xc8ubh\xea!\x11\x97I\x88\x87\x9aO\xbc\x83\x13pi*\"\x04\x16N\xc3\xb2\x84%m\xa5Q\n\x84\x85\x95\xc4b,\xfa\xea\xb1\x90\x10\xea\x87\n2\xd4\x0c14\xd6\r\x11\x17\xa4\x10\x0f4A\xbc\xe3\x11p+\xaa~\t,T\x1fB\x11\xd6V\xa0`u\x11,\x7f\xc9#\x95\xc8<\x1d\x90\x1a\xbedH\x8c\x18\n\xb5\x1e\"nT\x883ZN\xbc\xb9\"\xe0\x82\xce/\x02\x8b<X\x96\x8e\xba\xb5\x15\xaaGM\x04\xcb\"\xab\x04u\xdfH\x1bb@h@\xc9\x90\xbc\x18\x8a0$\xe26\xa2\xc0\xe1\x8dx\xeb\"\xe0\tb\"\xb0\x8cKv\x1d\x7f\x9d\xd5VF#\xa2\t\x16y9n\x14\x80\x0c\xed\x89\xa1\x0c?\x888\x86\x10o\xeeD\xbc\xdb#\xe0\x97/\x02\x9a\xa8\\\x0b\x95\xe2*\xecP\xb8\xa8pI05&@J\xf1X,\xa4\xdd\x07\xc2Q\xa1\x80\x0e8\x84\xb3\x90\xa1g\xe5\x0e\x08\x12\xf1\xa7\x10w\xecO\xbc[A\xc0\x9fE K\xe2I2*\xb4Bh>\x92\xf8\xe4C\x80\x8b\x9a\xd4E\x81\x85\xac\xa0A\x89\xae\xef\xd9\xa1[R\x15\xc9;\xc4\x14ul\x94J\xec\xe1\x1aJV\x86%\x19,D<\x95Q\xe2\x1d\x82\x80[\x00\xb8.*\xa1\xf1\xb6$=\x0bAqy\x91\x9b\x1d\x12O\x11#\x16\xd2\xa0j81k\x13g#5\x9e\xad\xfb\x9c)6\xa2C\xee=AX\x02\x91N\xc4-,\x10o{\x088\xd9\xa2,\xbf\xf1\xcd\x96\x84E\x1cj6\xb4t\x11\xb5d_\xa6\x08\xaf\x10a\xc6\'6f\x0e\xf5[\xa4\x982\xc5\xa0\xe2`\x87\xc8uS|$\xe2Y&\x89w`\x02n+\xea\xe5\xa9h1IOB\xf3V\x10\x19j\\\xfe\xe3\x8b\x9a\xc7\xffQ\xf0\xd5\x1b,\xa4\"\x8b.\xb9Qv\xd9!k\\\x08b\xea\x89\xc7\x84kX_T\x99\xa8\xa4EX\xe4/\xdc\xe1\xbdg\x11\x80\xad\xd6jh`!G\xa2\x06E\x9b/D\x1e\x0f\xf9\n\x91\xb9j\xe2\xd19\xca\xc8\xa2\xe4R\x97\xb4\xc7\x03\xf9vC\x80/Zd>CUj5Q\x11\xbf\xe4(\xa0\x83S5D\xae\x9a\x8b|C\x8b\xcb1.\xf2s\xa3\xcc\xdbC\xd6\x84H&6\xf1\x98r9Y8J\x11`\x8f\x13\x8a\xd0\x1c)Q\xbd\x13,\xd8\x16\xfc\\\xb1\x90\t\x1c(\xdaJ\xb92E\x7fpxi!\x92^M<FG\xa6MTX\xd1\xd9AX\xdc\x86\xce\x11T\"h\xf9\x91EE]t\x1c\xaf\x9a\x1a\xb0s|\r\xc9\xd1|\xf9\x17\x01\x8e\xa3\x0b\x89\xc9!\xd2B$\xbd\x9ax\x84?\"\x8b\xba\xa2\xb4\x986~m\xa3\xfd9N\x96@\xe0\xd6\xd1\n\x97\xe3 j\xfa\xf8\xf5\xea]8g!y9\x82\x83\xd9Q\xda\x14E(\xa4\x9a[C\x80\x85\xc8g6\xf1H\xe6\x88&\xba\xcb\x9d\x8b\x0c-\xa6\x81!,\xa6\xfb;\"*\"\'\xe4&\xe5s\xb2,\xa4\x8a\x96\x9eE\x89\x8e\x8aJ\xcc\x14\xcdz\x88\x02!\x92\x9cM<\x86\x8e\xd6\xd1c\"\xfd\xa3\x03\x86\x18\xf5\xb1\xcc\x92G\xf9\x16\xd5\x03z\xe9I-\x15*\x03?\xba\xbe\x14=-2Q\xa6\xc8{\rm\xf4B$\x8a4\xf1\xe8kD\x93\xaa\x14\xa5|T\xcd\'+\xd1X\xf4\rcI\xb6\xb0\x88\xe8Fk\xc2Q\x16q\xa4\x90\x03\x15d\x84^\xc3 )p\xd4u)&\x1fb\x8ej\x8f9Sdx\xc8\x1c\x14\"\x19\xdc\x13\x8f\xdd^rz\xb4\x96h[T\xd3Sr\xb2\xb0X\xee\xa3\x98\xb3\x832QT\xd2\xa9JQ}d>\x02$\x16],\x94)\"\xcfC\xf6\tAdh\xe21n\xc9\xce\x9b\xb3v\xf4dE\xcbm\x92(\x94#]\xb0\xe4\xbfR\x14\x91G\xf4\"`3\xc5\xc7\xf6\xd0K!2qM<\xda\xb5\xcdoR,\x99\xc7K\xb2\xbc,1\x8an\xa72)\xaa\xde\x1e\xa1/\xc5\xfew\x94\xe1L\xb1K?h\\\x88\xfc\xee&\x1e\xf9t\xc6\x13\xc6\xf3fr\xd9c\xdf0a{\xd4\x1b%\xaek\x80\xb4\x16\"\xe9}\x9bx\xc4\x19d\xf4_aQF\xb9})\xdc\x1e\x85F\xb3G\x026\xd4\x81\x10YN\x13\x8f\xd1\xb4\xd3\xadT\xff\x03\xb5\xf2\x9c#j\xdb\xa2h^\x05#\xa3D\xea\x8bh\x8c\x18 a\xb5\x89\xc7\xca\xe9\x10LE\x01\xfbA\x9a\x87\x8b\xc5\x81\xc0VUzA\xf6hs\xae\xe2\x94\xe5\x18 c\x05\x89\xc7p6\x94\t\x83\x8ap\nq\x8a\xc7E\xd2m(V\xa4\xed\x07\x11VH\xc4\xf8\x82\x80C}\x91R\x8e\xf3\xaaP0\nb \xd6\xc7\xb7\xb7\x850:\xe3\xe1P\xd6\xa2\x85\xe3\xb7\x85~\x8b\xdb\xbeCJ\x17\xb9\xe3Q\x0bY)\x08\xf3\x86 \xb6`G\xb3jF\xa1\xd0\x1b\x13dW\xd0\x05\x14\xfek\'\x8e\xef\x19\x81\xc9\xe8(\xb3ClQe\xc9\x9cPL\x8e\x0f\x85\xa8\xe2\x02\x0b\x9a\x18r/\xe2Z\xd2=\x1e\xd4\x1b\x0b%\x15\xa7\x14\xfe\x87\xd6_\xc4;\x9e\n\x9d\x17W\xc8\xc2\xd1\xac\xd0\xe3{W\xa8\x8c\x8e\xc7\x1b\x82P\x94\xf9\xb8\xa8\x10^\x1cq\x1d\xbaoZ\x84\\\x88\xac\xb8\"1\xd4N\x84\xa5\x8b\x82m\x06u\n\xe9\xc5QD\xc8\xf8.#\x83F\xa7-\x87\x82Z$\x8e\xc3\xa9\x85\x02(^;\xa4m\x11\xf9q\xafBj\xc5\xdf\x0b\x9f\xc4\xbd(p\xdc\x17\xc2\xf6oq\xae\x05q|\xcf\x08LFG\xf9\x0eq\"\xd5\xb7\x08[\x92?\x9e]H]q24\\\xae\xa6\xa8\xfe\xb8,$\xa3\xf8dh.\x0f\xf5*B\xcfBT(hQ\x89\x8e\xeff\xf2ut\xc2\xcd\xa12\r5}]\x04P\x88\xec\xe2J\x89\x0eWQ\x97\xffx|\xdd\x07\x14\xaae\n\xf6\x90Ao\xb3\x08{\xfcR\xc8\x9b\xe2\xc0@\xeb\xf1\xdd\xbbUG\xc7\xa3\x1b*\'Z\xaf(Y\xe8\xac8e\xc8\x9c\x08\xb9\xfcJQ\xb5;Z(\x17_\xa8H\xf7\x91\xed[na\xd1x\x1c\xe9BQd\x8c\xef2\xa2{t\xda\xe7P\x01\xfc\xcb\xfd\xa4\xc0\x98\xc8\x95\"i\x17\xa9\xf7\xccv$>\x04\x9a\xdb\xb3\"\x06\xc7W,~DL\xc7wS\xfb\x1a\x1d\x956\x94?\x1a\'k\xd7\xddE\xd3\xbc<\x11X\xa9\xa4\x88\xc2\xbb;+\x08.\x86H\x9ak\xd1\x10@T\xa4\xc9\xe3\xca\xe8\xe3\xf1\r31G\x07\xdf\r\xed\x11\xeb:\x91\xcd\xa2\xc5q(\x94\xb3x\xe5 _\x8e|s\x9bH\xe0\'$\x1c\xba\x0f\xb3\xd0~\x83\xe5\xeb\x11\x9b\xb7t\x14Q\x83B\xb3w\xc2\xf8\x9e\x19\x18\xa3\xa3\xcf\x86 G5C\x97\xe7$bz`QZ\xb4t\xa4\x94\x88\xa0Hv3\x0f\x11\x9b\x83\x85\x18\xcatd\xa6\xd4\xd6\x1bb~QE\xdd\xe3\xdb\xc5\x0e\x8e\xce\xa4\r5\x1b\x95\x8f\xdc6\x17\xcc\x8a\x88\x0c\x9c\xb8\x91\xceQ,\xcdqEi\x06\xf8\xe2a\x13\xfed\tp\x04,\x91ePDr*\x1e\xdf6-st\xf6\xd9P,ih?B/\xd1\x99E\xefI\xfb1?\x92\x89\xa2\x0f\xebR\xc4W\xc0\x18;\x94D\x92\xfe\x11aE\x8b\x89\xee-r\x91f|\x8f\x05=:\x02k\x08\")\x1b\t\x9cG\xe0D\x93\x17}z04L\x02\xf2\xa8&\x92\xb3l\xb060\xa9\x89\xe5\xe8\x92\x7f,y\x11\xdb\xc8\xf1]L\x8c\xd1\x89\xb1\x86:K\x9a\xea\xe9~\x82\xf1C\x932>*7\x06l`\xa1!\x81j*\xf5Hr\x8f\x06}|\x97)\x02y 9\xbe\xf1M1:Ll\xe87Q,\x1d&\xa9\xd8\xf8\xb29\x9f\n\xeeb\xd3\xfb,\xbf\x04C\x02\xbd\xd8\xbf\xe9\xf4h\x81\xe5\xe8>\x14\xcd|\xf7<n\xdd}\x80\xbbU\x11\xcf\"7<\xbcD~\xd0W84Mm\x94\xf1\xa4ijKQ\xff\xe4\xf1(\xfd\x83[\xa2X\x9e\xba7\xb9\xe3\xa4N\x07\xa5\xfa\xd4\xa5\xed\x9b\x18\xd0\xa4\xda\xb6\xf91\x90\xab\xab\xc9\x1c\x0734\xb3r\x80+\x92\xeb\xb7TK\xd3\x1f\xfeaeh\xb6\x88\xcf\x92)P\x142\r\xac\x18\xf9\xb0\xed\xc6\xa9G\x86\xd3\x87\xdb\x91R\x00\x7f\x15\xa5\xaa\x84\xb5&\xb6\xe8\x8b\xed\xa8\x8e\x1e;\xaaQ>\xc0m\xb3\xa8(\xfd\xb3}\xa9\x18\xca\xa1\x8b\xe7\xdb \xf2\xc0\x13!\xc9V60\x1a\xa06\xf4`\"\xdb\x0f\xfd+\xc6\x0c\xa0/\x06]\xd3\xa1\xc9\xe8YcS\\\xfa\x00\x17\ry\x02S\x8aGCX\x1c_Q\xa2%\xab\xe3\x93\n\xdd\xc5E\xe9CyQ\xbd\x1d\xe0\x84\xc0\xe3W\x85>.\xbe\x99C:\xadK\xe3\xf0B\xa8:\xb8\xa2\xb4\xa8q\x15f+P=j\xd2y\x80\xbb\xc3\xf0\xbb\xc8\xb3\x14\x94\xc7\x1fU\xa9y\xd8]\x84\xf3\xb8\xbc\x10\xfd\xc8\xb1\xe2\xf5)\xfcu\x91\x9b\x10\xde\xf1C\n\xedR|\xd8!)\x8a\xa2\x12\x9a\x8fKV\x08\xc2\xe6HJ\xd2\x95G\x8eN\xe8\x17\x0ep\xad\xf4A\x95\x81\xbc,\x9a\x1eo&\x89,\x14[\\S\x0e\xf9+\x8a\'J\x1e\xa7\na\xa9\xb8\xbe\x1a\xaa\xc1YQ\xfa\xf8\xb5B\xc6.N;\xb4H0\xde\xfa\xf8!K\xdd5R\x9e\x12\rp\xa8\xbb\x07\xbd\xfd\x0c\xf8\x17\x8d\t\x81\xe3k\x85\xfe\xb5\xb8=\x84\xa7hqB\xa5Yo\xa8\x90b\x14\xbf\xf3C\x8cP4\xf5\xb8\x17\n\xa1\xcfI\xbb}\x97\xd1\xa8\x1fw~\x0c\xf0(\xb7\x96\xc8\xed\xb3^+e\xc0\x08\xd9\x9c\xe7\x10\xbc\xb6j\xd1\xdd-!8\xbe\xad\xc5\'\xbb\xa2\xee\xde\xaf\xe5\xf8E\x83`\r\x11O\xf2\xbf\xa8\xf0\xf8`\xa1\x97\x8b\xcb>E\x94mQ<\x94\x8cB\xe3\xd1-z\x80+\xb6\xc5\x8c^q\xb9nx\r\xe9RT\x7f<S\xe8R\\B\x1d\x8azl\x91,\xa4\x1a\xc5m)\x06\xcd/\x8bp\tA\x1c\x85\xb2\x9b\xa5\xfcf\xde\xe2I\x16mFeh\xc7\x88\x98\x03\xdc\xa5\xe8=\xd7\x12S~\xff3+\x05\x16\x00/\xbb\xe8~\x97\x9a\xa7Po\xc8\xde\x00\xb8\x8dF\xd1\xd25y|\xdbB\x0f:\xc8.\xc7\xd1P\xeb\xa2\x96:\xa1\xf4X[zSG\"B\xce\xc41\xf6\x1c\xe0J\xd1\x0b\x98:\xf8k\xa5\n4\xc5\xf0\xec\xa1\xce{s\xc6\xbd\x99\xcc\xbd\x08v\x9d(`0\xe3\xbd\xff*\x94\x14z\x8ezA\xf9\xf1\x98A\x1a\x89\x9c\xe0\x16Q0c\x1f1\xea\x92\xf4\xa4\x1a\x8dp\x90\x9e\x866\xd8\x97\x9a\xe2*\xce\x16\x00v]\xd0\xf1\xd0\xdc\xa7@\x84\xf5%\xd17\xa9P\xd4K\n\x92\x15*\x1d\x1a&Rr\x12\xf5\x15I\xed\xa0\xb2\xc4\xdc\xdf^\xffl\xe4]r\xe9\xfb\xf3\x8e\xd7\xa3W\xd0aI\x86\xb6l\x0c\xd7\xe0u\x83\x05\x10\x9b\xcf\x0b\x17]\\\x9a\xe9\xfbO,3I\xad;\xe2\xb8@DK\"\xe4rsU\x9e\xc8 0\x8fb$J\xe2UQi\xad\xec\xf6J\xd2\xf5\"z\xc6!\x08\xde\xfc\x1b\xf2-4B\xf9\xfcr\x9c\xce{\x7f4\x84p;\xe3?\x9d\xa4X\xb3\x97m!\x1d\x9d\xf9\xa4.\xda\xce5\x14\xaaT<\r\r\x1eaJ\x94\xff\"~*\xd4\xc2\xa0\xfd\x88\xa7\xef\xd7{\x17Ud\xb9\xb4\xa8\xc1e5\xf0~\xfcu\xd2\xbf\xb0P$\x16\x84\x8f\x1f\xd8\xe1\xd2\xbcM-\x17g\x9eL\xaf\x1c\xed\xcd#\xbe?4\xbcf\xc5\xff\x8f>\xdb\xe9^LH\x19\xe4\xab\xa2\x98\xeei5\x9fQEm\xb2\x98\xf0z\x02#\xcd\x99\xb2\xb1I\x9e\xa6\xd4\xfavy-\xc8R^\xc4\xe4^\x07\xad\x1b\x00YGq\xee\x83\xb7G\xe0\xb0#\x8d\x0fR\x9az<\xac\x1b\xe9h\xf8r,W\x91E\xac\x18\xb4\xd4\xe3\xffH\xc9\x81\x967p\xd1\xbc\xd2a\x95\x94\xe8\xa8:\xdeZ\x8bd\xa6L\xc4MGq\x18D3\xc9\xa4\xbb|t\x9a\x07\x96\x0f\xb4\xe87:\xa4o/\x9e\xe7=\xa2r\x07c[\x8a\x18:KM\xfb\xfd2`C%\x95\xb7=\xb9\xef\x8c\xdd\xc1f\t%QU\x9c\x9a\xb8.u\xb7\xcd\xa5\x1e.\x86\x97\xc9\xd5\xa1\xfd\x92`~\x96\xb47k\x1d\xad\xe3z\xdd\x9e!}J~\x85\xfcKjU\x1c3y\xf5E\x10\xb8\xd2\xf9\xa4\xca\xd3N\xb1\xad\x89\xd6\xe6\xf9\x0c\xed\x9ab\xde\x8f\xa0\xbb5\xe4\x19Z\xa34-\xfb\xdcV\xd5\xd2\x1a\x8a\x0e\x15\xf1d\x15\xa9\xe0\xbd\xe7\xa5\xe2\xfd\x9eY\x9e\xed\x1b\x86\x84)\x84\x9aO\x92&m\xc3\x16\xaa\x87\x1e\x1d\xe1\x19\xda\xeb\x94\x15\x8f\x8c\xf4\xf4:F\xec\xb4\x80Rie\xf2\x9f\x82\x97\xacR\x00\x91D5D\xb5\xb8\xc7\xa9\x013*.\xc3|\td\xc8a1{;\xdd\xde\xa2f\xd5\xba\x19\xfe\xe8\x06\rqi\xab\xe9-Y\xd6\xee q\xc2#\xa3\x94\x9c\x9d\x95\xc9ft\x86|\xd2EN\xb2S\x88\x17\xbf\xb7\x87x\xea\xba\x08\xd2&36S\xa4\xfc\xa1SO\xed\xfbq\xac\x90\xca\x98\xe2\xd2CCR\xda\xa2\xe0qY!p\xc5\xc5\x8a|\xac!\x93\x02E\xea\xb8\xe8B\xe6\x88HBEb;\x04\x00\xd8\x84\xfcB\xec\x91{+^\xec\"\x87|\x86\xd4\x8a\xe8\xe8\xf1\xd4\x85\xa0\xc5\xd1\x05\xb5g\xc5\x10,\x8a\xdaq7Rh\x13U\x1f\xb4\rQ\xd4\x8eg[\xe8P\xd0\x1aUh(zQ\x02%4W\x08\x17\x87\x94\xc5\xa13\xbe\x08\x9f\x10\xa0~\xbe\xd0\'\xfe\xe2\xc8\x195|>\xd4\x9b\"\x8a\xe8\x85\xe0\xe2E(h\xd1g\xc8<U$yI\x8c\xbd\xd0\xd8\x82F|\xc81\xc0\"\xe1\xbap\xa1\x91\x07\xcd\xb3\xc8\x19r\xf8\xbc\xcb\x9d\x17\xe9\xc7E!zq m\xa3\xa1_U\x8b\xf0qXHdG^\n_rHk\xf9:\x8a\xb4\xc7\xe5B\x94/\x0c\x0b\xa7\r_C?&E\xe4(\x84\xafx\xe4<C\xdarH\x1eE\xbe\x85\\G\xa6\n\n\xaf>\xe4g\xb9s*R\xd3B\t]\xd0\xa0\xa1\x8f<\xd1P\x86\x8fK.\x16\xf4Q\xa9\xcd\xee\xa0!\xdc.\xe2j\x14\x9a\x15y\xf10\xa4/\x9fS\xa4xD4\x80\xc4\xbb\xe1\xe1\xf3\xa1\x96\xc0I\xfe\x8d\x17\xddD\xccB\x95!\x8b\xee\x0cE:\x89\xce\x1b\x82\x16\x01\x97\x04)4*\xbe\x8e\x86f\x89\xb2\xe5\xb6R\\\xe4b\x9b\xf7\xfd\x16\xe2\xcd\x84\x9b\xa8\x86Ou\x14^4B\x8b\x04 \xb1=>\xb9\x85\xd8\x00;\xfe\x0b\xb2\xcf\xfe)\xdd\xbe\x0cEF\xd2\xd1\xfc\xd8\x8f\x87\x8cY\x8bK\xdd\x8d\x11\x13\xf8\x01\xba\x1c\xd1],\xc7\x98S\x84\x14\xa2.\xaev\x88\xde\x88\x0c\'B\xcb%yQ\xfc\xfc\xbb\x10l\xdd\x194\x86\x9b\x17Q\xef{c\x7f\xb4\xc8,\xa49Wc\xf6\xf8\x10\xb5\x88SN\xbcy9t\xd2\xcf\xe58\xf2\xdf\xb6\xd3\x00\x91\x0cn\x8f\x94\xe6H\xa2\x91]T9.\x0b\t[\xd0\x8c!\x8fGl\'r7w\x8b\xce\xe3r!\xd3_\x82\xd8\xe3\x11\xba\x17Q\xf7B\xd1\x9aE\xe1)\x03\xcc\xbfD\xca\xef\xa5\xd0S\xd4\x0b\x05\x03\"\x11\xb9\x81Z\xd0>\xe2\x01\xef(C6@\xca1\xe4<\xa2_D>F\x89K\xd1F\xa1\x05\x0ei\xb4E\xb2\x89\x18\xee\xa6\xf5\xe9\xa9\xd9\xc0\x12o\x9b\xe2\x9f\x8f89\x155\xa1\x17\xf5\xf9T\x1e\xcb-\xc3}\x8c\x01\xa2\x88\x84\xaaq\xdc+\x04(\x87*:,5\x0e\xf4\x11\x03Tk=\xd5R|$\x15\xd9=^\xfd\x10\xbbF\x7f\x8e\x1a\x1f\xce\x07bz\xb94\x16\xa7\xa9j<*\x92.Z\xa3\xe7\xc3O\xf1R\xdf\x152\x06\xc9Go\xa5\xfd>\x89\xfa\x0f\x8b\xd4\x8d2\xc9\x00i\xe2\x0cq\xff\xbcI\xcc\x8d\xc0\xc0Q\x10E\x86B\x9d\x0eq%\x8d\x044y\x8e\xf0*\x0b\x18\n)j\\\xae\xc2\xb0\x98\xfa\xf09->\xba\x04\x10f\xd1\xa1\x9aIKq\xea\x13%4}\xb7!\x96\xec\x142S\xd7D\x9a\xa3\x11\')\xc5\x97\x97_\x88\xf3\x1a\x96`6Db\x80\xae\x9a>D\xd1\xbe\x1bfR8\x91`\x17\xe9\xf3!\xf2I\x8c}J\x03\xdcs$\x03\xa1Y\x87,VX\xdf]&5\xd5\xa0\x8f\x96\xc4\x10\xee\x8a6\xa8\xae{\n\xef\xa7A\x18\x8dJ\x06r\xdc\x7fE\x1fY\x1bc\x03\x01\x18\xa0\xb64\\\xbfB\x05\xa0%>O\x12\xb5\xa3:!\xc1\xcdB\x02\xd3CV\x92\xd2\xbe\"\xd1#\'J\xfa\xaa\x0bo\xaa=)\x8fQ\xa2v\x14R\xc3b\x17mY\xe5\x96\xa3\x11`V\xe8\xb0,Gj\xc8;\x1d\"\xcf\x00\x1dw\x92i\xeekR\x8a\xf2^\x8f\xdaF\xe3|\x88Q6\x8d\xe1n\xc2\x12\x81n\x8e\x8c\x96\xe0_\x18.\x90\xb4r\x84z\x15.:?\x95u\xa9\xd9\x8e\x9a\xbe\x04]\xd4Gb\xc5\xe5\xc6\xccGY\x0c\x90OO\xc0\x88\xcffe\xe1\xa6\x13?\xb1@\x8e\x80\xb4\x85\x87~\xeb|\x87\xedD\xf9\xc9\x11\xb4\x86\x88\xc6\x12)\xc6\xfc\x9fO\xb9\xb1\x92G\xdc\x8b\xbe\xa5u\xfa#\x1bbi\x80\xfe\x1epc\x8e\xe5\x19z\xef\xf8-\xc0\x1f\x92\xbck\x1d\xff\x848\xc1\xa4\xf1\xd6\xa9U\x7f\x91X6R(S\x11J\xf0\x15I\x0f\xe5\xa3\xc0\x01\xf2\x9c\xdeK\xf1\xac\xfe\xa5\x1f\x9b\xa4\xe4\xe2\x0b\x0e1\xdb$\xeaxp\nv\xe5xx_\xff\xa2\xf9\x052\xe4\xef\xab4\xa2&\xf5\xe1\xd6\x1f\x1e\xd1\xfb\xb8l\xef\xc4\xa9<T\x1d\x1d\x9e\xb3\x81V\x0bG\xd0(\x7f\x1e\xd0b\xc3X\x83y\xa8\xa6\x08\xda\x92\x9b\xe31\x85\xb2xh\x1c\x8d\xf5jR\xb8T!\x18r\xb7HeB\xed\xf8\xc2B\xb3\xe2rs\x1d\x94\x1e\x12i=\x05i#m&\xf5\xa4\x08\xb2\x15L\x01/\xd5\x87>Hw\x0c\x82\xc7\x0f\x07\x0erCY?\x8f\xa2\x1c\x9a\x9a\x9d\xfa\x82\xf2\x8b\xca\x97\xecI\xd2z\xc0^\xbc+2\xee\xe7c\xd5\x93T\xeb4t\xf2\xb8\x08\xabA\xccv\x7f\x15\xf4\x8b!b\x87\xcb\xa4\x9bj\x15T\xae\x0b\x83%\x92\x92Np\xf4\xa2Q\x0b\xa4p\xb0\x01\xe1\x0e?H2N\xeb\x1e\xbd\xc8NX\xa7.z[\xd2P\x92W\x08\xd5JU\x91\xfd\xe5\xe2P\xde\xbdH\xd08\xb9\xe3\xb3B\x0f\x1b\xd7\xffC\xf3\x9cg\xef\x9a\"\xa3\xec\xda\x0f\r\x82\xa5.\xa2%f\xbc\x1fL\xbbS\xfeT!G\xe3*\x06\xab\"]\x04\xbb\xe4O\x92i\xa1\xbd\xf8\x8d\x82\x06b\x8aVRHe\xe8jCR\xcc\"\xf7q\x7f\x92E,^\\\xeb\xc2]\x1c\xf2\xf9z\x11\x9d\xa7\xeeG\xa9Sh\x153~\xc9\xdc\x1a\xbeO\x81)\x03Q\xaf&\r+j\\\xd2X\x92\x7f\x93\xd1\xf4\xc5\xa7,\x9a\xc7%\"{\n\xednH\xd6\xd0\\St\xd4\xb8\xebq:\xf6\xe3\xdb,\\\x93\x1cJ\xaeI\xed\x96\x04\xcd)\x18*\xc1\xa2xqZ\x91\x0b6d\x89\xeeX$j\xc9\xb9N!\\|+R8\xe4G\xd3\xd1*t\x1a\xf2\xa1\x94\xe8B\xbb\xa2\xb3\tY\x16b\x7f\xdb\xe3e\xecx\x88\\h\xc3\xf5\xafp\x98\xf6P(\xa0\x1d\xe7-\x94\xe9\xe8\xfb\x90-J\xbc\"Kj\xb27,tJ\xe4\xa0\xa89d-\x14:\xc5a\x86\xc6\x89D]\x0e\xaf\xe8\x86\x84\xa4=\x7f\x81\x04W\xcf\x16\x92\x9c\xb5\x1b\xc2o\x91\xbf\xc0\xa7\x90zq\xe5\x1a2\xb5\xa2\x14\xcc\x0f\x14D\xc7\x83C\xce\xed(AE\xf7\x00\xfc\xf1\x1aagH[Ev\xbcp\xdf\xb9\x18\x86\xacP\xf4\x19\xee\";8\xfe\xf38T\xdc\xaf!udJ\xf49\x8bT\tMM\x92\xccQ\x9f\xe5\xbb\x8b\xfa\x85\xbe\xe2\xf0!\x87#b\"\x8b\x97+CE\xf1\xe3h\x7f\x17\x18\x0c\x99\x159\xea\xe9\x8f6\x19\x95\x86\xac\x04x\xc7/\x0be\xe8\x90\'0Q\xcaK\xea\xa8?\xca9J\x84(\xb2_!\xe1\xd0\xdb\x1f\xbd[\xae]E\x8cx\x01\xaf\x0c\xe5\xc0\x97\x94>F\xbed\xb5\n\xed\xd0WI\xf0\x9e\x8e\xe8r\x99\xc8\x19\x16y-\xa4\x87`\xfaH\'bh\x91h\x85\xe0\xa1P\xcb\x8f\x9a\x14i\x854~\x01\xac\x81\x86\xce\xeb\x88\xc4\xe9<\x1em\x08Nr\x9a\xcb\xd1\x94\x17\x9d^\xa8\x92\xf8t4\x94\xe8\x98\x8br\xf1\xab!\x81\xd1\x1c\x858\x91/E.\xb7\xb3e\x03\xa4K\x8a^\x18\xd4[\xa8\xe8\x86.IW\x1du\"\xf1rv\xaf\x81F\x85\xa9\x1a\xe2\x96E\x90%\xf9\xfd\xd1\xfdBm\x07S\x99\xd5\x85Jn\xaf8\x86\x86\x9c\x96\x96{\xec\xe60Y\x924\xd6\xf9G\x99\x14)\x15R\xc3\n\xbb\xf5\x82V\x87,\xf5a\xad8^J\x8c\x85\xfa\x11\xc6\xd3\xbe\xea]\x92\x8f\xa2J(xI\xe2#I\xa4\x1dj\xf1\x10J\xdfe\x16\xb0\x99\x82\xdeB\xcd\xb5\xa3\xe1\x92\xe0\x0e$\xe9\xc6\xe7\x96\xb2jU\xeb\x99JM\xde\x94&\xe8\xf0}\x80d\xa9;\x16\xf36\x85\\WE\xa6\xe8\x0e\xc0PhgN\x8b0\x02c\x1d\xb9pK\xfc\x93&\x90\xda%\x9d\x08\xf7u)\xe1\xda\xa5AQ\x84\x1d\x0bHp!(9\xe5H\x8ar\xfc\xbbSJ\xa4\xb8\x7f\x87\xc2Y\x80\'\x03\xa4\xb9\x02b\xb8\n\xfc\xc0\xa2-\xfa\x1e\xc7\x93\xe4.$;|x\xc1\xca\x146\x14\'\x91\x06\x08\xf7\x03\x0b\x16\x7f8\xb1\x07\x88N\xb6\x01\x92\xac\xfa\xf4\xc0\xd2\x1c\x97\x9d\xc3\x89\xa6C\xa1\x08\xca\xb4\x01J x\xe5\x03\x8b\x04\x7f8\xa9\x13\x12\x1d\xce\x06H\x16\x04\xcd\x03\x8b5\x7f8\x19\xbe\xc4*\xca\x00!s\x1bX\x10}\x86\x13\xcbIt\xc1\x0f\x90\x1a\xbf\x81\x85+3\x9c\xe0R\x02\xcc\x7f\x80\xc8\xc7\x1aX\xb6\xe2\xc3I(\x08\x80\xf6\x01\xa2\xc6m`\xd9\x8a\r\'\xa1\x9c\x00s\x1e \xf2\xb9\x06\x96\xad\xe0p\x12J\t\xd0\xd5\x01\xa2\x03k`\xd9\n8\x9c\x04z\x0e\xf0\x82\r\xd0h\xb4\xad\xf0S\x0f\'\xd0\xa2\x9b9\xc0\xe3\x1e\xa0?j@\xdbp\"\x94\tb\x0ep\x88\r\xd0i\xb4\x81\xe5V\xba\xe1d\xd0q\x80Gl\x80N\xb3\r,\xb7\xc2\r\'\x83\x8e\x03<b\x06\xe84\x1b\xd6>\x9c\x88F\x12v\x80C|tN\x93\r,\xb7\xda\xc3\xc9\xd0@\x840\x1a\xe0\xdf;\xb0\xb0\xbb\x87\x13~p\\29\xc0c/\xf11\x02j`\xf1\xda\xe1\x84s\x17(\xca\x1b#\xe7\x07\xb8#\xe3\xd1\x85\xf8P\x06\xfb(Tl8\x11\xff\xc0\xd2y\x8f\x8e\xaf\xe0\x97\x0b\x0e\xf1)\x8c\x00\xd2\x0c\x9ed.\xc2v\x9fC\xf3EUKv\xaa\x8e\x0f\xd5\x16\xc7\xc5\xa6v\x18d\x96\xe5-\x1a\x9b\x16\xb8\x80yIKd\xc9w=\xba.\x82Sk\x16\xf1)Y\x00\t\xb5C\xd4\xc57<\x95e\x8f(R\xd5%\x13U\x8c\xc6\x17\x84`\xd3\xcc\x86\'\x1a\x96\xa3G\xb0\x17d\x9b\xab\x96\xda\xc9r0\xb8\xb1\xb3\x08\r\xd7\x15\xf1Q(\x80r^U2\x85\xe0\xc9H\xb4\xe7\xdc\x90\x9b\"q\xd6\x16:\xe0l\xda\x19CO\xdaK\x13\x9d\x9c6\xfd\n-\x9bs[\x04`\xe8):.\x16a\xe3\xbc\x9e\xf8\x88\'\x802\xfb\x02l\xf5\xde\x1b\xdaD\xd1\xe4g\x7f\xbc:\xfal\xaa?\x04\x1fS\xd0P\x0cU\xcb\xd9M\x7f\xd8\x05*\xe2F\xfd.\xa8\xd0gB|b\x0b /\xf3\x17\xfb\x08\xeb\xfe\x1e\nj\xe8\xa6\xc8\xce\x9b\x90\xd0\x89\x85x\x16\xdf\x85M\xdd\xc4Pk^\xf2\xe3#\x04[\xf0\xc7\xd2\xad\xe4\x83\xe1\xd1\xbd\x0b\xce\xb3z\'>%\x0b \xc5\x80\x8fJ)x\x00\xa9\xd4\xe3!\xb9\xfc\xfd4\x8a\x8eM\xc8~!\xd6\x14\x9b\xda3\x84\x1e\xe8a\x12\xf7g)4-_@6\xc5E\xf2\x8c\xb1.\x04\x93\xfd\x9d\xf8\xa0&\x80\xba\xbb\x89X\x07^\x94D\x99\x9e\xbe(\xb3\r\xc5\xbb\x8b\xe2(\x14\xa4!\xfeA\x13\xf6<[\"/\xf85<\xd9r\xdc{\x8c\xd9B\xc8/\xd22\xe2\xd3\x0e\x014\xc8~\xe1\xe0\x04\xa8\xf7C2}\xa2\x04\x16i\xa6B\x12\xaa\x11\xeeP\xd1\xe6\x93\xe879\xbf\xc4\x8f\x7f-@pi\xb0<:\xfbBH\xec\x16\x12\xf1\xd9\'\x80\x02\x9fn\x830\x0c\xf5xm\xae\x121\x1b\xca\x98\"\x80l\x1a\xc3\xd0W\xa2\x1f2\xaa\xd7\xcc\xe5-\x0b\xae\xe9\xe8\xf8\n!}\xc19\x89\xf8\x94*\x80\x94\x8fD\x0c\n\xad\x88}\xe8\xd0\xaa\xe6b\x96\xab\x80EFcH\xdb\xe6_v\xf4Q9\xbe\xe5\xc7\xbb =\x8e:K\x08\xd9Wr\x0eF\x02\xd1@\x00=\xe3\xdd\xf5\x8bv\x94\xfb\xb4\xa3m\xaeG\"}\x14Y\x03\x9b\x96\x87\x06w\xf0E\xc8t\xe4\xc4\x03?\xba\xe5u\x17$\xc1Q\xed\t!\xb3\xf6\x146D\n\xa0Go\x98\x00Uh\xe3*i\xd4\xcf\x1d\xeaH\xebEU6m\xda\xd0\xc70\x91\x8e\xe6\xfb\xc1\xbd\x87\x97\xe3\xe3\xa8\xb3\x84\x90_\xed\x9c\x0c\xd1\x02\xe8\xb2\xef\xbe\x7f\xf0\xbb\xc70\x93\xca4\x94\xa5\x91\xfc*\xe6t\xdf\x1c\xa1\x96\xc2=C\xf7\x84s\x19\xae\xaf\xafO\xfc\xa8\x1bM\xf0\x11\xcb\x8a\xd6k({\x9f\x03\"\xe7!\xd7d\xf8\xb2T\xca3\xf4%Y\x9b\x88,\x00\xaa/\xaed$M\xf1\xa1\xff\xf0\x11M{\x9f\xccj\x9aSN\xd9n\x99f\x1d\xea\xb7HZ/\xec^\x87\x0c(\xdb\xd0\xd4\x92\xef3\xa4Zl\xe5\xfc\xdb!\xaa\xeeDL\x8a\xd5\x83\xcd\x12)\xc6J\"\xc0\x10\xc2iB\x8c\xad\x03Q\x96\xce\x91J:\xc9\xcd\x91\xd5%\x8f\xda\x81\xb8\xf2{\xa5\x90\xd5\x03\xfb\x89\n\xeePl\xd3\xaf/\x9f9g\xe0\x99\x9apP\t\x0bB%W\x87\xf8\xcdBhzB\x1f2\xed\xfa\xcf\xa1^\xa3\xfb\xf8KI}\x1cb<4d\xf4\xec;p\xd6\xcfq\xb7\xac\xba\xbe\x07\x9e\xfe\x9b%k\x89\xb3\xe2\xc9\x8a\xaa2\x1dpJ\xd83\x92\xfe\x7fM\xdb!\x84\xc5}6P\xfbP\x0e\xbd\x89rM\xee\xfc\xde\xfd\xf9\xa1\xaa\xa2\xd2\x96\x84\'\x84L\x92\xe0\nm\xa18B\x83\xd8T\xeci\x7f\x03\x8ej*\xf8\x10r\xdf\xe7=\x14/*\xef\x92\x90`\x92\xe8\xd8\xfc2\x1d\xf3)\xbf\x01\xa8\xa9\x04\x8d\x1c\x10\x1a\xbd{\xb3\x1ez\x92\xa2\xf0\xb8\xd0\x95$\x8b\xe2\x82!?bl\xe6~z5\xb8\x18M\t4G\xf3\x87\xde\xee\x17\x1d\x02\xbf\x08C\xe3\xdb\x16J\xa1x\xd8h\xfe?\xbd\r\x14\xe6s0\x9a\x1f\xd5\xb3{v\xe85\xa4k\xd1H\xe3\xeb\xb8X!0\x17/T\xf2\x8d\xcd/\x12\x8eO\xe9\xac\x01 B\xcdu\x8f\xe7\x90r\x8a\x86\n?\x85\x1eg7\x13#)E\xb7M\r\x12\xec\x10\xdd\x1d\xc4C\xb9(\x97yCB\x8b\xa4\xf6ql\x84u*\x01\x84\xa6+\x12M6\xe8\xafi\x96?\xc4}\x87_\x0fE\x9c\x08\xc7P$\x82B0\xc2v*]\xc9B\x96&\xe3H(5\xf8h\xa4\x80\xed\xc5!\xc7\xef\xfe\x0e\xe9\x8b\xe6\x85(\xa4H\xaf\x9a\x07\xa14==m\xbe9@\x0f\x81\xa5\x0f\xd0A\xdd\xb3\x1f\xd2\xf5H\xdd\x13\x89r\x91\xd3\xa7\xa8Z\x1a\x81\xf3\xc4\x94\xe6\xb8\x1b\x82#\n\xd1\xd9O<\x12\x05\xda\xf1\x0e\xf2\x87\xfa\x8f\xb2\xdb\xdct\x15\xf5\xeeSkDh=\x9a\xaa6h\xfd!f\xd0C\x05\x89#\x86P\xfd\xc4s9Hv\x9f\xe7C1\x18Ge\'@\xcdS\x14\xa1[\t\x88\xd1f\xa47\xd8\xc1(\xeb\xd8\x03\n\xe5\x15\xc6\x0f\x17\x88\xa7r\xed\xeb\xdd\xbc\x1dR\xf8\x1a\x1c\xa1\xfc?\xddV\xd5\x16\xfc\xa6AG\xd9\x8e=)\xd4\xafl\xfc=\x1c\xf1\xd4\x8c5\xdfE\x1c\xd2\xfb\xa3\xfez\xe4\xac\"]\xf4XV8m\xfe\xf9\xb2\xf1K\x03\xa0\x17\xae\x1d\xe9@\x00\t\xf1tl\xafw\xf39d\xc0\x97\xa4\xbe\x8e2\xf7\xa9~\"\xb4m\x08\xe3Q\xe7\t\xda\xc7z\x88\xb8\x92x~\x11D\xb9o\xe3PV\xcb\xa5\xf2\xa6\x1e\xa3\xdb\xf3\x105\xf4(\x90cw\x16\x92\xab~|\xde1\xf1\xb4\xc0\x16\xef\xfe\xe4\x90\x97&\xb9\xc5\x92\x1e\xc6{\xf5\xddt\\bm\x1d\xbfy\x00\x85\xc2\xb3\x13\x1fh~L<-\xb0\xf9\xbb<}H@\x8aR\x9d,s\x96{\xad\x8e\x8f\xa0\x8e][\x88$\x07G\x89N\x89G\xf2Jn\xdd\x85\xc89L\xe6S\x04\x1cR\x87\xba\xbc\xa33\x82\xa1\x10\x91\xd7O\x8c\x1f\x14\x0e\xb87\xdbUY1\xaf\x8a\x9f\xa21\xed,Mq\x86u)D\xd8\xf27\xc4\no\x99a\xe0h\x11#\t\xad\xe3\xe4F!lh/\xea\xb0$8\x0b\x91V\xe4\xba\x0bR=C\xc6\"\x9b\xc7\xfe\xa2\x10Ip\x87\x1b\x85Y\x0c\xb7\xf7(:M\xb2&+4:\x169T\x91\xb3$z\xfc\xd5\xcb\xb0Xq\xf7\x1ar\x95\x97j\x84m\xe9\xd8k/D\x92\xba4\xca\xf8g\x93W\xc4m\x87k\x14yKb\x8f?\x15Z\x8a\xdf\xb1C\xaf\xa2y\x9b\xad\x84\xa8\n=\x8e\xec(\xfe\xe6\x1e\xea\x9b\xc2:.|B\x84\x91\xea\xb0\x05\xfd\xdc\"\xc3\xc6\xb8\xaef\x10\xac\"\x0e5^f\xa1Qq\x1d\xfeP\xbc\xeat\xc7\xb3\xa2\x1eg2\xde\x1f\xf2\x1aq9\xf6 r\xc2!\x96vY\x7f\x98\xe5\x8ej\x87\x86fR\x8a\x1a\xc7\xc9\x0b\xc5\xe25\\\xd0\x1er\xddm\x08OEr<\x8c\x83\x06\x15O\x0c\x86\xe6\x8e\xbf`W\xc4\xd9\x19\xc6D\x87\xfe\xf2\xf4\xb1\"\xa0\xe3D\x85d\n\x1a\x18\xb2\x8a\x12\xc0\x86\x90=\x8ad\xbbP46\xaa\xbd\xb0)\x96\xd2!=\x91:p\x11\x04\xa6B\x91\x14\xe7\n\xf2\x1c\xbd\xa2\x94\x1d\n\xbe\xc8\xa6y\x10\xdcpG\x84>\xeb^\xee\xe68$:\xd1X\xfe@\x91:\xa1!V\x88\xa5E\xf6\x8e\xd0\xe5zC\xder\x88\xfb\x0bI\x17\xc8$a!\x97\xea}b:\x04\"\x91\xe0\xac(]\xe8\xb3\xb8\x1a\x12\x8f\x98\x89\xe0.\xdf\xd4\x175\xa7\x90N\x93B\xc2}\xfeJ\xc6\xa1;Z\xdaDs\xf9\xcc,\xd2\x1d\xc5\xb3\x89D\x01\xe9\"\xca\x90\r!\xee\xe4j\xdb\x10\xfd\xa8\xa8\xb9\xb0\xdc5\x8b\x98\xb7P\xa9\xe1H\x90(\t\x00\x16\x05J\r\x0b1$\xe7\xb2\x86\x0e\xf4\x06eR\xd4\xd2\xe8#\x8f\x9e\x02\x89\x1a\x1b\xda\xfc\x16\xc0t\x87oCO\xd2\xf5#\x01%\xf2\x94h\xce\x8dr\xde\x91r\x14\x11M#VH\xba\x8f\r7\xc7\xa1\xfe\xd8\xda{\x10\xe4\xddO\xf2\xf1\xc8a\x8bf;`\x85\xa4q\xdfk\x1b:\xc5q\xb3G\x1e.\tf\'\t\xb7C\x99\x0b\x7f\x9fK6\x88\x94\xf1\x98A\xdao\xear\xa9\xbb\x9bD\x04\x04)\x88P&\xbe\xd3\x1a\xba\x19\x9e\xdcGb\xef\xa2\x18+M\x9d<\xc8\\\x84|,\xaf\x97I\xb3\xa9c\xf5M\x12{\x17\xb1`\x19\x88\x88I\xb2\xa2\xde\xae+\xc6\xb3\x9a\xc8\x90\x9c}B~\xf8\x11\x9b`\xee\x87\xd9\xa6\x9d)-\xdb\x01(\xb5S\x1d\x7f\x87}\xf3\x06\x9c\x13\xf4\xa1\xa7\xb2a \r\xb5b\x00jc@\x13:P\xe8Mk\xf0\xf3\x98\x96X\x0e:\xcdS\x07%9<\x12Q\xbb\x10|\xd1Q\xd2\x12J\xcc\x1f[\rPP\xe0%\xfc\xe7\xe4#\xcdA3F\x91/6\x11\xc4\xd6\x88\xec\xddm\xef\xbd\xb7\x94)/\x01.\x01\x18\x01gL\\\xc9#{#\xb0\x89\xc3Z`n5\x00\x17\x18\x86=\xe6\xa6f\xab\xa9\xa6nH\x0cZ\xa6\xa3~0\x88\xb96\xb2\x96\xd5\xe0\x06*\x17u\x02V\xa0\xf5W\x97\xf9\xa0\xa6\xcd\x04\xf2\x89Fw\xa9\xea\x12P\xf6\xa8\xe6\xa3\xee\xdf\x81\xad\x84\x98\xa5\x16\x1d\x7f\xcc\\\xb9\x8e\xc0\xabt\xd4\x15vqXP\xed\x91\xfc\xbe\xb5\xad\x1b\xb0\x84\x87d\xc3Y\x8f\x9a\xa2\xe5y\xd6n\xe5\x8e\xfc]\xe1Q_}\xe3)\xb3\x19Op\xe1\xe8\xe4m\x9b=\x85\xdaA\x94\xcf\xbe\xc3\xc3\xa5\x17%\xd5r\x15\x8f\x8e\"r\x99\xe9\xfc0\xfdx\xb6K\xa0$ r\xd6tt<Q37\x02\x0f\xf0\n\xb4\x1f\x9fT\xcd\xb7S\x83F\xc3;\xf7\xedT<S\xb2\xb7\x94\x18!5(\xe5\x8d\x1b\xdd\x8eKz\xd7T\xed\xd4^\xc1\xa7\'\xe0z}\xa7(\"\xd9\x10D\xbf\xd7q\xf6\xc4\x8dVRTE\xc0\x9e\xc9 \xc8L\xca\xec\xa4\xd9\"\xec\xe1\x16w\x89y\xcdu\xae9\n\xc4[h\xe1S`^\xe6\xf4I\xbf\xad\xfbf\x9aJ\xc5]\'9\xcbf\xc7Y\xcf\xad\xa9\xebz\x1f\xa4L\xe67}N\xdc\xbb\x85\x88\x8a\xd6\xa3\xb2\x98Lv\x1b>\xe5-\x88(/Y\xc84\x1e\x8e\xe0 t!\xf1F\xd9a\xe6r\x95\x9dx\xed\xe2\xab\xa3F\xe0\x99\xe6\xfe-F\xcaL&2\x8fY\xaca\xa8\xedg\x9f\x99\xcc]\x9e2\x92s<\\\xca\x8e\xba\x05\xeb\xc2\xa6\xe2\xe6\xac,\xec\x1b\x0f\x0f@\xf6lw}4\xb3\xc9L6\x96\x9fld\x1d\x93\xf8\xc0\xd7\x8e\x1b\xb3(\x03yx\xd1)\x8au\xf8I\xcc\x0e\x1c5dO\x99\xc8+\x962U\x9c\xad\x93f3VNR\xde\xb9\xcep>[\xf2PD*{\xec\xb0c\xdc\xe1->qfs\x99\xaf\xece\xa7N\xdc\x1d9_n\x92\xbb\xb3\x9c\xd1\xbc\xc4\x86\xa0\xb2\xd8[CI\xc33\x9d\xd1\x16\xb3\xd7huZ\x1f>y\xb6\xb3\x9c\xd5\xace\x16\x13\x18\x9e\x05\x96\x05m\xa8\r\x1ca,\x1d\x0f\xb1\xf2\xe2\x1ac{\xb9\xccl\x9e\x93v`\xc3Y_\x1f1\xdb\xcd\xbdC\x1cO\xc6\xc4I{j\xb0\xd5W\'\xdeRB\xf6&M\x0c^%\xaa\xae\xf2\xf1[\xb5\x06\x19N\xd6\xd2\xc6\xe8&Y\xa7\x19\x07\xe12\x9as3B\n\x1f\x8b\x85\xf9\xacO\xb9\x92\xbf\xb1\xe8\n\x19\x8c5\x8as|\xe4*\x97\r\xc76J.\"\xed\xf4`\x0c\x0f_q\x93\xb7\x1c&4\x04\xd7]\x92\x03\x01\xb1\xae\x1a\x81\xd3\x15\xae&\x90\xa8\x1et\xd4G\xe3\xae1\x8cO<<\xc3\x0f.p\xd3\xbfm\xf6\x9fE\xbca\xab\xa9\x90\xc6\xa1rW\xfbAK\xdb;\x06\x83\xfd5\x8e\xb7F\xf1p\x0c7X\xc0\xc2u\x8f\xe7\xbb_X\xd86\x89A\xd2g\xe6\xce3\xbd\xb9\xa2\xa7f\x9a\xf7\x8ee\x9c\xe2\xe1\x17V0\xd4C\xa7\xe4:\x96\xb1\x8aA\x8ca\x06CY&\xd1\xa8\\k7\x94T_\xb3\xf6p\x85\xa9~z\x05\xbb\xc7\\\xafxx\x85\x0f\xcc\xf4n\xa2/\xadG\x8cu\x97F`\xb9;\xd1\x14\xf8\\\xb7X\xc4W;8\xea\xde\x93\x95\\d\x1f\xdb\xb8\x85\xd5Id\x85\xdc\xf5\x8cQ\xcc\xe1\x07J\xe4\xcfT\xd11\xd75\x8dU\xfc\xe1\t\x0f\x98\xc8\x8b\xd8`\xebX\xeb\xe1\x12\x86z\'\xce{\xc8F9\xa25\x88\xab\x8e\xba\xc2r=\xd1\xdb\xbd\x89F\x92\x85\xe0 \x9a\xcb\x8c\xdd\xe4\xb0\xbf\xdez\xb8\x83\x93.q\xfb\xbeba\xfe\xc8?\xe6\xba\xc4\x15\x8e\x12\x8f\xcc\\*fI\xf2\x90y\x0cc\x10Cxi\x8b6\x9b3[\x1e\x0b?\xd9{\x9f\xec\xf8\x15\x95F#1\xe9:\xd9\xa2QxM^\xd9#\x81#\x92\xd8dk\xba\xa11(2Y[\r\xc8\xdc\x95>\xd2H\\\xba\xe9O-\x07\x1c\x95\xeeOZ\xa2\xe7y\xab\xed\xca\x1f)\xbc\xdf\x94T\xcd\xb5<\x12G\x14=s&p\x14\xd3\xf4\xec\x91\xa3\xbd6\xd5\x9c\xb2^\x8b\'\xd2\x16\x87;\xad\xc6\x0f\xae%\xceDm\xfa\x1b\x18\xea\'\xabt\x8d\xc4\x1f\xc9+\xd5\xday\x8e\xe8\x9ft\x8b\xc6\x1e\xa93m\xbf\x93\x15\xae%\x90\x98\xfeH\xe2\xd0O\xadD\xff&\x1b\x14}d\xce<\xcf\x9b\xfeL\xd6H\\\xcb[\x8dD\x7f\xe9\x02\xc7\xdd\xaft\x7f\xa4j\x8e\xe8/\xbck\x89\x9e?n\xdfGb\xce\x14\x1f]h\xe0\x98\x9e\xe7\xfe=\xdau\xf7\xc8k{]<WM\x8b\x1bI|\xca\xe2\xceC\xd8\xad\xc6\x9ej\x12\xa0p\x83\xa7\x060\xd2B\xdf\x16\xc9o\x07\xc7!\x9c\x99Z\xf5,\xac\xad^\xf0\x80\xda]5\xf0t\x95D#\xf2W\xf2j\xeay\xa2\xa3\xea\xe2\xea\xaa\x13,\xb5\xd2\xbd\x7f\xb6\xe7Ic\x11\xd93u5\x1bZ\xa6\xe3\x80\xb8\x02\x83\x11\xe8\xe2\xd0\x18\x01BQ\x10\xd0b\x86\x81\xb7\x07r!&!\x11\x08a\x10\x04A\x08\x10\x04A \x84\x10\" \x84\x08\x90\x16\x10B\x08!\x848\x14\x88o\x06]\x1f\n\x04\xbcD\x0c\x01\xe2\x8a\xda\xec\xc0Z%\xf4b\x10\xac^Z\"T\xab\x04z!\x00U\xcc\xfe\t \x15\xa7\x7f\x87\x85\n\xb1%\x87q\n\xa5%\x06\xcb\xd4\xa2\xd9\x06\x81T\xa1\x7f\naT\xa5\x7f\x0fIT\xa1\x7f\x80\x84\ni1\xb8\xc0\xf1=IGG\xe2jP\x12\xe2\x05\"/\t\xa4$\xc4\xf0\xf4\x90>\xf1b\x84K\x02\x9d\x10bL\x80Hg\xd7\x88\x17\x88\xb5$\x902!\x86\x0fU\ti\xd1\xf9\x12/h\xe2\x0b\x8bX\x12H\xb5\x10\xc3\x01J\xb4\xd7\x12/p\x15_\xec[I\xa0v!\x86\xea\x81\xd3pQ2)\xf2:\xf1\x82\x8c\xf8\xc2\x1e\x95\x04\xd2\x15bx\x8f\t7\x08\xf1\xc2r\xe2\x0b\xe1Q\x12\x88B\x88\x91\x84X\xb9d2Qo\x88\x17\xd9&\xbe`\x85\x92@PB\x8caQ\xe2\x0092X\xe2\xc5\xb6\x89/J\x9d$\x10\x94\x10c\xe4\xaa\x83\x0c:ZF\"\xf5!^P\xa3\xf8\xc2\xf6K\x04\xd2p\x12\xe8\x82\x10c\x00\xee\x13@l\xfc\xc4\x8bq\x88/\x9cg\"P\x1c\x90@\xadB\x0c\x91Q\xef\x85\x17\xfeu$~\xe2\x85\xb1iGH \xe8B\x8c\x9f\xaf\r\xc2\x0bj\xc4\x0b{\x15`\x88\xc8\x89@\xd4G\x02E\n1Z\x15q&V\xd4\x8cx\xf1h5a\x12\x08\x86\x10c\xcf\xb5\xb5\xf0\x82\xf4\x1a[\x92\x91/\xc4\xb0\x8cGYxa+\xc0\x10b\xdcc{Q\x02\x8eq1T\xe7\xa2\x1fL\x88\xf1\x0b\x15\x14\xe2\xe7\xf5\x00U\x88\x8e\x06[\x0c}\'\xc4\xbb\xcb&\xde[O\tx61\xf4n\t\xf6E\xde\x14\"B\x88c\xb7&\xde\xba=%\xe0\xdb\xc4P\x8a\x11\xf1CK\xc8z\xa1c\x08\xf1\x89\xd6\xc4\x1b\xb1)\x01\xafM\x0cY$\xe2|\x8a\x96\xfc\xb8n\x08\x12C\xe2\xcdM\x95\x80+\x10C#\xa2\x89x\xf6\t\x927\xe2\x8dz\x95\x80\xd7\x88!\xab\x8fD\x9cT\x88\xab\x1aM\xbc\xbfW\x02\x8e%\x86j\xc3\x11q\xd7\x0b\r\x0b\xf1w\xbb\xc4[\x9d\xaf\x04|\x12C\xf9{D\xfc\xed\x84\x0b4\xf1\xae\xf7\x95\x80\xdbb\x88\xff\x0b\x11\xd7\x15\xe23\xad\x897\xe1l\xdb\t\"\xae9h\xfe\xaf\xb86\x8b]\xb5K\xb4RY\xb1?j\xf1\xb0iK\x07I\xdf\x9a\xb3-v{\xfb(\r\xb6\xb2\x1b\"\xced\x0e\xf1\x86\x13p0.\x07\x12\xd6\xc0\xaf\x0f0<_\xd3\xa1\x96(\xef#4\x18\n\xbdY\xac]T\xa3 \xfe\xae\x08\xd1\xf1\x8e-`\xb8\xf6\xc0a\xff\x93\xd3t0|\xbd\x96\t\xbb\xe4\xbe\xc7$\x00\xecR\xe1\x9f}\xbd\xa0\rG\xf3\x17\x0f`\xeb\xc12{\xd0\x86N^\x88\x94\x9b\x9dw\x98:1\tO\xf9\xbf\x10\xf6$\x1e\xa9\xfa\xf7\x16\xf8\x9d\x90\xcc\xdf\xebc\xa1 \x97\x88!\t\xacU\x82^\x08\x82\xd5KK\x84\xb6J\xa0\x17\x02R\xc5\xec\xdf\x80R1\xfawX\xa8\x10\xb6\xc40N\xa1\xb4\xc4\xe0L-\x9a-\x90J\x15\xfaw\x90H\x15\xfa\xb7\x90F\x15\xf5\x8f!\x88\xaa\xf5\x130p|\xcf\xa0\xa3c\xf9\r\xa0\xbd\xbe\xfe\x98\\\xf3\x00\x0f[\x11\x8e\xe3\xd5\x15\x8a\x18|\x15\xc1\x014\xe1\x8a\xd8\x9e{\x8a\xd7#\xd8\xc9\x01\x8e\xf9\x8b2\x93\x9d\xcaECBT\xbc\xe7H\x84\x8bfF\x80s\x9c\xd1\x00\x9fI[IP\xb4m\xc8a\x802\xd7=B~\xb8t\x91\xc9\x87\xd3\x8a\x8a\"\xad\x1cCF\x0c\xf0\xdc\"\xc4N\xc8\xa1Bw\x9e\x81@\xc4\xe3\x17xD\x00\xf3\xc7\x87;G\xc7\xad?\xcb\"JY]\x1a\x1f\xddf\xb6m\x8f6s\xdc+\x0e\xf0\t\x05\xb0<\xd6\xef\xb0 \x1b\xd8w!\xa3=S\xd4\xc1\x0c(y\\/2F\x1b\xe0\x89\x07\x0b\xbf\rU\x1c\xfc3z\x8d\xee\x84~\xb68\x0c\xd6\x11\xda\x00\x07A \xe3 \xad_\xf0\xf1Q\x96\x12*^\x14\x8b\xa3\xa8\"7\xa0\x12\xcf\x8bGQ\xa3\x81\x06\xb894\xdcQ\xbe/\xb2\x07\x1b\xb3\xb7\xd2\xd6Q>\xe2F\t\n_t\xdc8\xf3\x01>\x93\xb5\xaa\xe1\xedG&F\xbe\xa2\xd1\xa2\xa3\xd0\xcd\xe0\xd68d\x05\x89\\\x1f\x8avG\x9c\x01\x8e\xe8{\x109\xf1\xc0\xf5\xc41\xe8\xcdz\xfb1\xdb\x12\xf5\xa8\xa5\xdd\xcd\x80o\x80\x19\x87\x82\xe8\xdf{\x8bP\xee\x03\x9fur\xe4\xc3\xb2h\xf2\xfc\x19\xd5\xfc\xa6U6\xab1\x06\x17\xa4\x07\xae&J\x82X]\x1f\xa6\xc8W\x14\xdcq\x9e\xce#\xd4\x93fI\xa5\x9b\xc4D\xc3\xc8\x1b`\xc4\r\n\x89Y\x03\xda\x02\xe0\x80\xc3?_R\x9d\xc3C\xd5H\x02k\xe8`\x8b\x9e9Ocp\xfc\xf2\n\xd3|h\x8c\xc1\x9e\xf7\xe4\x87\xcb\xd3\x17m\xa6\x96\xfa\xcaf\x00>q\x15\x1d~\xc8\xb2\xea\xcf6\xc4G\xb0q88\xb6W\xe6\x999T_\xd8\x1a3wS\xd3\xc5\x1d\xbc8>\xabMn\x88}\x90AI\x90\xe9\xdd\n\x1fi\x86\x8efjl\xc8\xbe\xe2*\xed~\x9a)\x03\x94\xf8\xf0\x88\xc3\'\xbbw\x047b/\xc9\xb5(\x98\xd0\xf5\x8c\x8eX\xc8j7\x8ci\xf8\xd6\x01\xda\xca\xa3bWaV\xbf{\x1bV\x88U\xfa9\xd3RI\xa0E\xdc\xc6ad\r\x0b\xae\x0eF\x911\xed\xa2\xcc\x1e \xdb<\xb3#\x03\xd8\"\rr.\xe0B\xab\xc5K\xbc\xa4\xe4\xa2\x1d\x13\xa7\xb0\xf9\xac\x15cX\x18\x0e\x82\x17\x03\x84\x86C\xcf9\\\x81v\xa7`\x1e\xc0$\xe5F.\xa9\x96\x0b\x16\xb1[{\x0c\xc1\n2\xc8\x9f\x8e#\xee\x00\xed\xf9\x97o\xe2\xf5\x88\x04m\x83\xad\xc5L,\xb9\xa9\xb6P\xa8F\xe5\x83\xb4\"\x03\x8f\x91\x90\xad\xa1\xf6\x0c\x90\xe9\x12\x8e\xb5\\\xc8\xf7NY\xe7\xe4o}3\x06H\xba\xd9cRLfl@\x1b\x1f\x96\xa0\x1b\xb7;@\x1b\xa3\xf0\xb7\xc4\x89\x8cb\xc5\xfc\x8d\xc8F,\x92\xb7yL\x8a1\xd8\xe6L4\xc8\x08\xaa\xb4\x1cJ\x03\x03\xe4\x9a\x7f\xd8\x04\x17K\xb8R{\x1bi\x1e\x89w)I\xe6\xc7\xe2u\x8fp<Q\xe3\xa2\x89$\xe1\x17\x97\x97\x95\r\xd56@VO\x00HC\x03\x06\x1e\xb1\xea6\x97\x8f\xd48\xa2\xb8\xc9\x81\x95\xe5\x85\x1f\xa2k\xfdH\x1cA-\x90\xc7\x8d\xd2\xe8\xe6\x06(\x1c4\xf2\xc3n\xf9\xa0xV\xe9|V\r\xbb\xdc\x90\xc1\xc5?VID\xef\xa1\xe1 nc\xd8L\x8cp\x7f?\x8f\xaa2\xa3\x92\xb4\x8f\xd3Q\xd3|\x0cA\x14EC>\x9cb\x03\xd0G\xb1\x8cd9\xbe\xd3\xf8\xac\x84\xb4\x8fo\x03\xdc\xb6\xaf0)\x17=\x9d\xbes\xe3\xdf\xefR\xb7`\'\xef\xb2=\x9eD$.\xc9U\x0e\x83}%\xe36\xf8\xfb\x9f:e2\t\xbf5\x95/\xdat\xc5\xe3\xf1\xd4\'9\xb8>\x94\xe5\xcf\xa2D\xac\xe4\\\x80yK\xd1\xa2L\xc2w\xc6sX\xfa\xc5\x81Wq\x9f\x05\xb9\x1d\x8b\x8d\x90)\x91~0\xef\xbbq\x85\x1aS\xca\x93,;\xc8\xa7\x17_\xbd\xa1\x02~;\xd6H\x9d-\x8b>\xf8Q\x04\xecC\xe1H\x9dO\x87\xa5m\xa7\xd0\xd7\x865j\xaaw\xc2\x17\xd3\xf0\xf8\xd4GP{\x01\xf7\xeb\xdb1\x86\xb0\x92\xdd\xe9y\x80\x80\x10\xd26\xd6\xa0(\xde\xf1\xa3}\x16\x99)E[$4\xa0\x10\x8d\xe2\r\x1aSp\x94\x06\x1d\x0f\x1b\x16\x87N\xdb8\xd7\xf1.y8\xaeC\x1c\xc8\x94\x87\x8f\xb7Pt\x93\xed\xc6\xad\x82\x0c\x8b\x84.U\xc4i!\x9c-\x08a\x95\xbbG?\x0f\xe3\xc0p\xe8@\xe3<9\xde.\xe4yC\xccI\x04\x0f\xdem{|\x03\xcd$w\x17\x99\xc8\x17\xed\xc2q\xc5\xc5\xc9t\xae\r$\xe1G\x17B\'S\xdd\x80\x8br\x1d/,\xe4\\\\\xfe\xd0/\x0f\xe8R\xae");
}
};embedded_asset!(app, "SMAAAreaLUT.ktx2");
302 {
{
let mut embedded =
app.world_mut().resource_mut::<::bevy_asset::io::embedded::EmbeddedAssetRegistry>();
let path =
{
let crate_name =
"bevy_anti_alias::smaa".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/smaa/mod.rs".as_ref(),
"SMAASearchLUT.ktx2".as_ref())
};
let watched_path =
::bevy_asset::io::embedded::watched_path("src/smaa/mod.rs",
"SMAASearchLUT.ktx2");
embedded.insert_asset(watched_path, &path,
b"\xabKTX 20\xbb\r\n\x1a\n\t\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00h\x00\x00\x00,\x00\x00\x00\x94\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00\x02\x00(\x00\x01\x01\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x000\x00\x00\x00KTXwriter\x00ktx create v4.3.1~1 / libktx v4.3.0~1\x00\x1c\x00\x00\x00KTXwriterScParams\x00--zstd 15\x00(\xb5/\xfd`\x00\x03\x9d\x01\x00R\x03\x05\x08\xf09\xff\xc7\xfcG+\x05\xc0\x10\xc2\'\x08C\xf8\x0fkX\x01\n 1\xd3\x03=\n&\xa8B!@\xbc\x82\xf7\x95\xc2\x1eJA2\x01\x03\x13\xec+e");
}
};embedded_asset!(app, "SMAASearchLUT.ktx2");
303
304 SmaaLuts {
305 area_lut: {
let (path, asset_server) =
{
let path =
{
{
let crate_name =
"bevy_anti_alias::smaa".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/smaa/mod.rs".as_ref(),
"SMAAAreaLUT.ktx2".as_ref())
}
};
let path =
::bevy_asset::AssetPath::from_path_buf(path).with_source("embedded");
let asset_server =
::bevy_asset::io::embedded::GetAssetServer::get_asset_server(app);
(path, asset_server)
};
asset_server.load_builder().with_settings(|settings:
&mut ImageLoaderSettings|
{
settings.is_srgb = false;
settings.asset_usage = RenderAssetUsages::RENDER_WORLD;
}).load(path)
}load_embedded_asset!(
306 app,
307 "SMAAAreaLUT.ktx2",
308 |settings: &mut ImageLoaderSettings| {
309 settings.is_srgb = false;
310 settings.asset_usage = RenderAssetUsages::RENDER_WORLD;
311 }
312 ),
313 search_lut: {
let (path, asset_server) =
{
let path =
{
{
let crate_name =
"bevy_anti_alias::smaa".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/smaa/mod.rs".as_ref(),
"SMAASearchLUT.ktx2".as_ref())
}
};
let path =
::bevy_asset::AssetPath::from_path_buf(path).with_source("embedded");
let asset_server =
::bevy_asset::io::embedded::GetAssetServer::get_asset_server(app);
(path, asset_server)
};
asset_server.load_builder().with_settings(|settings:
&mut ImageLoaderSettings|
{
settings.is_srgb = false;
settings.asset_usage = RenderAssetUsages::RENDER_WORLD;
}).load(path)
}load_embedded_asset!(
314 app,
315 "SMAASearchLUT.ktx2",
316 |settings: &mut ImageLoaderSettings| {
317 settings.is_srgb = false;
318 settings.asset_usage = RenderAssetUsages::RENDER_WORLD;
319 }
320 ),
321 }
322 };
323 #[cfg(not(feature = "smaa_luts"))]
324 let smaa_luts = {
325 let mut images = app.world_mut().resource_mut::<bevy_asset::Assets<Image>>();
326 let handle = images.add(lut_placeholder());
327 SmaaLuts {
328 area_lut: handle.clone(),
329 search_lut: handle.clone(),
330 }
331 };
332
333 app.add_plugins(ExtractComponentPlugin::<Smaa>::default());
334
335 let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
336 return;
337 };
338
339 render_app
340 .insert_resource(smaa_luts)
341 .init_resource::<SmaaSpecializedRenderPipelines>()
342 .init_gpu_resource::<SmaaInfoUniformBuffer>()
343 .add_systems(RenderStartup, init_smaa_pipelines)
344 .add_systems(
345 Render,
346 (
347 prepare_smaa_pipelines.in_set(RenderSystems::Prepare),
348 prepare_smaa_uniforms.in_set(RenderSystems::PrepareResources),
349 prepare_smaa_textures.in_set(RenderSystems::PrepareResources),
350 prepare_smaa_bind_groups.in_set(RenderSystems::PrepareBindGroups),
351 ),
352 )
353 .add_systems(
354 Core3d,
355 smaa.after(tonemapping).in_set(Core3dSystems::PostProcess),
356 )
357 .add_systems(
358 Core2d,
359 smaa.after(tonemapping).in_set(Core2dSystems::PostProcess),
360 );
361 }
362}
363
364pub fn init_smaa_pipelines(mut commands: Commands, asset_server: Res<AssetServer>) {
365 let postprocess_bind_group_layout = BindGroupLayoutDescriptor::new(
367 "SMAA postprocess bind group layout",
368 &BindGroupLayoutEntries::sequential(
369 ShaderStages::FRAGMENT,
370 (
371 texture_2d(TextureSampleType::Float { filterable: true }),
372 uniform_buffer::<SmaaInfoUniform>(true).visibility(ShaderStages::VERTEX_FRAGMENT),
373 ),
374 ),
375 );
376
377 let edge_detection_bind_group_layout = BindGroupLayoutDescriptor::new(
379 "SMAA edge detection bind group layout",
380 &BindGroupLayoutEntries::sequential(
381 ShaderStages::FRAGMENT,
382 (sampler(SamplerBindingType::Filtering),),
383 ),
384 );
385
386 let blending_weight_calculation_bind_group_layout = BindGroupLayoutDescriptor::new(
388 "SMAA blending weight calculation bind group layout",
389 &BindGroupLayoutEntries::sequential(
390 ShaderStages::FRAGMENT,
391 (
392 texture_2d(TextureSampleType::Float { filterable: true }), sampler(SamplerBindingType::Filtering), texture_2d(TextureSampleType::Float { filterable: true }), texture_2d(TextureSampleType::Float { filterable: true }), ),
397 ),
398 );
399
400 let neighborhood_blending_bind_group_layout = BindGroupLayoutDescriptor::new(
402 "SMAA neighborhood blending bind group layout",
403 &BindGroupLayoutEntries::sequential(
404 ShaderStages::FRAGMENT,
405 (
406 texture_2d(TextureSampleType::Float { filterable: true }),
407 sampler(SamplerBindingType::Filtering),
408 ),
409 ),
410 );
411
412 let shader = {
let (path, asset_server) =
{
let path =
{
{
let crate_name =
"bevy_anti_alias::smaa".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/smaa/mod.rs".as_ref(),
"smaa.wgsl".as_ref())
}
};
let path =
::bevy_asset::AssetPath::from_path_buf(path).with_source("embedded");
let asset_server =
::bevy_asset::io::embedded::GetAssetServer::get_asset_server(asset_server.as_ref());
(path, asset_server)
};
asset_server.load(path)
}load_embedded_asset!(asset_server.as_ref(), "smaa.wgsl");
413
414 commands.insert_resource(SmaaPipelines {
415 edge_detection: SmaaEdgeDetectionPipeline {
416 postprocess_bind_group_layout: postprocess_bind_group_layout.clone(),
417 edge_detection_bind_group_layout,
418 shader: shader.clone(),
419 },
420 blending_weight_calculation: SmaaBlendingWeightCalculationPipeline {
421 postprocess_bind_group_layout: postprocess_bind_group_layout.clone(),
422 blending_weight_calculation_bind_group_layout,
423 shader: shader.clone(),
424 },
425 neighborhood_blending: SmaaNeighborhoodBlendingPipeline {
426 postprocess_bind_group_layout,
427 neighborhood_blending_bind_group_layout,
428 shader,
429 },
430 });
431}
432
433impl SpecializedRenderPipeline for SmaaEdgeDetectionPipeline {
435 type Key = SmaaPreset;
436
437 fn specialize(&self, preset: Self::Key) -> RenderPipelineDescriptor {
438 let shader_defs = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
["SMAA_EDGE_DETECTION".into(), preset.shader_def()]))vec!["SMAA_EDGE_DETECTION".into(), preset.shader_def()];
439
440 let stencil_face_state = StencilFaceState {
444 compare: CompareFunction::Always,
445 fail_op: StencilOperation::Replace,
446 depth_fail_op: StencilOperation::Replace,
447 pass_op: StencilOperation::Replace,
448 };
449
450 RenderPipelineDescriptor {
451 label: Some("SMAA edge detection".into()),
452 layout: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[self.postprocess_bind_group_layout.clone(),
self.edge_detection_bind_group_layout.clone()]))vec![
453 self.postprocess_bind_group_layout.clone(),
454 self.edge_detection_bind_group_layout.clone(),
455 ],
456 vertex: VertexState {
457 shader: self.shader.clone(),
458 shader_defs: shader_defs.clone(),
459 entry_point: Some("edge_detection_vertex_main".into()),
460 buffers: ::alloc::vec::Vec::new()vec![],
461 },
462 fragment: Some(FragmentState {
463 shader: self.shader.clone(),
464 shader_defs,
465 entry_point: Some("luma_edge_detection_fragment_main".into()),
466 targets: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Some(ColorTargetState {
format: TextureFormat::Rg8Unorm,
blend: None,
write_mask: ColorWrites::ALL,
})]))vec![Some(ColorTargetState {
467 format: TextureFormat::Rg8Unorm,
468 blend: None,
469 write_mask: ColorWrites::ALL,
470 })],
471 }),
472 depth_stencil: Some(DepthStencilState {
473 format: TextureFormat::Stencil8,
474 depth_write_enabled: Some(false),
475 depth_compare: Some(CompareFunction::Always),
476 stencil: StencilState {
477 front: stencil_face_state,
478 back: stencil_face_state,
479 read_mask: 1,
480 write_mask: 1,
481 },
482 bias: default(),
483 }),
484 ..default()
485 }
486 }
487}
488
489impl SpecializedRenderPipeline for SmaaBlendingWeightCalculationPipeline {
491 type Key = SmaaPreset;
492
493 fn specialize(&self, preset: Self::Key) -> RenderPipelineDescriptor {
494 let shader_defs = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
["SMAA_BLENDING_WEIGHT_CALCULATION".into(), preset.shader_def()]))vec![
495 "SMAA_BLENDING_WEIGHT_CALCULATION".into(),
496 preset.shader_def(),
497 ];
498
499 let stencil_face_state = StencilFaceState {
501 compare: CompareFunction::Equal,
502 fail_op: StencilOperation::Keep,
503 depth_fail_op: StencilOperation::Keep,
504 pass_op: StencilOperation::Keep,
505 };
506
507 RenderPipelineDescriptor {
508 label: Some("SMAA blending weight calculation".into()),
509 layout: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[self.postprocess_bind_group_layout.clone(),
self.blending_weight_calculation_bind_group_layout.clone()]))vec![
510 self.postprocess_bind_group_layout.clone(),
511 self.blending_weight_calculation_bind_group_layout.clone(),
512 ],
513 vertex: VertexState {
514 shader: self.shader.clone(),
515 shader_defs: shader_defs.clone(),
516 entry_point: Some("blending_weight_calculation_vertex_main".into()),
517 buffers: ::alloc::vec::Vec::new()vec![],
518 },
519 fragment: Some(FragmentState {
520 shader: self.shader.clone(),
521 shader_defs,
522 entry_point: Some("blending_weight_calculation_fragment_main".into()),
523 targets: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Some(ColorTargetState {
format: TextureFormat::Rgba8Unorm,
blend: None,
write_mask: ColorWrites::ALL,
})]))vec![Some(ColorTargetState {
524 format: TextureFormat::Rgba8Unorm,
525 blend: None,
526 write_mask: ColorWrites::ALL,
527 })],
528 }),
529 depth_stencil: Some(DepthStencilState {
530 format: TextureFormat::Stencil8,
531 depth_write_enabled: Some(false),
532 depth_compare: Some(CompareFunction::Always),
533 stencil: StencilState {
534 front: stencil_face_state,
535 back: stencil_face_state,
536 read_mask: 1,
537 write_mask: 1,
538 },
539 bias: default(),
540 }),
541 ..default()
542 }
543 }
544}
545
546impl SpecializedRenderPipeline for SmaaNeighborhoodBlendingPipeline {
547 type Key = SmaaNeighborhoodBlendingPipelineKey;
548
549 fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor {
550 let shader_defs = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
["SMAA_NEIGHBORHOOD_BLENDING".into(), key.preset.shader_def()]))vec!["SMAA_NEIGHBORHOOD_BLENDING".into(), key.preset.shader_def()];
551
552 RenderPipelineDescriptor {
553 label: Some("SMAA neighborhood blending".into()),
554 layout: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[self.postprocess_bind_group_layout.clone(),
self.neighborhood_blending_bind_group_layout.clone()]))vec![
555 self.postprocess_bind_group_layout.clone(),
556 self.neighborhood_blending_bind_group_layout.clone(),
557 ],
558 vertex: VertexState {
559 shader: self.shader.clone(),
560 shader_defs: shader_defs.clone(),
561 entry_point: Some("neighborhood_blending_vertex_main".into()),
562 buffers: ::alloc::vec::Vec::new()vec![],
563 },
564 fragment: Some(FragmentState {
565 shader: self.shader.clone(),
566 shader_defs,
567 entry_point: Some("neighborhood_blending_fragment_main".into()),
568 targets: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Some(ColorTargetState {
format: key.target_format,
blend: None,
write_mask: ColorWrites::ALL,
})]))vec![Some(ColorTargetState {
569 format: key.target_format,
570 blend: None,
571 write_mask: ColorWrites::ALL,
572 })],
573 }),
574 ..default()
575 }
576 }
577}
578
579fn prepare_smaa_pipelines(
582 mut commands: Commands,
583 pipeline_cache: Res<PipelineCache>,
584 mut specialized_render_pipelines: ResMut<SmaaSpecializedRenderPipelines>,
585 smaa_pipelines: Res<SmaaPipelines>,
586 cameras: Query<(Entity, &ExtractedView, &Smaa), With<ExtractedCamera>>,
587) {
588 for (entity, view, smaa) in &cameras {
589 let edge_detection_pipeline_id = specialized_render_pipelines.edge_detection.specialize(
590 &pipeline_cache,
591 &smaa_pipelines.edge_detection,
592 smaa.preset,
593 );
594
595 let blending_weight_calculation_pipeline_id = specialized_render_pipelines
596 .blending_weight_calculation
597 .specialize(
598 &pipeline_cache,
599 &smaa_pipelines.blending_weight_calculation,
600 smaa.preset,
601 );
602
603 let neighborhood_blending_pipeline_id = specialized_render_pipelines
604 .neighborhood_blending
605 .specialize(
606 &pipeline_cache,
607 &smaa_pipelines.neighborhood_blending,
608 SmaaNeighborhoodBlendingPipelineKey {
609 target_format: view.target_format,
610 preset: smaa.preset,
611 },
612 );
613
614 commands.entity(entity).insert(ViewSmaaPipelines {
615 edge_detection_pipeline_id,
616 blending_weight_calculation_pipeline_id,
617 neighborhood_blending_pipeline_id,
618 });
619 }
620}
621
622fn prepare_smaa_uniforms(
625 mut commands: Commands,
626 render_device: Res<RenderDevice>,
627 render_queue: Res<RenderQueue>,
628 view_targets: Query<(Entity, &ExtractedView), With<Smaa>>,
629 mut smaa_info_buffer: ResMut<SmaaInfoUniformBuffer>,
630) {
631 smaa_info_buffer.clear();
632 for (entity, view) in &view_targets {
633 let offset = smaa_info_buffer.push(&SmaaInfoUniform {
634 rt_metrics: vec4(
635 1.0 / view.viewport.z as f32,
636 1.0 / view.viewport.w as f32,
637 view.viewport.z as f32,
638 view.viewport.w as f32,
639 ),
640 });
641 commands
642 .entity(entity)
643 .insert(SmaaInfoUniformOffset(offset));
644 }
645
646 smaa_info_buffer.write_buffer(&render_device, &render_queue);
647}
648
649fn prepare_smaa_textures(
656 mut commands: Commands,
657 render_device: Res<RenderDevice>,
658 mut texture_cache: ResMut<TextureCache>,
659 view_targets: Query<(Entity, &ExtractedCamera), (With<ExtractedView>, With<Smaa>)>,
660) {
661 for (entity, camera) in &view_targets {
662 let Some(texture_size) = camera.physical_target_size else {
663 continue;
664 };
665
666 let edge_detection_color_texture = texture_cache.get(
668 &render_device,
669 TextureDescriptor {
670 label: Some("SMAA edge detection color texture"),
671 size: texture_size.to_extents(),
672 mip_level_count: 1,
673 sample_count: 1,
674 dimension: TextureDimension::D2,
675 format: TextureFormat::Rg8Unorm,
676 usage: TextureUsages::TEXTURE_BINDING | TextureUsages::RENDER_ATTACHMENT,
677 view_formats: &[],
678 },
679 );
680
681 let edge_detection_stencil_texture = texture_cache.get(
683 &render_device,
684 TextureDescriptor {
685 label: Some("SMAA edge detection stencil texture"),
686 size: texture_size.to_extents(),
687 mip_level_count: 1,
688 sample_count: 1,
689 dimension: TextureDimension::D2,
690 format: TextureFormat::Stencil8,
691 usage: TextureUsages::RENDER_ATTACHMENT,
692 view_formats: &[],
693 },
694 );
695
696 let blend_texture = texture_cache.get(
699 &render_device,
700 TextureDescriptor {
701 label: Some("SMAA blend texture"),
702 size: texture_size.to_extents(),
703 mip_level_count: 1,
704 sample_count: 1,
705 dimension: TextureDimension::D2,
706 format: TextureFormat::Rgba8Unorm,
707 usage: TextureUsages::TEXTURE_BINDING | TextureUsages::RENDER_ATTACHMENT,
708 view_formats: &[],
709 },
710 );
711
712 commands.entity(entity).insert(SmaaTextures {
713 edge_detection_color_texture,
714 edge_detection_stencil_texture,
715 blend_texture,
716 });
717 }
718}
719
720fn prepare_smaa_bind_groups(
723 mut commands: Commands,
724 render_device: Res<RenderDevice>,
725 smaa_pipelines: Res<SmaaPipelines>,
726 smaa_luts: Res<SmaaLuts>,
727 images: Res<RenderAssets<GpuImage>>,
728 pipeline_cache: Res<PipelineCache>,
729 view_targets: Query<(Entity, &SmaaTextures), (With<ExtractedView>, With<Smaa>)>,
730) {
731 let (Some(search_texture), Some(area_texture)) = (
733 images.get(&smaa_luts.search_lut),
734 images.get(&smaa_luts.area_lut),
735 ) else {
736 return;
737 };
738
739 for (entity, smaa_textures) in &view_targets {
740 let sampler = render_device.create_sampler(&SamplerDescriptor {
743 label: Some("SMAA sampler"),
744 address_mode_u: AddressMode::ClampToEdge,
745 address_mode_v: AddressMode::ClampToEdge,
746 address_mode_w: AddressMode::ClampToEdge,
747 mag_filter: FilterMode::Linear,
748 min_filter: FilterMode::Linear,
749 ..default()
750 });
751
752 commands.entity(entity).insert(SmaaBindGroups {
753 edge_detection_bind_group: render_device.create_bind_group(
754 Some("SMAA edge detection bind group"),
755 &pipeline_cache.get_bind_group_layout(
756 &smaa_pipelines
757 .edge_detection
758 .edge_detection_bind_group_layout,
759 ),
760 &BindGroupEntries::sequential((&sampler,)),
761 ),
762 blending_weight_calculation_bind_group: render_device.create_bind_group(
763 Some("SMAA blending weight calculation bind group"),
764 &pipeline_cache.get_bind_group_layout(
765 &smaa_pipelines
766 .blending_weight_calculation
767 .blending_weight_calculation_bind_group_layout,
768 ),
769 &BindGroupEntries::sequential((
770 &smaa_textures.edge_detection_color_texture.default_view,
771 &sampler,
772 &search_texture.texture_view,
773 &area_texture.texture_view,
774 )),
775 ),
776 neighborhood_blending_bind_group: render_device.create_bind_group(
777 Some("SMAA neighborhood blending bind group"),
778 &pipeline_cache.get_bind_group_layout(
779 &smaa_pipelines
780 .neighborhood_blending
781 .neighborhood_blending_bind_group_layout,
782 ),
783 &BindGroupEntries::sequential((
784 &smaa_textures.blend_texture.default_view,
785 &sampler,
786 )),
787 ),
788 });
789 }
790}
791
792impl SmaaPreset {
793 fn shader_def(&self) -> ShaderDefVal {
796 match *self {
797 SmaaPreset::Low => "SMAA_PRESET_LOW".into(),
798 SmaaPreset::Medium => "SMAA_PRESET_MEDIUM".into(),
799 SmaaPreset::High => "SMAA_PRESET_HIGH".into(),
800 SmaaPreset::Ultra => "SMAA_PRESET_ULTRA".into(),
801 }
802 }
803}
804
805pub fn smaa(
806 view: ViewQuery<(
807 &ViewTarget,
808 &ViewSmaaPipelines,
809 &SmaaInfoUniformOffset,
810 &SmaaTextures,
811 &SmaaBindGroups,
812 )>,
813 smaa_pipelines: Res<SmaaPipelines>,
814 smaa_info_uniform_buffer: Res<SmaaInfoUniformBuffer>,
815 pipeline_cache: Res<PipelineCache>,
816 mut ctx: RenderContext,
817) {
818 let (
819 view_target,
820 view_pipelines,
821 view_smaa_uniform_offset,
822 smaa_textures,
823 view_smaa_bind_groups,
824 ) = view.into_inner();
825
826 let (
827 Some(edge_detection_pipeline),
828 Some(blending_weight_calculation_pipeline),
829 Some(neighborhood_blending_pipeline),
830 ) = (
831 pipeline_cache.get_render_pipeline(view_pipelines.edge_detection_pipeline_id),
832 pipeline_cache.get_render_pipeline(view_pipelines.blending_weight_calculation_pipeline_id),
833 pipeline_cache.get_render_pipeline(view_pipelines.neighborhood_blending_pipeline_id),
834 )
835 else {
836 return;
837 };
838
839 let diagnostics = ctx.diagnostic_recorder();
840 let diagnostics = diagnostics.as_deref();
841 let time_span = diagnostics.time_span(ctx.command_encoder(), "smaa");
842
843 ctx.command_encoder().push_debug_group("smaa");
844
845 let postprocess = view_target.post_process_write();
846 let (source, destination) = (postprocess.source, postprocess.destination);
847
848 perform_edge_detection(
849 &mut ctx,
850 &pipeline_cache,
851 &smaa_pipelines,
852 smaa_textures,
853 view_smaa_bind_groups,
854 &smaa_info_uniform_buffer,
855 view_smaa_uniform_offset,
856 edge_detection_pipeline,
857 source,
858 );
859
860 perform_blending_weight_calculation(
861 &mut ctx,
862 &pipeline_cache,
863 &smaa_pipelines,
864 smaa_textures,
865 view_smaa_bind_groups,
866 &smaa_info_uniform_buffer,
867 view_smaa_uniform_offset,
868 blending_weight_calculation_pipeline,
869 source,
870 );
871
872 perform_neighborhood_blending(
873 &mut ctx,
874 &pipeline_cache,
875 &smaa_pipelines,
876 view_smaa_bind_groups,
877 &smaa_info_uniform_buffer,
878 view_smaa_uniform_offset,
879 neighborhood_blending_pipeline,
880 source,
881 destination,
882 );
883
884 ctx.command_encoder().pop_debug_group();
885 time_span.end(ctx.command_encoder());
886}
887
888fn perform_edge_detection(
890 ctx: &mut RenderContext,
891 pipeline_cache: &PipelineCache,
892 smaa_pipelines: &SmaaPipelines,
893 smaa_textures: &SmaaTextures,
894 view_smaa_bind_groups: &SmaaBindGroups,
895 smaa_info_uniform_buffer: &SmaaInfoUniformBuffer,
896 view_smaa_uniform_offset: &SmaaInfoUniformOffset,
897 edge_detection_pipeline: &RenderPipeline,
898 source: &TextureView,
899) {
900 let postprocess_bind_group = ctx.render_device().create_bind_group(
901 None,
902 &pipeline_cache
903 .get_bind_group_layout(&smaa_pipelines.edge_detection.postprocess_bind_group_layout),
904 &BindGroupEntries::sequential((source, &**smaa_info_uniform_buffer)),
905 );
906
907 let pass_descriptor = RenderPassDescriptor {
908 label: Some("SMAA edge detection pass"),
909 color_attachments: &[Some(RenderPassColorAttachment {
910 view: &smaa_textures.edge_detection_color_texture.default_view,
911 depth_slice: None,
912 resolve_target: None,
913 ops: default(),
914 })],
915 depth_stencil_attachment: Some(RenderPassDepthStencilAttachment {
916 view: &smaa_textures.edge_detection_stencil_texture.default_view,
917 depth_ops: None,
918 stencil_ops: Some(Operations {
919 load: LoadOp::Clear(0),
920 store: StoreOp::Store,
921 }),
922 }),
923 timestamp_writes: None,
924 occlusion_query_set: None,
925 multiview_mask: None,
926 };
927
928 let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);
929 render_pass.set_pipeline(edge_detection_pipeline);
930 render_pass.set_bind_group(0, &postprocess_bind_group, &[**view_smaa_uniform_offset]);
931 render_pass.set_bind_group(1, &view_smaa_bind_groups.edge_detection_bind_group, &[]);
932 render_pass.set_stencil_reference(1);
933 render_pass.draw(0..3, 0..1);
934}
935
936fn perform_blending_weight_calculation(
938 ctx: &mut RenderContext,
939 pipeline_cache: &PipelineCache,
940 smaa_pipelines: &SmaaPipelines,
941 smaa_textures: &SmaaTextures,
942 view_smaa_bind_groups: &SmaaBindGroups,
943 smaa_info_uniform_buffer: &SmaaInfoUniformBuffer,
944 view_smaa_uniform_offset: &SmaaInfoUniformOffset,
945 blending_weight_calculation_pipeline: &RenderPipeline,
946 source: &TextureView,
947) {
948 let postprocess_bind_group = ctx.render_device().create_bind_group(
949 None,
950 &pipeline_cache.get_bind_group_layout(
951 &smaa_pipelines
952 .blending_weight_calculation
953 .postprocess_bind_group_layout,
954 ),
955 &BindGroupEntries::sequential((source, &**smaa_info_uniform_buffer)),
956 );
957
958 let pass_descriptor = RenderPassDescriptor {
959 label: Some("SMAA blending weight calculation pass"),
960 color_attachments: &[Some(RenderPassColorAttachment {
961 view: &smaa_textures.blend_texture.default_view,
962 depth_slice: None,
963 resolve_target: None,
964 ops: default(),
965 })],
966 depth_stencil_attachment: Some(RenderPassDepthStencilAttachment {
967 view: &smaa_textures.edge_detection_stencil_texture.default_view,
968 depth_ops: None,
969 stencil_ops: Some(Operations {
970 load: LoadOp::Load,
971 store: StoreOp::Discard,
972 }),
973 }),
974 timestamp_writes: None,
975 occlusion_query_set: None,
976 multiview_mask: None,
977 };
978
979 let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);
980 render_pass.set_pipeline(blending_weight_calculation_pipeline);
981 render_pass.set_bind_group(0, &postprocess_bind_group, &[**view_smaa_uniform_offset]);
982 render_pass.set_bind_group(
983 1,
984 &view_smaa_bind_groups.blending_weight_calculation_bind_group,
985 &[],
986 );
987 render_pass.set_stencil_reference(1);
988 render_pass.draw(0..3, 0..1);
989}
990
991fn perform_neighborhood_blending(
993 ctx: &mut RenderContext,
994 pipeline_cache: &PipelineCache,
995 smaa_pipelines: &SmaaPipelines,
996 view_smaa_bind_groups: &SmaaBindGroups,
997 smaa_info_uniform_buffer: &SmaaInfoUniformBuffer,
998 view_smaa_uniform_offset: &SmaaInfoUniformOffset,
999 neighborhood_blending_pipeline: &RenderPipeline,
1000 source: &TextureView,
1001 destination: &TextureView,
1002) {
1003 let postprocess_bind_group = ctx.render_device().create_bind_group(
1004 None,
1005 &pipeline_cache.get_bind_group_layout(
1006 &smaa_pipelines
1007 .neighborhood_blending
1008 .postprocess_bind_group_layout,
1009 ),
1010 &BindGroupEntries::sequential((source, &**smaa_info_uniform_buffer)),
1011 );
1012
1013 let pass_descriptor = RenderPassDescriptor {
1014 label: Some("SMAA neighborhood blending pass"),
1015 color_attachments: &[Some(RenderPassColorAttachment {
1016 view: destination,
1017 depth_slice: None,
1018 resolve_target: None,
1019 ops: default(),
1020 })],
1021 depth_stencil_attachment: None,
1022 timestamp_writes: None,
1023 occlusion_query_set: None,
1024 multiview_mask: None,
1025 };
1026
1027 let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);
1028 render_pass.set_pipeline(neighborhood_blending_pipeline);
1029 render_pass.set_bind_group(0, &postprocess_bind_group, &[**view_smaa_uniform_offset]);
1030 render_pass.set_bind_group(
1031 1,
1032 &view_smaa_bind_groups.neighborhood_blending_bind_group,
1033 &[],
1034 );
1035 render_pass.draw(0..3, 0..1);
1036}