From d2e6f5164a2643b356edb07ca74ff54209aa7c15 Mon Sep 17 00:00:00 2001 From: verboomp
Copyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ +@Entity +@Table(name = "jwt_refresh_token") +@NamedQuery(name = JwtRefreshToken.FIND_BY_HASH_REVOKE_NULL, query = "SELECT t FROM JwtRefreshToken t WHERE t.tokenHash = :hash AND t.revokedAt IS NULL") +@NamedQuery(name = JwtRefreshToken.FIND_BY_HASH, query = "SELECT t FROM JwtRefreshToken t WHERE t.tokenHash = :hash") +@NamedQuery(name = JwtRefreshToken.REVOKE_ALL_USER, query = "UPDATE JwtRefreshToken t SET t.revokedAt = :date WHERE t.user.userId = :userId AND t.revokedAt IS NULL") +public class JwtRefreshToken extends AbstractEntity { + private static final long serialVersionUID = 1L; + public static final String SEQUENCE = "jwt_refresh_token_seq"; + public static final String FIND_BY_HASH_REVOKE_NULL = "JwtRefreshToken.forHashRevokeNull"; + public static final String FIND_BY_HASH = "JwtRefreshToken.forHash"; + public static final String REVOKE_ALL_USER = "JwtRefreshToken.revokeAllUser"; + public static final String PARAM_HASH = "hash"; + public static final String PARAM_USER_ID = "userId"; + public static final String PARAM_DATE = "date"; + + @Id + @Column(name = "jwt_refresh_token_id", length = 22) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE) + @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 1) + private Long jwsRefreshTokenId; + + @Column(name = "token_hash", nullable = false) + private String tokenHash; + + @Column(name = "device_info", nullable = false) + private String deviceInfo; + + @Column(name = "ip_address", nullable = false) + private String ipAddress; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "issued_at", nullable = false) + @JsonIgnore + private Date issuedAt; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "expires_at", nullable = false) + @JsonIgnore + private Date expiresAt; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "revoked_at", nullable = false) + @JsonIgnore + private Date revokedAt; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_used_at", nullable = false) + @JsonIgnore + private Date lastUsedAt; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "user_id_fk", nullable = true) + private User user; + + public Long getJwsRefreshTokenId() { + return jwsRefreshTokenId; + } + + public void setJwsRefreshTokenId(Long jwsRefreshTokenId) { + this.jwsRefreshTokenId = jwsRefreshTokenId; + } + + public String getTokenHash() { + return tokenHash; + } + + public void setTokenHash(String tokenHash) { + this.tokenHash = tokenHash; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public Date getIssuedAt() { + return issuedAt; + } + + public void setIssuedAt(Date issuedAt) { + this.issuedAt = issuedAt; + } + + public Date getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(Date expiresAt) { + this.expiresAt = expiresAt; + } + + public Date getRevokedAt() { + return revokedAt; + } + + public void setRevokedAt(Date revokedAt) { + this.revokedAt = revokedAt; + } + + public Date getLastUsedAt() { + return lastUsedAt; + } + + public void setLastUsedAt(Date lastUsedAt) { + this.lastUsedAt = lastUsedAt; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public static class Builder { + private JwtRefreshToken instance = new JwtRefreshToken(); + + public Builder tokenHash(String tokenHash) { + instance.setTokenHash(tokenHash); + return this; + } + + public Builder deviceInfo(String deviceInfo) { + instance.setDeviceInfo(deviceInfo); + return this; + } + + public Builder ipAddress(String ipAddress) { + instance.setIpAddress(ipAddress); + return this; + } + + public Builder expiresAt(Date expiresAt) { + instance.setExpiresAt(expiresAt); + return this; + } + + public Builder issuedAt(Date issuedAt) { + instance.setIssuedAt(issuedAt); + return this; + } + + public Builder revokedAt(Date revokedAt) { + instance.setRevokedAt(revokedAt); + return this; + } + + public Builder lastUsedAt(Date lastUsedAt) { + instance.setLastUsedAt(lastUsedAt); + return this; + } + + public Builder user(User user) { + instance.setUser(user); + return this; + } + + public JwtRefreshToken build() { + return instance; + } + } +} diff --git a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/Picture.java b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/Picture.java index 81fbb3f..6750a73 100644 --- a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/Picture.java +++ b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/Picture.java @@ -37,11 +37,17 @@ public class Picture extends AbstractDateEntity { @Column(name = "picture_date", nullable = false) private Date pictureDate; + @Basic(fetch = FetchType.LAZY) private String comment; @Column(name = "image") + @Basic(fetch = FetchType.LAZY) private String image; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "customer_id_fk") + private Customer customer; + public Long getPictureId() { return pictureId; } @@ -82,6 +88,14 @@ public class Picture extends AbstractDateEntity { this.image = image; } + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + @Override public int hashCode() { return new HashCodeBuilder().append(pictureId).toHashCode(); @@ -117,6 +131,11 @@ public class Picture extends AbstractDateEntity { instance.setImage(image); return this; } + + public Builder customer(Customer customer) { + instance.setCustomer(customer); + return this; + } public Picture build() { return instance; diff --git a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/User.java b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/User.java index 7b2b82d..fbfc5a7 100644 --- a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/User.java +++ b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/model/User.java @@ -20,9 +20,12 @@ import jakarta.persistence.*; @Entity @Table(name = "x_user") +@NamedQuery(name = User.BY_USERNAME, query = "select u from User u where u.username like :username") public class User extends AbstractDateEntity { private static final long serialVersionUID = 1L; public static final String SEQUENCE = "user_seq"; + public static final String BY_USERNAME = "user.byUsername"; + public static final String PARAM_USERNAME = "username"; @Id @Column(name = "user_id", length = 22) diff --git a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/AbstractService.java b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/AbstractService.java new file mode 100644 index 0000000..0a1d7f7 --- /dev/null +++ b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/AbstractService.java @@ -0,0 +1,35 @@ +package marketing.heyday.hartmann.fotodocumentation.core.service; + +import jakarta.annotation.Resource; +import jakarta.ejb.EJB; +import jakarta.ejb.EJBContext; +import jakarta.ejb.SessionContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import marketing.heyday.hartmann.fotodocumentation.core.query.QueryService; + +/** + * + *Copyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ + +public abstract class AbstractService { + + @Resource + protected EJBContext ejbContext; + + @PersistenceContext + protected EntityManager entityManager; + + @Resource + protected SessionContext sessionContext; + + @EJB + protected QueryService queryService; + +} diff --git a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/CustomerPictureService.java b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/CustomerPictureService.java index ab85205..5b19906 100644 --- a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/CustomerPictureService.java +++ b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/core/service/CustomerPictureService.java @@ -1,16 +1,15 @@ package marketing.heyday.hartmann.fotodocumentation.core.service; +import java.util.List; import java.util.Optional; -import jakarta.ejb.EJB; +import jakarta.annotation.security.PermitAll; import jakarta.ejb.LocalBean; import jakarta.ejb.Stateless; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; import marketing.heyday.hartmann.fotodocumentation.core.model.Customer; import marketing.heyday.hartmann.fotodocumentation.core.model.Picture; import marketing.heyday.hartmann.fotodocumentation.core.query.Param; -import marketing.heyday.hartmann.fotodocumentation.core.query.QueryService; +import marketing.heyday.hartmann.fotodocumentation.rest.vo.CustomerListValue; import marketing.heyday.hartmann.fotodocumentation.rest.vo.CustomerPictureValue; /** @@ -24,25 +23,26 @@ import marketing.heyday.hartmann.fotodocumentation.rest.vo.CustomerPictureValue; */ @Stateless @LocalBean -public class CustomerPictureService { - - @PersistenceContext - private EntityManager entityManager; - - @EJB - private QueryService queryService; +@PermitAll +public class CustomerPictureService extends AbstractService { public boolean addCustomerPicture(CustomerPictureValue customerPictureValue) { OptionalCopyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ + +public class JwtTokenService extends AbstractService { + private static final Long EXPIRED_DELTA = 30L * 24 * 60 * 60 * 1000; + + @Inject + private JwtTokenUtil jwtTokenUtil; + + public TokenPairValue generateTokenPair(User user, String deviceInfo, String ipAddress) { + String accessToken = jwtTokenUtil.generateAccessToken( + user.getUserId(), + user.getUsername(), + user.getRights().stream().map(Right::getCode).toList()); + + String refreshToken = jwtTokenUtil.generateRefreshToken(user.getUserId()); + + // Store refresh token (optional - for revocation support) + var refreshTokenEntity = new JwtRefreshToken.Builder() + .user(user) + .tokenHash(hashToken(refreshToken)) + .deviceInfo(deviceInfo) + .ipAddress(ipAddress) + .issuedAt(new Date()) + .expiresAt(new Date(System.currentTimeMillis() + EXPIRED_DELTA)).build(); + entityManager.persist(refreshTokenEntity); + + return new TokenPairValue(accessToken, refreshToken); + } + + public String refreshAccessToken(String refreshToken) throws Exception { + Claims claims = jwtTokenUtil.validateAndExtractClaims(refreshToken); + Long userId = Long.parseLong(claims.getSubject()); + + // Verify refresh token exists and not revoked + String tokenHash = hashToken(refreshToken); + + OptionalCopyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ +@Stateless +@LocalBean +public class LoginService extends AbstractService{ + + @Inject + private JwtTokenService jwtTokenService; + + public TokenPairValue authenticateUser(String username, String deviceInfo, String ipAddress) { + // Get logged-in user from database + OptionalCopyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ +@Stateless +@LocalBean +public class JwtTokenUtil { + private static final Log LOG = LogFactory.getLog(JwtTokenUtil.class); + + private static final long ACCESS_TOKEN_VALIDITY = 60 * 60 * 1000L; // 1 hour + private static final long REFRESH_TOKEN_VALIDITY = 30 * 24 * 60 * 60 * 1000L; // 30 days + private static final long TEMP_2FA_TOKEN_VALIDITY = 5 * 60 * 1000L; // 5 minutes + + private static final String ISSUER = "skillmatrix-jwt-issuer"; + private static final String AUDIENCE = "skillmatrix-api"; + + private PrivateKey privateKey; + private PublicKey publicKey; + + @PostConstruct + public void init() { + // Load key from wildfly system property + try { + String pem = System.getProperty("jwt.secret.key"); + pem = pem.replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + .replaceAll("\\s", ""); + byte[] decoded = Base64.getDecoder().decode(pem); + + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded); + privateKey = KeyFactory.getInstance("RSA").generatePrivate(spec); + } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { + LOG.error("Failed to load JWT PrivateKey " + e.getMessage(), e); + } + } + + public String generateAccessToken(Long userId, String username, ListCopyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ +@RequestScoped +@Path("customer") +public class CustomerResource { + private static final Log LOG = LogFactory.getLog(CustomerResource.class); + + @EJB + private CustomerPictureService customerPictureService; + + @GZIP + @GET + @Path("") + @Consumes(MediaType.APPLICATION_JSON) + @Operation(summary = "Get customer list") + @ApiResponse(responseCode = "200", description = "Successfully retrieved customer list", content = @Content(mediaType = JSON_OUT, array = @ArraySchema(schema = @Schema(implementation = CustomerListValue.class)))) + public Response doAddCustomerPicture(@QueryParam("query") String query) { + LOG.debug("Query customers for query " + query); + var retVal = customerPictureService.getAll(query); + return Response.ok().entity(retVal).build(); + } +} diff --git a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/rest/LoginResource.java b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/rest/LoginResource.java new file mode 100644 index 0000000..e456f28 --- /dev/null +++ b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/rest/LoginResource.java @@ -0,0 +1,75 @@ +package marketing.heyday.hartmann.fotodocumentation.rest; + +import static marketing.heyday.hartmann.fotodocumentation.rest.jackson.ApplicationConfigApi.JSON_OUT; + +import java.util.Optional; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wildfly.security.auth.server.SecurityIdentity; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.annotation.security.PermitAll; +import jakarta.ejb.EJB; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import marketing.heyday.hartmann.fotodocumentation.core.service.LoginService; +import marketing.heyday.hartmann.fotodocumentation.core.utils.LoginUtils; +import marketing.heyday.hartmann.fotodocumentation.rest.vo.TokenPairValue; + +/** + * + *Copyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ + +@RequestScoped +@Path("login") +@PermitAll +public class LoginResource { + private static final Log LOG = LogFactory.getLog(LoginResource.class); + + @EJB + private LoginService loginService; + + @Inject + private LoginUtils loginUtils; + + @GET + @Path("/") + @Produces(JSON_OUT) + @Operation(summary = "Get logged in user") + @ApiResponse(responseCode = "200", description = "Successfully retrieved logged in user", content = @Content(mediaType = JSON_OUT, schema = @Schema(implementation = TokenPairValue.class))) + @ApiResponse(responseCode = "500", description = "Internal server error") + public Response doLogin(@Context HttpServletRequest httpServletRequest) { + OptionalCopyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 19 Jan 2026 + */ + +public record CustomerListValue(String name, String customerNumber, int amountOfPicture) { + + public static CustomerListValue builder(Customer customer) { + if (customer == null) { + return null; + } + return new CustomerListValue(customer.getName(), customer.getCustomerNumber(), customer.getPictures().size()); + } +} diff --git a/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/rest/vo/TokenPairValue.java b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/rest/vo/TokenPairValue.java new file mode 100644 index 0000000..874bf29 --- /dev/null +++ b/hartmann-foto-documentation-app/src/main/java/marketing/heyday/hartmann/fotodocumentation/rest/vo/TokenPairValue.java @@ -0,0 +1,23 @@ +package marketing.heyday.hartmann.fotodocumentation.rest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * + *Copyright: Copyright (c) 2024
+ *Company: heyday Marketing GmbH
+ * @author Patrick Verboom + * @version 1.0 + * + * created: 21 Jan 2026 + */ + +@Schema(name = "TokenPair") +public record TokenPairValue(String accessToken, String refreshToken) { + + @Override + public String toString() { + return "TokenPair{" + "accessToken='" + (accessToken != null ? "[REDACTED]" : "null") + '\'' + ", refreshToken='" + (refreshToken != null ? "[REDACTED]" : "null") + '\'' + '}'; + } +} + diff --git a/hartmann-foto-documentation-app/src/main/resources/META-INF/persistence.xml b/hartmann-foto-documentation-app/src/main/resources/META-INF/persistence.xml index 06ffc00..17c2443 100644 --- a/hartmann-foto-documentation-app/src/main/resources/META-INF/persistence.xml +++ b/hartmann-foto-documentation-app/src/main/resources/META-INF/persistence.xml @@ -11,6 +11,7 @@Ufn|w+6yBr ze+pOP_igK5!8Q#L8fW|(#`Pnf{33pN6V^SeS%nE`8}%cuAIs5gf0I6A5|thn$Yc-2 zlqdC-`s%IJ4Ir#OE$S$8f{8&WQuVD#SZ*j7Jlq`}Q>4SM8vYEYrsE2o9krsn>BX(f z0YNl;-*>8oDqs&wBh$my9|_`Exx2`vgO@d8>sQfisd@vh#n;vDVRgh~LtJZcu;q+* zlNev-vILl)CI$|De^ZG6!unx0;hpZ(A01c6p1K-$=cC4ad9jRa$^iDJV^yb@;5}h?rER0RQH3Gz*eMO7HsC#Z)KE@oISwgC0a1-8795Y) z__-`4ys&Dc^k$e-oo*#(`Vns#{RDhz{8IT<%2sYeC6#=!f8?K{2qwe=ZV|}G72inp zHlAS1%0uCT IZZYrcFd#IVs>|znyS!C0o*2pFIv*X>46BtHEX{ LvhFG;bpfL~+j2Fe; z4vpwADrar`e>$%mozz!b&&=eyH`s2bhChAhs$B!yg^ZS7B5*J8Vh~Ky)}cMn1R`ev zB=&A%kf3o3R<;w1s<0MrbvyAe@oR?QN4?<(o70Xv %^;|fesFdvYie{9X_XV-c4D_p4U`DfFiUoN$` z*W1(hM$gVvwD}_sf-~6`h4ps&M_FHb(=&haseeh}pMliF7$EgI;_QqmqTE6o98XIR z=?ra^FZjR#91T1_SQ+@k6*~p++{|GIK@ad}Yk7NEe4|`SiiQ1=G7vDBPL%DYvljry z6n*E0f6y-Ku8QWHQ3y2Ccnbg+do?7hJFL s6BZU!6mls+|I= z5R!j7hV+~WlAV}Xoo1WEQ&_Qqv?LfSfCz^Pe+#u=x51|S*?Vo _A3(U^MOQ>vlm@nxE~g`?j;;0L-e7E&pe)QTvY2YDNRj4x!C8kD#cewr9nh&>o@ zDAP8QNXvBG0jgmhj@KhXqwF=l8+^f UpPr-5ZyUT zf2cGZ_U7^S)l&OUov;K c)?f3sP_I{Z}KBaR4F*;}-IRF};}yaG^xy!~cT z;Lt3G7m-&T uL=XMK7Ftksu!9p z7N^A^*bFIGXUX#>tUhMYlLxjjA30^bHM`Pau(T?BQ{=}JG@J)Dmb3`!WFjs^f9U9& zQY-dil`A0t=k(9#uoJtRV^ZsvR-06~3V&r3cSi5Y4ANp?jt|{^`jZuN1sOZt7R6{v z842>q_n+wb%m~mrIHIHRcrf~Isv9A8wlaHIDbgnvCZU>rUMUAl#PBqVlrNC 7#H1RZMuKhN4%53o~wmNY)_K&U3ZzC_TS5L$$5Xj`alF? z hVh0foHJJa$Zixw@7~H3F)6>3OH(5T5e*ap_Hp #t!h|*(JJx|-Qlg3MGukpmheIG^4V}{o{KpU zu&X8=y2YPBqDMw)@|K2U#y8rn*Do RCG%=W!55JMvG8Tog-xN*3C9CY>x$iqnS zExcg%W{R~n79R`O-{?-!N~>meE4xGnE*U>Yi{A;kEsGMn?;uAi(S5Scx%1<_B2l(F zTc&ydwsRjBd=7}dmqdl$jJ!ER1151A34?Fk(MLnVxgIT?e>9&2 6 z%U5;f`R(^Bh1ahXOc2y|;83A fGM*T=tk9%y-E`_P+10#(F&V{9f~2Zhu<@ zc$}l|?f3`);iao3PDQ_qcF8&eg!#EJ-S4QMG*hQ4oDCR$osvIkN@p;KDYyj1C{#pX z!xUTu`+glTc1;&g*<$LSR(?8S7EC25dUCnVs=WDPf5z@hEKZfE`nxh14A4G!k~d7A zz y_S(z!)4JviVlQ_V{WM#2!sq3EL6Kp1Q#p2)%lD;g#H_xjGceluT;;ezWcq zKe0jIJr1_=&6`|Xnud4fQa>1@_AQwVI1b);nk;~v@=TlLK#rP$ac~0o5-7f#leDQF z=;$^Ee?p@B_e^%s^vsNGc}41n>GgyZ> y9 zn|SYD1e?4mM8>A5`A1I%WKSuaRGi!|z0aY!gFhD(-4)P&PV=r0&p87izF{vv%@_o7 z3Q8Va(ESN|g{ ynrY;d{Xd$>aP4}s 7ep{!}@}d_9K7dQT@q~ z_NUy-;|ze^BXsaO-^GoFl-TG@|#NZ^LXv!w^zQOe!S5IH#4VU5k)ZrAs z_? RSsd908%_^v{rZn>jG8;dmNrNdIk12}wk2DUB9ZdS zX@WTDLaNd_q3xKxA!Db%+R3QdiX1MkHO87 >iT^(XcMVz9}->8udDehpM z(cPYy{g@q0N8}r;&!q93sA5jx@UB^KjdxGUnG)%|cvjJc4hw-P^SlR$8sd~H*UcDW z=oC@(aB=`TPqIV^2caI?&2?099pwAP3*m`?&B2d6i4LU5975~@f1t51zJ;C9!ZuHy z#ZUf~YvvruMy^JNCsA&8MTBpb+f?zh#~B`ox{)@V1#B*^WPK*JORNV6gKx;_C OIuya0-N{zw-kXGCQl;Xs2D*Z{lCgCnSz61!Hfad3k_E8M*RT2d}fW zV9kkGdjVS}z4%yve=xhjq>h6vqfP{L1JC|XBv`T1HmpqywyfKr&Ix0xsGUC}S}cB8 zEJJozwvamdp`l_UFBZ(QTe|~{D9%^TCWxv2(9C!HivKYNKW?5@6Fs0Z#gr$9RJdb= z@%de m(2elmfC;tK#$grSGF zhx;|6WaFrzn1PR#O*926h@ao7p@)C!&xQ!ZDT0m# pDc`9@sISR-0o0DoB-S+(w+b z_EqBZhRu?^f4M2)R%= Rt`62tTCGVx;^CbfyW|jp*1xB5Z26d@S!) z709xSJ%SXCm^j$%__#WS9@^`-DlcfbUNK*EQOKPNe-JTFMp7Ej`aZ0M)ae<=@aK$9 z($!+1q4!Lo(RcHMGi8Q;XbM8QHf)l#Ql34rx#?&)n0t4%2P-5u6 8(d__C+WH;7&Dybn6yPeGhLCIl$pe8J@AM&fisYA_e?}$iac2QKt&u%cq)8MC9MWMaXvSMR z&O}Hs?`<5(IqgI->Ln&`v?1su?ow+b_$Lp$()x@XpA`=#XL^`yZEw-Iy~XUMxW6Gv zoQJv=1wa)>E_9UC-dLm(4)eya`5W4U+?xOFU@Cexok%+f$m_5Cw)u*KE0r-H1m5XY zf3>5I&Vb~F1=q1Sw^UmmQve-aRwg&BM$-eNtV|u;Iu di zlOW&@o<`82Nx(!)q6;vtCj7#3m`NINY+IySkz7vFO_8TU{%>%4^x^YD!UpU4%klEH zaXlwry2uCVu!+bj?ZxX7G{gRsXeD<1f1z!eY89V|0(N_<=EWje>i9hZqMws#v*uSF zP(5?=>N{MtCL!c8nnTXxBllLQplGB?bxxefijt}ahp^pQXsCr8IVIXU_HFDE) $4 zCEqMbJV|P_ RbGU;h4!D<&8DW0(+hhW;u z@s41L=~t4d)P5ghW-hiW7oLZaf3o=g0<=8>mpU{)Oda*RiFJbPGLIs}g2x{smQ@r> z*w$htSB#jz5&kvx8qKX=H}}~LMw`~FR(Zt%5!MV|=L70!z9uao^lDF3pJ=7W9FRQi zg;rvNW#7||=F#A*mGl(OERh#gk?#vc-G}@0WZ!o*Y}}^3*OP`qNiDrje=sn3kj9(E zL&7G#;j!*Lsm29%;{5UMbt8n2W2E)pq)A|ye82KFUeAnD&N@G5X0UwZd2Ro?LR>M| zKYj-mgYPl%#oHqk>Ad#~W_+5BtRUUSvO;2jSK)E #ys}GyYf3-%_ xe?+d)Ab5V2&wDe;KaaM9^(@2-x;VNp&L4_RUERbMulgiG1K6Pr zWq`o>abVdcrh0*MG3O~4=BaM;Ik3dGjsCm@2GAz0VT*BYIpxBKhB0d&!dJ-ufg6dy z0H4&J>H*A9VDJ7lQ-fzQpKm3HZ`&;<|CXF`7hos>D2h7Re|46%&@-w p#ndg9AXt2+1)wUcij!iN_#Z67hq z#x7~csTEmTNJwCPNx%xXTF00oe2*K#-LwiUZf?X=J3pk`z`g32oVCQr630QN gknXcP#WNcVgz#;ieX@*Cn>f1ENL&lFXeRUfAr&z>?;ttYd_zcA15B45!g z4QCzF$!;Y3Wl;DN`%f6UliFXVDsrM_9_n?K1ImG&e*#~^_6tX;9(=fJ+~%)Y&0Qd{ z!&|V?Dm)ZVvu$~p80vddC*4T4D8-KOe#vO262ws-;>qRG&Ms+^*C-FaXLkyIN~2;% z$FMpvWp&7~-rL;cnjQjvOXn713Y1YOWg&AQwZ!;$_Q~j0M@ {ic?v#ZK)qwff3S!dE Ks*?rxs|$%KLSje;^Mlr z&cq3@f5)>ePxAJpj%Sdu0E-g}FOoHp)&X%=%(_Kb#E}x)4j-j95)HserZ1P%#NgmK ze~@FEKI;+ZTP2$@ojH~4)MMZLA`Y+-{9D4AQ6U>GPd&BGI!or&nHSU$5E2TXBceN5 zjV0??twc$$jOS0VZerwo4d&uxWdj4zlNkg)*?OJ_!C%aSP znn`v{dm%1-&(sW}JVi( `(?Z^~%~}W9s0 rGmm RGv6_j zNen) 5$07kJ+9=J(W=c(E?V7yowYJJ$;kik&ZvXtsNf$shwv2gU4nifBb<(6XKtqev{vsG4k&-NoUpLwtz*)@MVx zPraU+sMp~SxNzkGJ%@Cwf8J3b{^a%dpw1|vd_2Q-_3N>yA0$HSL(=;u3jU&XXRJ6) zbmkJ;DTMyn-I3$ A@}l6k4PL+da13^O@*^C8{YX`ki71ieQE4 z3dOlvk-18Aa$!JHeS4Cwt1MOA(sTgLp^Thw7*oz0W>Ybl)XQg6e`ddzOfI!MY<&3n z-k|_oy6gt4#VQ&uD16X!xSL1+2%%UJbm-xx*5S@Fc1w6sX14yh%{{d?&nAM5rqfiX z1nLj^UZHIEH+8Qp#=7;3sU7PJ33(rbt@n(Hq1Th)ZSz|?kp+$wp1AA>f*3>!m5yl3 z2BB?=H2W@>rL3Z;e}b`W+MT`fVE5A|b$WeOdQJ6<_L#(n4# cSOQ?(827Pcq^TJT0=DJ zov?mQXhCXNx+mzCqIgISypd{iXnLBMQc?&$OlC1_Ges->e~f>Oh5(+eD!caNf=ho! z8hxFLTeO>V<=)d{)PS+CeEA3ZPpjY(+JotyjaKzrB0!1#J$C(#w6|&R)c3-&&DHY3 zrqu&?kuW~hO6xb6nSQzAXWqHr0s;G#qVc!-_HXR3nfST507w9rNMyo2V{x@N_ATu5 z3fbas?ZpYhf5c_Dt&CLO%gRd4bGxSw8ZCx6#0r>E#fm@Z7pfDy1Tm|8PM-DoOCI8z zk$YZHISGQO$Q)%4A|3fnB^ncptS`J_QFF@6Z)kc1WmCYHTM`*Q8#f41)h$xag{#Ss zBAhp2g5 lTR;S)u{mXMms20{=CYJv)f3=_EZ+<6CKOqrAw`(RN5U70U7)gu1 zJRLOmQX!wc*Do+a#<_f$(8`(K;&cV!fDo=t(|t{OfFA3PTQ;U;d8WLA5ilJ40;xC~ zS`-PI^WAPKXG4Vtt@>Uvv1KDXa6>=)+46YlpEk$a9V9coNl>&Wn41jYdYFKIQ&VU# zf5=_y>PHcL_{KAyTFAn7)E57{j-tb2Fa02%^6?^3mewx?zd(Li9YQ-~K{FJ=xQ27_ zjoyB8?KHHh(jsRFIm*4cB%f=%D|)p@8}l`3mQwN}(^H
zU>+|#|1UU6e@a0}9$H$Q>WNbBZ}WL9j=2LHm(My@zQ0DP z!RlX6K8)?WNY-UTL!Fs8XsyLKBqJLQziR9UogT7V8qLkz)Jj5l9C=@T86%jOc`@Wo z%P~T76L@$c>+pYHG>5CzRn{43?aV8-6x*AOJdDuJ$1zm7QK4 e`U1_Ri3vufIU6(e=Oy~ z&As4Oxo=x2;P0mtB?U@; ^(@ zOxCB5UB_8m>@Ho0Ed}vdEEOq~5EAAnRXDxj5a;UM3 z3*I RRRYduT~%{ z{<`9y27Tk=92=|T&$Cb7)vQB#Pcc+*t&09FN#tmc=5C|xbL37 Dt`v5~Js9D^WX!V@zq zakL{BQGe2#J5$2sI<2#tU@URe1Kz9`6p&Us>8&3b@J}0Q`^#LW_8aF@#~QZ-?kBxP zd!ycjw)We5H~>z^ijQO8fK-S4LVIR)-w(S_XDa)y3!y+hf817=Z~(cF0I6>$u?@2M zKD`B!b2pW*@NXmS+8Sg%1>sdt4`1PdNS`lOD mAuvk0FT zDYywK$T)IPH?j$yQ+Nrv*<{1X)50};lgJ#WugGJg&quI(2_%=4$77wsLMMfz2_s?x zd?LkzTRwjTe`NHy#0i#b7v12V0P8wN!DHf9B}t}23Tf!s2m;D_p`O&dJ*$ly7&jT@ zS{BS*9mkN28_X6K_7D%GeH$qKi1rqO1Ax-*mS+=^Vgi_85 ^nORnGfF4n|ZPUWa z794*E?=$u=`US@aH1smyXn>a{{}Psnh`BM3u6Yile>{&~T4-ZI45|kT12r=z!GyD* zx(!O&4M^#!*JBrb$0+s{X+4Upq_icz99V_MD29hPgFx?=IA~s-x36qBgCBGQ)rE%9 z4V$lTH^MVD!b=TK^2VWyMYd&Yu57vw5RcsO6qx0}aWm(L-Gw#5TD}bzF)fK7#_{nn zx(3G5f5=~f+@(-Z{}uZuNMx#oSF6m&2qc27&ptD9MhXvM;21?=RX>xY@;7EQ)^5e9 z1|x %SJ#7dCU+8^iGAA`z($kkf2IB%vQ|pWt1y#Cxys&Bw=Eul%>qmM zSLTiEKI8M}@ZsIWI`_z+?d^r*ATQCVJ?`iM#^}Lyg%nm5CGt_#HLHn&2C;#pytrg6 zxqOZh2df`SnMQ$e5gtIE(tub;z{G+`=z*@ksZs_W&BX5(g}Sm=v8(4ziOMl! }1Mt>caI5nHRB?Gs@7Z%=kj=A`X z=dcxda-Ff--EzOf^;Qb<0WnH-ts6pqX7uxZ4HB|j2hkfga*HkM;Ph*{_8C3Hb;xL9 z^BE51oetzDB#u4|LkEW3C=;gegmkd8e~r=`k!#Fgp&9urEIBj=i92~ ?bu{6!ZW NepuDxepn6 3)d`@GbNB4ogCZe+7PmsxDTuD+ZSNf^fgq%R^((ULUVt%k@Gem)o@7 zMSY0zRsc6Z$iF1X>Mw#Kc@1bfaZbYFOZ6>ysR-coP0^Rf!BKPyD91|xZ7_5h=1g0? z*?PfMxnZxVjkNJ;(ZzaZ$*mw65-e1i?HWa6*KBoCx$Yn`D|)8#s#%TL!xjellz*Jl zMq;Qf_>c`n&QSQ41(t Hc2gJzBQcoicLk<5sl<=2rHX)%Ps!( z5Gd3*5|2>Q#;bJ)_{6QGAl5!8HuEnAtP@&(psNo<5!CuWnh<=Bcrbub9>0<91BvFe z%K7OS#j%o=Ov52P(*uU&YqMrCrGHw6ERc0gso`ht0xfduUtaZjeaamM;&?ePKq3We zv0a-aTz?R-ta~?9uhjMGI 38Qg8W+Pmv`A=5g0C(b5rgA|EF zckH@we41VPZW}M|@nUTQ(Ty0H(0Q@$eYBuujmj89 kG-CGEZTec df7oe?O>lK;I #3x_b&oC; zWqV*p6rn{44S@NT{WCa`76 PJ%*NILpDJ~naUzf z8+~WHH*UGoiBYC^A<|Xh|K#gl|CY9B9r=UW`GsN_)ks4PPH9O7uIoH#Z)LM>%m%yd z7Vt}aPS1a_$vuJ1R)1`sV7PSaoI4zf+W9YAaQ?5*QcA$H8wvk*Vm`k0MV4{JINL8K zU6r*wna!#$LYdO*aY*S+h0<$Esm)2LO~qv;3Qh)ibAF9PTn;xYmBueNY($UY3*Q6F zuopPBivm<^%jpjL4 zVuN&my+7bj_k2h*TNJlt1=Bdf+a=o!^TDla`CYCV*Lp?KT>$9ZPs?-OHlu%gY0-R` zFA@FD(`UG^C4Wu_B9;@O86xfwhv6mmr43>3-tjW~B}lYqKpLEDLY><2nlaAMGn9y5 zD*x%oBy392P7WX?p_!7*Tv5j (370bC&NWX z-}v%^<&ghcR-Yl|ur~#~e<0I7Uq*W0-m~l;to1qTfq%eVEp>PDK~FBA4-;;(o2yRD zaEsBuzN|g7(cNsdJ?X&OlhQ8}WuHskrMbqOpyxNM!pP_Uw zSEgh9q~%yx Nz#D_#)T#=Ot0MJ z5Jtxw_ z4|%?@6P3cSB}eh8 x6o8%BkuQP&YGMzpZ%35MK0rt1<=o%id+r1PJ$s3hn`YsKKD)1qkj6;tj_?RU*Ep z1=4|(tWmO1D}uQ(jG+6#qZg}Ud}xK-^u(dV6n{ScD-Vtb)(VQ>eK^my!Jq91{x-au zX>TCHU_(DY&h6|=hHq2sWY^QDi7-m=w`&FBdN<|mxCj%D_cL%gHlc~sA7lVDp(({X zb~$#zF!FUlL##hE?S|&U$PZ}UwJle$KP>OYn-j#D69Q(X*XF%$K4`l$IKe4{SNhp- zjej3g&v?Xu daeVSZ}noB8DFXs+mnm1^Pqa*Mag#LazldN%|@`f!b03#Lt3xk5{ zx*q0hn<#a4U3tju>Pu2z$Vh?EjT3#j{C`CVF^x}_>Edd%)R*vjRhI7UH&pn^W}BrV z#}xhKAyj7Ax-^scZ~HVR0St%-XQq&Z2+@xstg^U>O}`LzYwWP;z?8bg$#*>2{4*^B zzj!(!mrb9TUi+GsbJnZ4EVa~?Cv9*qA>%tVEQf ur?Zgi-3ePA}i59+;ZA0&{qO()UE*7N2!};t}h;>pyex$Nz zdUqv@&bTkaj#ic-vx8VHkP_|mc7GSQM)D@QLgOJQ*Dl~y3az;fnjmu`JnB26#>YVG zvU~rIvzs`}HhpsP$g0H2cQE-IRxx?i&xVnY-gY+MZV`5VLgzYL#4CO5Wr)z{pcC|- zPQg{MzGfdbzjn}k_nw4S6Y7=W{(UEquADRQ(ae2Vw)ft}doIqY>7}svpnvC1#p&QC zP2Wr<$)>)PXZ`HQwUM$N(%|J7Co~P$7z$xW@d6a5xj&Wm^IF*dUMEHJBDg=DmY@vx zrw!JHKl&W7{ ~Cx-kXqc7UWHJG!gGfn?19yO>b{D^-gWQ$GSS) z-puNW(H~SaTfa})sQWhapcD+>jeGO|W_v{v4CNo5PYnsAhf60%qbao*7C^g1R04O| zx1TBd8@$GanJ;wo7k~M+>KbQQqHAFde_X(#pb(i0L!()dc~V_^L%wVfqY5U4zIQ=_ z{u7U?Fm`uFKy*Uei9mOVqd0ut;^}||^v<2@64s8|jxctKI0rj6_@y8+4XqyZu|GHu z=IfESQf+~g>e|rC?SV%iQ0nJR395SNhyLbnuXOhh3gm(AH-F;3Zf3nu%Fqw%xh>bT zZ;Q^wcrl{a8ScdBLC2Y4^Ix2{YvvNQ?xKx9Rcf|xmi+gf`hl|{JXQ587z$e|wp3<$ z^MAytWnN&(0g-=FP_6_o6v IQw5 z+xJT$NH2f18tzPFGW=RN!C^Ik`lh0w1$XSlt+Xi-M1NyAWXzt<_3yZqy?da23(wBq zRnBwVokEifSBgzLhU^i?m@2f-YRc^f1FVu03|Yw)$UXK&z{|kf$)-PCwoEDeW8#N7 ze{9+r5{P2FLoya+jm8An!4s9QHijtuR5=a9G__`xWD$Y-ntM(ue{;@PU6Y$_rmsEc zG`r!sUVjBpZDJ=JFpZgauN?1yp4kwcZtfYa*#|)eWdfaFej~vw2T^|l{Lnzsq )zOJf4CJdC6$5JGQ8dOmnF zxjfpQ825aPvX*efPcXk A)v*O>7zlRv`;|ui=vCsCyq&GnrJpEzn1R012f2n#86Nn>l zHqR2?KLGO)V@LOw6=!~ZlkNvXcWBQH{+qrnzkj&xzQ0-Fhk-Y(e}3+eup#C>;+o|L zxqmx2aLD1TpvmBedwag$Nb#PrET|u9ILKzuu}H_fgc_YsGJ%+hk$Lt27VxP&%@)Bp zv9BCdARdcNjIj@+dEy=IlOJPjhoCosanJXwXkc%U;=#{@9A^tu>Ms#nY^Pjs#fC)g zfl2tr7mP~cc=W!8LC`%L2kfuI&_>1r`hQ?UnO58poP9L4Zepc@wgHV>393+SO1yE{ zM)t5gm~o>-Kk(Dna+=FjxZ&$KIR}FKzeAsnL^*Jz6$Q~aYxi0uMqD_fGW5Tv#}Ya4 zntBrA>}eRxj%0i?IWH MmcEB1k;Tn+`%;>b&X)1*{|@y+cfB8|AK@z9>&F+_239T zmZT^H%;ZE_$`Pdi*t$4oNG!L^iGL>E-#IpfG;~xZ5N^y-lN<2?8y3RBnfAjR8$ 2cf0htI1~`PnJ0oc7NSq(IZcA z8b}(0-t*t2DVh8Hgg2I+K=9AMTXA0?M*`U8O@t@ML)c!9bCc%%m{%L3+?{^a8)P~I z!}DWb^!p!y|9WP)UrwcA91I931m=G}yRPKo=w@!}W^N|q>GmI98rquM5@ 3=}rBBmm;=M*`E6Ht>$CrAMzfgtnz75)dr`XW~I)` y-5T^TstezIPkGtwWU;TT3!S0a_!WW|<-Mz5Ju*O6qjfxRc4w=Z0lDGsB zOmSFQwnQ>VD>9fOyosBU#!%^^Pgt=PN99>!$@x+m@hGb1M<2zpXn(yJOx4FS;96}Z z0B8Du>{Vxg(?d(4qcZ@|S^J}skkgeGMX5jDzyf_p$V@kkZ=R`s2FIH}yS>Jt*!fD) zei##f^Vl-IUf$U^mM50=ouZa*fKqdm#$!4Sw-nYZfpK*P7sH6wrm~~Gq*@*^sBm@K zbc=O(Z76dKNU~g@0e`~MM5Rn3MW^ z))`o0G2xb<+VtbprM?nKsH%8H=kZdYeu@io(3UM)mku^uS$`6z9a8dw@}^ke^mgRs zQ5g&rx_o?G4d%U_i>J&gw-=spM{6NhHsFRmNtcI*&rU6zJ5ct{vz(?v_4WTeq=uz< z3`##q0;Dd#D&E eB8 IKxkJ% zBzaI}g+%cSj*W9(tXoPk0S~aKIJ?_6yq6lH1Ah{j@a_mb3ndjW`MxqpELhrkWuPm5 zV{)lR@-_LSK(XzDq9 Ro`pFS8zC?%>5Sw(taOwU+^dZs5!KDhPxu6bj}Ibp);g8w-A%DJ(N)PFFpdYY zte^ GnX ~Tz}tp)l>g~>caPAheOn5)e#Di6#YD6VO!4-f>Ym3 zhF$lL;Mwj?^wLQ$ce#%>U{vRw52c|`00|aGfZ|CdFIBnq56rK7X!GO9XSZ zOD#sR#m6CDDONHpzXO}J6hBkF2ZQ&ZcDYZX2rFu<%3t6We-%;MOS}@l$7G~SRcuBK zzC48FfUVW!gzHJSGs+M8M$b1O3TsZMdiAOy2T++eW|?_A3^QJUE=^Xm2Iz5MPTL+| zIZ}3|Z^rux)ZZ bNTTlq7LFB!&`6a9Su`|n-s1%@f#>VwEA9jR!j zTcQM=Y=yh$(yxR*Vl6fcfOUHUSn_lGWB9z$$47Ym`Ipcc*xVwI5P#LcC{!JGGBSd7 zEb!tjAA{H$UF;Fbu0pPmK97jLfQWunkNly{wr|?p*09zO>V_oQqhTVS*k57@1A-JL zQg^} @L7rMCOSbyn(ImVZkpjvHOR|s5M;4y@C&XGgxL8*yg>CtR= z!^r8vz&toxwC1Z{`sUZZ?0W5s(N}DG6B2&-1qAw7q1nh}p%V-(PW{jF_IlpteqQc4 z_dqL$3lLUFPDi*X#LgA4nD8S_m%>Z9PQ&0;6;L{sff3_*t$#C(YP!XCW>0;^cCH5e zI|`5~#rOtJA;tMdPE+i>v_?oh_-w{a75L&Q@w`wJ8&{V-_>P8}z2@T2Horl(y_4z; zOopdP3>uG8@hh_KYY=(>M{u_R9^23yd=r2axsUa%30%83cVx$CFWHf85Ig&uUJwqj zmQ2f$Nb!VfVSiSRY6Z(h55WFUgcp3{mP4Ja7*K%&AVmX@p zN*f=a?mzOpIU8}1+u&};o; pG zAScvjTPIIXl>ZVRmZz4}?e13}Xd@Sz8z&0u`!o>v1b@RbsI~!~&0MvgyG^Xl$?yBz zvKP>?64jAnUe&h$x|{@7_uge$7*g1{7(w>7^$!g?WN>Wv?58u5pYslA(S=Xp_(aRY z>F5ayr+ieQ#+S^ncuzeq nYHgEc}J>6`)~4+ 7>k_=0Oe^^X45Yr%-Ad{fUie9{Cwy_Z#HT z?0;{(=u+0-8j~c)siw~SrMHV(Hu|P{&AM2rVV+8qhx*WW2mUZ>96gbUWVwUd$b{1G zXa!O4dPA64iB1TX PY&F+kf~-NvZebeJIWbL+hF8OregMMBVqg(0d0U z);koQ9%^`Mq3Ed#D1GDL(1QELVT2DUVFeGcFBN>35yki ltW zu3EzJ^YGiDD)l==C+v#aY>Zc#dXt=DGlxw}Z_>;1kd(v_OzP^@@*-)GhY91y+*T{F z)U4gp1#&>2A*#e_iI;8V;*$Ql<$rd_LW?Wm%CT0pDN (4 zRDUm}P@XK9FjnlmRk(+0UE}Los9$Kw3QDyWLgL|RjS4Wd^hE^#!zwAdi9-0ZF2-R$ za}>8*F35{ 3f5_q8!Z4lvh}s%fL@o$ z@u@ch8-&Hq9BkaLYh;_QUD6ut*kV@MbNT>(^f0_2qZcO!X;n {r _6x})JqbzgWsw*INHSwG(&{Y-0O@A42AJol7A@WTr4u=XG zD+=84jxuGxAzK9@Ji >Ilve-x Xed^Pc73C2SPo=e`V7;ZBYu>x=tV;VxS;R)pyctAF!3Z0qv9XnXn=EDg5BWD1az zZeU2Ua+fI
40h<{3w( {VQiRjn-@ zjNRN_%!TbN9se1$vj2CBUM*-nyfgQ}z1tzUlEv1hM6d}0T}aqS@t_7XeU8G=G^8Oq z5q}-(bUr%J*p} ^l-I!x!7_ y5HpG=FbP{pS&kobrfO~dFfPAF=s zfAatQ2p|@m9l+vzoU4Z$9Nk^f_$!mf^?#Kv;Np1nO%7+U^C%b^O9U1!5-t%|J&)7; ziINGNiU}-VDyVtJ#Q8)1Cr!d}(J*6SZ(+{{t*qa4XYZ-4o}sXQQSknn(EFW|;3q4h zp0UtzffM~RUFPqQ?oV3M-?8ETr+a&XzLEt`_Uf`b>u18}0=}<45kaH0pO}-s?SCSF zOP2oHv_u)0zemiR*{A&|mf6z$5iAKPUE-}KQioE1S3A%Y7eW`WrqT#6hEYc+k6vK2 zNr4*y5kJSd!GvXRl%mrZK@q20Juif!G0BqfjLAW3)I%@J)*{xZHc6wIQd6G8rS;OP zi_Br?k JUc;5TTSxCQH-qW`8r`kGlYQNR&{%wsI7lTM0DiDmDBm_1>zL&72JG zs?2Fi0o?|px05HwUzh9Rw;(ZvR`Hr2oL~?p*IxvbZ@WH?(dW24m48Aw_9a&3Y`@7s zD+|Z)BV(^CtccTNe#;iW3N5*@THhP6y1Re9d|sQyz23#2Ji!q}y5$<_$$yr9iGAJ1 z_wL$ a+g4jq$Jl@)Gz@Tz+*Nt4fO^*UUprq#OEdQsSSTVA=~uu(#&48S4Sr+gVD zeGlRI@$w72`@Ab4)_dMM#^wKVG>I$6_8P#0D4DCu1d*7PWqloZJZM>UEL+yt3%Ih2 zxoOj#1ol)?s^S)2vo4<{o_}s#S~R9*s2oGhKDq+ZUDr#*x_&VpPvUZP ovzWnHl?>z@4`HVT{`ofAdCYR{T0&T!idNjE;rI?Nfnp=T&{9Ng=BSs|-? zoC)22Qfn)3$0*HfvBJ!Y@3cA5HGj7s)4naey-Q7nL*t~jZcOszB!91tn0th =W-ioKcc}%tQN}N|koz_$ zubOgmeJ?gNdOAU>TP1`ijbN!a(ru1lpK}^9*W$nBnp`XQHh-f&_`#ZyAB5;z+p?QL zy2%$ql`w{S{=s*qm^)sMyGeDv4{x_Euv;wWI25nwRdXdFml;Q{Taoq9al&QG>99jp z`Q`)dTE+TQ^Vau8EWJyhXa-v$I1*JPuA1exvt{Z!lZKv(YC+A@n?Zoq;=yo25XIFC zWXY;gfw(j+)qiTG>srU)fNJZdRTJZG!k;cio*e@MvXCctP#=@1g~&jc*{%+4(*ykX z;#u{1xppySrc|c_lBy~aN8b*q)kzcc6HE|I+@t{5TeBt0IuMvPPiqlKvShY(K_1yy ze t2v^e zze9a1@{uE11PG{2v$7~hXqI_mnh_1T_I#OQsM(t#+o=*y^It5E)X=|1>2`0Fyhc~! z9uKKq=Jrvj*ekSD=Cj;Em7Xe&tLwf?&>c1qci>8u(|tg@d;rxb0B(*|+sb@y4E`FN zc#(%Ntbcd%!5xwi6C=f2#BxX`J+*l&B oF-$558j@Z znz*W&YQSJsNvBnavvN;g^^+nQALFN (FFhsE2X6wQOVOP`%eQ80q7Q)WEI|p?~AC?lLg%RyL-z!i<0y?SUJ5YCX-w zU*~xX^rBOR2j*PiIJ_w_CTt?D|C%=_!`8$}XJyFcn*ykgHMmoQ<1`;p?$Ec$Mh)DwIK9LhKfa>30dvwbe}; z)PGCmt4tbEfdf2HmWeN*D>d0o)$rP8R6mG|VmzFI@HgPeUUjt5dC;7dF!K%_%;*ed zI7h02x!s|4c(fOE_JOCv0+bi&ttOvkBKrCTc94EIS(|qB^)*^A;~)6^#9TT_Ve%i| z!(F|w?&DevaJn%2h*T6*L{LuE`E?iO2!EQtv}Vl_;mGOZAu|i>TD13ct~)PV?9i(j zRiF9|6Zy{^7}G`x)U*l78o1-zG)2`+@aw}c)Hv7-wQ`34qCC#fAP(->2?0&N+MV*I zaG$>zWJ;)EC+U8j;%+pbdb}7XhR%N2P%QDJOJ)xy1Z{GLpAGPsz^Wj(e}gv~7k>!= zKgQP4ekWHN2t)^Ge@tJTq75xyw%@&*+dnTs)!qjudTZWUJc`;Qh-y0tXqeDF8QYb| z7wIU~m4_U;5?x ?f@jPOZ6X8jA8Z;SVY|55dKY6(>za?<(wpqN zILnddUZG|bC{lhwjY%d>;|ww1@I=_Za`Z2~M-2(^>D>E$dp#6G7L=LJwZ7jiJ>JIT z>|!uULEQJgjqx0F_wV_@=*hEQhAJJzGu=@(@>(h>@>IAlM3+$9O_H6wXn%3}pa@!n zT6*gZYW1#nk2VQn9?}PaF~Ot |{WCs$y$ @Vztb2lKr{8MPb-DayQ~?T@f| zMJ989q8%62jrozkZ9HC?^?y6O=1c}CPCH_^zi q2cFRG z6Be5;)q^pm^?<4jn;6r! HQZLi(k0JFxn?grTe7_Ns^lpr-zR>Ni#o=W78g{ zHyH; zfID&gmA#|K-`RQE!&Sihe$)a|0;<_DGJhyO0Z=iM<(8`qyEIl}AK2$L`i%f~&k*K> zdw7EcmoWHj%74^`7~vmH5N=8!`okZ;t7tTy0`*u?T2sxxe6bFMO2!Wc%N;b8^rAQ| z#s!AmA3yUl-JmUe$*vRT)G1*bR<2)CC^ApC%;xo6@@)6|{Az+*Fky1Bn0qI{dNYt8 z+>>w`K603gfkW1WLDQdUY1CE3wCuX^vr{Vv{)Zx$AAfldSh^L#n#$m4!6!dDB<~Egf3GMFKXMVmB)!ixA#U$ z$?q%jx3xoOo0vKpg0hLUNgVWYa4cbAs$Mn#lQ(uJheG?(8I@SQ(H|D}W%MqwdJrFd zo;r8}sA2JbcunwzPa=P~W|9S~XXlydO~FpQK7YD-<%!KFr(VSG`9(@|b5qVeF>%^o z%26E>Cr%u^-}ZW>z@KRTI4yo_<4vu0-s~>Udt5gO>g%y8Ur_iRGWaQ$SL#okPjl|x z3Q;Fe?R$ftcc(P`rUE(LvvZ>R;9Z&MUVOAp<{JCL)D5aIJ-%UG0<7|
duG?on2CIf&e5aC zz6aG8wTL$G@k>NA&eO?937V3Vw5W$ x7zfcf!lMxLk4Ji+{@XpP|%=Q^UU&()EeGy Uz1+YST>$P*k0h~t0GKXY;Pur@O{lQsAL7yGX~HGg}> zWhJx#23zWy(6|Q{v_a_NT_pe#YBO^3>z1Y MWzEouWS(lwm;15{l(Z)Qwp+Zs;lv%3T8L-yY=bJgLDA;x&f5-54~8e~ z;q%N#&Uf8iUJQgIl5`nqF2tMk^r6$x?WX$DVO{f$vh$0KwV{SpA|tFaeShazgVFIA zhh-N=rpMI+UyPPIDQ26Ltyh}C@wa-ZX%}TUr$)*)uzkl4FBQgkX)T&$IHE(xFZaKM z=IM1F`#By;F+o=k?IflPwg%(vAGX9Xv$3yEvKpyEFyJ_pA(Ld`7CF`0tN(3+@ck_#y6 zqp-Y%c>aRZ^=IY3M{gif6%+=Lu>rV!<`cnhRgYmt>r^C+8ZpDcAAga2_|s<=wp0S? zH#MCyTox|Gz9|l3ul;^dE*0eh22!6H9t(=}k$%BZX{7`*PPHJ@NIf5tfM*e#QLoUx zG@FTai?}bFJ)75-PLUk}`^#dVNC9MeR5AZdQHnCL4phY7S0V3-rE |-Yy_W3oPw3Y@R@#yLCirji?`q&oqgz43EJUP|}x_>@eX!XJKdk4Ue979?| zI5C8Chocud_)}@P`uT?PO$H81x?V7`!^3>Pf}pm-dz<*XeEK4vhdrV(3&CI3k&WJ4 z7dy7%a#l>6$vaH!vKOg8SqySAs9D`v2zZ_(DmC)%`mWdjUsHz (*^;~|SKtPue|C ~}YyjV5F*GP% (0V@M@6V; zo$Oa?{C_I;cCv5Q+pVG4fSMc6zP-SHHdb4>%N|W+xL)vWblL+C?G=WnCeiGl5KCvv zxOF>k2Ws^!3{b4to~!7sp5ZHZ;cQhx1y**2C=aJSPY*1FGT5ANo_=GUR(!#GIS>W& zwKFV}?VV(^ty;M3c~86qO|0akO)?nob;M8=C4W@CbY=~NdS)tRJjo6?y7>iFn2uKU z fw4xP+jcx{H zlK@dI-Qp&+uJj(yF8=YCPV6pWMsMR;6xlYvU{YVT$5OXaPCYmJ@tSRiR;m#A`eNh7 z0e_S}_JxE{2$XYHrl32vV|c#=b5L+J_*$d1gMES*RwrOgcs-HH0dqZLsh-*S0m}DO zo$o+Cf7-1;+0n#J&pHFvc)M=Kai*U^HLNb0-y!;O5PoKRsK2jgTXG8z{&X%VX^J<{ zRc@wSXi(meNXsMEO%?6sg>%+DQsjZ?d4KIbfnM-$E0 )S^1QV8|x12b65aFSevjl~m4|(+!`F z-w99tg=^BEC^KlR!wU_yGmfkiCv`h2$p!H-T&O{u3g?PQ!((MQV;&g($g2i`;D5<> zp&Zt?8WlkI?9wo)SS_vo4l5xofp?o6p4DV@DQPU-68b*VoOgvkZzoBAe4JktzXF{) zC5}HtK6$|keaFS-8^p># F5+M;pa2eL@06-D8Gb z2S1{O;w<5?Tw^trs!TFxWR_h^=zna=FZ@~{m_NNO?gl!AT zg^)+XWP(FSR?;!lMu(L}jtVn)Q0N;Qv7lN~P+9&((tu`woKAtPTUsJC`+x9(5++un zMz{!gdeQA$|MPpgU9dm^6l=%@Dz1Y%BLLl)Or4CWP-NH$)WKM4(Efv&PVknhgErxg z8cTW7NNq4P#2Nez8>g*f^CmJw{J;lpG1ZuoQ*YacoF%`Py0(<|x!BZed$I*>WUB8J zOEj mZg|`-)^CuHO@GhXduu{_hx7@W)e^NMKLcS5e)^t(sfUZ86$f!uC9aMI ztm3-X2&w{3mJZ_y`+)BVJ0-C^weBBo;01g$1Pf>3fMT_9PovDGPU>qSxxCSdbwg5b z>KIUEZo}m*u0ZS^{&nJCAdIP#XIbfxh%Y)4BL}!zCtT&g_9&6m%zyQ)i4U^cO{)vF zZ|X)HxzJ|lP1!-^{o3amL89?B_X^M}a;fecTj^Th6!&Pex?s6|kFr~*AXFk^x5vcS zpTSAK9gX%}VdP) XlCY7_Yl86C3SuHI@OT(*Xt}%sbgD0@_ z4dRJ@{l!biH;wT%F@LbL^@{d}r>0|K`;tlB$W^EEv7Sfft2aiLg~L>s5FR$yD `XY+9)Ld=CIE n*(M?s9)*l2Wf!`@lLc{=hGvL=z@LNx}zS zP`D8egkgWS701mpAhHGnCWIbG?KXPo(+4}eQ+`S>1lqE$BNgB0<*{1z XOrET^Wb^#7|6h{krhjVzILiMhlx;8|AfEqOrI;G4 zng26l>}F2(55@kAVkuLb|9|YBEvWIeFsQ-N14E*Ptj*bR7|6-ODhE?-=njs}yYf=0 zZxotouFk4#lG&69~RbVjbJc)CR?zQ}W(UXW#nXY%Tl$zCWT5sPdh5+=Uzk!veg! z`P`DmK!3(jB;$#D%SFuBumR~V-EdX%`YCXz lu|Tz+E9Cz$k>8Ow~d3~AU$g70%kYQNA?tA82{u5~`~97+5OZCGedlS4%XBjdLu zzD6X)dXOWVtjO7OO--<@-+HhuenzI5446qa_AqWrT`sBB|9mqg+LyRtxzZU@EHXU1 zw-SS@9#62wYN+v}m7{LjRk7 {Ju-!aL`Y6-nU4;WHQ@;iH&4Um7~cd&n`phaPMhmrfcfIic9q{4)Cf`ls+xZx zYE?i&X83i8`=XCsF69D>u`uP{hUV$t)?1C@8Au}h0q6LGRJ#fpE$UpQN#@=#*Q~h- zrMy@rtK`s@AUl%-CB5sT#(3DtGjqX6>3>J~($hTJ?|??X129p-fhS5Se98kl?JXYO zW#~mc%pKCEt$*I-QCe@5oupfVC*sK7Wo943Ud7FiwOKeww>MKUa%AcL#P0wVknm;g zNg9V(I^&z95ap0^lm{j#+o|P^h)QP9ZB2IwbFFBH?5TRI_^&`kv71}K|A#ZkAb OW 6mC=xkPSgoVND#w807^u_ zjfzO7~^c4xaG*K`{Zf&n)l dDwG z$=+L&4`}X^dJ_Cn7PK6Fwtq~GvyA1%P9oN2S+i4sNEsC7nCQ_9LjD{8&TC}S2#cmH zg iZ6Z0AW_*vR-PmuQY}|3 zp0?%OilBO6U<$i4W0}tB87BO?{j+EL`TRJ BSAPXFI|b9rUV;MM z1+0F#Es^ZhinxyS>*auF=tW>hsADmr9=Y#!SU$}0{a${k-LE4ne_OyWf~3u>uR5|j z#`91trQCDn-qAe(!4zIO*(j?o~ zg1DfP5F;A@&E@OzUw=_IrD6%1`jlkJb3P`7n@pR8bEzw`k(T&dQyYyIF(i mU zSQ`8a`sc!SyMUm0CilkfK9Lv%|7RL?2vdUHt1OxH_*8l3=kV#)AU`6teCP~Ku;byP z#~&weIwC^&G{ms!mmoh9H32M!1ju96qQ@fD4 @dSe95@XE*(q^t|6p%<`J4=J8$gO%)@a6*9B zn|8Tc%9?txf`1b$$ WH0fR<+J7u5&FZK)Uv_EdSak3?X0?@M zD@e2J5e(vlw)Au<&0wGd8fzWM+wG=zj?l-qPAydSHra8YxLbeSIz_BQmufEBmS1+b z&)sj#XJ-Lud8?bV Ovf_bj?_xJwcfXM b+wWp;x!oW54&0@hHRex34DqH6V-l4@Cal&S|F(`l3R6+Omy#jBP46O=sb3 z9K6hXcwuE2+iLBl`szVm_yB7_l)si(xrjQR`nG|FXO1qu!~2}mTg!Ugz2YOC9<1Gs zJ!|Y|mO_7nKzWp@g5-Dts7dubF-r;dY&O)0I6?pqWqVch&5HUgxA0@$A!qlhI*9V9 z%N0&waZDUOSBcy$v<$W<6NxFD;dDooF!bKUJKWw>N4W51THl1(&NwK9MKp)4y8dvh zdF>G|G?*bU{tz b=!!=xkdU~V9> z$H;`LBo(L&m|@|n>#L3nxkSJtXwLuUuSQM%w0!QS(`a`w*5kvn=DGEB2jPB84X*m# zquhJJEK)U8)PaxRcP$0;38Ojnmr;b%)ocsAXZ@ql8T~MkTHX($6)fBIirQ94mDf6X zkB5H*E}y$1WIBvFfFK6vNb5Tn{Wtdj)1T?*&`9JVAcuYXWXSWtD#*J9sT0Z1#EO2| z&pL*@>cX-;iaeP1vIG*TBdp()9}LnkAY{P3QBmtg{l#bK)W9Pb_%8ynq# Wn7^6InU0wiZq@ZuoofXOoacA>_PR58JZkIsql(6#2pCZ ziU!g)1@H~INtz9@xDI*S-*QciqaD);I6{1o`lHRqXpyb?hMhZhjND@$i-MVCm^y#D zYl+k^Vt#_Ua0`7ErG~bkPa*%pJGAMrhWB2}R6&TsmhA9=qF5U40WvY5a9s9^XyOsc zkId!h$rhc$UHPj_T)ny^HpEfiR z(T22cO(ojbkklAV26Sq0ys_$7cdviM2V!~8C86vUGV!l^CkdzL!Glf06EBX`;ud!v zKC`#u>-N2mxm)h9tG9##pwkBuFmPyQGV^ECYD7e4dSY_XvDo*lG$u+?fH!o4SqOjn zz1WZ{G%TDyWcB}{>>Y!2X_T$O-fi2qZR=^ e!#wgXNA7e9vF1e~sj^VbI_zuQ1x@2ien+zmz()Mc^?@s3NmRzX0`-Tvw zH$-O 63nuVQxT0L(j9(1!`_eO5e1{^60S4daZO=B%pH^1W17 zj 8h2UAM%F&GzG!gFvqkd*6)$qDSGPv6k!o#%%u|T+z;eczN})ePB%Dc zio*7adT-BvtL0yGtjd4WFp+neH#O5OuX4YhL1Ts)-@`l$*;Pg9ExZaFMU!*(3-_Cv z9&D&tm(`+Ug&EORbDe#tIA4EKtrh``SY;GoH0E=EK?5g7R4@dXQL}sLbf4i2Bi6zv zw?+iqLQy1%8$?!;fFkeCKZol4ikV*n2pXUjvr_lrjbhpf@)Ccl$b=xX5=4*+K7N}V z&;aiunQ#idGI^b)|M5+_d&VbmStCsUmepKrzk$HyBCCWzT(ON&E`VwZX5Ec6p*-96 zn)l2C<4=*u6XX}$-S<}szbJvD#=d=jqYOoQB*lNTW*T ^WL){LJHI0#oKq*LR=^*{34-_84{tJb2b#GY^ z8%3#rLlaV)kW@UW@aDO&KRLWb7iQ6{wvP9;xXa7TM#l)15g|#u*!gAslv(@dbhrNp z+ySG%#Q^@1h<48ql1~Gc7;lioXC(?YEl4A+0a+LWU;2NIHv};+Bw?f~#9N5hb_6>Q z>>kX&AAb;>oog`t>jkafcgB8K;*A|Lbn{5-tW0Vxsema!NG`j~Yz{l>&;mYKpqrC# z5OL;A&1tN08iejtt2-;xg|*e>(vGXMf-}^T#C`!_$S{JKF)zEFYjPH0=9c11W=Uzr zpXqA5JzalpWDUw?ZL3%_g|)q$Chg5Nqo?WwejUP+R)uLDRr`2)QMOBWHf;Qa`pdW8 z;%m-GZc|MvOk2K8a`&L4+yiljj<24J9`F~dlW!p}eVh_)GsiIDY7zyo`;Kp-r!pB< zs_+#j|q!J(47i${Lz{>BF<@bkBL(=zLGXOGJMG)k0Q%Dmy~A9`d;NwY&pH$_#&H z-PWgThRFqDA-gsmX|;0EI>6||gmHm}fTdE)cTlLf9#p4#jy}|CF n+SyWh|A)no?M!+N5eLbozYzl2v91Pid$vh7ShS z6@!0wHTeb!4p3){j;P8gI~H@&8m7e>Z3yARBBzBC#hNo@dBWFLD=*#&-mek|m~a+! z;`F{@b#M(*rIB7uasGCP<=~C-&vMfoeSHfQYcW!{CnSjr2_Z233duK(G1L)*Mq$P` zP#Q%Y#k$eSp=lkXq67pv=EvxXV1~_xWww7#iLP=7&hKW(F||Z9r|WD>L>Wuirk|t} zm@Tf4WEtgnWOKi8G6llc);+gqkanuz%2G~Ham;n%-6@FK*Irf1i(|?pvv0B@AU~UA zehfJ58t?ES%HuGJ%qBx} lhb7%iJEN7Tx;UFTleYyTeT=@&w|{f%Zhz@4^v4kDx=dS~g4dqx zi=%wEji5yC4!|$CfbQD2EQDmcAVhzr`zB1hq1STLjGm1F5vnN;Lq<937P#X+sIv}< z_eYAX{e_;HL-r>Yq>wIp#sN(~hy=9sh*|LQdxWe2#_i`{lBRu$_sI6Sfg%HVpt2xh zRraieP%wuPL$5?2!V*gw+AY<~awofyw6>9`wo3m{^4Fbo$@BQ-$r1ZhN?m_3BUxh% zZ-6$^OaX%H5&aZt1T{Qjkn$a)(u<_zAm#3%m130%M!rQH4v; t61^#?602?3@Bd Y2g{+-R7 zrkJcvLjeKN;{N|ga{rJRWz&B>B2}wl>4CC}#%D}tJQ2K(8w?`L_)A=ZnK-P08`T&V z^N4J1ErXTF*s@_PjZ8IqfUHC|>qa)K?OeF4gvU0kEf5?hoV-+fqwIfkr|dK9=Cj`C zTj~~%FP>DoN&Nj|=$3D0%YCQw6Gz~CcPt;Y0qL)sG0lzZK7Y?ZC|!sCD9(1nV=|pb zatz0m$M4Ygy;{2-ID2=%D3;$NVg1g)5Raz^2EuLHeL~FZ-Q{anBj~NOG1JbR0m0sW zuwBqQB23=#{tz?&!RUX`n+2NMULv&*EWzpiKfhS*Aazdlpr=n#C*KMAZy08BQ<=_% z0PpwL5$c)|)_VNYKO{X}Dxp$7QR?z{p7IYDOT0QK`z*}-Q;(+}Z@dWl3HK@gef>Km zw6P;iLD`FT126il5DF?*hz}i8a DIxqqo5BjMD*~`UZtZNZHJJuNI4|#^cuQ1SXc69j# z>H2b9UN+pcdCd@&+2pzbB)Syp@G@ha*pgPCB4E)$c1JDlQgPs`Oy+=6CO3^AH>lQk z`0R)|PFvePi{^R-`CGZT0eoM|s jiuwpmP*(~Ct-h{y!oUdlbb}8V&u9^XByjz z`BjOEiNb}vgPKUD3}M9D^_cs)e5TIxg9vA-2E!;j78lm$u%l}iE#}>$671fJeC2Sn zp( _#Fm~^uu$K5O&4}p;oOI#=vea74(++HmX4#6lW)-9D@Br%*xUg{ zCS0m{HE`O-iI8Nxkxsa=*vPG=JN7gmgHZ?-{gP{n2PW2XTLR(doJ3O%e+D`Wv!-Zp zyLm^hRpka?B_Ywm8;x?DtbPa?Dlz7E{UyBS9wmRn@f*kSwO9_{zR;Ig{iB)K=d0sf zq*PXX^MomBbQ=&WGoYYL?P#6yQhnRMcbR(ywN?jReh)n^U#AV2P#1 *VDLtYt5;tHNem@_f_p#uN4~bSXditrptoObVOqB_Hf8P z^oM`alO0|{_XTd6{@304J6rNMJTRVnVX)niS5zMYI%vND0_r!Uyh7{TXFY1ep`O7( zcD{2D-lAqF;|Qiug2y`)FoBUdk7sAFu{#*OZ>53yJL?M%PhF)^d(}7}ROfevf&4pjD=O%pp#Fz*26cZ2P@%~)qf)8CrYqyF`gp7TZ!4z^NJ P>lQt_4xDeG&ev3XdcO^PD5{_=mD zJ844$JI1=(w&7Y{o88>;uI^x)+7MBQIYVhKikxfg^CX6`p|C}tBBsJPi;**+>bKgo z+m_NQYXIPg$-#@kk1U2kg811Gc66Nbq$P!xD2#K-I0X^q36(aFtfwuj`{ZiKgk&Hs zVx*|>Ao^8v9WyD`m4_}deM`VJDja{nqB75hAZiqO!>|i#^pJ^K(C`rEvm(Sb6i74O zL_j)@S#CbdrtmY$zk_w=bXc>Dg>x;86SRG1gp?y8>dj1b0ni*8W2Cl{Y@5mO+@-Y2 z!>n6sXXatMbIg9KtbnhUoVy`8n^nO?NBC1la$Ygw$-{zCFZIE?Iz;`Kq3D0;-6X0y zDwOTsX&&i%e;tG2F&~jWRoK|bo|xV2*^lKjF2KuXKrI2s0072e6<~JJJ1X;?c!KRE z|D7|s{UjYOLqoWi8+61M9|hCk$uPjr2sQ@BX-S2!mM?f5aLwy`t{>tJt%^~Q!vdsj zSrZy8hH#}3PVI5tj&Qj@hVOq>Wm2#Z*2^lrMLOJA+tM9$LVatj;FGK|f9ty(;(}Ap z{yP*0He(~EB4A&Y2OcqDxK !*%9y~|H_1Bh}l8ZDvP5MNXS1!;wY4f_qpuute z@Sw2P4C}7RUd`lqRtu_7w7TvYx#ehIrrGEX8g_T+Xf&*eHvEH~%3^
9Nnm<@q;2STKDYPW1OwP;iFBvU &IE3Gjgl4 zhM3)p?(jn#uKwrxlFTxHXcr8YcLG;kUkqAqEJovlkd0N&C=97h`|5hRV{8bE#!R&} zna*g{H9UXaEK{r()RKROZeX)|9@A4R&WBf|03~*sBCp4U)vu<_UkAJ5FI}lU4pCRH z+)aDFC1jh%6z9&+(ToAbsJ7Um8+0B>hKX^5VpEJlJoY3opaqMqmu^iG1Y`kGLQRhK zj%B(AA&?{_1nkFb%0HYF2#H_NDmsN@@K{64E?6YYVx}Sir<8wdWPRvpAx-wstIx{# zwV8M<-@|_;A{ENIi;=oq+>sNRse!C}`pOAEX9uYkl?YEqr)xDNw9FH&Wsb0WG8Xlj zT`B>hJm-#~fpEUaCpoM+#6+Sj+u&fKOF_bXJbB2w4&NJup%arV8V*o!D)@B*Fx?E7 zOR)JuD#^ahJ{Nyr`Bt>0G$#`|n6tc@h_GlXUl6O49uxE*D2l$5 ~8z2rG*89#jgw-&_lBt%-0$PtxTq;te^pJyE>tg7i5PhsVR=@2Z%s zHltzqBnQknn)xxyAqfW(lMU@cR){6?I3>5JC36eYh8KUYSdvSEsJ>4-3`%7y0?ACd zJEM|spL2Si?BO0|E#y?W$|mEibrgR+B9HKqW}iziQCg5{Q^lkhnffJng6)5p0KY&dL-Zm*wWVv$>U#*fw zT;U^SuB(60#m(i5=3o+KvSX_ K_7hflNWXx9xPbo;o*4g&5XB5_Ep0sieOD_sX-;ZL5OK7>veojk-)lY@0TB#m zKpVvi378xV;d)||yv}rq6(=c{&Hm8Y nZWURxYH)D5uOCkAkBhiZqR~ zd$W0Mx*L Z)GO=3~FY%j& =+v31sYBCC cbzA=JeW89b0R#G{A!n zpBrUSj21~K)4B^#7@HY9pu*Dmd@au$7Oha9XF#s(PrB_FMdil2&yEVGL-zmriP!RC zd*S}ei3#RE88QD42$wf@F?CUJvUD?aG5vo`6}H_`L{b0B_Mx;X5v$Qc|I(6ZFBN}^ zrj(5#t<@m3HAb##p|)!?UU$om&4x-i)L-oXjX{8lPnkyoq3`>;d+%Y+F=NSJfHMtv znf?CQ?sUJ&egE7Q&;!aC`ljR`dB!}*Kp?>@7A22Dd7}-Z @ z&n=5ci@nV%%VHzPa57rfj3l3|TY*V^k}e%94x_C#T&s!-mPPd>NMyB}3rk+_kIjZ- zHj`D@ICBjdL^fN;P7B qz+iu1OOAZJQMXx@Kwgw=hMmlG}3O zq$ 17)oks_td-5`HIx>&%g|$*BL$~CLGshi(#2p{IfN8 ziS=(9yXtP4urC_I?j?WSgN-tq5%ww)omx9*UCwXz{Q)qz^xD7C$LEV_zrd>L2A~>K zc#leGZHn7cZ%#eB)*fYtwp?~VtK9#oaB%dKI_;eW-Nc>zq$&;6l3~fL!yiop31_Y+ z5g4>fq@9L;C_#v}tIn|l=g7SEh;cxy){BFjpX{Q7#fW`4$+Um7&fL#bPlhmSE5Ud! zUl9v#Ipt8k`4!n~zn@|&m*jt& @)PB7QK1e`xgiw|_hE;@AM>dNL6wdDRdZsOd z$t1j(q_2#`t(3;8CADlxltF5e&Dr4!@H8erKk47y8tUZkh#Md{VyQV06!L|D^b_v= zO?3g5b0HctpNxOBnQpxnN&5{;pX}2l?bb+=O{N)jM(AU1hg)(oX(0zMh&&PC^ppxD z^o%vw@9K0=l;^5|rd}A!y*`qtf#ijzZ`-X+T=z9IOmct5ZxndSc{1co3CqCrfI2|o zL32kTcJpr8f9#9vAEl@X PPhQ6YcR{e{i}xJjXCH*H80ALxHyFU-6WG@UAaM`_qp3t@ZU4FGW!G z)Gv2Y8htQBmg;v{G9^RZ?4gC)76iMg(pG(?py7YGD6BT3l$V^F!yuM5sGOrRs+`Lk z3o~4yV2EMy;BxOJ#^3E(HrT9^cU@worb-XYkXP)~SfE(+pu?13{@|0!XXFt)$iZ!i z$KdcFtXDF>3C%ED&aHQFq(ra0c6n5)b5kOwNA5>GEN{xM?$|oW2EEE{NyDJ-5t^*! zSvr5nQQ0#od0oT(Zl-sA#MYzcpjm$Bm1?i(5u9vy%AI le6ZqUxBt&`=yt#KOW>{++MO9Gc?CBTvoWjzKOV=itZ24O8^?Qt2Pd1``y#vB zODk)G-PQKS^4ZqNsr72*^&-`fZ&CeRdRTurv5!qg8M`RaLpYwa?R>vvfK@)n#>(2l z-o|co`S9`6i<^6sCyTrLi_g}zR+joR;~~q3jYjRIg@a?#@w)0b^FHbV+nLwYI=R2R z&NP`flx0cgWI}{e=bQz3FXt5IS@cPS8N3c=v|rb|wB*v!sH a<+UScpW8K&k~Zu}?$*g@Z-2 zv}5Ve@*h}75%c7Yp~evw >K;LSvwSyd`b`vK~0vN3mafwH&goT3*8#}UqHbJd{ zc@=G35oi#@4<9%}88vcR{*;Y2)vkX~B^X|byQkr*aSDaRy5aJGL7~3)+s5DqO5T*p zo+{|8CBkL}eN-5>kcPivHq!m5Yap6OhCAE0^`a#`sT`r|3&CFl(NuaYQrJqz#f=$7 z7HjYgas&&$c5t?*1pc&Tdtv#LE_a8fwwj`wj!f8L9TV;vPsqaup;}QD{<(j#=YKUA zVY%*lF9a%F5$wGZMqD`TRhC&gqrTB^gYzWw6z=d?v!H-D7 r znWR0V`#hn52_CZd?)~gQSwR77*{s=V)27SV20#26B2L6>@+-^GR$GU=oe(h=^ht!> z=8r)O)3W(6ip+6oa)vN$jNE_W4QX2))ny$-cm|ho*NHRZs>j MWM(TTrFVcW186&OmoERn4 rSFHDXb%nJ16MT{Zq+5_7evSPquVu>;(oEGX3#o4$8KT&^o%I>dy!Uz4}4C}P_ zdDwOa+%30;c-Xil5GZS`d!j)g+g6cIh)k4&M}= y)}nxqcK%1X>UM!| z(Gh={IIqD)H U#n}>gc-NQ~xvA1d~_>Ao7Zdr|XS8*d>0(MkgT@4-%PIcG|WGco0GQE-*`?7ji z eDU>a^6u-NwF1e9e@cbZP2i$< zp`lQm)h{vr_d80Y9hQ^{k%itz-9-20#1mBBjs bPrua4 zlaGHH8l&CvCHiC`{Mcc9k`B%I*J4>j;(uO@;XyLAzvMpsod)t7+dnnl;tRXK?tb+R zu1q!gv33(pTn?7hDfBi@p@sO Oh+9f`usDSM95g*n|WbJn?P19=$?PpzpHNAmQ$dU{h)7kOn88QK`wHKQaYQg z^RpP&_7kmO#w(Us_ d;HWWQbppi*6RZ+IQ71q}p*zSvo rSxa7Yf=sMqDOZ|)WRTJAO*?x&-sQ0s zF(4DC&_hGcKQ&Feo%iWu%w8Vm$9IAvYDa2tbl~1vs~!k7J~szt#u8Q33A&8CpMt}# zqk4J|CJugkC@=?U7fs&Jo$E!4i3fiqPiM#O>_q?3&;%9Zqj|eJF15MU=}D|IYMXN< zEn>w89z?7230kD8vH`_MD&^r$?_kd%02v{takZ9*!U25|=}~QQxm~L5bklJ7!3wgt zvi%DW?+@v>e3{{AM3tYk;4O1QkQ&C5H@_N+!^|$q-cge^I)oT{sG?f9>y&?LiL}rL zB;m7-jF`!FGEd&ofFH7lBT@+Y0l6xY{Fj5rq4+H@kYMMw&4GD2l>Yjt`G{_&?m?3{ z&erY@3}RGHK@>a7AM-T!;`87M+#)3j`0>#yO&^mec-RZ3VwhS%MN2z5qg}N3uVQcG zyCCeQH79*TyhoCu!oTJrI^TcM1FD}chA6h_nj@us+C$78hRS2SJ5^H%At2n?7~Yo6 zUu&7$B-im2uo|rL7eR 6LbyZU8u`oC6$GpkI^EMI>DWy 9)n@>P8#G6k1ri(Qn zuQL$LX1bZgAtF6>W>JoiYw1Sm7xtzouub226S8(m@|#6B8S-CC^IoS;aqoMH0JlO} zQgRCq#>Yf8tVXe+_|AXObe %&hkqs?UvLggL|lEON-5xMrsLpXgLSUSe}=aK>grPH=#YgjAjvLgRU@pPh<{m zSUH{GH=97t_JNNZdp$gReLRJ#3{M+y6i~Xo^M)XP`GZ-i76ADrmc=~ZCn~6Luw|L> zb4?2xTBc}R49kBi;W^zBE@(b|k3=2bV*v7~pm=iASG}N0#tGCd7xhzo!W5fth8b#n zl6Qs~{8G)+#Z{xKI?|{Io3L|((iJsUY3Gj9YL8-;e;}{ KVOPtln6q=23C|0uEyqM&TZ+nA;Wo z*gHpw@gNpY#GZrJ1p)YSTP5UM;gvTtlH|?{-0ytUsgIZ>O+a;lUUNti z;iF2%(`Z*C-FL@3Ztz5c9}9>>8>fRWBH($ay!!-wGaq_aHiD`S529K>b@51CF1vsA zw6B?zt}o>labaQbIfbe~lCSW{+HzYjPop;7W6ZpyuXs*xTsDJR#VKzSt{*0*1US+g zBz0y|;oA=}(Xy>ya_zp{GraNEK2h3dt}#nzQ=_!0+QN?^pMqOMUEcX`-;?&BsHdi{ zsembfo|Cjbp+tlwTUYqyK)SWh|Av2cY0XHem2{!;ZnY^s#HJTZpk*^53cp1yH*Pv% zC;(iLsNRs#_6KLob(GqaxHc=Y@LIwiE8-q26WKPxR6Hp#6bQO45ai1tJi+-Uo6i{M z%F;dHedA9T;~lK|_i)Zvdjibwh|iaWKvQvk-vZNjf)SDP1$m$G6~rH%wVQtk>H!4g zdTWab=Ixhm4ctk5^ZTd(q67-xbT#WpVtU29BUvC+*M=W_F{mE_Y0|9K$TK4;0(5hg znT;Z*d9IOV%;`EM|HSkwna6?vFxhU|Z3&?d#|r3A8Ofk~u9c&$HJ^C<=M<9ZjfcAM zEck4DDeWmTRcN&$^>RY6^?-kwC-|UerGrJFkMbG98N%`T`IESkb~EBWdFT(PG-COi zLsro31FBE$&g0A7#(^u@SjD`yj?uvcFz dek;bSImr`--KLbc zm!eIpGqyHx-S3U+^#EiV2z{dVqz#harrMP`CF@ozQi)bH9tBf qPJwP32cz%Jpa zZanbi;V(}HH~aKNB^fi@n#dw$50QzSTz ^(gxCj!3T-%pUY zWv3npz2k=5lZsxU5a)lcec54LVi=r4yT`pxAUoo>kA5FmyF Pd|HM#!81d+#p>StM~Q=^Yc&>FPPCx&xx