Autofac 结合 Castle DynamicProxy2 功能
 
     Autofac 不仅作为轻量级高效的 IoC 容器,而且还能很好的与 Castle.DynamicProxy2 结合起来,实现 AOP 功能。
     首先,我们需要定义拦截器,简单的定义可实现 Castle.DynamicProxy.IInterceptor 接口即可。
 
添加拦截器
 
     定义好了拦截器后,如何应用到相关对象呢?有两种方式:
     1)使用 Autofac.Extras.DynamicProxy2.InterceptAttribute 特性将拦截器添加到相关的类或接口上;
     2)使用 ContainerBuilder 的 InterceptedBy() 方法在注册对象的同时添加拦截器。
 
     如何启用拦截器呢?我们只需要在 IoC 注册启用即可。启用拦截器有三种方式,其中针对 WCF 比较特别,下面来具体分析这几种方式的应用场景:
 
基于接口的拦截器
 
     在注册对象的同时启用 EnableInterfaceInterceptors() 方法。
     使用接口的拦截器,在使用特性 [Attribute] 注册时,注册拦截器可注册到接口(Interface)上或其实现类(Implement)上。使用注册到接口上方式,所有的实现类都能应用到拦截器。
     对于以接口方式的注入,Autofac Interceptor 要求类的方法为 public 或 virtual 即可。
     
示例代码:
var builder = new ContainerBuilder();
builder.RegisterType<SomeType>()
.As<ISomeInterface>()
.EnableInterfaceInterceptors();
builder.Register(c => new CallLogger(Console.Out));
var container = builder.Build();
var willBeIntercepted = container.Resolve<ISomeInterface>();
 
基于类的拦截器
 
     在注册对象的同时启用 EnableClassInterceptors() 方法。
     对于以类方式的注入,Autofac Interceptor 要求类的方法为必须为 virtual 方法。
     值得注意的是:对于 子类,重写(override)父类的虚方法时,能应用到拦截器。父类可在 IoC 中注册也可不需要注册,但子类必须在 IoC 中注册(对于类的拦截器,类都必须要注册,当然,拦截器也必须要注册)。
 
示例代码:
var builder = new ContainerBuilder();
builder.RegisterType<First>()
.EnableClassInterceptors();
builder.Register(c => new CallLogger(Console.Out));
 
基于 WCF 的拦截器
 
     WCF 是一种特殊情况。虽然 WCF Proxy 的服务对象也是一种接口,但是使用 EnableInterfaceInterceptors 不会起作用,因为 .NET 实际上是使用了  类似于接口行为的 System.Runtime.Remoting.TransparentProxy 。因此需要这里需要使用  InterceptTransparentProxy() 方法。
 
示例代码:
var cb = new ContainerBuilder();
cb.RegisterType<TestServiceInterceptor>();
cb.Register(c => CreateChannelFactory()).SingleInstance();
cb.Register(c => c.Resolve<ChannelFactory<ITestService>>().CreateChannel())
.InterceptTransparentProxy(typeof(IClientChannel))
.InterceptedBy(typeof(TestServiceInterceptor))
.UseWcfSafeRelease();

实战一下

先看看基于接口的拦截器:

我们先定义一个借口,名为 ICalculater:

using Autofac.Extras.DynamicProxy2;

namespace AOP.Interceptors
{
//[Intercept(typeof(CalculaterInterceptor))]
public interface ICalculater
{
int Add(int x, int y); int Sub(int x, int y);
}
}

然后定义该接口的实现类 Calculater:

using Autofac.Extras.DynamicProxy2;

namespace AOP.Interceptors
{
//[Intercept(typeof(CalculaterInterceptor))]
public class Calculater : ICalculater
{
public int Add(int x, int y)
{
return x + y;
} public int Sub(int x, int y)
{
return x - y;
}
}
}

接下来,我们来定义拦截器。这里我们定义了两个连接器,通过这两个拦截器,我们将能很清晰的看到拦截器是如何工作的。

定义第一个拦截器 CalculaterInterceptor :

using System;
using Castle.DynamicProxy; namespace AOP.Interceptors
{
public class CalculaterInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// 在下个拦截器或目前方法处理之前处理
var args = invocation.Arguments; Console.WriteLine($"Before: x={args[0]}, y={args[1]}");
Console.WriteLine($"Before: Method={invocation.Method.Name}"); invocation.SetArgumentValue(, ); // handle
invocation.Proceed(); // 调用下一个拦截器,直到最终的目标方法。 // Post
Console.WriteLine($"After: TargetType={invocation.TargetType}");
Console.WriteLine($"After: ReturnValue={invocation.ReturnValue}"); invocation.ReturnValue = (int)invocation.ReturnValue - ;
}
}
}

定义第二个拦截器 CalculaterInterceptor2 :

using System;
using Castle.DynamicProxy; namespace AOP.Interceptors
{
public class CalculaterInterceptor2 : IInterceptor
{
public void Intercept(IInvocation invocation)
{
var args = invocation.Arguments; Console.WriteLine($"Before2: x={args[0]}, y={args[1]}");
Console.WriteLine($"Before2: Method={invocation.Method.Name}"); invocation.Proceed(); Console.WriteLine($"After2: TargetType={invocation.TargetType}");
Console.WriteLine($"After2: ReturnValue={invocation.ReturnValue}"); invocation.ReturnValue = (int)invocation.ReturnValue - ; // 将结果值减去 2
}
}
}

在 控制台 Main 函数输入我们的结果:

static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Calculater>()
.As<ICalculater>()
.EnableInterfaceInterceptors()
.InterceptedBy(typeof(CalculaterInterceptor), typeof(CalculaterInterceptor2)); // 这里定义了两个拦截器,注意它们的顺序 builder.RegisterType<CalculaterInterceptor>(); // 注册拦截器
builder.RegisterType<CalculaterInterceptor2>(); // 注册拦截器2 var ioc = builder.Build(); var calculater = ioc.Resolve<ICalculater>();
var addResult = calculater.Add(, ); Console.WriteLine($"add result: {addResult}"); Console.WriteLine("-------------------");
Console.ReadLine();
}

