PK HAoa,mimetypeapplication/epub+zipPK HA META-INF/PK HAOEBPS/PK HA OEBPS/images/PK HAOEBPS/imagesdb/PK HAhhMETA-INF/container.xml PK HAЯ/6ccOEBPS/JAXRSBaseAnnotations.html Basic JAX-RS annotations

Basic JAX-RS annotations

The most basic pieces of information required by a RESTful Web service implementation are:

JAX-RS defines a set of annotations that provide this basic information. All resource classes must have at least one of these annotations.

The @Path annotation specifies the URI of a resource. The annotation is defined by the javax.ws.rs.Path interface and it can be used to decorate either a resource class or a resource method. It takes a string value as its only parameter. The string value is a URI template that specifies the location of an implemented resource.

The URI template specifies a relative location for the resource. As shown in Example 2.2, the template can contain the following:

  • unprocessed path components

  • parameter identifiers surrounded by { }

    [Note]Note

    Parameter identifiers can include regular expressions to alter the default path processing.

For example, the URI template widgets/{color}/{number} would map to widgets/blue/12. The value of the color parameter is assigned to blue. The value of the number parameter is assigned 12.

How the URI template is mapped to a complete URI depends on what the @Path annotation is decorating. If it is placed on a root resource class, the URI template is the root URI of all resources in the tree and it is appended directly to the URI at which the service is published. If the annotation decorates a sub-resource, it is relative to the root resource URI.

JAX-RS uses five annotations for specifying the HTTP verb that will be used for a method:

  • javax.ws.rs.DELETE specifies that the method maps to a DELETE.

  • javax.ws.rs.GET specifies that the method maps to a GET.

  • javax.ws.rs.POST specifies that the method maps to a POST.

  • javax.ws.rs.PUT specifies that the method maps to a PUT.

  • javax.ws.rs.HEAD specifies that the method maps to a HEAD.

When you map your methods to HTTP verbs, you must ensure that the mapping makes sense. For example, if you map a method that is intended to submit a purchase order, you would map it to a PUT or a POST. Mapping it to a GET or a DELETE would result in unpredictable behavior.

PK HAJ|i%OEBPS/JAXRSDefaultValueInjection.html Specifying a default value to inject

Specifying a default value to inject

To provide for a more robust service implementation, you may want to ensure that any optional parameters can be set to a default value. This can be particularly useful for values that are taken from query parameters and matrix parameters since entering long URI strings is highly error prone. You may also want to set a default value for a parameter extracted from a cookie since it is possible for a requesting system not have the proper information to construct a cookie with all the values.

The javax.ws.rs.DefaultValue annotation can be used in conjunction with the following injection annotations:

The @DefaultValue annotation specifies a default value to be used when the data corresponding to the injection annotation is not present in the request.

Example 3.9 shows the syntax for using the @DefaultValue annotation.

The annotation must come before the parameter, bean, or field, it will effect. The position of the @DefaultValue annotation relative to the accompanying injection annotation does not matter.

The @DefaultValue annotation takes a single parameter. This parameter is the value that will be injected into the field if the proper data cannot be extracted based on the injection annotation. The value can be any String value. The value should be compatible with type of the associated field. For example, if the associated field is of type int, a default value of blue results in an exception.

If the type of the annotated parameter, bean or field is List, Set, or SortedSet then the resulting collection will have a single entry mapped from the supplied default value.

Example 3.10 shows two examples of using the @DefaultValue to specify a default value for a field whose value is injected.

The getMonster() method in Example 3.10 is invoked when a GET request is sent to baseURI/monster. The method expects two query parameters, id and type, appended to the URI. So a GET request using the URI baseURI/monster?id=1&type=fomóiri would return the Fomóiri with the id of one.

Because the @DefaultValue annotation is placed on both parameters, the getMonster() method can function if the query parameters are omitted. A GET request sent to baseURI/monster is equivalent to a GET request using the URI baseURI/monster?id=42&type=bogeyman.

PK HAWYWVOEBPS/JAXRSFormAnnotations.html Injecting data from HTML forms

Injecting data from HTML forms

HTML forms are an easy means of getting information from a user and they are also easy to create. Form data can be used for HTTP GET requests and HTTP POST requests:

GET

When form data is sent as part of an HTTP GET request the data is appended to the URI as a set of query parameters. Injecting data from query parameters is discussed in Using query parameters.

POST

When form data is sent as part of an HTTP POST request the data is placed in the HTTP message body. The form data can be handled using a regular entity parameter that supports the form data. It can also be handled by using the @FormParam annotation to extract the data and inject the pieces into resource method parameters.

The javax.ws.rs.FormParam annotation extracts field values from form data and injects the value into resource method parameters. The annotation takes a single parameter that specifies the key of the field from which it extracts the values. The associated parameter must conform to the data types described in Supported data types.

[Important]Important

The JAX-RS API Javadoc states that the @FormParam annotation can be placed on fields, methods, and parameters. However, the @FormParam annotation is only meaningful when placed on resource method parameters.

Example 3.8 shows a resource method that injects form data into its parameters. The method assumes that the client's form includes three fields—title, tags, and body—that contain string data.

PK HAe}}OEBPS/JAXRSGenericEntity.html Returning entities with generic type information

Returning entities with generic type information

There are occasions where the application needs more control over the MIME type of the returned object or the entity provider used to serialize the response. The JAX-RS javax.ws.rs.core.GenericEntity<T> class provides finer control over the serializing of entities by providing a mechanism for specifying the generic type of the object representing the entity.

One of the criteria used for selecting the entity provider that serializes a response is the generic type of the object. The generic type of an object represents the Java type of the object. When a common Java type or a JAXB object is returned, the runtime can use Java reflection to determine the generic type. However, when a JAX-RS Response object is returned, the runtime cannot determine the generic type of the wrapped entity and the actual Java class of the object is used as the Java type.

To ensure that the entity provider is provided with correct generic type information, the entity can be wrapped in a GenericEntity<T> object before being added to the Response object being returned.

Resource methods can also directly return a GenericEntity<T> object. In practice, this approach is rarely used. The generic type information determined by reflection of an unwrapped entity and the generic type information stored for an entity wrapped in a GenericEntity<T> object are typically the same.

There are two ways to create a GenericEntity<T> object:

PK HAn\OEBPS/JAXRSHTTPAnnotations.html Injecting data from the HTTP message header

Injecting data from the HTTP message header

In normal usage the HTTP headers in a request message pass along generic information about the message, how it is to be handled in transit, and details about the expected response. While a few standard headers are commonly recognized and used, the HTTP specification allows for any name/value pair to be used as an HTTP header. The JAX-RS APIs provide an easy mechanism for injecting HTTP header information into a resource implementation.

One of the most commonly used HTTP headers is the cookie. Cookies allow HTTP clients and servers to share static information across multiple request/response sequences. The JAX-RS APIs provide an annotation inject data directly from a cookie into a resource implementation.

The javax.ws.rs.HeaderParam annotation is used to inject the data from an HTTP header field into a parameter, field, or bean property. It has a single parameter that specifies the name of the HTTP header field from which the value is extracted and injected into the resource implementation. The associated parameter, field, or bean property must conform to the data types described in Supported data types.

Example 3.6 shows code for injecting the value of the HTTP If-Modified-Since header into a class' oldestDate field.

Cookies are a special type of HTTP header. They are made up of one or more name/value pairs that are passed to the resource implementation on the first request. After the first request, the cookie is passes back and forth between the provider and consumer with each message. Only the consumer, because they generate requests, can change the cookie. Cookies are commonly used to maintain session across multiple request/response sequences, storing user settings, and other data that can persist.

The javax.ws.rs.CookieParam annotation extracts the value from a cookie's field and injects it into a resource implementation. It takes a single parameter that specifies the name of the cookie's field from which the value is to be extracted. In addition to the data types listed in Supported data types, entities decorated with the @CookieParam can also be a Cookie object.

Example 3.7 shows code for injecting the value of the handle cookie into a field in the CB class.

If an error occurs when attempting to inject data using one of the HTTP message injection annotations a WebApplicationException exception wrapping the original exception is generated. The WebApplicationException exception's status is set to 400.

PK HAW_11OEBPS/JAXRSPublishing.html Chapter 6. Publishing a Service

Chapter 6. Publishing a Service

