From 723b6f0149f8c15c4fb6a73f419273b925f312e6 Mon Sep 17 00:00:00 2001 From: Kevin Carroll Date: Fri, 27 May 2022 19:29:03 -0700 Subject: [PATCH 1/6] doc changes for new directives --- docs/advanced/directives.md | 371 ++++++++++++++++++++++++++++++++---- docs/advanced/middleware.md | 54 ++++-- website/pages/en/index.js | 2 +- 3 files changed, 370 insertions(+), 57 deletions(-) diff --git a/docs/advanced/directives.md b/docs/advanced/directives.md index 98c28fb..792cf73 100644 --- a/docs/advanced/directives.md +++ b/docs/advanced/directives.md @@ -4,75 +4,131 @@ title: Directives sidebar_label: Directives --- -Directives are implemented in much the same way as `GraphController` but where you'd indicate a a graph controller method as being for a query or mutation, directives must indicate where they can be declared and when they should execute. +> Directives were completely reimagined in June 2022, this document represents the new approach to directives. + +Directives are implemented in much the same way as a `GraphController` but where you'd indicate an action method as being for a query or mutation, directive action methods must indicate the location(s) they can be applied in either a query document or the type system. + +```csharp + // an example implementation of the @skip directive + public sealed class SkipDirective : GraphDirective + { + [DirectiveLocations(DirectiveLocation.FIELD | DirectiveLocation.FRAGMENT_SPREAD | DirectiveLocation.INLINE_FRAGMENT)] + public IGraphActionResult Execute([FromGraphQL("if")] bool ifArgument) + { + return ifArgument ? this.Cancel() : this.Ok(); + } + } +``` ## Anatomy of a Directive All directives must: - Inherit from `GraphQL.AspNet.Directives.GraphDirective` -- Provide at least one appropriate life cycle action method definition +- Provide at least one action method that indicates at least 1 valid `DirectiveLocation`. All directive action methods must: - Share the same method signature -- Return `IGraphActionResult` +- Return `IGraphActionResult` or `Task` -This is the code for the built in `@include` directive: + +### Helpful Properties + +The following properties are available to all directive action methods: + +* `this.DirectiveTarget` - The targeted schema item or resolved field value depending the directive type. +* `this.Request` - The invocation request for the currently executing directive. Contains lots of advanced information just as execution phase, the executing location etc. + + +### Directive Arguments + +Directives can contain input arguments just like fields. However, its important to note that while a directive may declare multiple action methods for different locations to seperate your logic better, it is only a single entity in the schema. As a result ALL action methods must share a common signature. The runtime will throw an exception while creating your schema if the signatures of each action method differ. ```csharp - [GraphType("include")] - [DirectiveLocations(ExecutableDirectiveLocation.AllFieldSelections)] - public sealed class IncludeDirective : GraphDirective - { - public IGraphActionResult BeforeFieldResolution([FromGraphQL("if")] bool ifArgument) - { - return ifArgument ? this.Ok() : this.Cancel(); - } + public class MyValidDirective : GraphDirective + { + [DirectiveLocations(DirectiveLocation.FIELD)] + public IGraphActionResult Execute(int arg1, string arg2) { /.../ } + + [DirectiveLocations(DirectiveLocation.FRAGMENT_SPREAD)] + public Task Execute(int arg1, string arg2) { /.../ } + } + + public class MyInvalidDirective : GraphDirective + { + // method parameters MUST match for all directive action methods. + [DirectiveLocations(DirectiveLocation.FIELD)] + public IGraphActionResult Execute(int arg1, int arg2) { /.../ } + + [DirectiveLocations(DirectiveLocation.FRAGMENT_SPREAD)] + public IGraphActionResult Execute(int arg1, string arg2) { /.../ } } ``` +> Directive arguments must match in name, data type and position for all action methods. Being able to use different methods for different locations is a convenience; to GraphQL there is only one directive with one set of parameters. -This Directive: -- Declares its name using the `[GraphType]` attribute - - The name will be derived from the class name if the attribute is omitted -- Defines that it can be included in a query document at all applicable field selection locations using the `[DirectiveLocations]` attribute - - This is the default behavior and will be set automatically if the attribute is omitted. -- Declares a life cycle method of `BeforeFieldResolution` and provides one required input argument -- Uses the `[FromGraphQL]` attribute to declare the input argument's name in the schema +### Returning Data from a Directive -### Directive Life Cycle Methods +Directives can't directly return data or resolve a field. They can only indicate success or failure. The following helper methods can help to quickly generate an appropriate `IGraphActionResult`. -GraphQL ASP.NET offers two points in the field pipeline at which a directive could be invoked. By declaring your methods as one of these two method names (or both), you can invoke the directive at that point in the lifecycle: +* `this.Ok()`: + * The directive executed correctly and processing of the current schema item or target field should continue. +* `this.Cancel()`: + * The directive failed and the schema should not be generated or the target field should be dropped. -- `BeforeFieldResolution` - - This method is executed before a controller method is called. -- `AfterFieldResolution` - - The method is executed after the controller method is called. +> throwing an exception within an action method of a directive will cause the current query to fail completely. Use `this.Cancel()` to only drop the single targeted field. -> Directive life cycle methods must have an identical signature +### Directive Target +The `this.DirectiveTarget` property will contain either an `ISchemaItem` for type system directives or the resolved field value for execution directives. This value is useful in performing additional operations such as extending a field resolver during schema generation or taking further action against a resolved field. -While a directive may declare both life cycle methods independently, it is only a single entity in a schema. As a result both life cycle methods must share a common signature (i.e. the same input parameters and return type). The runtime will throw an exception when your schema is created if the signatures differ. +### Directive Lifecycle Phases -### Returning Data from a Directive +Each directive is executed in one of three phases as indicated by `this.DirectivePhase`: -Directives can't directly return data or resolve a field but they can influence the field data using `this.Request.DataSource`. This property gives you direct access to the data items the field is currently resolving as well as the resolved values and current item state if executing `AfterFieldResolution`. You're free to manipulate this data as necessary and can change the resolved value, cancel a specific item etc. +* `SchemaGeneration` + * The directive is being applied during schema generation. `this.DirectiveTarget` will be the `ISchemaItem` targeted by the directive. You can make any necessary changes to the schema item during this phase. Once all type system directives have been applied the schema is read-only and should not be changed. +* `BeforeFieldResolution` + * The directive is currently executing BEFORE its target field is resolved. `this.DirectiveTarget` will be null. You must explicitly tell a directive to execute before field resolution via the `[DirectiveInvocation]` attribute. By default this phase will be skipped. +* `AfterFieldResolution` + * The directive is currently executing AFTER its target field is resolved. `this.DirectiveTarget` will contain the resolved field value. This value can be freely edited and the result will be used as the field result. You are responsible for ensuring type consistancy. Altering the concrete data type of `DirectiveTarget` may cause a query to fail or yield unpredictable results. -**Directives Must Return IGraphActionResult** +## Execution Directives -Since directives don't directly return data, they must always return a `IGraphActionResult` to fully declare their intent. In the include directive, we're returning `this.Ok()` and `this.Cancel()` which allows us to affect the pipeline processing status, signaling for it to continue or cancel. +### Example: @include Directive -## How Directives are Executed +This is the code for the built in `@include` directive: + +```csharp + [GraphType("include")] + public sealed class IncludeDirective : GraphDirective + { + [DirectiveLocations(DirectiveLocation.FIELD | DirectiveLocation.FRAGMENT_SPREAD | DirectiveLocation.INLINE_FRAGMENT)] + public IGraphActionResult Execute([FromGraphQL("if")] bool ifArgument) + { + return ifArgument ? this.Ok() : this.Cancel(); + } + } +``` + +This Directive: -Directives are executed as a middleware component in the field execution pipeline. If the request supplies any directives to be ran, they are executed in the pipeline and depending on the result, the pipeline is allowed to continue or not. +- Declares its name using the `[GraphType]` attribute + - The name will be derived from the class name if the attribute is omitted +- Defines that it can be included in a query document at all applicable field selection locations using the `[DirectiveLocations]` attribute + - This is similar to using the `[Query]` or `[Mutation]` attributes for a controller method. + - In addition to defining where the directive can be used this attribute also indicates which action method is invoked at that location. You can use multiple action methods as long as they have the same signature. +- Uses the `[FromGraphQL]` attribute to declare the input argument's name in the schema + - This is because `if` is a keyword in C# and we don't want the argument being named `ifArgument` in the graph. +- Is executed once for each field or fragment field its applied to in a query document -The include directive above is very simple. Depending on the input argument it either returns `this.Ok()` indicating everything executed fine and processing of the pipeline should continue, or it returns `this.Cancel()` to end the request. The include directive does not attempt to influence or filter the incoming data items, its an "all or nothing" directive. +> The action method name `Execute` in this example is arbitrary. Method names can be whatever makes the most sense to you. -## Directive Execution Order +### Directive Execution Order -When more than one directive is encountered for a single field they are executed in sequence in the order declared in the source text. No directive has precedence over another and all will be executed. +When more than one directive is encountered for a single field, they are executed in the order encountered, from left to right, in the source text. -## Working with Fragments +### Working with Fragments Directives attached to spreads and named fragments are executed for each of the top level fields in the fragment. @@ -100,20 +156,251 @@ fragment donutData on Donut @directiveB { The directives executed, in order, for each field are: -- **`allPasteries`**: `@directive1` +- **`allPasteries`**: @directive1 -- **`flavor`**: `@directiveA`, `@directiveB`, `@directiveC` +- **`flavor`**: @directiveA -> @directiveB -> @directiveC -* **`size`**: `@directiveA`, `@directiveB` +* **`size`**: @directiveA -> @directiveB -* **`length`**: `@directiveD` +* **`length`**: @directiveD * **`id`, `name`, `width`**: _-no directives-_ Since the `donutData` fragment is spread into the `allPastries` field its directives are also spread into the fields at the "top-level" of the fragment. -## Sharing Data with Fields +### Sharing Data with Fields It is recommended that your directives act independently and be self contained. But if your use case calls for a need to share data with the fields they are targeting, the key-value pair collection `Items` that can be used: - `this.Request.Items` is a collection scoped to the current field execution. These values are available to all executing directives as well as the field resolver within the current pipeline. + + +## Type System Directives +### Example: @ToUpper + +This directive will extend the resolver of a field to turn any strings into upper case letters. + +```csharp + public class ToUpperDirective : GraphDirective + { + [DirectiveLocations(DirectiveLocation.FIELD_DEFINITION)] + public IGraphActionResult Execute() + { + // ensure we are working with a graph field definition and that it returns a string + var field = this.DirectiveTarget as IGraphField; + if (field != null) + { + // ObjectType represents the .NET Type of the data returned by the field + if (field.ObjectType != typeof(string)) + throw new Exception("This directive can only be applied to string fields"); + + // update the resolver to execute the orignal + // resolver then apply upper caseing to the string result + var resolver = field.Resolver.Extend(ConvertToupper); + item.UpdateResolver(resolver); + } + + return this.Ok(); + } + + private static Task ConvertToupper(FieldResolutionContext context, CancellationToken token) + { + if (context.Result is string) + context.Result = context.Result?.ToString().ToUpper(); + + return Task.CompletedTask; + } + } +``` + +This Directive: + +* Targets a FIELD_DEFINITION and can be applied to any field of any type. +* Ensures that the target field returns returns a string. +* Extends the field's resolver to convert the result to an upper case string. +* The directive is executed once per field its applied to when the schema is created. The extension method is executed on every field resolution. + * If an exception is thrown the schema will fail to create and the server will not start. + * if the action method returns a cancel result (e.g. `this.Cancel()`) the schema will fail to create and the server will not start. + +### Applying Type System Directives + +#### Using the `[ApplyDirective]` attribute + +If you have access to the source code of a given type and want to apply a directive to it directly use the `[ApplyDirective]` attribute: + +
+
+ +```csharp +// Person.cs +public class Person +{ + [ApplyDirective(typeof(ToUpperDirective))] + public string Name{ get; set; } +} +``` + +
+
+ +```javascript +// GraphQL Type Definition Equivilant +type Person { + name: String @toUpper +} +``` + +
+
+
+
+If different schemas on your server will use different implementations of the directive you can also specify the directive by name. This name is case sensitive and must match the name of the registered directive in the target schema. + + +
+
+ +```csharp +// Person.cs +[ApplyDirective("monitor")] +public class Person +{ + public string Name{ get; set; } +} +``` + +
+
+ +```javascript +// GraphQL Type Definition Equivilant +type Person @monitor { + name: String +} +``` + +
+
+ +
+
+**Adding Arguments** + +Arguments added to the apply directive attribute will be passed to the directive in the order they are encountered. The supplied values must be coercable into the expected data types for an input parameters. + +
+
+ +```csharp +// Person.cs +[ApplyDirective("monitor", "trace")] +public class Person +{ + public string Name{ get; set; } +} +``` + +
+
+ +```javascript +// GraphQL Type Definition Equivilant +type Person @monitor(level: "trace") { + name: String +} +``` + +
+
+ +
+
+ +#### Using Schema Options + +Alternatively, instead of using attributes to apply directives you can apply directives during schema configuration: + +```csharp +// startup.cs +public void ConfigureServices(IServiceCollection services) +{ + // other code ommited for brevity + + services.AddGraphQL(options => + { + options.AddGraphType(); + options.ApplyDirective("monitor") + .ToItems(schemaItem => schemaItem is IObjectGraphType ogt && + ogt.ObjectType == typeof(Person)); + } + +} +``` + +> The `ToItems` filter can be applied multiple times. A schema item must match all filter criteria in order for the directive to be applied. + +**Adding arguments** + +Adding Arguments via schema options is a lot more flexible than via the apply directive attribute. Use the `.WithArguments` method to supply either a static set of arguments for all matched schema items +or a `Func` that returns a collection of any parameters you want on a per item basis. + +```csharp +// startup.cs +public void ConfigureServices(IServiceCollection services) +{ + // other code ommited for brevity + + services.AddGraphQL(options => + { + options.AddGraphType(); + options.ApplyDirective("monitor") + .WithArguments("trace") + .ToItems(schemaItem => schemaItem is IObjectGraphType ogt && + ogt.ObjectType == typeof(Person)); + } + +} +``` +
+ +## Directives as Services +Directives are invoked as services through your DI container when they are executed. When you add types to your schema during its initial configuration, GraphQL ASP.NET will automatically register any directives it finds as services in your `IServiceCollection` instance. However, there are times when it cannot do this, such as when you apply a directive by its name. These late bound directives may still be discoverable and graphql will attempt to add them to your schema whenever it can. However, it may do this after the opportunity to register them with the DI container has passed. + +When this occurs, if your directive contains a public, parameterless constructor it will still instantiate and use your directive as normal. If the directive contains dependencies in the constructor that it can't resolve, execution of that directive will fail and an exception will be thrown. To be safe, make sure to add any directives you may use to your schema during the `.AddGraphQL()` configuration. Directives are discoverable and will be included via the `options.AddAssembly()` helper method. + +The benefit of ensuring your directives are part of your `IServiceCollection` should be apparent: +* The directive instance creation will obey lifetime scopes (transient, scoped, singleton). +* The directive can be instantiated with any dependencies or services you wish; making for a much richer experience. + +## Understanding the Type System +GraphQL ASP.NET builds your schema and all of its types from your controllers and objects. In general, you do not need to interact with it, however; when applying type system directives you are affecting the final generated schema at run time, making changes as you see fit. When doing this you are forced to interact with the internal type system. + +Below is a list of interfaces that may prove helpful as you navigate a schema's structure. During the schema generation phase of a directive the `DirectiveTarget` will be an item that will implement one or more of these interfaces depending its nature. + +* `ISchemaItem` + * all parts of the type system inherit from `ISchemaItem` it contains basic properties such as `Name` and `Description`. +* `ITypedSchemaItem` + * Any schema item derived from a .NET type (controllers, POCOs, scalars etc) implement this interface and expose an `ObjectType` property giving access to the .NET `System.Type` it represents. +* `ISchema` + * The schema itself. Contains a `KnownTypes` collection containing all the graph types registered. +* `IGraphOperation` + * One of three top level operations (query, mutation, subscription). All graph operations are also object graph types. +* `IGraphType` + * All graph types (scalars, objects, enums, interfaces etc.) implement `IGraphType`. +* `IObjectGraphType` +* `IInputObjectGraphType` + * Represents the two complex object types of GraphQL. Defines a `Fields` collection containing all the fields defined on the type. + * `IGraphField` + * Represents a single field of data on an object or input graph type. Provides direct access to the field `Resolver` as well as the ability to call `UpdateResolver()` to change it entirely. Also has an `Arguments` collection containing all the arguments the field defines. + * `IGraphArgument` + * A single parameter on a single field of data. Many properties of a graph argument are read-only and for informational purposes only. +* `IInterfaceGraphType` + * Represents the INTERFACE type of GraphQL. Defines a `Fields` collection containing all the fields available via the interface. +* `IUnionGraphType` + * Represents the UNION type of GraphQL. Exposes the `PossibleConcreteTypes` and `PossibleGraphTypeNames` collections containing all the allowed .NET types and schema object graph type names that the union can represent. +* `IScalarGraphType` + * A scalar. Contains low level data items such as `SourceResolver` for parsing data supplied on a query and `Serializer` for serializing out data results. +* `IEnumGraphType` + * Represents the ENUM type of GraphQL. Contains a `Values` collection with all the defined values. + * `IEnumValue` + * A single valid value within an ENUM graph type. diff --git a/docs/advanced/middleware.md b/docs/advanced/middleware.md index e3cf708..c51153c 100644 --- a/docs/advanced/middleware.md +++ b/docs/advanced/middleware.md @@ -4,19 +4,21 @@ title: Pipelines and Custom Middleware sidebar_label: Pipelines & Middleware --- -At the heart of GraphQL ASP.NET are 3 middleware pipelines; chains of components executed in a specific order to produce a result. +At the heart of GraphQL ASP.NET are 4 middleware pipelines; chains of components executed in a specific order to produce a result. - `Query Execution Pipeline` : Invoked once per request this pipeline is responsible for validating the incoming package on the POST request, parsing the data and executing a query plan. - `Field Execution Pipeline` : Invoked once per requested field, this pipeline attempts to generate the requested data by calling the various controller actions and property resolvers. - `Field Authorization Pipeline`: Ensures the user on the request can perform the action requested. This pipeline is invoked once for the whole query or for each field depending on your schema's configuration. +- `Directive Execution Pipeline`: Executes directives for various phases of schema and query document lifetimes. ## Creating New Middleware -Each new middleware component must implement one of the three middleware interfaces depending on the type of component you are creating; much in the way you'd define a filter or middleware component for ASP.NET MVC. The three middleware interfaces are: +Each new middleware component must implement one of the foud middleware interfaces depending on the type of component you are creating; much in the way you'd define a middleware component for ASP.NET. The four middleware interfaces are: - `IQueryExecutionMiddleware` - `IFieldExecutionMiddleware` - `IFieldAuthorizationMiddleware` +- `IDirectiveExecutionMiddleware` The interfaces define one method, `InvokeAsync`, with identical signatures save for the type of data context accepted by each. @@ -54,18 +56,6 @@ public class MyQueryMiddleware : IQueryExecutionMiddleware } ``` -## The Context Object - -Each context object has specific data fields required for it to perform its work (detailed below). However, all contexts share a common set of items to govern the flow of work. - -- `Messages`: A collection of messages that will be added to the query result. -- `Cancel()`: Marks the context as cancelled and sets the `IsCancelled` property to true. It is up to each middleware component to interpret the meaning of cancelled for its own purposes. A canceled field execution context, for instance, will be discarded and not rendered to the output whereas a canceled query context may or may not generate a result depending on when its cancelled. -- `IsValid`: Determines if the context is in a valid and runnable state. Most middleware components will not attempt to process the context if its not in a valid state and will simply forward the request on. By default, a context is automatically invalidated if an error message is added with the `Critical` severity. -- `User`: The ClaimsPrincipal provided by ASP.NET containing the active user's credentials. May be null if user authentication is not setup for your application. -- `Metrics`: The metrics package performing any profiling of the query. Various middleware components will stop/start phases of execution using this object. If metrics are not enabled this object will be null. -- `Items`: A key/value pair collection of items. This field is developer driven and not used by the runtime. -- `Logger`: An `IGraphLogger` instance scoped to the the current query. - ## Registering New Middleware Each pipeline can be extended using the `SchemaBuilder` returned from calling `.AddGraphQL()` at startup. Each schema that is added to GraphQL will generate its own builder with its own set of pipelines and components. They can be configured independently as needed. @@ -88,6 +78,19 @@ public void ConfigureServices(IServiceCollection services) Instead of adding to the end of the existing pipeline you can also call `.Clear()` to remove the default components and rebuild the pipeline from scratch. See below for the list of default middleware components and their order of execution. This can be handy when needing to inject a new component into the middle of the execution chain. + +## The Context Object + +Each context object has specific data fields required for it to perform its work (detailed below). However, all contexts share a common set of items to govern the flow of work. + +- `Messages`: A collection of messages that will be added to the query result. +- `Cancel()`: Marks the context as cancelled and sets the `IsCancelled` property to true. It is up to each middleware component to interpret the meaning of cancelled for its own purposes. A canceled field execution context, for instance, will be discarded and not rendered to the output whereas a canceled query context may or may not generate a result depending on when its cancelled. +- `IsValid`: Determines if the context is in a valid and runnable state. Most middleware components will not attempt to process the context if its not in a valid state and will simply forward the request on. By default, a context is automatically invalidated if an error message is added with the `Critical` severity. +- `User`: The ClaimsPrincipal provided by ASP.NET containing the active user's credentials. May be null if user authentication is not setup for your application. +- `Metrics`: The metrics package performing any profiling of the query. Various middleware components will stop/start phases of execution using this object. If metrics are not enabled this object will be null. +- `Items`: A key/value pair collection of items. This field is developer driven and not used by the runtime. +- `Logger`: An `IGraphLogger` instance scoped to the the current query. + #### Middleware is served from the DI Container Each pipeline is registered as a singleton instance in your service provider but the components within the pipeline are invoked according to the service lifetime you supply when you register them allowing you to setup dependencies as necessary. @@ -180,3 +183,26 @@ In addition to the common properties defined above the field authorization conte - `Request`: Contains the field metadata for this context, including the security rules that need to be checked. - `Result`: The generated authorization result indicating if the user is authorized or unauthorized for the field. This result will contain additional detailed information as to why a request was not authorized. This information is automatically added to any generated log events. + + +## Directive Execution Pipeline +The directive execution pipeline will be invoked for each directive applied to each schema item during schema generation and each time the query engine encounters a +directive at runtime. The directive pipeline contains two components by default: + +1. `ValidateDirectiveExecutionMiddleware`: Inspects the execution context against the validation requirements of the given execution phase applying appropriate error messages as necessary. +2. `InvokeDirectiveResolverMiddleware`: Generates a `DirectiveResolutionContext` and invokes the directive's resolver, calling the correct action methods. + + +#### GraphDirectiveExecutionContext +```csharp +public class GraphDirectiveExecutionContext +{ + public IGraphDirectiveRequest Request { get; } + public IDirective Directive {get;} + + // common properties omitted for brevity +} +``` + +- `Request`: Contains the directive metadata for this context, including the DirectiveTarget, execution phase and executing location. +- `Directive`: The specific `IDirective`, registered to the schema, that is being processed. \ No newline at end of file diff --git a/website/pages/en/index.js b/website/pages/en/index.js index 3cb247f..5b96a88 100644 --- a/website/pages/en/index.js +++ b/website/pages/en/index.js @@ -31,7 +31,7 @@ class HomeSplash extends React.Component {