我们看看输出结果:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAewAAADrCAIAAAAkOjI7AAAgAElEQVR4nOy9Z1RbSZ7/Xbz5+/j47Dn74jnP8+K/u9NhutvtRAbbZDAOmByNyTnnLAnlnHMEIQQIgUAgcjZO3e2O07M7m+bZ3end6enZmc7Tszv7/N88L+pKSCggMG5jT33P93CurkpVda/E59b9Vd0q8Jd/+ZenTp9hcbjziytEGtvhQSp7kMqCJlBZBAoTT2biyIwBEn2ASO8n0vuJtH4irZ/IGCAxB8gsPJWNp3IGaVwig0dk8oh0HpHBJzEFZKaAyhHTuGI6V0rnyxgCGUuoYAmVbKGS5W6BgimQM/lyBk/G4EnpXCmdJ6XzZAy+jMGXOTYYfBkdvsuV0rkSOldK40rslkLTedhnoWlcCY0jprJFZJaASOcSqBw8idlPpPcPUnsJlG4cqRtH6uondjq7b7Czb7Cjl9DRi+/oxbf34Nt78G09uNauAeiWzv6Wzv7mzr7mzr6mjt6mjt6m9t7G9p6Gtp6G1u761q66FujOmibojprGjuqG9qqGtsq6loq6lvLa5vLa5rKaprKaptKaxuKq+uKq+qLKursVdYXlNYVlNYVlNQWl1QUlVfnFVXlFFbl3K3IKy7MLy7IKS7PulGYWlGTkF6fnF6XnFqXl3U3LLUrLvZuW69goSssrSs8rTs8vzoAuKMksKMkoKMkoKM0oKMnIL0nPL0nPK07LLUrLKUrLKUrNvpuaffd2dmFKVmFKZmFKZuGtzDu3Mu7czCi4kV5wI73gRlr+jbT862l50MlpuddSc6+l5l67nXPtdk7S7ZzE29mJKVmJKVkJ0Lcy7c6Ajr9p942M2Otp+xyT7NXR11L3nJQanXQ7Oul2VNLtqMTbVxNTriakXEm4dTnhZmT8jYi46+ExyWHRSaFRiSFXE4KvJARdjg+MjAuMiLsUEXspPPZieIxPx156Xo6IvRgRczE8+kJY9PmwqHOhV88GXz4bdPnNwMg3Loa/fiHs9fOhr54LefXt4FfeDv7J2aC/eWvPf/1mIPJh/TdvORz0k7NBPzkb/Mrbwa+eC3ntXOhr58NePx/2+oXwn14Mf+NSxBuXIt+EDox8K/Cyi4Muvx18FXPI1bdDopx9LjTa4Quh0RfCoi+Ex1wIj7kYHnsxPPZShMNx0IGR8YGX44MvJwRfTgi+khh8JTHkamJIVGJoVFJoVFJYdFJ4dHJ4dHJ47PWI2OsRsdcj426Av/iLv/i//u//5/2PPiHSOS4QxzjOdnAcT2HiyQwcmTFAZAwQ6f1EGgQ6jszEkVl4KptAZRPpPCKDR2LwyUwBlSWksUV0jpjBkzL5MpZQzhYqOGIlT6KC5u6zeM8csZIjUjjZ/lKsdLzFFso5QjnbxQpYCtv5IyIFW6hgC+VsgYzJlzB4YjpHTGULKEweic6BB4inMHFkBo5Ed3iASOsfpPUPUqD7CJQ+AqUHR+7Fk3tw5B4cuRtH6h4gdQ0QuwaIXf2DXf2DnX2Ezj5CRw++vQfX3oNr68a1deNaugagmzv7mzv7mzt6G9t6Gtu661u7oOtaumqbO2uaO2qa2qsb26oa2irrWyrqWirqmstqm8tqmkprmkprGkuqGoqr6osr64sq6u6W194pq7lTWpNfWp1fUpVfUplXXJlfVJlbVJF7tyKvqDyvqDL3bkVeUWVecWV+cWV+SVV+SVV+SXV+SU1BaU0B9sHq/NJqbKO4Oq+4Kq+oKreoMuduRU5hRU5hRXZhefad8qw7ZVl3yjILyjLzSzPzSzMwl0Cn55Wk5xan5xanQecUpebcvW13SnZhSnZhSvYd6FtZmG9mFtzMLLiZAZ3v8A2fvp6e52L7VSQ5LTc5Nfdaak7S7eyklOzEW1kJNzMTbmbE3UiPvZ4Wcy01Oul2VGLK1YRbVxNuXk24eSXh5pX4m1fib16Ov+HdNy/HY8l+ZF+OvxEZdz0iNjks+lpoVGLwlfjAyNiLETHnw6LeDrnyVlDkm5ciXr8Q9tr50FffDn7l7ZCfnA1GHH8qjr/pBvG3Q/Y4fiHspxfCf3oxYo/jviGOcfyqR46fhxB3ODzWI8oDL8cHXo4Pghx3oDwqMTQqMTQqKSz6Wlj0tbCYa+ExGMrB//pf/4tKZyh1hn0Qd+K4vT1OYeHJTDyZgSMxcCTGAIk+QKLjSAw8mUmgMAdpbCKdS2RwKUwBjS2kcTF2s4UyrljJk6j4Mo1QphHKtWKlTqwccrZIoRUpdHuWa4VyjVBmt8u2dm9bphHI1AKZWrD3UiOQaYQyrVCmdfqsWihTC6VqvlTNl6j4EiVXJOcIZWyBlMkTM7giBldI5whobAGVxYemMHgUBo/C4FIYXDKDS2ZwSXQ2tP02hTVIYREoTAKFSaAwCGQGnszAEek4In2ASMMuAAQM/X0ESi+e0gOh30/s6id29g929hM6+wntvfi2Hlxr90Br90BLV39zZ19TR19TR18jbNE7Nedrm2FDvr26sa2qsa2yobWivhW25WErvqy6sbS6saSqoaS6saTK7urG0urG0pqm8prm8trmstrm8rqWirqWitrWirqWitqWitqW8tqW8pqWsprm0pqm0uqm0uommENxVWNxZWNxZWNxRUNRRT303Qp4l1BXWF5XWFZbWFZ7B7q05k4pdoUoKK3JL6nOL6m2Xzyq8oox5xZX7ndRZU5RRU5RRc7dA5xdWL7fd8qz75RlY5eZ0syC0oyCkvT8YnhvkZpz93ZOYUrWnZTMglsZBTfT82+k591Iz7uelpuclpOcekJ97XZ2UkpWwq2M+BvpscmpUUkpl+NvRMQmh0YlBl2OvxgRA5vndpSHvYo4/vQchxB/K+gnZ4NeceW4ozHuyvH9ED8bfPWsHxw/Dx0WfX4P5ViTfD/KI+Mgx/dQfjUx5CrG8dCoa6HR18JiMJSDU6fPfPLp35KZPCLtIIjbG+MYx8kMPImBJzMIFBaBxibSuSQGj8oS0LgiJk/CFsi4IgVPohTI1CK5VqIckqqHZRq9XDOi1BpUulGVblSlM6h0BoUWs1JrUGoNCu2Is+VaPbRCO6LQ6uUavVyD7XHaHnGywfXlXmKZRi9TD0tVQxKlTqLUiuUakVwjlKkEEqVAouRLFDyJnCeWc0VyrkjOFcq4QhlHKOUIpWyBBJrFl7D4EhZPzOKJmVwRgytkcIV0jpDOFtJZAjpLQGPxaSw+hcmFFwBokuPq6IR+HJmOI2PE7xuk9g1C1jua+cTuAWJX/2Bn32BHH6G9F2vat3bjIO5bMNz3Nrb3NLZ1N7R1N7R21+9Bv7OupbMOa+x3N7R2N7T3NLb3NLb3Nrb3NcLrREdfY3tfY0dvI7xmtPU2tPU0tPY0tPbUt3bXtXbXtUB31bV01TV31TZ31jbb40KNHTWNHdVurmpoh65saIWuqLe7zrPLa1vKapt9uBS7F/Hk6qZSeJWCFzB47alscLrY1N4prSkorc4vqcorrsyz36zk3C2HUSmfLs95Hs4qKM3IL07LLUrJvnMzMz85LSfxVmbcjbSopJTIuOth0dcwlIdcfSso8o2L4a+fD331XOgrb4cgjj8dxPe3x195O+RVl6AKhHjEG5civLTHr5wNuuLaJI9y97n9HI+B3o/yyNhLkXGBkfGBkXaUX0kIuZIQ4ozyaAzl4NTpM5//5rfuzXAM4h6D4xQmjswgkBl4CnOQyibR2SQGl8LgU9lCOlfM5Es5IgVfohLItRLlkEw9rNAalEOjGv2YdmRCZ9jzkMHlpc4woTOMYx4Z142Ma0fGHNaNjGn1do84bUDbc9DueVxrgG+NafQOGzX6UfWwQaUzKHUGpW5EqdU7rg0y9ZBMrZOpdVKlToJZK1ZoxQqNWKERyzUiuUokV4lkKpFMJZQqBVIlXwKt4EsUfLGCK5JxRTKOUMYRyjgY9DHi70GfLaCxYZOfR2HClj5nD/Q0FoHKJFAdF0v6AIk2ALsfBqm9BEovHoZ0SN04UvcAsWsAtusHYeC+oxffjoXvce09e3s6egkdfYTOPmInjP8MEGEsqNv+0n6LQOzoI3b0Dnb0ws4AQkcvob0X396Lb+vBt/Xg27qd7biu7EWNXGJHnf3Nnf3w3sKjGzt6G9t9uaGtxx/Xt3XXt3Xbrz1dddj1Bl5p2isb2irtdy3OPRDOF4CT45KqhqKK+sKymrziypy75Rn5xak5hTcz8pJuZzlQHhqVGBgZez4sCmuSnw979Vyooz3+3Jn4Ito1qAI57hxUsTfGLx4AcReOe4L42yFRDojbUR7jjvKL4ZDjsZDjnlCeBKPkodE+Ie6xPY7HYggsAoU1SGOT6Bwyk0tlCehcEYMnYQtlPIlSKNOIlTqZRq/QjWr04zqDadho1o9PGUzToyaLcXLGOGnxYJOrJ6acPeq0YZiYGsU8bZiYNpqmjZMWo3nGODnjyHx00jI6aTGYpg2mKcOEw+aRcfPI+OTI+KR+bFI/Nqk3moaNpiHjhG50QmcY19oNoa/WG9V6o3p4VD1sUA3tWakzKHUGhVaPXQO0erkWXgOGpKohqUonVWrt3FeLZGqhVCWUKh1Nfr5YzhPDxr6UI5Cy+RK2A/c8IWQ9gwODPHbcs3gUBpfE4JDokPisQRqMcTHxFAaeshfQHyDRMBNpA0Qabi/qxcCTmXj43dm/TRgXcoTLCBQWnsLEU5gwbuYIndkDaIwBEmOASHd2/yDN2X2YqX3wkuPJPXiPJu8z7G0+2AOYu6BhtAq7g9nri4bRqubOvuaOPkcX9Al0fUtXbVNnVUNbeW1zcVV9YVlNblFFZkHJ7ezCG+l5ibcyY5JTL8ffgE3yC2HRZ4Mvv3kp8nXXuMpzZ+KL6L950x5Uecs1OH4+9PULfgVV3gq64tIedwuqYI1x6NAojxx3QXkE5HjcHsqvJARfsaP8SkLI1aSQqCQPEB90IjiZziHR2HazSDSW00s2mc4hM7gUJo/G4jE4Qo5QxpeoRHKtVDWs0I6q9eO60Un9+DStOAAAAMrEJovNPGubsi5yKwJAuWTKuuCwedbmyfPm2XmzZd5smZ+0zE9a5s2WuUmLddJinbTMTc7MT1rmJ2fnzbM2s3XRPLdonl80z9ltXZi02iZnbZOz85Oz85Mz85Mz8ybLvMlidXhi2joxPTsxPTs2NTs2NTtmnhkzW4xmi9FkGTVNj5qmRk1ThgmzYcI8MmEemTDrJ8z6cbN+zAwvAMNjk8NjpuEx05DRpDPabwVGxrT6MY3eqB42qIcMKt2IErJeM6zQDMvVQzL1kEylk6l0UqVWotCKFWqxQi2SqWEDXyBVCqRKgUTBF8v5YjlPJOOKZFwsqiNlCyQsvpjFFzN5IibPEc8ROFr3NCysz6MyeVQmj8LiUVk8GOinsQR0toDOFtA5QjpXyOCKPJsjonPsMSK2EH6EBs0S0FgC6p75LsZVnweBxQN8ChN2KmDdCftM8mg6F16csEsUne2/624BcKttX2vDfssILz/wYkPtI1D74IUET+nFkXtwJId9XCR6flx39Q+29+BbOvsb23tqmjoq6lpKqhrulFXn3C1Pyy26mZmflJIVm5x6JeFmWHRS4OW482FRZ4Mu//Ri+GvnwxxBlecOxBfUexx3CY5jPZyu7XGvHD/r3CT3BPE9lNs5vg/i+wMsGMfjArFAeXzwHsoTQ64mglOnz3z+hVeIW6wLH/7sFx/+7O/c/IuPPv3FR5/+YmH9wcLa/YW1+6ZpK40tECmHZNoR5ZBRazANj00ZTLNGTkUAqGTPLkzNjeGiwBXi+IxtVVAVAKrkM7blGdvyjG3FvrE8Y1u2zDt7ac9zi9PWhf2eX5yeX7LYli0LKzOLq7NLazNLq5bFVcviqmVhxbKwbLEtT9uWpueXpm1L0/OL0/OLU3MLmOHFw7pgttomrQuTs7bJWZtpdt40O2+yzJksc+MW6/i0dXx6dtyJ8sapGaPZYpyC7f0Zw6TF7ukR0/SIaUo/PqUfmxw2moZGx4cMY7oRo05v1Awb1EMG9ZBBrRvBsK7RKzTDcgzrWAxHqtRKFBqJQiOWq0VytVCmEtrjNgKJgi9R8MRynkjOE8mdyO4I1otZPBGTJ2LxREyuiMkVMrlCGMbBzBOxeGKWPb7PFkg5Qqkj7u+8zRa4GbtXcPQKQIux7gFoYt1FEFQ2KHIulMEV9VcGgUu1fVwh3Yc5e6Y5rhn+uSkVgNQumtOVBuudZvEoTB6ZCfulOUQa23HvQnDcZ5DpODLdeVTSc3f/ILUXT+nqJ7b34ps7++pauqob28tqmu5W1ObeLc/IL4Ycj0lOhXEVGB/Hgir2xvhzp+ELaghxaDvHQ149F+oYcYiNVPEGcYzjTqGVgyDusEeOYyh3jFrBOO6M8sTgK4meWuLUPYhv7Tz40//8z3//6QD/6X/+Z3PnPoXNl2pGFENGzYhpaGxqxDRjnJpT4KPBVbJ2fmVmwYSPAVcp5vnlTXFNAKhRzy9vzC1vzDt5bmndzWtzS6bBGHCVNDG7sDJrW5m1LcNrwOzCyuzCyuzSqp4SC2Lo+glGFHBSrXpuZcO6sm5dXp9dWrNbWREAymVrM4urM0urM9LaAADKpSszCyuWxRXI/WlJTYA9j1LRgnluYXKYdNkp40i8wTRrm8A8PzErKQ4AAFQyLHNjFqtxenbUbKGVBIBiDhauGR0fMozrRsZ0eqNOb9QOGzXCrlAQ0SwwqHXOTXVyDgDZhCEM6/gCAEAWTiPBIvJqkVwtkqkoDaFOdcnpFGPBGV5PjvPRp3ZLOQIJR2AHNLnhEgiuosh5YjlPrCDVhQAQUk1T8CVYkEcgUQqkyq4spyyCmkhiBV+s4GPpHQqposJ8sCsKrycHgOwOSuMlEFxJsfcMY5YRaoJBYANBaO8q8GYBozIQXKym4WuCnQ8EZPSy9y48HtyWAUBGL7zMOF1p7FcX7PYCXhv4VBafyuRRmHs3Co4IFYnOJtHxRRfAuVI8Nhipr+I8AOdKCc53CSQ6h9Sc5lS/S3f77Pv7Ks87veH2wfYbLgeWWk8nFF2AG1iartJLAFws6KK3FF5wTvrKrariqvqC0uqsO2WpOYU30vMSbmVEJaVExCZjQZWgyz+9GP7qOQTxY+G4oz0e/MrbIa86c3xfUCXQG8ed2uMHBVUcPh/quUkOx5U7DSSPC7wcF3Q5LuhyPLRniA/a2+P37j/8x3/+D/bwDmdkmzu6xRvfFExu/P3f/+vXX33575999u+fffbVV19qbR9obR9s7tyncUTKoTH1iElnNOsnLKNm65jFpsLHgCiKbmFtdmljbmXTtrq9uL4jrQ8AdbqFtR0Xr24vrG7bVrdtq1u21S3bCvSmTdEQAOrFyxvzy+tzS2tzRloUiCGMrc4trc4tr82vqKsCQKVqy2ZmR4M4onnHtrlj29yxbezYNrbn17fm1zbn1zbnVzfnVzdHaHEghq5f2Zhb3ZhbMQ/GAgAAiKEPr2xYVzesqxtWRX0AiMWPr1mWVi2LyrJoita2PG2gXAHR/SNLU/NL5hHyFQBKxctm27LZtmxeWJ60yUsg9SukE3ML41bb+MwcoywAlPIME1MjE+aRsUm9cWLYMD5sGB8aGR8aGdOKusNARKvIqBkeVQ8b1EMjqqERTms4CG1nY4EXYSNkdUgrQ6WVKrWwkd6bAwDI65GrRTKVUKbqzgYAhFTTFQKJgt+bA0B2p1jOE8v5PTkABFdRZDyRjCeS8UXyziwAMgf4YgVfohBIcBmQDVl4rLEvU4tk3NpgAIKbKTIY2+HWBgMA8rplaqFMTa4PBcFNZKlKKFWR60MByO2SqgTQEnZNMAisYwtoTYEgpJq2d1XA+nv9M3YlEMmJtSEgqIEowq4QnZkAwMuPyLM7MwHIHOCJ5PBguSI4rAjaEYOSsHhiJk/E5IoYWLAIttwdASg+lcWjtqYDkNaIxaB4janwNKU3OkWNessDAQgsxjm/BDdbsYDSBcdbuOoLjv2YO2/t34MlO19OciS40cwdpLJa714AbxfX9Q22dg00tHXDxnhhuVNj/HZWbHLq5fgbIVcTL0bEnA2+/MbF8NfOhyKIHxPH7RDf4/ghRhw6Q/xs0JWzwVf8bI/bx5J7RvnFcPszQZEQ4pjtEKc5Q5yFcZzKurf74J9++Zt64UKD1NastrYOz3QYpz/99Jdff/k7Z4gPrz7Z3LlP50mV+gnNqHlozGKYtBqn5lnljkYtqJBPE2NBNN26tHlf1hAA6oeXNu8vbd4fYyRgKWI5Yxu7ixtWciyIps8urt9bXL+3sL4jqQsAtbqFta2F1U3b8oaBHAuiaYblddvyum11w6ZsCAANko2dxWlONIgnTe8ubu8ubkEPVQeAKvXOwsa2bWNnYWOGGAui6Bbbxo5tYweDvpoVBeIGzTvzGzvzGzt6ejyIZQ6vbc2ubs6ubswsr1uW1ixjtCsgZsC4Or24Or24yqsJADWq6eX16aX1qaX1qWVVWQAokSpLAkCJZNk0vzRutTHLA0AZ3wh7Vpml9nNQRDaMD1GL95pY4V3c4VH1kEE9JGkOAyGtYpVOr9Tqldz2EBDWSGgLAWENnCGZSidV6aT4fABC69gasUIjVqhh27wnG4BsvFCqFPblApDbJVEIJAq+hFUTBAJrWTyxnC9W8MW4DAAyehWwuQ1T9gzkweuBWK4RKzS0xlAA8noUGiyeo9CIFdy6EBDUwBXLNdTGUBDcTIV3A3JCJgCZA5D1ahGjOQiE1jLsGw159mPL7XZAH14A+vIAyK2pt99JZOGFUnsfALwJyMIJJEpyXQgIaiI53SJ0ZQHHHrLjnsC+pysLgKymanvzPbCOxZco+NTGQBBSRVXAMaMdGQBk9HEEUrZAgqsOsrehM1MugQsVZHskR9CcBkBqF50joHMEdE5XCgAp7fCvPdpDqLng/JIjpHOEfZVB4FJNH/ZuYCkB29+cBkBqt1PK7hS3z2IfBxnNMP2lmh4Wn0RjtxVdBG8XNwyQ2nvwTR29NU0d5XXNRRV1ecWVmQUlKVkFyak5cTfSribeCou+FhgZCyMqr53Hxho+dw6+0HYEVbDg+MGP/xzQGD8bfAUOJD/rNmTFI8TPe0R5uPMwxLhLkXGXIuMCI/cg/oUbxDFvbN37p1/+ZtC43qieKZEZChWaQo38009/+fWXv//ss88+++xXX331pfHBw8kPdjZ37jMFcpXBpDNO6ydmR83zY5aFSeuyhhgLoulDy1vzqzOkWBDNtK5sP1Q0BoAGw8r2oxVtawBIoFgermzPU+MBaNAvb85T4kA0w7q8eX958/7SxnBNAKhW7y6t7yyubS+sTpNiQBRlcmFlY2F1Y2F1U1IXAOp1S5v3liycGBBPnrm/tAO9u7Q9XBMAqjX3FrfuLW7dW5hiR4N40tS9ha3dxe3dUVYCiOOMbs+R4kEUy7qwfX9h+75N2xQAQKXm3tzGtnVt07q6Mbu6PjNBvwpiceNrM8vrMysbgtoAUKuxrG5a1jYta5uWVU15ACiTb0wp6gNATN/oiml+iVURAMqEY1MzRhUuAoBCxqTeaKIUBYCIHuHoxLCkJwxEtInHdPoxnd6o1cMAS3iTYESlG1HpRtit4SC0naUVNoaC4BaBXDMkU+kYzWEgpJWOtcqx6DkVwleuEvXnAZDbLVMKpUqBFLaOWQKJUiBRCHpzAMjpkiqFUqVQpuzJBiCbIJYPZsFwjVIrUWr7cgHIJUqVOmf35QJYIr0pDIS00hSwXGIWAFk4uK2lNdrfYrUGAQCCW6hyjVjOrQvBtqmNodjOgXwAAMgeFMs1YmZLELwSuF0YKA2hILiJjN0iqIQylbA/D4CQGobThoxTEwxANt5+OwIy+h0pQUa/SshoDgIh1XSsO6EzC4BMHE8s5/ZkAxBcQZJyBFJ2ZxYA4GI11R7c700F4HaHCHYaMzszAchs4Yla0gFI68Hi/p1ZAGS22jsDMHdmARBUThSziHUX4QZPzOKJW9MBSOtxSgnzd/0sT8ziUcsDsetSOVFMZwsoDG5HyUVwrqQJR+7AIuOdlfWtxVX1+SVVmQUlKdl3ktNy4m+kRyWlhMdcC74SfyEs+s3AyNfPh77yNmqJHwvE94Iqr3gJqjgPN/TI8bP7OX7FneMegyr77BxUcR6DeDEC6/D0C+I5vOFbbFmaSJyp4Odo2bAl/tlnv4It8dm/XbX9w8Lmzn2WUKEeNevGLSOTVuOUbdyyOGld1hJjQTRjeGXbtjZLjgPRzPnV7UfKxgDQOLp67zHcWNl5tLoDgd4i3364svVwZevh8taD5a0H44wEEMsZ39xd3ri3uL6zqGwIAPUSjOAbCyZGNIgjmbcXN+8tTXNjnMKI1dr7S/Ym+cLmvYXNe5KGANAwhDXSt/XVASCaNbd474GRnQhAi3T34cK9Bwv3HoyyEgAAIJatX9+yrm3Orm7MTjCugljc+PrMyvqMsj4AgHLl1sza1sz6tmV9y7KuLQ8AZYrNqdUNTk0AiKYq9yA+K+u7AiL7xWOTeqNJL+sNB5HtkvEhcU8YiGgVYQTXDhsH7wBQQFMPQYhTcgEIaRUqNMPMljAACgbUQzKVrj8Pclbr1P+pEcMGtUyNQVyqEkqV5PoQR5hFIGE5gC6UKoX05iAAMvvVYrm6NweAkBaaQiNV8OpDQHATX6rSSZU6qQozHbts6CDE6UqdRKHtzQEA5Pe6A53VGgxC61gY3B0vaY1hIKSFqtCIcfmwsb+vmS92Br19myJ38F0tYjYHgdBapronB4BsArbTfiext1OmFsngrQkB3hbUMFRCqUooVXVlA5CF42M0H+CKYBcuvSIQXKymsQUSNl+Cqw4Cl2pxzmCFCHYwmifGVTmnsdvBbmeId2aB/cjuTXWOczvzHV5OqqgsnpjBEVKZvK6SS05Jz96q6qpsaC2paoBh8dvZhQ6IR8QmB1+JvxgefTb48uvnQ19FED8ulL/lMagSCkcc/vTA4Pg+iHtvjx+C467t8YsRsST6Sp0AACAASURBVJciYp0h7hgSznKH+G2eNF0izFLxcodYd4xU2BJ3hFN+8cUvfvHFLyDENaPmIQjx6f0QX1i32iH+WNkUABpHV3cWaPHAVRjEIcGXtxyt8t3ljd3F9W1pXQCo1dib4RujtDgQwxhd31rc3F6EDe3pXdjuxrx5b2FzZ2FzZ2FzqDoAVGnuLWzeW9zaXdA2BYB40syDxXsPFq28aACqhx8t3Hu4cO+Bbee+bds6GAcAAFdpU7MrsCW+p3LFxsza5szalgWztiwAlMo3zMvrk2O0ywBEDhqZFQGgTGg0z9BLAlwPMLJNPDYkxmLi2uFR7fCoZoieB0Au0T5whXgHgLBG7rBcPSTntgUDkI3XSVVa2C6mKbQYvuVqsRxrt1JkMFjhUEg1DcZV5AJaYyAIqaZCoCvIdSGQ9SKM+6G1TI1EwasLASCHKFFqpUqtVKWFEHc0z2mNYU6ZOwiuleDy9176gngrbR/E5c4Q9wB0F4hjvObWhriey30Q34svERxBHqFMJZSqurNhrIZVHQQu1TLtz2TRK4McEKeVB2IYtXPZgeDeVDthcVVBXlrima32Tznk1uj21hLvTQXg4qUgeKnYg/i50mYCpbNvsKWzv67lUBB//gR8CQwhvp/jTkEVl7mxAj1z3FtQxTfH3SG+R3O3xvjFiFhXiLsS3AHxDLkgR8PJ1zMKxyglZsKnn/7yK6eY+P/86b//50//vblznylQaAzm4TGL3mQdnZofdwmnbGLhFIZ1ZfuRojEANBpWtm3UeBDDnF/efrjsAPemw/eXprgxIJ5s3l3a2F1c31lc01YHgCr5hm1l3bayblsxE2NAFNW8sLa5sLa5MMmCrfKFje2FdeyvbX0Ls6oxADSI17dtGzu2zR1Jwz62AtA4YtuBBL8/v3XPurE9q2wIALG4cSwm3j+6MrWwMr20NrW0Nr2yPr2yMYVZXRoASmVrk4urpoUVBTEGgKiIKwCU8g2mKWpxAChiD49ODBnGh0bs8RNhdyiIaBHYBx2SCgG4g9PqFdphhWYYRh1clEOUKDQSXD4AobVMNXxqVChTCWXsmmAAsnACKRYz6ZTI+RI5Nl5FLOeJ7f2EYhlPJOeJmY6AsENBDRyRXA3DMr1YTHyvlR3UyHOJmThZLNf05tjDI1iEJLSWqcFeDuQDkNfj1Mp2tJ1FcrVIzq0NwYp2NLQhhSmNobB/1RFO6YZxfxmnJhgENrCFzpGWvXfhS3saRnMQDLxIVQKp0t4SZ1UHAZA5gM2pIKDD8TBsvoRFcomEDFS5naZLtQM8EdMF7k5hE9g8dw2neIS1O8TtH6eWBwJwqbbPYzil+VDhlMC/fvPSc4fgi26XoIrL3Fihr523B8edgype5sZyi6i4oNwBdNfGuFeIw3Hl+zi+B3F3ghMoTAjxXB2rYJRWNEEqm8ZVWns//fSXX/7eDvEvv/zhhz98+803MCauHpkcMk7pTTOjZuvYtG1yZlE9GAOiaEOL69Zle8fmxl7H5hgjAYB4knl3cWN3Ud0UTbc6d2w6DWLZXljdMtDiQDR9ZGltHlpWFwBqxUtr88tr8yvr8yZGFIgdnNiYX3VYVRUAKuTrcyuTgzHgKsU8t7oxt7o5Z2JGARBFt8xv7Ng279m2dg2sBADiB6d39cyEq4xZ68b27OqmRV4fAGq4C8vmEfJlEN03vDA5tzg5vzRpW55cWJkcpV4GMb2jy6YFeXEAKBIvjs8tjs3ajDMjXVcAAAAUc/Xjk0P0YgBAPsWoGR7VCDpDYcyE3xEKQC5Rr9QMK9TCxlAQ3CyQq4akKp2E3RIMQFAjF/ZeYlADITV0pVDKrgkGAOR02Z/y78wCcEQHVyTj9mQDkNVhH/TNEcIhhr2pAKR2SdgCCUcg4XRlATj6UCjlimQ8OGoF5HRJFEIpPgMA2AMpkqmEUo7zYBVKQ6jTwBX4AKpKSG8OAiE1dJXTS6y7Uijl1ARj246OTQHsesV6Mtk1wSCwnu0grKOHk1wfAoKbSNgDrvCQc7v2ejXtA2B6cwPr2FjHptNO+zY+w97JyaM2BgIYRZEP1gYDEFxB3uvhvFhFYXBFLWkApHUznHognXo4BfT2DABASrsA6/x06r3sqwzae+nasenUFwp3eurYbM9w/Ti42erWsdneW9PUUV7bXFRel1dcmZHvu2MTQfxYUe4+oYpbUMXns/i+girOduvh9N4etz8f5OA4BnHnQArBTnAChbmxvfvzv/sX7tw0z2YWLE6Ilsckq6Pvv/9zB8S//P3vv//u26+++mpz5z6DL1Hrx7Wjk8Pj0wbTrHFqbsJiU+GjwVU4xHByMAZEUS0La9iAE9vajm11R1JrbxTHMA0rW7bVaWIsiKJMz69oqgJApXxzfhnaDEeLWxdXrAsr1oUVYTU2Wty6uGJdXLGOYUMPZxdX7FZUBIBy6cqskXoVxOCNK7NLq7NLq8PkWADqBCsb1tVN6+qWdX3buqGrCABX6ZbZ9W1BnaORHtM/smiy2kzDxEgQ1aObG5+ZG5+ZH5+ZH5+1jQ0TI0FU95DNOCspCgB3eXOGaathanbEbNErBsIBAHdZ8PF9bnuEPcM7OPiMj3p4AAY/QlrpbBh20EjkGhEMj4DcbuzRTRgSwaUDcKmWCYfQdWQ6NQ8D6/GOEdPwpp4vdjz1s9c7B5/64Yla0mCjT8Tiidh8CVsg4ZDrLwGQ1uOpnZ6Fc4wPcYwYcR4USKoLAUGNJMceWmMgCEnPcowewd7CkomxQZAd2C0CsyoIXKpl8sQD6QCk9TjdOtS5Bk2w4YPOIw6xOwji3hDDnHT77rQex+j1bPu+7LS90SnStr2ktWVwdAq76xYAt9rsA8lb0wG4VIzDBhpSWTwqi1hyEYDbHfBlr70jEgDgMgDReYihh52dt1wOLLC4tfoCAOB2pyNxYyoA4FJhD6v1rss4cXC1qKymqbDM5Xkf+xDDBNchhkF2iCOOHxvEvQTH941U8RQcD/I84tArx/0Lqjg/5+kV4vZJVplrm/f+z//5/77/7uvvv/36+2+//sP33//h+2//8N03//1ff/zTf//XDz/84bvvvvvmm6+/+ebrzZ37dK5YOWTUjkwMGc368WmDaWZsymqy2MyzC9Nzyxbb6szCmnVpfW55w8VLHp7xsS6tWWV1AaBWsLA2u7A2u7A6O0q9CmJwhuWZ+aWZ+cWZeWl5ACgTL1rmnQ0f71y0zC9Ozy1Y5hfghnYwGkSRtPOL8AnP6fmladuyZWFlenHVsrRmWV63rGxYVjYsy+vTy+tTS2vmhRWzbck0tzA+Mzc2bR2bnjWaZ7DJWCZnDOYZg3lmxDwzMjmjn7ToJy3Dpulh0/TQuFk3NqkzmrSj45qRMfXwKDbBlkYvVw/LVDqZU5+kRK4Ry/cGY8DRcvDJGp7jaXuRjOuYQ5GPPXCPjXe2G5tohWtvM8Kxz9AsflMqxgga9uQ9ZjpbQOcIGFwhw/EkJ3xYBns+SMYV2ivgNKejqxmVQeBSDcPTW3vmCPZ7/7OgXdkAZLW5PyOK2ddjPr68/9kfCYsPnywVOU0+3AUHblNa0gFIa2B6fPzHoznPzoNUFnxus3uA1N6Db+7oq2vurKhrKa6szy+ucjzsE39z72Efx5P3r54LcYU44vhTQ9w9qOJ4jPP83rDxN/ybG8uJ4x4gDiez9SuoEurysP5+iMMpkBwQHxoZ29y57+7t3Yf3HjzevvfAsUc/Ok7jCOVag3p4TDtiGjaaR8anRk0zY+bZ8ek5O8oXp+eWLK7P1mNUhbZCL07PjQ1EgSsE47R1ET4fz60IABXiKTihysy8GhcFrhBUlrlJy5zZ6a/d1kk4Qcq01WQRlgSAYp51Yto6YbFOWKwmy/zEzPzEzLxp1mayLpisi6b5JegJ6+KEdWFs1jZmsY5OzRomp0cmpvTjk3CClCE4QYrRpDVOaEfHNYZxjWFcPTKmHhlTDhuVw6OKIYNCZ5Br9FJszlst9rClVCWUKoVwwJ9YgT06L5Rxhf1pAKR2STFMu09y6+AynOSWxaMweRQmlwxtnwHRmTiO2RAH+8rPgYuFPfsnuhqksWAaEp1NpnPJTC6FyaOyeDQWn8YW0NnYnT4Dm1/FyywrHZkAZDZ7m4CFK9o3GtqLyaUuI7U9mX3oB/E9myWgsviUlnRwu4PM4JLp3K7SSwCk1tHwhRfA28UD+x/Hf+6P3UOCt3RVN7SX1TTdLa/NvVuenlt0M2PvsXv4pI/9sfvQV7HlfhDEj53jQe4THL7qGG54wd8JDg9sjDumzfInqOIZ4tg8dmSmfbo7Zj+B0tbd39bV39Y10NY90N490NEz0NGD6+jFd/YRugcG+/CUASINR2GQaByuWCFVDyt0BtWQUasf1xkmhoymkTGzYWJ6dNIyPmWdmLZOWubMMzbzjG3SPqfVpAXOS4XNWGKanjNNz2HbljnTtBV6Yso6MTU7MTU7YZ6BHjNb9jy530bTtJOnoEdN00bTtME0bTBZDCbLqHlm1DwzOjU7OmUdnbIapmYN5lmDeWZk0jI8MTU0NqkbndAaxjV6o1pvVA1hE9gqdCNynV6u08u0epl2WKoekqqHJCqdWKkVKbQiuUYoUwuk2GyF2EAI2Ki0xzrsU03Zp5eCd9NMvmMZCghlx3Qfg1QWgYotQAHnLNwHmr1pCwepA4PU/kFq/yAVTiXYt7c2BbXPvr9/kDowSBsg0nBEOo5EJ5AZBAoTFkSkwZYmrIPnSax8mET3x4drnB5qPiwXu83ESaCyam46ghQp1dgSTl7nxvI9geIznQCrobUbToBVXFlfUFKdU1ieBgl+CwukOCbAeiso8qcXwx0BcVeII44fE8o9jTi0P8PpITh+5KCK6wyIV/0JqviCOGyV2M10mEBhDVLZRBqHzORT2QIGV8wSyLhiBV+mFil0UtWwXDui1BlUQ6OaIaNmeEw3Mj40OqE3mvTGSf2Y2TEx7Mi42e7JkTHMerudt/XGSb3RpDea9MaJYePEsHFiyDAxZBh3WOe0oTPYJyLH5h83Ogxx7OQxtX5MbRhXG8bVhgnVyLhqZFypNyqHjfIhg0yrl6qHJEqdWIGtECSQKvlSJV+i5InlXLGCI5azhTK2UMoSSFh8MZMvZvBEdK6QxhHQ2PYJmCCRaRyS03pAeDIDj82uRxuAM7hCzuIpvXhKD55sn1uV2NU/CCdWxdZ+63OeMRzf3oNr6xmACwM5Vv6E067ChSOgm13d0tnf0tXX2tXf2j3Q1j3QBmce7yN09g129RPhhK49OJJ9SlhKr3/2MsGsvxPPejWOfCBM/Z2l1r6Wnn31VJdFU7HlUp/3RLV1jqloa5qLK+vvlFbn3i3PzC+5nVV4Iy0v8VZmzDVsKtrAy3H2qWhdmuFuEEccPw6Iv+kaHHcfqeLX3FgHQ/ysK8RhoNx3exyDuL0z0wniLgR3QbljMnEinUNh8elsIYMvgcuwCaRqkUIrUQ1J1UMy9ZBcPSzXDCu0eqV2RKkdUekM6qFRzdAoNqXfkAEu7gMfU1TpRpTO1ur3Nuwzdys0eoVGL4fz/2mG5eohuXpIpoLWydRwilfHqg6O8XAaiUIrVmhEchcL5RqhQiNSaERKrUChESg0fLmGL1PzZCquRMkRydlCGYsvYfIldI6QxhHCJjOZyYOtTiJsJNLYBMfqo7BlR6T1DVJ68eReHMQxsaufaF9zmYAtuNw90NY90NI50NLZ39zR14yBA67A2VOPLazTWdfcWdvcUdvcUdPcUdME1+Fsr25ssy/S1gZXPHC4og5bnxO6HLrW1XXNFXXNlXXNlXUtlfWtVQ1t1Y3tNU0dNU0dtc2ddS1d9a3dDW09jW092OIMcA1o72s72NeTe2Zu6230b3UI7+5u2L9wBLbiXXVje1VDW2V9W2Vda3ldc3lNc3nN81w4oqSqoai87k5pdV5RZU5heUZecWp24Y20vKSUrLjraVGJKZGx10Ov7lsUItQRDfdEcITy44K429xY5/Y4fjDE93Hcy3DDfRB3oPwIEPdI8L32OAEOYqFxSAwehS1gcMUMvpQtknPFqr1VMeUakUwjlKlFco0I/pVrxJCqcmw0scjpmY59439dLMUskOyfX4knhnZaWc3eFwdnQWILpWyhlMWXsLCJkCRMnoTJEzO4YgZXTOeK6Twxgyehc8V0rpjGFVE5QgqbT2HxyExsClPYT+A0LTWlF0eBDb1ObDWcwQ7Hapld/S1dfc2dcNmanobW7oZWbJGz2qaO2qaO6sb26sb2qvq2qvrWyjpsrcvy2ubyGvtiY1WNJVUNxZUNRZXYMmN3K+ruVtQWltcWltUUltXcKau+U1ZdUOpibEFLuDJycWVecWVecWVuUcU+5xVV5GEblfnFVQUl2MfvlNXcLa+7W1FXXFlfUgWB0lRW01RW21xe21Je11Je1+JxcbWnsK9V2Vxc41gw+kj2toobPL3ldXfKahznEDtpdzEftJDbs1meLa84LbcoJevOzfS85NScxFuZsckYvsOirwVFxl8MjzkX7Lw82x7BEcSfLcpdIO7CcdfGuJfH8Q8VVHHjuIdWeVj0+bDoPYhj8+i7ERznBnEcmYGnMAlUFoHGJtF5FJaQxhHReRKWQMYRKXkSuFy9giNWcIRytkDKFko5Asxw/AOcotq+voHYvmDxPjv3rTk6+vZmnXZenYAC5xdl8hzrW+4tQeA6QSMBu1Yx8WQGnsIYsB9jP4nRT2LAtWl6CZQePLkbT+4aGOzsh2vEEFq7cXB1mMaOvsa2nobW7rrWrtrmrprmTrgMWFVDq30ZsKaymqYybIn6huIKbIn6wrKaO6U1BSXVBcXVGGfhAsGF5Tl3yrPvlGUVlGYWlGQWlGTml2TkF6fnwYXk76bmQBfezsFWjk/JKoC+lVlwK7PgVkY+9N7K8el5duc6fB3byLuRnncT/s3Iv5VRkJJVkJJ9JzXnblpuUXpecUZ+SWZBaVZBWfad8pxC+1LFRRW5RZXOPnBp42NzIbTbQsl++g62pHLWnbKsgr0llTPyS+AZ9rik8vXntKTytdvZSbeyEm5mxF1Pi7mWGpWYcjnuRkRMcsjVxMDIuIvhMedCrp4NuvzmxYjXz2Nr3vtHcATx44C4SydnsNvcWP5McHiUoAqczNYzx0OdIU5huTe94bpcrnvoOBITLuJFoHGIdC6ZyadyRHSehMGTMvgytlDOFipYAhmTL6VzRHS2kMYRUGHbFq4iz8SWD7avNMYZpLL3Gd4T2IfKOC0bRmHiyAzc3rJhdJw9ggFXoewnYF152EpgOApcergLR+rCuSzf1d5LaO8ltPXg2nrw9oUicc1dA81dA02dfY0dvQ1t3fWt3bXNXbXNXTVNnTVN7VUNreV1zaU1zaU1TSXVjSWVDXfLHavx1uSXVuVj7bjy7MKy7DulmQWlGfklGfnFGXnFaTl3U7MLb2cVptixi9E2Le96Wu711Jzk2znXbmdfS8lOSslKvJWZeDMz4WZGws2M+JsZ8TfS426kxV5Pi72eFpucGpucGpOcGn3tNuaklOiklCi7rybesvvmnhM8+tbVxFtRiSnR127HJqfGXU+Pv5GRcDMj8VZW0u3sa6k5yWm519PzbjhdG25mFNx0eXkMvuGnHWw9gtOgc6+n5San5San5ly7nZN0OzsxJSvhViY8yXHX02OT02KupUYn3Y5KTLmacOtqws0rCTevxN+8HH/zcvwN77555fh8Oe5GZOz1iJjksOhroVcTgy/HB0bEXgyPOR8a9XbwlbcCYes77LVzoa+eDX7lEARHHD8uiLvMjfWqc2Pc76CKx4mx/If4PprvQdxDG5y0H+LYcAgy045U1iDs3uSIaBwJnSth8GVMgZzJl9K4EipbSGbySXQOkc4ZpLLxFCaexMCRGTi4NiOR1k+kelyM0ccqi13Y0sBO7hvsgO4ltPcQ2nqw3qq2bkeHFVy31748fEdvY3tvfVtPfVtPXWtXbUtXTXNnjT08Wt3QXlnfZo8VwLv4xuKqhruV9Xcr6wrLau6U1OQXV+fercgprMi6U5qRX5KeX5yWV5SWW5SaU3g7qzAl684t2BBOy0tOy7mWmp10OyvxVmbCzcyEmxnxN9Ljr6fFJafFJqfFXkuNTrodnZgSlQCRcetKws3L8Tcux92IjLseEXs9IiY5IiY5LOZaWHRSWHRSWFRiWFRiaFRiyNUEzFcSQuwLNQVfSXBMEu881/Dewk6RcYGRcdha2hGxgRFxgZFxQZFxcImQ0KsJYVFJYTHXImKvR8bfuJJw62pCSlTi7eik1JhrqTHJabHJafDvsTvGT1/DHH0t9dBOgr4dnXQ7Kul2VNLtq4kpVxJuXUm4dTn+ZmT8jYjY6+ExyWHRSfD0YiczMj4wMi4wIu5SROyl8NiL4THeHXsxPPbScfhieMzFsOgLodHnQ6Ngo/ts4OU3L2Hsfv1c6Ktvh7x6NviVs8E/eSvIiSn+EBxB/Bg5foigypEf4/QRVHE2BnG8WyDFeYVcHJnhMpoVBlUoTDyFPUjjkph8CltEYYtpXAmdJ6XzpHSuhMoWkph8Ip1DoLAGYDSZSO0jUHrwlG4cGQ4Y6NwbJ0Bw7vRr78FWUt9nSGS7+5s7+5rsxhZHb+9paO9paO9uaOuub+2qb+2qbemsbYFrn3dWN3ZUNbRXN3ZUQlLXt5bXtZbVtsDIaTEWJ224W1F/t6K+sKz2Tml1QUl1fnFlXlFlTmFFdmF5ZkFJRn5Jau7d1NzC29mFtzLv3EjPv56el5yam3Q7JyklO+FmZvzNzLjr6XHX02KTU2EbGWvTxd24HHc9MvZ6RGxyBORyVGLo1UTI4uAr8UGX44IwzsZdioiD/88XwmLOh8Wch//SoVF7X+fePAxX7Pdo0JHQ9hl57L4U4cnYLwyuBwjXiLoYHnvJTvaQqMTQ6KSw6Gth0dfCYq6FxySHxyZHxF4/VieHH8rwqnYEw6OITgqLTgrFYJ0YbOc1PO0XwmPOh0afC4l6O/jq2aArbwVefjMw8s1LkW9einjzYsQbF8N9OuLNYzLM8KcXwl8/F/r6udDX3MHt5L9+wx92I44fK8ff2h9UeWXfqhEX9k9weMCIQ99BFbfBKgdDHC6OjiMxNrZ3H7/7xLvff/ze++88+fDd9z989/2P3vvg4/c++PjJh588+fCT9z74+N33P3rnyQeP33v/8bvvP3rnycN33nv4+N0Hj9598OidB4/fefDonfuPHkPvPrT7AeZ7Dx7t9/1H9+4/2nHxQ8y7D7d3H27vPsB878HWvftbO/e37jkeTdrd3Nnd3N7d2N7d2LoH/65v3Vvb3HF4dWN7dX1rdX1rZX1rZX1reW1zeW1zaXVjaXVjcXV9cWV9YXnNBr24Or+wMrewbLUtW21Ls/NLs/OLM3MLFuuCxWqbttqmZ21Ts/NTM3PmmTmzxWqGyzpPW03Ts6apWdMUHORumTBbxs2W8UnL+KRlbHJ6zITZaJo2Tkw52WycMI9OmA3j0JPOdozLHBkzebXRp8dMMAfD+OTouHl0wmycmDKapsZM02OTlnGzZdxsmTBbJswzE1MzcJy+6Rl44nCeOaLNLoZHN449ZICd+dG9s20/sfZzBUe4evdBp9pv60cn3A1XhkI+ER51eAJ67weA/d9NGsbgP6njP9c8us8T5tGJKX8M/yV9eD/EcSQM4hvbuzgC6X//5HWvfuX1v3rlp3/92pt/8/rZn/z07VfeOPfqm+dfffP8a29deO3N86+88fZPXj/7N6+9+devvvFXr/z0r17xng8yMjIy8lHtDHEseDJAouNI9MfvPvnfP3kdICEhISGdZEGI48hMe+CbMUCiDyCIIyEhIb0QQhBHQkJCeoHlDPEBbNg1fYBEf4QgjoSEhHTytQ/iA64Q33WTP3keKvFJ02EP9kUvFwkJ6cXWqdNnfg0hDgnugPg7WEvcGSv+IMaR5kXk0WEP9kUvFwkJ6YUXBnFsWmo6Ng/fIO3pIf7s9OxarCcBpgjiSEhIh9Cp02d+/bkLxPsH/YK4t9t/bwzymN55j7e33HPzH+Ie83TP30cpBxbhT9E/ZrlISEh/XoIQd3Rp9hNpHiG+jzh+EspRirf0zi+dP+Uj/WHlMU//P/X05fqfmzesIyEhIXmVA+IOfNsh/p6PlviumxwZesTQgRDfx1kf+R9BHjM57CEcrVBv2z4O7VhKR0JC+nPRqdNnfv35b/qJLhDvG6Q+9APiHjM8GsT9yWTfu/6T7lDpj4uhPg75x6kAEhLSn4XcIQ5X1PUf4oeF8lOmB0eFsj8fOcZygWuj+2nKRUJCQvKqPYgP0uzro1P7CBjEd93k+KD/O48x/WHlsbgD03sr+mj18fMjx3K8SEhIf3ZygTgBQpzSR6A8fPweemLTWUfDK4IyEhLSsxUGcadAClzbDEH8aYSa1UhISD+SIMT77BB3rJGGII6EhIT0AsgB8X1rXT58/C6COBISEtJJlwPiLqsV48kI4khISEgvgCDEe50CKT04cg+e/ABBHAkJCenkyxniPXhyL57SgyP34BDEkZCQkF4E2SFO6cXvQbzbDnHf46a96eQMzDjsOHHf+Rx5iOGhztuh8jk5pxoJCen5CIP4INUxNKUHT+nBUx489vXEpg850pwEuDgzzn/eeUzzlBcAP5MdyPFjrBgSEtLLIKxjk0jtt48Q7yWQnUenHBniz06HwrG7/PmI//v9rIP/aQ5bAQRxJKQ/azkg7sB3L8GlY9MbX7xh0Tdr9r3rvMfbW+65HQvEfdfH21v+19N3Pvvecq/YYfM58FQgISG9nHLq2IQcp+7r2PQIC9/bPggIvEAKeAf600DKOUP3snzXx2NWfuZz2PofNp/jOj9ISEgvvPZD3G10ikde7LrJkaFHphwITY9w9Jj/oeStboetv7dD8HZc/hyv+4G71+cI+SMhIf15yf6wD0Zw5FR+twAAGEZJREFU7C9+77H7A+G1Tx7fOhBq/mSy711/yOWtrMPWHxwfxA8sFEEcCQnpEHJ52Ae/N9DQf4gfFspPmR4cN8T9SePtI8cF2cPmc9j8kZCQXlo5WuJwaEqffZQhhPiumxwf9H/nMaY/rDwW53/R3vb4k4/zzgOPwlvmPvI5VP5ISEgvrTCIE/bCKXCcOJrFEAkJCekFkOOJzT4CpQ+PRVR68WgWQyQkJKQXQa6jU6i9BCpsj6OWOBISEtILIPtj95S+QUrfIKWXQO7Fk9F84khISEgvhhwx8T4CtRe/F1RBLXEkJCSkF0COCbBcIioEKoI4EhIS0gugvVkMB6m9BErfILVvkNJHoDx8B0EcCQkJ6cTLeZx4H4HSj6H84HHiPvT047v9yfzHHBl9tPNw7EX/aIUiISG9MHKOifcRKPYNqu8nNn3omT6BctjKPItyf0w9r+NFQkJ6YQQh3j9I6ydQ+wnU/kFaH4HaT6A+emqIPwv5rsyza7GeBICehDogISGdODlWu+8fpPYRqP2DtH4CrX+Q9uidJyd2PnFvBfkPcY9luZfrrW5PI3/Op8fijrEOSEhIL4+wljiR1j/oZCJ9H8T3kcVPEjlK8Zbe+aU3aD4joh0K0L7xerRy/SwaHObihISE9GcnCPEBIn2ASOsfpA0QaQNE2sBBLfFdNzkyPJC5HtPv46mP/L0VcQT5yNwHsp+ydG+n4lmXi4SE9HLq1Okzv/78iwESfYBI7yfS+0n0fhJ9gER/9O7BEPeY4dEg7k8mfr7lP+kOm/7AChz240eo7ZHLRUJCejl16vSZX//mCxyJgSPRcUSa4+9jvyF+WCg/TXrfBDwUlD0ey4GJn75c5/RPWS4SEhKSHeJkJo5Mx5HoAyQ6jkR3QHzXTY4P+r/zGaV/Gqh5zNafj/iu6tPU4QjlIiEhIYFTp898/psv8BQGnszAkel4MgNHouNIDEdLHMm3joZXBGUkJKTjkR3iLDyFiScz8WQGjsRAEH9GQs1qJCSkYxaE+CCNNUhhEihMPJkB/fi99xHEkZCQkE66MIhTWYNUFgGawiRQWAjiSEhISC+ATp0+8/lvfkuic4h0DpHKHqSyB6ksApX5DoI4EhIS0snXqdNnfvPFb0kMLonOIdLZJDqHSGMTqex33vsAQRwJCQnppAtCnMzgkRlcEp3j8LtPEMSRkJCQTrwgxCksPoXJozB4ZAaPxOCQ6Nx3n3z4Es8nfoRx4r4r80w/6CPl8Q5dR0JCevEEIU5j82lsPoXFozC4ZAaXzMAgDp5iKtpnAZHDVsZ3Ps719Ccrj2me8gLgZ7IDOX6MFUNCQnqRZIe4gMYWUJg8KpNPYXIpTN577z8txJ+FfFfmUDh2l/9F+7Pfzzr4n+awFUAQR0L6s9Cp02e++O1/MngiOldIZwtobAGVxaOy+AdC3Bv+fDNl37vOe7y95Y1E3or2h1yeGO7ruLwldq6Gn/X3nc++t9wrdth8DjwVSEhIL7YgxJl8MZMnYnCFdI6AxhHQOIInH3z0Es8n7lyQex1819NjVn7mc+BxeavnU24jISG9tIIQZ/ElLL6YyRMxeSIGR8TgCJ988PFLPJ+4tzof9ri8HZq34/XnPLifEPf6HCF/JCSkl1OnTp/57X/+jiOScYRSFl/C4kuYPDGLJ37y4Ucv8Xzi3upwhHIPPD9PA9mnAbefpwIJCenFFoQ4VyzniqQcoZQjkLD4EhZf9P6HB7fE9+30+NJ959Ok9w2pXbsOPGpvdfCnnj7qf2A+h4XsYfM5bP5ISEgvvCDE+RIFTyznieRckYwjlLAFkg8+/OTPcz5xf6rkbY8/+TjvPPAQvGXuI59D5Y+EhPTCC0JcIFMKpEq+RMGXKLgiGVck+/DjT9ATm0hISEgnXadOn/nP3/1OJFeLZCqBVCmQKGGr/MOPf4YgjoSEhHTSder0mf/83e8lCq1YoRHJ1CKZWiBVCqTKDz9BEEdCQkI68YIQl6p0EoVGotCI5WqhTCWUKj/65FMEcSQkJKSTrlOnz/zud7+Xa4ZlKp1UqZUotWKFRiRXf/yznyOIIyEhIZ10nTp95ne//1KuHZZrhmVqnVSlkyi1EqUWQRwJCQnpBRCEuFI3otTqFZphuXpIph6SqXSffIogjoSEhHTider0md9/+aVmeFQ9ZFDpRpQ6vVKrl2uGfvbzv3VA3Ntw46ccrO1bTz8YHBzfuPLj0vOtj//f4xHqeXJO8gun53Ke0ff18ujU6TO///Ir7ciYVm/UDBs0wwaVbkSp1X/6879znwDL+YOOPR7fespaOef5NL+zfTX88aF5cupz2O/xCF/BYb+pk4aP51Kfo/3Ujwu+h8rnpH1fSJggxIcM40MjY1q9EaJcPWT4+d/+wvHEJkzp45/cWcfy8/L9y/YIIz9z+9Hko9Afvz7ezqef4H4WEH8uX4oPnYQfyUmG+En7vpD2dOr0mS+/+npkbFJvnBgeHR8yjA8ZxnQjxp//3d8fAeK7bvL4lvtObxl63O+ej28dWFV/6uPtrQMP1lv9fVTSvSDfRXg7Lh8V9lgTP5N504GV8V1JH8fl7Vj8PA/uNdz31o9QH4/ykcx3Poc9Xm9lHSqfYzk/SMcvCPFR09TohNkwNmkYm9QbTcOjE3/3i3/wAXFv3yjw47fi7Xfmf26Hle9M/KmP7/PgOx8/63OoInyUe2CJftZ511W+8/dWk8OeH3/SO1fpUCftUMmOtz7edOQ0Rzgof/Lxs4gDywVezg/SM9Gp02e++vrrcfPMmGnaaJoyTkyNjpsN4+Zf/P0/+jMBlnuGPr5sH/nsuv0P+CjisPKnSr7r4+3HeoTz47s+fm77cz7dD8Q9vY86+6i/N7l/xM+yfFd+31vu58FbTXzkc2D1/Ky/ezUOdd58JPZWfx+V8Z2/P/n4KNfHx32kdz8/SMevU6fPfP31N5PTVtPU7IR5ZtxsGZucNpqm/v4f/ukYY+IH/lj93w9cfx/+yNsv1eO7B9bfx2cPVf8jFHHk/wo/6+/noflTyqHK8r3zCOn9zOfA4z1s/f1811syj9+vPwfuz3k4bD7P4vtCeiY6dfrM1998MzUzb7bMmaZnTdOzE1MzE2bLP/zjPz8lxP38bznwx+GeYNcuP4/RWw7+18e50MMel+/SvRXhu6q+z4+3nA9VTx/Zejv/RzvPhz2f/uTvZz6HOrdPUx/nPf6cIt/5HOGgnjIff+rmz/lBeiY6dfrM1998O221Tc3Omy1zk9PWyelZ0/TMP/yTL4jvOsk9Tx8/Vo/ftO/ET/lrOLAI4PYD9V2in4cADnMe/Mzfz3J95+n7VPiTuf/HddhyfefjsT7e3vJn/49ZH2/5H1gE8HQa3T/iz0EdKh/g/af4NOcH6fh16vSZb775dmZ+cWZ+wWJdmJ61Tc3OT83M/eM//xI9semQ+6/8RyjoRyjuz1DofCK9bDp1+sw33347t7g8t7A8O784O79omVuwWG3/9Mv/F0HcWc+0cXFgMwpx51iEzifSS6hTp898++13tqXV+cWV+cWVuYVlq21pdn7xn3/5LwjiSEhISCddp06f+fa77xZXNxZX1heW12zLq/OLK3OLy7/8l39FEEdCQkI66Tp1+sx3332/srG1sra5vLa5tLaxuLK+uLz2L//6bwjiSEhISCddEOJrm9urG1sr6xDlG0urG//yb79CEEdCQkI66Tp1+sx333+/sX1vfWtnbXNnbXN7dWN7dWPr3371GYI4EhIS0knXqdNnvv/+D9v3Hmzdu7+5s7uxfW9j+97G1r1fffbvaD7xY9cRhio+68qfnJODhIR0FJ06feb7P/xh5/7D7d0H2/fub927v7Vzf3Nn91f//h8vwXziR8vq2eHsyMf1jCB7jOcZCQnp+ejU6TN/+MMPuw/f2X34+N6DR/cePNq5/3Bn9+G//8evX475xA/LqWfKMgRxJCSkYxaE+INH795/9M79h48dKD8axHfd5PEt953eMvS4/1ggfmAlfX/Qd/19nwSPx+UxvbeTcIR8PB6at/ojISG9MDp1+swffvjh4TvvPXj87oPH7z6wo/w/fv35yzGfuMeq+lOfp6m/P2V5O7QDK/CU+XvM+enPMxIS0vPRqdNnfvjhh8fvPnn0zpNH77z36J33Hj5+98Hjd3/9+ecvx3ziPsDq/3H5gKPH+ntL708+B1bgwDx9HNe+t/ZtuJeLhIR00nXq9JkffvjjO08+eOe99x+/9/7jdzGU//rz37wc84l7PITD1uew58Fb+sNueyvlUJ/1oaf5LBIS0onQqdNnfvjjH9/74KP33v/w3fc/fPfJB++89/47773/+W++eDnmE/eYlT/1eUb133WSn8fru1A/6+lRh02PhIR04gQh/uSDj5988NF773/43vsfvvvkg3effPCbL377Eswnvu/jfh6C7yoBN9B7S+y+7W2Pt/yB91PhT3rfJ+do6ZGQkE6WTp0+88c//tcHH33y/ocfv//hx08++AjSHEL8edcOCQkJCcmnMIh//LM9jn/40ZMPPvritwjiSEhISCdeEOIfffLphx//7IOPPnGg/Ivf/ieCOBISEtJJlwPiH338M2eOI4gjIf3/7d3bctvGHcdx3XE4fIpaPBMHkjjyLDmHTvssmU6bTptOpn2VxrZsOU76Cm0UO3mD6GD3su179AIQRBLYxQKiSKz1/VzRwHL3v0voZw61AgENRPdOuXj388Xbny/e/vTDjz/96+LdP394G/3F5qGrAwBI1eqN//z3f1/+5W9/+PNff/+nr3/3x6+/+PKrL7786ocf3xHiAFB1tXrj5sO/Z09/Oz39TbD8tb/4zJ1/4sw+PX/zD0IcAKquVm9cv//gLz/35p+Op09H4antr0xvcXb+3WHvJ16IaDP146xH/fUqUWd1Flk7B1lnXq+PXxTi3vJzZ/7JKDwdhieWvzTduxAXXQTJkcxT+yp/Y8T1kvY/ekXqKfp6rf+zUL4UKkm98R4cpJ4S61yo5Q77qdrrhRy1euP65oO7+Gw8fToMT+xgZboLw52fnb854P3E17sqdPEd5P8P0aD7r0f0eikG90OE+EFeFIkqXCRVDvGqvV7IF4W4M/90ND21g5XlLw13PhjPXpQK8YuUzFPpg5kdptvL5ZakMq7oVO6kRPVLikwPJB9CNC9JwZmVKDYTyS1GXqRkXqK5KK5DusKtU3uoJ5OkmbyfovMVjVWon52sD/anVm9c3XwYzT4ZTU6tYGV6i4Ez74+nL17JQlz0Sh8pXEOi6y+zt0LkT1cZVz5feT+K9RQaQjJu7oiKNV9skvcvqqTo+qi0Xy+p0KIVarbbekRKtykxKZV+FIfIHfdIsD7YqzjEp0/t8MT0l4Y774+n/dH0+VqIr0ueKHrBJBeBpJ+L1M9GCSpDy8cVXawl1kFej+JjlXVLTyTdXlKzpH6R9FMUx5IXv3UqvQ6iSiT95JanWH+6jELrJmksql9SjLx/lX4k40qeLmmfXh/sT63euLp5b09O7eDE8BZRiHeHk+cvvz3s/cSPNq8PFaIrNfNsbp25PxjlTqkMUfqnQrF+xampjFJoLPnBEu0V+8mdb9H6Fc+KmmW+vioTV1mHov08xOuFvarVG1fX7+3w1ApWhrvoO/PeaDchrvhTlHt9qF8i6cal698aWqUf+eiiIeSlSsbNVKLOEutfbp2LrqdK/4r9FFrb+9SzfkRlieT9lJjUPftRqU1lfbBXUYhbwYnpLfvOvD+edUeTjh08k4b4xZp0n5KLOPMK2Ml1IOpq/eDWA/m46qWqz1ex/9JLtN5MvhQqnavPq+i48n4y6xGdUjm+z3pE/ecOcZS1jOmnqEyqUD9H4kvxPuuD/YlC3PRXhrfoO/PeeNodTtp28Ozl60f4F5vpq3wPA+1huEeI9cRjUas3Lq/fG/5y4C5642lvNO0Ow44dPs4QP3rgNxe5b6PInZ1gPfGIJCFuRJ+GjyYdO+xYj/SdOABoJg5xbzFwZt3RpDOcdKygbfnPzghxAKi8KMQHXvIrzbBt+S2TEAcAHdTqjcvrm7676I+jT8ODlum3DI8QBwAN1OqNy6ubvjPvjWeEOABoJgrxnjPvjqadYdC2gpbhNQ3vm7Nz7id+z3rSj3OfsoddMRVZIgC7EYf4eNYdTdp22Lb8prkR4vJdcUeCLc/7Kj+jnqMiuVmdYko0LlfPw40C4ABq9cYvVzc9Z9odTtpW0LKCpukdD9woxCVhJAqCHQZEofeMRXPzQYOMEAewJ+kQPzbc44FTLsQvUjJPpQ9mdriTEM8tRv5EeZ3yyaYfi+rJfGK5fkRTk4wCQGNRiHfH0+4wbFtB0/SPDe/YyAlxSUxkBkRuGB0VjOy0zJJUxr1PnSpjFUpSSZFF+xe5zyIDqJw4xEeTzjBs21GIu8fGxscp6XA8KpVNkn7SmViUJFjV65eEY2adovYq/eQWkNunZF6iITIHBaCxKMQ7o0lnGLYsv2l4x4b7ZNefiUuyI/eUYuhkllp03KLzlYes+mPRKIWem4sEBz5CSYi37aBl+S3TOx7sJsQVAyg3ZxVzJ3MIlXHvU2due0knuR0q1lZuiQB8JKIQbw8nbTtomV7LjN+J//2F6mfi6T4zT0lC7f7hstWJYqnyOo9SQS9qnH4sOiLqf2uIzOPq8xIp1BiAHuJ34tHWFNNrmt6x4f6q70QhfujqAABScYjb0dYUr2l6TwbOk4HzDSEOANVXqzd+ubq+DXH/2HAJcQDQRhTibTts20HL9I8N3okDgD7WQ7xpeHchfkaIA0Dl3e5OiTeJNw3vycAlxAFAD3GI22Erun9hvE+cEAcAHWSEuOEmdzHMfXqhLdgHUWI/dbnOKzJfAI9Lrd745fK6bYet2y2G6/dOUelBFF6VCjXR/zQP0S0A7M/dLzatoGX6jyfEJeWpv62u1BwBPEbCEH+h9M0+6VOFPl5YbybpRzTu1sH048wG6SJFQ8iLF40FAPsTh/gwCfH4733S78RFQanyWGIrxNOBvpNxRUmdW55K8eqhDwA7dnfvlOh77k1/a3dKZk7tPMS3svsiZat9ZieKDQqVp44cB3AAm3cx9JvGxhbD+wR3oRBXOShpsNsQT//PoYIQB3AAG+/ELb+pdj/xfYb4TsaVhLjoVNHiCXEAB7B+K9pm1u6U9URLZ5b68UwXaxRP5R4X1ZN+lnpYl5sCADy43BAHAFTX/feJAwAOZmuLYXQ3WkIcAPSQ3MWQEAcA/dyF+O0+8SYhDgC62AhxKw7xpuER4gCggWR3SscOW5Yf35DW8J6dvSbEAaDq4hAfTaLvSo6/854QBwAt3IX4MGzbhDgAaCUrxP2m6RPiAKCBKMS7o2kS4tEeFUIcADSQhHh3OGnbQbJHJQrx9I1H1m9OwnFdjgP4aMUhPp52o99tbob4oasDAEhthPgwjL72nhAHAD1shXjHDltW0LIIcQDQQRTivfEsDvHoJiqEOABoIQnx3mjaGU7uQvwlIQ4Albce4t27EA+evfyWEAeAqssIcTto24Q4AOigVm9cXt30nFlvPO0OJ91hvNGQEAcADUQh3nfmvfG0O5oku8UJcQDQACEOABpLQrw/niUh3rFDQhwANBCF+MCd951ZbzRNdos/J8QBoPruQnxMiAOAbngnDgAauw3xxcCZ98bTZLf481eEOABUXq3euLy+GXgbId4dTghxANDAeoj3x7N4oyEhDgBaqNUbl9fvkxCPNxoOJ89fvSHEAaDq7kLcnfedWbRHpTeaEuIAoIEoxA1vaWSFeOZ3NvK1jQBQFXGI+0vDXRDiAKCZ7RB3ZtEelReEOABU33qID5z5IArxMSEOADq4C3FvMXDnA2feH0/74+mLc36xCQCVF4W46a9MQhwAtJMV4jNCHAD0sBbiS8OdJ7vFCXEA0EAc4sHK9JeGu4h3izuEOADoIB3iA2c2IMQBQAsbIe4tDHdBiAOANqIQt5IQ9+Ld4oQ4AGjgNsRPLH9lroX4GSEOANW3GeLL2xCfE+IAoIGMEHfnA3d+dv4dIQ4AVVerN66u31vhiRWsTG+Z7BYnxAFAA1GI21GI+8tooyEhDgB6IMQBQGNJiNtrIW64C0IcADRwG+KndnBiRSHuLQyPEAcAHRDiAKAxQhwANEaIA4DG4hCfRCG+Sv74/uw1IQ4AlReF+JAQBwAd3YV4SIgDgG6SEB+GJ1YQhfjS9JaEOABoYD3EbUIcAPSyHeIBIQ4A+tgM8ds/vveWZ6+/J8QBoOpSIX5iEeIAoIvsEPcJcQDQQVaIryx/RYgDgAYIcQDQ1/8BY5A4uYFuwHMAAAAASUVORK5CYII=" alt="" />