PK HA7((OEBPS/JAXRSResponseCommon.html Returning plain Java constructs

Returning plain Java constructs

In many cases a resource class can return a standard Java type, a JAXB object, or any object for which the application has an entity provider. In these cases the runtime determines the MIME type information using the Java class of the object being returned. The runtime also determines the appropriate HTTP return code to send to the consumer.

Resource methods can return void or any Java type for which an entity writer is provided. By default, the runtime has providers for the following:

Natively supported types lists all of the return types supported by default. Custom writers describes how to implement a custom entity writer.

The runtime determines the MIME type of the returned entity by first checking the resource method and resource class for a @Produces annotation. If it finds one, it uses the MIME type specified in the annotation. If it does not find one specified by the resource implementation, it relies on the entity providers to determine the proper MIME type.

By default the runtime assign MIME types as follows:

Applications can use other mappings by implementing custom entity providers as described in Custom writers.

When resource methods return plain Java constructs, the runtime automatically sets the response's status code if the resource method completes without throwing an exception. The status code is set as follows:

If an exception is thrown before the resource method completes the return status code is set as described in Handling Exceptions.

PK HAZZOEBPS/JAXRSResponseObject.html Fine tuning an application's responses

Fine tuning an application's responses

Basics of building responses
Creating responses for common use cases
Handling more advanced responses
PK HA}>((!OEBPS/JAXRSResponseObjectAdv.html Handling more advanced responses

Handling more advanced responses

The Response class methods provide short cuts for creating responses for common cases. When you need to address more complicated cases such as specifying cache control directives, adding custom HTTP headers, or sending a status not handled by the Response class, you need to use the ResponseBuilder classes methods to populate the response before using the build() method to generate the response object.

[Tip]Tip

As discussed in Getting a response builder, you can use the Apache CXF ResponseBuilderImpl class to create a response builder instance that can be manipulated directly.

Custom headers are added to a response using the ResponseBuilder class' header() method. The header() method takes two parameters:

  • name—a string specifying the name of the header

  • value—a Java object containing the data stored in the header

You can set multiple headers on the message by calling the header() method repeatedly.

Example 4.7 shows code for adding a header to a response.

Custom headers are added to a response using the ResponseBuilder class' cookie() method. The cookie() method takes one or more cookies. Each cookie is stored in a javax.ws.rs.core.NewCookie object. The easiest of the NewCookie class' contructors to use takes two parameters:

  • name—a string specifying the name of the cookie

  • value—a string specifying the value of the cookie

You can set multiple cookies by calling the cookie() method repeatedly.

Example 4.8 shows code for adding a cookie to a response.

[Warning]Warning

Calling the cookie() method with a null parameter list erases any cookies already associated with the response.

When you want to return a status other than one of the statuses supported by the Response class' helper methods, you can use the ResponseBuilder class' status() method to set the response's status code. The status() method has two variants. One takes an int that specifies the response code. The other takes a Response.Status object to specify the response code.

The Response.Status class is an enumeration enclosed in the Response class. It has entries for most of the defined HTTP response codes.

Example 4.9 shows code for setting the response status to 404 Not Found.

The ResponseBuilder class' cacheControl() method allows you to set the cache control headers on the response. The cacheControl() method takes a javax.ws.rs.CacheControl object that specifies the cache control directives for the response.

The CacheControl class has methods that correspond to all of the cache control directives supported by the HTTP specification. Where the directive is a simple on or off value the setter method takes a boolean value. Where the directive requires a numeric value, such as the max-age directive, the setter takes an int value.

Example 4.10 shows code for setting the no-store cache control directive.

PK HAL, #OEBPS/JAXRSResponseObjectBasic.html Basics of building responses

Basics of building responses

RESTful services often need more precise control over the response returned to a consumer than is allowed when a resource method returns a plain Java construct. The JAX-RS Response class allows a resource method to have some control over the return status sent to the consumer and to specify HTTP message headers and cookies in the response.

Response objects wrap the object representing the entity that is returned to the consumer. Response objects are instantiated using the ResponseBuilder class as a factory.

The ResponseBuilder class also has many of the methods used to manipulate the response's metadata. For instance the ResonseBuilder class contains the methods for setting HTTP headers and cache control directives.

The Response class has a protected constructor, so they cannot be instantiated directly. They are created using the ResponseBuilder class enclosed by the Response class. The ResponseBuilder class is a holder for all of the information that will be encapsulated in the response created from it. The ResponseBuilder class also has all of the methods responsible for setting HTTP header properties on the message.

The Response class does provide some methods that ease setting the proper response code and wrapping the entity. There are methods for each of the common response status codes. The methods corresponding to status that include an entity body, or required metadata, include versions that allow for directly setting the information into the associated response builder.

The ResponseBuilder class' build() method returns a response object containing the information stored in the response builder at the time the method is invoked. After the response object is returned, the response builder is returned to a clean state.

There are two ways to get a response builder:

For more information about the Response class see the Response class' Javadoc.

For more information about the ResponseBuilder class see the ResponseBuilder class' Javadoc.

For more information on the Apache CXF ResponseBuilderIml class see the ResponseBuilderImpl Javadoc.

PK HAʵ**$OEBPS/JAXRSResponseObjectCommon.html Creating responses for common use cases

Creating responses for common use cases

The Response class provides shortcut methods for handling the more common responses that a RESTful service will need. These methods handle setting the proper headers using either provided values or default values. They also handle populating the entity body when appropriate.

When a request is successfully processed the application needs to send a response to acknowledge that the request has been fulfilled. That response may contain an entity.

The most common response when successfully completing a response is OK. An OK response typically contains an entity that corresponds to the request. The Response class has an overloaded ok() method that sets the response status to 200 and adds a supplied entity to the enclosed response builder. There are five versions of the ok() method. The most commonly used variant are:

  • Response.ok()—creates a response with a status of 200 and an empty entity body.

  • Response.ok(java.lang.Object entity)—creates a response with a status of 200, stores the supplied object in the responses entity body, and determines the entities media type by introspecting the object.

Example 4.3 shows an example of creating a response with an OK status.

For cases where the requester is not expecting an entity body, it may be more appropriate to send a 204 No Content status instead of an 200 OK status. The Response.noContent() method will create an appropriate response object.

Example 4.4 shows an example of creating a response with an 204 status.

The Response class provides methods for handling three of the redirection response statuses.

Example 4.5 shows an example of creating a response with an 304 status.

The Response class provides methods to create responses for two basic processing errors:

  • serverError()();—creates a response with a status of 500 Internal Server Error.

  • notAcceptable()(java.util.List<javax.ws.rs.core.Variant> variants);—creates a response with a 406 Not Acceptable status and an entity body containing a list of acceptable resource types.

Example 4.6 shows an example of creating a response with an 500 status.

PK HA;kFFOEBPS/JAXRSURIAnnotations.html Injecting data from a request URI

Injecting data from a request URI

One of the best practices for designing a RESTful Web service is that each resource should have a unique URI. A developer can use this principle to provide a good deal of information to the underlying resource implementation. When designing URI templates for a resource, a developer can build the templates to include parameter information that can be injected into the resource implementation. Developers can also leverage query and matrix parameters for feeding information into the resource implementations.

One of the more common mechanisms for getting information about a resource is through the variables used in creating the URI templates for a resource. This is accomplished using the javax.ws.rs.PathParam annotation. The @PathParam annotation has a single parameter that identifies the URI template variable from which the data will be injected.

In Example 3.1 the @PathParam annotation specifies that the value of the URI template variable color is injected into the itemColor field.

The data types supported by the @PathParam annotation are different from the ones described in Supported data types. The entity into which the @PathParam annotation injects data must be of one of the following types:

  • PathSegment

    The value will be the final segment of the matching part of the path.

  • List<PathSegment>

    The value will be a list of PathSegment objects corresponding to the path segment(s) that matched the named template parameter.

  • primitives such as int, char, or long

  • Objects that have a constructor that accepts a single String argument

  • Objects that have a static valueOf() method that accepts a single String argument

A common way of passing information on the Web is to use query parameters in a URI. Query parameters appear at the end of the URI and are separated from the resource location portion of the URI by a question mark(?). They consist of one, or more, name value pairs where the name and value are separated by an equal sign(=). When more than one query parameter is specified, the pairs are separated from each other by either a semicolon(;) or an ampersand(&). Example 3.2 shows the syntax of a URI with query parameters.

[Note]Note

You can use either the semicolon or the ampersand to separate query parameters, but not both.

The javax.ws.rs.QueryParam annotation extracts the value of a query parameter and injects it into a JAX-RS resource. The annotation takes a single parameter that identifies the name of the query parameter from which the value is extracted and injected into the specified field, bean property, or parameter. The @QueryParam annotation supports the types described in Supported data types.

Example 3.3 shows a resource method that injects the value of the query parameter id into the method's id parameter.

To process an HTTP POST to /monstersforhire/daikaiju?id=jonas the updateMonster() method's type is set to daikaiju and the id is set to jonas.

URI matrix parameters, like URI query parameters, are name/value pairs that can provide additional information selecting a resource. Unlike query parameters, matrix parameters can appear anywhere in a URI and they are separated from the hierarchical path segments of the URI using a semicolon(;). /mostersforhire/daikaiju;id=jonas has one matrix parameter called id and /monstersforhire/japan;type=daikaiju/flying;wingspan=40 has two matrix parameters called type and wingspan.

[Note]Note

Matrix parameters are not evaluated when computing a resource's URI. So, the URI used to locate the proper resource to handle the request URI /monstersforhire/japan;type=daikaiju/flying;wingspan=40 is /monstersforhire/japan/flying.

The value of a matrix parameter is injected into a field, parameter, or bean property using the javax.ws.rs.MatrixParam annotation. The annotation takes a single parameter that identifies the name of the matrix parameter from which the value is extracted and injected into the specified field, bean property, or parameter. The @MatrixParam annotation supports the types described in Supported data types.

Example 3.4 shows a resource method that injects the value of the matrix parameters type and id into the method's parameters.

To process an HTTP POST to /monstersforhire;type=daikaiju;id=whale the updateMonster() method's type is set to daikaiju and the id is set to whale.

[Note]Note

JAX-RS evaluates all of the matrix parameters in a URI at once, so it cannot enforce constraints on a matrix parameters location in a URI. For example /monstersforhire/japan;type=daikaiju/flying;wingspan=40 , /monstersforhire/japan/flying;type=daikaiju;wingspan=40, and /monstersforhire/japan;type=daikaiju;wingspan=40/flying are all treated as equivalent by a RESTful Web service implemented using the JAX-RS APIs.

By default all request URIs are decoded. So the URI /monster/night%20stalker and the URI /monster/night stalker are equivalent. The automatic URI decoding makes it easy to send characters outside of the ASCII character set as parameters.

If you do not wish to have URI automatically decoded, you can use the javax.ws.rs.Encoded annotation to deactivate the URI decoding. The annotation can be used to deactivate URI decoding at the following levels:

  • class level—Decorating a class with the @Encoded annotation deactivates the URI decoding for all parameters, field, and bean properties in the class.

  • method level—Decorating a method with the @Encoded annotation deactivates the URI decoding for all parameters of the class.

  • parameter/field level—Decorating a parameter or field with the @Encoded annotation deactivates the URI decoding for all parameters of the class.

Example 3.5 shows a resource whose getMonster() method does not use URI decoding. The addMonster() method only disables URI decoding for the type parameter.

If an error occurs when attempting to inject data using one of the URI injection annotations a WebApplicationException exception wraps the original exception is generated. The WebApplicationException exception's status is set to 404.

PK HANOEBPS/RESTAnnotateInherit.html Chapter 10. Annotation Inheritance

Chapter 10. Annotation Inheritance

Inheritance is one of the more powerful mechanisms in Java because it allows developers to create generic objects that can then be specialized to meet particular needs. JAX-RS keeps this power by allowing the annotations used in mapping classes to resources to be inherited from super classes.

JAX-RS's annotation inheritance also extends to support for interfaces. Implementation classes inherit the JAX-RS annotations used in the interface they implement.

The JAX-RS inheritance rules do provide a mechanism for overriding inherited annotations. However, it is not possible to completely remove JAX-RS annotations from a construct that inherits them from a super class or interface.

Resource classes inherit any JAX-RS annotations from the interface(s) it implements. Resource classes also inherit any JAX-RS annotations from any super classes they extend. Annotations inherited from a super class take precedence over annotations inherited from am interface.

In the code sample shown in Example 10.1, the Kaijin class' getMonster() method inherits the @Path, @GET, and @PathParam annotations from the Kaiju interface.

Overriding inherited annotations is as easy as providing new annotations. If the subclass, or implementation class, provides any of its own JAX-RS annotations for a method then all of the JAX-RS annotations for that method are ignored.

In the code sample shown in Example 10.2, the Kaijin class' getMonster() method does not inherit any of the annotations from the Kaiju interface. The implementation class overrides the @Produces annotation which causes all of the annotations from the interface to be ignored.

PK HAH H OEBPS/RESTContexts.html Chapter 9. Getting and Using Context Information

Chapter 9. Getting and Using Context Information

Introduction to contexts
Working with the full request URI
Injecting the URI information
Working with the URI
Getting the value of URI template variables
Getting the query parameters
Getting the matrix parameters
Working with the HTTP Headers
Working with security information
Working with preconditions
Working with servlet contexts
Working with the Apache CXF context object
Adding custom contexts
PK HARe  OEBPS/RESTContextsCXF.html Working with the Apache CXF context object

Working with the Apache CXF context object

PK HA SOEBPS/RESTContextsCustom.html Adding custom contexts

Adding custom contexts

PK HA+*?fOEBPS/RESTContextsHeaders.html Working with the HTTP Headers

Working with the HTTP Headers

PK HA$QK'OEBPS/RESTContextsIntro.html Introduction to contexts

Introduction to contexts

You specify that context information is to be injected into a field or a resource method parameter using the javax.ws.rs.core.Context annotation. Annotating a field or parameter of one of the context types will instruct the runtime to inject the appropriate context information into the annotated field or parameter.

Table 9.1 lists the types of context information that can be injected and the objects that support them.

Context information is available to the following parts of a JAX-RS application:

All context information injected using the @Context annotation is specific to the current request. This is true in all cases including entity providers and exception mappers.

The JAX-RS framework allows developers to extend the types of information that can be injected using the context mechanism. You add custom contexts by implementing a Context<T> object and registering it with the runtime.

For information on creating custom contexts see Adding custom contexts.

PK HAAPOEBPS/RESTContextsPrecond.html Working with preconditions

Working with preconditions

PK HAnzOEBPS/RESTContextsSecurity.html Working with security information

Working with security information

PK HA%OEBPS/RESTContextsServlet.html Working with servlet contexts

Working with servlet contexts

PK HAqi OEBPS/RESTContextsURI.html Working with the full request URI

Working with the full request URI

Injecting the URI information
Working with the URI
Getting the value of URI template variables
Getting the query parameters
Getting the matrix parameters

The request URI contains a significant amount of information. Most of this information can be accessed using method parameters as described in Injecting data from a request URI, however using parameters forces certain constraints on how the URI is processed. Using parameters to access the segments of a URI also does not provide a resource access to the full request URI.

You can provide access to the complete request URI by injecting the URI context into a resource. The URI is provided as a UriInfo object. The UriInfo interface provides functions for decomposing the URI in a number of ways. It can also provide the URI as a UriBuilder object that allows you to construct URIs to return to clients.

PK HA]>\ \ OEBPS/RESTContextsURIInject.html Injecting the URI information

Injecting the URI information

When a class field or method parameter that is a UriInfo object is decorated with the @Context annotation, the URI context for the current request is injected into the UriInfo object.

Example 9.1 shows a class with a field populated by injecting the URI context.

PK HA'' OEBPS/RESTContextsURIMatrix.html Getting the matrix parameters

Getting the matrix parameters

PK HAލ(ee$OEBPS/RESTContextsURIPathParams.html Getting the value of URI template variables

Getting the value of URI template variables

As described in Setting the path, resource paths can contain variable segments that are bound to values dynamically. Often these variable path segments are used as parameters to a resource method as described in Getting data from the URI's path. You can, however, also access them through the URI context.

The UriInfo interface provides two methods, shown in Example 9.3, that return a list of the path parameters.

The getPathParameters() method that does not take any parameters automatically decodes the path parameters. If you want to disable URI decoding use getPathParameters(false).

The values are stored in the map using their template identifiers as keys. For example if the URI template for the resource is /{color}/box/{note} the returned map will have two entries with the keys color and note.

Example 9.4 shows code for retrieving the path parameters using the URI context.

PK HAg-##OEBPS/RESTContextsURIQuery.html Getting the query parameters

Getting the query parameters

PK HAz66!OEBPS/RESTContextsURIWorking.html Working with the URI

Working with the URI

One of the main advantages of using the URI context is that it provides access to the base URI of the service and the path segment of the URI for the selected resource. This information can be useful for a number of purposes such as making processing decisions based on the URI or calculating URIs to return as part of the response. For example if the base URI of the request contains a .com extension the service may decide to use US dollars and if the base URI contains a .co.uk extension is may decide to us British Pounds.

The UriInfo interface provides methods for accessing the parts of the URI:

The base URI is the root URI on which the service is published. It does not contain any portion of the URI specified in any of the service's @Path annotations. For example if a service implementing the resource defined in Example 3.5 were published to http://fusesource.org and a request was made on http://fusesource.org/montersforhire/nightstalker?12 the base URI would be http://fusesource.org.

Table 9.2 describes the methods that return the base URI.

The path portion of the request URI is the portion of the URI that was used to select the current resource. It does not include the base URI, but does include any URI template variable and matrix parameters included in the URI.

The value of the path depends on the resource selected. For example, the paths for the resources defined in Example 9.2 would be:

  • rootPath/monstersforhire/

  • getterPath/mostersforhire/nightstalker

    The GET request was made on /monstersforhire/nightstalker.

  • putterPath/mostersforhire/911

    The PUT request was made on /monstersforhire/911.

Table 9.3 describes the methods that return the resource path.

Table 9.4 describes the methods that return the full request URI. You have the option of returning the request URI or the absolute path of the resource. The difference is that the request URI includes the any query parameters appended to the URI and the absolute path does not include the query parameters.

For a request made using the URI http://fusesource.org/montersforhire/nightstalker?12, the getRequestUri() methods would return http://fusesource.org/montersforhire/nightstalker?12. The getAbsolutePath() method would return http://fusesource.org/montersforhire/nightstalker.

PK HAcpווOEBPS/RESTEntityTypes.html Chapter 7. Entity Support

Chapter 7. Entity Support

The runtime relies on JAX-RS MessageBodyReader and MessageBodyWriter implementations to serialize and de-serialize data between the HTTP messages and their Java representations. The readers and writers can restrict the MIME types they are capable of processing.

The runtime provides readers and writers for a number of common mappings. If an application requires more advanced mappings, a developer can provide custom implementations of the MessageBodyReader interface and/or the MessageBodyWriter interface. Custom readers and writers are registered with the runtime when the application is started.

Table 7.1 lists the entity mappings provided by Apache CXF out of the box.

Custom entity readers are responsible for mapping incoming HTTP requests into a Java type that a service's implementation can manipulate. They implement the javax.ws.rs.ext.MessageBodyReader interface.

The interface, shown in Example 7.1, has two methods that need implementing:

isReadable()

The isReadable() method determines if the reader is capable of reading the data stream and creating the proper type of entity representation. If the reader can create the proper type of entity the method returns true.

Table 7.2 describes the isReadable() method's parameters.

readFrom()

The readFrom() method reads the HTTP entity and coverts it into the desired Java object. If the reading is successful the method returns the created Java object containing the entity. If an error occurs when reading the input stream the method should throw an IOException exception. If an error occurs that requires an HTTP error response, an WebApplicationException with the HTTP response should be thrown.

Table 7.3 describes the readFrom() method's parameters.

[Important]Important

This method should not close the input stream.

Before an MessageBodyReader implementation can be used as an entity reader, it must be decorated with the javax.ws.rs.ext.Provider annotation. The @Provider annotation alerts the runtime that the supplied implementation provides additional functionality. The implementation must also be registered with the runtime as described in Registering readers and writers.

By default a custom entity provider handles all MIME types. You can limit the MIME types that a custom entity reader will handle using the javax.ws.rs.Consumes annotation. The @Consumes annotation specifies a comma separated list of MIME types that the custom entity provider reads. If an entity is not of a specified MIME type, the entity provider will not be selected as a possible reader.

Example 7.2 shows an entity reader the consumes XML entities and stores them in a Source object.

Example 7.2. XML source entity reader

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.apache.cxf.jaxrs.ext.xml.XMLSource;

@Provider
@Consumes({"application/xml", "application/*+xml", "text/xml", "text/html" })
public class SourceProvider implements MessageBodyReader<Object>
{
  public boolean isReadable(Class<?> type,
                            Type genericType,
                            Annotation[] annotations,
                            MediaType mt)
  {
    return Source.class.isAssignableFrom(type) || XMLSource.class.isAssignableFrom(type);
  }

  public Object readFrom(Class<Object> source,
                         Type genericType,
                         Annotation[] annotations,
                         MediaType mediaType, 
                         MultivaluedMap<String, String> httpHeaders,
                         InputStream is)
  throws IOException
  {
    if (DOMSource.class.isAssignableFrom(source))
    {
      Document doc = null;
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder;
      try
      {
        builder = factory.newDocumentBuilder();
        doc = builder.parse(is);
      }
      catch (Exception e)
      {
        IOException ioex = new IOException("Problem creating a Source object");
        ioex.setStackTrace(e.getStackTrace());
        throw ioex;
       }

       return new DOMSource(doc);
    }
    else if (StreamSource.class.isAssignableFrom(source) || Source.class.isAssignableFrom(source))
    {
      return new StreamSource(is);
    }
    else if (XMLSource.class.isAssignableFrom(source))
    {
      return new XMLSource(is);
    }

    throw new IOException("Unrecognized source");
  }
}

Custom entity writers are responsible for mapping Java types into HTTP entities. They implement the javax.ws.rs.ext.MessageBodyWriter interface.

The interface, shown in Example 7.3, has three methods that need implementing:

isWriteable()

The isWriteable() method determines if the entity writer can map the Java type to the proper entity type. If the writer can do the mapping, the method returns true.

Table 7.4 describes the isWritable() method's parameters.

getSize()

The getSize() method is called before the writeTo(). It returns the length, in bytes, of the entity being written. If a positive value is returned the value is written into the HTTP message's Content-Length header.

Table 7.5 describes the getSize() method's parameters.

writeTo()

The writeTo() method converts a Java object into the desired entity type and writes the entity to the output stream. If an error occurs when writing the entity to the output stream the method should throw an IOException exception. If an error occurs that requires an HTTP error response, an WebApplicationException with the HTTP response should be thrown.

Table 7.6 describes the writeTo() method's parameters.

Before a MessageBodyWriter implementation can be used as an entity writer, it must be decorated with the javax.ws.rs.ext.Provider annotation. The @Provider annotation alerts the runtime that the supplied implementation provides additional functionality. The implementation must also be registered with the runtime as described in Registering readers and writers.

By default a custom entity provider handles all MIME types. You can limit the MIME types that a custom entity writer will handle using the javax.ws.rs.Produces annotation. The @Produces annotation specifies a comma separated list of MIME types that the custom entity provider generates. If an entity is not of a specified MIME type, the entity provider will not be selected as a possible writer.

Example 7.4 shows an entity writer that takes Source objects and produces XML entities.

Example 7.4. XML source entity writer

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.apache.cxf.jaxrs.ext.xml.XMLSource;

@Provider
@Produces({"application/xml", "application/*+xml", "text/xml" })
public class SourceProvider implements MessageBodyWriter<Source>
{

  public boolean isWriteable(Class<?> type,
                             Type genericType,
                             Annotation[] annotations,
                             MediaType mt)
  {
    return Source.class.isAssignableFrom(type);
  }

  public void writeTo(Source source,
                      Class<?> clazz,
                      Type genericType,
                      Annotation[] annotations,
                      MediaType mediatype,
                      MultivaluedMap<String, Object> httpHeaders,
                      OutputStream os)
  throws IOException
  {
    StreamResult result = new StreamResult(os);
    TransformerFactory tf = TransformerFactory.newInstance();
    try
    {
      Transformer t = tf.newTransformer();
      t.transform(source, result);
    }
    catch (TransformerException te)
    {
      te.printStackTrace();
      throw new WebApplicationException(te);
    }
  }

  public long getSize(Source source,
                      Class<?> type, 
                      Type genericType, 
                      Annotation[] annotations,
                      MediaType mt)
  {
    return -1;
  }
}

Before a JAX-RS application can use any custom entity providers, the custom providers must be registered with the runtime. Providers are registered with the runtime using either the jaxrs:providers element in the application's configuration file or using the JAXRSServerFactoryBean class.

The jaxrs:providers element is a child of the jaxrs:server element and contains a list of bean elements. Each bean element defines one entity provider.

Example 7.5 show a JAX-RS server configured to use a set of custom entity providers.

The JAXRSServerFactoryBean class is a Apache CXF extension that provides access to the configuration APIs. It has a setProvider() method that allows you to add instantiated entity providers to an application. Example 7.6 shows code for registering an entity provider programmatically.

PK HA~v''OEBPS/RESTExceptionMapper.html Mapping exceptions to responses

Mapping exceptions to responses

There are instances where throwing a WebApplicationException exception is impractical or impossible. For example, you may not want to catch all possible exceptions and then create a WebApplicationException for them. You may also want to use custom exceptions that make working with your application code easier.

To handle these cases the JAX-RS API allows you to implement a custom exception provider that generates a Response object to send to a client. Custom exception providers are created by implementing the ExceptionMapper<E> interface. When registered with the Apache CXF runtime, the custom provider will be used whenever an exception of type E is thrown.

Exception mappers are used in two cases:

If an exception mapper is not found for an exception, the exception is wrapped in an ServletException exception and passed onto the container runtime. The container runtime will then determine how to handle the exception.

Exception mappers are created by implementing the javax.ws.rs.ext.ExceptionMapper<E> interface. As shown in Example 5.5, the interface has a single method, toResponse(), that takes the original exception as a parameter and returns a Response object.

The Response object created by the exception mapper is processed by the runtime just like any other Response object. The resulting response to the consumer will contain the status, headers, and entity body encapsulated in the Response object.

Exception mapper implementations are considered providers by the runtime. Therefor they must be decorated with the @Provder annotation.

If an exception occurs while the exception mapper is building the Response object, the runtime will a response with a status of 500 Server Error to the consumer.

Example 5.6 shows an exception mapper that intercepts Spring AccessDeniedException exceptions and generates a response with a 403 Forbidden status and an empty entity body.

The runtime will catch any AccessDeniedException exceptions and create a Response object with no entity body and a status of 403. The runtime will then process the Response object as it would for a normal response. The result is that the consumer will receive an HTTP response with a status of 403.

Before a JAX-RS application can use an exception mapper, the exception mapper must be registered with the runtime. Exception mappers are registered with the runtime using the jaxrs:providers element in the application's configuration file.

The jaxrs:providers element is a child of the jaxrs:server element and contains a list of bean elements. Each bean element defines one exception mapper.

Example 5.7 shows a JAX-RS server configured to use a an exception mapper.

PK HA!##OEBPS/RESTExceptionNorm.html Using WebApplicaitonException exceptions to report errors

Using WebApplicaitonException exceptions to report errors

The JAX-RS API introduced the WebApplicationException runtime exception to provide an easy way for resource methods to create exceptions that are appropriate for RESTful clients to consume. WebApplicationException exceptions can include a Response object that defines the entity body to return to the originator of the request. It also provides a mechanism for specifying the HTTP status code to be returned to the client if no entity body is provided.

The easiest means of creating a WebApplicaitonException exception is to use either the no argument constructor or the constructor that wraps the original exception in a WebApplicationException exception. Both constructors create a WebApplicaitonException with an empty response.

When an exception created by either of these constructors is thrown, the runtime returns a response with an empty entity body and a status code of 500 Server Error.

When you want to return an error code other than 500, you can use one of the four WebApplicaitonException constructors that allow you to specify the status. Two of these constructors, shown in Example 5.1, take the return status as an integer.

The other two, shown in Example 5.2 take the response status as an instance of Response.Status.

When an exception created by either of these constructors is thrown, the runtime returns a response with an empty entity body and the specified status code.

If you want a message to be sent along with the exception, you can use one of the WebApplicationException constructors that takes a Response object. The runtime uses the Response object to create the response sent to the client. The entity stored in the response is mapped to the entity body of the message and the status field of the response is mapped to the HTTP status of the message.

Example 5.3 shows code for returning a text message to a client containing the reason for the exception and sets the HTTP message status to 409 Conflict.

It is possible to extend the WebApplicationException exception. This would allow you to create custom exceptions and eliminate some boiler plate code.

Example 5.4 shows a new exception that creates a similar response to the code in Example 5.3.

PK HA4OEBPS/RESTExceptions.html Chapter 5. Handling Exceptions

Chapter 5. Handling Exceptions

Using WebApplicaitonException exceptions to report errors
Mapping exceptions to responses
PK HAQ --OEBPS/RESTIntro.html Chapter 1. Introduction to RESTful Web Services

Chapter 1. Introduction to RESTful Web Services

Representational State Transfer(REST) is an architectural style first described in a doctoral dissertation by a researcher named Roy Fielding. In RESTful systems, servers expose resources using a URI, and clients access these resources using the four HTTP verbs. As clients receive representations of a resource they are placed in a state. When they access a new resource, typically by following a link, they change, or transition, their state. In order to work, REST assumes that resources are capable of being represented using a pervasive standard grammar.

The World Wide Web is the most ubiquitous example of a system designed on REST principles. Web browsers act as clients accessing resources hosted on Web servers. The resources are represented using HTML or XML grammars that all Web browsers can consume. The browsers can also easily follow the links to new resources.

The advantages of RESTful systems is that they are highly scalable and highly flexible. Because the resources are accessed and manipulated using the four HTTP verbs, the resources are exposed using a URIs, and the resources are represented using standard grammars, clients are not as affected by changes to the servers. Also, RESTful systems can take full advantage of the scalability features of HTTP such as caching and proxies.

RESTful architectures adhere to the following basic principles:

Resources are central to REST. A resource is a source of information that can be addressed using a URI. In the early days of the Web, resources were largely static documents. In the modern Web, a resource can be any source of information. For example a Web service can be a resource if it can be accessed using a URI.

RESTful endpoints exchange representations of the resources they address. A representation is a document containing the data provided by the resource. For example, the method of a Web service that provides access to a customer record would be a resource, the copy of the customer record exchanged between the service and the consumer is a representation of the resource.

When designing RESTful Web services it is helpful to keep in mind the following:

Regardless of the framework you use to implement a RESTful Web service, there are a number of steps that should be followed:

Once you have defined the service, you can implement it using Fuse Services Framework.

Fuse Services Framework provides an implementation of the Java API for RESTFul Web Services(JAX-RS). JAX-RS provides a standardized way to map POJOs to resources using annotations.

When moving from the abstract service definition to a RESTful Web service implemented using JAX-RS, you need to do the following:

  1. Create a root resource class for the resource that represents the top of the service's resource tree.

    See Root resource classes.

  2. Map the service's other resources into sub-resources.

    See Working with sub-resources.

  3. Create methods to implement each of the HTTP verbs used by each of the resources.

    See Working with resource methods.

[Note]Note

Fuse Services Framework continues to support the old HTTP binding to map Java interfaces into RESTful Web services. The HTTP binding provides basic functionality and has a number of limitations. Developers are encouraged to update their applications to use JAX-RS.

By default, Fuse Services Framework uses Java Architecture for XML Binding(JAXB) objects to map the resources and their representations to Java objects. Provides clean, well defined mappings between Java objects and XML elements.

The Fuse Services Framework JAX-RS implementation also supports exchanging data using JavaScript Object Notation(JSON). JSON is a popular data format used by Ajax developers. The marshaling of data between JSON and JAXB is handled by the Fuse Services Framework runtime.

PK HAs;OEBPS/RESTMediaTypes.html Chapter 8. Customizing the Media Types Handled by a Resource

Chapter 8. Customizing the Media Types Handled by a Resource

PK HAhb  OEBPS/RESTMethods.html Working with resource methods

Working with resource methods

Resource methods are annotated using JAX-RS annotations. They have one of the HTTP method annotation specifying the types of requests that the method processes. JAX-RS places several constraints on resource methods.

All resource methods must meet the following conditions:

Resource method parameters take two forms:

Example 2.4 shows a resource method with a valid parameter list.

Example 2.5 shows a resource method with an invalid parameter list. It has two parameters that are not annotated.

Resource methods can return one of the following:

All resource methods return an HTTP status code to the requester. When the return type of the method is void or the value being returned is null, the resource method sets the HTTP status code to 200. When the resource method returns any value other than null, it sets the HTTP status code to 204.

PK HA  OEBPS/RESTParameters.html Chapter 3. Passing Information into Resource Classes and Methods

Chapter 3. Passing Information into Resource Classes and Methods

Basics of injecting data
Using JAX-RS APIs
Injecting data from a request URI
Injecting data from the HTTP message header
Injecting data from HTML forms
Specifying a default value to inject
Using Fuse Services Framework extensions
PK HA>NOEBPS/RESTParametersBasics.html Basics of injecting data

Basics of injecting data

Parameters, fields, and bean properties that are initialized using data from the HTTP request message have their values injected into them by the runtime. The specific data that is injected is specified by a set of annotations described in Using JAX-RS APIs.

The JAX-RS specification places a few restrictions on when the data is injected. It also places a few restrictions on the types of objects into which request data can be injected.

Request data is injected into objects when they are instantiated due to a request. This means that only objects that directly correspond to a resource can use the injection annotations. As discussed in Creating Resources, these objects will either be a root resource decorated with the @Path annotation or an object returned from a sub-resource locator method.

The specific set of data types that data can be injected into depends on the annotation used to specify the source of the injected data. However, all of the injection annotations support at least the following set of data types:

[Tip]Tip

Where injection annotations have different requirements for supported data types, the differences will be highlighted in the discussion of the annotation.

PK HAqCOEBPS/RESTParametersCXF.html Using Fuse Services Framework extensions

Using Fuse Services Framework extensions

Fuse Services Framework provides an extension to the standard JAX-WS injection mechanism that allows developers to replace a sequence of injection annotations with a single annotation. The single annotation is place on a bean containing fields for the data that is extracted using the annotation. For example, if a resource method is expecting a request URI to include three query parameters called id, type, and size, it could use a single @QueryParam annotation to inject all of the parameters into a bean with corresponding fields.

This extension does not support all of the injection parameters. It only supports the following ones:

To indicate that an annotation is going to use serial injection into a bean, you need to do two things:

Example 3.11 shows an example of injecting a number of Query parameters into a bean. The resource method expect the request URI to include two query parameters: type and id. Their values are injected into the corresponding fields of the Monster bean.

PK HAttOEBPS/RESTParametersJAXRS.html Using JAX-RS APIs

Using JAX-RS APIs

Injecting data from a request URI
Injecting data from the HTTP message header
Injecting data from HTML forms
Specifying a default value to inject

The standard JAX-RS API specifies annotations that can be used to inject values into fields, bean properties, and method parameters. The annotations can be split up into three distinct types:

PK HAgZ`v v OEBPS/RESTResourceClass.html Chapter 2. Creating Resources

Chapter 2. Creating Resources

Introduction
Basic JAX-RS annotations
Root resource classes
Working with resource methods
Working with sub-resources
Resource selection method
PK HAJ22OEBPS/RESTResourceSelect.html Resource selection method

Resource selection method

It is possible for a given URI to map to one or more resource methods. For example the URI customerservice/12/ma could match the templates @Path("customerservice/{id}") or @Path("customerservice/{id}/{state}"). JAX-RS specifies a detailed algorithm for matching a resource method to a request. The algorithm compares the normalized URI, the HTTP verb, and the media types of the request and response entities to the annotations on the resource classes.

The JAX-RS selection algorithm is broken down into three stages:

The first two stages of the selection algorithm determine the resource that will handle the request. In some cases the resource is implemented by a resource class. In other cases, it is implemented by one or more sub-resources that use the same URI template. When there are multiple resources that match a request URI, resource classes are preferred over sub-resources.

If more than one resource still matches the request URI after sorting between resource classes and sub-resources, the following criteria are used to select a single resource:

In many cases, selecting a resource that matches the request URI results in a single resource method that can process the request. The method is determined by matching the HTTP verb specified in the request with a resource method's HTTP verb annotation. In addition to having the appropriate HTTP verb annotation, the selected method must also be able to handle the request entity included in the request and be able to produce the proper type of response specified in the request's metadata.

[Note]Note

The type of request entity a resource method can handle is specified by the @Consumes annotation. The type of responses a resource method can produce are specified using the @Produces annotation. For more information see Customizing the Media Types Handled by a Resource.

When selecting a resource produces multiple methods that can handle a request the following criteria is used to select the resource method that will handle the request:

In some cases, developers have reported the algorithm being somewhat restrictive in the way multiple resource classes are selected. For example, if a given resource class has been matched and if this class has no matching resource method, then the algorithm stops executing. It never checks the remaining matching resource classes.

Apache CXF provides the org.apache.cxf.jaxrs.ext.ResourceComparator interface which can be used to customize how the runtime handles multiple matching resource classes. The ResourceComparator interface, shown in Example 2.9, has to methods that need to be implemented. One compares two resource classes and the other compares two resource methods.

Custom implementations select between the two resources as follows:

If 0 is returned then the runtime will proceed with the default selection algorithm

You register a custom ResourceComparator implementation by adding a resourceComparator child to the service's jaxrs:server element.

PK HAc)'OEBPS/RESTResponses.html Chapter 4. Returning Information to the Consumer

Chapter 4. Returning Information to the Consumer

Returning plain Java constructs
Fine tuning an application's responses
Basics of building responses
Creating responses for common use cases
Handling more advanced responses
Returning entities with generic type information

The information returned to the consumer determines the exact type of object a resource method returns. This may seem obvious, but the mapping between Java return objects and what is returned to a RESTful consumer is not one-to-one. At a minimum, RESTful consumers need to be returned a valid HTTP return code in addition to any response entity body. The mapping of the data contained within a Java object to a response entity is effected by the MIME types a consumer is willing to accept.

To address the issues involved in mapping Java object to RESTful response messages, resource methods are allowed to return four types of Java constructs:

PK HArCOEBPS/ResourceClassIntro.html Introduction

Introduction

RESTful Web services implemented using JAX-RS APIs provide responses as representations of a resource implemented by Java classes. A resource class is a class that uses JAX-RS annotations to implement a resource. For most RESTful Web services, there is a collection of resources that need to be accessed. The resource class' annotations provide information such as the URI of the resources and which HTTP verb each operation handles.

The JAX-RS APIs allow you to create two basic types of resources:

  • A root resource class is the entry point to a service's resource tree. It is decorated with the @Path annotation to define the base URI for the resources in the service.

  • Sub-resources are accessed through the root resource. They are implemented by methods that are decorated with the @Path annotation. A sub-resource's @Path annotation defines a URI relative to the base URI of a root resource.

Example 2.1 shows a simple resource class.

Example 2.1. Simple resource class

package demo.jaxrs.server;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/customerservice") 1
public class CustomerService
{
  public CustomerService()
  {
  }

  @GET 2
  public Customer getCustomer(@QueryParam("id") String id)
  {
    ...
  }

  ...
}

Two items make the class defined in Example 2.1 a resource class:

1

The @Path annotation specifies the base URI for the resource.

2

The @GET annotation specifies that the method implements the HTTP GET method for the resource.

PK HA-9W!W!OEBPS/RootResourceClass.html Root resource classes

Root resource classes

A root resource class is the entry point into a JAX-RS implemented RESTful Web service. It is decorated with a @Path that specifies the root URI of the resources implemented by the service. Its methods either directly implement operations on the resource or provide access to sub-resources.

In order for a class to be a root resource class it must meet the following criteria:

Example 2.3 shows a root resource class that provides access to a sub-resource.

Example 2.3. Root resource class

package demo.jaxrs.server;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

@Path("/customerservice/") 1
public class CustomerService
{
  public CustomerService() 2
  {
    ...
  }

  @GET 3
  public Customer getCustomer(@QueryParam("id") String id)
  {
    ...
  }

  @DELETE
  public Response deleteCustomer(@QueryParam("id") String id)
  {
    ...
  }

  @PUT
  public Response updateCustomer(Customer customer)
  {
    ...
  }

  @POST
  public Response addCustomer(Customer customer)
  {
    ...
  }

  @Path("/orders/{orderId}/") 4
  public Order getOrder(@PathParam("orderId") String orderId)
  {
    ...
  }

}

The class in Example 2.3 meets all of the requirements for a root resource class.

1

The class is decorated with the @Path annotation. The root URI for the resources exposed by the service is customerservice.

2

The class has a public constructor. In this case the no argument constructor is used for simplicity.

3

The class implements each of the four HTTP verbs for the resource.

4

The class also provides access to a sub-resource through the getOrder() method. The URI for the sub-resource, as specified using the the @Path annotation, is customerservice/order/id. The sub-resource is implemented by the Order class.

For more information on implementing sub-resources see Working with sub-resources.

PK HA S0..OEBPS/SubResourceClass.html Working with sub-resources

Working with sub-resources

It is likely that a service will need to be handled by more than one resource. For example, in an order processing service best-practices suggests that each customer would be handled as a unique resource. Each order would also be handled as a unique resource.

Using the JAX-RS APIs, you would implement the customer resources and the order resources as sub-resources. A sub-resource is a resource that is accessed through a root resource class. They are defined by adding a @Path annotation to a resource class' method. Sub-resources can be implemented in one of two ways:

Sub-resources are specified by decorating a method with the @Path annotation. The URI of the sub-resource is constructed as follows:

  1. Append the value of the sub-resource's @Path annotation to the value of the sub-resource's parent resource's @Path annotation.

    The parent resource's @Path annotation maybe located on a method in a resource class that returns an object of the class containing the sub-resource.

  2. Repeat the previous step until the root resource is reached.

  3. The assembled URI is appended to the base URI at which the service is deployed.

For example the URI of the sub-resource shown in Example 2.6 could be baseURI/customerservice/order/12.

A sub-resource method is decorated with both a @Path annotation and one of the HTTP verb annotations. The sub-resource method is directly responsible for handling a request made on the resource using the specified HTTP verb.

Example 2.7 shows a resource class with three sub-resource methods:

  • getOrder() handles HTTP GET requests for resources whose URI matches /customerservice/orders/{orderId}/.

  • updateOrder() handles HTTP PUT requests for resources whose URI matches /customerservice/orders/{orderId}/.

  • newOrder() handles HTTP POST requests for the resource at /customerservice/orders/.

[Note]Note

Sub-resource methods with the same URI template are equivalent to resource class returned by a sub-resource locator.

Sub-resource locators are not decorated with one of the HTTP verb annotations and do not directly handle are request on the sub-resource. Instead, a sub-resource locator returns an instance of a resource class that can handle the request.

In addition to not having an HTTP verb annotation, sub-resource locators also cannot have any entity parameters. All of the parameters used by a sub-resource locator method must use one of the annotations described in Passing Information into Resource Classes and Methods.

As shown in Example 2.8, sub-resource locator allows you to encapsulate a resource as a reusable class instead of putting all of the methods into one super class. The processOrder() method is a sub-resource locator. When a request is made on a URI matching the URI template /orders/{orderId}/ it returns an instance of the Order class. The Order class has methods that are decorated with HTTP verb annotations. A PUT request is handled by the updateOrder() method.

Sub-resource locators are processed at runtime so that they can support polymorphism. The return value of a sub-resource locator can be a generic Object, an abstract class, or the top of a class hierarchy. For example, if your service needed to process both PayPal orders and credit card orders, the processOrder() method's signature from Example 2.8 could remain unchanged. You would simply need to implement two classes, ppOrder and ccOder, that extended the Order class. The implementation of processOrder() would instantiate the desired implementation of the sub-resource based on what ever logic is required.

PK HA Developing RESTful Web Services

Developing RESTful Web Services

Table of Contents

1. Introduction to RESTful Web Services
2. Creating Resources
Introduction
Basic JAX-RS annotations
Root resource classes
Working with resource methods
Working with sub-resources
Resource selection method
3. Passing Information into Resource Classes and Methods
Basics of injecting data
Using JAX-RS APIs
Injecting data from a request URI
Injecting data from the HTTP message header
Injecting data from HTML forms
Specifying a default value to inject
Using Fuse Services Framework extensions
4. Returning Information to the Consumer
Returning plain Java constructs
Fine tuning an application's responses
Basics of building responses
Creating responses for common use cases
Handling more advanced responses
Returning entities with generic type information
5. Handling Exceptions
Using WebApplicaitonException exceptions to report errors
Mapping exceptions to responses
6. Publishing a Service
7. Entity Support
8. Customizing the Media Types Handled by a Resource
9. Getting and Using Context Information
Introduction to contexts
Working with the full request URI
Injecting the URI information
Working with the URI
Getting the value of URI template variables
Getting the query parameters
Getting the matrix parameters
Working with the HTTP Headers
Working with security information
Working with preconditions
Working with servlet contexts
Working with the Apache CXF context object
Adding custom contexts
10. Annotation Inheritance
Index

List of Tables

7.1. Natively supported entity mappings
7.2. Parameters used to determine if a reader can produce an entity
7.3. Parameters used to read an entity
7.4. Parameters used to read an entity
7.5. Parameters used to read an entity
7.6. Parameters used to read an entity
9.1. Context types
9.2. Methods for accessing a resource's base URI
9.3. Methods for accessing a resource's path
9.4. Methods for accessing the full request URI

List of Examples

2.1. Simple resource class
2.2. URI template syntax
2.3. Root resource class
2.4. Resource method with a valid parameter list
2.5. Resource method with an invalid parameter list
2.6. Order sub-resource
2.7. Sub-resource methods
2.8. Sub-resource locator returning a specific class
2.9. Interface for customizing resource selection
3.1. Injecting data from a URI template variable
3.2. URI with a query string
3.3. Resource method using data from a query parameter
3.4. Resource method using data from matrix parameters
3.5. Disabling URI decoding
3.6. Injecting the If-Modified-Since header
3.7. Injecting a cookie
3.8. Injecting form data into resource method parameters
3.9. Syntax for setting the default value of a parameter
3.10. Setting default values
3.11. Injecting query parameters into a bean
4.1. Getting a response builder using the Response class
4.2. Getting a response builder using the ResponseBuilderImpl class
4.3. Creating a response with an 200 response
4.4. Creating a response with a 204 status
4.5. Creating a response with a 304 status
4.6. Creating a response with a 500 status
4.7. Adding a header to a response
4.8. Adding a cookie to a response
4.9. Adding a header to a response
4.10. Adding a header to a response
4.11. Creating a GenericEntity<T> object using a subclass
4.12. Directly instantiating a GenericEntity<T> object
5.1. Creating a WebApplicationException with a status code
5.2. Creating a WebApplicationException with a status code
5.3. Sending a message with an exception
5.4. Extending WebApplicationException
5.5. Exception mapper interface
5.6. Mapping an exception to a response
5.7. Registering exception mappers with the runtime
7.1. Message reader interface
7.2. XML source entity reader
7.3. Message writer interface
7.4. XML source entity writer
7.5. Registering entity providers with the runtime
7.6. Programmatically registering an entity provider
9.1. Injecting the URI context into a class field
9.2. Getting a resource's path
9.3. Methods for returning path parameters from the URI context
9.4. Extracting path parameters from the URI context
10.1. Annotation inheritance
10.2. Overriding annotation inheritance
PK HA%]OEBPS/content.opf _RESTGuideDeveloping RESTful Web ServicesJuly 2012Copyright © 2012 FuseSource Corp. All rights reserved.FuseSourceenPK HA!ߕOEBPS/cover.html Cover
Third Party Acknowledgements
PK HAQ yyOEBPS/imagesdb/1.gifGIF89a !, @(-ĉMWڱߗI}K; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, V * c,l35TrER,1"8txJD6|Q˕dT B(HT/$9() ;PK HA\,rrOEBPS/imagesdb/10.gifGIF89a !, @0IB&|&^h&zj8;PK HA)rrOEBPS/imagesdb/11.gifGIF89a !, @0I"gI_^觎'ɉ~hG;PK HA5|rrOEBPS/imagesdb/12.gifGIF89a !, @0IBZ'|Z]h (ʢ8;PK HAxKrrOEBPS/imagesdb/13.gifGIF89a !, @0IBZ'|Zudh18;PK HAjىrrOEBPS/imagesdb/14.gifGIF89a !, @0IB eu,)qW۞jG;PK HAiJOrrOEBPS/imagesdb/15.gifGIF89a !, @0IB yƑו,ؙk%x;PK HAG΋OEBPS/imagesdb/2.gifGIF89a !, @(-q٪kŏQ!FuR; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, h *@ c,ڹw Ȩa)ku!= Պ4Dҥsj"0Iʗ##1t9|P`I9() ;PK HA ,2OEBPS/imagesdb/3.gifGIF89a !, @(-qj\>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, o *AX7kޜAs!oGF +Xc:g &sgaJ-82(w1r#tCkq cZUrd J ;PK HAMqqOEBPS/imagesdb/4.gifGIF89a !, @0I"@}b8^Bhz*W;PK HAuOEBPS/imagesdb/5.gifGIF89a !, @( ĉ`[>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, q *́ E)X ǿwH|H#VGK!}dIZ>R:1GFi W F% ;PK HA~OEBPS/imagesdb/6.gifGIF89a 000!, @΄ @#YcQGlc'l襐i( ;!, W'FIQ "0eM Gr ˡ`&!2 Z e*h ,F Ea4Ņ@!<̫>Kp"!;PK HAOEBPS/imagesdb/7.gifGIF89a !, @(4'] {i`7r*W; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, h %%E %*CCr(տ1I<~$)Z~D Z.O8?2%#J> 1B!.*)) ;PK HA*OEBPS/imagesdb/8.gifGIF89a !, @($ɪ+i|`%~Fh[9`$; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, s l%%E)*T s(Ұ7k TC%4ӐCBB"xa :wAC0h'E ˛'KjjF3xPIP:MO QaG%!BI(0 ;PK HA_țOEBPS/imagesdb/9.gifGIF89a !, @#Ǫ+~O%F i9`$; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!, x l%%E)* s(TA+kJEתo0ҐE:@ ٫aȆz;wM6 FaBP/GCFhݚ)ư@ o QA ;PK HA4OEBPS/imagesdb/caution.gifGIF89a (ߢ7ܸ>qqqRRRQA$JJJ===5553)+++!,@#4`@8 "Jx@AË"H cF L91 x0@R>$Isbŋ+[֌2fJ"KLq͟$BǜKG834#TS:hӢ؋Z͸̵) ;PK HAA^==#OEBPS/imagesdb/cover_background.pngPNG  IHDRWƳ CiCCPICC ProfilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/7bKGD pHYstIME # [| IDATx}yn/0b# ĒLe;blWU8*WS~?T*$[.Iv"ƒj$J@q'`͊<|C13/ɹ~U=sN/}nMpeyiգSO/'@Bl@η?>$I$I$I)%w6Fmo1|qq9!{`aXom-Y4 v?0ݻ|I$I$I4eݔm2!Ap`8dmc}GVچUb_\`3$MjnT%J; J&ʵ*UѶ7t4#_F5ϿHX i%I$I$I.`4~nx _PJ!"sn0ϱw~g#R"u甈*^:qfqeϰH$I$I4%]*J?:wK^NCDN?M8O*ڜֿSUo Rb3Q)֞{}{¼$I$I$ITn~RJ`(%:.)%֛gϟ^Y]gO0*NJ[Ɵ*R A} .ecÑ$I$I$iJ }DUz=w"<a۲R맹<@UA5jRCѹ D$I$I$IS` tUEgV/qrmaμx2gn %SCB}2/BI$I$I4Rjsfe4`m4/^?ÿz;3T'E+!W7 N5])%4pѹ$I$I$ISu ta3/}o\x+!/\fy4| söٖ5b!%Ƴ'N3:{ݏ=Bm%I$I$I )Ȥhu<ߺx-p?6P5"ƭSU"h._ax =aI$I$I~JJfDE\!%gI4 SgzC$I$I$i c/-mI#u:.\dIb2J$I$I$)\_Q7 @2*U\Yy%I$I$Iޙ~0̙&2Dڎ}%Rա kꋗ:Cԍ!I$I$I-2m.-2Tè(ӿ$"MJڕU6^z2y$I$I$")؋ܒK!R ѶR!_] $I$I$IER-DJҶ']0U] Ϝ>wضO$I$I[a B m ,䪈RhW:MAH$I$It t[QhKᇑG$J)HIKW<I$I$Inn RFT94nwᢇ I$I$I-0m4Fno2)eԸ2jͅKΝ0$I$I$IIR- _=w??szDJt'Rږ` HΞct!I$I$IMqR""WXGTUwbK ơ o:uT.fJ` %I$I$I;2Ҏta\fDE"Mm_"Rϒ$I$I$2ҎV8_gy8"UwS͔R4-m$I$I$Hilj" . 6Hx~TBJ$I$Ia %kӅ~kko-d*r_VHI$I$I \>]opvc)I$I$IމRцuG5AUz/DZT!%I$I$I;1Ҏ֔¥:>uN @P2BJ$I$Iwb -Gpy0RO]2Ua3PuTu!n$I$I$I@J;ZDR40h3)-HPچP֍$I$I$0Ҏ>J\<'T%JݐR$I$I$ Rڱ"mx}cрD*D[ZD"Qh $I$I$IA EY5D$HLBHDnɃ!-n$I$I$I?f…} ) GZ%I$I$Ifha~ӐH[ E\(2BJJ$I$Ic ڌ<ִn)PnkDn$I$I$Io@J;^DЖ` Q0*MCNX!%I$I$I2̸I$I$I~)hD-hr$ (MKNX!%I$I$I2XG\诳ю bOH%v%I$I$IzRmåAQMRsRJDɴk딑$I$I$Io@J3#A+>DҖK"BA6$I$I$mHi55WJ.$n5̐J J7։zyU$I$I$)͔(2"%@ִ}JӸ$I$I$)͔dV\ A-*e0t%I$I$Iz R) lu\_LF`I$I$IB-,g=mΊJgS9W $I$I$IzVHiVHoj3*yh>I$I$IފR)qRQWh7(,I$I$I[0Ҍ JWIM"ACN﻽$I$I$)xiRDyyZk' S6 $I$I$Iz+ΐy -( eT$I$I$vxSETLaxTHDi76n$I$I$Iob @)SZ,xAD!oЮɒ$I$I$34S" 2kJzvuM$I$I$M nӬ$I$I$fJDK Q`uR %ȃ횁$I$I$Iof @ Qi +&RChVֈhI$I$Ic R"hsLe_I`DJԵ-I$I$Iu 4s(k6)G#yd %I$I$I 4S GDR D-mOn>I$I$Ic R"hKLg_"TF4WV@J$I$IMR)Pe)AJQF +ْܺ$I$I$MHi2.jpDVHI$I$ItU-, Dw۪tG*܌[9CJ$I$IL)%hL)$T^)UD[h)ufK$I$I4a @ua\4rCBB lI$I$I& 4SJuDS#LBْ$I$I$MHi(4!WIEʪe8Y[m$I$I$IR)QhJ&&Җ_@"mY^!$I$I$ 4cJMd $R%Him $I$I$I 4cKKlOu̙fe<$I$I$]@DД(g`n5JWfeܷBJ$I$I$BJ3f\!iJDzJԡ]]#opI$I$IBJ3&"ȹЖ̐)%ЮѮo$I$I$afL\hJ!H䚂 A o$I$Ig R"sKSZ" iA$ʨR}I$I$Id 3-MRLc_bbL>$I$I$iHiDM4v zfeM$I$I$<)͜: u 20)P2e'$I$Ig ӖB[r.)&RQ 0KREh׬$I$I$@J3D0-y3fyTRȃ-$I$I$I@J3(aL*CTшvmM$I$I$4)͜misfOm~zCu5$I$I$6)͌qK~Pv-6nQCN|I$I$IL3̈GE:gHD)<}bJ$I$I@J3iyBaMseŶ}$I$If sCC&ibgiW׈b %I$I$I]]@hдmr]z4鶷QꬪA#5+$I$I$I3@J3iش9fTH[)5& ږvmR$I$Ie>ͤaB!Ui{nL؀RtI$I$I2L̠y*QrLZn$I$I$ifHi&5%3l[R:8m%"2:1$I$I$.)ͤa\ HLm_J BSM$I$I$,)ͤ~ M^SJB@J$I$I4 4-ǕL!UD@ȣ.I$I$IYRIuΌ64 V[E4 ?X%%I$I$IQR9hԶ4mJCn|I$I$IL2~[CL?~U CtI$I$IL2An!b G 9m'I$I$I]R))] L$9CJk>I$I$Il2L몡mz=Z 5}1_PF#1$I$I$&)ͬa۲69L*m.&XRVHI$I$Iff֠m7M[J ׍-$I$I$I3@J3ə~SS*HD &NhZn$I$I$i&Hif ۆA=͓jR1*i@J$I$I4 4(l-u!b\$Uh[HI$I$IffV33DlËa3 Jΐ$I$I$()ͬ6ښm4"9iRhZ-$I$I$I3@J3)~Ҕؖ}(m!6gUI$I$I4c 4"a0l[خH*%RBJ$I$I4 4m07(4H*D"rX!%I$I$IYRien(i%" $I$I$$)͜jdV뚲aQD$I$I$iFHi59:vw y$I$I$iFu͚[55Sn۷yA3$I$I$I )ʹ\ 6vM"P$I$IYd #XorlF)J%*H$I$I$Iw5ӚYȹ@}UR)*$I$I$I@J3-G0-!D_Ӑ"ĵ ,I$I$IffZ`-d3n'I$I$I rʹAi&Tܴ/" $I$I$I3w5Jf[2L\ӓ:$I$I$iffZDЯkF%S6y:]RK$I$Iff0 y{nz=)I$I$I2̫K4m; w+AvI-I$I$IIRyj9bVO4#u $I$I$I@J3DьstGHM+ܜR$I$Ie ٞD^Թ!mEL7{T=gHI$I$IfkfE\֛aP\Mߟ,݀kxӥH$I$Id5RHiJ/ u*{vәw%I$I$I3@JAӒK&u Ue ^J L|I$I$If-$ AT7ݲƁTT%^Nݏ?SϹ$I$Ia %\3 M.P-e\Zu"*Ͽ)6S~!:KKn$I$I$i&CLF0h3Md* mu*)RUѮoq7~K9$I$I` %aض@li"%<Oep/I$I$I R0-LZ#SXWKt {_y͍$I$I$) ̠i# MelA^%Ҭ$I$I@J3/b L]G@ h2 ϾH$I$Iv<)ib`[BLVvme7^$I$IHIei b[O\J}$I$I` ҵh3!~('J $I$I$I;41-n LlcE$I$I$I?. 40hfM$ھh*%(%9GI$I$Iv<)ib~ QDJ$I$IHI2h7~s"*c%I$I$I - \_o,nja$I$IpTUŁ9|p/]ZZdiqyv/-PU/vg"/M{rY\gT\kԔAnEa3j=M[D]9RJn$I$I$iG3&wy9rx?GЁ<{n癟0caGs}.]Y{>{;>LoGS7^Y 'sNx(.AД\"N ͋J%zTxI$I$IҎg 5E9ow=O<нG5߃^znw~|G)kad@I>G__܋'Y[xPo)aےs|'M>FAga]n$I$I$i3]O}sz{=BgRr!J# ǡћoRyOm .<\^y]x#<|G7_ayu{ m(4QHm,ӼAJDzٵDw}#* IDAT^7^$I$IHmu>O_=ž9RUANʵ*bCEA"qx?ss|Orw@m&b3Hm ,v;Y+B1*y^/%۴Up%I$I$I;^Zg'[g!90N#6DxpYo)%vZөGCyUvH9+6D[Hy|=ʰ¥~Em)̨m^H b|tOo>7^$I$IHݢ^|)/| Jzh8XTMHW?M RUցTUUؿ!sk+WA/Ut:ո:c JiOWoNR"<̉R öɅV&i2?osPzn$I$I$i3n >SOAT\)T"Ey2h3QTU< 6C>/ y q#uA3=r&H)mK$%2wzl'I$I$I R//{`}pm698d7<:U0߃ia0πb*0GzHd8/|g"ss]z.=O<yaQu3j[^oOo7z&gmK9Lx&UJxK$I$IfMZG8o7 ̦IK4߃n?՗Nq9Νȥ˫ Rw9>C͡C!%R;Ro3C`yuՍW_sç>4?ɧy=LfLh[:U'x?~U^;uރȥ0lE!D`A7\$I$I4 n:uߝдĨ :r)\87g+x㯜 #"`~}ǎ'']Q T0G۹7ռ^x ~8g]ڧ#Th3Bڽ3O?ʗ}@:M چE)^;p17\$I$I4 nc'>3\"_B۴ _=Ëϟ}~Eor*K o[!uNȯ?W{H䁴-=|y>}Ń(ui(Qvtz,ή]n$I$I$ifTnKUػ@+ 4MK0jfK/;2+0#U t:-?WN3"_q!Դs!%  mܲ/uXש/_q%I$I$I3@&wNR Tp 7̟rM":B0?ߣLqzu>p*l K:LfR"MA3㫪s'_¿}5F=s$I$I$I1` uNt;q2[/^_Οq^7etvO07ץ77\*v[ϠVVYY 7 ^ P%ٿo3q˾Q)L3J0Jq$ɔѐSQ4WX?2/G?>NUY(I$I$IH݄y*AnY^Y絓͖_[ AanGӡiV G QC 8oսJ`mR(7OgqNMCuWֈR#$I$I$f u3TF)[ 0"-{tՖ)D+Ì\={fzJ%ҸizG49 v?}Ӭ~ԗREU͓7Xw}YZp$I$I$I-Dĵ"%r 꺥-2 ^9.ʫs.^N5 D'UVHm1v| EQ˞>yOr_dx E:K}6YᅦjJ3$I$I$Ia3 M9㰧n= F # 17caa^uSJ޵Ȟ=tP?"6gJ)0бrY6ǘ?z]KOP--rPjG*R$I$I$I)0M;BSki{wt s^Z`#t*#۳ r\WΐFQӜT U]wݽmm<7c%I$I$I1|&<}QV7*AӲ8g>ܿsA/}{<OĻ9p`ZcSO<-?槞x_?ű{:ոB*%vk}^;yW^{ (nx.97[$I$I43lwFu /c@ dRág9 oo+?Qv--s+g kr.RDhs<0#6؇_{?3o_xG_ s7?L"U^¥wbsִ⹔ JRtuڧ?ƞC`8%"S_|/yM v} p-.-1w0KO$I$I4;|W&=I>?9Huć>8Kޣ?q݇y9zx?>=Zd{&L׵Ku=K|cO?1~?y4mvzn>yy#wf\Y5W5=7I\,QUjiÇH=+$I$I$I@&#~_O^h3D] }<`]y'4߃%<.uc*3 _y`^'µ}[Y!Uzt즳{3$I$I$iH݂g/Ox n?$^YVD] |_<)Z}g< IU.I;IEAR cSEDDDDDDDDDdMQ J_"ཏ܋&-(<p|nyPD=zی1Kx \zZ~NQs㍳ZceϾ$>55?o 6@T 4UdYsH݆6 -zFƇ˽9y9rf^B:ʰ'tڼt$O~Y^fZ ›t.c,[uYDDDDDDDDDDR9KOr'8\9J$^Le([B/2]R,uM:sfx_S\4{(C` j DDDDDDDDDDdQ &(;?xOg?~>Xi dEwiϨU˻k[ osYz_3|G/r9|Z[*qռPYTՊ,""""""""""k7I=.\z/޷ŝ7359kTq~B^e@z8.>:s>o^9|3.33}T!`,$VYDDDDDDDDDDRo6/tسsmd F'iЬU*$qD,Ql6CYN't3iZ_Li϶tq3.s<ϱ9z<^^(@kzNf1(ı,""""""""""kHQx9á#g7ftxӓl8Ԇ1&'bQVPᔵP4E2ffv6s-f2K9{g/23.7nK`]o"L=+3-6cpb9K,^sQ=y^g>BB9ٯ{uB rM1յ aUEDDDDDDDDDdQ s b1K*캢 "EDDDDDDDDDDkQ*wU\YsH,4Jq)DTeoT *9 D1"0{g k$M):YDDDDDDDDDD!Z<(4n5 ۲K { R1XAn*9 duO0:ܤR֒e9g8v<֛!SUعmwfQh;\̹˜8}3箐iT-%j é )6̬,""""""""""k7IZa߽îS 6cGk+o??=WޔϬV^>e1.]ç3_`߁̶gȚ22ZdƔGwQX-sաS{Ȼ8q_ۓzuc#Y+WX!s>`p2:> {~y^3#سk4øFc|68b-7Y ZG{'xpIs;g4@OS\=wuuIȚ0>:~/2{C'%do"LνwmgS^x(YP^KxL Z@c-6ظc#cXki-v joKXr0V%k0JDDDDDDDDDD*E㳟|⷟`ϻBkY!` e7L7z=7v3ج곫Isx`)2Ȃ1cgSxO褄F_ >1-~P#(ŕ0|QY?={FzK V!ܱ/.kAo&`, jf Q*xUN7e,̷!vPO"Îa#|?:1 10q{e卡y;TdYs4oF{ ITvFG !& !8 ^|Nѳ'/37ϟom:7M}{vLynYݔ}ٍ!/0c|by)g!s 7XVOxxhFSUdYsH§?^Ff:0΂5>zg}>|g.r܇ٺcckfcXm/k8xv}s-zp #l4IҬ{\]>fs.ws34 ۆF pP* cz?[q⊈ȚcUٵ}{ESvK1vg8rۋ]~a 1r@^dϮM>s*æx~v :nD7_5$#C$&q~@""""""""""&)X:7M2>1  "`+CO]kQx|;?xcCذa;woY}:0ˋγ@ lH֯#HDDDDDDDDDD,+ij Fc 6rI9z4 ڝ-;Q|`-0}`px[!땴,Wm|X5 KB'T7MaUWDDDDDDDDDD,+0ap|P*\2KNre/\a#y9> B^n|8srgKU `U*aWDDDDDDDDDD.R+0>6`;9nqyfc'Γ9qE`'R>D:JV\{Xxf1Bie5jT7Ī] V`QZK&".Ͱ 4i `%cij^RiQpHiq!sfdl@JDDDDDDDDDD0R+շTMCݷ5{ɺ9Y’gK:<r?[ MYx\B<4k4TTH IDATYH~)aہc^b(>ho4aE]Q21q}"""""""""")Z,/ȋpmDۧ9j IyrYo=n|>ǖ5eWz 724ODDDDDDDDDDdR vݠf~ 4U6#ee Y^ꐦ n$/n2x K%v:(""""""""""k[ZSFNlY?1銙=Dqq^\f N+dy+fBO09@<4"Ț@j.\c~v|o|SQ0>d刼]ۧx]8gyM -Μmks8,QI44Ț@jN 3Px1*+lg4o,CB߿> [65Ss9 + DQNl.""""""""""E*;s2O^3@^-;w [S{7.p•7:u*nJVԫ6!rc c<{:)!Hkqe;W uCbnk JljUQDDDDDDDDDD<R+Pxϡ#yioY/*)sjB$""{G!zPe ;._3:s5F1$a0{{UvQ\{@G:㣃>| ϽcM M3@پ+ٳcػȣ04gYa>6q?K0*<RN9/_= r`9ZB{lbMPDDDDDDDDDDR+vSwQF0 .ヒݹoy^xg]}mн;_e{;v'1;bImYϙsc:&PI|,4PrA{u8ki1֚[{C`)@Ԋ-:C|{'CmNXX9f͛&a>ũtyv(ذn_{̧>My\VKV2,(*,62sޗaukCN8"8v$?:rZz}͖`Tq o1~%""""""""""ң@jN}[ص;ى"(@@ٝ`bq>>?.p%]W6mv242 mJFeQv_-v9t >`nפRj`b-Dyg]_J*s UjXcRf[sDت)P *v~ik;f-wlxWjrE7*2nc|oԟ0yE{u{S7EnA5!림W&Nb:z#/`QL44)RI&.r?8n9B6*qL`΃G@(zǾvrWGe>^gT>71,BjH*8k ߤ׭1 DDDDDDDDDDD( Ͽ$~c Z#Qn!VpΖL!,%nӒ|,U5ro`nf}G_kO>lK w Q5`y0xs^[y(""""""""""@Mp}>]^+ey5Y9sO `5"/x闞SuQxF1[ %U5ODDDDDDDDDDOԛI_ Sx=wع}#LJ \=TkeEe7kʚQEAs|$?t߫8u(P+ЌcUj PxqC؊)zS^z$> r[ٵM 10Ԥ٨ĎY^qWå@/QT\(rɊN'elg8q/:ٷŹE\ U "><5 ng2L䈆˽DDDDDDDDDDDP ( 'է:[׳s;l`M4UՄP$ؕN@s4' n,vR:ͷpi/rY;cg9uA!Ԫ,5X`WcczIbAs*HX>vc'OsJ%bxp:zjPUHɲne9vS;]Z.ssmfhw乧¿h9y}. &ӍQfB a"R"""""""""""} ~xp)KE9 z#zzUB9ڽBk=(ق U*cHP^x"jvt|a3\R" eTk*:DDDDDDDDDDDQ u P~¯io\3gO;C=;6A=J@X;{H"lk4vQ14`tdًi̧);y -غmƎ1v 5H0I≈,@j8v+x{wmfl!+*/Ƙ,b߅s|`XAlY^` xq6ITHeH¶K|cæIHs~Z7K*/Ⱦ(80ϙv v;|b64pC9 4GG-))Zfw~qÐ{l{91RwH-ŋ80p㛷3^oR0 TEDDDDDDDDDDcU45} h@7tivGEzE3.>*/] 8G<2B2>\G 5ٸax֒9vH mN1`dpxx[p"""""""""""R+d9 F4 1\,d]ihR!#VDDDDDDDDDDDn@R+TxO`LyˤY F+5bXlM[x4PvI4$DC* Cjڋ]fZe1@ sZ]«@ C*:ZwmvuS &Uʆu?JDDDDDDDDDD&HЕN  XgcFg!1WL6 U*{j&M6pbU * (ZgxՓt[TupZ #ıFA!5h1 ޵iK1>Neb$* hkq8OQ]RFEVQ);݆*UF{:yF7/[P:M4DDDDDDDDDDDnF*8}? DF5TwZzCP*xEWQ߾[Q)""""""""""r3 V9p X5jl6/}!VJF#BFj[6c+'""""""""""r3 Vޏ^czbGTk~'> J"J "^(U3&ωT6n$Y7qNE 7:<ijU>pՄ{vm24XcًG( B20Uoލc| s pi瘝kM3݌,In9ifY^픯^{Sjݸ[mZ^e5* (Z.?;wOhޓ&PJ%X"KԬh[7;^YM3|Qu34et:)YMs:ݔSiN{ˇNů|/?rY-u,Pcb@䗎48B1NoR %""""""""""r V^ҬiWCNr;}5o5l0\??pE#+fc"^w c XR"""""""""""X@Zy!ޭ%eBy@^h4(yt .-igH]EU/Zm|7U1EDDDDDDDDDDP jIk}IE\ {:g䡛( ,rY}@f!|(<,yQ馴e7N۝2 eV!/ v6_;yEr)1^Gڙ9f6}@SR"""""""""""@jU$}eع6pZμUB,/;65Ly FqC*@o `f']Xȱ??pԅsRM Wʵ1NO3RDDDDDDDDDDRR$ܹ{ As-(!H(Zk-jq  HQ Hzٔ0X箽[@?`CPR>6}`%9cAԪtӌ#'17bc-uRvpInr1f|`ttf5f3h-Qv~``aʖ׏EDDDDDDDDDDR^syظqM M", |oT>ެuҐdE[>a_Sq'"""""""""" nۡ#g8t j8-LQTvH9 ;z5VFB\FJ#zj5Y*juk zA6u$A(Z04Mpig.c|? YvSK!*.b}cJd,Y1ܩ7Q2p2q9@MIYKC\`c0˚m1[yf{?ǽ4jU&&صm> }6 ![(8p8?~,Tc(ME \!u&1XMpaPzv ֝ jXQ3ʗ!U26{f3}D=DDDDDDDDDDDnDkb'O$w߱ h7ȻSٗ8}5֢j1RP,aQ!ϱILmf?(ͽGyjX#Ξ'YrAwN"B9*5I  ENTܻOE26R+%"""""""""""K)e 6==ɇwFuק' תq'c w7G4JDDDDDDDDDD)ZCΜӗOdMs;=Wb**bl:/Yi}DDDDDDDDDDDVHjwk l8 jdMקE4*[v}BDddx|L_$R EAyooX@ƖI7oP8a,fkQN2:Q}"""""""""""ks9!@(ٰntMvH7r&  bX_$R kjT*I cljkP ,*+O<S>yAai|s nfT"j#O/4D:&քKB9vl}wnghB 3?tg.}1eouܶ?0bޭIytRsmNďws/^ wFGؼqǩRtɋ4+󢼟( O=! pO5$y$~^>]dbY9zvwͮi%Et~H4Պ"""""""""""@j7)]yÿ& DQ=?Ac+J,N PVN7fZ]`ӥ b7HӜ}wmc)F liT_١U^Ib./oi]-JF1t n(07Dj)ZF0Z:*pGI#JD-:"-6{4G(mf^wfU&U 22T~ EjcAzm8^<fA~X{9}aSR<~*DDDDDDDDDDDB5Ҍ4`K֒zYpQ^c avn}1>1pH/'/\{93Kx2ƪBJDDDDDDDDDDdH]IΝ'"+ZAƾ7־㌌Nyc7w# IEYh,5y/_gbCSP˲=^"""""""""""2/ Q-yk ?;ve4٧"!b:ڛsC|Sse.o7sps*3,7f駮P}T9e| z3oy-ƴke@/_VRX+DDDDDDDDDDDd^H3/!nڽ '?^=00Uyhl3c 5X,O|]zVk\bE~|'/ s7/_R %g<5xxL`L#8K3(fxtc'x7yOTW(>%ǟSxW %"""""""""" 9FMpi? x-X ) >yB@{!R0 (BŐbP,P) zHb x#N*UF&40™KJj-ֆ]C))x2.߇0 EDDDDDDDDDDd^H]gsLUjLUj:k Z|#=E/3D)R k"Y$)jѱP  ~Hc-ޮϨeȼC@=1^e8"""""""""""2vYPʾoL>yKDc!]"""""""""""2o dY59GsaM>?JȂ(eͷApYG9FMDDDDDDDDDDDd|-3ᇙc~,0bp.p;DDDDDDDDDDDdAHCFʥa!\ )byLTjiJfqdɩ**H 8Ogi. """""""""""2 >bXtv+XŐ0) (XU#,#Kq0U2U19Uetl1r=W9) _3L)xf6of ټ]t`6[Cy6S u6_ŧO+՝Pʃ,$Ln6xJ|F2sfLM0 ڭkZHR.p//z9ȸ6eh)3`,8ȲLsDDDDDDDDDDDHuk:<]l޾BONUgoC'~w}0P~<'25+i▻v[xKs={X~UOIIʛ8y7swٗ1` (r&zؼ}ݴ^|Q,}2P(P} ff%GDei}""""""""""" @j4}7?/}7a[j)\. fZ-"3]q\};㾛ؽu-]J<;LLV^GCR}"UPeEDDDDDDDDDDdH-"k ;Ǹ]%<$Pr7<h,GXɟ?ǟ"˲e_hCB/s8WNc^@JDDDDDDDDDDdH-'r|n2R=܈/z)e֚h-A@Sb~Wd8M )yQ <ϲ}~;vWE} 6xf.w:bLc;oFG8t,os8I;5"ggdIB$#%"""""""""" AG[3_- }Z 7y˾(f>wʹj7ffΔ"h(qvcxdc;5ZJE,,GF ]jdQ4.5S lXAZ[R . $cf^3ZYY_!sB ś,ꯛ9⼜Z_/=+oY1W"mA?YBJDDDDDDDDDDdH-N>~6l䃿9=(GELNT`xtJ4p8ƳZg }Zhi.㗋P,g!N` ^Y˺?|G{޵B:e0,.EQ>{KDDDDDDDDDDDEmͽw",!NnWzP!N^ KC L0>1$Q%ik XL1tv[psN@{[& s.?3q [ְgHd1c -"a63>Fڕ䳭^D ]mlmȫ0P8wE9#4#Ee'R ՝P1YDc0^ʟ[0j̱I-<Ě.L+Wi*. }TJڋ lv-**iBZ4CJDDDDDDDDDDdެ`֬ <滲952^Y. ͫ5ߵ}are\l%khikbݚX5:eڋEB)~h^!䁔fH̟XJKk olyicg^б9>~9sB^ys@ĪmXk~mUB\.cԪL-j87R HCCq󙸣g8cRW{#?48tgt/CZfRli.n`\bUH,(B/dkU#er+9ZsY']5sGXX-B뱦=AVAR"""""""""""k Q?7pU#GWrYqq`j5kfC).óB!f eXbec Mf!2("흈R@j<+ޫBʀsdiJ%dٯsPdYRy`3{]KOnlbe9@bR"""""""""""} 9pOT@R qSu:ڛ_MA5U]moW2,sDQLKrϢ,:DR#sLW,9GǸTR"""""""""""@j*Ո(NLs|NR]Q(,77/2H$K֢TKSNs|dV4Pp,q!%""""""""""2o `|B1=!wܼV}Xnܹwmtss냢(ft|jI웮x85ۗ.rijonJ7E1)dj'""""""""""2 `pxəw /I };7'dֵ9ھ}A6n>V|af&*\4L%w976kq3S"ƀq,N\-M`d*\k !_a؃jHƝ7i{ B?yQ;F'8q":>:ȩa&6),RR"""""""""""k l?}}8cjW李\?}N204絮[l+ᅰƸz5Ղ3(R0\\3J#*F85Vs+9\v0ODDDDDDDDDDD>TEFhhg sHSLjٺkW3oZ"(!+r<>B@X\*qJ>vNyu;~sn:;0Qo{s"}l˾΍qfl-s^8t(e4[f DDDDDDDDDDDC;#g7C3R]C!3VL>Nqi*hܐdžM2 t#K\R"""""""""""rH-xwM`s%9R;6нu" JJ5"NrR#(ʥ~S2asB@*j-mUV[ a^{lp¹1r1=5Yh<)Zx}cg&qq[a3se>M !MMehϜ`:IS$Ź<&^~?Z?)D) dl;>sppTϿCG{ލF}Vc-d)0D*/fVK0Q<7@! VQc&prjS0:T-JykRT 1&* @- N1W \=3@3U_koZiʥ)+Rf[+^afeDDDDDDDDDDDH-KΩgL7~{P,r<<*x&N0 'O¿<.Jc8L",%@PY IDATeu DDDDDDDDDDDKu2<2/Q>~.v†jkR{yڑe!ATcւo4$%E\0s=˛oͽwGAusjLFi(xH欽b0 DDDDDDDDDDDCuE >;O«mض5;(w4S()>{kL>h:*VdiFDIB5JUTǧb0GcS$:Eڔ+8瘊#&4Qapy`=-<(:vC=Mvn]MlZ=+X&ʥ$M4Iɩ*CcK=A r\?Cciq2Di1˞s2k0V%""""""""""2 >bQs". k Àb!\*R*h(h,)1ZLQLUTSJ(N(NQ>$˘",]Mx>6ղODDDDDDDDDDdH dcRcRay\(W#$)Iޢ0\qDs).X{wDPHr.0EDiR< CLZ̋]=iL.[,b )yQ %T(s9\ĄIDDDDDDDDDDdH4'ZlU %""""""""""2o DZ]_7+ƭ̗) KYzy olxIDDDDDDDDDDdTD44i,)A>9 Si)R,:[Aȼ)ukYv%׮`mw=;hDZ$G={3ga4B~HsdY9`cUL(""""""""""2_ ~غ{ŭ7me˦nVwa~Cp1ΜБ^?8z}ja?229l1$hi/RF5ܺg _'͆M= %p $ܘG{tsJns=Y ϼ|MFF'pRpᕊ-M!%"""""""""" ~M46/?o}~nce|cL?97]A1xa@|~e;7ݲq'xs14b٥5l!on+/Jk@* a@G{3Me OfLLV=OvʌVv/|m %E%,}7si{467k&:ۛimmyg_z){2],Ŗ ZJE)yS U>͍ezVwyj6m\ʮ6JŐ$IWIm|[yvōNtT=߇` 2\-Vw0ac|$I^OK9, ye)^Dڂ-YR@g>mQW.}Ƙ jcc g8 hn$lo-@j㺕|7/=4P$xݷmw'?T_,ݵ|~LsJ%sy8e-<}>s-sA-R{q?T9a.,?uѽ]]li N]^f ^s3AG%DDDDDDDDDDDhYR6w [0(4<2wܴO?= #>vsS/YkO$.sPgW"+j1Vni+7'䚏],~Vͬ^j@}Ā1_~=zVuތq fvݰwl๗̭[B1|uui Bq2Fgla %C,.ַwo[s+b 8cZya/?}eSFY7nA^5,ɳ~?'ts_'OBL,WIe` kVp-}oIfvudMS4!13文9pIry+GeHm\ўR!{酽~Ə~u;MWk:̍BϾ_<6c >ޡcg<˹s 07{$=6T^{^*X̴|+҄ZqC,eH`ֵ_ a^\޲Fw^6wh15uS7׬dd*c 0#GӧޠptQ99U}yNLA0KcXd:ZsX{o  As.;eP.M]D2:wE|)kضe +WCż8O=2~6֬z6f5-y U$cϾQ;8< pl%I^N`iy=`3@kD,jb6oɨ*DDDDDDDDDDDò gt7Cyghd? W?*7^sl ~Lbրqy^w}z$Iy\0zUXުP.Rq[H9㧙f  1Zw Z6TScU+Zi,!fbҔ1 {_~}>gUƮޱ=]9Yƫo权ړ$tE_"T˯i5_XETXR{>}}샾ɀÒLNOjzYeHyDKKa-U#8amO=tt`_eUغ-'@^3"nbt7:S}~iqq`*Bj+:[)% 9 g?gI)K,вrlU^^T~vQ_,ܾukWbEHY39p e &' N0Y!ӁXߧ0chCA@`7}0@ZLN]BDDDDDDDDDDdMTSCb!cjqBضrN㟿̾HlQ_.vGQE=x3.]ubr:sp1G8ZRջ-@XCx2('H3. rw*<ϲg;\!Igks$e``dbr]!SzYy0og e?xx#qI90Y-".!""""""""""@rPYl}vn:r̓! )SU'/lofǶt|-թ*{/r9*=pWjYz=c(p{ϐ233% Y]BDDDDDDDDDDd첹ҹ9Ael!cfY-{ܨlN14[gfx89}'36>uݯ\;v Yϳ}j*gs қ!Zx`l(!RF""""""""""" l*s=x'C5X_ 39q3\{N,Va$i|Y||OJeU9GFG&x _k޸~{.֮[}H30}JC` _s` )Yeղ9'y}Q]@(fM-j"<(&I3,ùfZ{6u?'V9wYe lܾbܠɘ<ΝWp9$ny}|-6}@s|?o;Ρý 1xcҵP>[vԅa{i?/{B1*ΒYI {\=cSOVbF:VF{k#53m*9Iw?*(n׸ij{/?M{6A yeXyDI$g};{Zg1BDDDDDDDDDDdxGOok׭by(cå)&B&Z:Z`c7$ .JI,; ~|D 6}ˋ\8}g_zW:MMeWs:k7|6nغLu< C<ۼؒg|cOk1x"""""""""""2o2?}nFss]4"lj1JA *U\W 6qLY(执fR! E<ʬ^+-}vHܘ0=*<^z%ϖ<2ã>UH,\/|pxS*~[Y6- ƹOOe9po pM|fVhgu'd%{B%oΡcg>SRd5yj'"""""""""""m pՇ˘(բø.1W`yUUC?pO>Jf>96_ŗ?[z>c$óQX)ٗal|jI1>2˒M9p/_7YeYxC8xYf Q qsl˷epg1%D3W[9Wk:VCA5$4|>~iƖΆQ+>>ʷXӻ-j-ahdq>lCYo:ȇGa0` q2><[o;??y):~^϶mx~3c󫒔OW/ˢUe;!;էGM/$Aw [[(Z ?0osdqB[c2T߯<<v^}oBn_ Ɗ18k+ 07R01Ys8}}3 IDATr"-\QFLVj'xi97K#{8w~Us ˖u>q29Qep`sDQOc7uF0AC!""""""""""2O #NCra1`%jA>~'x}ܲj bZ-fhdY06ZFΑ C*DDDDDDDDDDDK,j1Zs?ww~9WW^^R"""""""""""@규s >LG vBJ|yZYs8U^W?}"""""""""""7)Ym0rn~H DDDDDDDDDDDK,Xsd k!EDDDDDDDDDDI,X󰾏=3Y10bǨBJDDDDDDDDDDdHɂrB 9L֑ϘNN-.Npi@Kc<G-~~89w~ MSL>Onra @.P4 P뻈sV"""""""""""rR7Qwg+kV-al߲%X=5S*(s\pY9,^څg?{uFTu_7/=5 Mq w7ē8ُ$IH`iSIC./efƣHejI+U3R7A>tq'ܿG7n~:9 i+NT 6r` ,[u+xkRzƗ(ݫBQLӾܺe5nYCGqb_(:Ja2ҁAqRSQtrh`dd?"""""""""""s@j w_|+wB@- SP% xSߓDp+*0P=:HҔ3/& &u!MBg.L-ZYLS-䍷#Dq)"8&YD~f8^M望xըc5hn_DDDDDDDDDDdHA>{:>']1YW\nݞs`< uJ5WcyAa}9Iqd <BZEI/웘_O|A> hU+cZVع60Y;?(!ǫ{rs v8&cPZɣ';] uMM-.Y -u}Zs{vڛP+0`9 ?C8qK#OThn*dq'nYÎmkYb3b!G_?,bRK]ȉ!~+ཷGm^v/  %NR c rcBmk0SsRv7/@Z;H=ݝ*.\n8u1#K1 R"""""""""""s@jl徻äYba {8~.s{seIu+غU]mj5*lob ظ\%5И,IRć%h\!_ BσgGwGϜ8}k^4?4X\ ⇷kT!~ykQ&&Z {:eRue)QML~SUX7c~֌@ι 9 }DDDDDDDDDDD@,wETk9cgON$3._}'xO>7a^x=d,g./N eئ*)._Jڂ |YuIc$ćYX|==W &>Ͻn{$G:6a@.wsZ-'! Y<V.@ʹ˕Oi~ ʑYDՁ%u0d| (hch+UұqI}DDDDDDDDDDDfI,4Q*=HSFط8ڜ2c00ɇMd<6Iyl$JWd?bf)W̐\O~sS=flaMG# ̒Y(rrpa ]Vu*J 0O>9G-E +Pނ[9wU eRMMsWSp%)GA%R~6kiF eeRcttc*J0  EJaT*{}A[+~e#5uURW(\0s$IJdJZ\ֲ/߄ )c |H.+Z^-@ bX^~p̊)c iBk-Q]Hyac|p)SOժ$THH‰pa40Ajimk᱇wނs k?/ _Ħu+Y q a^V\<{nom6sێ4kzy p9Z#|/b~:)6G˸4BDDDDDDDDDDA f܅N'*OgU3QB)rM|;iom3!l)c {+vR˦+mzۛ|;0=Y2O^ e_0>8[6rʁbr)FZY8r<e\c֮V~18T/~<=uB!~F) }׭I֭]#hnls?~Z7|1ޱ}vra@.{# vϜsiz@^fyƘ`kSRj'""""""""""(Rti^x=n_,ws+q>޹GKÜdxd$47im)tI'nYc"_C,vn_QN'OKsuko|, $ y7^5H%Irz>&063S æ ẐY:p,=| ѳ$ L'eؼE_q][ٽ}+vdQ+Wt֌ 񌇏kMME;{1?3<?uHWg ֯侻;n * H1;~_>}O,=Krˣ׸n\@JDDDDDDDDDDQ f)y? -= p `e?y=?@E:s5T\σ$B-Wg 8KSJ<߹%;xsyˌMP*lofْ.VZªKY|BLC.dr`SQ,ruf>DŽ!w%j04H0i֯_#&l.D5 ~/ Xz)+v{NHAljio.YaSU8S0.R[ײnrG09Q9(s6hm.Rh*B^Ÿb Y%W!Oy G/plbB2|3]!5E 4HIk{}B>&E1 & Yr1K,NL-)$fQS6ԙ J {\@nJn,WMV{Tٽ c_ ||AT=,&tb 4H<|QEZ|䶬2e-8d*0L87jq^ogσB|K|{O߾9٣v} }ƮeiJZi ܀yHR/Kyswҹ'T!Nqv]]Ō}cO1,QAΞ7ٗBn]Bxnz+p`0ԒVYk\NP uҞ:~O}wmeJMEBx`I짩b>TΌ XcHRKT';Ϟ̋«ql6ZeZ=nsٱa'+#%"""""""""" R7pe~q;;r[ؾy5+u &k!ٿ]RdAgyP}YՕrip/iz({3LLTISc ˁqPj1fH%QDDDDDDDDDD nLidtWnT*/h \jHHɂ>MMMxou4ke $&j'""""""""""ROXf EsV}BJDDDDDDDDDDaෛr\>3u$IJIc>S(016*18ZEDDDDDDDDDD@\vݺMVtIb$N<ϑc8uc>]B qUe@jPʹ\_֖nYβ%]47㔾!;DžKøPuc/zh7ߵ WJ#}sDQLe(gN_`~;Jy|cS*Y!j6vC 6T]"""""""""""r[VsMlu-KtQj* F8xϾyJmNTsێ ޗwi Ls)ұrŎgS-ܶkO={Cޔ`7T@䜻 )ilLcMZ4MDDDDDDDDDD(IJvPϭş|/~nh.B*,vsO0+ݰ;wmdӆa>9*v/܌u^ְQ &4:?ꊕٗ"""""""""""? n? bJV4#0E>N.gߑY>?zOߕ]w#&FP Yj ?ÒExӇغ,g|OIſo )Ejx ρ2\Zef"""""""""""7zS;lڴ |$Z\jqf1ࠧzlm5]iK]6ècc19\Bc?Osy|+ma50 sa+҉ iTmٍ%3YNHT!5O_y[woReECdꡔ( x{:/=N7^k[9ct^QWo)rtOI8! |Nc$i P(rUTZb+l= [/ [@JQ 5B>sO־-N:gnG$T5*cQE=qZ [}6FkQ83"tqUI˕RYuIVZ׾mM?{w?N_0{T*(W͐J'*܌`p9NDDDDDDDDDDD@j>qV{M=Pܾ7P39T7oֻ*E1_l:jmR>,[كdL0 5JZ n+I IDAT<sJ-z9 "m^77+Ty޵)GGH+里Q$""""""""""@j |]غ&XrBu8xo}I~?u(f vl]ã" Z")ZN_WOpY:ZXV}zV`W//`|08_AI3x%I$ڧR2g,+S?R 5MMܵ&642<7:w~cs1GM /?$ri~׮ >R# }1{NHsA>-RZPT(hkkX,N?fxL:>IƛL}1=%""""""""""OK0{%nݲB> v#w-Tx[پ}M-%@U1ti_kh͞s'Serx z>Wٺ+!Ie8cdFV8:_砣5ˁq GR"""""""""""7@jZ,n' 㷦l<ÅaFFu[z÷t"ALW`Qλs{k2>^M/aT*P*CUkk+W^{Ce-Ō,W*υGHcfpź1bAASxӌ7 KDDDDDDDDDDc(N.P*1 €uT*5jQ7KcXO?r;n^ UVA@cCc\\$V7Kx8q$G??G\.~CVuRKT.|<.c<9-""""""""""R')ZY \MW{ˬT/6Rhm8ɞ0Y%Dy_<.]Y%$IJ#[۩V|>G}0 bƍ\,Zǒq. ~⤩yS&j٧8JDDDDDDDDDDFHR1:63:6_ɚUKfu=c ;zW,pfj'O18TX yAdJF$55\1;j?0aNj*֬Ysy׻^PP(ԷQ9s>dV4v}3x DDDDDDDDDDD@j&*Rm `)^m;gRvn]׿wܶ\.UOFyC?t(XxQ;+z{7y㌍O^q~G{3޾C<.;[!PzэS.־#g;m˯y$iĉShߌA֭[y)W=ʢE(T*V\\.392;qZRSf_ݔX<04@ ރܺc=֦]C6lX7q߲؉'HӔf6_C R{^|?|7>K#֖>wϮGHUjqGʿ9;;w^ *F[[Z9^38瘘`dds &rݔ{ٌ/!E}c<һ|s{I'3`]V=S1|S|swqK$e׫\31ٌ8w~Z#÷wI!  r͛7cǎ!MMM000p@ Zz(.0O͵/i9x{0zSjm-~<|ȲUKXz1+qSG9Ν3֖u6mZ_62ow)sömغu߬A@XT*ݰ)MS.ٳ<G?@jj[Yq93nR3 S>/a 6ܲŽK0Q,,J-fT"S*OTxK< mͬZC'=Jzn2vȝ6lRH\P={ ׾~S|gӦMYaH.n 5s&h!l[;f>WYC!R06^G?v2!IGc:}[6[ slFՒ.ۡd 4{=Z+o䉧 MGA}v-Zts|'R3gRER)^\V(5l7& ))GDŽϟ|1W-jtԇ}(^_szښر{#;Fma x`gs@.>%O~/wݱ|G &j(F6\e%~n/S<7KT+ZO6 !0L$&. 4X3D>>v7bJ UGiJ$ Rqj3> 5zZy>>"""""""""""_&+5^x=^s\Pȇ y\j%<1IqPUԵ篒˅t4~(: xYg_yqoZa|CǧiJ6^izn80BrQDDDDDDDDDDDnHԯH'qBRcWcU~ ySweu>ZpS'/޻x<|߀Q3J%VXA`kmC&6% YWoch/wkNYe<PBJDDDDDDDDDD!oQ~8vVг0Uc˜:s'(MF477cL4mx5ĥO07L x*DDDDDDDDDDD@jxi?|s WH:m|TfP~> |DDDDDDDDDDDi HӔ8ssM81dQai.5$IB ȪK\i~HHo c +粯Q*/1G4JHZBRi͟yp+06DDDDDDDDDDDA nbz0Fk0~<Q wj> g]6CTW %""""""""""0 ™ukrmXv=]xVIRsJ5RGjQ`Ԣ4•j9k-:Ո8Mq6;Z~(&uXTkź(:'/2 &I5|uK%劈4Jݻ7ᑇnc͊t648V0)("^SEq:HU&$IHqBRHUkD2>Q%MSR눓 ֺ8!PkRR?0ʥQ8]gg-= #oe MrȦG9Դ9w͙z U(i90/~/~! ]P@gh6xd?;.of=]4 YR}tqE^r*f*bᕙL8U}eW]b;G?6II& H5Hcۺs ́ BfRs$)eZ |H5dFcrH2K9,ƒ[f֒,qIQKҒF=ݭfiKc{ `0yjm 0F7hV[-iZ(R/"~s7Z*,!.q#NCCp ~wT(KnXUsb4iY^n<!lt 1PAO~??,33=</eda󐚛 Ot;:'*CRxJ$I$It n[[- ,+/9v0>^r?/`9/PikC BdVX?F`r@J$I$Ie ;lum=K]X?GOy?g/ʏܾ;zaѩ/B,6HS#E^/pcVx@Jx&gR k/e7G:$ߙ; IDAT*LA:,'W_a#*c* ϐZRNĪ:|rvp *$I$I$I]`˾|Sw< udVM[?zy^^\~$2iE;)\l!^%dZ5UH'OPT%I$I$I.HBa޻O_> ݊\77*Ҥ%~nWVڢiuSm%s.ݫR[unYHz,Ȑ!%塃^^$I$Id˾]8znژU&u#x_|/8xpF y,kE5͌30gf\gEE[;:13ץs"I$I$I_oC|  ko㉟=w~N_ضw<3ɄIxRS Mu"-yJO^>cy_~gI&m4Exq^yo}-3p!q?VRL?ufԥꚵX!tVףw@J$I$I濲߄!ԣ3:% }qo~3 @NG&FIM4p*5LxL]7FƓɤa4r"3>'<{s?wG SNdjduyg_|W~sxrkZI[޾Ycf"k?5Z9?\%mٶW;%Yr0:rP$I$I$$Vc%;:2q~|o{q߯}"ӫ*[\9 P]qzuS:3DNӡ5I$I$In P դiIq'9 >'My]6)v2ӬD2=fJ\VBۮixW/A9s5] 9J΁@nK6uUZ7!o~I$I$In v+ffzӊ )U9)CĪ`cp`Mji7KsIzx0 W/I<=^l|66*"yWc~4MkD idѐzLU4ycS}C^_$I$I]0A!@SAQv.UEV$ MICnmJǁKأszibկ?xTU D";]f5aSsqxȠ%\=x 1B޼,#%I$I$I%6¤nz(e,rk#2wUQsփ+6=Ϥ2! E]ȿwWԴcfwg:,GΏ5CFfWEљ7$I$I$i nŅ~?BubFcmY^^Ṇy.}m!)N1Ƴ?_޸V?1ru;r50Zə*\iƢHu$I$I$If u~ܫr>˯k+EtaO}f,'}㶿^JmwIE6^9?5_|oWYa8Oekk4MM(' r $I$I$i n*_Əϟ)ϟcyes/sx7x;rۡ("1F"R@ ,1EQPH8 3')ɤ:14,G,\XO<÷$?xW\\X}ʼn{+nߨ9B+u9Q:H5$I$I$i v̹Μ[g/,_6G<0àߥS ]zN̠KSut˒L^CUTH*SNR3L&5k1g/Ko^>MJrn=fTV'm[m7 g֨S޺[~L'!9rAorI$I$I%Hhw#VynTFVlLB @c[5UUSUY0ə*(@j8:bye k1фx;Fm\ω ;Ʃ &M^/%9HQ$I$I$-}|ӏwq |?|=09jƈIus͙J r^9>`oV$5\6Ȅֻw< 1l %ǝ%I$I$I1:2O{3?3<׳2muBlCʲUL!¸&g&C'cP@%]^J t bH$I$IK3}9t|.!_Mmy2#Nm}ʰ&gV#V1uNk\͜(A:)z]\$I$I=` LjXZgx;\}&e8qt0eG#C !҆ZW9%BU9q$I$I$I+RR=pn&7 Ed~w;"395 ^!\)dx$yQo!A=qȒ$I$I$)p! s2fg.ҾL"+K{}bz+QJ,G沆}!srn W$I$I$iHno)o -B ;tk%]_%ZjrfqLuR$I$I$!)NUM+j25R1OBB۶hTΛGC !)Qй -I$I$I22R@;7,BMR%-e|O[9\%Z-~>č+MNA'u$I$I$iٗ (ˢm׷[hN4urʧ@Uu7fHW=]ja8d*v@&Mw9B1W$I$I=fPUe[Y. 32RVʙ*Fv{TڷZ:3IQu::J$I$IRE+`{K uPŁ̠C*o;s/DeE:mud¤IE^>LQ\TI$I$ITTeI qsvU49 ~ˎA>GqΞ׿_zNEݸ@anDYTr{s&LQ:G ѢAI$I$ITXQ0 n[Z!=/'Hk?K+9ԵeKV*:CjXOXkƌSC!tﺃj*I$I$I[m_Ѳ/r&&ZxpG?ػ J!RQPkWHMRb4@ΙL} *I$I$I[@TfHy{'y{(x M;GYH]Or,"eVH]ͨiXLR|1%Bw.YU$I$I>1R1Fؖg=ꦡ~*ym$O88;޻O03yw^W)#t*TΙ3z¸i6s&c$:Nu@K$I$I$<+6+6 B yߝqbRژ_u8~GpNj RT!RŸъjFQ=C Rfr"W_^\ri%I$I$Iz H@UŶB 6H*e&dCsAzꦏw?|Qꨍg^ӻZ2@Wv(5tC"Y}5&.$I$I$mE %heTk.x}w){>o3 ,,0MyNUǿϗ `8㆔!d>w?Ͻ:?yyuy}6 Hİi˛YzZ#LNZK$I$I4ؐTI >?#ﺇ?=^zM^?usYY:dR7I9~pPא6RKO-jg? }_y5:mfo7]5IL:6+ݶ~nJ^X^X OjBD$I$IxKd0!4!4CBUp;8y]09{nY^hv ʪ41@YЛN%%'smB[5O:O%oPp 3Mj+^LȐF#U)I$I$Ivt N;O'4mt#BKEnhcUIlOvz>WNrmUDw*o8{nwZ9Qĥ6TOh# $I$I$Rt &ޓ WtN|KKӐkR*O=w#߭#L44\k= HIMLH$I$IKVHazS/7 cv1+Lm2֖+@sn6bLw?|^Ciw}/BqJur>!M"7/$I$I$Id 5r毾uӰƧ{Rh*B;i-eS>ۉ}|eH{\=k=W9y4WNBRaH9(&gr΄K*m掙WC$I$I]3ڢi_O/O= s3}:N("Lס,6*"nʂn"H n"-F GlyKJrmmM> ;R$I$I$햁nk6 iTʙ:ˢ-;(^PR$I$I2{93Ԍ@*4UM d# -I$I$I.H685 zG-R ̜SĪr%I$I$I%6ԆI@0 RM _u%%I$I$I^BJ9gu$evGe As%I$I$IRuj5)}&mQR@1;X$I$I=` V 5jjFdg\6?*V[m<rn5$I$I$i/H鶖Rfu2a@rNd %, )I$I$In[!Xkhחrŭ{(fE$I$I$iHrnCitYe\m3uT`@l'I$I$I^(]~$,is'sPm/? 'T~=$I$I$I n/9Hu, iDQ#(6v1i]PGuJ$I$I$횁n;S0\S.;{b((z}BCv$I$I$i/H#>ΑqjX5>_ B(ڈj=xEGϣ$I$I$I;b n^Dș0ZG!kTH5#V\$I$I=bL&dG:L~ٿjmt IDATC*gH(+jH$I$IWWw2mSzAgX^^&JU(!I$I$I^e38J@9}Ν;G4;zMԥBhGEGI$I$IW y&ޝ'8#,,,pEr;cJbzO&e)I$I$It o9Nts{!c^}Q\UG,W6 ͡ $I$I$%]X42y2:4ǁG=eo믿uIUSĪRf !bg$I$I$I;RoF9Su98GpiN:uC1Rt*bUA|T@$I$Id@F522;906{79} 1RIJ$@ gu}Cm%I$I$IҵHiʩ!@q1eWVV8uϟ} Um˷>vT̉TOO$I$I$펁9gR3!5ݻ|w?L1m%MRUOCd[I4&C$I$I=b }$Lg85IM޻9s*ooA]XpTݹY^XhkB{)V䱁$I$I$I{@JC@?O~6M) /p̙GC~請|( > *̐jKi4H$I$IG  ʙ?)t|xg9w܎vsn+#UO97Gv̐@$5ze4$I$I$I)R!:*%ш}~cW / 7unG~o D:$ I$I$IJ@T&'tOp{ʨv̙3gxY\\xZ !?F}`T2i4^[#5TH$I$I]BJTN r<0?g?I'/*ye_ۥw(塃$zTriWIH$I$I=` [*Lrw>py9|iӎeYR9LHaGrYY!'^ I$I$Inx?{ēw^w/ӟpxS !PΉct!n^\&K$I$I$]njnFEAly >!w V!gBrӸ$I$I$풁n )%~iy],KbU9vrnP39CJJO\|I$I$Iv@J^Ι_~z^{m7Po̎jhF4+ I$I$I.Hi߫_@L>(b9%dL'9ʊ@$I$I]2ҾƷm^}1RUUUmy\뚜}}@$I$I]*]gu] /ӧO7ת(}R9\'ș LΉfyz@J$I$IݲBJڅ ;yվʲ,9!Wڲq44K^I$I$Iv@J믿߰ pӳv[iUΰe!FpDDk/$I$I$I` }k8}{ ](RV9@ Ƃ41^Z$I$I$킁_|ԩSӻQж[Vi^!u!F#%pJ$I$Ivg }?w7]\emGmy G44+kD$I$Id }'/=z=oYt:¶+Hɍ$I$I$I7@JNΙ~g?*omTJjLȐGc&/ #I$I$IM2Ҿ+|^xfeI#ƭ}۟ G !3 #I$I$IM*]'ϟ[?яX^^v_ 1cوBnj/^$VHI$I$ItҾ\pavHbQ@mU#ȋ#I$I$IM2ҾP%gϞ{Ҫo]ۥo{-@( BY7MgHdq4=I$I$It tK(wW6۫v}p@eΐ LvnIԋK4+9R$I$I$ )0Fbk|_?kUӹr Ul.yHkCUd$I$I$&H*U/|;Foݬ^`0ZXUp!HuCD`$I$I$݄%Эȏ~#x y`i/mG׻B UI BȐӖtT0YXY[Cj,za$I$I$&Ht:9r^QVz+ Pl/|R//ӬHI$I$It3![( .EQeT~Ns1RD4+˫^0I$I$InRBoiJ'Ar:C*ޮ/@ PҬڋ&I$I$I 2-s&4 :T!{m [%Cy4&'/$I$I$I7@JTJpHJ-;z`@۽~Pu QTKi<&Hk#/$I$I$I7@Jd2aiidVI]e{]BUr!5"OfU/$I$I$I7@Jh4ܹs4ZoW/z=B"QmE۲/g5U/$I$I$I7@Jh4ٳ-fffET(hB ɤ!͊$I$I$I7t t+?{ywUlv.K-{ly9g'E$kA^ 9 `3|,V_$jgEd7MR#Sdaܽ{UVWWy?FcJ7&J!IJ )T>$I$I$IO )X;lnn2y:ʸt Y|3}I$I$I tnNHmmm1Lu4Q˞}IlF=8=9,HOJ%ZgHI$I$I tiM&@*f=u:0叇S@ix)I$I$I: 666f u[SFΐ$I$I$)n.XYYyu:g]ҵ4 6n$I$I$IO )]Z\zփ)u:#8޴/rgHI$I$ITҥ(}$$eѬP͕$I$I$)X!KxғRI{~u6_Y,+$#5q%I$I$IzR677eP"ꤨ-+gHI$I$I4 tdޏ\-fݠ}A:jVi7dI$I$ItDm۲錃p.)e d 5M7X$I$Id.v}kkk]obG{PZ8lwXnHI$I$I tDlooa U9q`%X(*MKi$I$I$I[҉ڢmć=wDQU&,I$I$ISBJ6[[[_n'{0mV"]٢E+I$I$IS2ҥG_x666~g{}f߀Li$[%viخO$I$I߅._@W?#tJ&wh/HJ$I$I;0ҥK?rMw{>(-Q ˡQ$h䕗i7 $I$I$I]HEׯȵ=~swaq9T"`5U7Y$I$I߁. ]d29~o;?1pXG-u`1~+[W$I$I$I .mf{{xz0eg?.i=԰&e2f4kn$I$I$I#)]*mrvvvFݟ߹ín~N GUO( CO{շ^9%ܒ$I$I$IOu tt]W\y^{~!?'( }u=u>'sLƌ_|k*$I$I$]d2ᥗ^bm{?aDMâQ_(JlѬKl~;tΏ$I$I$?.^u}d:DFPl{lL^{eԹ$I$I$G0җ^"XL& C[ >hPј7µ?!U͕$I$I$2`mm_~D Wݽc؛TJ^bu(I$I$I!)]*[[[\~i{?gg+:9!+QVu6w#%I$I$Iz tic_իW)ўߺ>`ؽGͩ&@˽$I$I$Y2ҥʵk9O>e~&t @q_ L$I$I$Iz tilnn /ytfn|B{2RXDPy_Ct4n$I$I$Iϐ.^yԧtFdĩqTiO$I$I$n tiK'g7ChVBi⟅$I$I$IϒXߟ?;qwwa8NNZTMkp$I$I$Iϒ.??Mlp0%3UHΔFn$I$I$IϘ.qT@J$I$Ig@J)G0mKc忛n$I$I$IXpӝ~ ^F+i_u,[AD!un$I$I$IϘ2QSDpcs}[D@)@=ERA)c[I$I$IHLցgwwOBo@e(q!`f񈲲FJ$I$IHR9 u??{۷i&&ip$f2q%I$I$IzƊ[$3tA?e/%ý}(Ai&Y+^}@(㱛(I$I$I3f KgJ;@dn2L!(% "Zɘ2@I$I$I1)]:χ~QWf7>}2ab*e$4++č$I$I$90ҥu`?)r6g rY(ABY[Fn$I$I$Iρ.p:zo(jViƝ&I$I$Is` KV0oަh5+$I$I$IzN tide ;o!=44kkDg$I$I$Iσ.y&Sr߽C{64k )I$I$I)]ZsY&;d@@De~hWW)mI$I$I .!w$I$I$Iz twaњX~Մ {3c7M$I$I@JpGDݵ IDATѭ)wGsE˾`(2F#&JJ$I$It hX0^ΐ*rTUQ_NJ$I$It w}E(xdFG3QkWwM$I$I$ 8CJփsfrs繁ƥpZӾI)%!rTfkknSM$I$I$ HŠL&QlZ">0pkȀ6ŜM"hQɲ:jeBw ݕMidI$I$I΀.hx_9jͷ[ց &⡾baP@e9;j ڄfeb %I$I$I1҅uW m^r{jRe(I4t8 Ʉnsf}O(x%I$I$I: ~" 륶َۣz;r$h FReK?XmlnRF )I$I$IΊ.tc&lDk݄2ʝ왓2*THEݲe_ իʘ2$I$I$)]8tMִTnV2ʽa`$} Gt;W6i")+ʨs%I$I$I:#RFN$yX! fB@3}JI$I$It ta%IDou]Ƿ-]vtzu @Bd5$I$I$,HJAw7Z;曋2=ٰ2XTFJ$I$I$ Hסh |wߡ!.~wy_|XۛΘ @i>I$I$Iΐ. 3集Ǭ#׮o~3u1@* ͕$I$I$ n.eR0~5~=/6668z=zCO$YTI=uL$I$I$LX! )F;WW$秵VX+gٲ/$Zyo>I$I$IΐRp"j/snc fLӣ{}ϽٜryrH$I$I$Iz t!@0z%V5G3iQuU )I$I$Iΐ-taS3Ң"j}~h@u$I$I$BJP,*~ +F4C+ter7Pk=? }y&U:BJ$I$Id '#"{7:tǝ{xٿ{޴so>deE$I$I$Ig@JaT@M}v#>{:~0̆,Sfd?BJ$I$I3 )]h9B}D $>eGR$I$I$Ig@JV9 {{d}tTD!ۖzoiV+{|q#ȡ )I$I$Iΐ.. {%cfL $ 9-$I$I$I:SRr!(CϦI[!%I$I$IY2ҹW<eRǶ;||M3q;: n$I$I$Igu t^"(%"`HbE{=u6ERIW}ГY!!UBJ$I$I3cMf.*i7)%8:CH+E"u`w6 p$I$I$0J([o"):ʤjȊRJr{v@eѳoQ-%I$I$IΌ mFׯC=v/z!"h:3ws97*GI$I$It tFW7)1J "rXχCMx%I$I$Ig sreo|2u`QulAVJH&&NʝaH"󥊩$I$I$Ig@J#=YCLq2zвhw| '@J$I$Id sh/B@e(k6ֈȍ$I$I$ HB:Pk@heg C%@*m_q%I$I$I:cRjП@tHՃ)>g~EUCt;WlI$I$IΘ]fB R[Eʨ=uSϩ hPӾ)FK$I$It t!0@SNh!ƣS+fzIBE<GEqǰ ++n$I$I$Ig@JBuQ%2eTBƧVH>Ƨdb"zp0ӏԶq%I$I$I:cR:wa'E uZT>[DieCTmPK$I$I$1) &AH-Nh?f~F{hQ˾9Xsf}߻$I$I$1)]u͐cףmiƓR>gDkaudKM!"X Nˤ0P3pI$I$IΘ]=Qcӟ˨FG Ӱ~C@ ,bV 2K$I$It t!'# qwBjM>-9D|# Acq0P $I$I$I:sR:w00fNA:hf|>!ǷdD)0 ΐ$I$I$H\e&u3WH%u4-~po"WHEYE U Z+}߻$I$I$1)@@z.T4Dl>@D$I$I$|H\e&9Tr:(sZJQ ͸L'Lo|B<8CoߕK$I$It tjgGaaS4A(݈]PSP9ʨ"Y!Uk~K$I$It tR|N)?bzu`13X hRVHI$I$It> t@R.GE/}z$XO̜$I$I$IP t:YOdIhDi[{կvRӏl+3H3)I$I$I.)E Փɖ}e2(Lo|MǗ,Oq9DER$I$I$1ҹLtFA3@?_3K KkQJK$I$Itt^*3@aٲ/!IJ7L{¢)sђ/Pj[E$I$I$Iu tTO?a ݹE`Diനi0,BJ2PO]׶-m둗$I$I$W& -BeEYs1+cQ5RĨ%B,OhۖsI$I$IΘt3r6'kOƢ_u.u:M"_5)m6-J7"fh4 MӸ$I$I$1)LlNgd r:,'2Vڍ 6&ӌFT`V+y,m:CJ$I$Is:_@p0 28:jGqq9կɕ|2} a<;CJ$I$Is` sUao RHZ":W޻L^{hZZIz3뺎hd %I$I$I90ҹa@?@>PT .¨uѪrwaoSIdI ))I$I$IΏUbNP8!$8)I(wwߡXfD.(FL&)I$I$I΁Uʰϐ,g?IAPsyO4L^L^e>mLA'HEɄF.I$I$I3ҹ~`[싣R ET,*2+^`O7_'ſ$YPa u.I$I$IU=uoJ·W&^]|+? YVvked*2Ē$I$I$Ig@J*aoh2rUHr݈+ɿ|MHثɝ3w[[[s%I$I$I:ӹʾgwNV5%PkR l_믞\I$S&TUI$I$Ia sCNgPs1 P=eu?}v?e孯?HEwf2$I$I$+tnâ<wW{>s^j>I$I$IΉRP ҵ}-Vz In79-_ښ,I$I$I90҅@B3|4F8CJ$I$Isb gh/\_>Soll8CJ$I$Is )]Г@iG4uJ ն-\rhJ$I$It ta<qu]3nMu;;;HI$I$ItNl٧%3M)#~'Wԕ+W[I$I$IΉ.@)Av?GnݹsEUf2yY[[sc%I$I$I:'RpET-n޼pph'Y]]7ޠ:7V$I$Is )]8͏cf#VVVx뭷 $I$I$I:GVHjRk._֭[{'_rW_}K$I$It^V}r,^>?)RڵkR$I$I$#)],)3x'GZ__^6x%I$I$I:/B:z?3idy}N,g&D Adi cxß΀aca0$0 xl-DrHfw-vUUٝQY ꎌ8ԛpE?\{/U$I$I$1[)Hj)ԮW?~mGw';wMQ$I$I$0^oZ Y/>#>s_Ep?]ǃ1]t$I$I$I7ȆJY\tP_!Uk嗿%og2`#8)A $I$I$I7ȆNBOlN#=OXd/:kHT*tdHI$I$It ֪ 'G_W=avW `HߐZɮ@)$I$I$HT>+{_d"Y~!S0,vP $I$I$IIRzL1& i)9 IDATK ( =T5`J$I$I$)Z",CVH^I58Ujd&+I$I$Iҍ0gLtu~YPg*I$I$I 2[g'aTW FM(Qʳ9$I$I$k?J5+5hYNFI$I$It 5DkAZ4򗁔$I$I$I7ϑ}Z )j0n&}uѽzƟ$I$I$IZ9)vAR :%I$I$IV͑}ݰxȾ! e\Z(I$I$In62vnH"6"?]W$I$I$Iҍ0농`4\B6q4}dHI$I$It ahH[RgjI$I$It A#>DBjAJ$I$Id ]ƣ!J֯6B/iV@z4 #^هQ$I$I$Hi#nn2(Rj. ,x͙5R $I$I$IARZe{k jf?KLKJvs>fZ˗$8O$I$I2#* - bهj!Tc)!fTvs>"GD\*R$I$I$ RZp՚ammx<xydߎ"v|yZ;MZ+ߖR$I$I$ )Ԡm\Ӷ-V&݅aۏﻂӑ}{,e-hisj%Y$I$I$:Hiڶa}}L6L&{g?΃tpTЗu k`L -/K kHI$I$It Rm0 iX Ce}mLDGDHUOʜ@iG!2&Y!I$I$I 1jo& 4M\]Wxwt>9}H>B a+7RU†$I$I$I7@J+ -M5+G~ywDς/r$$ǥcR+DsfS2iT? p\ {c =M^hBY}$I$I$)VDҩ&+prTԄe qH5|h'6$I$I$I)RZ<$"loo*"A) "X{W=R$I$I$)Td|$MMBI]RkFe.G"I$I$I 0J՚,,ln +R<- si  xhZD̆$I$I$I7cGU2/( `в>f~qz~-Td0ip XoZxIdz$I$I$RZR*ɜR mXi텍dR{4^j#Xo^9/!rn$I$I$Iz Rpx<+rdMڈA\jzy&Pojqe%I$I$IMrdVj8<< з`m4m]d8YVk.3Qcg$I$I$I[ɆVj8m! 3!۶Ⱦ4+Ӭg  h}Y$I$I$Vjg{ fA -Mshӆ$Y5ap+$I$I$I)RZx4dYb0hiA0ʤVah(j[$I$I$IARZuفQDж \"(z~d_LZuV\,Z=I$I$InVj4>A΢/1B#.HRr_EGwxD9>&"I$I$I 0JEq YV˦UK0 D*5Pꥷ,L2 Nx'"I$I$I 0Jmnq6rn_LtQܳ$I$I$IoVf8:@-Ɍ"!xwm<8o~ރ$I$I$ 3nop7R)t R bHGq"̤fDp_rKH$I$IHieZglq2˨{!"2| 3$I$I$IoVޝܿE;h8m/՚L&3p}} UʹrS]åt''q$I$I$Ib wwww9-#EhBuW]!I³D4z3co~J< I$I$I)̃wgR*D- ',(r\O_Ўnz2~NwpI$I$IHi%Fs6v6)eC>P胧Iy.J *rrɯ?`#HI$I$IHo&ww)5L 1^- @G?TCI~o)'K$I$I7@JS5 .wnm1h&iCjzvR5|nD_f"]R,Ccf|J9:$I$I$Iz t7U]v7&v2WmHe?RWٗ}8?daI$I$IHڵM;nև@V&9G+5J@2/H?&~龇%I$I$I` k7h[em4>D R*錣*$ U ?_⷟$I$I$Iz tƣ!wno3(At#NR¶J]f 2`@`L$I$I$]`в`S;Ⱦ:ԗBwtLHL<0I$I$IV@J׮֤toEq&G'+7$vH}5;tt$I$I$i t&}tʠoa>892-|yM_!}lĆ$I$I$If kXtO?4@*d2xrvTxT9C* @c&I$I$IҊH՚XtȾ&88wH@-:QK$I$I$IZ!)]hȝ[};|@TJa23-.e(CewHu:]I$I$IBRVр[;[ *KT9/P);j> ]xp$I$I$հmXc0h]LW CdTaU꼾BHI$I$IJRm i8Rz SJjgP $I$I$IZ))] !\e)a>/.R,Үu_6" Y+%PI$I$I/f B:tKfs6 F~t_+*t$I$I$I+e kU3Yt\f\- iQyV-PaTcbzp$I$I$U)|A)eC*Y,speuCjF^Cٯ+K,Zg5+I$I$It~NV@*YKBb,"ʋ}_L kRbCJ$I$IU!kUke>_PjX[t\-: i ^兵U_|, Ն$I$I$I+d kUKe6[Ԇ*Y~YM ~B),Ń$I$I$i tRLgG$8/B2ByE)=z$ZȒ )I$I$IV@Jת+ɌR+ː'/LN._%$u6$I$I$IZ%)]+(cҢrr@IV#ܯ]ٵrс#$I$I$IZ))]R*']>,DLG~w̠, pd$I$I$I+c k7͙,E@dҶA4 "=:Z. 2|t:/vdWL%I$I$I.@Jn>/OB}4_ȾZݼ&^$Y:r6!%I$I$I Hu]ᄮ+gm撷[rxZRyF\u9y%))Y'I$I$IҊ t拎#] Z}㩐LrrŗYK 6u/OK()$I$I$iu tJ)-:6W2 ja&BϾO-:@J$I$IU1ҵ5?b6_,Fv^&Y8~Ⱦ`D0|ndeVW(pd$I$I$I+)]#&y?/`m##Tɉ;$I$I$IZ!)]Z'O9:Rj!" FFtqf0l5iϗ XHI$I$IBRvYGO9:PڶemʼuO& jGwt>I$I$IV@J׮fSjI"mX658Z^q4GlkUR::"_}$I$I$IWc kN8<0/h-k/u 8ڽ5kѰq>ʼZ \$I$I$Hi%GOha۲.pX Ձz4l-MijPWTxI$I$I"RZ$;A-[klqC* 8kF7 [/?#dQ(G$I$I$I+b ;8ih ͍7NyVjWv3Z6?Xꢣ{GwtLul$I$I$I+a 98I$I$IV@J+spxݢP3Zgw5T.K'YدqSkl֢f~P*"$?C$I$I$i 2}CꐮL%_+l4}CjAeqkB\Ӈ?$I$I$IZ) O/d&cv7|iPtl7-[0eEMfM$I$I0ʔR9(%Gܿ`pȾy&Kq-aV;` [^ IDAT/<[ h$I$I$麹CJ+5-x٢x<]a|ff2gWnZ6}"SHon:O$I$IU0J{GLgsR dgk<<5Ӭ,^j Fg[$I$I$I+` LO1_, GܽÖz.JZ[P!5n 5 ֗#h77hF#L$I$I0Ms?9d63wwxDf@Б“x.:o##Q_m`L Ò$I$I$i rGOM@jĽ;΂g_ OJʑ}̀6╡2u@J$I$I0ʕi-ܻJ TǓZ. w2bYj4)I$I$IV@J+WkxɌ̤iܿJ.)8cGMM˝vNַf4&%I$I$I Hij&p|2J4768g^eiYk"U b<@J$I$IU0e&pt4J;;lomА$<-_Hk;G%U R_$#@J$I$I0՚atFژ{wwE)i<*{hH5C4j^Wf8 Z:H$I$I ވtCOhxȽܾEI-<. ˁTzm8 D$I$I$IZ^oDMxcڶa8p6nopX K4_?MK7Hi~$I$I$ZH?b&j]ڶx帾=\n;2 $I$I$IZ)1{<;f-ܻE6|9Rm{Z㣈뾢$I$I$IZ2ē'tnorO9G\hpN4\X>rd$I$I$I` 7foGOJdcm-w6,. Z`MKGmwY*J$I$I$ >Zh&w,8@jipA*HI$I$I Rzc<;"2 `tggi:[MC+אIڐ$I$I$i% FLFmK>丽w!?3<7m+ $I$I$iE FNOɄ&Z(ˉԈoAYEbd-p%I$I$IRzN&3~#3iG?`4x!3\N; XA\@@V'I$I$IJH:>G3ɚ vlk9OqbHdWjCJ$I$IU0u2'8>QJe0l]ó;53Z{$:0$I$I$i% F >{ǓCöeksw߹ЇNC7RV6L/,PBVGI$I$I Rz'|Ǔwac}|vSx XBhA!%I$I$I*H鍛f|g4A66 h&#*$"g_R<I$I$IV@Joܢ+O? .k}C̀mZ&%- $I$I$IZ)q&g@̯Ԕ8 <I$I$IV@JoRAp#iږ\aGM]FK$I$I$IZ^oJMPgr<&6;C6wJD|}A@@_I$I$IVo&x;no4q 4t'S',Q:;m~cgoJcچ0$I$I$i%x]h4?x%#`olC5?k&k=!_~T#$I$I$IZ^W6?{|h?9dc){J&o0Z껤mmHI$I$I" l8ly-omCwHჵmg/N`oGW ̬˧ngŠtoONd+ˣ4=eӡR^<-&3M& e)|g/NU׍fݿw>۴$) =ҋzBr}\@T{YDWk%y0Ta0p>'׋S-VkFS/%3), Z?>t}vYɲ 4=~pKٸII*䙊]R`RZE=eYҦtʲ(_?׳/]^Uh Km uؾnI27XtPC >HჹJZE=yk&>A4:~+GsɂBi->- c^? +=e3p>KZWJELArIPzr??{,䭫=v6_Iyݙ,FHჹZU(ĠHӝmm3d_?_=7<%ӡ4X7I"Wqٔ'Rp.UZUH. wT^m9SsTT$ˣ[SMJIr7aK;\}B /#sVJuH"T@J6̔V|vQI%_S6J?u@]z3%wxї+{@ ]ZUꦕ$y :&yVZ.Xd=8TygP˿\8h'@ Hu垔wwTd(n.6 )v[){c ?=P6akGP >JZFU*F)3IbdэS1Ag6/7$, R"?R(jTU,Hw{앉}/M1 _'hQU72I!GF7ؒ2IrWIRjdSrQb8uWb)bCjG @ :4{~/OjRJQ W7V>Bw,l3OQi%47ѐ\RZ}y$Yb ҳX ,B0QƏkUu#)Ġ 5zTRUKMB'n_rI6^e!@ohHu%%e!t#߇˕VM]n%7IVZ7];S2(zF ԍi8(4使o\HzNfUZJU#_jAL1g|V7U\2u 4Lf&섲F\:̔vU]՛۾<1Ȳ( 4>ZU7F)%%we 嗛Q2S6hmEHuސjkZwHE,a#)|nUUR*^ۤXD h[Rޤ&ul-_W2k )Yb@oѪQUu )wWQd*~wHYגr8jOb?35JRB*.VB[ l>Z]7Z׍E UH-Q. A&? :lx=zB`d7@ [+T)eIq2`3B>uTsrHg1(d l>Z4ȾR޺3M|6nL.EImRsRsx3te$=#Gn+,r 5̬kIˢi١F_ܑeARҒukㅚz<&@ѪQUr"WY [监tmݱ_R'Jל.U]e!\J,fHC Hᣥ䪪VmǠ"v/+3m&O.im~pKtԴ[T~~vY汯%)DYs@ R7geQyOȓK.AT彽.r]4$%ㅔo\rIG}@ 4ԅ>1FEM&o, {g#Uzxtyvs! µ4MպeRe능M\@ipoOȺjs_3,Z=:R;__nFnd_!@p-uj]rI!UR${@RwyB7IճSU.+}V~񄛋?iH;)\KS7ZjI]C)˂<ɶ:&eRO4])Fy.)RUksUu+ /wRȢBs@ 4]CJ.Remebgޞ&?D+:%^ƺ/ vOA3Ot~boRmk\fRe~ywGvBuAF_{,Jrɻd}ۤhϟ*Ս d.)MR2vH;>ǵ4mz]IJ1FwBIQ&?}M{Y jVsy/}'xh Rd}!kiۤ庖,(Ϻ}hHIpL뻣$Yi^imD kiVUk EEvRf| ;nLuJZjnJn,(C HZ救}fbTg R&"vlgԴ//]RZ٥׾;Q,#oR6%ֵ]LYTl |g?Pyk&QޤUwdq7٩e(Ze\&W2)zG kiۤuUM](;>9],;3d\+vGI)i u# ︬M2F *C HZ6ijR1(/r}t"y\jZcxGʂ͸Rਖ਼ujbw2Ⱦ #wR}m*%WAeɥᧇ.tiESjZijΖ%mWbľe! µ6*)]!(àp~ \˻]ɵ5l=Y jΖ:o~|,[2z I!FYN @4ҶVJm )&I2hû*nMQf5':_]7=_dY>zGC Ҧe (kH˓+䙦iM]Lۓ$Y՜XަRf.7WLeY"Oq-m>WAe2 &yJBёPEޔ Y@4ҦպVJ$W>42ۤ8,4PR򺽈\Li'#yJ>nE)d+@4ҶIպRJI?yryJwGSeaw{N g#}.}WG?B 1ʂq@ ҶIUu]1yT yv~BIaԦ% ܵc-T٪ t~wL&b&eQ CgRպVӶJBPY H6)k[?̺QRC"Ju<ɉ\f3. /Y|kFV&TsI~zWwGmfE];WZ}\|-}H;_yeY>n-ժRW' IDAT.zebi>퍺df6:ZhDi]\$QA.)F kkۤR$e1,]*jm;}jJu㹼ieM 1B! µ5mrVv ߷\M $dRLiYi 56͟enTwM)Ыm[-kMS<ϠLqXjkUORzBYנzu7Tsu;Ivqᒔe Y& R-%FL`=R"Sq{'&AnU8Jm1n/İ>F ksw-Wk5mRA1e^{¨;*,t^|Ă]U=9Qg4> W2I!Y?xp|ksw-V6))M {c<2Lի9^hXٲ&!bܥrHSA[d1M'03hsyn2+r~,R(nZ+m+.*B!=LF;[ &LnRiKtObppmj!#|rd(^k;udjV] w>><2I!d7@ ׷WUܥe@O臟ZP]"(^zr폚O`B 7@ Zת.bPT>;TӦc/G<|ىԴ>zTw՛Be8<n]ZlR+kH/`wكߛmSאn>iKOT-tQR7";!R6#Bv4?'wUR:oH?_ekGէK-~򸾏uA \>ǵj3i8,<ɏ> 0zBP[hXi]_{ l+ލOqmrU'ɤѠP]}yvjV'۰.+~t!% X&S Y7%:>w-W+Uug8,pOpXi^ (d>Rmc, `7%VUJ]si8(]1o4Oho, Jmz-c2uRݪzv/ʛ$m$s]*C '؊ijM#3pP*"ڙ /i<*ezԜzxcei M)(n "rjLa_d/>"7AY4Os5$Ydsp)lbb%3d<Ҡ|=ڛ[ fJ=Mݵ|x寞۴Q$RSRؚ|r&ʢnt$S"MԮjyգ#"!u%oZ @ /@* pp9ڝMtfӱ$)}wK ]y1_)W.-LRJu͡p5e岒S̢Fؾۇ3ݻ{]TARs|s Ha˵?;RX{Z몖Rd̔֍U%OIv~{|BC @ Z*=zrj4ڝ5ժR]]jVZyiw:Tj5M{Ⱦj4Y/TTzDщ<%HaV?=rU)XgmզU{,׋&r\s5G BZ!f;#:K (i?$.7Hyer'Z=|D @U)N::i[L}+3SJ;a` //ZyUsx@ [X鑖JPw+ϢB0`g$?C辮ֶ. RוV_TH)l]U5zHR@h<,reY .GM.)DSAiI$_57j+Ha6ck TX2z% AK5ZzH=!֥ٱNK;яDh8(&}w;,)}JjZGOU??Rb %w=yzӅ&~?J?B)d ˢjd&SRHճJ%@2~ض?}Ӆհ,~*,(Of]C*dQ]dwh_7+>Ts6W6rl )l]Jg/NurT]tp0dR}D @ЋMz~tB0mRJ.w납)SȺɯ,QK'H)љOvԻ2)+2&ITwcVH7'g -B7LK;uVəS5H7K,oKvH껭d/jNԞ*V[F ޜ-t|2Wjۋ6BP3"w%R.7#9H7gOj.w2u 2f9L/88@ 99LmJ2f.Y BeS.\殴X=;2)fXlzӐzD*Ġ8*$r7LiRsJ H7Mj>_k;FKEeR/MWdߟm^S&|Vs2)jtz\ o %nd߸TR~i]Y84@ Z+-%IeyT3by K/42)j5_]wvlHy{5`ZZһR~>oP(B$IV HWMjZz>d2"SJ0)phlzմIU%^TB,F)H6o7D.eЧMZn߻I̕,nHIrIqpC`hHW)%Uum] A,MJY.7MyWrܕ͔84@ JU׭RJ|HBߐRΎ]шC`+wWӴJYprLPa_xm9`!ݩ=ѐC`ЫڶrY7m)dR3T==e{Ƨ蕻Զ˔#OruQ6* WnaSqx|(#@CM˧#A!{}oR+Sy玲@hH_MQ8*}7Z{L8/z@ ^Lf"y}B+ {HI"ul2ze&dflSMu'KȔ ҖHm:R]lP*S 80z@ ^b'_QoҕLqӐ BiH$0*G,r`@ 23,ʂ)ll>S>*6W&2Be}x{YH\uvTR@lSֶu- H ,],iH){mvHJOJ)ɂIBt{i[6I/Ԝ-ú){Ser|'ώU|<* 펺ے&QszvUq`RUAYjVR%ֵT\-x2S*wތ^&K.JАRUAyܕkjUu+^X*&<䒛oj~d1ʌ } Bb!\umUU]fқyr"Syw˯DmvQ٦]TB+nl+IMZZ,Vjۤ.ˊL ̷G$Řip}lÁ)dˑ\RUӼ}LB &峡BiT6jT~rWu|^IP&)%WU:/4[R$mbo,+Mz?#L&wU; ,(E@Muj1ߌ)|,q|Pҫ )Kmr{G?B7\Z.+5M+{ n_+QD٨Pe[gR4?g\=Sx=u)Dk4BxdʻP8*[w)wW0S&n0 ѐBܽg,bא:TՍd֖K P ݨ=I2{ GvuO_~!3!UHILygKU]XlPd{+UPJ=н?os@)*yRZ ʋ\yϗ֕<ޚHmeB~ب0J]}o(N8 nzնI2Ie,rNϖZwK&ǃ.zL2ٌ*?{#3B ^5MuU*\eYHOZkerLXl$+i֦T%sl3m;/Tq0 )i[UuAYh NZ,rwٛ&))7;vIrd=Fwq(ܰd.wW9(4ӹNZ󷮑•F*w$ Ԧuk5u?z?*@;@C PRY b/Nu:_) }/@X$QEQ;wtH?%zs?_C]"θ ڶg::>S[䊃BH@^fL_4SNuGLw{Лůio6kP]|zH!fː]ȔFw'2n|" ptOv~Лۇ{{_!ft2hGW>Ͽ~6޶G]Ge;#cyR^Eb9P_׃o!=@ ެZUUoO,N'y?˯ىܥ^OL&oP8*Tޚ)}J*L?G_7|bui$uSb ڛczU_?/~D.W*@2\LR}LC?6ͥ0)FGfcMtt2ףG WB5U,MXf:Dt)&fQY.4 ;tA),wGʦCY7AVP}K?S~|H7Eu\mX:ܟ^]m۪;!e1(؛({wsM~dy)f8(T|M,tpW1v^JIuݜET.SO˼kHM"B/Lx4pPS$6,sݹ<.nWEhg!%)Q!Q毫bdo<+ Ht)53Yƥ c, .Cui4ᮆRͪV}t&Mtu%ム cp-Y=E f:dTʂ.FI]4skWaDRb-If&42wlw*? ->/tpd(NP߽hVZ3u#7_)w<;f W4u!n4yr3ݽd3I|ٙҺ7l3LfΞsOt1Rغ,ukW"Wjҥ}0t$Ԯj(*9͓*v4H; 9)l]Y}8SYjˁe;#h M#5'MJ{wA8=G t7SJr u>o0(tx0lwi㹼uI&m$ugAUo6p+xNa*ϣv4 cPݴAQ`oX|g*k"RRM]-SZZ/Oӟ|{vw5 y.OU??= P&)lՠ,txЍtdfݿ.DfvwgOdם^Xrz ҌIhdcd Ӄ8$F8LDR"1nV{UVn˽GKU.^0#)˪Jw/sN/v5sMRe+̔ۤS -[ )*ai IDAT7G?U[J 0x5<:um}E7n+'JZhuѱO۬Mjܻevk6I?/\2-(`5y}MQ쥤(g׵UݺG/MC`r3eF7oh|󆬸@jbcMTԵj(  Fe>d:y]˺y}M,~ yӑFVT/kh3R\]Q4&SLx @  ,I:]$yv-/um}YKKY45/vU?z[IKYD{7uWq:Eit}C4U-XY` RԨ,<RUQkK"3SWyv:c] _)._u X]VPm*UwW( ,dfufsOpʽ0I쒁TۚGzG߸b} %HaPuݨiZyvvgZZ+|eeTPDLf;3:I% 03ɊBf> kk*n^WvWk=7;by HaP;vv*o'IZ_[V]ݼbu0*d!SV5JZs7s74Q,y#,u,VU\P뮑o-h{~0*y\30ݙ?w}Ot5Vz. 8+,"ȳ+Iiܷ;ɂɕrURqiںl2Ru |P;Bx\bkW"* w'{9\f@QT-{Z{UH.y$.R.fHKnRNRn.uo Hx@8 exTjueթ62;07Iir@[+O{IRJ.uq:ݷ3* %. ) f<.5d&@Eu%R+\J^pg'yN!%Iq:wH0*7dsVM&]Li |)%Sײ/7h$HkVf*).@  GQYײo~S5Jr|˭{'˒~v')WL %I+woS\g'#`FeTYs7@GU])R8}>NL]y]qyIiZʙ Ha0eY( uN R6K!5K{]JC6wKVH&]϶wW"0*x,9TUI&yl;O*YYcshoy\gjoE CLrz{V/mRKd7Sϟ)m~Q.@ ->ZueN BP|GՓRr'OY(R!L %ܔUbhn) 윳ɥ,igRbO͓m媑Lꤳ{JΖ7$յ~rUh ) o׷EM6SګApNRLϟo] vڏQIWH$76ݫ}\\jyT)3M}[!j_  LQ.̔մIu*cnURtNw.,rI}%kZo+,-ivv6s  "j<u#N̔nZUuT$yW4+U=@ _t|yĥVmTmhת?-HaPe5vi5/yQj}۸/e).!dޓmJGOɯ 0"U"%U׭f{UPN;~W{eɲKdok| 7]m a ) ,FE!<ʔs֬;:)rw)ɭ2<,y<3<_e$64}o(oh?U)F ,c8ޡ}MJ)kwVik{fǞSMN8}_]5T #-[7Vv>L@Zy@ )(vqɳKgRʥ8hWyɃ RLY*U&OٕJ&w=jRa2{ߺmcyJ<|NA EPQ3~IS-ev!ߑ𡔙it놦→ocap) ( e PY)gIf:yM_:>4&j?Y@ )nԢR6 N|ZsF9ufZ=Q>R8RLY*̈́:)aT۶M&ɬ:Kj%%i=7U{VWzO>ep ) ,z:MYM*'¦£y̤}N>ί^')G۟j?fp ) * LjڤnzgMif}YI6-4o2F7i]ׯu׃Gw?}B%RL_!&5unc*)&+cL}QTr+y~;~oޕKf y,!`"( _`TխfU|f` Ep/.9@jt&몲$~cHa0EQ(ƸXU9pHaf1(D[dgɵ7Um,ّ׏TK'#YYݫo~wY}}j4mFnhQqB.fwf}~\yR_mSҬU7͡CȤ0)E)&.y+tTie}\yR-V%ɕRRUժ.:|H>#Y W:'eo9R-Z>C|W[o(k{tI|HX+@ rfH5MRx)o7UDQ) -PkIZBǝi;*äd*_trf,)  Mn4t;deTGYGAI  Hk+Z}M{)P)KfJiϔ\aRgWNYyJ 3)笺n4͉\.3ʮBl}]uU+SD[z~+J {{J{,E -MYUݨi NgPFq) R}TvIݷ]f?j.j~N 0.+\]TӴjtR$Yƅ,ک$Y^[ZUܸ!3+}63j=g,) ĕrRJE)SWQUG2,FY` >٥܇]V:?3=~[*&w0jܶ}񍪯Qn J" ܥIJ|:ȓ&nXڲRgR}u + )Uh`[׭Jkb}Uk-ءk/B,D mꪝN~L&e; AKi<} & ? ޟ-0j;eCWH&) }qQ.]k˺qmU1FI}ҡf9yfI[f[ʍcZ',D Tun`ZYj}mY1 M ]Ǹk!hRK@۷^@,S}5HW3uUH&cp)u-YbYQ{Oō:Rf{OՃjY(+@ FU(,4* Ge?}6VTL:-棜^O߾uemKu3$SꇏX(+@ .pv>w)]K9+ەcYR %L޼֭.:^]r3 M?`) fVתVf-+ A!;Y0nvkW޶RX&IYInHXu+I*d/T?d!`vw+m̔s>߁'U/Iٕvkw\RS )I*76T^8{6/4{r0ݙwR$ csVJW~`T[5ʳ|.kX\[Uy^},TupUHa0T(Rd&mR۶JM}Qz/mϔ\NMRMHSk+cbe۪?Pk J!`E_!e:q6\۶ &W,`ry7Sd㱊W+4? 3)7O R@ 9\!S3`YhoR|̩RbP|rr۪~XN !pɬ:94^77UULvBRT<Q RV^OU?yr٫FgU͂\Ry2ff^9Ĉtbe61;|.OΎr۲hW+g?LJ)j5M# :>_ʮPFK"vQ!dJZ}'j?BBnX4+@ 9+tj5|^TYuӪiӫpN}˾Bq(ZpYW!j f_}G+=}.SW1ef2{u%$Wޛ)5p%0Rz'su6) :GX#Y0+Uru- RֶOj|^~>׏f )@ ϐ:7+,4e8.0s]KaG/]eTGiyߞ?4Y4+}LrWreQyd+ l^^AVDYYt9) AY<| ȶCPLnA~rv庑Ģ\ RN_4wnԡQQuZ˳lԹV1|oV%a.ז5}C:L%o[y۲fW[Lum@ pl>Xݲrowv(54Ս2)rUHf`~fdo(߹ϬFi0.pMdH.) 1}ɕ*5wPkJ󚆬Frާ)=~_ff&Q]3ۿh3L 2 ~xTj<*ʤӘ3vݿר\7pVnS7_r)&)V=Mn>!ߗTW 3G:^7CPvzfWz)m~Rn[>CYvLV]c?\7]ԡ*SB peвNƚNFL/`ETA' )ݝS>x.Wn[ys@jl5723I>kx$++)S*2`#M&cuR2+eTNfB`CQ 0r7| >B{)~lTW%ŲPby*J[w L٭ G@ Y5F. *bTÉ!Be"z\{׭nsV/ G=Cގrt[.ѝ[ ++?͐"O0.T\Xm_rYN)I ieY@O)L}h"hهK3&㑊xB$EDCǺ+.2«3ۥڪVnKUHyJjwga&&m*׎82,FYA 8UH؅GG], !40.ULmu%R)Ku\W/ԾV[,ݼ~O&ɤ5B"Kp%H̤QY*Ƴʂ(2v^ե8*&e??xFӾf+ԵjyxTB 妖e&ewbe;8H!tQܢ,C*# 2*:_fAuR̐بP3$)gysVU6]]j77 b7 L/?ĠPHj ¥LE-I.ʪS0몣bP>vk[3MRJ9~߈L}E9;ZڽTb(b7j yۦUnZIRy{}igWKyUߟ)NJ8륅 bkgf]>fHa!*땭h]U5/rIյɓm#Mm} d,s%ťIw}g\P1Fa?, 2łB w;<L.e+ו<;nWK>Z\*L& gT:Y,l,dF Ar2y7jN{'2 )Dk;wr-M#sTv?L٦]޵'TL'KdeSmoH\RYٌbgH]¼n|-f_}_|\vвOAqeYqisX BwabhpEHasWEtdI^ \]Beօ6f:_"e'[IRj|->BxLV+./-!yX&s j)\9}Bg圏ˬ#e$򮍠˥6ɛf{[;D l;*:BQ޷!$ \R(9Q!'3yUud]Awɮj|b' &ʮ=ѪpPAgQ&}TwܑL A92y5۴p>OI/~},T sKK~KkݪB9BO&bpi5[}͕)R?=ݾ, ӉlTvQTʢs*!Ԧ|}&)ʏj!^pԡr),IөǴ*=z"3bTj;ZD3H͖Ku6Kd AR$QTRT.U*7Gxb_aO\O<\T%YDb#hH dkow| d| q ^"{cZ iD .-kW6uOB꬏co ܞ9)Mgz?A1h0=:a< }zYT|ZHB4Mm?S]mJʫ@QfvR+rϫ>&yhcj0kySwni[+wd1>߃RVi7R)\U۶ϔ#yjۤ6Q2 vR9r^mD#PuCLy٪Ϻ*.3S0_?}7vAKe,I9+W23@ UU>~T>*sߐ}fSwlrd&)ʔmoֿ纝b< 2C.LU5n9wUU錙N/̺l=}M҉@j:wQCeҝ?S}[*67QdR )g.̢nT5-rvm7Ĉeu?O~+ Ե paUie1ʺv}9gmVY&{"IJxv}9R}=}EVLuw??e챇|[;m;^bkSFH)/*f>paZu(HRJJ9LfAf{lyw_hO`*}}әfS\z# nz)77$|!|6H,ZE #զ}/*wQj)3ѣo\ '"/S7]~zw~Kqق3nR˕sMxKwBfvbb9UIRw.l}- n$3 THfr2* 欜]?_?EwM5?JW.0)no]öMeIyPZH>paZYΨZo?~et]t] Ze_moipUkj|&H,Zyʨ]mJJ)=I`:.'y(_tWThW{誸Ob<૯kFzqoufR )\Ţl^+Q6~|^nZA>r1K*P+XU@ɺR'B1෿/O^翫bkm ^~Yl2+6 3@ f:4-=+N&C%od*^kwğ,-#KUƅOycG^r(lgB` pQJ\mL)%]J'?gw&K޲:TXbzo߼0J`ܺ-f̑|6HB拺CYMGkk`pfG> byTv)Sj"Չ1I!Fm|[z7RקyS/~A+M'JS@ jhu4BXSA)v4;*ƧlAnyS>t&";g>qkC|IVDLyN`HB-ZG̥kbZJY 1 plW=-,2B)d݄KZ˧k6kWd}h_b4%?)\ux4ό:!żֽwR>RJ=%ܟ╗{T7~yhͯE)%|вiRHLRi9щy|/s!:][OtPq44+ BMX{RPuh6'sI!e|>xdsLLN%_.%;;o~H孛Rj4G 4jtfTH=C{`݇{׵Ogt_7U敯QNIڽEŦ=fHBMÙ&=1,(A,ة}WRǙ-[vok/]я~wV4G.TӴ:8iZTk>W4[! Vҹ=dTOo7voiW6E IDAT?{mXik )\/B!h0(?BJAz'\bqkC;7T޺y2yg:_rrInN k}py\m v]1Fji,~yBnvR_?lk[8]횼 -zW!Kgr5WN)ik@ nZLUB<ܥFRE+d1m.ʰ㳻h_啮I%mUy.Q-`HUu:)Rr4 >EAs[UC39VLE>9+65 ^̻Vnf.\&]@ʥ"FGU˾P' ,FYs4~<@$[[rGō+_˷5|Ua`}MwBi6?W.-p4UnE{].P{;T޹Z7)7Ɍ9RF .NUUͩ׳,R-$3c{'.">Ue*oW\/od*-)\J ɻ,}فZ)5Tbdm]Xnh\V )"…w0l^l5d*x K!ARΣVᗙV]kG#ŭ &c 1)\kgև0.3RC)SySMQB ևHL]t*򜕯qVx,N̐5)\8wDB9jɽ a>*WP-d&+⠐ =wPw>C*,rJ$A*) )#…s&gAI)ex~}˾"ʆE?ɟ& ] u|g!BQ]VYi )z#¥hVGSMg YW!e}˾d)QqTvE縺+ĨPwO?I&Oh )Z#¥pgL VN1*S_kh\ 3@ h2t6ZVPE ]Tu%/gH hp VAѝC%RmN$c9'ZJʳrӰak )\LS圎g@KfΚ!%Y0"JܚyqT*^*%:Rn጖}F K3-tx4Sݷ[2I@E*qG=_dݹx1_Lf׷sZn'fb\l"¥iۤ\YBW94*BW>NlIMpm6j8@mRE K5/$+}îB RߟS ]T1fJI} f׶&]݃&yn*}D K5ε7"J̥AYt"¥2B8&)VzRu?wd%\Š0[-èx}[>(O5쓙yH.C{f,X7G,l羦dއ=1BHY-C 7N2.o[ylZ*X\&JeRz3럂Ɋ|zQ-F͡,YW)uMpZ3)m&-*pڶt6 b E<] LVFA) dr{w"(Rݏ]ߖ@qsP̺ L XORTUjo|5zƦٻ9RT k߳^к1Tˌˊb<]֢Tno>ъ0HRJ`MHRUu#m+WW. -/.PycC] u9RRwx(Ơkh&׷-wnc\/43 _vRTuhoHuHҪ]>wK_ !H )g;<ȆM[7v4x5KsRJ XKRTujw–]/~I660*5xyG.KR\f]۾k*ohTlnm>=E`=HRUu꺕Bz[ss[jpg . `(x3(4|e>B,Vs\&G.UJIGJ)ɳk8(]8ʛ[R%uL!]/o׿XA&=(lZ"¥kvsb0]E_(QΆ77%/O"n!P{%w>'rݰqk@ =;R]x,*om)QH YIR]ͣ=}_0k׿>3II{ht?P8A KU#5OUbT5VϙrFҬV]twUpmmLW^W~EEI&Sk}TUl ¥z{ljg.0( ōͱ,m>zޟmR;9Ifj5{Z@[5_{MlU r 6`mHy\Td&ɂܤ8,GeVwz$ۤ4SV0)M5}]妽5_ J0֕*ӲFpg=;dPιkxU-OYVr%߮R۬v/JwqH__ZJ&98d.w0tV)g?.2S[ջE%Iŷi9ʕViZIٻ~J{w\ W훫]L>RӶp]BGU#|C2) nmɊ\Q/ֵˋZ%%^Uꇏq$6uE wԬɄX RuplN)+Km}5}[|]aXJ)wa 03唕rm$YޞyNiW:sj>S)(X\:u̺@* ;Z 酙mV[&ܤ4_i:Uҍk[wQj}GIf\*pe!jْ=ۤ8hpkKΆRϽ*rJ=0C 6pefJBɳN?u+]}/V%"(QluM=:RpO( _}Yy8P v6W4@ +3Wu8$Mi(.ꃩssBP(.:q*7=<5Tyl8R.*-u|HTURjMfL`fw"T筒1J1:WC5׺&;*r]#X R2mZTuF'˖MU=8TntagDͣk]QX,%U8O=)\wW]ϻLyJTiZ sO2S׭n|QR:pUU5}G% \7jj'οMnNJkܪ4?ERE ZյrE #•jۤij,yU=sSni4O=)\f5MBMєZu+7H Ӥefr3&iqO}sb.S/N"ڞBQl[yNlTײoBVj )ow6p'=Rkg'.ݧSU))R׷(fBXUIMppRJjڮ ɑNnSnGGjM+{9R mLjj'SGRNuTV;HY !d>ϙ )Z •jsV YL AÙw絬x- ivFf2{e_s d!HNt"hӌ@ Wʳ+e5LGj]P󬛹,V7i̤VWy<1iN&[ NߝȢk@ W]gWۤ/ޛȳwIYw:@{S>ծoU%݄$Snڣ<] )=Vp\'=|ú)yW4`WJZW9=G*Q\GoQ^4ص[ߝ FPR:-K p]Ÿ>d1>`moYe&Ij[!s9 O;)\3G#K^|(mPɤ`jg:{3痟YJyR;)eup>m7Y5?~bS2Iv5y㮚݉*(?>;S0)gM޼?UHVvx'MJt撢58#Z-KŨ`uu͒Z΄d4t?]yvY8'KIi:ޖ}UZ2X!Ÿӊ@ W)+5P'~GZ4m&oU{8S8pwږmg/L1*kvJ=u.Ҳm]>n[gET7:]}OJ2BPUu_CyN{"Y^U򶹾E.oZyJ'eEMݸRf )PDzdk͵o([C^-Sb9iJzu~_{@*WrS_ۚx6,3\r,MԣB WL RF9Y4Y-k~o bPnv-S'BOٕZnoQr7Sǹ%+J@ G +eF]eӉ L,R<)/5ջGrgVה=+IRʮTWmeX0(d)vS A~֛ٻן+Yɢg}?.ojYjr($W׮OeE)+ #ncq2qWH%u-)fI)4r5ʫZ]ݘQA0izRR1E죗c.q]P?vP{48yj\ )oZ6:Uqw妕RZ, JM#•1,HvsL]ԩv}h٧M멎RRS@aD #•1(c7鱖}T)\R9}̳́:]$i9+/JM^ݔQ5A +CPEP޵@ʬKܥu_X<w妑ROٕ yVYdxĆ)\ME%٩]r[d˖}m7B%)s~c/{V*)\-T$ )\cH=VjwVIR0㞙h0<[0q׍<5rnM*c!`=HJEpPxԒw3Ox: 3ws7>74mLr-t:!x$ōR@ +cf} 5XaS_}Ӻ1 ux[:9DJm~\Rv٠P=V3,q30RlvTղe07cMX R2EUbgHR um:] }4̕S~quUIu߻f=+W챖}akC}5A +S]uNT3uV dd۲f&Iy^+ͫG%>Tsp TvBr_~6Wd`mH BAQ1Bf)+WcUP/Jʋ]&ݕUln0C 6peeѠ=}(')I2yJu\r윉TYitMɕoH]Rm]OLR*6R@ +3 f]t"|rq(uN9 IDATd1Be͎gH sHLLͽZK]Yi>Y̨=cY(nnҲ6peRѰꓦH)RLVD)FI.3 ڼ<Ρz'%?wxArUiZ=ytZNkYQTB &peFRrꓨec]dS7\BT(,ڲr*-Zy~)T}P~f֠=<҃|W]BFy)Fl • J .xꭢ$3)?g"BWQ^ԧ2,;eL_B_4T}M~F| |{ۊ)\pPʟ@%AaX( UҬg rwIÇ:OR֠aղϤ 7nhX#R2@a)q ʨ8,ee\fɢ+o¥籜#咢L:{¿Uw#HqcC<%y( eɆ )\@Bdp}˾qn RaXʊ}ޥvZ=?w4.t-~WL/R?cEbg[F X#R2Pe˾U]>3Y t:dR1( \R[53Rjgw/>R[JWBQ( 6 `mHJ1j<j8=GN}M&7@JfJZTcO=t{->{kP}wijk}eC͐*"6p5-.?ӢV{0SVR8.°Ir{SyV?J4} ]{jt_HZ!¥33mo52̕T% RqkPDym:5W꣇:h[MB\ܽ/+_~'0H1ôLh͐e`HҙI[[J=^rJjrN]fR*6Z39dj߿tBIf*o|lmL!>+ *w ¥*F]Y7ɽ \M, S& Aq4P5AsW9ޥYvzrUO5{sK2 nz EXa!¥36 ߑgWj򢯐z,`صS跪k*V}_=->|rjxxͶQ\ײPasK")\&+"D>{6)ͻR:Q!"tɭrS.E]0k ouܶjC[[Ox~5JacCcO?~KWQ[*C$IٕVj9!%RY+ﮑe?yC<|sxӪ?T77OWi[emUnoak@ ,KmoUũ@J&y yue,@H̥VRu?ޟGGg:SR{t$6ǧޫ}OPL]g@ n0(5VYFm̔VLn`YRRf&wumB0GoO-csRNUGѩ4CCŭMVp2j{kCe|ص/Us+KT?c]M[] 5H.UYDmm52|2Ez{)+3ZYzG-oAǕR}{h3FRiP4*PqL X?RTeYhg{CEQH2y_!U޿P[;w1:(ZlձVUKWݕ$ 课gpz98T:G$UT)\Pٷݳ>DJ9~sl^L SyK`R 9 ,&?~C<FC7OTHjS|9S)\,g~,˲;9TeUwWfw(&) "!AC/d7m l ,4I5լ!++t{{#"3+3"2{g/Z,#$3c>w?ݿO0;ϻ̰65Y%wb ֿLx)v.Mi2%/g7b0^h'"""""""""".HkUQ߲c震8:v<Ӯ.3zz=e3#=|ƒq<"Tg-|/ڮeł8 DDDDDDDDDDd(׻,0}۽eT7-yMZBqCOh6S{v|70:6( JFDDDDDDDDDD֎)ymFÊoԗ7L FJyU4-)%QS׾)?sP79/~̡y>g{x\fsh-`EA8WI&"""""""""".Hk))s~獾BM~b}n}.?7亾pl{|DL.4hbQ""""""""""Hko}yw|˴˙ܴxZRuie$9J4SNO9?[MC3{ǴgXM{TXQDDDDDDDDDD֓\^Ѱje8"';?w}>{t3 [ޫ0{#|Σ}UnV"""""""""""kL6{loiڴ긷sf0Z9\˾|Vƙ~L}O>1{G_2IOxb)YO 䵨-6̊ryqmArre s'aR8?S98dޏ`3ԏtϠmϞݣzQ %7 6#v6+\8,5m^{B]-y5Csp ǿOxBstBͺy>SȺ( ܽֈb~żQ[zwr`Xw38=?ew? RS94o=?C*឴yDDDDDDDDDDd-)q.ۛcb*'زSxo3aKx` >dd|2Awl9u7 VD""""""""""VHɍ{{*&ăLg Ƅt'wR[ض.8Plmt6-nVV R""""""""""fHɍ{{h[tL 6>rYշsWIgUHL0 &.iԵsw@Jn\YaE{nN#gtƇ= ӫy'gd)C4١@n9esojm Y;A@npX֛ +R_lix13.gg8LUt3bYRlaEѵ0l~cyQ@""""""""""vHɍeQYT#>i$"*[՗^_﹯"kAouOrorw;Mےަł@JDDDDDDDDDD֐Zɍ+ec4$MfH#6|1 +sU&WHk=@͔[[{(o[l7 ƃ,KHVX跪wanU"#_͎oZwwWO]ԲM T%9%H:- ]_ӐfR%""""""""""yR %7jg{{o)3-%CXQEYUycxX?~jkopuQ}ułӿa6#4jQ>TDnm tj#?z/|U$T%nt휾B*LxAQ{{l~߼!Θ'GxX7\2'4'}sY7d5@Jn&wo0V)ޅ@ftÏɣ͏r8(^Nnr_d//sf ?&wRn5*Hn03G_T;;L/8ʁ4\IDDDDDDDDDD֎)1om]"RKv'spt/b#qXGe)yWM,aWl8N}18(w74~oź֝r~K)Y+r]f3VIȚ )1s{'9!t[O8<S,Цtv =_( " U4iOx-GO-yM!9qTQB- """""""""">J'x: iZ'ZF]Hs)އ[}+sз9bgK1 S>Y# lqwgB'3c>y|pBtA9Bv:=s< o3iqx@^<^s"ς DDDDDDDDDDd(W{)3ìtƃOP!efCbU+EC5 |] A%""""""""""kE\[QDnm9 -̌6%I)]i1 TŅ<92SdzdO1;$pU7BX uD}-EDDDDDDDDDdovw6pPST)O.?CK(ƃe&wU;pzpgیg'8(2,'9!66Rrm[ܾCY}dt:e䣏sQޏBʪx6 zrsݿ}o5u ݉-BU`E=KhD DDDDDDDDDDd(kE骔׻w?Қf`E$b>sfĝ v~ᕪ̬k`b }Ҁbkέ""""""""""")Mw6.p dο^v}QEF韢'jk| +#fBY4 q{wHQ %׶&)U.yL_9 l.9C~-m|+Mzz*"Gn> 2 ]@Jmo R>+c!Sq/j`EAJ,`#m~;l}I1fX»VIVFQ_}g:yw?f; DDDDDDDDDDd-)kM6F>230?{W[ԻȊH-6}d e,CJșaK4k.}2>3 IDATp' J[2)w?94غI~mm.Y; ̌ݝM7ǔe oB0RNw?dz6zaP@j%wh7f=?Mv~ e]tTVF1m,u3kg@0c0[\""""""""""H7M0nn1$eF놏Y͕ 1 "bE+QrrwwK^Ļ;<'Tf$w2G=3cK*;y^f}f V|b{KKDDDDDDDDDD֒)2 ƭMFÊM >yxtv}2vCfL]O`wG NG0sG/]xN(#7v N,H`ʁ?%o%""""""""""kK\Y [{[TU ̌3']BjN(#<Hyݐs8υO}WA9cIXtW!T{]2Ndz Q~>C6Mx%""""""""""kK\}[;TUI' FʙiH]Bj5C*RֽN'鄰S`S_gޞ2XYvwy&hxδsړYܯϽǜ6uG WUU9e̺L39~ ` UMOY<|B{|z0Bv}`[c16(pwҬ9L3 m,Y[ Ê1EqeߢINfNf,骆Mօ7yѓ+h!a0\E%fF{29fMW [Z9 >ZKDDDDDDDDDD֖)چ ƈѰ"H!GSzQ]>|˾ k2ǏX_m)c&nX ޹ϾCugfR0{!+tSK}xH{x`"""""""""""+ʂ  b0&9R`tS;3'O@,Q$7-هOhOX< ^k8d]CwhO,>"JJDDDDDDDDDD֔)(-gHfd6g2}YHfXqnTWE״ǧǤB0,qs@3 :xp1i`JV7,:sf(FSўλ^P?>9<@JaQx3sR$򼁜ytMK(7Ƅ"7X0 x~>'G&}r%fF=.3[,ׯ2¨8,pȀEKxx§̐j'O87[{PU"Rl 03) L>`j5"9:={fcwo3f +h@UAL;I ZfLuYF>>9)Y?j' pjW8xM%""""""""""kGRr ]:4iw%CUPl(6Kx?C*m纡98yvⓇow_ r{kakLiɋO,*w/*pnU@KDDDDDDDDDD֎*J .\Ù暁8(Iަ.iY| yOx/~}F|{?% UqkaXM`_FGͯ٦ɔ!3P %Wc |Y-g1&D[Eަ.Jy5)0{f?_gwx UI=&1(6MnTJ ,F7$M&ԏ@Π@JDDDDDDDDDDֈ),* h`4麕CZ&#ʹE7djylx/Gxq}PTw)ۄJaP1xM@{:yoZWSDDDDDDDDDDև[d<9aR9& d.;|˖}yu4iG?3l};=%T|Kn]oSW!k3C{ L 1gG')h&""""""""""kC}ʲ`{khнdt )sjb{ܵ*MreX淿+/ BQRmQnt/ o2f/670zf]?R)ӞLhO^|(KՠC&tXF"5m"MgT/S޽Ko]rrs@ܨܴ亅>x)3zޤ)^oLOiՆ@J.}Ux_!eE"3`ŀ*rӒuw.G7`qcr a L;ouϐzl; Id9unA;<>[R"""""""""">Hɥos{BeS mVAS0XNx\y)1y,:1vqw)iVoZN'Zw[ n"nnz߭)w03BHQ %V@QĮeݹ0&{9C YMEb@'O4ofYFu! q<)fyCywe?0Yy0mwnSBUV}զ}S kCUHZQ %v:1̞y=̼nHUİw,ԢZ*2DZ0^yY MhyV76f pgm= )Y/ Ҧlѵe>t}XDB gu-0?+r݈x@XtM>9b~k>+Uƈrom; Uq31I)XlnQI( 3%ϛFe yi XʂPXxqϾ.t3BQR9pqKf5))Y eT^ΐ^O)3׫RW߅FVXVnI{:g }ԅoI\R7[]xRy@JDDDDDDDDDDփ)2M𼌇E_'1ʂ8 Y 'k YCB6AO˙lN{:yi@foj+݇טRͭB-DDDDDDDDDDdmzre}l^s|2%_B*F!eF*/_hwsy6=y* N})Pcae*R)u^GTZwny x"""""""""" )f H)3/8:zT,#Í!<eSZ=!/jtx:{Os])Uv+ EIve h[ѶײI)椩)1{;[ ٬|̀* Ay=yvH=fxېSɴRriрhVx~NAU2V}sog/G@OV}4{#VF ִ@ҫOc͐ʋ4N\A6 q`vþ_0U %""""""""""kA\h4`48ǰW( *Ȱ*)h e`ś9j c8*XDtR#/y] ]{ .\X0՗aefWnlշʼiHә6|)K@W.]?T%aU~~#uM|~ c}U].*rhFIY7өn.޽{~ʫLʋ%G=h#<{t4g\0°Sx_ε y6s/4RRfh0,K,U,[ڧep b_i*(]{`e׺nPD̼[Ψ=98ʹ"q83BY ?S5ZWԶ Ϫ/6RRf0Te삟]Wqt}!1gg9C=W.qP0 n0*>xqk 8?b}Η<VUXU5[ ;}fWnۗvT!%""""""""""_p cPEPFR!Xp=+ݹYw~B8(mtU[9E,Ϯc IDAT r3c;'ꇏ;i+ ͟9}WH)y)3t f.:UIyJz -/RrfTUqHYv'"P1AJxJݵX ( + ,tq+s.Ŭ w/;t]W%sSDDDDDDDDDDgN,ɲν22+G@$D3ViAҴߠLh\ 0 A@3BY9{_ ӋѨ,"]vc?;"¥LRSRR"ef`ZD,'R!UGU".R5*ySw8CBUbuV>_v+!p~o(~+ӱvKHU҅~MUQ'_]iG#’JH|Z--L?*YwWJM?JrrB p{Ha)f?[t>ށfł_MJoG9Dj*L2dnzsĨ0hnf"ϕg3y:]%9wz>HW)E@ -mV wru0`گg'].Nd1^(IdMU~lRJpPz^RLu.[Ii?3}ON3_RYHn7),=O !(ՏQ0Svj{r>}:2Хh66\~g,F̀=Vuw>r'1/~O uӉ%7]ahjmU[YRz3ygB S5[LʬߓI@&)Q.ԦW iY6ƃ5zʪFC o+ԱTmVwJ?9BJ?}ԵevDL~vjuT*uWB@ rmK'^f4 46rgQPG:KUk;o*nmyV`2Cs~Tv),Ww}&3k 4(R!uTBrZәIPQ}(KThj)ܕ__R)7+_7RV?Ccp)4wJ]d2+_)gC1j8l4hs?JJR5~KK%mҬU7W:Zz/K!Dw6_$ј zRk2kv}URuRV%RcPTO[dU䳉$Ii22Ɔ00#bR`ټU.uImەPW=xTHYvRdhC5]>NK`4딺Nt4J9k?5#UꍑB3NxXd`2Sv`yi6oWZ/S]Erܥ`uOqP)M[]VEu&}ǿ]M>|"Ai2riw/~"3WQa8յ`;2yi=THn/),%笽3mldfjv@$+TUEau3,ig4,u{D~_~g{R&4#n2)9ld8[@ K{{7i )+R !,W/Qw4~6Pqc3[ygH[Ir+m (jWemn 559$}{zὕٕKzfP*aRqIn&a1t [@ K Rʺo[쬼aȯ0˥%RWG YU]G IV]WH; sKL)3K!Y9[@ K13UrZPZIRrԮdu- n/KK)+Lm4W!UŨw>Q&Ub2?*FIT$bT0C pHai)>|2fVY[`{{CKK)Rdro}l:|3)X*rV.4LWp 7wemnԶi&+ݱ3 MjRX+{!4u0^iѯg׶rm'} Z}UFV>F B:΂i2k`v5/ԥ,[=Rr]K uz>?7߸]Tv&)LR5 )\jQ!(IrZ"7HnaэT3+:y~Dڼo)4 ѐR: %&5u.m+N_rO[y}W<Z ¥LR]E*dR:*\HUvtΖoޢ*[$"#[.MM.gT(ϸ\wǺѨQ7;ݕ睼˒L~%M}nI՝m*kRIB)pn ,;+ƨyܕ;ڇ뺵Rfv"z}l3wjLΖ )zB 3SUW !rI1s[`zpGr4E f%ٹWWzR}Gx)\j1CQL_X0ݻPL~->xrҴ+}j{BPug0l PLʂ -ѹ$SH XR@*PM!-Llj4OdP~wqwS9\q]U_  ռYE`upIf.×(QLLևRy[]  )\d}73̂lo+|smNC<me^P_{]ͽrk+ӢoYU߹#p敒Kujx)\Τ`:j4gV 9VUEo|/](w)U[#U[#ŦM t?赿ߨڹsh]U=Z ¥3Bb!r+mmn0*Mo]{M&R],Ku1^h*~KwT86&4wviXRY߲o1HRιU:C]EmbnS]r*R7*,@y*O%2v|3\Q)I-U[[<ڨxXF]H$wR1FF1sYɢP)%K}u) Fg{eŏݮt;S)=z?3dzvXU>xMq( ¥Ji7>JbPS7 !(hT))]/ǕWPG&j3Yu4'f'¨kJ( < Lu]B諒\9BjՉSױXb1sY쨊+,.}q|Y]QVdWE35SG|hRZlZJݻŋzRLuSKdR3RJ9U&}˾\eUPK|T3(n5s[TQ8tB ɢB/!նcnQ]KRx52Mm+I&>VAWkP?[|^p) eT y._!]Yrtjِ3:wcyyg,]R@ 23Uu8CJgHu]dgnoC̔TB~@ IDATnfRhws?#IjPbW%Z :~:LJCX+RXP]RMm)|miw@]~R7bv5]1G5IRU>uҮR!ٹA.cPAf++yּ NڶӋjN1Y9&]+9:nYλ$yVtgoݕ&Jٹz)[ZN+e**d'mR:B*嬧4ks7jɬOn0KuTZuђh\3~O[LZ3e%z$:`HR@D}g7]Od2׍ֳZMk.+:.kާbV6_eMTLRYAtx+y<RC `xbTYm۞;C*G=]~33I1l˾`.)]wk\pK5[?:~ay'd:#:\'K))<Z!…LU !<ӹR)>^Wή`|:lHB2<%Yve7Po~] ^*4|:TQYXRP0Sy6ur?BϞӗAMX.,5:wIbbVRjCmU@q4T ;2]y!%*$ewN)OѧOŞ*fY0)]{>"S07nhg\y8ko+r8d<p .- Wή->>왪uz]hzRʭ-{hW40d꫽Ke`&)\|@T(3+s\նr~G'Ou2R/QVEygA7yN~K.j665xuYS쒠R)ѲVp! A (T9mK+>豺Zם%咬/dk-w8(/W&ɪxw[qstL~f u4 %Ӳ~p1SRf̐~qg_˽|g *H\ KG `ɵpX¨:e.ȹh3)K")\ȂfHy{ y郏KbX*}&YeⰖ OJ&)Եh(IVTI]s;Z.> fbP0;pvϐ'O_?@)gxSJ rɽ֒VzYUe. :`HBև,!1K.g/OټT6-H]dU(MTH+a]IɕtfHfQ.S!X+Rΐ*3])%)-ݽӗJ)["1BeuèQhJ" *r}Rޝ~7VRrWqɓs&)\|@RfV8eWvJ)/K'zGLf_";8:QlsL)k ]LrVO>{~jU { T*Z|HBf@ʤ]6-ծoa`?_}u%eHL*ȻtTtƺϞhK1\dz%KJ:ʳ+wiwe&s7j?VQm7HRB ȱ}t)jA˗>|)2.ioC|f Ur.Rђp/b<&| R &`}޸+L%J)W i6kWUdӠVj*:JɕWHLx;wN0FɬoXްUBȌ_Moq AUegܳ.W,MNg:̔HQ!\]0e_ıxe㑶hx=0سWVp+euPhZ .> fHI.^E4 =K}}ߊ%0h̐RI<# eU cP4u)\|@BPrW^U=}y)UM6^*J0*+.]uvv4| YSe;sEAT*٠a`޸P4S<̐ƚUQ!-Zyձ` u%)S>qQ{dgK.e?6C:f4 ٟ"…,R圵j"UUQww6;4 V}tP**$Og&5[[j0޵TjZuT<.> !񨧜r^(W7҃)}{Y$Y A%,o<FXkf윖}`PE`HB1WkAM]ꃟjɢ) R5JJTs?M{&X@,HK+EBxuԢBjM]GMrg/sdWL'B) A]Vw& vnuS_XΎD X3THB3:):BJfVR_tU'?c̐mRw)\~Uۗ{D~\rOy2IxzVN"LU<~LvIrϒ]g ky)[yWZ)uz{ǟ[GOKw֮憚w9tC T(s+!VRʚNgJy1j\]RYͮPd&<)SYR;뫝̤GJ'.~^)$W 5B HF2BXش]D]J+swyW3[?IԩKI8yWg˯jqz\g'~f>]P)4`HBfV)[+bw_][V'g5ٱ}H^ƚJqcP;$-$3el?c=?IRHOK V23Tv*^.BPB_QGGԥ6y+f[>ORO;WKVE՛U[CM<5"UGW7}L%/Sҫۯ$]>ytP.pLUGqB\}TήټtB\KRe_%YqԨ)uҼ;R/fRh[=WP 4~GjvoO>.BP%/-BkUu]d2W:Ҭw ]qP+u L&/u_2uϞ}$3Y?$4DJIfHB1SN.U ]b^|֝Ya uT:(ԵŻq)+^ Q}u>~ܶ<Z!…b<#5vII^|QRiǍ́r}UnuYJ~y KJ/<Z!¹b1}Rs?>=K>rv'y+%Z'Q͡Py:W򜯟T@\G_gVF=!OXR8pDSVb ߲/SUH *A|Ty*īa+Tm >J7[!epw'RVOSϞ_!_`R8p)X!UҳﺁTQAvv|`~LO4rd1hZʟq{!')B(_fEfrjZaZqͦtΦt\zgC ʇ\e7e0Zt0{>ӷ%+Te`}P!GҞX>cVيRM]Ν MdMz{$cU T Ǧ#B8޲ef 1H jݽC$]-T*TXiϽ1Qr= >oYy_6p.H-rr`b Zgx4X2)ˮL:J az.duϡʳN/D"D@ FpX˾,(lٔN[*, \~ (3)4BRvSIs}.)gW7e`0C ~T0-B3V-xcMJr%R/7?BSbgWEYv*pX3mNHuP#I}5Ux_UWU*KXŔK%ԪLJYrزώQ))TH?!(X_d 1݌GCcɈVdQ3bL}K9/ٟ>s=Վۊ@ cRK R[Cmojo0Û8-m~ {k*JfUo!r-2n9)8RO!ugscͱ,r@k- #o!u ] 6b7dZxb4*T&l/l/6c;P*D>q L!nOMg;kCjnkfPe{ sxQ+[J[&B\*DjB$UnpHRؕ)ضyOm˾BTՠ=Ĵ&kO2o] ^8誸w?UhMŭmΑ(5.*B؄Soٚ?eMجT:5+ɓS!83&Y!efm˽Rz-[Q&?/ VHŽy:fid!H1(re})TmЫZ A ێpvq.=I@ p60C obj);D tr%wfɚLs^Q%Ooɫ2lkKByY)ɂ)v {=tԴ+P 3@ j&%MuHgGjfDu.̫k=UEb/'м>ru.+dQ^ yWᆭ祪nOLE>ʬeNL 3LRӉ휦ìhpOR굉qPFf& \K)If uT4T`Mꨩ2l>2/Ev5 f~Ӷ7Z,:tRYJUܶ=MOk A77BZ ^܄Pmo'~& R}sS _ef!eRb|PXW6BHI͌*տ~Q_}AK8$oMd! YE 5͎(YB?z$OTJu}OC`d14R4%KC)&:[B pVHaWL$g 2I1h3+NnCϳRV!RM՗KuRd/̩syQC4ffU 87vR'@ք[fHB Myt0aAM=qRۂbŶe_]+MB#QfR'#)R WD=n\Ͽv A&X:3I!Bl*RR*6j?!%oZS*NgB"M_fD=8vRpo.V9`򲒻۳ڪ%?.N@}sS6s23Y M VdTUR|=ɓ7]OX:gc0+[uӱ YvZe_TaK7_IJ)9R3z㙲dyTȣYSem>]uѶμJM5YSJ5uiZ pFWoQ&:+4Sud!Rxlϛ,v$R8fL^i{ՆNvU+JBJT*BKGpvWo<[\ӎ}ЍM>{YfMIJI)ml3s M`U>P>gjMgHR@ rm+e4i+Uu eQ*R R*Jo/(̙zd.3gJ-nB;gmq.N{fJ{L!,HJU-6yk]n'W:ƇwTL6M鎹$)B )B ]R>ksB)vk1O) Yi>m׷]!щӛΐ"f< LKd؛e_ ש}n}.ꦥ_~$Ch8C7QЉݼi7-^wǛB'SȚ@Z^־Pζ *\R2IY|+A gKB7Wd#i+_bmUDN!eAMU !3g%YB);MKfjMAWaifF9'$)؎NMJuKْq l$ɲ&hROO3*TSeq_/Iܷ^IXuWeӶ}TF)2Wtwn*_IRM`JEE _sR4)LYR'm hɥ38 hه5,/ zBI6[y]+{~Uu/˲_-Y M ?3)H/i]ɛ@dR!\˚}!RhRh4.f7jB'ShE^C_8lT޺f5|jʨiYdoU )B>e}~&e[K6#M\M`gL%)_sq^a7;t;75x޺4ͤ6[ܵXRUҲpHaW5x\%%f<:M %o\R6Sgi( &MdMc4]^z+u)m]59pbǝUsWmgv>G\Rie_Ts)v%AOqɥm- Թ4/S`+)FT44.vTsc1k2*Jm6[Y[YLߑz4RZHTV*m- ΐ:KwI )B ='VGqM3/KfL΅ _βR=*YPM\\Ε&dZ*N?&'_DR}SQTZMڹJ3V!%)dYur]+ ht,|QRwTJ?oz )F%z2B pP!=UV ̈́Fʦ KR)wuIݫKǥŁ^%Y :2)B :v^'իJR3RSQVZYې{,QV|Os^+ʗ{Zx+SS5uY;Cꔮ'ժV3_#žʺt,MJM4qY/{yA։ZueÞϟoZyu*@.N7J)A =)iRr\L׮ɂɂZ|E)Y|3)ZG-pIN*T'l>A 7Hi8)7vԴ3u$O.Kum>3L|cS yJmu6)unq<: ̀HSc~y@mlZTJj2\`C3NOJ+Jb&<(L HG>fEf= d\χ_ls ᱐ .9v*'VWh8#Ӵ3I9FT'׃ۏO?T=x)YG 4&c6 L žyAg:ƪ6R~onKe-ˢm__QhY{8?ƃ?mW^]S=g3{wcЃ5~_}^Ȳ8cwimg?@{L##´]1˳LO4B i@_YG{Q RyklH3@ 2cZrw,_LFܗJ ~JQv*7]2۬}tKտ?3M2S l"®]X˕|˴1?ǟU&SqoUFф?3sk6ٶD$+gq3%w)iֿ??ZCգܝ xfd]J~6Fcݹ &Z)ٹO9Mwgwn};? o&<®q~@m յVF*T+TiRmv.?}+Pו4t? !RSJjw )LGO̧\PQHi"S2 N7# T'uC`sRSJXgjBx z}zcTU"a2 2o{5Vr Aߓet<;NJ:EJR]&p1IڤDj>d._:%u!rͶBTI AA^U6Jr)k?%3$E>gƞRTUӶ}Ǔʄ La8usyY'$ R޶̳v Rf&&s6'A =*J1ބ(mSY*Z/.¹yuLk*q럪mf׵|p2nRյʪj~8BFdf`zWnG/bOa=ׅzbdzzkwjo*g 73RPe*:}W/nWuofk!žVQT:1eYhRO?]Z%|'ig&}sZryU>ZL:W/+lVbTU&epd5uܢG=BT+ʯ=R.ru??R&BP+ _)Ȗ@ {;)L >PjmMܜԄ/>m\O/l{튪NGef!{8y.WE ]hOBW?]s5u^ZP>h mZ}SLrNujeE}ruM05F"G.u;{Ewn\。KJm߃#L1hpEYi'?/~Zs"RD>쩪kmL&^!%I!,StleM6j^OGJz-$gBwi|7lXL"žx\1$RMYBʺ*3MZUUDfdmNTvxjI/tW|>:i4(I&V^tBKJuשi;g6˓?lw,-*p^WtUU>|;t /GTU6FUUf2m1[m\>{4zz'`|iQ/sN&]s3@ {ZeyK&%˔R|3/\KJI@Þm_9).ku-2.0s1VY'VdW o,)l/5յ<%=vx&)/SvnQԿjI? ,)쩩,@6״_6 eL!3Ź9u^Q$Iw4)3> 0i UUu1WH5Q&4ͦ*uZU䵫RJ2vUzRҢ_k2I_3 IRSUZ](eqv|);N)+%ˤRm|pG{+Je% &UI-;eMK-s;^}.X٠jy IRh4h\UYT(RM˾~/P]^Ro+d6wPSLqؓeӣreM )RؗBjRG!RRA CE {JVkoB#d14IS4PS!ev7e2Y׮|eⷿr<_iW+M 6.`fHa_]+ {̘5EdjB94z}LiqoWլ+&w ǤTO׿7 ~O:7_Koko\^afʺGcu0Q AeY;niee]+XУ?3e!H1juTP]_zc8*ҤUF|4s]U埼w~*) ¾61(ljYh>XrթWDY7S/ %GwǪ&ܸdYPTjsKG{v4ͷ7Zl^L “m#v f*J5 wKɓu#ˣ,գBhkiQ,'Ɵ|YML+cgl\L ¾b0]Ņ<ȏ0)yRU;2:\nW!R#`2LGYQ6VȢVzK@U*+`fa\ɧܧt]1hw4蓧2 & AW.-iiq,tH,6r;KtjHKzϟS~aNTl(U IDATQӥT7Tܹjeuw^w7 Q{f:)IYSq.;`CPю'3) 0O7{eI݋Թ޵s)Tkh;#e!w-o+ 5z#= 8iRؗianN(]1F Md1([y{NL&]ŽqEIR::ٶ KR;*>}UZٻRYO $47lwXRE_~` yp DJɓh'& DXvO'IŽH^WW_juS觪V@ Ovb(TREέj}zT3NLJj4LiR\^y7@'x{mͿc+lcSC 7:\!3]ʲa_@\\X[mGY1Rh]uyU+_ʲzT\)UIP}U./+M'zoSb\jU޽F<5RS'ܧ#2}B*kg55 FV[탔NSRQ:)t2熊s=yT3xX`s4.T=ZVDo{o}Mi8Tɫ x*/ Mh5c6}9Ii\* )y[t≔qK׵w-JMnQf<R85M^AՃ?= )HTAEQUuq|I yɥ,B+3$wRYef2#:Қ/RU7^W/kdf֧N[aN S(+=|pǭ ,bE5T_SqMl*Btkf[ Xں|{z_7ޔYҤ?V􎪵u6;DHa_R\nAǃԣu& &:MΫ~ɝeգ Ln$ASn哱WHIRE-p(%Ւ҃=?O~f)Ϥ k*m-4Z)mLR0Y)d٩̎rIvVUr'߃KP!O|I+e&=V=)cG }I1nk_wc<%EY9宐E)4s< WI{'cmen3L RԽtA xSqny+jwUh흟kotfe4)cSt]J=4,(MJUk#'jOo[iL'[u$)\[;rŨދϫu ݛ1ijocA =I~Wyh%yj9eYsCY S'>]^'m"6ͦ}\Xi<9򱺗/iJv\m4[XHaOyi~N'thNiqa<Ϧ6/ 97' X4ζJ.t.ܫcvwMn7)̑t2زϓb vǚNyeN5)S SzRZ[;rT67_LmT$MT>|t93-tdAG $`v2 汔$Is~NBmw .f\.)wEj}KUU]Qvf޶JtWm?\jGZ\6R6d4Y)3 RC*:ȩDB&N(o[i m^[?vz% ^mf.)zPoQ!82)ɴ0<ƶ:W0${qA@!mcN6rBd!hzkR^=z>ITHIJ+}GC =u;2ّoӬN'poZ:sρ@  *mn ԎZN(hmW UneE\oURWrdEƧ_SN{/Tu#/yT7)=a%5l.xZR8L~OUUE3hcڙEBյ-~-V ʟ'k^WN[ t(sWc_Sqew-d*N xvR8SWi8詈q^JUWd5DRRwOW&R-qwXxC׮.;<6 )!™ʲP+-=e] wi,ܽ74,FHYQ(*}Fχ@ )KnzJˊ+eeѽvq%gyziǍþB' A]$yB se ޼y\V^Pƣ}z)+kY-˩b^OqЗ(O9\p.wWjR7C%#**Y^pNyvy-%_bCY*n"*׍x4--`"¹rjRR2QRv!uUHtis(T\ڑ #G\hxvR8i2fm1Kw2*KYѶ ~&3xiŠeY\] l3#¹r^R ^}mzBU.lԉ}Ti<5C*]&zr5Ӊ|:eH\ %,Ykn02*?+fJVHUWz}eI9Ӳ\p ):Dd-AqГEvE3&>8T܋XvUNW gF se]咽.3)AqXITE\\%WsoW,+ ^VuyGѤxf9U!Zܽ $I.Q_.h˾E݃ȩ]%FWUrM*RR} )B rw&=\DJLAW3.iZ;wfV /ɚ/&)+gZe-˂ɪض] f'{֛rC^7m )s ¹ꔔ_V};,D8ݚuq&v[^UsO g )s۲/笗3:$RQk lΐ5{Oy6S5yxm^|M~KLޞ!̨¹rj 쥾^ PF. 5KP;w&SI[3zCyGW_Q{fo_y)!¹-\HIb pN[!%M4OwǓg:`zwWy6cC ]>Q::\nû+S䩑LTt8Rg )+-BTZ^ f87KʓfJIՕ ~KV=6^>r{[gGj"KG.. p][,ߑjU.eIwΏ,h$)zS[?ugZ{u_}So5{ &ÑC6H])61{.5yԌgRv x'BYҵz?ؤ)TdRՌJ򜟩 rRΒ̔t03Y0\7(I >)XWfJ#ջX*^H9mT"m:Rj?߇{U zCHޞtz'D ZR%[ IDAT,:bIX]>Y/Tu㚊-ϼVf4bC+goӛŠf4ξÉ. 8qۚwkMP: Ñd @ H2ݑWs8J.vKJUjz6,Z( YQtUb&3)ǚ߹VXRv 5wQ^IrL6kT߻p<̔'w<5)R.zVH/i4RNegs5B 2Bm"M:H](ܔFݕ5Ii>W4)O@ e&`N䲲P藲x_Kh4/x>+Mgy>WwL xJRx2r7swYz,F ҪФP:a&2+^QhVǥ(M&&1O@ UbU$R)W&?뮔rN]H&8=3{׮Q m<3H\f^U(Ġ1<`MHfBfb<I QVo J7S<1)+ƠcQYF(2 Rvջ#4h_2u_У-`^f.+ YUɪr)I y[]vnO@ @BPU*br4.)TbïRs8^̇R+Ul m ՝țF{xbR8WA^MYVD[}]uKuKVď%8FW-熚ʭ%ҴCO<_ }[4IE s1߯TQ2[6nTT^佻:+gݶ4̤T]R;[k'f\7[+_74w9Q"¹5TQ%DP,Ի`o=]4AThzڵum}Un ۢ53e{}k? p.)(ʲbRyiCSnHe,B mDڳE7~U]rqqlwOW9p.) z*pTDLm+bs8Tu7M*7^YI>x2~K_zA_OkG>/JE\YR7{lpB芆\f|hR&)jYlϻxLY)W[5u.zu]m~3Xm A7_OzR՚ݼ36 LR8WUdI\\^){|5)YۮoHM񠫋OL Wh~Bsijc6 LR8WU!Ċ$+B mU4m{mlț<)Z$m~~g%Q'm~S(^Q4SG Mwt8bD s{77$@)FYݏ4uWi:SA&pLIJZy.i,Yj۪Q{;$Y5df@ +moeʪYEL,irPj~Pa I)+׍rʒ{kZd^<絜um~XF>Rsxf@ {ZD][>Z{޼%V] R0YGZl:̮u/^_k5V&[ yGU: @ 1wfH22oÝͻrӴo\aeebWw.o_/~O+a8$U9)Ć<49PYD*\f. R}{ooD˨8ɪg^|W^p v[9eY_ebkSq2yJR+e6 nβV_eeI(б`P(MkMojr 2WzdW aO*g~Q[0O4uxk|>z}P_I1H,q2{6R8ư2JZm&Tjv58YE U)ނ e+?y]i2}s$mHŠɊ^7-Ju\L>HLþv67TrVH&sLoV:HVO{[B|tdsVueSJ\HTN~.96ԊBV,'5^,R8@}4e(v˲hmsPӛw3Y\GVBf;?vfRh~@t-)oLhѭVR8PW,BOǭ\j,Wך=P%[G2~pqًU])j3H&yv8G*S!ZJ kٴZδ5氯WHY;iSCXf]ؓf}',kR,gf4҆.gTf}JZ[yJR[[bHR8@0BJOm *63j>3ZP7b-]~vp 9I9=m@I, J++ϛFV}bTdeB(עȺozz8P 83H!f́zU)֓DK'ZdA_*JY :++]VBJRcy}H *v7gc B[!UQ~"YUbgB4wRwK-;bPde< ˳dePkۊXroק͹z`\J$CPqiGVUlCkW(ϫ}sWS=h+t" r7]a*#bX)٥a&ydԻb' vԂpwJ#YW%y4W.)g#`(b7?jż%aOQv<%yMj#$c7**GS:ٟʪbTZp.CTuRxHQ.Z9MA*zEDk+JK]r,(zmQXۻ U7vTl9R,kl7W3h2u~8PAf&_-ȊB~NSnU,T @Rޡc ^@jeBY\i4>Ւ0Tzׯ)l𐜳fZ9uߴL"ȊSP޶Sf2׶[`.\.ogXSV?=UwԻյvԊo +ײ/kX~9mvֺ@ iRhI ZS"咙ɂb8ݚϥg2ST dn:Y"#;(j+vI!8C*k鴻E﫼zUqc(8.Ms5MZ!eRhUI튤ۯ_|X eɗO/7w˨ږ^IbUWu`@ qwMs@ }NsX|TsXIR!`ǚ}+5x0j}MnVn/Uy6[$Kqk[kaxq/xKu4I9H; ď-<ZĹBYTm~P-/[j+Nv3tIYo~[?һb1-TvTlS!x[iRZlIIN:'~ܵS^zoCPE^qJ*gwGmL九 kLE0RQ4ěZAV ʝmW/)ȨU7IMu(+(j)sZ:ږt*⦜}7ICYP&Ql> jWˢJ&W%x,)otg>ke!S>5sjʒj_n/jѝ埯(de!3Se6 Ha E˾u5d`Dؕ$w΍6HEe+YIwK/Ky6[yW5C5U\@ 0Q hu^Qq/+e7fP߲s4OϿrk(%Zn_I:ӿz9_*kWT]aruRkT[IdeTٗp$eX0)?2^uUJVqMnSVkr:JjW:j!xfn9?cq?uMoRIY*w7,'B T7m k'w2*`$kٷ )I eTN 'IJ) ޼Ͽކk&Zn&_ ,ݥu[ӇR4wK3\*v <%5))IeW U7NA&?1C*HkBeERkNޛ`y]{cnhӯ9ȳ?0k3mt?ѭ?;OwF[h1[+l77z=6 H\uݨigE[O!Q˾KC}"*X;)g)e,+bTQ9=>M={c ޸k|ȪƧVtI{23YY[O~5|:UIv76x"RxT׍R . AF_M٭{,e_ײϻ ^!+T¢)C5cy*/ ߽fZ+&[;*Kfï-}Q||)'kT YlanRJr_&.3ST]TQmAI+l.+BUb5 4Ռg=TTl+*UBu_frmDj@ hه3sPAAPRfzD?f.9>?$*6Q']ʓ~PUx\noHi2Unrwp`6,fuewn&7;Ut4+F<-pnGy#d %3I=yG7,_ ~BVsޮ6T8HBuϺQ3p/,ߊKfJәt*յ#pBbc!2.S?y\x͑rڅ,(e_UTs>lvW.hyEJʣrJY>'iM/ܚW^kE[gҠ_K+HrIQReAenqhXv5h]KU׏:u?sL߻4u/5xz^R֚ܺe&4xM ?iBKSx_*}[g/5Ͻ^ͷz?X2Q/(zϥIENDB`PK HAjGGOEBPS/imagesdb/docbook.css.needsjavascript { display: none; } a:link { color: #3366FF; text-decoration: none; } a:visited { color: #3366FF; text-decoration: none; } a.dotted { color: #3366FF; text-decoration: none; border-bottom: 1px dotted #000; } a.currentlink { color: #5A7800; } a:hover.currentlink { color: #88B400; } div.toc a:visited { outline: none; } body, div, td, th, form { font-family: "Trebuchet MS", Arial, Verdana, Helvetica, sans-serif; font-size: 10pt; } p { font-family: "Trebuchet MS", Arial, Verdana, Helvetica, sans-serif; font-size: 10pt; clear: bottom; padding-top: 2px; } p.timestamp { font-size: 70%; text-align: right; } div.footnote p { font-size: 9pt; margin-top: -1ex; } hr.footnote { height: 0px; border: 0px; border-top: 1px solid #000066; margin: 0.5em 65% 0.5em 0; } code.sgmltag-attribute, code.sgmltag-genentity, code.sgmltag-element, code.sgml-emptytag, code.sgmltag-prefix, code.sgmltag-localname, code.sgmltag-namespace, code.function, code.type, code.exceptionname, em.parameter, code.varname, code.interfacename, code.oointerface, code.classname, code.ooclass, code.methodname, code.coexception, code.computeroutput, code.command, code.option, code.filename, code.literal, code.uri , code.envar, code.code, code.methodsynopsis, pre.classsynopsis, code.constant, span.type , span.markup, span.package, div.cmdsynopsis { background-color: transparent; color: #990033; font-family: "Lucida Console", "Courier New", Courier, monospace; font-size: 9pt; } code.sgmltag-attvalue, em.replaceable { background-color: transparent; color: #990033; font-family: "Lucida Console", "Courier New", Courier, monospace; font-size: 9pt; font-style: italic; } div.abstract { background-color: #FFFFFF; color: #000000; padding-left: 10pt; padding-right: 10pt; padding-bottom: 0; padding-top: 0; left: -2px; position: relative; top: -2px; } div.abstract p.title { margin-bottom: -2ex; } div.abstract p { font-style: italic; padding-bottom: 0; padding-top: 0; } div.fusenavheader { background-color: #be1e2d; border-bottom: 1px solid #393939; padding-bottom: 0.5ex; } div.navheader { background: be1e2d; border-bottom: 1px solid #393939; padding-bottom: 0.5ex; margin-top: 2px; } div.navfooter { background: none; border-top: 1px solid #393939; margin-top: 2ex; padding-top: 1ex; } div.caution, div.note, div.important, div.tip, div.warning { background-color: #EEEEEE; border: none; color: #000000; font-style: italic; margin-left: 10%; width: 80%; } img { border-width: 0px; padding: 0px; margin: 0px; } h1 { color: #636363; font-size: 150%; font-weight: normal; margin-top: 0; } /* h1.title applies to the book title on the cover page and part titles */ h1.title { background: none; border: none; color: #808080; font-variant: small-caps; font-size: 190%; font-weight: bold; } /* h2.title applies only to the book subtitle on the cover page */ h2.subtitle { font-weight:normal; font-size:140%; line-height:140%; color:#28458E; margin-bottom:0.5ex; } /* h2 applies to chapter headings only */ h2 { font-weight:normal; font-size:210%; line-height:130%; vertical-align:top; color:#808080; margin-top:1ex; margin-bottom:0.5ex; } div.titlepage span.productname { font-weight:normal; font-size:210%; vertical-align:top; color:#808080; } /* div.section h2 applies to first-level sections in a chapter */ div.section h2 { font-size:170%; vertical-align:top; color:#808080; margin-top:1ex; margin-bottom:0.5ex; font-weight:normal; } h3, div.section h3 { font-weight:normal; font-size:140%; vertical-align:top; color:#808080; margin-top:1ex; margin-bottom:0.5ex; } div.section h4 { font-weight:bold; font-size:120%; vertical-align:top; color:#808080; margin-top:1ex; margin-bottom:0.5ex; } div.section h5 { font-weight:bold; font-size:110%; vertical-align:top; color:#808080; margin-top:1ex; margin-bottom:0.5ex; } div.simplesect { margin-top: 1ex; } div.simplesect h2, div.simplesect h3, div.simplesect h4, div.simplesect h5, div.simplesect h6, div.simplesect h1 { float: left; clear: left; background-color: #CCCCCC; color: #000000; font-size: 100%; font-weight: bold; padding-bottom: 4px; padding-left: 10px; padding-top: 4px; padding-right: 10px; margin-top: 2px; margin-bottom: 3px; margin-right: 8px;} div.itemizedlist ul.li { list-style: square; } p.tablenote { background-color: #EEEEEE; border: thin solid #000000; color: #000000; margin-left: 2%; margin-right: 2%; width: 95%; } pre.programlisting, pre.screen { background-color: #F0F0F0; border-bottom: none; color: #990033; font-size: 9pt; padding-left: 10pt; padding-right: 10pt; } span.olinkdocname { font-style: italic; } strong.command, strong.userinput { background-color: transparent; color: #990033; font-family: "Lucida Console", "Courier New", Courier, monospace; font-size: 9pt; } div.section th, div.informaltable th, div.table-contents th { background-color: #EEEEEE; color: #003366; } th, div.note th, div.important th, div.tip th, div.warning th, div.caution th { background-color: transparent; color: #003366; } div.table p.title, div.example p.title, div.figure p.title { font-style: italic; font-size: 80%; } div.section table, div.informaltable table, div.table-contents table { border-collapse: collapse; border-top: 1pt solid; border-bottom: 1pt solid; border-left: 1pt solid; border-right: 1pt solid; } div.section th, div.section td, div.informaltable th, div.informaltable td { border-right: 1pt solid; border-bottom: 1pt solid; } div.calloutlist table, div.calloutlist th, div.calloutlist td { border: none; } div.note table, div.note th, div.note td, div.important table, div.important th, div.important td, div.tip table, div.tip th, div.tip td, div.warning table, div.warning th, div.warning td, div.caution table, div.caution th, div.caution td, div.figure table, div.figure th, div.figure td, div.figure-contents table, div.figure-contents th, div.figure-contents td, div.mediaobject table, div.mediaobject th, div.mediaobject td { border: none; } span.guibutton, span.guilabel, span.guimenu, span.guisubmenu, span.guimenuitem { color: #000033; font-weight: bold; } span.property { background-color: transparent; color: #990033; font-family: "Lucida Console", "Courier New", Courier, monospace; font-size: 9pt; } /* Styles for cover page items */ p.pubdate { font-size: x-small; font-weight: bold; } p.releaseinfo { font-size: 105%; margin-bottom: -0.50ex; } span.date { font-size: 105%; } /* For entries in the left-column TOC */ div.ListofTitles { font-size: 9pt; margin-top: 3px; } div.toc { font-size: 9pt; line-height: 10pt; } div.toc p { margin-bottom: 2ex; } div.toc dl { margin-top: 0px; font-size: 9pt; } div.toc dl dt { margin-top: 2px; } div.toc dl dd dl dt { margin-top: 0px; } div.ListofTitles a { padding-left: 0px; } div.toc dl dt span a { padding-left: 0px; } div.toc dl dd dl dt span a { margin-left: -2em; } div.toc dl dd dl dd dl dt span a { margin-left: -3em; } div.toc dl dt span code.sgml-element { font-size: 8pt; } div.toc dl dd dl dt span code.sgml-element { font-size: 8pt; } div.toc dl dd dl dd dl dt span code.sgml-element { font-size: 8pt; } @media print { div.navfooter, div.navheader, div.fusenavheader { display: none; } h1, h2 { border: none; } } dt { font-weight:normal; font-size:110%; vertical-align:top; color:#333333; margin-top:1ex; margin-bottom:0.5ex; } div.revhistory table { border-collapse:collapse; } div.revhistory th { background-color: #EEEEEE; color: #003366; padding: 10px; } div.revhistory td { padding: 10px; }PK HAUGeOEBPS/imagesdb/important.gifGIF89a #%3$~~'}}yyywwwttassnnmmmfffddCaa,^^\\S\\:\\"\\[['XXPP?NN*LLJJJGGGFF,FFAA999222 ! ,@2fΘ)DIRHq+p L1 e" /z"@3 )9,9. f9ag"Y:<s&H Q4/#vj D`Z3`$e)$ƆA[@92#twaV&R/&TgbΦ+6 sfgUkɀ $Ah?S!STD(PD;PK HAaCAa++OEBPS/imagesdb/note.gifGIF89a~~~}}}yyywwwtttsssnnnmmmfffdddaaa^^^\\\[[[XXXUUUQQQPPPNNNLLLJJJGGGFFFAAA999222 ! ,@+X`R=JCRxPa8Ch81T@&00X `ĠϘ0=<LLPp R<RbJ*pTCWG=hP0ҤO=;NxԻ X6XpB )48) H@A  p+ @AG-O9fϊ şX]YWv̞%1i&j8 @Ϟ7Nt!w9.Рp^#p`!À;PK HA5 OEBPS/imagesdb/warning.gifGIF89aJJJ!,@eP9c;@W`}e& v.,JOr+͈ OMQj "2]WL^qߗݖRu1_Oφq@sOabXA;PK HAq1&1&OEBPS/index.html Developing RESTful Web Services

Third Party Acknowledgements

One or more products in the Fuse ESB Enterprise release includes third party components covered by licenses that require that the following documentation notices be provided:

  • JLine (http://jline.sourceforge.net) jline:jline:jar:1.0

    License: BSD (LICENSE.txt) - Copyright (c) 2002-2006, Marc Prud'hommeaux

    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    • Neither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  • Stax2 API (http://woodstox.codehaus.org/StAX2) org.codehaus.woodstox:stax2-api:jar:3.1.1

    License: The BSD License (http://www.opensource.org/licenses/bsd-license.php)

    Copyright (c) <YEAR>, <OWNER> All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  • jibx-run - JiBX runtime (http://www.jibx.org/main-reactor/jibx-run) org.jibx:jibx-run:bundle:1.2.3

    License: BSD (http://jibx.sourceforge.net/jibx-license.html) Copyright (c) 2003-2010, Dennis M. Sosnoski.

    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    • Neither the name of JiBX nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  • JavaAssist (http://www.jboss.org/javassist) org.jboss.javassist:com.springsource.javassist:jar:3.9.0.GA:compile

    License: MPL (http://www.mozilla.org/MPL/MPL-1.1.html)

  • HAPI-OSGI-Base Module (http://hl7api.sourceforge.net/hapi-osgi-base/) ca.uhn.hapi:hapi-osgi-base:bundle:1.2

    License: Mozilla Public License 1.1 (http://www.mozilla.org/MPL/MPL-1.1.txt)

Updated: 08 Oct 2012

PK HAz922OEBPS/ix01.html Index

A

annotations
@Consumes (see @Consumes)
@Context (see @Context)
@CookieParam (see @CookieParam)
@DefaultValue (see @DefaultValue)
@DELETE (see @DELETE)
@Encoded (see @Encoded)
@FormParam (see @FormParam)
@GET (see @GET)
@HEAD (see @HEAD)
@HeaderParam (see @HeaderParam)
@MatrixParam (see @MatrixParam)
@Path (see @Path)
@PathParam (see @PathParam)
@POST (see @POST)
@Produces (see @Produces)
@Provider (see @Provider)
@PUT (see @PUT)
@QueryParam (see @QueryParam)
inheritance, Annotation Inheritance

E

entity parameter, Parameters
ExceptionMapper<E>, Implementing an exception mapper

M

matrix parameters, Using matrix parameters, Getting the matrix parameters
MessageBodyReader, Custom readers
MessageBodyWriter, Custom writers

P

parameter constraints, Parameters
PathSegment, Getting the path
PK HAO OEBPS/toc.ncx Developing RESTful Web ServicesDeveloping RESTful Web Services1. Introduction to RESTful Web Services2. Creating ResourcesIntroductionBasic JAX-RS annotationsRoot resource classesWorking with resource methodsWorking with sub-resourcesResource selection method3. Passing Information into Resource Classes and MethodsBasics of injecting dataUsing JAX-RS APIsInjecting data from a request URIInjecting data from the HTTP message headerInjecting data from HTML formsSpecifying a default value to injectUsing Fuse Services Framework extensions4. Returning Information to the ConsumerReturning plain Java constructsFine tuning an application's responsesBasics of building responsesCreating responses for common use casesHandling more advanced responsesReturning entities with generic type information5. Handling ExceptionsUsing WebApplicaitonException exceptions to report errorsMapping exceptions to responses6. Publishing a Service7. Entity Support8. Customizing the Media Types Handled by a Resource9. Getting and Using Context InformationIntroduction to contextsWorking with the full request URIInjecting the URI informationWorking with the URIGetting the value of URI template variablesGetting the query parametersGetting the matrix parametersWorking with the HTTP HeadersWorking with security informationWorking with preconditionsWorking with servlet contextsWorking with the Apache CXF context objectAdding custom contexts10. Annotation InheritanceIndexPK HAoa,mimetypePK HA A:META-INF/PK HAAaOEBPS/PK HA AOEBPS/images/PK HAAOEBPS/imagesdb/PK HAhhMETA-INF/container.xmlPK HAЯ/6ccyOEBPS/JAXRSBaseAnnotations.htmlPK HAJ|i%OEBPS/JAXRSDefaultValueInjection.htmlPK HAWYWV;OEBPS/JAXRSFormAnnotations.htmlPK HAe}}POEBPS/JAXRSGenericEntity.htmlPK HAn\`iOEBPS/JAXRSHTTPAnnotations.htmlPK HAW_11;OEBPS/JAXRSPublishing.htmlPK HA7((OEBPS/JAXRSResponseCommon.htmlPK HAZZOEBPS/JAXRSResponseObject.htmlPK HA}>((!OEBPS/JAXRSResponseObjectAdv.htmlPK HAL, #OEBPS/JAXRSResponseObjectBasic.htmlPK HAʵ**$OEBPS/JAXRSResponseObjectCommon.htmlPK HA;kFFOEBPS/JAXRSURIAnnotations.htmlPK HANZOEBPS/RESTAnnotateInherit.htmlPK HAH H uOEBPS/RESTContexts.htmlPK HARe  >OEBPS/RESTContextsCXF.htmlPK HA SOEBPS/RESTContextsCustom.htmlPK HA+*?fOEBPS/RESTContextsHeaders.htmlPK HA$QK'OEBPS/RESTContextsIntro.htmlPK HAAPOEBPS/RESTContextsPrecond.htmlPK HAnzOEBPS/RESTContextsSecurity.htmlPK HA%OEBPS/RESTContextsServlet.htmlPK HAqi KOEBPS/RESTContextsURI.htmlPK HA]>\ \ fOEBPS/RESTContextsURIInject.htmlPK HA'' OEBPS/RESTContextsURIMatrix.htmlPK HAލ(ee$eOEBPS/RESTContextsURIPathParams.htmlPK HAg-## OEBPS/RESTContextsURIQuery.htmlPK HAz66!lOEBPS/RESTContextsURIWorking.htmlPK HAcpוו@OEBPS/RESTEntityTypes.htmlPK HA~v''OOEBPS/RESTExceptionMapper.htmlPK HA!##OEBPS/RESTExceptionNorm.htmlPK HA4 OEBPS/RESTExceptions.htmlPK HAQ --`OEBPS/RESTIntro.htmlPK HAs;"/OEBPS/RESTMediaTypes.htmlPK HAhb  55OEBPS/RESTMethods.htmlPK HA  rQOEBPS/RESTParameters.htmlPK HA>NA]OEBPS/RESTParametersBasics.htmlPK HAqClmOEBPS/RESTParametersCXF.htmlPK HAtt\OEBPS/RESTParametersJAXRS.htmlPK HAgZ`v v  OEBPS/RESTResourceClass.htmlPK HAJ22OEBPS/RESTResourceSelect.htmlPK HAc)'OEBPS/RESTResponses.htmlPK HArCOEBPS/ResourceClassIntro.htmlPK HA-9W!W!NOEBPS/RootResourceClass.htmlPK HA S0..OEBPS/SubResourceClass.htmlPK HA