{GraphQL ASP.NET} {/*{siteConfig.tagline}*/} - v0.9.2-beta + v0.10.0-beta

); From edb58269742b81bbae248c23fdc532eae647e8c0 Mon Sep 17 00:00:00 2001 From: Kevin Carroll Date: Sun, 29 May 2022 12:38:29 -0700 Subject: [PATCH 2/6] added type system uml diagram and directive demo project reference --- docs/advanced/directives.md | 41 +++++------------- ...-aspnet-type-system-interface-diagrams.pdf | Bin 0 -> 171902 bytes docs/reference/demo-projects.md | 6 +++ 3 files changed, 18 insertions(+), 29 deletions(-) create mode 100644 docs/assets/2022-05-graphql-aspnet-type-system-interface-diagrams.pdf diff --git a/docs/advanced/directives.md b/docs/advanced/directives.md index 792cf73..b61c128 100644 --- a/docs/advanced/directives.md +++ b/docs/advanced/directives.md @@ -375,32 +375,15 @@ The benefit of ensuring your directives are part of your `IServiceCollection` sh ## Understanding the Type System GraphQL ASP.NET builds your schema and all of its types from your controllers and objects. In general, you do not need to interact with it, however; when applying type system directives you are affecting the final generated schema at run time, making changes as you see fit. When doing this you are forced to interact with the internal type system. -Below is a list of interfaces that may prove helpful as you navigate a schema's structure. During the schema generation phase of a directive the `DirectiveTarget` will be an item that will implement one or more of these interfaces depending its nature. - -* `ISchemaItem` - * all parts of the type system inherit from `ISchemaItem` it contains basic properties such as `Name` and `Description`. -* `ITypedSchemaItem` - * Any schema item derived from a .NET type (controllers, POCOs, scalars etc) implement this interface and expose an `ObjectType` property giving access to the .NET `System.Type` it represents. -* `ISchema` - * The schema itself. Contains a `KnownTypes` collection containing all the graph types registered. -* `IGraphOperation` - * One of three top level operations (query, mutation, subscription). All graph operations are also object graph types. -* `IGraphType` - * All graph types (scalars, objects, enums, interfaces etc.) implement `IGraphType`. -* `IObjectGraphType` -* `IInputObjectGraphType` - * Represents the two complex object types of GraphQL. Defines a `Fields` collection containing all the fields defined on the type. - * `IGraphField` - * Represents a single field of data on an object or input graph type. Provides direct access to the field `Resolver` as well as the ability to call `UpdateResolver()` to change it entirely. Also has an `Arguments` collection containing all the arguments the field defines. - * `IGraphArgument` - * A single parameter on a single field of data. Many properties of a graph argument are read-only and for informational purposes only. -* `IInterfaceGraphType` - * Represents the INTERFACE type of GraphQL. Defines a `Fields` collection containing all the fields available via the interface. -* `IUnionGraphType` - * Represents the UNION type of GraphQL. Exposes the `PossibleConcreteTypes` and `PossibleGraphTypeNames` collections containing all the allowed .NET types and schema object graph type names that the union can represent. -* `IScalarGraphType` - * A scalar. Contains low level data items such as `SourceResolver` for parsing data supplied on a query and `Serializer` for serializing out data results. -* `IEnumGraphType` - * Represents the ENUM type of GraphQL. Contains a `Values` collection with all the defined values. - * `IEnumValue` - * A single valid value within an ENUM graph type. +**UML Diagrams** + +These [uml diagrams](../assets/2022-05-graphql-aspnet-type-system-interface-diagrams.pdf) details the major interfaces and their most useful properties of the type system. However, +these diagrams are not exaustive. Look at the [source code](https://github.com/graphql-aspnet/graphql-aspnet/tree/master/src/graphql-aspnet/Interfaces/TypeSystem) for the full definitions. + +**Helpful Extensions** + +There are a robust set of of built in extensions for `ISchemaItem` that can help you filter your data. See the [full source code](https://github.com/graphql-aspnet/graphql-aspnet/tree/master/src/graphql-aspnet/Configuration/SchemaItemExtensions.cs) for details. + +## Demo Project +See the [Demo Projects](../reference/demo-projects.md) page for a demonstration on creating a type system for extending a field resolver and an execution directives + that manipulates a string field result at runtime. \ No newline at end of file diff --git a/docs/assets/2022-05-graphql-aspnet-type-system-interface-diagrams.pdf b/docs/assets/2022-05-graphql-aspnet-type-system-interface-diagrams.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d665f7def7fd3d9aa080fed7abdd221f3271319 GIT binary patch literal 171902 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%0A6D^DLCNpS1BbW;cZDn% zx}yu-C{rcY*#{a0d^^s7gF_7`UOv7-0n<>!LPHui z*!{_AzNVg<@B)*EK{qxfF7&JsmJgJ{w00(MWmzoDn$K0!snrtp=Oj&om4!}YQ1_` z@@t#E@k7yLKcr1h_h8csS^kUJCqpH^3D0xHCxs>? zJqO+RJjfWg3KCzroP%`pYM#xN4$rm=Hj-uBo3PB!HaOP^(LS9VfAx+LDjrxkT$qO@ zh?PGR9EY`A(6(avT(E#A758U~rsnV{5;-i+T-v(y&Tg>U)}_1O1pD&QKiM=ASl~l7 zaupFHniftVtW+|ZV~vl@WbvD*6`ZmFg+C0Aflv@q&(JBT#T~`L_utV06*=|zZbui} zr>56mCh}s!%n1{nThz^X;C>Q$x{`#dunyR>sE#06u-=gDfzW2gS$*scNxTIMBx70? z;J0z*=jp);xc`-r#RHEF1(=C!fRcfN3zG&IPy+WBF$#HqQ1zf;awvI53d(QiQjVGiGX=oy$%mT&~SFI~AXhvN^?>iBQ7yF12h{izX!Diek zxC=h5VsDb2yoBv-*_kW*;&H2TfSVWTob^kYJcLG8!vh2k%?>%;>?$>NDuWUqj!Y1? zRj$?>aDaq*2m<*}mnqYuBF>kF{>fae#P5a!g0Co4SOF#6GxUATZqc$*RxIx32a2+l z2mFhV)uZ3~0k4CsmbE69`)#}5FFdgKwK1S)UQ=*ap!F_J?2s^8$o45tOmY!#;Vv#D zl!d2gpAZ(_a*M5~-X`rlpH-CpveQU2cNCzzHtpFS{8O+08-{(hBV0y?f{11vRwxjJ3J^*WoyHqnrC=|a9tdHN8Z;t` z2QL$jCJ^$MK7gR`pBF|ehZJ1de5$eF%Ih@5hUG$rHcBrWcU~o>d-OP3O+gAEuqVU@ zli#j7C3ea8l{mMLGr(O0d$vk`t??Imqd)MqU+&R)zpP=7Ygbyj?c5L0@1_1W=&f)y zo3h&jkx#jGxW(iK+^s`5^w?ebfIRrxEe{0eU3Y{h!Qd8fLH4;Oa6x_o(AC|Z!tWEo zx!Wov4}>KI5ZqK*CjQ^Yvfvywm|$+_K?!ytD5bojgHu%t2s9Z_%)?_v%}UUE_<&L+ zfVS>O zF{%Pqk!+oMHG2s#X%80lBAF-Ls$p0fY6Y~EMn;Gc(1<@ljJc`2o=~)C$!gG|qeyNPKz6zt9 zH7Sg4&~bFWIDTAgm!+nR?|w5E_*o^#*@iymt)D*ar@OAyazAeEAGNq4-?x6-U)NuG zqa;ojuea8H!x zYLu^`hVjhfD)=bOt9B{|a)>1cX(koM6D#l1k0w7&R1fd9p>2g%@wqM z_~VT|miipaVE+7v6$37cuX1D6oXNDz0VLVHNZKEPiZjV&$pxB^kif)Kz_1nq6qoRZ zVilR@&)FjkLO^bl5RM~du-&`%W(UmLS;P&hp$a%{HZsYw9jO{isD=@Yp=o~j^X;&p z6Vq`3a1aYIT09inkXE+yPQVBv+stIus=cJcNr<&nST+<$B^9%1DrE`i7gl0;(s>1c ziV68`1zfT84tbhFRQs%@7H~>C$3+U+(g%2lqlKSJ3NFcHQY~w!q4H0l^h!JUPa0IP z2i^2#izBr~27)i}Bz|0Eo(>{0Jqe*o80wW=4>nPpD z7qU#^Cej4ctI23e;i|4UrXlK}XeAr}rB0DgqrN~Unc*0s#)A?v3Kp#NLXev|2jT7n zHp6pcc|vHhDjr|?wUxXLN(+;2eY21Sv-Y5{(x0eOjmeeYjb2)%iio3dbCOn>5AAcV{AP`j=J%$A7MLCMr8 z&;!6@N)X&tvMxX412dWJ;U?}_!O_uB60Ik>TSxpL1UUtK0^xtfb=hpe$sx`^RHsq@0kMjhArs(}J+mumC)6{{i+5Ex zyB?adB#PHDmn=j2<*SLI#XUhyKw_2K?sp-c@;8gY1t4U(+C&1U`i76$B0?RG*W0Kv z282Nr-~xX&9%!eeH%5xUbyBLX@C0L80KAV-G*rY6K(ACF3 zQkODCT!yVhoowS2hr_duEi&x5eq2}U#?VlLpPFJixjO9&W!tM9L(UH@+dL@*im#uc zs*Fp3v@sPa|0G4}U_=0dD{v_psTCfvo@{GQw^c8cY;YY`Y}MP3Hx^K;9hb62eC^~F z^zqLJpb9uc2#dYh%U4zeDl%S>4wuWwuLy!b&aN2P_guxTW^sE$%0EwT8#nO+^*MyzL7;98R%3}96jCh&RmUq% zTq>O9z_7iT2Ic-^3%0Sln2^UPy;~NB_U6i}4<3yq?m37Fg$`tZ6knDsi|Fk;y<-&g z+YKJtXL7H%9lES$oFj74$VOt#pspV83zoLFwQ>M-jvQXjH_$(~n==}KlfrcMnIUjx zwK1t`<=?V;Aa9skILtWz{O2-@Dua;nNB8@=%!UiauN`Gq+X*+&UIpZbDGx-P99Mz%Jn85Gh&er9qjg*A@Q9x3%Y^y8D@#UPLr)U{c6l%6L z)nFXndTKxr1b&K~lU_SMvgX!1)IxaLrOooOveHFG8r5px6hlikwTx%7r5Uj$s6QMNAXTc@YUYI>?baFq0gc8unuffQ$*3iR#wR|G&3A>bNlB5%Dl~(Osrj?aAo@)kLm7zF% z!5XeH4$BA>;ZY_;o?9v%Ufi?6LIs! zdUvE(+Gkn_vVP1>+#FB+Dh4M)ku#}UTC#+Y%s`Z%!W}SLcT%FdJ(Yrd5ZH6JrCarr zPM*@1|H?8-LbaX4j4n2fwAq+vS#L)dyQ0xP*`+)$Z1&x_;xr{b;^&Ifj6E#gvziju zgl*iC!I;#9rifZT9hj~K)&F6u|KpD`P5<3papSy*^K-V@%iMF0pR+nO{Lo_@Y(l#t z#pEg5Lj`IX@pb_-e#W%ycDeP%2ecgc-gJX+TJ#OJhMXrbr;dSSP^v@e3$nN)6BeVV z??5ZoF&2;OelDCkwuVPf+=FGrVJlTb(-m*k8?AaAL)4+!vU7vQ$74dWmEbmK{Bnkt zx_P~2cr7Y;o07G&0%?Irt<-3+c#6|`10}aOZtnwN_$(*mQZL==JwI7cku%_J1;@t5 z{QX9OwB)|gbP~|E6j(H2tSCUJhD;_F8_rv%M%?CC4gHw!bQtw;qv=))dxw7A4cflV zyrI~-H@!{gvpYxCr9Z{Ob)(`Cu6@)+wKNa*nbi}5-I217X;J9)g0D;P`Q#(jIy5#a z@*ngKzHYsJqhXZ!TJ~!?mCvQ<#1$5 zlNENWhJU?<5W3T9QIoO#s{b@KR!>_&{|3)=H!S?AZC$h6r&u`-VaU1kb7gRaaaUo? zvD(GQ8>m`^qSxa<0QcH!r2l0Hw;kJSyq=$rSva8a;3?qi)ZI zk$`>whikAPYuOG^!l2^?qq@6T`*TstGBuJHQ?%$=>ZR#L%3o15W6Uz~Rvg=NDdYMp zwd5<%_IMj2&184OO5m#q?M*(v=T1d z#ToGrzSG6Bd7V-f%SpLyw?65>Sfg-jXfJ7)x@OX9&pivLJqs8%6!X@}!etwo7EE1& z26Z;P=k#Z5BEo}4Chk|;Nl>#|Z0e~^s_ib057pe?6x5F;W$pAd4=Q*kpk?xeB`mJ>MM?f8F8KC|e z{*%ZcpfCEZDy=5pzEw*1shJw$i}K#AfzXcQ0{b!!r?AUwS23W=pJ0e6;pO@AC-tOX zn0F-MMIzY!p1*#|ES2D^qS&Bu9W+x&|_VY%f)T z7l2xXS8h|U_LcM>y7fXut&t3Vv9=L~TLuHgl}QK{=D)OxAa51`SSQS?;*5gCIpac= z=QF4T(1q>0+MT`x0aZJXpbBof7rh)ECeYp+g^pW}g6m zH_puu8RdQq_zvdbA3)EN0o{ZT+GSbA8idSrF44-Yd8SjPmt0^{Tw}bk;{~@@0|^00 zRkG);)mE135SMHYiUW$=@!QK&Xb76%UR<7@GHrI@rMg)-Ypuwfaut^1x+rUGdu~II z5fZx)HJ!tx$@G&LMOmR~L0F*~g;=#SC0ktC#R{@?-OAfLWSpZ;4%+D&K>l;>j1_WF ztoys;akKeCzt)skeVBBEV)abi6q%roB!`O@YlpdqW|+HOpjROo%P|e7?TKb>mS{^w zxODF>lfLiBT&5;xG&Wp!QC7FXIWB4)2!532gg{Det|HjN$4R$J#*T3Dxq!?^M2nH$ z2<@~^xrzsTWBjdtUQs$PIR2*!mAQ|4`Db@`hyH2Ey%Wk_Th?yV{Z3&+=ZR_!hxy^c z=2nb$?PpX4`L9}G#r2QC@$P{)`fXsA(46SAEyA%8rl*I6kgX4Ml;&E zi1z{SYEn`+o@;kLBS2^80@|s$Z0@hu4<4KBIH6wkVg_6`VgruC1~0@NJ$JiO zKYS7?dbPg3_iX6C+KC^>*L8Ju+Zy3pr+)sOf39xhyY7D9=jQfI`Ca>dzfZo_`hB;! zgZBPw_&jW_eZ=kg_o4mVdLj7zk3Q&E36}Tgus4SGa3H8mBV+V)%FZnJK(s?|G_q1t zxP=*!-j~PAxsgZfDE8;R`g?fwX{%B9X8opTcK1DUZS`kH{b$SY%Yl67xsHOyl_l$PVJCmj>ME^y>I=#%qrNpc_pXq!0cg>Q(60B zAuxjc&{jV2;xWKX(*6oM4`yLgN(7v^C9R8;cXm#a)Bv}2;!0>U%G!$&gIa%p9XvEv zZH&ZB6`yM+#&$x&%$C2S%#-yZ^2`7zl!PZcfh8yTP2pO@_l0dsDkNrWy=ieISo)n2 zpnd;gYu{mJPaZO8w!5Em!Q=h%Z#ivem8ZPU!|+l4-RkLn8TVQ~okd*>rzDb7hB;Ml zH8w}zW^E{zPHqQHPES&hv_Rt*0rTBKSvoBvzpaUhrLh%knZG=a3Zc%O-{Y-m-Ya7d zE#$fknVmhH#s;S6d7%^@!xzGuZx#s zt`t7FI%-!{>d`Tq-b?hcX}k4edU?|#O;?pUTHpLq+j<$*ea=4ZVrYFj)`{>7qq6Y& z(F%Rrh6U!|OG*dd3;X{Ihd_A03g41$eX{-H4wcSwOH{0~Y z8I^w$bjmk7rJg^NJ>Mj13u4Y9b*8v|5Dm1f2Z$0nDF1-Na{`L}S(Go+uEsFX2oR#E zkW5DCKSiFSHfQ(A-oCg@nSwnqP$V=buC?I?O9^bNjFEE;Xcq*Et0TkL=9t=kLM%W! zqd>dNwuXqig!$cd5SVXaD3xqz4c9@2AqU@~(K{E%+|K`GfXV`OwCTc^!ktQn5 zvEb6g$6x8R`;xf1a^l9@d=!kSari5fbrgr!mimEWYMv!1A&RV_SgTZYtJ{h(B~@fk ztf0&=Gl~xh?2g7v6Q`pvBGH#7Kpa}^xdPRrZSn11H@&kI7dL5tA8u09Io7Hu%WMu? z&m5i+$}DN`X&c04gc?53%>vJI!eGe<{dWnt5NYMnu^dkFxm;9K>OQ;{x{K-pY>CjMBrPUC|i1NfZYw1Xiij zy&o0rO(9hlHQ6`1&i|4mS_7GR>dWq^7I&Uh z51LTwCT^~7VxDl%N>Y4?3t@wSj8FnonRuBSIJe|ck=ur5MR+;au93B66q}?QLE>5qv&1(r_&kbTfe4`g<2i9{G$^5?CD3VWtEtImaTPypz zRBE9d^SCeB#gCs|EXO?F$3BX3%ws_(s*9i#*FNU4ojEyd;-ij}N`r>CN4fYDd51ta z{x}z(A@`R{l@|NGFZTO2zVfDmRTAFYYc3g&OT|aMGmBYl?#BC;PvWXH2a_M@k% z>Z&Tv#639^v+M2&2=Hn*TX;K%$(|y;Pa>nOXL3qW@^W2@l3&nA>#EzX8yU}et{TU7#S+kEb69)k z@Ut|Mnj_NdZio#tbB)^+)RcnTXp2k1ZGl8Bbva11WS%$6JUeS*&Qb33aJNzJrOW#6 z4!W!dXP5O7eBE5|)%upQ#3puHI^QII@?_KCo3#Rw3d{K+QtufV#RJ@|_Rw|u#2F4? zvsrY1PpDpjpg)Qi*&q%$23(C&ommq)-pCTEY2S9%g&~Eb0&N&`{9PC=^ z7`Ilc&N{}=lJ^Q{owHENJ?^F4qjfgtDZcj2`P$wiEJ|yQ)p)_!Upr&e&PI15cL9QU zvpX!EO-et9UmJY0a}J}Sq`R zu$dyJf2J`(oj3;tXf3=(h$ten0N<>Gr^wInn^6k^QB4T7qk-T9T{ltR3>hE@JV^su zzow%i5ALY@z@C9FjTrwxeIl#HLJnn|pqudF(S$%vCc=eS2SqcKv_Sl1G#|0Qst7r* zCwLYhywFk5VyFSl96?*l%Ed zNwlhVqW)>^$HVb8M=+SNA>t;%mF!qz+Ml3iN$(OxT!4)sNHKlc;&*fnNzpgtH?^6z zl6_;pTPvid1IWG{s`eDg@hKSx-&pbo$Eb_f+eu*K2&LNWmt!_Vmuqc$h7#+lWtF#3 zV&yp9T{%v7UwqqAvT~axD^8cW0JgUW*bdI6Y=t`T6uJhBgF%vLBV5(00K8<3)1NS+GYWC>t(plYkSOxc#ST4iMW~&3&e{byv2SBUAx=&eHip5{>8UicawJaeg22P zNOI}F^VL6h7}sBa-Tn50bCL}gPn&g6hz}IvY5l#A@7~qR-KQ5lmt!kA&R&s}kX<{p zOQFC)osW8=_$KA?lB=0g^!p{p?%fu zE8>Xh_7ylN<~`T718AJJnDQW)S-5Z_l?vYgVQh&35pJY6H>P=d+O^M#c@DZrXaXsl zrIuwRWTfE)Rg;5{N=%wlBp;|G2g9G{)a>)6+jcO-+!EyFh z9;)D~V&djq-SA6nQ^?bSMZBA~3rwIa*&nu+1j79b?ZjSY3R4CV;zGzR^N-YQ&8iiwV9$aL1N_ zFh6)>T=jg zS=$rAa{`_T2M;lOlyr=Ul16{by9(=Ig8O*cQHxN{+9MI*$NE@>JflI zORfSIouvu7JyjuNe8wAys=|utY?@UNAPZWO4sUHVE9MOdAf}X|A^XK%!@e&zwK*rwA(y60KUtOJwp1SIB$e3z*Rg86K#KMx!xd z2I>h`83o$##)2x!cU62iiAU9-LJ^NJCWe-kDXtLL66I8|HT~*pzu7W2BIjsCtBN1UBMDXs3Yx`b#Rp^;2Z={E;0mzj_*>0?;mVy2K&IuJ!JBas9>qLzLs;>ThX&O zp=X_)E{lI#{M&eW(N>!!ihYkLcJyui)4oTXcp35D7#b$yNpV;@$cEdV5K9nJfuc3G zYbiM!?OiSiA{CvrFFNZjF?sOt*-8`^%YtaRBP|{8D%&v>#{;@Hnyp)pvD+Erf9?=B0B@fFogB5gpuFSa@ zt#qy+ve&F&MYUK51_ih*_aRrK(l^x}KgNAPv<32OR3*dxugvgdV33tDKAyt13=TJv zcK|Eso=bRW?dt7Ap>@qXz0_C=X_#BP6kzuVh>2ASpun~$5(`8L}h7k&9Clgo9RNLo857imK%##1p%d*ilsS#Ud9s4>PM>flY5T-7etHR576_BUWQn%cE^ zpRDZTmD1U6amdD%rL&8+++as!&C)h<9LQNwpq@;q2EYKeEoKD2$IjUmb5G+5irETM z+{DA*SfEmfMI=&SkcKu_a1cBC zMZNNw;xHcK5g-jbK)y|Hhym)JWPr+suZVrS+)2p|ISQ9{_60+#?*Bc$a_*3=a%WMS zIKYO{Sw!F{DpB{%Op(y?@7BB$Y#3#5Zy`~Xb#ze|u**oR8=r71_&l|mCizXOZP6=k z5;GoY19ms2+d%Z%j{rA0_DHpH3Cn79pP|692F=%&I#@IQNZd=iZ|ZpGjJfwEH>9e; zY55WqIN@LpNn#NC<_tuzX4p{F8>Z$iChcGZ+(DeD7X{s^8XOGO=AZlu=F}z$9t2> z;Xz|6xdX6H#N)0T6QvD0#(2%UvGIoh&kU6HUEi>+bM&pxab1PRT?o<{Y2}@ubZ;EK z*?EdUrrMW?t2FQ$)R1MatGb?`n5%*D$bj}I)v9kgcg|IQTx`h=+LGCa@MMW%ly$%e zWImW18scR zqxDo77FYI)uI%i1cwo<>eQr_vjIOoB8#X=plkdLV58IOWESSJc3qPhALrDglPL3N| z1V<^3iN7PNr9dBxFl6M7@oorR($gUl1#QK=hLn>q<-sZmdYyngg4v4C@10t|Xu9Py zVwZy@6chwGvP2h@Y67;V5|53>--t7%G)g+gM~eI^9Rv0eV+7--MUkT%$2h|W62i9H zu4*4UPN?8uRJd0Yg@uctM>!&qDv|-maf+AS`pik?VY|`H{UP>j!iza87L z#{L{bpOYx4Qas!`XsC)9%(Ns7IMy}DGRRmK(v&qcQIR|g3&>0yrWj6>kFoD5QGs#l z57FdWKfd3e_T!}rsf|oEC8ZhBP^eJ6SZ7{xQee4FLK6X0xtSTqx~a%w>@ot zCS;%$5ZfKpkTG8dvV{wv!CD<-wMVq#h3LvRW9%I7!Ti45zMIl>voRTHU-z@4uS`H5 zQhtY1`KV-cgd}CTRrW(`?w@tSXD7Eh{f5`P9VmIwkfIGcvX!meI#*KD=*+`Ww{;-* zfafV~s!5Hs^@MvVdx7Ff60QN0)(mf%e1JM0%ytT>u;g?=%qPpvUS|QD`yn5~lhZzWiI`TzMqr5CVI>>7tSCg4=VfrJD==v9UHdfWx=X@{4EnL?AV+L+089mawy&8fSw z=xXRO4JbFGMlys30W4?5gvy&OS9S6UMvWs_?Vy~jxnvw+j=)S7R<9e&n@38EdJq)z z!ZQ7%&4$}oLXiip8(uLx(g9#&o34++MtJ9ZF!HV}>%bEB)&-~T8RE5q2MKLvrG1s| z^oAyKt!s%(3{zs5b7GjrRa;aXrM<^dYDQnFkvyiNilbDLflcW2q+OPP6-IKYdG8E4 z0#{-3OmBn_ShgoO>K*SnnFT&Xdytqq3lJe&At z-#)RL?yX~6KIZC0;Iue{B^V@!frWKuyz8vf(6?SI99V-WgqlaJOKZ61*gn(bYTVbG z-yIw4+>{@gX9&u=x10vYTXKVftj>XDtVo{nq#YO;FeNxqk7?R-OR3lbY@}wuypI7O znpdaDQGV6iXsS2LwVBf6LmJoP&W>_jH-c(vypvJ$uun~ILX|aHDBBMwC_SfPNOy_9 zBlQEcx&3IqMOMHKGJ;?073yy^hr6ybgJUkvC=Fds!K}Bb94@6&*C~|>&U0Xo0IJ^L zV!AV{GmCWuP{}*@F+X(-P>CIu1xlEW0#u3^hgdoByRh@3s3YwB45(V}b2*?2Igrc= z-3+K|&uBLkPeRl!s8DJvCZFFVMeN<)b5W)b5hi8>D{(eZVi2!t>zR(7Nje-skr_n` zE(8l>L|*!6?Qo!p!1$Q&hv+jsnUSq@QQoICv{a|uKy^y*Tg(E7YypRizM^>K)p>+Y zmufAB$0a;iq1V3+-FYEMvn+|*_xnNCoZrP^13#r)5Ur)zXCoUYNQ(>4C}(=fBaIL~&w zZZ{CAy}ySk1=fhz2~)muAfPbFMEK!XMg>J@8;D~e$}%y4S# zMf?Ku65KU8J|}1&Sh5TUNAvPWB)_U;utSLCs;!q!*R25R>j8D|92fWa2Hj)dVx9p= z%?|I>ZKCh45dE5i>|6VXSiCb2%ah2Rppi?M7gC9@AS& zSuRU^g|vKk?T5@nU~rBlzDoqA?*bWHyl2*pzNH5P=TAQYbpp*Tli<|*7pU<#~a z9(Ord#d*kCNvpiUV{C4>vTF;I;YIR_*Y!SLSLZ9mIme33f-`JlMM_hc`)&&3wN6LD zcBxN)VYSb!Pj}WV7vO3O;Hn#4ixrzv9AM^_H)SV7wBX2+3VNzt79cg28Z6Nyj}g0} zlIDqX20f|=my2C7}Q+2A-Vp~BH}Kth+KC1y!VWVxlIC!mJ%ouL>EmH zIy}h%r%2) zFkS^Iz6GQ>xYn}ZTppZj*3gd0E{KtN+yxP%&a*gYM2}%+#u7c2=&?kPC3-wpmCWAE zHmam}0(*}qP(=7cig0n&uHve7S68r2wVi_HG=A9H;JWP2`Z#z(<6O+rdiZ`?4|m=* z{^**lZ=AaviYB`~O*T3gvy^kZQxR=dmwNOMB1>~n?^(-&EqJhnc`+T6T|!s$xJzak zJd1NqU#d+E>(6VEEm2VECpKot2_9 zVk_Pqc?DR!8(?wtt?@P|Lrz@*`#ugpQG0f5mzdc+?t(FM@GMRdw3`&P_R6ghT4~p` zS!;x=o24^M=m*@BTRV+(N#eXu5~uMc(TZWcieYVit8<1n?q)`Bw?U%|W^>zTJC#4p5Q9-Tco&JpQmGm$RX&i!CJ?jzr5{XT5bn73lG*t6@{Gk3LPQBHTGoQ6_@{&66t zsgx(bR8iR!ko#6+@tMILi}PV|yHF2BAAbyeJm255mIZ=+uV&PfWBShk1p1k2L#a4j zzEUbqtItqzS~e<(h?z;agF*YsCMsQcMQZ)1>3A?n8~L=98Hiatzi()t#& zU?S#m7wq%m6*c1^-MifFbtN!dJ+XlN>iX9U02t3Wkci*&Ju!e@k1v%rP@cy(NlI`BXZ^uV0g*chU( zId7BxADULdE#gZgLs#)@dh;dKp<7bL^F3%_g&5&UchlA^++t38O!8fk6YX7Atz+;V zT|>|1@T%uBoS^iZL+1LdEm*my!M0aF6lnI+r*0E5;Zz2qkf3Hoyl$HHn}fMa{2i$u zyQ5XqWMCF@3@0dl(Y1!&v)r1@2MWQus4(wvf%KH(S)Gom6cEG0g9R*3cb4X;gDvTd zrwi0t)C^zqMR=+<_UQ%S5M@1}M$mC5!VJZwV(KV)h3Cjg+AX`=lh8IDul&46*~SRcDC)mRR((xlD z<$%h>z-IaN$cU#(64ns3WK^)+g>N7-%j;S_dvouLwgR-c?jbg`5N$wXIK*q#z=4>> z~X$f;IWX*_R4Hhx@CXE@wfV?l9F`!z= z+5%S|^Q{9Rn+YXVEd-CR;K!xgdz#JKur-%aI0OIQ@NQEQu6f3}Gy(~b#k<7(Dd|o_Bdhamr@p*rt)m`;*LmJ!yRj{B)DnOVKFe7cPHk9RJo)PmzR_JsSg6N|N^P#97 zr8kUwuo_TkU}Cus@nTs^Vs%V7HdbEYNl!_Fh>T)*GB8AIV|+Z3+ee~<0fu8BU<+Le z?cA;|_o@3Um&PqzF>Z$qTpfM!M(%ZKyl9Zx8R(+_RNjObvW>VBUOC_ zcOZAV|5a1nnFEF&7*cmq**pbPjgc?3`ogM`)72NrI3HDCz!IdiO{~6@c3jf!SX-Yk&*?UrM*Fry(~ue<6HPYD{cwWfH%SqDviDr- z6OL=JM)R$vH#f+L+7x8Hxd!X~_OrZ;n4QBKvo_y`HBb;s6I4MW)a`*BE2-MzX_tO; z$#v3w2pAjOO!&sEZD+p|II*-BLWSr?!6g%}qj7*eu?2zvL**_*y42!J*6+&90J9Sf zLNHHv3&33zt*RIb2pZ0onL@h%YR?+G$JCUG+E-s^7<}#e^&AKoJ8ra<_nYjNB5kNf zpO!|xhYDwuAiqMjwS1tl*G^q$)}?CxJEPX1Wxi@`On8r2j#%LoXBgS(5HFYYP85Bk z7I70Q9<|P}jy&=d-GBThdim*({w>x6RED+S zj|`?JGHpt3bbzh-s`k`Fs$fdQqwaI=O{5A@PqVlVhx7Hqy@D?C9%fLP4G*clo9c+w z&_*4_9d}v{EtAb^Xw<%0OS`zyx$gr&6cPrnrjNWj#q z=|!ctye_&#rA*Tz+d54wjh8*ODyC2FYHR4S zX*PYXPVOq;1~id3;eO)8R>~<$`zYmrKy7ZF;*m8=(3G=ryWQ znAp`T?%>3~qBVu#K?Q`gHAQFAzxo-NOq*UX^J+A(0xcrj#MQW)n0JGs<6a@S7<%p$ zvdQ3B&HXa8uHcKvByg8TnsjLmfmjt%Cj25JMJhO?fI0eE0GQA{4%bkBxRJJo0Ft%5 z6g(Z_5c90HJ8~RAAl0jA$b;@kfKQk;i6D?x2RmWdq1G#~YmVUR)$-_u*Z4w=;${F;iyo*1^DUeZ*`#gO?m4*;%fG@v+Bs#a!) zS#A`Y)>DN-z2LVkEwkDn^9&Jd!evC$l|7cb;s$_lS?CvaZoa#fN{-aJ7DJu`I#?1y zm5bO0@aJivcQ{Gg5N;htg3DSB2KKfj8X5tt9g>SH)Z9stST^#GJBL?6&9NC1$=wN45K zmlOzbIBGSQb5o-bi?ZITQ~Cy1b=&gX5t^6yvTo#}=cgo8@kn%bG{l- zv%e8)4_g(q>J4aBGdO0rcyxE>(S`1eWmb<4%Pb3A>zX6~2VPap)5XO6`+IJZczx$+ zISii3(Q?IDpGgl)RKa8`@-RKx%P1u%pKP}PPS7%is47$*sE5cLHb2T{9-X3~P)}+W zHSMZeNlaQ2GLIoQVv3$rzAKFi zMRgP`17Tw#(WH)(vl+wJ)o7oge#PoypQiH6;T7=Wrgn*GyN5&Ga|t1N^qfeUQlkB8 zkGu&*r@lNnZIQ&YCDCQHi(R@syVSTmj5|s=G~?90{RNpR?NQ{~s_vEFn8B;WX3`Y0 zA##DVRVTSe;&eFFK$K{S6#NQV0n|jzl4@)N8ZnzlV&VJIK1yq!RK|Ntt;?l5CawS{ zcuE0IUh11sd)TT}XlzlT(Kdre1r#%Xb7sEnJS$n?%Jpz%J9Lg2zCv)?j-G){Onwqy zY^hE;Yb<%0I8yd@9asv@+FqWDs-Xv)C61r?&qJseE<6AZwpiY^2_dz-@eXw`10#- z)!(WI`SZV~+Wr0C^FQLxIFGE~b+bP1B-Ol7Z8gk)OVl;yL^ErJard+sxZU@8P=66a z{oncOpF0fmufOhoBV_a2w`Uh<<|Bz}-_^*=LO@9kF1>hYrg-%tM!SDd013T19&b98cLVQmU! zZe(v_Y6>whATS_rVrmLJJTFXTZfA68AU82GGcQJIY;tA*^$>9u(PxX*eG~O5i5=AX`RXuffvAby-R`Jh)E&nr`J$iBe$TiNFj}AZFBy;2F z=_kA@cA@<{M;BVW;fF`PmSp$%ZCe!3%ni@&| z?8))5@#59XN49Cn>BWCNtN7PJ7}}<1oX;K|{^S_8Yq|x^%SYmG&c}})KYwDJf7%?1 zOwS6-VM7id$eGHC#v3$z$FyyZ$f!*uFoPf{hZpVPu))KuJ!}`GtKl2`^t3(fn6cxR z!zq3`Zx6d>Xt{b%m*^>sNce0kHX{x`MuZ6-&M^3lgrx|IPg(>gHbYJXM#YzUOh`&J z6P{=K91{!@jFl#X?2LJO*&g=VhNPsV0f<~)3yiLBF#wFCF}}cnUr8v%ASHC{*mO7v zhxtOugrY<<;X1sXF}nUd$j%rEhneBUea6xXT?rwLZWQrG%!t6)_%p3YqZp}qJo)*h z@qdQM(p$OOk-7Rh&u_A4hlf|o6P-tWXV>oBZBgPHJ_-STxrtD#iiD7MzD-MS9ueVstnrk+d zH>wmSvQ0Caot$?pLVcOoj*cetJY8NUqxATgT4CCjTO=pn^NYoSOipf5h!($Z! z?N2nVk&lfMt+AG0g;EJW8vmZm$IlF*2JsW6ia2&e;TKo}Ua1SarHda+CT+?(%2HO% zQ%K*(g*Q}YXn6z~ znP%-luZ`}2SZsGm<;RRvD81x>_L3OWOK7mVxT>p*cr8-5le?t_y-Ksua&nVT7IPg# za*E>X4h%_6LmCpI@Cq6dv<9TD5g6;QEm(gd1A()`JPr*++aE~f6hn-1_S7E)B)RG!z~p@EJ$t3?$jwN1x`>^gVnZz zqp))M+x2mTj+BZtJ-S*;|CUTwY4*%GJ)30tk+cT+E84$p-w~$ZTSF3_oJCEt9Z`c2 zPyZV=eV|n~!9_D%i}y~VI_X7-Ok&}oF{qz6- zH7h%iHc=UiPD$d}dW($Ew#5#%IF7%qG9GS~p|nsc0c|jIs@AF4HU<|OK`eKG+LmMe zwf$2F;}npD4b>0src$O9FJQbvFD;gb-={fk-O?0y~X zq#;%&s#VBozB>|URczzHcfIQU^0#H(11#&L7D^?cbXLAS5^K3J-WC&j;?4Vk@B7t@ z(%sf|_qsCacytUO{kBu5=I20Zw^XiXM5x|9y}kI9j&fl_Y9}#iJ+AEb4Bkbo<{@|7 zhMw?COyX^u#CpLFw;+B(;TVQol$g=0mPQk?I!HQIGFw-I^1IHGQO-?m0STqP)#Q0f4LMAuz!Ba&?lTA@Kv0fvs>Z)fzw z>>>KCJ!tC{TT7kW|@wXTwG5Ebm}_&4jR8|b4Cx6es)5t? ze?t!K2tIiMML}saZ7NkMLDOfe=EG^GRGcR{I!J1}u{eSe3Z@5T$zqyvmR6Pw7y>9U zpvA#}vmr2G_Rqb2TN*H*^j@S6KDR1VM=RBLB1WnAd~Q`RP_xz@?c(~(lL~i}#r%Dm zWccJ$=@YR%tf`@VLd`<@1S0Tt*>-RHy{Cgu1Kz?zQF_0kAAC$px*};ye&{o{w4V(Y z$#^Z2PHyv5J*xH;WX3-Xu?9?+(yKGdksU$&APUW(#>U^inr;2^vmSDN({FD$s)t2O zX!{zW=5TBV&Q^+V3>S;+ux)GP(@Wy%a6O!1*6N$`3JgjJwl4E?Eb-DE!}AXePenvd zMN=t)bih$L!BplLrxhNawTC^=bmCSt=%WNig*oxGXGV6*iAeic;K>S0!ZEX zvA7vvt(yb&i~4Un^Qxy-5$D%wb?I?39~Sjr_|(T#lR35&D+DC8M~EvO|bne2EkJ4Mk;{RjZ*};h|>)N00ZC6Aat3@8Q&geRgCJY=p-Q| z(RE#y_fCe&7s7TOGmP~Nq~uXCLh~2|ymvBGF13JClxQZRfKN3HP$o=&K} zz*Lx6!B{gBE0{!9ebAsgPdNv#UW?darRxvtpDO z(eOnY@C{4KOgb1Q;V{$H$5M zFqP=VjFK!hzD)A#jkb-P^y3p_v6L+s<6Q5jSC)E?d;88fR-MoEmn{!_0LBQYZ3 zbBmng{w4mZDA7!~!QjBoWV~U`$hun;bcJrQGl2DlVg2Tc2}y}&BKGB>R>;IdHk2z7 zB%h=Rp89GZ7UARLL92YtZi!@pW-|2nn8S2SG?|c;XeNsKJicG2(Q|CY2+5=G*t|A} zy=NNM=&rjec9*XGz~f^R(~D+I;ZACK#V093U|Djxwzpy7fBij^QUG1@TN>uI$7`C8 zPqg}OO3aQ$Psk@NMh$w+KShaVA`AxyQ_b#`q(n1Ol-l9I8lrCAh^a^_k?jm#95L?B z_!QIJ(yPUk7_@|5%q#OwUS=ptH51(p6tye#vpCLmD7T!X^HC~$A7Wcdxl<)IM$;tA zjOpZJnJjNj&;kkS&#Mulea0?3Y~u!_dM272V%_d>dwp1bWNMsUw)+I-SKT&ulBmKT zn#DtAk$S_0Ec{6k%DW1o2zTPNiW13$V>_}^8iM29?Cg?^&^&sMTzo(t@AY-NrU;Tx zT7<}#DF}+dxXiHqWsHQnja(rHDWU6HG6g{i84(y`XH-0_Xl9-!Vnt~B_3l}{7bps& z8otit>8tO5fovFs>OD&tA=Uq)8P&zO|5>bzQSs|!JT^wFEMLsZy``CW6(N#xcAMqt z%(%EUmg&``_*op_Fm4yCrLp)jH@5F!HIm%O@?@DCs~eEL9V-Hb$$yBol4Uy8E`niw z>1HM=+1S3c&J;&cFpI-h?3!yP$q30~9GG6r@yIa2bl~+G^okLZN87b|RWmr=>#H2b zj`SLNN=h1lSiDta0Qh=$AnRoa1psRc7JYzf6|E*sWQAErY_ zuwly*M(%n8u22A}8!rs_P{LTiu(Cq0|EBmPMeuD=1u`NqJTgsq&F!g@5t>I|Bcq*S zJNrQJ*x2;5#|dwb_uUdlt%_kM)U*6MX>2IlAk8MUY~F0{^avt&Y2s+rh4M|^lL?l)PlG~IF)czFJ5{Y$U>C4K1F_vPwT zt}5lncd3=6Ck{;?xPIdTFm)8SA?^B`81+zrU+8UVq%mA9G~IAZpUvUMLDCyyI9M-J zukmn|5rh<_5Umd&iK-6^_=X@7oA$Ovc1SQI;BnVSVXF&KBqKGCo7z_Ycm8Tqy#ZFQ zI>~CjIXUmVqt)>&UcF|U|IqZTP!F6FVptmeW=zHUQ+$#N6rTrXMWCp7Ybv*cOfan~ z>!``2jshdBK=m@G{<^@pQ;lxq@fdu-ibydAj1y0=jW8ZE#ZNPn|4B?PPmOB{Hr6sg zg)nJ=zB-on@CK+D*~I_@3mRac+Ls^B-=DsD4U$6~b$>`1-oW3!6|Q-U6u#;NU9E)g zlYQOH35s_;v>c3s)}e|A68|g*aa(`$Aj`- zyEo_EF6enZFCoL8a^CQil7yZ_II#sPu}$VVa1$s}e=X%ri{3@15XZ_;#mf0=c0qpz zsI+J()_q+E3U4ga`FMz8ekZtaunbkO{1scZJO$W+)vx!I9X4!UF`y?fj(DMpcq_)} zk;Kpd?#d%}kr>CVFx2!2B=f#|#4d2*pcty4c=i^RTE63SV+Frb2S0WB3<3li$Y0`4yWoK%W)y3>69Q!4-DwB7VjOQ{6>ndiygdE+ z`B}F^1y=nXw>Dh(@>Y1){Y&^LD%gI8NIyqJ&l;{+3Z{o8j^we5G0Al^`}+jW76=ZoCtgILybso*P3b_uP$lf(vJXSY?5q&fY!;OQ*o|yTSSi zw%z(?MZyys-~VhbtV;Iu@W5FhR$1V3x=7H<3Ic*Y#N0nAYFr&%dD9MX*cJ}+wx!vL zfQan7KkWnZ>iEJ&<#GrxnERkxLFRJWZQ&p*5qyG@>ob1dWZGFeUY zr$$z7U&xGcVZHLmO9DP=5Qv{8recfPCZ<1>;;l!-28L=Mz{Y0*)HK@{$ckM7n8fQA z3A=G!|FSh2n1Q{$@v-r&ZQ9!}@#)cPIQk3Z>a0C#nc?;pC@DONi|xog*ASQIZ5oX| z79Zf~JCeUjZDwoKZyfP@(|)#CN^Ng0qUoMfbnDTlkZyIbLPA5LCcX?2F{oWYt=>}n zSzFdDsn85~@>(p&z!)-+!qH0z5H|J|9G$jCg-*Bkf6{cd)TW>zQFHBxMJ+>$!Jy#? zF@b_(NHJ)5=0E!j1hJ^E+={y3_AGhp#sDM5s9<9mE}G(>7A>&Zu!-4QK=$g}wC%1C z1QHw-Ak#p59l72z-R=m?H3Af_1cF&xD_KP|N-RYGdZbv)Klt28M8v}2Z7 zMrt$*c4!=LaHzmhu;yN{NOK?hECx7K;N=aDwDotjQKDP+8zews(Js!x}3O$*k!TS2jf^$+P+mef6C{*5}uQU$Vi1f`lFRH1>O`1mjMV0||#31ofehTxqPOB5#_BbEkmY8sk?%~Lq1M2y=7 zWKY*tEYRHf9?RXLx0`+H?Pe&{B4eo!J$qde`&KA!@_-UUKY~dJh9sEHp_c0py9wTF zu|Tg%y+*zjx34YcS-xBq1>=`VQF9i>WwOc_vm~DsCFk^3j9*T!R^t1-my6}P@|49X z_yBj@?7VFQh-w;WPB2q!l$TUfP<=xXa)t~Gat7lUsy&doLR*4Z40I5Q6p5jzkzxkK zFKx~m@6ur!7`(Vp{L!ojv8+=N>x1hgMTDjwdn|nzAfU#PR-xt2+JnT#*PUrXHQ&$T z01l#9R?NQ*bgc3i#7#OMiyLbf>W=xF<>Dq? z=C?*N9~-kYzg~=uWty*+q2?C?aS|r(rcW8H-mBH6sxfgY@s7U6#Dm+p!GwB z`mYROklQE-67l3whq4t-yE-QSEPn zkY?X5YyIA`6Dx7idcouRr>cD$SEo`15Pa0ONfEq>!tq1P5EM0aaS|0^WJPy$G@0k=@-i8v z$H!E0X1lKV?1UY;)s<)4avzl(x=jv!oxw?KaP7Zy>cLj-b18dDsYkahaXlE;W0z>w z1kE}^gOHzN1kiES1S)i(Q~--~b(-PyEKM$d6aCEhX||YtrcXB5t}Q;8;#hu{UQdB` z&Y*Unzz|2Mf#2Fs+IrJYfheo~qP%YpI+~AWXm9~pLc)CRZHLRs)C#juR-qe6JZW`5 z8l|;;eEdF5#&74-Tk&^Cqw8dO{PD@Navuk2incFJ(d#^<`eVttO*u)uF7XBDp4(m( zg%+M3-#-YC+MuiH;NeDiMDa726|&R(j&0k42FM9djKL$G@JK8?I|U)S1rWijC~ta; z37I`YCW>xxxbDplyx#B_@zeaqX8X}+#9*rl5L&dec`oD2&@14Xw@=6(df%dvSFHng z9X|8|pE~U;_Ndi0RHi<@ILVChVzip2^St=Mm@jf;ncghZO#C7-MvK|aG|f|EI>~ae zx4vwI{bO+D&ld*>$F^-_qKTawO>En?ZF^$dwrz7_+qO2p|MTo_ZS9MFb8)Ks)U9vT z?d}gwp91NK&ktx8o`rMujy&b9@ z4up$BU0toMs3Y0?9hkN?v!(KU+c%x&#hMMqxWVQkKFA+gU=n%*?C| zp%0q)<@OULb8Wi2ojcS1nRc=2Rt2mPt;@6_oI+riA+@OF$sxsjonZrF&YaUUc9Gl$ zjaL_YlkwK9GU~A*_ z6Li$%{4YxMKUq;hn?c&x$Xs8@)=l$2nUS57`4=M*8`ICLHiMG8o$*g5Q)31}8ynl7 ziR}MP)c#Q!|4(J|zx@ACWs-%3ot^RjLz=wk8jB&Fh-d9wRl* z9iq(3Ap&+Ti*K7{$Xz-q`6j)7i7b+fMf{l(w0{dv{$(}+#B=PG^s+vhn{*H@kIq-rp5O$(r0IVk^D{gX3t+eK+t`;V^~QNVozv{?FOU2=1A-{pL9{;lkW1a zA7-dC#m~no)$)FSm-4+*)$v(#c-rHdx~cos`hL!g_w{Z!?`Fu)P&1nXbJOnq5O}-( zcs?+D{z5rZ@?nVi{Mib->4Oqw9>z4qjdf2?ygXKS&R=w$oh{NMuzmDs3;PC*)KAwT zS&9ohH2^crm`LejRr|%C@|uu>-C-ds z1m4tJ@pxDOhXNKW+AV?6mJ#w%HETzI&QRgpZM8aEmnDrGu|7ZU64P)o>_NMX?fiCA zb#9CUBm{~^y11Y1Jknba=?&7#VBI8%|4Uv{7)MsXAB!is2R4rv{4N;Af%(H6p4E`a z3h{|lcqgNipcKs?e>*5{0Jfmr$ur|&?yG|U{P*QW2Q_%OcfqWzI+ ze8l|B4XymKUNJ~_rsJHsIJg)nxdt9^yBd^*ii1tT`2jt!Yl&(`1=J=i;KF$~t5<>p zhqn%fyrj8mDfnX|!QW1C-#ZIJroFCx9e6v34y9vHWUtI(#3!O?Yv!5AI&{QpgB)7P zkg-)CFrrlVCbc9Q0A}i?tanOK(!=&Uba|jWJ;&&0IkHAh&JBWu1Zpo15`zen7I6b% z3*TW**r;@%Uw^X78w}x%OjW?EHD!LLa-&n!;e*BoHxVhfAVpKkM}m#`F6XbxH9pY+ z&QsQY%_VF>FT#xh?zW?%Tu`Abw(^n@$38@IUj0=1MO8j3Z!_LJWjkOdsHP=TtF{qq zOT2*9CLzRWl)P;bPNp#)rD_v)?o+4Hf0 zRvnNcF|25KZ4!8eZ2KFq`_YYJ{kXB1bjUpXiQ_9Cy`rSoupL;vfVpXUpmu20f|i*~amyDb-{pt{M!(98-vjMIf=D)R+v_%(b`T%dHCV6k1Fn61gDpguhl zQBD>QoTDCa0x1LRlMoZN&uW5>P`DPoEW2I=ma_)_iTnz9W%+gImgjyoMEG7y zIHJvc(P4?}MiP|3jt-(+5*oIclr9B-$__5Uze@L(zWAs=*>YwLDgN?Xod2qx2q;^1 zTEhzjf+7gggv3}gNK}IcXevUSGPhQo%p15_N&o#6j3ZtI^o**ZDYsZ??`SaRKvAxb z?{reS-*V3)NKPo5EQ)~S4_ZB1_@L3#OA16fR6B0Q<47IlpAnOxVkCK$2MT2jE?GPz z`6y2~y);N8v{g2O_^_ozdus#5OQ&S?<71`p$zle~iRWL*zCv__J%hvL^Y?J`Dtg?& z;}JnzRxMVI7bywjm;~o<^buj!{pjPK4hDD2kD4S0V+-Q%h8}$FH+2Cw*us2X%tiqq z_H5X?B7Bu#Yk+-AF4Z{Ne9{{UyN`9Csv?vuVDNHkH1R|BJO$d(0I-BK`-8o#3>nX6 z96wmk;dRQWZL-CwSZ(Csv3KW&G468KV_NC=3^)}wQo>eiz!EG`?O9T8Wj8J1JZ5pg z$by~@XdM{UKfxnj5JPx2MW$dd8)kw>45x@znH3243@zk7a!yZuVA9kO9tKPitkXBC zVIo(tt0*t|Q8swryN>a{ruqpRwnDp1T7aa# zJ0KoS9s^9Y3*xva31F3ff(-~{ARYoDDt;ccv0dHQ_>wZZ z0Jk(oL~+O+=MCef?2(VE@I44R;vovFz4tEbmJ*FoSaNO~_ne?0D#JqKvI-Fwh!P4e9wGvSEn5Pls zdM#Z6eD}V%Y}2qT?dF7?cjR^}4=D(CH;B60Znc9-2Vi5Nc*jLi%0Tq{6%+QlEH2sR zkuubL^X97G$@)CNw;4fi)gSnI*M5<^C3~8ea&U6MA8Wa03pD&IDD_6`Q7l;J0oR++ z9JCisObXcYlBE!dCtp+6uW{W1mE_#nG5*c8eud2=ibOr-dUPdmz0%#{xII|MQTeuN z*ss}MBs5`i+Q`60mGQ_9_Ob&d*g+boHrPHDnRdM9I!S(vYe|4F@jA%b9*9$dLtQ^bI&K<46 zImun%3Knu1 zQcWO``m;vW&CU)T>G1coAXUoNAD?_*rjAA44ES?Wp2KC56IA+1Z~%NNve8Ef8pJgM zWzZ;&sGE}0-$BKSxilsN30ADB>YuAz$}cOEkCK zQ@sPFfK5T(N^?-Qx|!+biO{zbxf{H4O5iy$%13$i<+#+fJU$w;Um0o2zn8?65h5cl zaLI;%U|cmAq&;1byBcRGOPQCa9_Dx9Y(9&o%`7uF|`)uGTDs+tgip~2)lr4qnJQ!ntnnkx)6smbD+!jLg^1z z9;8?gUt+>bh3J4t@cKpUw0vN=YIJ_r5-_SIU%gVRq{y9Ai9Swv^!pLFPsOX>o2`E< z40uT5sF;vmo2wCmwLb2LR}9k`%wFA7)9S0p%4=VX;=%^L$%KX*H{QNLL?o=n-W zbpRSx17NC?`Fk{cN)6NzJ~_2hU~7I~3~|0$FVMGNT2B&I!|`M?BU%4(7TZX^Z5z5} ze#tVOq6Z?S7+BP5;xvUTQff9-D9>n>MeCte{~#t5Hj(2Z@@eA8z4-zr=4mGKOotQ3 zS&_w780Wc^RXlPQ_aaQ>l(oz-xH@)RK4w{&KGqm_`rPjMeofizx%Byb|6Vlycq2@_ zg)NzQsT$sP$!lW?Fp4SQE01m4F#0?AmkaNHp_$nyBZMjOmOIr+dstS-SqHl(Y2(*E z!=UdP)@K)vb5~SO$}O#Y|HMlY>;tn82^r$6rq1xp#EU!MiuYllJ2pSVe#_mtZqCxJqKmT^U1f`c%9qov=^(!oG#Rza2M2n4eRUf>TNK@jX{8iXZ5 zrYrtbNsqy1ebCaUQ`A1-v`LSO31LFsYL1Kv?PlOTqW}8U(y(bw1tyQMqW)nao_M`@ zvm~(&*2|%E{%AL@8TR9cX`lF`EDe_riGH^zj6legBY0pQERaK8Y(p=NI8`f{g@P;? zSTUgE1GVC}Re3fmdE}~8b~P>1KN!-$v^5#+kmJngTQZU2utIe~%QwwGJDy^(h&&du)4rn?wxCQb+R_w$iu8Fv<* zu9ujFNZSB>mgKkOeC)nm&o1@#v+zlB;h(}?9=0V_{V-0jzqyML-7=KTm%UMIyi_u< zgg+Gm(BPMV)Rm;U zxC7AN02oY;qsRmsoH|mm)ca={@Oc`3V;Ib9V`!=#2#z@~c=3uJKiM$G(x%E>(%Igy z*W0PQK?oqV^bfoX!aWJTL}e7cUiv{LAcsqHUCnRb@z_<<=sKg4j{du0__zmjCk=hK z>r4XobWNeNC>QAR*vWH6FC^+A_AH_~)OiScl zC`r9449coM>>d&6{}lw(~R z)yf4#bm3J8o%wmuukeR~IV`oq*U*ml3I0s$(AUB?v*O$amY}@D*^YH6K=$<)>+4nD zKP_0FshD51=|L(%qa1MEQ*62{;KZv;Aiej_{d@h11q-3J8z?yDxE7Iq5T%fxOue-o z-JSJ`4U3H;grp_`#&`l3d;e5>GCEL^bj8F?nREQoQO=qx*oXg_uH}NX1bQ0;83Jhr z`J|n7h1XV+400t$AQ9b50Rq7T(o`Ha(OSa$z((S^44JmA50$OaO>>$o#7!$Tc8j2J z0o46{t?NbZJlNRsC0HQ_#7|~UKa{S5X0;JriqwhKV7ea8Ko$1ic=UR1EoM4MKg|+t z0(a3kFn<>f7r_-Qv~%9e7A1sZZ)QI#Z@wff8b>9_{&sw{=;O8DGa88DaKEulOO2F7 zd|t65h0xwpJN3)h8btkAqDtulxLdKceX=XEpnuz8o{4DV3Wo2%e3lvvybbWl7Nss> zCi21AWH_xKn6Dqu*Y4*&5ZefVIp@FE1|A{M0L0kP-Cx`PQ43J>sv$n*erlHEitdq% z7{*iKifdZ?$S~MYWeAKx5CJmjtVh`~ZQDz$7U1Ds&CD2akhJALNkp7$4=bmGTVInS z`ix*5hI;&S54K4JV@|KkEI3-I*MGdI`3ex;`yS3lLs8~_&?(AV3Te^mOF9H9CCB2X zp49sC5GelQ?{*Qy=^82BE>z}0?e+FxB3kp3D3eXc!8o-@6R3A8Q%RFPZ9czdYFehN z{y4j-bg}*}zQD9ixZ{vkzz{OvFlb@GsOiY`o=bjsZ(JLY;uwi((7JqLGvQNJ-K_C|C0Z~TQDBwn|g3Jds^MjJG@M= zg9rFy->j~Td;#cG&|lD_C5I;l5mGLQg%KfT@is^i4G`uGMI9k9boph;-E|%_;pG(A zsC$#nHxk#Xb>AncUq3{M_@zlB$8#NZCuBCDKzxL05EILxxLhE6}cIK0h z_PK+7FDn$AS0;7NjK}bLy@R*hvH7wN$K21*q7axxg%p03!5S7)?}Vn-d^|@*P8TQx zUM*1op|823SFKwt&-&IjIY3GFOb*t*8O*Ew%_H>8@`TRRy=pj2%o!7&m}jf_t!`Z@ zHW|P_Y7A-^<3L4ciyG`_R+SO2!P?taJ3fAfjT<}!d_obJLGCH*_NtDA=+@sJON;?T zDJlmKrL>pv>A8iP9vYEieV_fi4<+lgJ?q@%_{0VF31@b?3w`MP7naF#x>>-v5#g!P zqwlqo7s4(ieU72c>qqRi6Ra&3rgPV}>^VGUsjf{QnU>i`3#8m~@pOxHvH?y}j^)4==ikWBl_2+) z>rnF*`k8yDjh`muj3Le2kc!o7KKml3&7V3{=gdCq=PxDHnztimkImbft6?plUvdS- z{xBNlEuT-#+gnfX_8qcr>$b`y>tMWc@6fjIm)1R9mn~XFc;gq+?VW#8{x|LyW#Pbm z^EP6~X!Pw6pd}~&Cr=$D(m^fcxft)&M3jrA=xpMHwlw34& z#O^7tzgTVNUnE4X5pixXZXl80u$Wxq$G-sqRFwYPL`2+)bE}c9%*Nt@51}8EyFk$R znRiy>Y1Wn>)=@ImRWuTPri_{qAH<*s2tjd6bV~REk})y<(uSWH^!Vzic}~Qhn)>?? z6)G&4atXWG80ro-qKye{%d&3e_gfi{e0s z6%>GpIHH=p+&r0TB!|0o28zRE1aj|5=n$!aU_d&9`h?b#jtLyxZ0RD50R&kjAcZS zowM8F+HK0WNk+oO4pBN%H?W#_F~FGTgXXFaeWA+frA7we>`ziv;bfZ00WZ$=4;#QZ z>_%wSnD~+j?2WrXfluS!)bF#RH^9M(i+@EV(wV3C^%!}}R}6_~XH(4UHz+0GECq@O zp{odlXQ3EP_QHY-S!GDXEquuZY+x*$Kb`Z85Buy^na^wl(WqTgELOQX*6*(R@2L!W zQw~+FeyiCB{=jk@e>1MblTju~KL$O6JJt9pQ*WHH{)PKF=UDWh86uRuzr=t47AncN z{8ju+v|%@C6pFb3qP{A$fg}+0Z<-xdnw+Q74?$y9>9St+RWyDOdUAgkP6a7@D4QJv z1&?LuOOse$@U!u8im(StO?LgDA6= z4UCyTREWiERWnG7l`wm%S7od8e^kf@(&8Jc1lM^H8OsT`-P~iEm0)#@7Pi`$a8>95 zSx?2mar+m7ntuH^#uyz=BVyh~uEQozQlQmpc3&f}j0Rysqs(9KX@U`rd!NxuoL{^Q z-~2XkZAqY5)dV)@=mZs~Ted%qF7+TCzqk0N<(A0?aTej611MP*L!AKca7@me^;!eK zSYl@~N_ZU(xiB~r@~fB(3LcfYxvXAFJ5toK8Ag}|hD>&r`WZNN?o|5*;PtLdleY`DIZkvY=>y>k-I^%k-zD01N`}!VP z&%<)Z-p!ZIs)lYC7I2YnW*iTNG2Oe#14FWcY`hfQirGrCy2U%^sWTts;qAiyWiKSI zuBi(R$z^BrxQFkvD#k=-8}7xppSD$fVjgNKibEoqbcX}_JRu5*h9Y;eOGj4pj*rYK zvf4)uc{LQ2{I*yxU#Kc=T1Hrr^mDLzqoz7gLuydQ#GV+9_c$rBiu=qE3&@_FNtfim z3@umpayt5rFX*e!Osnj$L!W5Vp*qx05GIA}>oX6nX|#qpA98Xk)|Cj>isvCF@)k50 z{T>t?MBhmwo*X@Xv};7+j5y317HdTyko;xp{;~Eoy7#e~5CsApnC6Y?*GHzAb7R$M z2Tf1^;5>Eq{nhre#wufmY5QE6eZH;Xo-L`3O?l%yIfBIDQXqpJDn{0_?6bj&4~dlX zy9@e#gtE&LR~N_fsOSq(u){>Ozz&5*Etd;3xA0jzNVfmAyU;-8UO^+V#6 z0gVx{=TqrAi>#E;4ckHs9fG@~vJD-A`U$_3&_vC$yRwo?5BJd=c8|>oz|V)DVTt5d zNyDSccN<5;jv1)g?(X6Yh^G!hTs#bjueFgICyeUivj!J)oS%%~?9`?Awi$)Q{9>ZH#0VJM_<`6>y7{6e)tn z5Ji2-A0)&fTxgP?2aN!x3V28akt|p9_yLKcxRor?QaKM4XnkHlfql)Q>eLOG;*$=HH0I(=LcHt9MPM z)*oq0CUOo8sOKtUfR?O*jA0H66IrpHeS0eg6O>TCs||VsYWAL>82fQF3!6$BgS-_E zAT`w9`lWjR1CMHF6EdjNah^d%K4%TKDEk;h8s48@kt}YL) zs%8JmV$U9Dq8|(yYCS6iK}s+0P*OmVs7L@rrPXN`sNzy5?i-}FS~8;KVLCbBy8#jH z>-SKN?i}QoyD~C+{NF~}FW5vdf(UyZ^nuG~xtkTI^ZQ7v+Q9@j5@`J+9`cbnq`!Y+ z(Mqmy;gLCL9bqiSMUBC5Q?_>WQTUDSwc#rfNj{o>JuVC_!fUUf9lO6za%^An++;`2 z&qNBO;PmaynWg=G3Ir8k6grMq|DA6`;?Bz(T;Cq^R9^-btQc;fm;p?~N@65AMMJ!T z1U0A~{`r+W&e(;)vW^jLD@lLf4%unxs{E|ih+hmr0h;v=!WGXD3UAQ80aIH%$(2vB zadVRHRT|eLs9joiGG|=p!Q0My)y)ZJ$Vj*1@o0g4WMz%$KV-QK*h7 z&zk-pIl2HnbaRSDgaIOMFLR5Q8WA<(kZKX2d9JN-@yl4^3l~H5D7@X_j}MXwg<*W! zSi>*`)D#5Ed0+KEL=h77FLo-vo(r0+j$Z@n0C9*xc|d&PDft{ z;MyLbP0a55xE#lDyUK98+W6zMpRMUhwcQo7Mdy`CTdrHP51{{`9PDbAE%4({*S>ee z@+Ng?+&S1txBh>mhKv?WGPm^BlTjU)Svm(S*AE7l4=8leDK?5pTWX!=HXQ0zpA*pL zsk_D1n0CEK#h9}lZz!bmp{cf>nGcF4?}i$I|sWwcZ{iPb&P*Q`fwu< z`UTns^7VHZ>WkUNfULb2|Gy{z5ejhm@&MOHDfBO4Bk@#ETagA|ge*#k z33a}bXC~1JolHXxEtBP~;cBU~Rb=QiLy`zAc?lj4xY~0+omNMOWDoCnkf1KrF@aJ$ zsoR~-0*6gKtAOaxA};PujVlA`n6WqXA)wy7LtAujZBSqifV$04eNSHG8 zbHQ=T0^t91%}Y=JP@^Ei13V!F?~ae&l&_$Ik2-Tx;jozG!4!y#R0Zu*Ps@#z=99ks z+>QAI^UpvEb1|yS@#`iUy$20g+CO+yxlvQkG|e!bRk6tfXdeo6*v}E)d6EoNj-5)v zcOf^;-!`(22zyR3+RQelCg^cgg0*tXpw~5KHtQc)v0boztXby*GH<1%peyqxB5At`w?uK>S) zJ?pEv`3Oku#4{9rrB>23g$*d?;w0oWKN7F~j>nl9x6TT~Fc}J4&isCRx5N3XuRhW=GVl=zXlXy)UXN0DvFJ~Be@fjTmuf4AiCCe z|LZx#EJF|ip zh0DB>%zhT*zR9Y%I*~r@V-D&SY(a$>Js$iA9q`?7A3Q5?Wd_=BZyYbbD>R*EPmRVV|8LxN&c>&9F$-md*9hK@4ay#PG^6OUS=XmU4BX%d2$*n2I9F~C< z$$~b>6B>ft;PQ??|IGWo_8Rs6J5(ntfbmn%lVA8&7U^|J(37J`mk}A=CR!$ZR$rjt z_T#3v`6aM~(uj{ewv-X6yA|a7-}o)iKn+T73CB%opjxm9n-@$~9N__tjulilN=vIF z^v12*BR$uZnd>}CD;|W>Q;sAB;!;CiLk>;7>n{&2QMc1mRkukCWG<(c|7<0!#Xsvt ztg_+w!df>))l@2nGKPekcZW%@|}U72*;` z77NHhu6s@+Ct#nXhhl<@mcy8p**#y#<>u~2yoqz_k<}VGUA6k2Tsam9*Im)rM6nO@ z*3kvp_&BPIdJm>`k{NA?#I)((LL^yOm7oT*8dIz_1f!y68)a4GKaHn7Ji}*_ODFcb z;Kk*C?~MEcghysh7MIR6eTpF91G{ znI+)ciXq_OXGEx&?SKpOm9XT!H0HuY_qCkjNrPsC%AV>+7Vr8`ud6q&C~w4Sx1cgG5hRo5bg~^4;0`iXrXHS?L3zaY{Z4nyx4t2{7Tc0i!V9Ly9~v8?n0x6 zOU6x757byQMiG+Mg{dqXQ_f8d*tNEWAJ_n%Ws`Mim)%tSNy4Xjm$7l;f?u#sa;O$F z!j14dBnEWinyzbN(I2uOe_e=mp;|reZ`%B-z?nZQBO(F6|%xp0eFj zvBCTCY@vZAmn7!2HV3~LM{F1LC6DPvq{Hy=EiF|mZ036;RHi)}ek^PzhJOQm@|4f? zO&!~RPu}&KIjdQE>jsL7=fQQfvMebi|wi#?I zz+dTKvI8QPW(hH=6XY5lF4fadoPvbES9wfF8#1h9_&J_Wo&HYgw*?L`Pap)Hh9xc$ z2HHDk;SApX2I%}jJok87un^sfy~J{Tr*8hV|2suLfTdwYAk}737mk^=YS5r=Z~G>v z%;^BMRcf+0(3Jgvk+EfPk2-Qi&(<|`w2z_ogppzKX@TlA^C;3&2(}=*X)~Z{b#)K5 zWw3DG#&68)YFl?o&!#OS9(qjAM(7f+`MCiLAF*Y4FZOrI;h-y%od^xw;!ZoHLu(;< zcn_74k(dYWjeMP?@U_6tM5GW^E*Dl+@Ntm|suY5<-b~;ktBiQ`fBp)EN>tDYX5TX; z!X)+`W3m7FE1);p;>D#*VtvhX!_V^7eeq6@bFeNq&`8E3whG6Ej>ADoBJ5*<>F#qi zH94@g?G=5FtXep%2Zta4TE`y`yYuO;u#BvD=zfU!;Y) z^5_-y?|e3`?qV#aUL_X3hUzmWFg9#y?CJ)Qh?AJopU|*q;!w^w@PM^*Mk<3^V+Z?2 z%TXcqD*K8P@S&~inWK~8YSu^VvW%;%RkuTRcvF$8RE5`n{Jgg59~qHU2C0@~7OM6E zz$F2?IN0ExDAaJV4Hd<*UDSadiV^{1H~T>Y>6A+2SS7T}CXpM0hZ?s!oJcbaxcoUY7++Q2@X9kr zUfCE_r$bPHmE~lm6$LN}HZhWsI)0c>JXaB=z;t|?c!cBzrF${0jXW!_{?d$f=SZlwS;1;MSQ2ikTt2YZ3BV2E;aHVtaN4Sax?1L@Rb$$FsR6#4}zm* zpPO8N*GRY)v5XOM`CP!g4e?q>@ChnLeskT!gM;44p=WR2e*H zCI~>)Ut002G2jgZ>9vQNaI36W#Bzjq#RVN};+d+kiZ1yuH;1)=qx@sfxc@2GP96-1 zUoNe7+9h@QjN1W;F>mZB=XbHHLtBf#XDypu!R2BXLe!e%bR{UubMdF|w2(xksHxp? z7V$m3S6)~2tZQpq9SG%#+Pyn;(%dbJ8DjnNA>HuOEucgaOw-Mf){A#OdiZZ2_DN6SG-S zE<1+OpPY#hCYv&hx9bA9GT0v$CCtTE2uDEsK};NJ;}5o!O8XNSM=**7b<~JZGtHiH z!|qYQZIP_*(0Z){l?7nC{wL}w;qztok1r7@nb=;;WjnP z*DJn*Tmelqe;6u5yeGvV73KWV9P==Bk!Cddt>};*15r#e2D9A1J}|yFo?3(L-D2Yn z*pF&XnD+j)a@P(AZ#g8lFbxOyDJZO1+ap>>!u~y+HOx(g4;LUc#S!LagaoFNI~h2u zscPEaYx@_Y>bJ&31@Q5arxCrx%C9?l2xFdSqebdW^{gE4iDILb(Tl)pS{B2>5q7J9 zhgYMfF%lvOC*2bqLs^>jd;Rl(_%+%%SsD+szE74y`UMgqCtBl%=(i^nF{UT+e6_#} zq%m>35i&gT3ronxmQ_`eqhdnPl?rlI=x-M+o#E2X1NEM%?ynVaHkpFm%1%jv+jdwN z=v4a9`^s{M^@rqEos_6*QtYNVC!VdcozZ{h3?$pbglMQa6C`(^Bxr{ucl*Du*Oi2` zXZxGjFyohZ<(|88*1)0puZxD?IjS{tXCXxn zX0Y!zNbaoP104~kPHFB8J3=TbESd#s57#EU$aybzE_!px)M5ZR@T6H zWgLD2&k}b!f3{#z+yny(#Gz`)u9FV5Wo8HNCGLKB^{TN=d+T2(Ne4eu-hw+5IxB=R z*}U7-x?SrwXvhAZEMxMiAo2Z-)s$JM9V5i5>`d?i)~-(Q+70rc7)f3(-{!A9x@tP> zQu*v!D);55GmfUkNnYQyg_AV5K~30Og888}otyg44aEu>`!mYcO1N%C=l{0R|G3YN zXb9c8Ag};47mN}-lMh@#to!Qsz2nqgG>5CH5&RfTCqI6nBH_g`abvJTo5UzqW*R{( z;_$jSDJ-5~I+%iFJV<$W>X<#(*I-K}9q3ycg`_JQTazERP~S#@>QC7s3|iN16mOZO ztM4D}f=fnqyS>Z(091V*aEd$4x%Kv)!8oM=K0wyl^v}bNX}pN9b2=12|D9YQnodPM zq$)QXp+!?&!iAfmMcpSS3|4{C4YUmTRIO~UIR!L}XIg%TZKadf|#S`QoAT)4{;*^r#E*gEhgnib+Uz;?5(+F8t(7d?H20A6jj{taM!G> zxWy(_Y^SjORkQjf5_V_s!>I)nb=I0v(K_9((HHOE!X26@hTQd;JpXrgso%G6by&Ss z2Dh*^?0S^gQVhthNpO9T*t%Y6=t^i&z3UbvzuuyC=kLO{{)uAN9Pr{kzd&a#HG^$Z zJ}EPl8m}T#*2Mx00JdBPEu-5-B0vAytI{pK3)VI+f=zjRYq+_w@BO&%m9?0c)he7h zm65*HJ^cD1vkIc!?0JT}M44hy{_aoRhEHoli394)@tK2C8-T4D*nZ5}rZe7>wIvsU zs}g&Lq`9p`OuGmtrfiHy;z4N!+WTA_lwRn+Tx1HoCcn@P&|)ICowzzh(BEG3t^Zzp z0u|?;;>j07tyD`Z!3nYdps@y72tRQI(r8Zm6fLh^q7c9oLjhF&$aM7QU^Xsb21Ae` zS%#(vspjs>YFa)Wg6wx<*Lck6y5l^Sun-i(?&y;GAr4!R{c_Y1JIb^=cFeG`cTBY! z{cYb|z|4$Nt0*I^5(aWFzDr|5X<*3A#Kq7C(5W9qviZf=#E>;K_>#%g(~L4|dO|jl zWMNy7h-YI%HzUv#@WWp}WHiG!D-%5e9hM--HDeHYd#r7^`_)5IZ4(K&-~2=ob5eN( zUiW~n$YyxQe@h*w!Pc{qO>CaHWe2O74FLgmYWCs zPD$n^o;c_epvr|C;Z;xh9f=O<{72H0dFYRfqqj8o;gA%hkpELM%-Z|F;~hxY zGxh2DtPEYWjn&YaR*9?ijT{qe(>Jz#GtTUFaY_43ZdjVl=?3iMx!;Dzq|YN_YkFK0 zl#SWT-=FU}zN??>SIa%$Gqye*AKO>1J@1z}zOM^4u(0o+*RH-Vk157}KYeX$e0|^7 zzdsKVzgIubb8cm~(;s`j;q`y&0zRhrU$#3h_F69hJ+{kE90IUD%@brYLQ@)j$Ih?D zKP3RnUEfHSM?J|U-&^|qzOVaNHJN*znRi?-y?uZH9n?is3)mC0$J8=!#;o%*4=>m1 z^Skz7)Z=LJ*#Lqc-oZt?Jr&~^%$u_P?7JL$J#?eCgRr3QgYH?+&it`C+UQFf*EtU3dw+;xU1ljMp|CpIluB3G_7t;qdGw|s%#T5N%pteU#9#| z1C8slj+id*?x`UTIn9U-=Bj+@OghUm@2Oi0uYq4CQ*=bA zLEbjDp0fkZHd3A|%`Vk~Y@N!#_)`ciO0)#D!G~Ivff$G9`8T+@HE9P;trbjc1U1yn zu_^AF=--;zi7F397VvdNWP-qAuIjze2M4RFpjsBK>e+OILP*xbyEPqXl_x@(0iZCf z84y&Wr6auOF~GxjN*#+T9gB0OBLBa_0WDQ+s7vZN2Bo;ayRw$0*pd3D)%XpM0nJu= zkS<|32xXD!CJR^A{cmM0!N{Jr-JiSh!RSCx#^>Pu!E^EmNYeVRjg zZUo+8u@$@+V-isBp^_NY*s+fJ4}Wj<@yNE#@10?*dBSNkz`k}f3!VY7#Frtkbk%0Z z>g+QhxN2fqIxIg11doSIgt|i9yr*=uFz@r{=SsUW8@k)-KMXUxY_MiT9>y4e>2avh z)ag4-vfG*1J zLu=ef+1}ou8^)i$QITW)am+~eCkD51SW!de#ifb!D^H}$qp+aXx`eh2 zff&wWlB^dBo2mI7n=z$)Udxn88crvM?z$ombC4!R80zXm>f^f<@cLXp8X%DOLJT^L z3ygal;6P)XKQTlG*>+(Lc{!P0f4uF;cL(N$pG>@j+AnH?FK{G;eAvu_{u~)mH6(;8 zAeVW!tXUNy)?CFmTFh2?C#)V!yW9s&YG*fV5Uvw)pfv zDDwD{P#t$7sHC=PGNiZUt2lMd*S3vnnXz9};~t8Chs6`f@j=1)FJwLHB9TYmHlaz=C)@MILDTn*nPZ zD4Y=u>J)8NhshV%&EQ)(=Xbu5hr0iHToI3i)u;~W&Gm0lKG1Wxyz@(-&pTGeMja%F zXX2kxtOKpYD=8+{2n@M9OkxeYka~HMqr(ESW1K0|HFSMdu{jS?d zV+h4_n(pY$9Vt%b^wt-DHQJ#^r_EH-_pFNap#LoqY~97S|#>TNx#wJtkzoO4=-WgoMfv3ypqLxGo~z zA{nVUDk{&4P|vyqZC%-C6OreNd;W!BRXGd>g-Gbm4x7t5qz|h5M8NA1d=k&`czHZ? zQV8$z2|Ow~*7X-2BO$?#mqUv>^*i_MR>walH~uvC-A|`R z;wz7Ev(@An3Jz{9Ui2y438jUu?P2DYUWBTQM4n;|l@3}zHg}i@T^R8*=1Yqd^Ngs` zGMWWf)_*e^XwdxnN7)*y#t3oqj8rzSlNRtpNb3mo4Z%7*`r3g2@HvbkxpJMc?*O(- zy=@^!hgr1U~=6j#RGyn3m7oQbPnWCGZNl488^js>HJ_KC@yZq;~PDub() z2qRyTr3u~4yr;iSCr6fX12V-Llfhqzb98l% z8s76VuYwAT>D}fUn2W!)^wnMQqi~AEw73?HNC2kc&c2$CFD$(PtD$@Y^!%myq0lrv zY)B+j*0(cPM^})&^P}qYF)t7ciPH7TXnL@BINIRlR-T68Lm?pe_3y%|EQn8CmJZpMn9NC$3Yc`nYmDUlH zju8qt3_QossS-T4NDjkOnd7f??|Y-KbS$Z~v8$RkfUmTbwCU+rI;p(3;#!_@!=|oc z=as`(I)@qpCB*m~i!I2Xxzt)+>r!id)}`K=wGa)SWj3XF89fSM=yxY=6ZNLZt!vW` z$&SPyo#eQ-&Hk$8k8(QZ@utIGMWGKb2^mdSe`~=>h93}lIajqQ2>|v+6f;!&bLloF@GBCLie5exGt4+zTB@#A)vW?#8q=R?dl7N1s=n+gTIP9&TILSNfQ3O!#(!S%*eU4(_yvpEP{d?+^ba zmuU-p?)cwtvAO=dnlD&a>)PH-!+bpN7wg>KEt8ILT{0%jo{R+=Zla!zU1G$_&ZRb8e#D5OhBMb(Nhhu`+Y>jL@QmvaKvtHWW~l3Q!;#c#lTwKKtNH6()buFtW$S~ z$+-;Z8`i0x%S;q!0U$LM5}_u&EWo5=wIufE82neeS@&V=3zs=QZb5sAcj*} zYX$F1G748@q1eo+5!G=mf_=!sFm6USZe|6xyOiMs+Wg8Lb;*XXM_K*%ngB<#%VMU3 zUdOes{i)A^!(zv?piRt0Fj-Ux3ZQ#;#b^<~J~Y0lJU2p@V*`D8Ngth_)x>GZ9oiJU z72v|2-v&6>dYRYakV=+zv3?|IS_-Ddp1#9dK%ILRm1fPZp^c!Ic+Nz%vULv7IRWIs zV!nm36>?cIF(wM)EAF=PZW;*u;~_iqTrm(hAm+?{4132rc@2=jM=F2Z4Rsi{aK3I> zw4b#gvKPtvN@>Oc(j}NECB&AP0tkq;2RD-9Z8vKJ0gx#@a9lYkc-c%jX@ zQ%cG&n*yqOa?lmF#CVHrg@hIx@|j>!{jnKNQSh|;f13*z_qn9%e8k++GIv>`_heXM z09yLdYu+VjH=1!&7h)~`55nFlxU#U}!c51uZQHhO+qUhbW81dPj&0kv)k!A(egDk- zGc{FncWU3AQ?>Vb_rkNZe|)ngK3^ut+2e~yBC$9g0&Fm5PO;aF{-iY>;K%~z-KO}A26m1^^J`i01dXAW}L|;*jhM> z<-xloG#zm8Hio(?>ZwMf7b+7+XH zB@h^3Eu=8WI&c=Z?*%_r3~r@n@Tx*+&Tw->QI@dg4LN@<-`nnL^+2}Qq0d7h5nd%x zY`yS^oZj`(%T|pJa)5;N!G%6x7os^SNC$8huf_pC-%j!MK&-5Lg>2hT9^fj_OL7h5 zG;9y4G`gPO8x5a$T`Erv-&cCL8px)5#AoH`$yEP5_34?vs3jNaw$RHO{rXZVhL7{; z%{f^T*dy!{f4KMnasR0FLXRZedb1Cphr6oaq+?6Q^Zn}@+puwZFFTvd>$VQomXe2} z|CUhBC^?gm2hB9V?k4p&=o>zt&Su#=eRf1QqK%RH>%4C?%k0nBRR6WdauSI!`Ga+25%uODR66WGRj%+|q|74rWX7w>#%g07!~i znap+Q^^%JPwSKA2^?=QL8CI2`JDl${GM`oN+nhT4z_$7Gpnb{O?8>%Tu5GER@9SE% zQ>ZnAA#i)kvemv40}8GkU#sgnuu6w1REX#iLuCrD#FTAHP+8FE_2&r?H%UEl1GgyL6if4#&s z6sX1e(zRCE7Qtj_qa(v1?ob>^X>H|Dj6=1aw~$$)V?GW?T$tR-xFUvEK_fdghrqCerlpk9_a#6Tm zKUbVh4Dynd`hvEDwa%VBgh#LnPeyzL3H6a#KwzU8ei7H##|tn^5Mu7IpJxz;b;V@!Eq6R(MOdC^rC!tR{{5lMDLAQ3tA(J)Y(PgN+ zhxzsZa~Vu2T_Uj>-R+ZF>rNg29IR!ZriOL{HTE3CW#*^eDx?@cOGWGrN%oL#* z@D~t3Fp~C7)|3?24lFNNY6qeRwJexkOVC^XQW@e~FFsH^FXl?7*$H|f334q94uMY; zfz4SlBwq(-YbM~0#b+s2UT$SqG^um;DJQEl?@QPYQYJH zXJb`P=Hp>q86_Ft+JXo##U`u5NXI|CT3E)T zLcrEu;YX(0bS|(Ok(Pv1drG>^-5>L)==f8RKYF^OgF*TkaqHJAjJlyyB+UM14>nBW#&fNj8KZc-O zXb^)C$-#g^%e;o)Z3Va`JFM*yN z1OVqifZth8jXUr47Js53AA#)@JL>`XfmDHLgjdrWD<}Gnc^3^_`LBxN@wyMQtwx}v zaTY*KW6^%j9(s8v#7Yw|wI>DU)5Q|)z(^7*J|rc}@y0UG+#}h8?Aww{<4)rIVote< z-f(GiXu%iO8@02O_(p&atCMvaZ>?7u@EXks&bsw)7Q8D~jhF>{^Hc8ySxMg=60(pS z4#AJu=MVt`0zqXYu+*f6y+LWZf+u{#rCQgeaWgt>48d%n^!0USF+`UO_D5K(ronWZAeNbvOY0cs)|q6_)41Vg7AVx zMAaxH_XJ4;4H;Z5`Rx5jQnoeu4EU^jAM8v9!hI+fDwNG*X#1ER^uUqDpcHUvhxs@s zZHH8%O(K&GSQp_Iorc0cEdZJ_L~K;7{i9(=Cx&Of%s3{pd*<#t+ZMW9`u-R05d8hM zW5$KmIt5*cc4;uY>)Y$j<7q`+FQG*Nvssw>=%4O?kW3rp9<>{a_K%18Plm zWD4!%;n$7f5RZO`yN(YjcHe!^dA-Gr?et|F zCK@9-ubE$DxSJ}luln55wbJh_$r7b|>p6$zR<;)su2ZWl2OGld?d9VfPW4S6$CIKT zGaOk49S%|PBly>`QIx6F<|iv(Up3tfd5a;GXcg0l6;TA$Gjz&7c3cDho?$kjLGH3n z<{Dho^?4P!GU_8q27Vl%DFQw+z&F6xgG5V7CJlWe4eRe$k_@_ZBF@A9yn zqCMIF+_cx_<7!G$h3hdJwjL4ltnBAI(G;}Oc@v&3uiGu62n89kyEi6rx#D4It#MO1 zu`RDZvPwhuhB85-d)%=~PZT#dX*v*vU{OpnCfVs>K6Zz{k z7O%Rdc;w{chL!Z%ghZcA#6FqMZ%eN~%}%f-`kHc`nO|Vr!xDiTJo6KyiQ%bYvv6+P z5yfI&m9?f@TQPxViA23;nqG9^9FV$3(M6bybabhiIh{%(-h3y;Gs#(L^>SG8{{Dc1 z{tDb~*|?@7*LCCY3t&+hDArDOoQZcN!`kMl%(Y}yJ#tDhHjs!^w=E0yiNS^6$Q-uy z$hHW#vQolD|Ip?5gpmEnR`?={|x_H+U zWWctN!A9Imxsg0Gz~QcWcvEiH|xglN)C{ zJ|k!gJ(C#jJJ#Z(5>koQa4zV&({%(()>15mT_&7~tckVsSXsW^211Nxr!<~sJgR>< zd0xtI+uw6@c2a(0Jw(dDXDyp9U4FVt|T;WJQP>$K;2=vEBIQeE0(VgnIPGHY5) zc|0{|O~px_{c{GlPTCn1z@t9z>Apr%gliHH{D}}M5Km>cqnVZMgk?W8qi>iDJmFv)tA7yUD za<5-5dcFUJ6Y&A%t3Eyd=_h7dWz*aXlX-RByYGVL{QXptxk~|{mkdac)$$Gc^dUCE zJwqScB-0zq#uDrP>zla04alT1=@jH|uDCQa>MdW`W#6kkSHlTPfx~CFAoC^CTbbG^H>m?0P0VP~Pp8o< zcO$(Ds@IxbJfWK1T%X1;lNdIZt#*kX_iVHVpF@8ZD*`RFhHHgU$LOOH%*YW@?l}|2 zVbLt26>2uKuIk}^#5*+c!ELm*ZP**Azud}mAAmQB+=n^YACH%-vRlQwbP0i_%T3>A z;Ian|M_V)?WT(&V5P{mZ9m}AjFbk8tFO(wrZ4b3n z4lybWTG5rfxB~nH_llbd9-?1$(DBS09_(!x>*e>}THcoivwM8I1+8MzM;iKcFY2vZ z)LEUbwNvFDC?*D78f9pF_saE}uX$?>1zhn`=SE+uM%g#0>2z(ugm1@>Tr<|@QAcSA zY#}&mCsHAgC2u8WVe)Wnr82u%TKXgQ^|$PoX#*1LACSY!0`< zzGk0r6YtR&lG8CY{V_GUeav#Lu3X&RUNr7OSyYFkT3$Nsibe{SQ8Kw%(b^%==o2A) zl@iWrHmHU-*(8-#6E{5WH&q_28Y4VFz!_6MCjQicOUYWJYzH!0eeRs2LZv}zl|k%x z?R@)2HpqDAT->PG%*p!{09!>Al{Wfrj*J9)Ek!f|i8B^N=BP-ne5m^=ylNOYU? zJ&LZ5yrYue{`PMlgk*OmovCm^Gt=(=wFZ<8PZ9D{Z4?SWxO_DAt0sq9F!hRS2TQku zWz?G;@HaYH#Y!Q%@5nEHymS$&d~nb;*h3Lr`pk;NK9I@2ymq6~JuwlKSS3y>XFOD9 z8=DC3kU8d^2+k4t9hT|ZV;?=h5_5$ara?;#<*}Z|Y1Nb(CKr_M_1Z+^y^j8JtlN9+ z(B)fr7o`*NEsULF6FYodrsF}<5&7MaU;qWnz8N*0> zyTy{>>5v>6p#CM>u5C6EgDX^Sr{|O?e2F`e6yX{9HFUMPp#BVmNchR}HmGr=2@I<=&@U7^sivL}!cchnjcW<;m(>vpJw;m$fCOEFEkm~a?&rX-OMmr10R^O|DMBnk40^w&mw7&l7F`W zYtkYk@be6n0ynXTC8^Lo>cHG$(GJvCM=Kb;?&7;wp;x5fSVb zOe!yAU~y};UuTn{z&6Tre^?yX!@t01ZYo(=w;f0wQ>6#p)2{jd5`yhtB5=K6*Z<@6 zunI1-XRO+olTN!X!na7qRyCH9UE(*z9nu#KznxK^uaOe4GqsDEBBs1_4mum^?YnQq zaBdNHwzf_cBqct;L&D{^SqkZ-O7)7<+C(SQd4Knset-1AtPBB$EtimbXvot+VYY6! zkA)lKwydOSVt5d*F8oY&|0KOOJi~{4C#Rl=T3ZGi9TDszHWda7#UqFZ zGx_xetOK14j1o2k4k!k_0JfarhdWK!dQ0EQl_`u8`{;kE2~q=8FY+iLrpy2qCT21> zi{IA_ssHgEPql#pWb@oN2+XM`9|FoxcTzkpi0~m6B#f6k%XBZgiwq6;T$#_r z3OZNp{puB>4bVZ2nHg5r26|S#hs~DFGO7`T;9bzyOG>fRpB zXB~glS3b8LMYq`7pj&MR=`jG|X5?Q++B+Tmvroc~K|FlTe|h+paUB`t-2a_5Js|*o z!4|at{5xyGF>;p@^`W5=hDO+J(PiKCMmXIrF~RZzIR4_4$i28Gl+6~#sdXXh#V%+B zA@)kxJPx$J-40_0+61$_!EYRVdmsF}^1%85v6E*P_UhM97e{Bv*Bph5dh@Nqvrlu5 zV0)SQdhz6|EEepKuF8JXRSQ|$zuuD`;tQwB#@_ym*HEeUUtdg6_BGfC*6TKnwKKEm zI1m?~phKzoK<+|~n}oDKCRNCSB`?n?KmWie+6hSGDU!IjzG}KV9f}wQ<;`IdY6{ge zYLrlYh;tsH_&6EUR_q?rnU{elUG1aaL0ha5e{Hut%pa!hpQJ}-CtF=USmDjL#i4ig zfVZ&!T#(5SU9!mEY0;1>!yA!d2%@jwH;!YyR(QburB!N85am=J(4DsUuJY8kvI6ue z^l#Qrh_ho}^JrsDRwr)Fgsja!wi4=tEPJ-3R4Ud2v_#NMa+eu}7Wbt>Ou>#E1rd6m zf?@|M6Y`M9(;Jh|qVZUv(t{_KEV%A<`7;i<(6R`VN#HWz`t~*p6UiPUiCVw`+b}C1 zu{Jo^Wj?I)$RQ5d7&9ck@mZ%DFn5LHW`5J=3ll1$e`$vs=lWT2Lo1ZTu0LsYqdASz z>V_Hl2CejKHp`j2T@LU4zC`-b3=?L3oEl}=(#ssc;&qGSc8T*tN>W4C_$GezIhL3a zjy3)*J$n4WdOg7@%{Yqfis2IByR-K9E8H;TmF&n(TnyI4l~Mb^))hZXdsa?X*XoPB`MaiM1}LHNE?oxM=eSG{|% zC3qMSUa3FMq=DmuT8-m(2^I&8Bx8M>2gP@_Cj~U3#*@cP{l-bW=D4skDO3WKkA&;h zRHrpF#rEjQz4#H@dnMUE-RrK$D;mAOr{M|9SdUHXOb6?L%n^_p^tBcP`Sqe!hmr=o z`;9D#MuD6>p}P?X3Y!IoaKt`hnRXSNmP9({0hufJORNsQ{p1anwNDqvUx))I;SO!9E_r(n-v-Cg6?I2^8xCM`W` z0f0F~H(;)D=Ie(!MEB$61zsmRS!o}x?G}FSvYn=*A2$FZy5+w%E+fuKh`2Qf|{XK4-_`dRe>D>8xOXd6Qz@EJE z>-`w0?WG3#`yA`{`LVI{bwlU(I&-Y|9p(4FT=o5F7uESQaeRNq7eiEaqB5KafdzTM z(H$^ycwe%vPnwz7{|<~&j74$S23Vy3fxVQsVay{;aJwn+S-|(R!os7JtP=^x?NalC znQ}HvURyEcOhZ>j7)%L2R~WaJ`9;iDt4UVxG;0wz&Thc&Z374cf}aXL8Y4eZq6{|M z7W-R~-$j!v7~sLxd*+>r8esm6xn2%3Pt^=c&X|KtUwNQK`ko*Xpca_=3u7pbRthUzip9nPdeT zR$gE0zclFv4*;W*Wr4-MF*(jl;nZ4)Xr)U5))2sQkBC6@A2!q6v3K+Gp=Fjdqe$gw z9*xZ+y9h1O#NL(g3Hm!R;ThShC>TTpUSNhy9cw=}NG$Y}$>9wTm&;zGPm3*#7t8n_ z;jxms1c3}avb&Igh7m3GADZF?@Xv2x|8^BxmMDPp$xscM=LQKO)SLCyn%Q78reG>h z|C0XXC9{)6%oNm`l4H`xFsnv9Nf~HH|G$AX)UH5_zClGum~}-GN{3cPzuja!IRem% z^8o8PtojT`HNyJ);WSF=f58qMy(cz#`!W0>HAVL zEFS|b;@%#n(^?TnGXFld=t%a#wC`tEw zi3CW<;f-Uj5p@NMc|6QLB~I1aQIu(>x#5!x zRzY-1d&;CYih5c#{%i5Cx;k}~IW-DvIu-M5IDQf_5{Y2|nSO)lD5~PL1rV*qshd1~ zs^D2~F*rb<-|L8{T2)921{ho`{F@X;W)Uosm9lQ(hLRZO!V~&^GkVI~IFLRSQ*(M* z6n4?%93Yvswo{}B^W5n2Nooef?If#$%_V7mi@xi;~gn1 zo8{k%-aWaEPWY;=| z%#2Q}FzbnwByS4hJ5nRBct_|qcF3=JTZXPYrM3m*6AL;tcYDnrXlo>#EA;z(VRZv< z*w|4@!qw#A+>YY}mww3JGS8IfaptL z{%C>5LaM@?3`k4q86$fZ<8*qiW7B9kUUJ(WYV9xCcl6zemn+JFI8nYtwS?~3l!1v? z-nNTx46BIPm_N)cr4k>4j%AUivk9;VafqWN4c?vfdIpg)uK%eEg*Ij-q&$UUjQY|y zTT91|F?7qR;msM>kqbe@tnbA%pw=!cd&jE+AI1s240|?5Z|2mv1;dW=L;H_1ZJkCo z0T)!1f%cadU`|CMFD*J@%Le3E{wbmG(-iReWsPctVeSatq60E~&jV@W_^XBV8}bRAzRZJdKI~c)Gw5h`>)ugjLTaUT8ZIXYZ?Mlf z#n$Z&vr{T-{inNQ>$;{lcsb9Sa?l>#v=|BxGoLWeVux2ZHDa}9T>Dj*5K&@}`CeGmvfDxL}Svn?J*PxpQzp_u=TgjTKM1j7-cb{kFs9r2@ecZLFIvf+xE{Yv%9T?(y5>IOy_+pjKOw9WK!KbGw ztHiXQKZYIc{NMca;rkmfuel%cKotKud-TT}tHZOyB>H2@#9SPx=vL4FG$MD6ej1Tv zf-=7uh!;I!`C%v&vdgmiOARHXY*4zTqP&lF45M@mHHo&{BX6v1aD)SPnY#wHxN zAYB3!hw}hml`VCcV3j3D#xq-L!i3-Pii=h;5tElt9mUpD4VS8TQde!&QSP#NtA4nO(_uPQ`EoQyBOsD4 za#}mGBF8&vn&;C+4T8x`|M`$`&-_?8on9U!87XY zvZ)$1mbOy4$sn+!&N2u$+nO%Z1UL>YE^-jcj0H*&0e%=Hn(CsF*!Xes@YV8pSY9sg zhZgIQ)Pi28PICbFn>YEcPi8TXAjKZWqjFrP%h*P?wc{TXcF9Gft*`Al%C%xuQ;}dI zX@ZS9Y7)schnNqXDY1TZ@=)V}I@mNQ{YhW#B8)H|@*4{|SI;$HumuvKJoOIJ4P}9a zILx)LfoR+G#bNz2w9k2v7I`aQzG=65k2-h31ljao8ax%EQs$U6G@Zz1Pii8SYMu=VD`l=R!o__r-6#2cl14X;(>;(YqoP%KL?v zm!0iuyVS;$@0gC&To&(MSi5sUI4GxLH z*!ReiT6U9}>axc(D(;RA^TWi{Ux`_bjc%|r-Yjppv62!K!M)0l0tl0iNy63#3dz|< zFfHYZMb+oQ@}DykxU-u1=&kt3G0nLqnMSt)e>?dhdA?L>6sWpXPXoyhfO4`IVhkAZzuLzq2<5MQbQ#k%){G8P$TG8o9xT=^C znbxHMQ#)hndkuRw(pp?)|5B%bZR+a3jgr$sJkj>|A;0}@Snp3JY$vVVC#4#ln8;O~ zUBq2ni#Q7Mot!aO?hwhFb)?(E$d0|qKZ*m9qBc7lW7A9YZqy#3`shV-Wo{4Yr$OdR4%yFw zYMgD{&_-vg{Lyxd^{dAyj%}0W#G|ThVsn#C+{YhmifN5v<~X#CHHO?X<-<7ZCO2TX z)jNMtxpB(3SjY^176!AM{+WQijxqtWIXMWe)IzWE)cUGf!C!${ZJH=#kjk);cPC3C z9)+FN=JmhVmynDKAWFvHSPryad*Zm=9j1QAvl#T@MDVzL^3f|tVET(5oWdq=3opX# za$0xO3?3EW@)}H3Ul)Y9sCwj!(2_?Dt~kgb(>w7%*GjeQ*c;fO6EB#SXYC@mF{w3W zE}`ixb;qL_QFunZHEmMwM1#Cuw`R*gsp}>XsbI&E#nd#?wwqxUTf@`we7b(nUStf* zMo2;naY>WlueVp))lXZYBcgm!E33cZ&ILGOfkB;lRbh44A?1ltqm5as zH9BFBHMO(=cEluy$6Nx38C`UuokG8T+Teb=O7pY&P(KxxxmUYbvmG?eeHzt*Lf7~H z7&too)TrVlKulzmN$z@8MupdO+~BjbhHSz z)#WPKs$%Y6TARn9euQvx42qZNL^`p`Vy~Y1eH`^f8P(jFJ&m#07VEIHHH>-1nt8Em zJ(*wqD;4DApcpq2#HV1fu%2{;L#?B8E!lNr`e4ZlWA7aG+@Kwy)j%9K{M|dC%)wP_ zZsC+P`-c@os`zv3x#(7@RmVkl{T>+c;`T-0aC%wzYPxkP`LJloj)fY7qahBX*BZa? zn7WL#Hmxp3wT>h&2stn|e2~l|sYH(j@U@wRTC${`AA*F;&6lJ>v(04#{n*rPNuE4ybGI-9mw4UeRWm#dX zuZ)hftwf3oGuMS}f|MYvrH36MVuu$YasVOT%c1JHv}~RxmSOGo6eAP~N&nK?PPREA zjzyLiGHJJA_Ia!xmEbFO`fsnMn})*SNm_(7DV>{+UN?Z-UB~` zLOC>kUBI*)HdMDvGD-=g2m|D*6G9#(M@$4d+Uhhujpbg|*8zLnv zv2W_P1y0xSFw2skcK49atd^W&wzkVm37)W?rR87WlWy zr7#BpmxYk3c2Wr0{cT_4krGWs*fCEuO@Z?X_ns`5^YGL>M_ zf7AZQ)vW`n(~e!xc7!^@c<2F_lOGR4N+W;qzaIrix=FrQ=3K21P6l;2$I_z4DYRKQ z^^3Zt6v7Oeg61_)uP)_eAW-GX&r1kVpY={=whC`)rXV48{(0bTsy5lOgTD4ta+X%d zNMpQZ%`*1K{xPYX%fa88Un;StDrJvlO&a=C<^rWS)g6o4EV1TI$ON?`zNO)LCMNE( z-0Gu&X08F%3>;PDv=&LFgVcEkS~De|%@`q13+QddwwX?~T64gSM#m1{_YwWNoF^-c zKf3i5-OsrU8-lc85SW=11KT@;)&8z(&HyB6~zsW6157guy7n zb|(jMh+a$Urzs{9N&yGxXxFw%gINj))(2jjAcfKBvNGBdm+FH0l!yL;R@&1&YZMah z#)mRe+CW)sVf_$YT&DtJuCtgsryY4irG8t&VCw9S{A3eVc|JB;ciJjhfnY5K ztYB;c!p{jE{4#$#XaPU~2yueFNpwPE9#P!QRBKyJeBP-?psCZ)laayPO39Pws-Lcj zN0dG${#bujQU1i%iCzJ{2HU;WaL8Hc;Lp+(o$3sdy_IUj5u}nU!+pv&C0~63)B!x zX>HX7TgfUxM;&l%_qCmydyXTehpx`$+|!CvK_65e8!o7yTE*~`{b#Is&W9fR1ATFaoFohRI|s z=Jpu4!5T)|RdDERPU#zX9C}Di1qKL!hMAZh0Smy9xlQ_zCU8ND)XtA+1M{nC0eBTh z$-~6QDZQzPWP^M;VG0g^Um5vOE&L<}PWf}a{Bd$r?I}QQ7BwiHW*ZBOmp{9(-CmXp z8qP&J_QJy~d|m-;3Bn*2(;6Kyri&B?pjRTWNAiVkH(dVxnX-JBM~UQg;xwE+BAk5L z-*XDyNSa?M50yBf9z1H&Vy0TQj;g0ZF1v`K=T5MIEY&T!16y-X;%Tjt_u*@4+haZ$}Ym-5jnZCF=@8^M|gudFgS_^@6o z7O0%EMNX9F;IzVqmeL}7QcFJ~bCa#lHzQ&~Yr3;Zt~Ki=brpCZx(jfD&goQlevC1< z%-w^fR_fW_9Uqd%O8A7Vc3ECy)7~KOupG_BCxX%L}pIO z!?Tr6u`1Mh!7906w!Knr5@ASB;cvkofo2GcyT~5yKndLt!5#}uK;!-jXb>9^1?LPLae~ z0gl*`#S##O*wiU_2#0x-3EG&vY(krc`@CbIhaMIZVKWU2M;s`q&A7=H9|HytDSbUd zoHV&LcxshO{wWlA*7_rTjiMs)Xw(B(q20qAptnU=PSS8Xu|Y$Q+URx>Gi)cg^IwE; z4i>bZqn3$z3rs28VA>j>k|uW&f&#j?8!=fL9`bjv?aRz*b9ptV^)V5@^oLC9^a|Qt zzNmj==i7)xQPc3FqY5TKZGob0b}yI5CkDUeYzo__hZ-^n;n`md2Jf2DDQ6NR$5Seh z3v!cOXvmI=Q&9)eO(Niz8B){1QS$@$B#ywq&%`Z8RHTJu?G%j|XU2l8j5xy*0|fFV z0U%Qa+U!g{oXyO0a5Mb!U%+zeICqK722V&14++2Q<&FgBSw_-&j;R6wf zAX_&p1zct9^uX2Lw)Z%QJc>rAHa}XfkW;T*pQ{_7o#ROpM*Coj(IDZ(Zp5~qWeNj> zZ>vZumFsz{P2C)PdLLSM#HPtCM2MsiPDD(L3v7oTA9yxzF1jr6rnx|{4_c-X*3aMP zM@Mo@!c|OxI$MH-yf3m=z^Ro?4lX{5B)vg_1f$Hw6JycR|8fL^N;PaY*G7=Xu1;n~ z4*q?&)c>Ijxs0wF@@-Xm0i-)%aOe^*l1Vq+k#84gRf^XgE$Jzk-ceQ)6X~H zF$p%@=_=`Y+%975BD&gEsj6fYXx=by5O;2YKz^V=Shi@mRy~A&s)(9nlC@ybDPN+> zoiDj|{*(kHoVdLoAwfAGo z?&n&r?-tC!|G%M#?fU&RbENdQ6%y>=zOW8X8UZU6D*AlZhUt0(sLbm9=vz-s^?%ql zDgU!>d;4$Qma4RE|B*cTjlo^~2RI4%kE#2AwkR1!ZzfSDtk76Fs~vV&n)DsjQ?{$6 z^ro9O;2_>*nU}v&n0U=bVLCq;Fr)YcgBS`0JQ`K2aF@^Rw>(#gz)9}T6b60tff`9an6BN^GmCt^0Yvax4|4EE%5vVoU8;muIt4o3n7e4w_RIpjo6`v7qL9?7;q$b1EEW9Fzlgz5Lw3?^73U`ec^yr6APtGH zsNT}9up?+V1$X>hNg%9K$3*!ad#C3~XB7V#uN?qUbzv~?kM0L@MtB859HkIRJE|WQ zo#LH58a@hC=ZltbZGR&ELOnKh(*yz8md38An}E_`yU6cZ z+X(`t9H09EzP_Jph$n2YL$5!O+xahk2MM2{`-ECIgx~bqV0{MxsL+ZTBvd$t&|wjh zC?SJQzEZ6ORC4K*^A; zN3Xdp$`8F@S^z0}SeN;m3st?7@_lUDj`}#fVzW2f%hVs!mZy|=V4=TFzn&ik8%567 zB`Prp5wpaGs#YOJ24{z6_~seCCl=$zMWurRxQ#PgDZjB2BU3L>G-Za~=|EK7*@PC| zK0W7ZV0~M#zsbz@l6)ij-C;{mQ~EKGB#% zn?*t8E}P6*>`k-kU9@1H-gCjMT?a+8RF>v<-siH==02_|RVMa$-1ZT2Rgfjjl&u3BZGTk8$Mh%(G>Xgo;QWl*O+kc&GKL1m3d$ zz>+1kpndOA+boxoV$c&l#`;ibVg}JK5>&gSK;<5oe@V2L{NDaB^>S(%E>4+UfXz>X zYT4TBs9L&f2F})fluYTsUls&o+*xBU+wPe3z0q|no9jhO#ok9WZPbI&IC#!Dq!#w}@a7RLkj|EsNZ3RX9lI-Od;QeFJS)b27DQ!z->#`Jf^1O_#L)+%!SO(mM@PP^ z9XvvS)G5d){GexrRP8~zS$w4hs#>vlbc@lDk}#4;dCKfmkyq3d)_S8U*K>pEA%;}t zs6CB;&Xc@F0*2|{O^gfQMra1*1a?Yx{_0<+_@hdUK)bn`md+8GI z`q%a9R6+$aGM;v4W$1Ek`wSLcHc8CDIo!}wK`l3Gap06PgJ}rIC8~CVY8D!YSy!1!RM{u=2VqJ&I>u=5s5q{hiqNOz?B7g*kp7obtNoU4EZ`%*>P* zzok)XH+@R5b1F{X#O|kncTRb|K5jbNiQhLWQ@~G86b2e#=NCx7!R1d+7JT={)rXv? zJg|!^aU81w@9$YYP(9^!MXlfPvF?%U?=5it&7pR*@>X`msOXZO6f zReWr=F{ZT@n?u2r+et(s*Icbu_BVqt-$uLTy$)A~A{tR+QyplOYwd9^R5G za~QTAY|ax`$V_}Ww{baxAIAv*LX3t@gd(ZIsJZdP!MU3AvldM_CU0_HjUqKrwO*>r zg!wlk#MEIOw~NstFMuc>LH5nAI0O>f2QfS3=3CZ7DNi<{7MxSR8=zRU00$2%CSRkI zsDifVJ!72W=n=gd1@bQmHo>SYT}bkj0zf#*)!-&$OU$z)p)u1Hwd;6gv6QF+E9r-2EMTy;fwu29S!nISsd%(klzYZ!3Tw1|Wee%Q z0S=d}C7@yAD^OlMizZ(v4LC!;s8B^MZuMWoq$_|A@?V4Cw5Tg0U-Jdw)1FB>Z(v%1 zGtIVrC(rGM^VF&Q(zd)xSL8@+^(vspCV3opDWd%=a{LHGO03SEo0w@Gso+X>%x?ar zW!r(6{p}tvmCuLuE9}>`7vhe=rqa1WLH0Eheq0^pHlkN7H1QQ#Ah#^V%WZ5Q*uDE% zX6|3jyo8q0#^?Iwz3Pl@l>1lp{)ZjDAK(pFe^*EoTVp3@M-u~^|44R*mXHjL`1JVy z5xBYOq)lwioXzo>IXKwqL@lhHO&sY&tqq(_giVa>j7@lXA^)eTd-j!%mED3k+V^zb zZJHWTYJ0C9WiUudb!Qdmkm(E3{5Y{KmUxo&e*NQ4UoOUm#l^u1bZ#(mxTDwgH@C;`daSqV=h;XAjz$or3q^h< z#m;FRQ%a&~dD+P~*FB)SukzOg>SMtm%;rrIx=+1N&h)@Y>W|=O400%5$`9U77?r@Jc?j1sBB+f(2nmsk)NsAE3r*6!RHSm3W|QOhSyRyEPBJOKCbhD@P< zxc-fbEH5KOg->{gy4NZ?>&+je6wHo10$Dy{V)wL~C?HP`9$*9xJq};xaU&3N&+jlx zUv@xF)I&T3g~-(crhAy;`xPI2NdckoOMV8>Emxfw&nK4lrsAr4s8%d4B}3Z;PX}RL zCx?1(mSrFZ2c9j(pIo~hl%VSwlsc~$RZIC-oSKUK37W2gaOmQalCM?upCe-z{=Y+z z5*9e`nVN+k-#vjTB^jp;2M=3HX23*unUJtlnfU3mN*?s)y{n6Ol!wR8{dVXDcOCL^ zWdHX>^o1xZ`lMO>(C8ybfdddGJ#zgQju zkV8hLj@|2F&xn`O{*Dp)A1zzVmLt`?(Z+4*)bsE$AOD&U$bw)w{-`{WZ>M5avMq_W zOdPx_;LD>_!p!hZ)qWdv#|<8i)-UHl_9FTDxWyv1n-fmiBnp0j(xFb@ z<7ALN@u^;o&ksE45L5pw!Q}leuOR*DB4|mYf+ad}<8M>`l~>BWnxRAo>QsG zT!U`3n-0c75ivCcw&7>4VRxb+2?+9m%D*#dkY@&3n9^Dt;eCHb+8}{A^u7i3rMpvf zUQcpW)=%hUXR19*&*0A4VnpEr!E@!5d0YoY+GeuoNy=2q-`{auOPFhp zxaWLiIo}pQkc2#$@p3O)nW&T^Spu-V;*}4zpB9Zp9-6t^<;7_6D4z*o!gMXUs%>Q* zi_DZ|Uearcx%rt8kvuPm!}w+rnKUq-coNY-*40i9g>tE^_#`Ek$)wngPpUlf!Bl}W zc4vY5g}6W(^o#h^)`GJ*uuB#+<#*BJm#L?C=^jU!@Qz1b4kkw*N}NVv+U^Fsz`R`C z_ovz9Mg-;JX5b^r{z$?nV=ofF64P4B0Q!2+s1k%qLT0*Zp_xppN{))C=93n)C!7ch z>}IhLRCrWc*nUhEAMTil=a+|hSN@G4lxEH6+m;|*?JDkDs3jxeQmn2ZlZK0OY15I5 z3<~YAtwUoeI~u=|Ic{?EXdN&+ZZQ!Kuu(3nrWTSB(gGvA^RaNZquHJ-;NaB?nFy8= z;I$|d`%Do~Tu&bE9hEC!-J1DScG#wtq?#_#OUWbEbtYH2=Hjaf2HsQEU((>k z$(uA2Va+&_Qf$v9qP&!df22~|?i1=&vq!E09shHb+3xEJ#Pr7Dz1$Ck-~Ux3J6I1U zSwWdI?|n8@g9z>M+`-vun;o1xS+>9kMW+PIIA(vSVcy6gah72`>XGB#4@=Vq3V}}7V&o~%unqOa?zsTIvsfZuT zF4sq$`esR@b&)mQJ_UEiR4m@xh*KK6#LOYbGL>_S647SB5W$m8`D|Ohu8;t91ZQsT zH}xS|Up%QKHW_TF_lz+?y%KcQT=+mG&Msx@`Tj+xLdRdYp3&+Fd0C|?$18@XF{_qsLwB>Bu&UXeRC;qT}6$)%V z4(FI%Slqd>>YOY$u%z95%tG|y+3itcaKLz|NMs~=bajazce9kQ1wjO1Km&}%{m4vV zT7-CsBRN6=S{^D%2BgN(xw^~qa*m~>ml%DAXW@ah_w?+u#Ahq9EjefEmAfLDHT~-> z-)``l|MXBD(Qx@(eA~{U!*VEEe9l@3m`(f1pPw@=f9#Lg7%$H>plg|+8MYDIVCWtm z1TEF+6Q@yCpxKWV9NNc(`lUQu7Y15^O-xmcr}iaQcfM-3p+8(8GGs@z3$Up9i9qFs z1VO~(OJ0He*?c937xxy_>%Qw$0yaqP-)$n!jb$4=alfDZ;~m-psRK$7VT)b5AFC04 zU8nwm4v>z*xP7K*6=I2T2&pu4@HG=(JYRi_DHWh0_{1A;82p?NJ35Yu3Vy#cW#@YQ zQ*h3Lse8OH6aG}LPUmFhYm0IOH?7>cb_i*(nFR11*h$jUqV4sEodremp<|ic2wE7Vbx*yB1UApJu_64Zv z8H+VQ>GN@Hg>JHG%aiX;Sn4DBReTIgz_JPUm}`)%{_Bwyz%qpxprEq~6FA=BD`Ri3 zA@z+y)EsxgdF6Nn9iFJz&HY}D8KC8xn{6H-v;|WK;&)c6Gu7xj(bPkwiwz&m0>UtE zwjVj(ax{YL*#_aAVrtSgfRF;xp-W>A9Wfpu57OJ<<0`5Q{zX$6q|D7LQb zTIh+*eHUjv18pa$;xflpL^ToqS9a2>YD^*C5#lz?fLH4{Xj! z)5yJe1%Ar3$qn@se7e=A51iXjl3@c_OtDZ~#eK{%8Kbu>&^%xU|q;+Wc ztJbKqI`T>~h*2H{lKN}To;EtBc}`SSUH^dJ>S~q_4Ouzzq8l|7rqfWC9d%@VQ?w4ee{F`OwGfuPvCOSfd^4HR=cZpeoU*Ko z4^4BXHNqlV=OP^j8ea0>hq)7NI6G{T&miAgH-)g zP$n*(Qe%%L+-K~KAJWdTSBV~EMFQ!-8*oc3h`&FiPmW`MriwawkRRG-h^_N5GqZm+1 zG9&p8SS`xNv9$sk~a0{5%BUjOGS zBZ&9}Bh&hc*-S0MbRElHi__pcx-l6WO^f@BMNPS+nV=Y`dNV|}YKpHUy^D<(&Yga( zZ+SbYO7giZ@DZb}b`7e(vTUZN9v({BkDP}59X4iLVH$TMm;V2#aTu$p8FY&%usLyJ zr=GkQs70GxDgLUMblyPi*vg~apZBj{?5`9C`I9G~so;Z(%rP7L^G~jKG>`;+) zZt|#mUm6>y^fT(E_7htqP3tHpnI5j3ekEutO_JLetLlb#np{4TBV((KWF;p{t1El)z0Azs4hoGYvH& zHE3E)9Mi(sTD1C6gik#6tRPa73cqHv;7yK>=YH>{YDw(lsbF2s6E+ zh>m4aodnQVeOhrsfFwff#g8@afgc!2rwE$ieVKyx_FONcC)|TV3R~eF2B&{lTA?KQ zo%>OVS9ZH&%L~ceVqqo(cW$IGRX%*xb`0bL7LxT&H#)Cg~gj@ z6cq_G#B)~Jv6vo0P2Y}Hy(@qMhRI-#5GaPs@?aoMU#-i8lnsT+J_3_+zyPOc>HdOG z6t<{QD zNRZ3^?MVB%rCpx>DdAf!PvwWlDhlQhTQZ?9-;3(}G2xt|S@QTPN5*J}&(r%y7*>yV z6ce7qgza~U`_JhrrfHSjqfTLgb&gxs^qa3*L}+2t7Rh#cgdz7=oYU3QM_A2Vy^TN^ z)CgBc2wLpb-b5aln$L5uF7iNZFJAzu&(9x=(q)!b1?dg9-Llo*jh$O@=9@wh$>$2$ zNy&Q_y_^EB%D$R1TM;C;d>ps!U{x+*zSTe>QZ+O=P9oO zrZLBAQ5L%4xzQ>Fy3ktGCsE!S(nCB_O${z7XlW03k=A4I;gL07WYTe3RWUb^0+R)$ z?OsTDY#v%*%DL-5s^jfJP4b*>qnbZ6$S==tx96AJYzc%xH#l!rV^Y`>Yaa!kWrk>f z>}Ww#>ZITo2mOm;i$PG}8fyYF_G1n?BUD!0*jDH#f-E2vgS^}x-ea;_4G}5nT;0G` zwuTYAbQTxFi(u1WE39@4PnELYa3?f=;F7QQy3Dv#=s;0Hjdq7BrTVZ$Pn|AAVK`tU z`XAVVM)eDT41z)gFMmt|w*~4#C4mHoEk_zM)M3`Huj*Ks#qUJT(9aQx`dN?(Azx%} zQ&x}^hJaJu{j@@@U*w(%rnXT44?xIH2iWhc(8|3!|D1N~Us`S(D$~g#Rf{l;WD3aN zse9CAOPT`M|k@W6tXQy#jj~W!LJo@J3E`-;jbb zlIqf|85?Wd_Sv@}(5g9kzhB<*&&TBv-5$}|R}I*&0!XE0ZnY*y7rt#F){<{&YGp4x zk|WkU5wWGjGU(E?vI*TkS~xt8Yqt;|`|Dp&oKNO7*cz4ep2AZXFgG(gUbzK1P%hFI z>FjfncLXHaeIk&=hLhdGvu1N#IW7GmzHAbNz4oqr)>G6f2 ziIisztyav%F~p@m_*(h zLi0leJrLJ$;5f{J0CyqpAj1mS>&@*f;LHXo(}} z!gIl$(Nkt+*&@@9q}nmLX(6C88=x$>sAnF88$H2bFU3uudmW#dr|+k#bT2f7v&`_sb_m?6PM1nkO zcZb`hUjfpu7g_RK=3~zF28!oKtR9n`pWJiwY9`f<+^6Uv_6N93qGjj*#qyZ{7s^vK zak6u9G%|6*{|~;WNGEULXkzP(&+y-ZvVox!of4gpovrh4rIQxJf2;BT3k53b(8-t> zTNnu1xogq?YO`@L($eFzGW3>K6A0UyD zm7bC9|A!>@NX0#lI)HYr)Ro7i=?IbT_~(b1g8U5xA5PhgaT5hr%e%Y|sRdl4`gxWb z=17P;Ket;|fKzn<3d%5WR!JBeoeW2ssg7GRcsnUcjp~Jc_|e<(bF$`o>-zTlR+_3i z|2g5K`SIdg6zbFN-Yc|yKjPH&{+QZ1Dto{Ad083!`N;YS^W*N=**SspeLb`LVgGz? zHF5KEh4=IA=l8uJ)$;k!x3pLH!{hh* zlC;61uCl4sfTv-U>e zix9hIU#|7JtM2emIj=fBt-XDEyX#Zw^ZHG}ndym<#xE-^58j0b!cC$DxIDvx3FDlX z?5;4q|<^BZ%!38wS~8V7e_JStH$b)_+e|EVR~ zfL-h^OUO0tl}mAlzidNJ=efqSvhgDYxsQGK#LhEM7EVj}%O-{GdL}xKbdjH0rrUB@>;r_ zx}jeeQB@n`lHcP;-$n9piBzs;gnzg`ogQCd2{aS8Mo7sI1V;ksC=C>|g|8I6UDQV$ zdy{Q!x_8qUY0^N%az~{vo((c%e8#^}59Rh#EF+;mE2Km(D25D)m-uA+vJjYRyH1AJ zSUN^~cTf`V{3iMf{`{t&X*jGLBj=z1mLcqOWjm=yPJTF=(HQ$C!=sK$%}SPFSzH2fN+3WT=>q=mxLYainO zGeJO&Szh7Z0qM1vW04~Rpw^Ge@~q$g1(b${jM$<%G9fQAEnl?c3*|0T%IRQO_5=-`krDEX!0nkT#E4iw zM3TjQXS?HKp~_#n;LL*6ak63BD>X$W*&NN@5*=^D3)!djwCsR4T)q2)sL}>AzsvIj zdhE>a)$NVHNC1-CC?J(GaN&!`snQZ>Y$1_+8ZbUG$DVw}I#0d;B%YXscwQQ)0JUgS znLa?Eq=DeJgeqFaV4jrxGM(|$@=wv?ozd3j1Fi=cj>VB+ONdP@@uh_OrR8~tO5%TM z*C$o9SG21D^Mg4hka_SW;2V(J!z(WD{5Z{l4sFX*@xo#WaV8;Ez!XxCWGbi~bFKLE z(LJCIalz>$>tmFN>pAmkRV*tp=;|)wE;P)f$KOJk@DHoxxNVqzUj-b{0c41W<^RqoduXb2}_s$*O?a zAI!S_{=Ufw=zKYn6FPbH)wp_qKOJi?wDgS|m^j@FY^XB#@EfZ1BqX=lJw&~RFf80T zr>6;zLJV-~Z^Idrk6BKJ!jGv;7fm;21GOTp;>#t`5L!tb>nisHln|^uh$4t|YAZ2} zZYS^%=^;1BjO2aR-hNjd=Woa*8#Gg*lMS^F4*<|B + +
+ +> The `ToItems` filter can be invoked multiple times. A schema item must match all filter criteria in order for the directive to be applied. -**Adding arguments** +**Adding arguments via .ApplyDirective()** Adding Arguments via schema options is a lot more flexible than via the apply directive attribute. Use the `.WithArguments` method to supply either a static set of arguments for all matched schema items or a `Func` that returns a collection of any parameters you want on a per item basis. + +
+
+ ```csharp // startup.cs public void ConfigureServices(IServiceCollection services) @@ -353,25 +408,49 @@ public void ConfigureServices(IServiceCollection services) services.AddGraphQL(options => { options.AddGraphType(); - options.ApplyDirective("monitor") - .WithArguments("trace") - .ToItems(schemaItem => schemaItem is IObjectGraphType ogt && - ogt.ObjectType == typeof(Person)); + options.ApplyDirective("deprecated") + .WithArguments("Names don't matter") + .ToItems(schemaItem => + schemaItem.IsGraphField("name")); } +} +``` + +
+
+ +```javascript +// GraphQL Type Definition Equivilant +type Person { + name: String @deprecated("Names don't matter") } ``` + +
+
+ +
## Directives as Services -Directives are invoked as services through your DI container when they are executed. When you add types to your schema during its initial configuration, GraphQL ASP.NET will automatically register any directives it finds as services in your `IServiceCollection` instance. However, there are times when it cannot do this, such as when you apply a directive by its name. These late bound directives may still be discoverable and graphql will attempt to add them to your schema whenever it can. However, it may do this after the opportunity to register them with the DI container has passed. +Directives are invoked as services through your DI container when they are executed. When you add types to your schema during its initial configuration, GraphQL ASP.NET will automatically register any directives it finds attached to your objects and properties as services in your `IServiceCollection` instance. However, there are times when it cannot do this, such as when you apply a directive by its string declared name. These late-bound directives may still be discoverable later and graphql will attempt to add them to your schema whenever it can. However, it may do this after the opportunity to register them with the DI container has passed. -When this occurs, if your directive contains a public, parameterless constructor it will still instantiate and use your directive as normal. If the directive contains dependencies in the constructor that it can't resolve, execution of that directive will fail and an exception will be thrown. To be safe, make sure to add any directives you may use to your schema during the `.AddGraphQL()` configuration. Directives are discoverable and will be included via the `options.AddAssembly()` helper method. +When this occurs, if your directive contains a public, parameterless constructor graphql will still instantiate and use your directive as normal. If the directive contains dependencies in the constructor that it can't resolve, execution of that directive will fail and an exception will be thrown. To be safe, make sure to add any directives you may use to your schema during the `.AddGraphQL()` configuration method. Directives are directly discoverable and will be included via the `options.AddAssembly()` helper method as well. The benefit of ensuring your directives are part of your `IServiceCollection` should be apparent: -* The directive instance creation will obey lifetime scopes (transient, scoped, singleton). +* The directive instance will obey lifetime scopes (transient, scoped, singleton). * The directive can be instantiated with any dependencies or services you wish; making for a much richer experience. +## Directive Security +Directives are not considered a layer of security by themselves. Instead, they are invoked within the security context of their applied target: + +* **Execution Directives** - Execute in the same context as the field to which they are applied. If the requestor can resolve the field, they can also execute the directives attached to that field. + +* **Type System Directives** - Are implicitly trusted and executed without a `ClaimsPrincipal` while the schema is being built. No additional security is applied to type system directives. + +> WARNING: Only use type system directives that you trust. They will always be executed when applied to one or more schema items. + ## Understanding the Type System GraphQL ASP.NET builds your schema and all of its types from your controllers and objects. In general, you do not need to interact with it, however; when applying type system directives you are affecting the final generated schema at run time, making changes as you see fit. When doing this you are forced to interact with the internal type system. From 4638e5db252d806613f5b79cbd0a066578b6fa9e Mon Sep 17 00:00:00 2001 From: Kevin Carroll Date: Sun, 29 May 2022 17:01:17 -0700 Subject: [PATCH 4/6] added notes about type system directive order --- docs/advanced/directives.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/advanced/directives.md b/docs/advanced/directives.md index 3e9e8ce..1451f64 100644 --- a/docs/advanced/directives.md +++ b/docs/advanced/directives.md @@ -390,6 +390,8 @@ type Person @monitor { > The `ToItems` filter can be invoked multiple times. A schema item must match all filter criteria in order for the directive to be applied. +> Type system directives are applied in the order of declaration with the `[ApplyDirective]` attributes taking precedence over the `.ApplyDirective()` method. + **Adding arguments via .ApplyDirective()** Adding Arguments via schema options is a lot more flexible than via the apply directive attribute. Use the `.WithArguments` method to supply either a static set of arguments for all matched schema items From 89e750a3c5429bacafb850a261d49a065ca21217 Mon Sep 17 00:00:00 2001 From: Kevin Carroll Date: Mon, 30 May 2022 11:30:40 -0700 Subject: [PATCH 5/6] updated union doc with new MapType verbiage --- docs/types/unions.md | 47 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/docs/types/unions.md b/docs/types/unions.md index 7fe5852..b893f7b 100644 --- a/docs/types/unions.md +++ b/docs/types/unions.md @@ -4,11 +4,9 @@ title: Unions sidebar_label: Unions --- -## Unions - Unions are an aggregate graph type representing multiple, different `OBJECT` types with no guaranteed fields or interfaces in common; for instance, `Salad` or `Bread`. Because of this, unions define no fields themselves but provide a common way to query the fields of the union members when one is encountered. -Unlike other graph types there is no concrete representation of unions. Where a `class` is an object graph type or a .NET enum is an enum graph type there is no analog for unions. Instead unions are virtual types that exist at runtime based their declaration site in a `GraphController`. +Unlike other graph types there is no concrete representation of unions. Where a `class` is an object graph type or a .NET `enum` is an enum graph type there is no analog for unions. Instead unions are semi-virtual types that are created from proxy classes that represent them at design time. ## Declaring a Union @@ -56,9 +54,9 @@ query { In this example we : -- Declared an action method named `RetrieveFood` with a field name of `searchFood` -- Declared a union on our graph named `SaladOrBread` -- Included two object types in the union: `typeof(Salad)` and `typeof(Bread)` +- Declared an action method named `RetrieveFood` with a graph field name of `searchFood` +- Declared a union type on our graph named `SaladOrBread` +- Included two object types in the union: `Salad` and `Bread` Unlike with [interfaces](./interfaces) where the possible types returned from an action method can be declared else where, you MUST provide the types to include in the union in the declaration. @@ -66,7 +64,7 @@ Unlike with [interfaces](./interfaces) where the possible types returned from an ### What to Return for a Union -Notice we have a big question mark on what the action method returns in the above example. From a C# perspective, there is no `IFood` interface shared between `Salad` and `Bread`. This represents a problem for static-typed languages like C#. Since unions are virtual types there exists no common `System.Type` that you can return for generated data. `System.Object` might work but it tends to be too general and the runtime will reject it as a safe guard. +Notice we have a big question mark on what the action method returns in the above example. From a C# perspective, in this example, there is no `IFood` interface shared between `Salad` and `Bread`. This represents a problem for static-typed languages like C#. Since unions are virtual types there exists no common type that you can return for generated data. `System.Object` might work but it tends to be too general and the runtime will reject it as a safe guard. So what do you do? Return an `IGraphActionResult` instead and let the runtime handle the details. @@ -92,11 +90,11 @@ public class KitchenController : GraphController } ``` -Under the hood, GraphQL ASP.NET looks at the returned object type at runtime to evaluate the graph type reference then continues on in that scope with the returned value. +> Any controller action that declares a union MUST return an `IGraphActionResult` ## Union Proxies -If you need to reuse your unions in multiple methods you'll want to create a class that implements `IGraphUnionProxy` (or inherits from `GraphUnionProxy`) to encapsulate the details, then add that as a reference in your controller methods instead of the individual types. This can also be handy for uncluttering your code if you have a lot of possible types for the union. The return type of your method will still need to be `IGraphActionResult`. You cannot return a `IGraphUnionProxy` as a value. +In the example above we declare the union inline. But what if we wanted to reuse the `SaladOrBread` union in multiple places. You could declare the union exactly the same on each method or use a union proxy. Create a class that implements `IGraphUnionProxy` or inherits from `GraphUnionProxy` to encapsulate the details, then add that as a reference in your controller methods instead of the individual types. This can also be handy for uncluttering your code if you have a lot of possible types for the union. The return type of your method will still need to be `IGraphActionResult`. You cannot return a `IGraphUnionProxy` as a value. ```csharp public class KitchenController : GraphController @@ -107,24 +105,27 @@ public class KitchenController : GraphController } // SaladOrBread.cs -using GraphQL.AspNet.Schemas.TypeSystem; public class SaladOrBread : GraphUnionProxy { public SaladOrBread() - : base(typeof(Salad), typeof(Bread)) - {} + : base() + { + this.Name = "SaladOrBread"; + this.AddType(typeof(Salad)); + this.AddType(typeof(Bread)); + } } ``` -> You can create a union proxy by inheriting from `GraphUnionProxy` or directly implementing `IGraphUnionProxy` +> If you don't supply a name, graphql will automatically use the name of the proxy as the name of the union. ## Union Name Uniqueness -Union names must be unique in a schema. If you do declare a union in multiple action methods without a proxy, GraphQL will attempt to validate the references by name and included types. As long as all declarations are the same, that is the name and the set of types match, then there is no issue. Otherwise, a `GraphTypeDeclarationException` will be thrown. +Union names must be unique in a schema. If you do declare a union in multiple action methods without a proxy, GraphQL will attempt to validate the references by name and included types. As long as all declarations are the same, that is the name and the set of included types, then there graphql will accept the union. Otherwise, a `GraphTypeDeclarationException` will be thrown at startup. ## Liskov Substitutions -[Liskov substitutions](https://en.wikipedia.org/wiki/Liskov_substitution_principle) (the L in [SOLID](https://en.wikipedia.org/wiki/SOLID)) are an important part of object oriented programming and .NET. To be able to have one class masquerade as another allows us to easily extend our code's capabilities without any rework. +[Liskov substitutions](https://en.wikipedia.org/wiki/Liskov_substitution_principle) (the L in [SOLID](https://en.wikipedia.org/wiki/SOLID)) are an important part of object oriented programming. To be able to have one class masquerade as another allows us to easily extend our code's capabilities without any rework. ```csharp @@ -188,15 +189,12 @@ query {
-Most of the time, GraphQL ASP.NET can correctly interpret which type it should match on to allow the query to progress. However, in the above example, we declare a union, `RollOrBread`, that is of types `Roll` and `Bread` yet we return a `Bagel` from the action method. - -Since `Bagel` inherits from `Roll` and subsequently from `Bread` which type should we match against when executing the following query? +Most of the time, graphql can correctly interpret the correct union type of a returned data object and continue processing the query. However, in the above example, we declare a union, `RollOrBread`, that is of types `Roll` and `Bread` yet we return a `Bagel` from the action method. -The bagel is both the type `Roll` AND the type `Bread`, it could be used as either. GraphQL ASP.NET will be unable to determine which type to use and can't advance the query to select the appropriate fields. The query result is said to be indeterminate. +Since `Bagel` is both a `Roll` and `Bread` which type should graphql match against to continue executing the query? Since it could be either, graphql will be unable to determine which type to use and can't advance the query to select the appropriate fields. The query result is said to be indeterminate. -GraphQL ASP.NET offers a way to allow you to take control of your unions and make the determination on your own. The `ResolveType` method of `IGraphUnionProxy` will be called whenever a query result is indeterminate, allowing you to choose which of your UNION's allowed types should be used. +GraphQL ASP.NET offers a way to allow you to take control of your unions and make the determination on your own. The `MapType` method of `GraphUnionProxy` will be called whenever a query result is indeterminate, allowing you to choose which of your UNION's allowed types should be used. -> Note: `IGraphUnionProxy.ResolveType` is not based on the explicit value being inspected, but only on the `System.Type`. The results for a given field are cached for speedier type resolution on subsequent queries. ```csharp // RollOrBread.cs @@ -206,7 +204,7 @@ public class RollOrBread : GraphUnionProxy : base(typeof(Roll), typeof(Bread)) {} - public override Type ResolveType(Type runtimeObjectType) + public override Type MapType(Type runtimeObjectType) { if (runtimeObjectType == typeof(Bagel)) return typeof(Roll); @@ -226,8 +224,11 @@ public class BakeryController : GraphController } ``` +> Note: `MapType` is not based on the resolved field value, but only on the `System.Type`. This is by design to guarantee consistency in query execution. +> If your returned type causes the query to remain indeterminate a validation error (rule 6.4.3) will be applied to the query. + The query will now interpret all `Bagels` as `Rolls` and be able to process the query correctly. If, via your logic you are unable to determine which of your Union's types to return then return null and GraphQL will supply the caller with an appropriate error message stating the query was indeterminate. Also, returning any type other than one that was formally declared as part of your Union will result in the same indeterminate state. -**Note:** Most of the time GraphQL ASP.NET will never call the `ResolveType` method on your UNION. If your union types do not share an inheritance chain, for instance, the method will never be called. If your types do share an inheritance chain, such as in the example above, considering using an interface graph type along with specific fragments instead of a UNION, to avoid the issue altogether. +**Note:** Most of the time GraphQL ASP.NET will never call the `TypeMapper` on your UNION. If your union types do not share an inheritance chain, for instance, the method will never be called. If your types do share an inheritance chain, such as in the example above, considering using an interface graph type along with specific fragments instead of a UNION, to avoid the issue altogether. From 5285e5050f3ce039ba7125c9617ec5a4f541cac4 Mon Sep 17 00:00:00 2001 From: Kevin Carroll Date: Mon, 30 May 2022 15:40:55 -0700 Subject: [PATCH 6/6] added missing word on directives doc --- docs/advanced/directives.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced/directives.md b/docs/advanced/directives.md index 1451f64..3ca4939 100644 --- a/docs/advanced/directives.md +++ b/docs/advanced/directives.md @@ -466,5 +466,5 @@ these diagrams are not exaustive. Look at the [source code](https://github.com/g There are a robust set of of built in extensions for `ISchemaItem` that can help you filter your data. See the [full source code](https://github.com/graphql-aspnet/graphql-aspnet/tree/master/src/graphql-aspnet/Configuration/SchemaItemExtensions.cs) for details. ## Demo Project -See the [Demo Projects](../reference/demo-projects.md) page for a demonstration on creating a type system for extending a field resolver and an execution directives +See the [Demo Projects](../reference/demo-projects.md) page for a demonstration on creating a type system directive for extending a field resolver and an execution directives that manipulates a string field result at runtime. \ No newline at end of file