这里我们可以看出,执行顺序为 CalculaterInterceptor  --> CalculaterInterceptor2 --> Target Method --> CalculaterInterceptor2 --> CalculaterInterceptor 。拦截器中 invocation.Proceed() 方法用于调用下一个拦截器(若存在),直到最终的目标方法(Target Method)。不过 invocation.Proceed() 并不是一定要调用的,例如,对于有返回值的目标方法,我们在拦截器中设置 invocation.ReturnValue 值就可正确执行,这样便不会执行目标方法。在有些场景中,如身份验证、缓存读取等还是特别有用的。

当然,在 Main() 方法中 Ioc 注册 Caliculater 类型时我们注册了两个拦截器,".InterceptedBy(typeof(CalculaterInterceptor), typeof(CalculaterInterceptor2))"。我们也可以直接在 Calculater 类型 或 ICalculater 接口上以特性的形式注册,如上面代码中注释掉的那部分。若是既有在类型上注册,也有在 Autofac 的 Builder 中注册,那么这个拦截器会重复执行。

基于类的拦截器:

我们定义两个类 Flight 和其 子类 FlightOfSH:

 public class Flight
{
public virtual void Fly(DateTime time)
{
Console.WriteLine($"Flight: {time}");
}
} public class FlightOfSH : Flight
{
public override void Fly(DateTime time)
{
Console.WriteLine($"FlightOfSH: Fly={time}");
} public void Arrive(DateTime time)
{
Console.WriteLine($"FlightOfSH: Arrive={time}");
}
}

