From 11d22b1b1f62105b24f7e58be2aacd16f50ea06d Mon Sep 17 00:00:00 2001
From: jamesagnew http://example.com/fhir/Patient/123
the base URL would be
* http://example.com/fhir
.
@@ -224,6 +228,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatype
true
if this ID contains an absolute URL (in other words, a URL starting with "http://" or "https://"
*/
+ @Override
public boolean isAbsolute() {
if (StringUtils.isBlank(getValue())) {
return false;
@@ -352,9 +372,15 @@ public class IdDt extends UriDt implements IPrimitiveDatatypetrue
if the unqualified ID is a valid {@link Long} value (in other words, it consists only of digits)
*/
+ @Override
public boolean isIdPartValidLong() {
String id = getIdPart();
if (StringUtils.isBlank(id)) {
@@ -371,6 +397,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatypetrue
if the ID is a local reference (in other words, it begins with the '#' character)
*/
+ @Override
public boolean isLocal() {
return myUnqualifiedId != null && myUnqualifiedId.isEmpty() == false && myUnqualifiedId.charAt(0) == '#';
}
@@ -378,6 +405,7 @@ public class IdDt extends UriDt implements IPrimitiveDatatypethis
IdDt. It is generally not neccesary to use this method but it is provided for consistency with the rest of the API.
*/
+ @Override
public void setId(IdDt theId) {
setValue(theId.getValue());
}
@@ -396,16 +424,16 @@ public class IdDt extends UriDt implements IPrimitiveDatatype- * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length - * limit of 36 characters. - *
- *- * regex: [a-z0-9\-\.]{1,36} - *
- */ - public IdType(String theValue) { - setValue(theValue); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theIdPart - * The ID (e.g. "123") - */ - public IdType(String theResourceType, BigDecimal theIdPart) { - this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theIdPart - * The ID (e.g. "123") - */ - public IdType(String theResourceType, Long theIdPart) { - this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theId - * The ID (e.g. "123") - */ - public IdType(String theResourceType, String theId) { - this(theResourceType, theId, null); - } - - /** - * Constructor - * - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theId - * The ID (e.g. "123") - * @param theVersionId - * The version ID ("e.g. "456") - */ - public IdType(String theResourceType, String theId, String theVersionId) { - this(null,theResourceType,theId,theVersionId); - } - - /** - * Constructor - * - * @param theBaseUrl - * The server base URL (e.g. "http://example.com/fhir") - * @param theResourceType - * The resource type (e.g. "Patient") - * @param theId - * The ID (e.g. "123") - * @param theVersionId - * The version ID ("e.g. "456") - */ - public IdType(String theBaseUrl, String theResourceType, String theId, String theVersionId) { - myBaseUrl = theBaseUrl; - myResourceType = theResourceType; - myUnqualifiedId = theId; - myUnqualifiedVersionId = StringUtils.defaultIfBlank(theVersionId, null); - myHaveComponentParts = true; - } - - /** - * Creates an ID based on a given URL - */ - public IdType(UriType theUrl) { - setValue(theUrl.getValueAsString()); - } - - /** - * @deprecated Use {@link #getIdPartAsBigDecimal()} instead (this method was deprocated because its name is ambiguous) - */ - @Deprecated - public BigDecimal asBigDecimal() { - return getIdPartAsBigDecimal(); - } - - /** - * Returns true if this IdDt matches the given IdDt in terms of resource type and ID, but ignores the URL base - */ - @SuppressWarnings("deprecation") - public boolean equalsIgnoreBase(IdType theId) { - if (theId == null) { - return false; - } - if (theId.isEmpty()) { - return isEmpty(); - } - return ObjectUtils.equals(getResourceType(), theId.getResourceType()) && ObjectUtils.equals(getIdPart(), theId.getIdPart()) && ObjectUtils.equals(getVersionIdPart(), theId.getVersionIdPart()); - } - - - - @Override - public boolean equals(Object theArg0) { - if (!(theArg0 instanceof IdType)) { - return false; - } - IdType id = (IdType)theArg0; - return StringUtils.equals(getValueAsString(), id.getValueAsString()); - } - - @Override - public int hashCode() { - HashCodeBuilder b = new HashCodeBuilder(); - b.append(getValueAsString()); - return b.toHashCode(); - } - - /** - * Returns the portion of this resource ID which corresponds to the server base URL. For example given the resource IDhttp://example.com/fhir/Patient/123
the base URL would be
- * http://example.com/fhir
.
- * - * This method may return null if the ID contains no base (e.g. "Patient/123") - *
- */ - public String getBaseUrl() { - return myBaseUrl; - } - - public String getIdPart() { - return myUnqualifiedId; - } - - /** - * Returns the unqualified portion of this ID as a big decimal, ornull
if the value is null
- *
- * @throws NumberFormatException
- * If the value is not a valid BigDecimal
- */
- public BigDecimal getIdPartAsBigDecimal() {
- String val = getIdPart();
- if (isBlank(val)) {
- return null;
- }
- return new BigDecimal(val);
- }
-
- /**
- * Returns the unqualified portion of this ID as a {@link Long}, or null
if the value is null
- *
- * @throws NumberFormatException
- * If the value is not a valid Long
- */
- public Long getIdPartAsLong() {
- String val = getIdPart();
- if (isBlank(val)) {
- return null;
- }
- return Long.parseLong(val);
- }
-
- public String getResourceType() {
- return myResourceType;
- }
-
- /**
- * Returns the value of this ID. Note that this value may be a fully qualified URL, a relative/partial URL, or a simple ID. Use {@link #getIdPart()} to get just the ID portion.
- *
- * @see #getIdPart()
- */
- @Override
- public String getValue() {
- if (myValue == null && myHaveComponentParts) {
- StringBuilder b = new StringBuilder();
- if (isNotBlank(myBaseUrl)) {
- b.append(myBaseUrl);
- if (myBaseUrl.charAt(myBaseUrl.length()-1)!='/') {
- b.append('/');
- }
- }
-
- if (isNotBlank(myResourceType)) {
- b.append(myResourceType);
- }
-
- if (b.length() > 0) {
- b.append('/');
- }
-
- b.append(myUnqualifiedId);
- if (isNotBlank(myUnqualifiedVersionId)) {
- b.append("/_history/");
- b.append(myUnqualifiedVersionId);
- }
- String value = b.toString();
- myValue = value;
- }
- return myValue;
- }
-
- @Override
- public String getValueAsString() {
- return getValue();
- }
-
- public String getVersionIdPart() {
- return myUnqualifiedVersionId;
- }
-
- public Long getVersionIdPartAsLong() {
- if (!hasVersionIdPart()) {
- return null;
- } else {
- return Long.parseLong(getVersionIdPart());
- }
- }
-
- /**
- * Returns true if this ID has a base url
- *
- * @see #getBaseUrl()
- */
- public boolean hasBaseUrl() {
- return isNotBlank(myBaseUrl);
- }
-
- public boolean hasIdPart() {
- return isNotBlank(getIdPart());
- }
-
- public boolean hasResourceType() {
- return isNotBlank(myResourceType);
- }
-
- public boolean hasVersionIdPart() {
- return isNotBlank(getVersionIdPart());
- }
-
- /**
- * Returns true
if this ID contains an absolute URL (in other words, a URL starting with "http://" or "https://"
- */
- public boolean isAbsolute() {
- if (StringUtils.isBlank(getValue())) {
- return false;
- }
- return isAbsolute(getValue());
- }
-
- /**
- * Returns true
if the unqualified ID is a valid {@link Long} value (in other words, it consists only of digits)
- */
- public boolean isIdPartValidLong() {
- String id = getIdPart();
- if (StringUtils.isBlank(id)) {
- return false;
- }
- for (int i = 0; i < id.length(); i++) {
- if (Character.isDigit(id.charAt(i)) == false) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Returns true
if the ID is a local reference (in other words, it begins with the '#' character)
- */
- public boolean isLocal() {
- return myUnqualifiedId != null && myUnqualifiedId.isEmpty() == false && myUnqualifiedId.charAt(0) == '#';
- }
-
- /**
- * Copies the value from the given IdDt to this
IdDt. It is generally not neccesary to use this method but it is provided for consistency with the rest of the API.
- */
- public void setId(IdType theId) {
- setValue(theId.getValue());
- }
-
- /**
- * Set the value
- *
- * - * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length - * limit of 36 characters. - *
- *- * regex: [a-z0-9\-\.]{1,36} - *
- */ - @Override - public IdType setValue(String theValue) { - // TODO: add validation - myValue = theValue; - myHaveComponentParts = false; - if (StringUtils.isBlank(theValue)) { - myBaseUrl = null; - myValue = null; - myUnqualifiedId = null; - myUnqualifiedVersionId = null; - myResourceType = null; - } else if (theValue.charAt(0)== '#') { - myValue = theValue; - myUnqualifiedId = theValue; - myUnqualifiedVersionId=null; - myResourceType = null; - myHaveComponentParts = true; - } else { - int vidIndex = theValue.indexOf("/_history/"); - int idIndex; - if (vidIndex != -1) { - myUnqualifiedVersionId = theValue.substring(vidIndex + "/_history/".length()); - idIndex = theValue.lastIndexOf('/', vidIndex - 1); - myUnqualifiedId = theValue.substring(idIndex + 1, vidIndex); - } else { - idIndex = theValue.lastIndexOf('/'); - myUnqualifiedId = theValue.substring(idIndex + 1); - myUnqualifiedVersionId = null; - } - - myBaseUrl = null; - if (idIndex <= 0) { - myResourceType = null; - } else { - int typeIndex = theValue.lastIndexOf('/', idIndex - 1); - if (typeIndex == -1) { - myResourceType = theValue.substring(0, idIndex); - } else { - myResourceType = theValue.substring(typeIndex + 1, idIndex); - - if (typeIndex > 4) { - myBaseUrl = theValue.substring(0, typeIndex); - } - - } - } - - } - return this; - } - - /** - * Set the value - * - *- * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length - * limit of 36 characters. - *
- *- * regex: [a-z0-9\-\.]{1,36} - *
- */ - @Override - public void setValueAsString(String theValue) { - setValue(theValue); - } - - @Override - public String toString() { - return getValue(); - } - - /** - * Returns a new IdDt containing this IdDt's values but with no server base URL if one - * is present in this IdDt. For example, if this IdDt contains the ID "http://foo/Patient/1", - * this method will return a new IdDt containing ID "Patient/1". - */ - public IdType toUnqualified() { - return new IdType(getResourceType(), getIdPart(), getVersionIdPart()); - } - - public IdType toUnqualifiedVersionless() { - return new IdType(getResourceType(), getIdPart()); - } - - public IdType toVersionless() { - return new IdType(getBaseUrl(), getResourceType(), getIdPart(), null); - } - - public IdType withResourceType(String theResourceName) { - return new IdType(theResourceName, getIdPart(), getVersionIdPart()); - } - - /** - * Returns a view of this ID as a fully qualified URL, given a server base and resource name (which will only be used if the ID does not already contain those respective parts). Essentially, - * because IdDt can contain either a complete URL or a partial one (or even jut a simple ID), this method may be used to translate into a complete URL. - * - * @param theServerBase - * The server base (e.g. "http://example.com/fhir") - * @param theResourceType - * The resource name (e.g. "Patient") - * @return A fully qualified URL for this ID (e.g. "http://example.com/fhir/Patient/1") - */ - public IdType withServerBase(String theServerBase, String theResourceType) { - return new IdType(theServerBase, theResourceType, getIdPart(), getVersionIdPart()); - } - - /** - * Creates a new instance of this ID which is identical, but refers to the specific version of this resource ID noted by theVersion. - * - * @param theVersion - * The actual version string, e.g. "1" - * @return A new instance of IdDt which is identical, but refers to the specific version of this resource ID noted by theVersion. - */ - public IdType withVersion(String theVersion) { - Validate.notBlank(theVersion, "Version may not be null or empty"); - - String existingValue = getValue(); - - int i = existingValue.indexOf("_history"); - String value; - if (i > 1) { - value = existingValue.substring(0, i - 1); - } else { - value = existingValue; - } - - return new IdType(value + "/_history/" + theVersion); - } - - private static String toPlainStringWithNpeThrowIfNeeded(BigDecimal theIdPart) { - if (theIdPart == null) { - throw new NullPointerException("BigDecimal ID can not be null"); - } - return theIdPart.toPlainString(); - } - - private static String toPlainStringWithNpeThrowIfNeeded(Long theIdPart) { - if (theIdPart == null) { - throw new NullPointerException("Long ID can not be null"); - } - return theIdPart.toString(); - } - - @Override - public boolean isEmpty() { - return isBlank(getValue()); - } - - @Override - public IdType copy() { - return new IdType(getValue()); - } - - - private static boolean isAbsolute(String theValue) { - String value = theValue.toLowerCase(); - return value.startsWith("http://") || value.startsWith("https://"); - } - - -} \ No newline at end of file +package org.hl7.fhir.instance.model; + +/* + Copyright (c) 2011+, HL7, Inc. + 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 HL7 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 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. + +*/ + +import static org.apache.commons.lang3.StringUtils.*; + +import java.math.BigDecimal; + +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.hl7.fhir.instance.model.annotations.DatatypeDef; +import org.hl7.fhir.instance.model.api.IBaseResource; +import org.hl7.fhir.instance.model.api.IIdType; +import org.hl7.fhir.instance.model.api.IPrimitiveType; + +/** + * Represents the FHIR ID type. This is the actual resource ID, meaning the ID that will be used in RESTful URLs, Resource References, etc. to represent a specific instance of a resource. + * + *+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *
+ *+ * regex: [a-z0-9\-\.]{1,36} + *
+ */ +@DatatypeDef(name = "id") +public final class IdType extends UriType implements IPrimitiveType+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *
+ *+ * regex: [a-z0-9\-\.]{1,36} + *
+ */ + public IdType(String theValue) { + setValue(theValue); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theIdPart + * The ID (e.g. "123") + */ + public IdType(String theResourceType, BigDecimal theIdPart) { + this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theIdPart + * The ID (e.g. "123") + */ + public IdType(String theResourceType, Long theIdPart) { + this(theResourceType, toPlainStringWithNpeThrowIfNeeded(theIdPart)); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theId + * The ID (e.g. "123") + */ + public IdType(String theResourceType, String theId) { + this(theResourceType, theId, null); + } + + /** + * Constructor + * + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theId + * The ID (e.g. "123") + * @param theVersionId + * The version ID ("e.g. "456") + */ + public IdType(String theResourceType, String theId, String theVersionId) { + this(null, theResourceType, theId, theVersionId); + } + + /** + * Constructor + * + * @param theBaseUrl + * The server base URL (e.g. "http://example.com/fhir") + * @param theResourceType + * The resource type (e.g. "Patient") + * @param theId + * The ID (e.g. "123") + * @param theVersionId + * The version ID ("e.g. "456") + */ + public IdType(String theBaseUrl, String theResourceType, String theId, String theVersionId) { + myBaseUrl = theBaseUrl; + myResourceType = theResourceType; + myUnqualifiedId = theId; + myUnqualifiedVersionId = StringUtils.defaultIfBlank(theVersionId, null); + myHaveComponentParts = true; + } + + /** + * Creates an ID based on a given URL + */ + public IdType(UriType theUrl) { + setValue(theUrl.getValueAsString()); + } + + public void applyTo(IBaseResource theResouce) { + if (theResouce == null) { + throw new NullPointerException("theResource can not be null"); + } else { + theResouce.setId(new IdType(getValue())); + } + } + + /** + * @deprecated Use {@link #getIdPartAsBigDecimal()} instead (this method was deprocated because its name is ambiguous) + */ + @Deprecated + public BigDecimal asBigDecimal() { + return getIdPartAsBigDecimal(); + } + + @Override + public IdType copy() { + return new IdType(getValue()); + } + + @Override + public boolean equals(Object theArg0) { + if (!(theArg0 instanceof IdType)) { + return false; + } + IdType id = (IdType) theArg0; + return StringUtils.equals(getValueAsString(), id.getValueAsString()); + } + + /** + * Returns true if this IdType matches the given IdType in terms of resource type and ID, but ignores the URL base + */ + @SuppressWarnings("deprecation") + public boolean equalsIgnoreBase(IdType theId) { + if (theId == null) { + return false; + } + if (theId.isEmpty()) { + return isEmpty(); + } + return ObjectUtils.equals(getResourceType(), theId.getResourceType()) && ObjectUtils.equals(getIdPart(), theId.getIdPart()) && ObjectUtils.equals(getVersionIdPart(), theId.getVersionIdPart()); + } + + /** + * Returns the portion of this resource ID which corresponds to the server base URL. For example given the resource IDhttp://example.com/fhir/Patient/123
the base URL would be
+ * http://example.com/fhir
.
+ * + * This method may return null if the ID contains no base (e.g. "Patient/123") + *
+ */ + @Override + public String getBaseUrl() { + return myBaseUrl; + } + + /** + * Returns only the logical ID part of this ID. For example, given the ID "http://example,.com/fhir/Patient/123/_history/456", this method would return "123". + */ + @Override + public String getIdPart() { + return myUnqualifiedId; + } + + /** + * Returns the unqualified portion of this ID as a big decimal, ornull
if the value is null
+ *
+ * @throws NumberFormatException
+ * If the value is not a valid BigDecimal
+ */
+ public BigDecimal getIdPartAsBigDecimal() {
+ String val = getIdPart();
+ if (isBlank(val)) {
+ return null;
+ }
+ return new BigDecimal(val);
+ }
+
+ /**
+ * Returns the unqualified portion of this ID as a {@link Long}, or null
if the value is null
+ *
+ * @throws NumberFormatException
+ * If the value is not a valid Long
+ */
+ @Override
+ public Long getIdPartAsLong() {
+ String val = getIdPart();
+ if (isBlank(val)) {
+ return null;
+ }
+ return Long.parseLong(val);
+ }
+
+ @Override
+ public String getResourceType() {
+ return myResourceType;
+ }
+
+ /**
+ * Returns the value of this ID. Note that this value may be a fully qualified URL, a relative/partial URL, or a simple ID. Use {@link #getIdPart()} to get just the ID portion.
+ *
+ * @see #getIdPart()
+ */
+ @Override
+ public String getValue() {
+ String retVal = super.getValue();
+ if (retVal == null && myHaveComponentParts) {
+ StringBuilder b = new StringBuilder();
+ if (isNotBlank(myBaseUrl)) {
+ b.append(myBaseUrl);
+ if (myBaseUrl.charAt(myBaseUrl.length() - 1) != '/') {
+ b.append('/');
+ }
+ }
+
+ if (isNotBlank(myResourceType)) {
+ b.append(myResourceType);
+ }
+
+ if (b.length() > 0) {
+ b.append('/');
+ }
+
+ b.append(myUnqualifiedId);
+ if (isNotBlank(myUnqualifiedVersionId)) {
+ b.append('/');
+ b.append("_history");
+ b.append('/');
+ b.append(myUnqualifiedVersionId);
+ }
+ retVal = b.toString();
+ super.setValue(retVal);
+ }
+ return retVal;
+ }
+
+ @Override
+ public String getValueAsString() {
+ return getValue();
+ }
+
+ @Override
+ public String getVersionIdPart() {
+ return myUnqualifiedVersionId;
+ }
+
+ public Long getVersionIdPartAsLong() {
+ if (!hasVersionIdPart()) {
+ return null;
+ } else {
+ return Long.parseLong(getVersionIdPart());
+ }
+ }
+
+ /**
+ * Returns true if this ID has a base url
+ *
+ * @see #getBaseUrl()
+ */
+ public boolean hasBaseUrl() {
+ return isNotBlank(myBaseUrl);
+ }
+
+ @Override
+ public int hashCode() {
+ HashCodeBuilder b = new HashCodeBuilder();
+ b.append(getValueAsString());
+ return b.toHashCode();
+ }
+
+ @Override
+ public boolean hasIdPart() {
+ return isNotBlank(getIdPart());
+ }
+
+ @Override
+ public boolean hasResourceType() {
+ return isNotBlank(myResourceType);
+ }
+
+ @Override
+ public boolean hasVersionIdPart() {
+ return isNotBlank(getVersionIdPart());
+ }
+
+ /**
+ * Returns true
if this ID contains an absolute URL (in other words, a URL starting with "http://" or "https://"
+ */
+ @Override
+ public boolean isAbsolute() {
+ if (StringUtils.isBlank(getValue())) {
+ return false;
+ }
+ return isUrlAbsolute(getValue());
+ }
+
+
+ @Override
+ public boolean isEmpty() {
+ return isBlank(getValue());
+ }
+
+ /**
+ * Returns true
if the unqualified ID is a valid {@link Long} value (in other words, it consists only of digits)
+ */
+ @Override
+ public boolean isIdPartValidLong() {
+ String id = getIdPart();
+ if (StringUtils.isBlank(id)) {
+ return false;
+ }
+ for (int i = 0; i < id.length(); i++) {
+ if (Character.isDigit(id.charAt(i)) == false) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns true
if the ID is a local reference (in other words, it begins with the '#' character)
+ */
+ @Override
+ public boolean isLocal() {
+ return myUnqualifiedId != null && myUnqualifiedId.isEmpty() == false && myUnqualifiedId.charAt(0) == '#';
+ }
+
+ /**
+ * Set the value
+ *
+ * + * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *
+ *+ * regex: [a-z0-9\-\.]{1,36} + *
+ */ + @Override + public IdType setValue(String theValue) { + // TODO: add validation + super.setValue(theValue); + myHaveComponentParts = false; + if (StringUtils.isBlank(theValue)) { + myBaseUrl = null; + super.setValue(null); + myUnqualifiedId = null; + myUnqualifiedVersionId = null; + myResourceType = null; + } else if (theValue.charAt(0) == '#') { + super.setValue(theValue); + myUnqualifiedId = theValue; + myUnqualifiedVersionId = null; + myResourceType = null; + myHaveComponentParts = true; + } else { + int vidIndex = theValue.indexOf("/_history/"); + int idIndex; + if (vidIndex != -1) { + myUnqualifiedVersionId = theValue.substring(vidIndex + "/_history/".length()); + idIndex = theValue.lastIndexOf('/', vidIndex - 1); + myUnqualifiedId = theValue.substring(idIndex + 1, vidIndex); + } else { + idIndex = theValue.lastIndexOf('/'); + myUnqualifiedId = theValue.substring(idIndex + 1); + myUnqualifiedVersionId = null; + } + + myBaseUrl = null; + if (idIndex <= 0) { + myResourceType = null; + } else { + int typeIndex = theValue.lastIndexOf('/', idIndex - 1); + if (typeIndex == -1) { + myResourceType = theValue.substring(0, idIndex); + } else { + myResourceType = theValue.substring(typeIndex + 1, idIndex); + + if (typeIndex > 4) { + myBaseUrl = theValue.substring(0, typeIndex); + } + + } + } + + } + return this; + } + + /** + * Set the value + * + *+ * Description: A whole number in the range 0 to 2^64-1 (optionally represented in hex), a uuid, an oid, or any other combination of lowercase letters, numerals, "-" and ".", with a length + * limit of 36 characters. + *
+ *+ * regex: [a-z0-9\-\.]{1,36} + *
+ */ + @Override + public void setValueAsString(String theValue) { + setValue(theValue); + } + + @Override + public String toString() { + return getValue(); + } + + /** + * Returns a new IdType containing this IdType's values but with no server base URL if one is present in this IdType. For example, if this IdType contains the ID "http://foo/Patient/1", this method will + * return a new IdType containing ID "Patient/1". + */ + @Override + public IdType toUnqualified() { + return new IdType(getResourceType(), getIdPart(), getVersionIdPart()); + } + + @Override + public IdType toUnqualifiedVersionless() { + return new IdType(getResourceType(), getIdPart()); + } + + @Override + public IdType toVersionless() { + return new IdType(getBaseUrl(), getResourceType(), getIdPart(), null); + } + + @Override + public IdType withResourceType(String theResourceName) { + return new IdType(theResourceName, getIdPart(), getVersionIdPart()); + } + + /** + * Returns a view of this ID as a fully qualified URL, given a server base and resource name (which will only be used if the ID does not already contain those respective parts). Essentially, + * because IdType can contain either a complete URL or a partial one (or even jut a simple ID), this method may be used to translate into a complete URL. + * + * @param theServerBase + * The server base (e.g. "http://example.com/fhir") + * @param theResourceType + * The resource name (e.g. "Patient") + * @return A fully qualified URL for this ID (e.g. "http://example.com/fhir/Patient/1") + */ + @Override + public IdType withServerBase(String theServerBase, String theResourceType) { + return new IdType(theServerBase, theResourceType, getIdPart(), getVersionIdPart()); + } + + /** + * Creates a new instance of this ID which is identical, but refers to the specific version of this resource ID noted by theVersion. + * + * @param theVersion + * The actual version string, e.g. "1" + * @return A new instance of IdType which is identical, but refers to the specific version of this resource ID noted by theVersion. + */ + public IdType withVersion(String theVersion) { + Validate.notBlank(theVersion, "Version may not be null or empty"); + + String existingValue = getValue(); + + int i = existingValue.indexOf("_history"); + String value; + if (i > 1) { + value = existingValue.substring(0, i - 1); + } else { + value = existingValue; + } + + return new IdType(value + '/' + "_history" + '/' + theVersion); + } + + private static boolean isUrlAbsolute(String theValue) { + String value = theValue.toLowerCase(); + return value.startsWith("http://") || value.startsWith("https://"); + } + + /** + * Retrieves the ID from the given resource instance + */ + public static IdType of(IBaseResource theResouce) { + if (theResouce == null) { + throw new NullPointerException("theResource can not be null"); + } else { + IIdType retVal = theResouce.getIdElement(); + if (retVal == null) { + return null; + } else if (retVal instanceof IdType) { + return (IdType) retVal; + } else { + return new IdType(retVal.getValue()); + } + } + } + + private static String toPlainStringWithNpeThrowIfNeeded(BigDecimal theIdPart) { + if (theIdPart == null) { + throw new NullPointerException("BigDecimal ID can not be null"); + } + return theIdPart.toPlainString(); + } + + private static String toPlainStringWithNpeThrowIfNeeded(Long theIdPart) { + if (theIdPart == null) { + throw new NullPointerException("Long ID can not be null"); + } + return theIdPart.toString(); + } + +} diff --git a/src/site/imgsources/hapi-1.1-structs-datatypes.xml b/src/site/imgsources/hapi-1.1-structs-datatypes.xml new file mode 100644 index 00000000000..04e57051bef --- /dev/null +++ b/src/site/imgsources/hapi-1.1-structs-datatypes.xml @@ -0,0 +1,2 @@ + +w=vbt}-o~$J*Awohz0vRJ55ZyMg=GhV0TzELZWFQryA=`B{ z2ay;-!;{l|h!sL;jEMVL8)Ra7;2>d1vlrBzeMj(l;MCs(pa>9Boy-kHPb^b5VgWiE zd!VsaI))JaI^eRxVQF=M?9Bvl1fPaRFIcb4=AVAmEYa4Mr&f66iNv>TC*@OJtp8hx zFXj8wr%&&go3Eo_FGChQ*#1oZxZhRnl&l*#v<@xn+83$G&{rOGjrRT1ZOMmSwVajm zb9SQ2;Yae)#s+IzS{g7H_uz-ZPxqG*-~@2Ca%yUk0kJrPh)xo)6|4}q?KVapA-|K* z3EcqE@~O16RAewBKAsuYQ{C^@)*$FeLqBBQ2;oz+sOK^kS_NVf8B&>8ea~P@4lI-C zVdG|qW9VYFwhAcNqr})yExEKw0B8@qF@XIjLGivFtfENy)zQ)MyPE&MK;ry?T_Iu| zcgnbK93q89QVb-+1BKYvWm8M-JS)0{&?Y-GX(C^PvE3VdsrSfnOFJW#({XF! zk17urR|H_&-&oOuc^CEx3!S|eH2J_x$%rh>ZzVp_|m)+LKnQu^2z z{xw=BM7(+$KW|!gt3o0&feZ%CzuZ4#^DsVrIjRho)%vTUpFd**p!~quz`y`A(sHY6 z;a|L3ERjm<^U+f_SI(EZ&@+Oz+XGhCVCdY2M@N6NHZ!}+!V;8~>=O9XpcPorR$y)4 zL|echL3>hKJ-V!L7N9P`s_|uHWPmpo2b>Sl`2yLgUFQ}@qU-c4_nZ-jXwZhd!iU&$ zLE?3M->HYG;GQ;$I?AD4_cG3|kz$>cso(`Esdt%{vPxPT1}06k9wVpx31;4~#ujXc zIpBjCxkD }=5)Q@bn7TS^sE%GuP*l!Ir3{h0L2D4I)a0G z^e7CvI$R**@$pM6OD!!dp32KZHll##MSze0p|tcdEUbs}W!2S!0FCErmE-iT*}?Y! zA_ZEnk$2h+)wEs)NKHPN`=49CD4DBfxeIYE=};(2^oK&cJ(0cnS0n5%-N`M5v-wXI z4XUbpOiOfJF)*dngFZC*6A=b>;xh-&a{EKJBQn!QPWCu6Q%vOh1=3y#g7pf>{v4dv z30z1PS-6vNTDXBlCeVyR6ga@ofQ%c -&8o>QFrfRhc zsuABnPA=z LS$U(zLO-@NyFNZ0h5HS#_^r!zGb6&vUZK-^fY zYj*ugtfzGmO>Ekw%ADhkQB|O{vpd#Di?d)^BH-WVzCIOpy}H~iht07UbtiK{LIQ*f zMY<#SA7p6U)essUco;+lIa+C-RkPEG2@^{TQe~+249d?3F#n;zt^^bm6u|T=#;C+z zTx{tq C$*cg2W%BQEm z$|BAo?3LGFK0_QEXpdw<#A%rSN>+^`5O)@qmS3TG#3v?xfWSHsggM8r#)W0aZNK$o zK3iHP;R%l8vk7G}J*?v=Im2e4vJoFrWYj_Id^BpZ_=zEz@z9)E4xQQboUzTO8x;$6 zF(j4jp+xde({Aq9Z|?wyrg?XxncrWZw7gK+(AO82g^@6ho)4Lxig`Yn<~uZ+e-;=2 z9gYH0R2C{1L)iJo)j1@Fe4qJUk8(?_CIzNRl*QQB{q}FN-9u=v6wfOS$r5D);CEb< z=70zagUb9 eHycBcT z505%%8wP?03ZXYKiG_A*yU@v)SL_H;ANK|;xpOba_e~_}fjmP$LeV^k!JD8`d<+56 zO2o^-l%n*w=hPxK^`AT8Vj$E|$y^)|t3(9D27r>z4oh#@z~0VuwznJ%hS*s7$f=j? zWUqr`bs&cTf)y&4SQru#RyE@H0(3ZXoqW(9qNAk^)E1vvTf^`I-3{lY&aQs?J=8~Y zb9X=Nfi^LmP%4MJiJm$Kov~f*TAO}gI*^SAA)oX5a@*5+)|X^23G;;-D |G*D @?yqt%cmGiYqCE&sB_Pi0kaL^fy$1N;UG3)#8A?8zCs1o0 zl)#aIcJqST2ef09%NZde%s?y?LheT#nK*Rw{ll>`^?8}^^ZG2 R1w)p~Z`#k(Hpt`+2@w#aA!FdN;N5^5|0V!^! zSE*{k`ttZt#xU|+nf@x!u}k7uS2kSiw+RfGsBu;W@sVXcW)aM9wFX34IFQw@{ScKL z?4$1x`u!&?Py!mWgZA|1Wc8z#LmSbFb$e9=Ke${sXsM!x)}#T1#_9R=b$-f^Y`@}k z?Eg0sh@dLIJxf>;L|>hq1q#M9c^?2uIIAJ12L}jXNV 5aF#=}+{zN4 zuZj FPFqe6qeu9d63oqa+fzx9 zpP~b%YF!TdFLAJ@Gcq#Rs@MLL z65 %mT2k5JVd4R~cWJPV~Zmh1Zo*lyn*h4xD+FFG(V_86h!jZ2? zP^Ehi^VV_PVb>diG0Lh_6$$gf35OXbQ@zXjE prO!T8Lfk?_NMME0G{BB`X(JT8a;UtwV@ zUkff~ZgZ1u+WlB3Ic+T6kmReLS%LS1EO#}gCUkXZx-hd!<(;!xSX%3wCx0H^C4VX_ zI}4RI%kwPYs^T_IU4RR9_c^_2t5qCJEba6QeGRpJ26))chD#*)ov~mQ?!wv7-F|rv z#Ieh8^~jC%gX);7Vg%0&u0JVZ>DI85Wx>7eO8aG}v(>C;Lqg*tBeA*8Ji4vsu`>0x z^Js(LqZA?~m|iE9@E;rAy3ONyWC3=x90>f!Z)3Nb-*mgIv{JhUBWBzaifnr3>XLQE z;S9;IOoY<+>FM>2jGE!(j6%039A9hJ6xHYl>IPnnGBNN*aG@D8A?N85E-nJlCL9?Z zot>HS^6^1MMn-;6P5bE qVreTOkp4idGEjSaD%J9 zIIh2DQyGmOn5;$ox{dzg_nVqvtv>%I0CrnA*!nQV*dk{ubl()>((BcVi;Ls9&BC{S zr)BdI5_?#H+!Z>Wut%JHfTqD;P- Nb|GMB2-U1rDX{j4 z1n O`r30$GdtXQq^qO^4M}ni75=?x?g8V+OH#L6>q(f=zpCHzCUKen`X`JX18rH6 zP$Bd~{)fAdgjS?7r>yP VzSZSr20K#&n{HgdQ91sSA2R@wT=FM{z$|% zcDvf&QK)`;J_2qZPNN0E37mG2&qj83&jSMk?*n2rHa0LC3+}uC2XAzKi28QS2l{o^GRixsiV69O&k0xqUn&Bx6ox zeSb*ydgW=MPasuZ56(|VcS-?2rbH+bqK1al4`=Nv2O3uoUFbPDl!RO6ce4!|{QUi! zEqLTrRU?AGd(@;_AxdQJg|iT^;+c*UB63t81Kg#iOI65qC9VRZiaY z<|o4BUxXo;v#ZSf{#{P;iYYN6Az|*Fz~F5*LCj^3pAvtpEiIpche3b5JslGlM`mVf z8VdH!r?x3ydkYH%IEYGr=T;jW2EXZb;#Q|q|C){oV|lQL{d)=n75nR#Y*djsIZRz+ zt-iiDU$Leoxj?t-iHr<7=zV2%b-&6=elVg?8`O`d05c4Wi12|! gN zKt=*nuuwA(FlA+4!4qC7l{;8yc(-nZ##cQyY&9<4tjf88N5x947+3`-hqLvr8r1E3 zA^5&`-#q%ZISz>Fpkfs?X+}2RA69M>AAql-@8(8{jg1XhrqAHp7vmSmGjJO8t@l`- zFf|ee28ObR#_jU)ytvpRy$$8PgyiHFh}Jf6 ya(oea!>6Z*T9Nv9Ym-4 m~td~bd<94xuf-~Zf6h}uCz z(b17tPEL;d=E(N3fxSIJim0cwtE*sDRn^S T1T#+xrCI&3N78z_P5E2w@ZET&~(V@YkGY8lKOMEb` z`q b_Pfz +h%mI+B$-Uj $|gNSr@qm(G2NT+~wcZbp~-QC??&%W;e z%skJ$GwYqX*K*y$b^YS(v(Mi9?9cb;CoL(0bMwJX1OkC0`sS4^0)f&6e@L!lz;7h+ z vKex)O4GO=+)wDEEGKl<1jPkP`@?mia*>zOIqfGwke# zgZ_$^PS|P5#r m>NeFUYm|^2nv}aLDiJstaAG zc;z>TnT6p*X#WuTgD4lavfTKK>l9x2O^@!T$^7$IS{9~FL<6Pq$H$gF1jz5{h*4QS z$aSk5oW+HU-Ud)f&MlyvYy9)&^zRLZRq7tY|Mw$3%vS{V_;8gGT*V|BBXnH`8+kp} zn^|^Vg^b}?>Z88c_unYGDU983QTwY{Vm>5`6q*#&{lz#TMzcxe_1$3J1g*DAoP=lg zE<6wWp`RSQAhQRRB!yVyo_=6o%ZN|6V4S3j3rRqXsTH Rjb!OKQOJ!+N#9_40;y%B=Ge2N&{w5x!`+H>M??&s?;ZkF)ZtlT%gCbh| zJx;M2t22Bi*a#&iE$yMfgSYX!w` aS_FrL8hcfVlJjD6;L<#s{2 zxVY%$eQhlz_rmu6OQ+%l5k9=hxbsKhOtF0uW0lr-asx@<3~`!u>^nz}m7?18;jT|~ z )mG<_0|GrDGMTE{@S4x;j-u-nJ&D7Tej^XuQnsezN?>_O;BTHo>L)Y`=)J z`7`@!#n}cgN=Q7!m!#O*hI~n*hfwkFPIuF2kzXEP=;vsZx4>UZ%#;JByp~S%PL3+{ zG)X4El5IS5&>wZ^iszSEKDd)2dOH>W@$_iu*N%&I(wZp#uR~g7H=keqrbI|soj44> z@96AY88t?n9huC 1Ah3kA za(k$T^sS4bMWB;h@Q-qLrWog$1d`!W&z8^5?1qy!+1S{sVJKXSFW8y*hkm#-#{5oo z)|#DrcVe(eb+|Dqq^|ySsXK1^vf2U>9DJL{{qWk14h2<1v*qRbjSsbgp=f7z+B!O| zp35|v_j@p}GQ+oxRy%V{i5)h)Ur ;$-?~^vPhQ zZM}IzbMwyS`W1^yhl9}Oc%r_ulwz)OLwjzu%5;f^U3&AlxqC`jA$@J``FAfbhY#Hv zUR!xRCR0T|)qGsmT+igqT@HvH?oC8f`UirGzkMDg;2CjL{a8n%*2-_@f^T<)&uv}6 z3SA^sRsETJl()4Y1rJYTfnNKnWOB*cuy<3ZYJq<9>%;ZoH^urSj=HDK2(QU<^g0@? zcoJLhaok>N$ss2kB7qOj3=IuQ#!Ef#h~O1C4Fpv!a*1#4p048H_Qn*L_9k*5BspR& z(^NIM1o$?b-Y@l4Gl6?@*y=S-FHYin2%yC$b=NK3R2LMDNs&OhQqxE>BLSV_quEOh z*51C8m1cC4iM*(lE%&ax?@Vku9nUYzEigPnLhjb69^cWSDCNmB$BZ7#o}E+qv9mH6 zE*83hP`*5qB#AXzX)Co)OA%KN
HFeNe zsljWr85kLPU%WQH{bTi*qx-3`3*VL;oqX2&?b9256e2O;**_8PpHRDOYF)x?rBaKbydz2Vx?5bM2){tM1S$2oyO;C;JaIq;`JK;spR_%$uQ8zd1Nj4sh zxvse2)XezJ?WG_N`r#TwoCQ;p6N@e(c+xNNrV$loRoQeag3W7~x5>#M%?S^S;Ex&%hA6{gF`%j*zX{sCd>6G%@Sr`Naa3P|Yn3!M@yfo=R z+w}33Z7$Z#AtJNCAoG2eS@J%ZtHD8ZmR*vX)$&WQ=xzO0Dwui5MQCsSODgfg|APqr z*M}_=s!igX85}~8ov2@nh=kH_a(h{($u=_5^73Z5ST<8w1> gY$AYV<$f{l7l?8X{Y@c(ylLyu8VNefT>XCN8th@?Z6O!K?Ehx|0)?_Hw0W z8YQM &abBZ6ghbs)3+U56xJ_x4Qv!1>9Z!dz2;LbcOD zKUg6|R%~OeRLXW^RKd~NIn%u6 =EC}V7B1PdG_$Fi?9=^~q-W2b z$p?|~_YY($+2$`Pq}0~d8co$yXDDQbJz#zR`AcA+q8P31)uk(k&9byYrXs^YwX?k~ zJg(WP8~bCCHN}?@cA7c)U*uVoB7ySOOI->pD=S84hZ{!Ae-p%LB?{I?i!*ucH)CYQ z(wE}hHDQ9p8XFtaZ`^sD#%sGe|1VSg{rQ59kx`OCt47^+eON|G@vx!XY=U=TZ7o{= z8H^z1bjFu_KWwN#PuzB~BT}73fTTT=O<%q}jA39nUsu7%C_}Z#;QQ*|1W$O*V~MD= zwV~Y1hK5%hX5-wp$J;tEFS#|R8LA~Fk?;lkDOaUz<$NL9 54h(>8z}*{T-2P1B6;G2_dpZqeX_R^>~8vetv#Nzdxa8Sk5(hJ6nH2^mcjE$oBs9 zm;3ITmXeY}Cju)WDk_6msqljY0WonVayI$?h)YOxey3s5tcoz79j|gMgvWpThQBaB z|0|>|mYbN%EQ?XACPx1)-jlAXw)QygVwOdMubh@-f^O=x$@0p|5jp;Znhr1c&(;f# zT7#+S9z7B&RX=P<50MoKB2&P+_f*>TbYDh5K%k<4oRN)zL4tp;gN=@#UjweTvMRWV zho>Y)i=6d)jOuA&Oj Q=MlTdkmciNst`S9Tb#1fRBA&)pX z6wb6QNJvN!*Ku&D;iuA=*jSAky^69jgtnPkVB4I|KA-*OuXl}K92^|((lvc*>uXAr zI@yitdhzt>Qyaaf8WkZceW})~{j|^c`FSj7U*#-ly6gzU+`Vl4LU3QerEHQlDKW97 zrKRrAA5?_6xVVX_si>sn<42EBt*xzP<>W-g#pj~UYZBf@vU;n!%kYZM-u?4NAzL+c zwAk4Cbl(thdA=w0fXmE3JKHqyBqk>2jie;po(++uRw~KGz|J1>_wQe!p>nqir#Sb^ z6OuV>21-G1h9?{xp_dnDeU a(;24Qf5H` zvn*UPDfBs2B*&E~^-(SEJwn1%aKS8DS=rrK{jJGrI&h-o muC7FmX<`6m5Fd3uuuDvyJ?^7F6?hjU8OfuU{jK+gumVOA%Y!H zQ@ZkP{nxKCo=C>jO-;oQW~=r6eBqf&=E)pG)fFr{iT_V(ArPOv+w@P)0>i_G4C7k^ z?JHU~ ETlu->5a?oI6pIhEij5R ouH~|u4CC9|+t-}$idVBdRnGJH&>7WJ zzP cgTmtCWcYRngBs^l1w^_CZp%mDMSA^dGBJGiUDF54 z Yba=7XEeN;FFpGmVT?pP9NXpj~LMuna?^KlYB%)j3%pXGe z-y%afh@OTP=R%*Kh;K5pNIG6>nnNOOgXfb%IGZT5d>I)Xoq06rEJaOCoerZ<=P({b zhH82yCZ>h0tz7Uy`Q|{<0Wf-hx?F0Audi=~-9{8Le-xCKDuFc=zkmOp0avz7O=)RV zJN=X51TT+YZcJ1v9jpy8iCo;ebt?n%5FIbCD#nFcb35ido7DbV@l{X5(cE!NI{H zK|w*h4% kXFi3m(lNzQy`#|mu9LxFK}8(4(~7Q7RZd^FiwH1 zcC(EkKp4%pe1~KWMo4+>PXrm_Bu50+2Wmeg&3^c1e_JU103>Ex%Y{;Pw}bgoS1z;h zG#~8yiE7QaC|@s^B*E%ZEqL$uB_KdyC|65KB8pvRXJ==%E0!s0@z1A&ud)s1S zZoa~1MQEbJ7KMoI12!b4U&cc@=s8l}HwlP%tf&xR*Q&G4%BPUYXysDoRl*_6RN8I4 zgY1b-#O$Hvb|Spxw7)q)>{0KFr)y{^YGg#W)E%Fy+Z^Z=9{tSGs^(z6*tNR4dQU^d z+}s>lF(K|jh|JTe&&$vM-PGjciHY~l%q-5F#1jLD&Vm?Ok*4BPdleQIZn{GqOQ(<# zqU&T~!3={Mtd^9Ldcwx`1NImsbM%T?*XzI_@Lv9#C|j|7_D!9g0sj8}>b6%fV± z(sT}h;>c>c4rQWfedwl~tnBB&K*s*l5GE}Fkx#`XC5yFJ7fc$JcAbTcTwGjTF+BB< zX(Cy4F%Az8O(2|49sG^rGLPGQumrWz&hGBJ%kz^H#&9kE6VoYQJ*}&CymY+l*X#QF z +TLue+@ycwYAj*LK3WXW{c_P$X_}+@xm`FFyrvZ zo<$4~D?>bQ_PTMW%y#Xb{nq3_Xn15~t2Y)QGCe_Eg|s!4KD{Xt#5r2EIni6-X}?lZ zg5gVWGlR)0$2h%ZYbe-C%qGNsJeB~T-I;A95pap%nsWI8g|5~9vP^Gp?@jff_3?>` zd>A;ysDB%X7KFY}o}R5OEe~P&97$hPO~!*YgTH@&AtZzf$&Qkiw)N++x8*nJ@c4TL z1>spQcKoid_w4VNkK!~Hi{>5J@Pe9q;-TgB*7QNUR{Ua_8%3E89 zt?DCgtNH5)OG`_3!`@fn@0|`-g|99zpj=LXrP~qB6_oJO_noP!1PoYIOf1oEWAtqV z^NaA9!tkB#TUO7XBcK#TXBYWvI##0BlPF9@MK!N71cmVZXAaD;EnowK9-o}(=;?)S zIn6hBbp_5f2hBk>xnu< zg46UtNl6JtGn1Et)qD!doP1ie(Eg3<*QFB@5_p>QK762acXtnsh=?%0jEEp2z{i)? zE{7Y^adRsl@j{h`EHEYDrKz7h$pkNL4%E=nP<`>@g` 5oH@WO89liZEWkX~C8 zjc<8*%o@JK-hMC1ktuVR=E)p&&^Vi Cy{di0C=2vH$18`R~p`&xGyl?3Q597In{_ RDZ?(IH{!cS0Mf5qAwv{EO?4K69TZwmnP)hD_ze9*TEGa{y)p=j}8MXCRDt?MS zUEba6=x*0i2+X;ueM|@`#CRYh2GL=pMI5-J&o7IKmwctU3%~kPWDt~5BuatHQ-M0d z_~%svLiD-IAU>`Mx)GtiwA6PJ%P%6|FVe)s19RS2UcYk-t*G^|g2V!USpC_|Gh5iC zCZwQhEwP!Br8wJAj|oTk``&qCU`8z%xnZk2%{0xqeTS!3MiQM7 uLIZPHDnVaYax1C?G+!wl?$}F!bqM(}M@~;~c z)nVqfKB)RASBI(6M~`~c 9EBdX+c5q8lIoHX=TXcH)y(^noFD(yCH zs;@Jx6 ojGXNWH6hfIefO8d zR*zihBb`cLGfHz|=N95uqG*AJN2SMMk3L5aRk8gsm&~U{135hjdK$|VltY!=DQbP8 zeGH#__&+GtJ>H;&-%62~k_io?CDVW@!(cnCG~)Z|$R0*8jrtzJR+ut?R^{QWQm@Cp zW*oHGVu2oIoXGVtyoZFM0`a6E)Sd7RB4bhJsJ{CIXLjnnB4$~z=_swX1`5mlKe*p8 zmB0LPIu7hPj~I>pRiM#8$#UphrH@!qxx!3vY w7V9{8L{`o=N7172s( z5-PjMk1Iq#LFbm&V@r&mJanCx!bzOkVN&W!f7RRjGw`0tJ%8&1^&B?KbqjPKe)dU> z&db=?`%!C`=&?0VabVVe{21zdap&*2!^^=UqRR`%wl~vGgI9AN3+K_--O)5(Sif?> z>f{jf82UTDj~12Ga-3DWXmERaCCjiA<;ujeETP k-HeKAA3k436=I)}lVA3w=$;JMcMJ>rme$>bq=CvA_Kf!Q_G&Ra_o>>}wRJydEN zwoS<@?Igl`IEA7myIe^p8_NXjT(}G2+$e4>QC!ekll+SMj D9M%gg;?b>&) z5k{d9R*t{p{7)O^g8%(z;}%yoPy8UE+pi|UC^BOEudVO&5jT>4rs1G^F)vZ_760|y zGi~2xlPmKlTgJJwI~z}qUUG=-J(P-Xi%#FbEHM8pyM?3u(h^ffEFGHupKl9|3eno4 zbZ$L7V0pPWeeh=zJ$eH5AyMa6saTXdqI(uM@oq3476tn+h7ehA(U^M%c8D<%8bRDn zPi(Qo^1A3o(pR)p 9p=1>ujnw(awouknha7$`WQd9rT}%>v?2b?? zShRex*O|@|g?Vd!D0!%U;?sc8UO%}xd#WQ7%7urK!R@6~m3AIoha;U6Tf+~ZyILC0 zp1i2h!%CnqO$cd= G!2NETHBoz4hr-LJ2%TT7K3(-MRib~^)!fOEjiDX7?FzxGNmq5Fpl7*> zjwL2nCVi{g|NiK^m#)%P_^{PVE28S^5b8+U=*?6uN#Kl 0u()5`TSTG@M9( zPRrfitaD@+@eQl9xZLoyrvDr2UWpeSv`Ddiy7~aa#dooP8y9@k4kITV`sA=dYIh6R zdsng((CT=%oV4?0k7-M-cy3h%dY|T87OMJ7>(WgH?Z;7a^`l9zURL7u4JAiX%rE{- zd@^L~_4ixJ!?c) k(7TN zAgM@e4#}jxg#7ac|ItDGuRXs1r@aUtBIMKG+289lFMaFy^IC&+*2_URZPxd--S)_z zW-(09{t8$t5RnV_)VQzqW_vw)DoK>|x{Fg=H6E*A>Z?#+3EqEUVLQWJ@jQ~0`oscP z4!l6U*sV%hS&9y`y4t&s78R!hW^s#KAgS-FPaU2!yW`$E+Uf;vMmy)b6p@-8PU*_a z(N(K!9s1WS5qwte^cB_l=U_1Jf#jQ^;#ZyX3l7zoypO%ThURl^|BDcM4x7*Rh zH-OWi{M*?Y!EDj|Z#eOB#aMDntx+RJ-dU0OcXFFDNAE3?ip9JIIW zd=3nKrP?drI-9ch$b7HRJK7v?$kfH`Ee;@NyU<)b%tlNU(O<>rcYHGgQ%PPib}Ao@ zSs@r>1v>$t*_mi!J(u A>Vvv^O1V zI0vxGD~HT=N3Yan$3?ZsND8M}6~i>1RBaILZ|0SBV$vfXxA|Q4y?%?V*5je6cWr9q zvs@RHtZZx}am8+`#cTb^mW5&GMaS+K159yGUAN5Z0*w9d_XZ5m-<#u_aXdX?Ux@CW z5}|EeKT2f<>NgyLiC7;ij+ChpAmMX)URp(4n*C`|V@ 7nTPZ-E^%0&uB=bMIGWwQ!wnYu%Hz?%1a>N3;kQyhO*9^0;&B8Ek=x zv)kl^?ILVX^38|t&Cb3<;<=+OZ?tbAAuT6`Pp(7Qq!0+))0bjCyGRG>hlYhEPWDP< zr|q-Au~xO0lAO7n=~$gH6ZRuomKWwOBaKbZreO+r?YE+J&y)939j#}HCccG0#W@nI zHYig(%Jw$ukPN|BlGSdnMweXXbRtyK=UQ< Y}?4Fz__uKCwk>{G5THsZ2`!&o7Dh37uadCRp z(yg~=k`tf5enr<_^O^b_6f}1+a;1A5vEwyfF5G<>m!+BiIb6%Rur2~H56jV5eEPzA z+ZMe$6$M4yh&3U=W%e K?3eSoPl_ zxc@u9{>(O)jnyhH1q-mv>H-!v@d>M~`kGvGvA~&~>0&((7W933JMCxIMV$oKgoRv4 zWWFEe7Zjw(4NW#Q3be>*0uO{1-8_I~!=4P+k7F;Msd&4(S03#wWO@r)?u^sE#$Ino zxTr+JL2Lc)*=;SLUiQq*LFY&^nx>r2D(V*%-x*;w)?2!X=N!BN1*5|w^)(J{7&d?} zON%L7 %91Wl3 z7f*KoFJWUuj1ljgba925i=E@d-Rb|HHX`<$!mBN(s@(2-04}uZI5G*3dwRTMKe1M# z8OW1jELHlL`f;AsN~wIBvLA4=K$7w1LJg;tMS8iCryRyZzhNe`M+L;g$u81hHcr@@ ztwWU3twOULa^B27MY(x)>BMe=dVY2Zo0_?0dE(rZNfMr-py*2_B+C{xuZd4`kuy^} z9lX$yD$syHF6E`$IqL7U!-1$cSeMET4B)ojy}oU(`!A4rS?#8?B^@w7|Ng&6p1?2> z<2S25R_f~l1NZw<6_l#P))vNq^;}HsCPL=ck#(bdO;y0A`;ZeTFy3p3SJ+L!V^ zQmUnJnrrVW5u!$HPT;T^jIDR@nwHwmZJA6Qn}3?f*V72Z8^j>fJTEg6|F~edR+=r{ z^OL*bhs^NN(D<`0dOiL#+z*@jTifkYg4$*}FTftwZ@CsqlFcW`52?ny)#vU?#T?Go z9QybwZt$Yy9S-S@ ?BDU 2%y9~>MeZvQj&zP;oFkdFUNK}Xszq$z@7fL ztdm&Iw`+ohjZJsu$eJh5o^MOaJ-~d)Rm}TKC`@u};n&5Gp6usWLgruBlo)SW%suF~ zTWK7;Sh9IZ;EZ{=H7RCfB$m+L+dCPUJAsjSe7EsztU8DZv8HtODwC5m{hfaNRu!ys zGR-4j{?>nTljXgzF!>C1Z@%9j0nzt#+jHlhbk0JY@FyM#&kSc`zVKv9lg_`*e~O!E z+>P>7YhUox-ms~0FE#Rf5HqASzp*pv7MtMdm!Hv>NCs+WdgdADipjRP;5R&?q__Mz z{5oz$YfR8&itSmKlde^oYAj)s#NzM_+FK_*BKuFC$NQP&c?AW7#9DR|QN@X0s?k1j zVa0RXoAksqt*!B?+h1e?yydlB5e6xX@8K4w!x_e8m1OZM$M(L_hwXwy1A@l0HTk~C z*AlAVzQ;*|FkrvSxXpBJ#@2oKhY4ZI{@b?RrsaPTRg1q8F-APPdU~ ncH?gOKN76ic?Ty1@IlHp?0Nx)f!!4Z0o~(P@>Sk zAtXK~@HYKp2 ;`~7uzRMBC5m&)>9 zEuqiBGz4;NBGzCCkOcPJjf<9}iZZ2G45nw_qCLGFunFiD7Ay7EK6lLd_@yTJ$T8Gt zRFu3CBzd*7Yt;McMR!25+SbQLQn7ren398EW8So`g-=cAKg-=k?!+It_hv^RtIg~G zxkFGFlA{;GDeM$bC`M4(04&l v~p+480++IV?8b%$;@+VdCN z`|ktoUbL=^EpALVCB_8i<^NY5h{RWXPWv>PnwmixUC>`n)2QTxj#67`Rgy^1?B?d> zur2==wNf*gOvP-}B|hs#Z0Pv9-@N6QnhhOo^>QofZbRF(!3Ai+AD^AEIqfg2*9TLJ zTQL+m?tNJ8Pp^m8>3*07;5kOkD&@4}n`~NcCFWCI3+>_LjwivdV0V9`J)8;2K;(gR zPB}uquM6l<{5yFeq9$k}AvppOF1f(llihN6r%KDY*MMTW+nH*!N;`m-0LAn~U1MB# zIZ-Kie*^m1&hrc6w?$(T- @zO0ylddM3(KG9Wt8~B#;PAGY4m9>y=(=1fzOcoj6l<1F*@DnVIwqszuY# z_9|~9=XYWUKv{9RN8b(11RC{d76+>euLB-5{_)0I0h0voBCiG55y7U9d$2m73w$9) z&>h*4n^|A)sB+x1+1s3~j)qHQ(q*ZkU;PKrx@{ly5x T-YjonoVb z*+xPwDo)N4=`BwO-ami-EDz<9hteq|8uq1-a9cd*GM%pbXfmAl5pbi`&aAM|%a`|= zwGm`wWG?$XB5$ME{h-4 p^XIQz-#gfxh(`9gH#P#ke#M${JIgk!fmU)a zAU>e`ZPwlV&G4f#u&=YDt)(AQ0y=#u5?($&tnV7G12 Cr`ThHMhRI05>U`@DVBIgB+KvDI{0Kz3 zFI9?OO-*fKZY~KNIxeXSypaYA3kz^tY9P5_&I3-9G&;qsw831hTrgw?l)3UICRsOe zaTP=9l@u%Ow-n)>l#qygb)vEq?g;V-J!9icB&M{5p7{X49R*l8z|nzDwEh150`vq@ z=olCoJ9EvMFtF9x45i#j%339KN7OR~(W5tG>CpH$0wPOCM< jGGLjB$PPju( zPEK2W{YwV*GU>*qrVMEHW{CcHoX)1-mBymmL<6n HCzXu8rp2b@0rN9i8!W1NQ%qd7rOzel{*AMcIti+_GgRl)C?BMX<^w;s4Q)9bZ zTSdWX#gI03J=-X48y{DvrlJClX*6DzKU!&@dlNdlFMY6O3iZ4HVN5{RjQ|4BadIj` z-& #%a4U!jzGZ0D)|f>BK@pRZ0;rGFHB1!w!W&6W)VkN!?G`+d1dvW} z>(=*7q#7d)IMiBO#52bN#uK_^!{bz`c*S_v!$?LMx@36=hcZ<8w{QJbEA6s(cXoOt z&Q6x%ZT hoa1ZPqX~ODP$9sR)5c28>61eq zup4|+t*}W4N3FfOR6`0%U=i6KuB)Ig-?nwr(}GolM2)|GQGvffTwH}^F9YbX?av<} z@Y>Zd7?upZQcj2c*fY9 h0Fqj^d}dLgZ4fNDQUWD zvC+qc truV3aAJo_NHo zb4c8 Lf@$NBJSzyl6C`4NC6U|Vm O7MmFaVM)0UCn9lCW>zo=?@dVil7G z3FTORX !{j&EncxL0??bS%^ bvt!Xv$4q?xdX$a8{2zX z?8m}1IvFFqZ|NoGo7<1x*486y?*0HD~tJI$!^}C&F)O4+!P2d7#nxI8Te{B zRU>vmTVgnrLwb36iG*U{A(P-=Bzs_IW~=!(0P))|&W=Djrj*cTXK%j*`5!()d pVOsLo47pmhZV)DXq1Zu* zipR8B8^nRAczU$eUE_LI=D3$)HfC^ge4OWg %z0x3}|$E8er zdr-mxgy!BX6}ETp-WiOSu|N!d0+{Kqiyu@kk9c{bAVEMt@GURrfo1em9t<|r1g--0 z7fO_AxnBD{5J*^9S
zoFLhvB7}N=T7Et%h=B6ZA4ItzPD4wv1 zIsJeBd E;R>^3EH^4;^F~@A;6}OrQ+VgLwEM~-w$S~fZV6(&AZ#ebC9Fw zpr-kyQuqN@|K4v*a&1%7SmT s_S_&UJ=LlipFX_; zMFvUgQ88I@)j5%BoTn$6>)Bx=2uv6?Dz>4lSv@>~LSXOmY- w8p!&Zp<0XNFun)>Jyk35hnJaISwSj#K*+%hZsYvRmIhmHRUoa1 z)^g&Du&^+4Qwht%%D>ie?{QaG7jWm>#Kd2Vi;FjTh3$|FxT_17o<6hrOVY0!SXgra zd&|np7kC?q@7{e?ZncmGmdjay`V*E7kX*`cyoDz(DhTMSp!PAFtn$muG!A4E7=bKg z0r^U`)Jy_+H7o%rYdoi?r&AB(?)k!`fjYu!{0xClPA&yE1>X7a=~HY7Z%}o-0qPBC zyX7eE(>g3Zzt5jrEJ^P^q^9-;fx!%fQcus9-*bY(N?apk(P&M@)IrxHbz8q@ZKUuC zgrP*|qs=Uh%CO_(W0KTG@11WAhUZk4UmiX2D_n+*TnIWru=6WG-3|+(N@52+9}FM+ z^&Nv=Ojr`w<_R=|%X!}X`-zBu>od!= dzQx5HKzoNrM`fY*t*WlJ z6?DHfYX}9qLV^=okKKJm`I~);MfaX6dw~2H!kg2&lSKLjJmhskp2h=-xMz{a#}2St z^a~7JgiNYGoTmeuXhClpZyGlrn=7b2=pf`bn%7<^QrSj}o&A8;ES>Ab4akd;z_NRw zz5 tGGAz?I{Mb)wod6(5$O)Z`?q!vhShN zcoeD*O#cIj>Wa)JqCh5M3Dp{?+TMV#AYnM BduyY{paJ1IJp%c}FL*OYJLe}GQX#LXQ|#})TwarG868zc zYD-Vf&N7ke9Vjv~L9?DL-xYVi;B5YflnsAj)ovTT(e8XJ9jL_`o0~JiKcEr~Pg){y zoxocdAPts1t^AguTAWega#E1v0c3 A8FqAk{m78f9&9V< +9>=dwYGhIEpa75j{bE%qzQ| zyLaz~=!d`g`0?XO6IEOeNS;t3R7z}&7TX5(v` 3VZo=SFi+gjt5rnqCgY%@^ju};;%e^gy$v;QhJ5-TaO~^Y*w8(GVg9cfiD3LC zKZv(HH#-YTpRQX$B_cn9`>BIl)Lu-Ot&9<>YiQiS!5OHoy?_6Hg|T_iE}7s;Ndc@= zq)-*avMry`v5rBwnI@Zj6ROUk&L2~UM7%aMFrn|eC&)hA>&VU-W;{s+fCDW TH}P|Ckug87PjZI z@h-c5X65Tcrm)RVhB%QH(&idq4H9RbRdLu=Kwvk5$N^r8l-KH+o9BW+JS00idlTbY za>!}7`(+YnhjU$ATtdRb!$(Wa 5})iu)rQNdTk*x@HizX(KA3pUlHxOU)?-%^ke<(@P`pSv=rnS85zqb z&uTAE#gQ8$C}I|e$v^ d$tXP<-I)qtwD!ZPLWC3E$m%qo%Ith`wI-@nom zjh9fP!3HWJq}PRLyw+XI+si8r63-JwckobN_sgmZD7kVB!S#6rn2R9Z4}dP%mdpRy zGX^@k3~AfcU%%3ziQxIpDJrhcO`-RGRlxoR7GytZD8TwAE}|xqs+t=o6n6{XHQwZK z*q# OA#IY#C#*+IZ)g` zEqYfz+0;`--n79b(r>I9497q9kl5xhY(Dqzub;{*o{uhJ=IFiWCAx#Ah*tfT51%q* zh|7fGB!%IvUlF>F)hS}^ ;*qV-ykNDwCg5`(j5C87aHc&V8 zJvN=W1toAw+9SvKs0y6^HeHveR#9RhlJHLWK?^hH6G9PmhFDH-wrKumxz>N~)c$|8 zT>rZdRe1MNO3==FY%oJykMoG;Zo^Z>NCdSx{#Jr~3;h?K5K`>%S=N{+F9oJVc)nif zIu6WH|4nqGyY~3WpIwx%Bf&pjd6Qw4>QB)a9gv^k3q?TVvkCh7#but*Q vM2K zxD)>0ldgmy5BragMo_@VK#msi0Im{8O49D4!Qa+Ug(J94H%z*N&(dF}a7v@TqZy |!E zptHU$Pq!cvxkFa+6jp*O(-W;IY?D8Qcj6W{9+>yN*S_=EEG8{l-zYSFn0I(L{VJ6w zEVj=H_r;S>4u=E!_Yd5YZ04{=F;GO%juR&cZ4TDH6bEn&T~;;iQ}zMjNiIzN6EP-s z#8tWUne?ZLcLBFEADdH;LB>GthyAm1P`jme{T@J>x;pJO{=h^w?pW8hL+@8}M`PNG zcxs}>PfH3RJ(AAqSxe+E!WGo~h1xk1kFV$$zqETYW#a1wHXYj|=1)KGyg OZ>XP9qhVY!muP(f=l1? zk=>bl!DLjHX7xOOa=p+jblTBBaK(4pG_O2;Q1bcsvjgH!j@OQ!FB8x91&SNdJ{mdu zv4`M?%a5{jN|AVD{PtW2yo2>QC9yBo>{pNE5Ds`pj|CpZWx8u}7!VsMWGdl=4>GRD zRgV2U6<*QlFikd^$k>k?h=!NkYh%il&UX?PV)9N5Y0LlD5QOt(#4OLoO()hWhc*jV z2NWVAqkC+m<+{uTx_9&2QPMPPc@YbAVem*&+8eajNU$FAQbm3HO5w6~#^0LX>R@v; zJv;dI>3Su;N67JAGqRf2D6YY8_@U3O)LAQQh8qK3a#@8&YP_>~bYwo6+UoI`r)i4U z@oQr@!ypdauzYZ>e=9XjKIt}^!2O@j8pEdBd5_Ve@ZC6KLXO7|uJ`Hqn^H6I1VrQ! zk$F9v{xgWxFd5KToNXMJsvBS`7;YRhn~wGDUW@a=Bqa}HWSO(2vZ~tbK=;=U|F=Hf z gLt#~+>MEhI7Yo5=n+%q<#nt;FE2T4$z{+u6+sw=|mfQn*i# zd*Sf;uXsX*V-%iYSJ_n4Et^N5d9s%*EYE~7+y%HrB1a~8U9tYgEVeOjx{)XyT{vGm z*)|*o^I3r%c_o+M*p{x!+h=x-;QZs}d3gmi7Q|HiZ`x!u^-|l?-U@GzXs_C5UC~6V z5wYl+(GTIN>sQR#Osw5hpl7~3+HuTD&ENQ!cPVt;#8kq}YE$m1OGS~u;7owogyG=Z zuzr@ =`$I8; z#$1Waqv#iVwVuyq(#ga8{K8h28kzXl XWYb zb89rw%{)DlP VfiNTP{&)|F>K1Xu3;1IYoa!227Y+7gZw0P%w-@6Xe z#;y_E_*MY~J8{3i{aQ_XK&|<_iVs*0#N{DG={M35{bricYnVBAEU2cZeBBca|9*e* z-AkiNHk)9s@z5?(*%k$MrD4YJ{e>5BWK&>v;F*<(ws!CJ&sw1FyQg`Mfl4)Mw@r z#;c#bVpG5Hg88v9>*MK_yBWBoW1l;P&Tdb0GeOV9RM=UAorRaBd!?x)9uDA8zpe}) zl^Mxr-Q(@n-6$$%U+(n)Lp?%$gfL($!AZFCD!AM@;0ZJ4&)~QaSZ; y3?_OpCS7Ct#jwTU;Su~>_%EzXta6a=MckY#A*?C3P-vu(@@UoW z?qS!Vqh$A+_J{n`v8*L}yXuFN0nWoi`OUo*+e#F>^wtw b>0bTcg`uSj4P2E6N1tDTo>u~j}D6~-=-hm?7a`ZjU zWF76aXVwbA$Fn;2pSXEM!x0>vq-EE+QAm5JSh#-P!^g3~B=NXHE751@qcy&t-KBDX z!j3uXA^369gDtAB`2q!Rnua+E kgXd=h}xgqB^H!h=Y79-3uYi^BiW`nklzdlA=c5U1}M 7S*xDZki<}IC$E&kuSfk|n4h;gal@OR8qwCrY z0`WCG*7=Jkg@640M3RxGJ?@l#x*%A-@u$Y)i~aEb#PTClXe{eJn^2{P}^OPZbgt(IQ9xyn7B)5!n!z~YPRPSgEr})tlxkB` 2zoN~=3oHPc)owjO@&@FCy{Ag%~Bi0sN>D^D7#(Pj#xxF##!Hx^TSe} zmKRe@D+%XoxMHild62KDmB*+<8;|`FQxey=euWalX?k4}UD=1Bt_eYD>F(4fuI HdgBE%nlS<5ITfBtAV`aO>aC&KynB;ya1 zbKL3M!x70=F$LGNz8)D3O{G#yHlFe+Z&wZK31Ze! d@hCqwr5;vJq0_Cq?dXPyWtZWPy7o9!(Oz%Zo>VI}RqE6VrH&Or=xmWi z^i1?q{SQxWk{e{9^ABCqP`}}HA_g!xwF;g8UK>`MRWQJiuo)P7Vu1Rz&JHh1R$!%` z2+_rC_IJG$ByqF(&18KVGMK=ZEbQ%@zf+35+5lPUpQ)* `Rty;?(|!Hd=NAP0=nTq4|^aFNFv}6Ei_bcMaN(_U1qiL zWw0Qw|IQrj^IJMQH+FU|{C?welXG06Jxs`rB{EnaFTVo^U@WX|6Sl=Zb7T$v@q;{3 zi6l^Gcx+4;4hR{=!!8$i(W)VtfC~|_BNWD{L1)NDNr?t06Z;&^T-W^aO~*K6_?=6d zn~$D2Op|bTU_?7dp>Vz)%RPoZ_RQ869t;CIoN$&69f9l&zk2lwj!Tk4iz_W7qnG<| zw(+aOj5ndz1{NXXL&nX^zf8Ag;1r85w6cYSgtpgm-{SK=d4lPFTu;6Yz4p4XF=8M) zEnQuMdE|tIzKe?=X3pOo?(Xd&kF_D{059M}TN`i JRu+2N3cEDhGW@q zWfL6qf{p#hAi+!JG-rSs0Pn~E(MJfn3v7;;PyMz$KeqJp@_NY5eivG}z1+>n3l
d5XmObH`wt2ZC-@d9hJZVlZ{DUWLFhF*r3^ z1SV-~ZB1zWO4tWb${Q5CY+r(cQmd+-eev^4fOad+8Bj$y!^#XDm1nU$)~|af%Pi+U ze_n P0JS!=4L3NPp*2VKqm_n&;v;Yz5$L+GgJy%*Vj2N0qL{aD-=@{n#C`et zwRLbX3}h_Ap`oEgCL^p-V6I!Y6qJ;HKv&-t m@d?dI7DKJLf>bS9a`^vHnjb=N*n^|M&3=B_l;fWRFCN2$5t}MzTpEBBhH& zy4)dqq(L$=vq$K*N0jX*T6UsxDY7y$L-c!J_jCM?<9Ysk{-UGvaGuw7e!t((c)vbx z&g5a`jtN60DE={<%awJ8XU;H957nh$Bsllw%cRgyr~}%Pu^1rS)%)Q?H@buln9#Zj zIL8xn-fhjzLD<`w7rP;bH8wSgD=R<2Ha;a2{~#eTacg3%l(kvDwULoJcCv|~VcNy~ z?CcO|Y~!=Of0RDgc%AL40K@`&0EeZT7ryPDXlJo;aGX+9R9u|MNr}wO6_=BfV`1q; zZ%+)iHW+7BTNrzv13AoqM3RFZ)Cn~s7hlURR@RB>%AstuF1yjsZ37g<#t^JGsDJF| z7WCweU0tRBzEE@i*OSn&u&l9UukaggZW9=|7gSPG$}1?CX*hC#iFRn==c_pm^N@n# ziJx!FE;i8)-+2-`4&bN^Z7?E{n4aRZ20iDzg~e5f2C`^shkYY$)r0Oc`QwL(P&$x~ zh{D1`gYRUrDlacDmPm54WHhO@u`yu(fdixgW2Pi%$tI?zSr-oo3kSjjU@JGp?t%IC z-TpvdG (Gg0=$6zJo<>zNWoHf35Dbt|B@q?tG3*^%nz(+wP?d>}7tDuvU zm!Ge{dV9Nb21Z_==$<)~TTr0af8^SLEM!4$mSS=#Y06AUh bl|d+ zG-K%622XcpXd0WDJ+>+JBI{~tr9$8cU0ZEGP}qUt>FjRzmHOO8t3=;C{{`r)>hYze zhwbg{4J|CV!}ydFDx5y5U%PhA }VmObZ`R$*yk)P8<639IyzJtf&(yVuS*D0 zJ$PA3O6noy`LeQtLqoANu0oPDv9daYg~Gtd7;GmbEPNGuclxz% XeM)zu%Ca9q z5e`R2m_qsEAjUX7KM)56_aAW=mX97i+Eel5$&-u3c4t$}YNl~>63`Xi8vmfi4=_=F z%w0iyeRh3)eFX)F6j#~HZ#WxTAnLPla*9PmuTHC};SCNBrekC@Ug&LaXTav8oJy?v z#{{FH%Q5;w!{)_AwSQC;D=;f&W@bXLy8q-P(Pb?e6b1-AyXMgK13sQWEz;A~`*-Zv zK}+~O|5~c3v@|fDD{&RQ@_mYWPZI=0N!R6NWo^(wHAhqVi_es!#l#CqSW*Pn#k~I# zA*eCed)E3QHZhJnP0Xnd49dBQD;+&L_sQ*jLuV%oJ$-^W_kh!GcJ_wXuNj*{q#GQ8 z5>bYk#Uvzx)YDXfEzG^a^t;|Q^XC4=KF%ERIH6Y^7fK4Hh5|P3kQq2crW^V)KMRvO z2xO7|xGQz4lCc>tUt0FRd;h)_!?-Tr-*DYV6r+Sj!wVO}A)VSEt)yiLR{! SLEgYfwm+0k%2FK5%FNsXF7m_FQO|(m2NkL6^$w99a@%wZh~`B*MvWP{ z?@gw%p W~8PNjO-{1ma|Rr&o@arY-i>s~@vv!&_+ zYe>tC;Itk^Mg}Avxt@-vf| A^erN? !Y4sp8!oJ3K)fOM>xqyfb*9T1)tgsRi`Q{Kao0^-qz?nb-0nxy~K%guv z5^)cM(&>01ggF2c!kE#W+L=&X_$Y%LXTdE`(3VGz32|7lJA({7536pZe_QM_^_F zoJB|IhnW!3(J^=)pb?N7wQmYmB7orIuOxT&4;g#eauN$`Yx$r;t6N#|it5Js!9#>f zPR@yB5U(5Z_%X+)8n4~Gy}gj4LU4$?&wlwk_8LGkij4GPww9)TU>-aaMx_IA{MT-- zITC)XL(V!ufnf{O_!sGu+Iz1hQN5wI@O0KV8?Vw&J#m=oB{fI%Zx`R{=6sva8T`Yw zk#r{QSx#PlHPW>-*^jswIJRgKw5VLRIBk58FWNfz;xJ!5sYo#@?-T7D72#y%hUhMz zdsaF9KH~iUgi8ncuq$l*{>{wG%Y?z^Uu$cPpFZ&b_M?E4_wL 8pc$-*UHYX)J7%`ur?WZg@=bz zuveTJKOs@uB3Lyls{nnX90CfsvcsM7=FH4EkmMB;V`lyeMMNcImE6H60NW4|7e|Np z$gAWoAT7;8MMVX#%6e#+S3t7nYJQkY6>C+<@!QI8Kh*QhM&%P>PNYA8pk_5#V56o% z+jo-4wA`Xtp8tubex0yc=xEWtyyvN-X$ZlbAiCRK&%RFB+@@sm`=3ODPoHa8o?VjB z|9UT5t`}VuZyE95_6|H$E>vW@KTyDeM?$Nsk6v`CQ-Xa=HqeD_%NccsW@e|Vs;bm? zMeWDQd=u!;->s%*W=8m2FgRGQxKB-PQ}gWZ@7Ds1iGU< -}d$o;j&}f5a!eaOf@y{^qn|%t*oNL2wHW^Cddp!cXxT*;<(>f zm+HeY4LO(1>=Iw iq4$Gde=VIy|i z+dTHDF`*(q2YUJJSf*unds_0=@ygJ}Kpi)B>V7Ku%Xw_+?px;s{iMp0^xO4|r`QIE zShWvpko}{YxC9>XDenQa^e?In#N3gWadf)`pRCKwwnI!3!t$&VZC9ksJAPBCa`??Q z$Vx~B*heN)9ip!uDly5bnr~>K+o@(HDY5&R(uy1lcYZ^)_Vqyf_Ale}nievhKJ+U8 z6c{_zML)D{ XJDCBlT^s(531pApK^P*=TcNATUlXq~BB{p$(SuR_V z7M2up;! 5Y6II?~a zbs*$<3RZ)Hg8cPsK;;)tMiObj*^y*2xTI$Pq g>PDA+AgH!}XBlw&p=nvfPai76o!=WsM zWF0jX3rFkYdF>c5Bs#jfCW8=$XXzQ6kY04%m#Wo*@-B;`4lYfiLR}6YJQlup;s7Bf zdm$l!kDeeXa8YD=IyyRCM1AfW7we_J$|{ 4p=xzz`2Kk zM4cG=vsr1dg8YHm #w3tAK#{T_`&fTqX ziHVL9VzaZe`d-UF1clOB_vv+@3~vLgXKQB{>=8u?+El4PhA741K@4i-@Z+>9yVSM| zlme@Vhes#q_u#S9y~#$rS%nQ`uj71*o(EmtCCJ?eo}~&Wy$p)k3xUqxn7=I*4Vb($ zKJGVfW(EXMqbOnX`E@sRa%$=-jB^&J3hRiUQa_J|WnKy_TRkCia6{yKMunTo(`dt$ z`uLcblW2#qZeC=LGN1fXkT=O@G{zBSKk5AN&mqEiQ~gKl(FqfpE6A)+)IYo=!}Yn! zP19)q915^4ekG-)DE+Jq_C(HW= S&wRX#!xP+uHJ(uF@NEHkg%w=-yoJ>`4R08$6Mr) zr^A@&C@GN dz%d`E(G$7i!-leEKL^5Du)Tnh% zbT7Ba_o(At`nJdOk_XL=P5~Q(x07FBU?6i)%yj-~+gzo!q!;^cI40fE_l?PcA677k zO;q>2GkY~Msh5`Q1is|cytmUUOpl&{LECi#0R) 7iVDMB2@EZZ$E{liYHC#WSFYrT zJrPp@TP`Fd&+#1KiIDBL2YK<{e>P@)+Zr1DM{X#dv#?;KS2a4$tKi~CxrLZmC~CHG zQ1dL|EDMH%Rq%+^L8>O}{==NIJPkxgqbAE8Ugw$Ge=M;d0mh5|N*Vq%0~1pgmf6ES z(|HLzA|z*I*5yAfkns(#8<*#VU3gx&rj$N(`g#<4MF87&SDgL(e3p9(GW!lduy;cp zfVf<8cGg2iI5III{@@%d3wlMJDDqz6eErwI(DcRSw|iuc9NAZ8sW&q-)A;MsinJb* zLY>p6SvO~rP4kiEhk(9z0D&kAs&?SHt1u!4{W Oo(ll@%DCdbks04jTz`q zlT6v3_VOhUFnmsF+bu_xl+Z(91O`c%oF+bSyZ@2qSG(Fq{QUfl9%RSw-|K&SaR4<> zaPU?NwdHDQYRZleD;WDatU}KjuNaJ$&E?A>Yipi3T^Ti)0sn$_mP_EbU0$OeU679B zi_m1M9pP&opQ~>}lz+2#MS;>J=aQxT+eLvVoa+DeOWaa9O%h+!WnDXXW1U0GPpze_ zjq4WL%U8r>4SBZDttZ>j1x~NtV#}qq8Tz1yJG`?A{Hu3|C9$4nAKL!MZlb6B{D1E0 zP1u=46RS=TzS;Mc@+gMG{%+(O?Dc;Z%ULN8IlP@MfNI=K=R5v$#~on #9{c)6SPn2ohVSZ3HT3G=SqD5 literal 22819 zcmbTe1yq&ax9`0X1(gyJX;4Huq&t+9loX^CN$KuV1eBC6!J@l6lx9-`N_Tg6y>tKm z=e(!x9rupw7zR6@XFY4pHRoL4&zydErYMbblk_G6fxvkxBcXyopmoD<^6MDzisCJ` zDERBD{gbC^*Ws7Pb;CgT`G$>*mOTQ2MS%K^hDb;vMj-AXo=QAcb4gkoch-q^ygb?_ z>PO>8l!_TvAj)UxcQwY`6DvDp*Yn78M}L++*as z6?H%Ha5D^@?iQcTt@n+tqEun4Xp5vNJ*QRO`}~{sA@-hP(N}eS9UC;nHb^GeepN)N z$YvUtkQZEEQW@~2PmNM(9!I>iRmS`ZZ)kmdG*$Qw_X$I4&Ie0n%r7@{ZumEm=>79K z?%z#jl~w5G9|f+bMiucS@Ug^-Zax3!dw-<}(&u;3z6JfqTUfWW1|GxJOHtqAvSmzF z!|#QEg?|0eKckkjWEZ!l z7n?&V;k!{P#=T9MFuwT51nDXdJAaG2XRgjS(NP7{@$mRp=_zXYx2{%lS`GA%eXQ7S zFbJ$Ci_M)_KvQ?QSZ39!a@p|xlReP*QhxxAK9#a2!OL-JWS60@PlexW4x!DHx1j8- zM5}Od=KFVbUiIAsx<8uD$s9XRo>t3IVbAvJ3I$$?UMeMx@Qhl=%_EKcuD0hBbIt4o zN1L&tFU`&6j{ZEG-FtYMC|BRjvUKDpdP%~W6iF9KoNhT$5J8l(ELnZGG>&h>l~up$ zWm1{tt^kIE=i4u7e_YQ~ze-3>bg1N~$KpNEca8j%U(;^Vzc{m^5pQpzNKNg^YMnKq z>P=;&S%1KVm+>U5EJX7JDTGiY7j6rmc$}kOdetW!>nHXyMU!>?MN_ S-S|R7Q SDy4-XG*EU)_J=TT*$ zLp8b!5vRZ}xZ{B#AB=aJep?JzB*ev;!uVRd$OaLCVfD!0ji(iNy`n3Ih*7UbIqSa$ z^B)=>wijfKAi{8bc(iw8g&W&&c4WS0&w^@Zvt{1=Jj$_8wNzHiSB|Ks@Z|;B~Xi z%qT~@G>7;i#E-Nz4zr!blJ$XiN7c^5MXv~B*>tZ?wf(H6p`&|cy(zXEV`(~ECCtw5 zPbYj)<|1NdX6C`+iOX$%ZE8vLV`_cpgQL!;S#EA<1>QZlZxb|lTa } zGcyM9JI%~)c*Gr5(LuvCuLuY8-^T~%8?XEPa<`9a{tf0%xHMFX*I&m?lT)0o_^3dd zNyN>Zyna*QeRTj`YZ#^B0ufb2c(~YdUusCYN{Z>9n3Ir%BD3?GJh}Rh=cUJ89nUZk ze!7)c8^BhyR;t|io8tI9%?FHOc<|K4o=CTY^@;9p??t!zDxRX2$J#V-I?D1LZ5P^B z#>#u`RK}L=c%vL?
zzZG!!?s1I>v2b36=8UKG`Z&)jI^+hj_6@f`w)YL6gU@cgmFl{<>yy`B+8z7(`RT0Y zF0Eh?hkiT1vO+*cpfH!4cy+*B0yPV^=n_(6on;qBNCA?|!`x}ihR=fKXpQ^bucZ(A zE8RsSw;5K`2Kl0ku9zrNEbcNy9<6=m} za{h|exFaXaN%?fT)dK4t+!JBpq!xvghMzyt1O){XgnyGh8q;*(=kj}+A7W^;c`qU| z(mr^a-C2C+gQAj3S`19-DDHS+Vd3;;*O4DicI?iD-*Xu`x$nB^$u7qOh?mU~*UmV+ z?^4wYch5Pw7Aas_SXjjEt`k{|)`U8@);A6Ii_CnooA1&SH4@$nRApegWp_UgwmgDQ zR3(&Wy?W LfHk?P;}_`~$>Ik;6wJ0GW@yL-p;jJD|BAh75- zoe8zt(z8_#+nq%Z_IZ{G@^fay=c;|9p `}Ol@p_t=hSxu%J0Rh2voJz6Ojxd$4-{fM<3JckX zhK8o*=92P>zio~!oRmJQ@iaFKn)Vvp^ja!@6GZ1J&Kygth*V=HNM}suvc0S17NW|K z8pZLBRuN)K2X+Eqw2CYPr|FEEEJJGNmk YPsLYb={PeJg=j{A&QfuKH{>;>?6)+#n>ng1=?n i zu{KF%p@3}#0g+rkQzeyHz#(IMKUcdvPRNxbno+%jV{)M@k%arro$)Hi*>`v%ZG}0d z=7TC j@Xfs>?=uoE(uLY2GiN9q;y4Iht?p??)5qxjgPp z7G|QRZuG~Aw5~grdh;ji;r8~n-NqRIjhi !ZBdS_+9g(KiTaWj+fy z{*VeGEqc|6fsgOH(@r 683|n4s2Z9m>3rAkLl^@d#i&=-@bj5 zkeGwV?yL9q-rn1b!le*stF&L-SQX~P9O;f`R2%uitoqff0GCoov+igH3vTquarN)h z%Zqc#rtr0qQgb@#P;z|yPw6RMFYdDH(6h6%bG#X#-#$3#*3jrrQ%F@x5xGr3@L+eL zD^er(1qrevi7%E_m$BCUu$w)Zcfv)y?sP*ia-Q3AL=A2p#nR&bn%`k5oC|(Vc3mKO zDk~eIRczcIsU*TcO^rj!6<%!8(=lG{Y}6EpUu3_i2y?pKOk}h%R!L30b1-U+gawn7 zm}{l-j(XMTPlD{u?ELu-6Z!TU77aJII;~<7eTvsfW?*2=#mVZ<#pxyzb*+|Q5|w(d z^Rrt1_Xx{HSwcq3XEB+*B5IKl5l!Rcx)Bi(!LwN!xs1Pm|K6F4R3Z)Af|rVDI>7K2 z6ZoFzzIaGY{XAcf5DyOzzdf06bugcePAR#QJ