HnVLoJ4-+QF59yC5-m|Q@U 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 f$w=~R3📌  [Custom Directives](https://github.com/graphql-aspnet/demo-projects/tree/master/Custom-Directives) + +Demostrates creating and applying a type system directive and a custom execution directive. + + 📌  [Subscriptions w/ Azure Service Bus](https://github.com/graphql-aspnet/demo-projects/tree/master/Subscriptions-AzureServiceBus) Demonstrates the use of an external subscription event publisher and a consumer to deserialize and route events. Use of this demo project requires your own [Azure Service Bus](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview) namespace. @@ -27,3 +32,4 @@ Demonstrates the use of an external subscription event publisher and a consumer 📌  [Subscriptions w/ React & Apollo Client](https://github.com/graphql-aspnet/demo-projects/tree/master/Subscriptions-ReactApolloClient) A sample react application that makes use of the [apollo client](https://www.apollographql.com/docs/react/) to connect to a GraphQL ASP.NET server. + From d97a8b1f765d0afe40df8f46194d43ab441a9bb1 Mon Sep 17 00:00:00 2001 From: Kevin Carroll Date: Sun, 29 May 2022 16:19:15 -0700 Subject: [PATCH 3/6] added security section and additional examples to directives --- docs/advanced/directives.md | 117 ++++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 19 deletions(-) diff --git a/docs/advanced/directives.md b/docs/advanced/directives.md index b61c128..3e9e8ce 100644 --- a/docs/advanced/directives.md +++ b/docs/advanced/directives.md @@ -77,7 +77,7 @@ Directives can't directly return data or resolve a field. They can only indicate * `this.Cancel()`: * The directive failed and the schema should not be generated or the target field should be dropped. -> throwing an exception within an action method of a directive will cause the current query to fail completely. Use `this.Cancel()` to only drop the single targeted field. +> Throwing an exception within an action method of a directive will cause the current query to fail completely. Use `this.Cancel()` to discard only the currently resolving field. Normal nullability validation rules still apply. ### Directive Target The `this.DirectiveTarget` property will contain either an `ISchemaItem` for type system directives or the resolved field value for execution directives. This value is useful in performing additional operations such as extending a field resolver during schema generation or taking further action against a resolved field. @@ -176,7 +176,7 @@ It is recommended that your directives act independently and be self contained. ## Type System Directives -### Example: @ToUpper +### Example: @toUpper This directive will extend the resolver of a field to turn any strings into upper case letters. @@ -215,13 +215,44 @@ This directive will extend the resolver of a field to turn any strings into uppe This Directive: -* Targets a FIELD_DEFINITION and can be applied to any field of any type. +* Targets any FIELD_DEFINITION. * Ensures that the target field returns returns a string. * Extends the field's resolver to convert the result to an upper case string. * The directive is executed once per field its applied to when the schema is created. The extension method is executed on every field resolution. * If an exception is thrown the schema will fail to create and the server will not start. * if the action method returns a cancel result (e.g. `this.Cancel()`) the schema will fail to create and the server will not start. +### Example: @deprecated + +```csharp + public sealed class DeprecatedDirective : GraphDirective + { + [DirectiveLocations(DirectiveLocation.FIELD_DEFINITION | DirectiveLocation.ENUM_VALUE)] + public IGraphActionResult Execute([FromGraphQL("reason")] string reason = "No longer supported") + { + if (this.DirectiveTarget is IGraphField field) + { + field.IsDeprecated = true; + field.DeprecationReason = reason; + } + else if (this.DirectiveTarget is IEnumValue enumValue) + { + enumValue.IsDeprecated = true; + enumValue.DeprecationReason = reason; + } + + return this.Ok(); + } + } +``` + + +This Directive: + +* Targets a FIELD_DEFINITION or ENUM_VALUE. +* Marks the field or enum value as deprecated and attaches the provided deprecation reason +* The directive is executed once per field and enum value its applied to when the schema is created. + ### Applying Type System Directives #### Using the `[ApplyDirective]` attribute @@ -284,7 +315,7 @@ type Person @monitor {

-**Adding Arguments** +**Adding Arguments with [ApplyDirective]** Arguments added to the apply directive attribute will be passed to the directive in the order they are encountered. The supplied values must be coercable into the expected data types for an input parameters. @@ -293,9 +324,11 @@ Arguments added to the apply directive attribute will be passed to the directive ```csharp // Person.cs -[ApplyDirective("monitor", "trace")] public class Person { + [ApplyDirective( + "deprecated", + "Names don't matter")] public string Name{ get; set; } } ``` @@ -305,21 +338,23 @@ public class Person ```javascript // GraphQL Type Definition Equivilant -type Person @monitor(level: "trace") { - name: String +type Person { + name: String @deprecated("Names don't matter") } ``` -

#### Using Schema Options Alternatively, instead of using attributes to apply directives you can apply directives during schema configuration: +