这两个类的拦截器:

internal class FlightInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("Before Fly"); invocation.Proceed(); Console.WriteLine("After Fly");
}
}
在 Main 函数中定义代码:
var builder = new ContainerBuilder();

            builder.RegisterType<Flight>()
.EnableClassInterceptors().InterceptedBy(typeof(FlightInterceptor));
builder.RegisterType<FlightOfSH>()
.EnableClassInterceptors().InterceptedBy(typeof(FlightInterceptor)); builder.RegisterType<FlightInterceptor>(); var ioc = builder.Build(); var flight = ioc.Resolve<Flight>();
flight.Fly(DateTime.Now); var flightOfSH = ioc.Resolve<FlightOfSH>();
flightOfSH.Fly(DateTime.Now);
flightOfSH.Arrive(DateTime.Now);
我们看看输出结果:
aaarticlea/png;base64,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" alt="" />
 
 
从输出结果中可以发现一个有趣的现在, 子类 FlightOfSH 重写了 Flight 的 Fly 方法,却也调用才拦截器。Arrive() 方法因为是非虚方法,所有拦截器不会在该方法中调用。
当然,我们这里都是直接在 Autofac 的 Ioc 注册类型时设定的,也可以同上面一样使用 InterceptAttribute 特性来注入。
对于基于 WCF 的拦截器,大家可以自己试验下。
 

总结

这里简单的介绍了 Autofac 与 Castle 动态代理功能结合来实现 AOP 功能,当然,Castle 本身也是个很强大的开源框架,也有很强大的 IoC 功能,不过我还是比较喜欢 Autofac 的 IoC 功能。
本文就写到此,谢谢大家。
 
参考文章:

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能的更多相关文章

  1. 业务接口+UI层的设计(基于Castle实现的Repository)

    业务接口+UI层的设计(基于Castle实现的Repository) Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   ...

  2. 【Yom框架】漫谈个人框架的设计之三:业务接口+UI层的设计(基于Castle实现的Repository)

    Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   一.概要设计 上面Reposity 应该为 Repository 特 ...

  3. 新的IRepository接口+搜索和排序解耦(+基于Castle实现)

    新的IRepository接口+搜索和排序解耦(+基于Castle实现) 经过了上篇IRepository和IRepository<T>的讨论[文章地址为:http://www.cnblo ...

  4. 基于STC12C5A的MINI3216多功能点阵时钟

    代码地址如下:http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max72 ...

  5. php基于SQLite实现的分页功能示例

    php基于SQLite实现的分页功能. 这里操作数据库文件使用的是前面文章<PHP基于PDO实现的SQLite操作类>中的SQLite数据库操作类. 代码: <?php class ...

  6. 基于90nm CMOS技术的功能齐全的64Mb DDR3 STT-MRAM

    自旋转矩磁阻随机存取存储器(ST-MRAM)有望成为一种快速,高密度的非易失性存储器,可以增强各种应用程序的性能,特别是在用作数据存储中的非易失性缓冲器时设备和系统.为此,everspin开发了基于9 ...

  7. HMS Core积极探索基于硬件耳返的功能,帮助唱吧整体唱歌延迟率降低60%

    唱吧的使命是让唱歌更简单.让生活更美好,其布局的K歌业务专注于让曲库更全.音质更好,开创了同框合唱.弹唱等有意思的游戏类K歌玩法.为了让用户拥有更加沉浸的娱乐体验,唱吧与HMS Core积极探索基于硬 ...

  8. mysql基于init-connect+binlog完成审计功能

    目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用 ...

  9. 基于 jQuery Jcrop 插件的功能模块:头像剪裁

    /** Jcrop version: 0.9.12 jQuery version: 1.9.0 Author: 小dee Date: 2014.10.30 */ 先看看他山之石:博客园的头像模块也是使 ...

随机推荐

  1. 读者汇app项目案例源码

    这款app是我花一周左右时间做出来的,一款阅读笑话,段子,糗事,脑筋急转弯,神回复,语录,谜语等的休闲娱乐app,用户除了可以浏览他人发布的内容外,自己也可以发布相关内容,和其他人一同分享有趣的内容, ...

  2. centos 安装mysqldb 记录

    vim setup_pofix.py #修改mysql_config路径 <pre> ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /us ...

  3. Builder 生成器模式

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 当同时满足以下情况的时候可以使用Builder模式: 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式. 当 ...

  4. Java中的I/O流

    import java.io.*//生成代表输入流的对象fis=new FileInputStream("e:/src/from.txt") //生成代表输出流的对象 fos=ne ...

  5. 【原创教程】JavaScript详解之语法和对象

    JavaScript的好的想法:函数.弱类型.动态对象和一个富有表现力的对象字面量表示法. JavaScript的坏的想法:基于全局变量的编程模型.   好了,不管他是好的还是坏的,都是我的最爱,下面 ...

  6. C#中的委托范例学习

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  7. SQL使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面 ...

  8. iOS 地图坐标系之间的转换WGS-84世界标准坐标、GCJ-02中国国测局(火星坐标,高德地图)、BD-09百度坐标系转换

    开发过程中遇到地图定位不准确,存在偏差.首先确认你获取到的坐标所在坐标系跟地图数据是不是相匹配的. 常用的地图SDK:高德地图使用的是GCJ-02(也就是火星坐标系),百度使用的是BD-09百度坐标系 ...

  9. IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法

    转载自:http://blog.csdn.net/swingpyzf/article/details/16972351 纠偏也可参考:http://www.2cto.com/kf/201310/253 ...

  10. C#程序中获取电脑硬件配置信息的一种方法

    本文介绍获取cpu信息和内存信息的方法,根据本文所举例的代码可以举一反三获取更多信息. 获取cpu名称的方法: public string GetCpuInfo() { ManagementObjec ...