From 86650cfdb90be1e9416ff5bdfbd171f69b3cc8bb Mon Sep 17 00:00:00 2001
From: Per Eric Trapnes
Date: Wed, 20 May 2026 17:04:13 +0200
Subject: [PATCH 1/2] fixed usertested bugs
---
.../gruppe42/controller/PopupsController.java | 59 +++++++------
.../appcontrollers/MailController.java | 2 +-
.../appcontrollers/StockAppController.java | 10 +--
.../DesktopComponentFactory.java | 83 ++++++-------------
.../DesktopDialogController.java | 6 +-
.../viewcontrollers/StartViewController.java | 4 +-
.../idatt2003/gruppe42/model/GameFactory.java | 6 +-
.../idi/idatt2003/gruppe42/view/Popup.java | 42 +++++++---
.../gruppe42/view/apps/FilePickerApp.java | 3 +-
.../gruppe42/view/apps/HustlersApp.java | 2 +-
.../idatt2003/gruppe42/view/apps/MailApp.java | 3 +-
.../gruppe42/view/apps/SettingsApp.java | 4 +-
.../gruppe42/view/apps/StockApp.java | 7 +-
.../gruppe42/view/apps/WarningApp.java | 36 ++++----
.../gruppe42/view/views/StartView.java | 6 +-
.../views/components/DesktopBottomBar.java | 62 +++++++++++---
src/main/resources/css/mail.css | 1 -
src/main/resources/stocks.csv | 56 ++++++-------
.../transaction/TransactionArchiveTest.java | 2 +-
19 files changed, 218 insertions(+), 176 deletions(-)
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/PopupsController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/PopupsController.java
index c9669c6..9f938a9 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/PopupsController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/PopupsController.java
@@ -6,6 +6,7 @@
import edu.ntnu.idi.idatt2003.gruppe42.view.Popup;
import java.util.List;
import java.util.Optional;
+import javafx.application.Platform;
import javafx.geometry.Point2D;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
@@ -37,11 +38,14 @@ private void initPopup(Popup popup) {
makeDraggable(popup);
popup.getCloseButton().setOnAction(event -> hide(popup.getType()));
- Pane root = popup.getRoot();
- root.parentProperty().addListener((obs, oldP, newP) -> {
+ popup.getRoot().parentProperty().addListener((obs, oldP, newP) -> {
if (newP instanceof Pane parent) {
- parent.widthProperty().addListener((o, ov, nv) -> keepInBounds(popup));
- parent.heightProperty().addListener((o, ov, nv) -> keepInBounds(popup));
+ parent.widthProperty().addListener((
+ o, ov, nv) ->
+ Platform.runLater(() -> keepInBounds(popup)));
+ parent.heightProperty().addListener((
+ o, ov, nv) ->
+ Platform.runLater(() -> keepInBounds(popup)));
}
});
}
@@ -61,7 +65,7 @@ public boolean show(App type) {
.findFirst()
.ifPresent(popup -> {
popup.show();
- keepInBounds(popup);
+ Platform.runLater(() -> keepInBounds(popup));
});
audioManager.playSfx(Audio.OPEN_APP);
return true;
@@ -105,7 +109,6 @@ private void makeDraggable(Popup popup) {
popup.getHeader().setOnMousePressed(event -> {
root.layoutXProperty().unbind();
root.layoutYProperty().unbind();
-
if (root.getParent() instanceof Pane parent) {
Point2D local = parent.sceneToLocal(event.getSceneX(), event.getSceneY());
offset[0] = local.getX() - root.getLayoutX();
@@ -119,15 +122,9 @@ private void makeDraggable(Popup popup) {
Point2D local = parent.sceneToLocal(event.getSceneX(), event.getSceneY());
double newX = local.getX() - offset[0];
double newY = local.getY() - offset[1];
-
- double width = root.getWidth() > 0 ? root.getWidth() : root.prefWidth(-1);
- double height = root.getHeight() > 0 ? root.getHeight() : root.prefHeight(-1);
-
- double maxX = Math.max(0, parent.getWidth() - width);
- double maxY = Math.max(0, parent.getHeight() - height);
-
- root.setLayoutX(Math.max(0, Math.min(newX, maxX)));
- root.setLayoutY(Math.max(0, Math.min(newY, maxY)));
+ double[] clamped = clamp(root, parent, newX, newY);
+ root.setLayoutX(clamped[0]);
+ root.setLayoutY(clamped[1]);
}
event.consume();
});
@@ -144,17 +141,29 @@ private void keepInBounds(Popup popup) {
return;
}
if (root.getParent() instanceof Pane parent) {
- double width = root.getWidth() > 0 ? root.getWidth() : root.prefWidth(-1);
- double height = root.getHeight() > 0 ? root.getHeight() : root.prefHeight(-1);
-
- double maxX = Math.max(0, parent.getWidth() - width);
- double maxY = Math.max(0, parent.getHeight() - height);
-
- root.setLayoutX(Math.max(0, Math.min(root.getLayoutX(), maxX)));
- root.setLayoutY(Math.max(0, Math.min(root.getLayoutY(), maxY)));
+ double[] clamped = clamp(root, parent, root.getLayoutX(), root.getLayoutY());
+ root.setLayoutX(clamped[0]);
+ root.setLayoutY(clamped[1]);
}
}
+ /**
+ * Clamps the given x/y coordinates so the popup stays within its parent bounds.
+ *
+ * @param root the popup root pane
+ * @param parent the parent pane
+ * @param x the desired x position
+ * @param y the desired y position
+ * @return a two-element array containing the clamped x and y values
+ */
+ private double[] clamp(Pane root, Pane parent, double x, double y) {
+ double width = root.getWidth() > 0 ? root.getWidth() : root.prefWidth(-1);
+ double height = root.getHeight() > 0 ? root.getHeight() : root.prefHeight(-1);
+ double maxX = Math.max(0, parent.getWidth() - width);
+ double maxY = Math.max(0, parent.getHeight() - height);
+ return new double[]{Math.max(0, Math.min(x, maxX)), Math.max(0, Math.min(y, maxY))};
+ }
+
/**
* Adds multiple popups to the controller.
*
@@ -181,8 +190,8 @@ public void addPopup(Popup popup) {
* @return the matching popup, or null if none exists
*/
public Popup getPopup(App type) {
- Optional match = popups.stream().filter(popup -> popup.getType()
- .equals(type)).findFirst();
+ Optional match = popups.stream().filter(
+ popup -> popup.getType().equals(type)).findFirst();
return match.orElse(null);
}
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/MailController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/MailController.java
index 0e4016f..104151b 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/MailController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/MailController.java
@@ -35,7 +35,7 @@ public class MailController implements AppController {
public MailController(TimeAndWeatherController timeAndWeatherController) {
this.timeAndWeatherController = timeAndWeatherController;
unreadCount = Bindings.createIntegerBinding(() ->
- (int) messages.stream().filter(Message::isSeen).count(),
+ (int) messages.stream().filter(m -> !m.isSeen()).count(),
messages
);
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/StockAppController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/StockAppController.java
index aafa39f..80a8b12 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/StockAppController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/appcontrollers/StockAppController.java
@@ -97,6 +97,9 @@ public StockAppController(
stockApp.getQuantitySpinner().valueProperty().addListener(
(obs, old, newValue) -> {
+ if (isWeekend) {
+ onMarketClosed.run();
+ }
if (currentStock != null) {
updateReceipt();
}
@@ -199,7 +202,6 @@ private void updateTradeUi() {
var spinner = stockApp.getQuantitySpinner();
if (isWeekend) {
- tradeButton.setDisable(true);
tradeButton.getStyleClass().add("trade-button-weekend");
tradeButton.setOpacity(0.45);
spinner.setDisable(true);
@@ -253,7 +255,7 @@ private void handleTransaction() {
}
if (value > 0 && currentStock.getSalesPrice().compareTo(BigDecimal.ZERO) <= 0) {
- return; // Buying bankrupt stock disabled
+ return;
}
BigDecimal quantity = new BigDecimal(Math.abs(value));
@@ -268,10 +270,9 @@ private void handleTransaction() {
}
}
- /** Buys given stock. */
private void handleBuy(final Stock stock, final BigDecimal quantity) throws Exception {
Transaction transaction = marketController.getExchange()
- .buy(stock.getSymbol(), quantity);
+ .buy(stock.getSymbol(), quantity);
if (transaction != null) {
transaction.commit(player);
player.getPortfolio().addShare(transaction.getShare());
@@ -279,7 +280,6 @@ private void handleBuy(final Stock stock, final BigDecimal quantity) throws Exce
}
}
- /** Sells given stock. */
private void handleSell(final Stock stock, final BigDecimal quantity) {
player.getPortfolio().getShares().stream()
.filter(share -> share.getStock().getSymbol().equals(stock.getSymbol()))
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java
index f099d48..b166456 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java
@@ -4,7 +4,6 @@
import edu.ntnu.idi.idatt2003.gruppe42.controller.appcontrollers.MailController;
import edu.ntnu.idi.idatt2003.gruppe42.model.App;
import javafx.beans.binding.Bindings;
-import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.SnapshotParameters;
@@ -13,6 +12,7 @@
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
+import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
@@ -23,10 +23,10 @@
/**
* Factory class for creating desktop user interface components.
*/
-public final class DesktopComponentFactory {
+public record DesktopComponentFactory(
+ PopupsController popupsController, MailController mailController) {
- private final PopupsController popupsController;
- private final MailController mailController;
+ private static final double BADGE_RADIUS = 10;
/**
* Constructs a DesktopComponentFactory.
@@ -34,9 +34,7 @@ public final class DesktopComponentFactory {
* @param popupsController the popups controller
* @param mailController the mail controller
*/
- public DesktopComponentFactory(PopupsController popupsController, MailController mailController) {
- this.popupsController = popupsController;
- this.mailController = mailController;
+ public DesktopComponentFactory {
}
/**
@@ -50,53 +48,30 @@ public Node createAppButton(final App type) {
button.getStyleClass().add("app-button");
button.setMinSize(0, 0);
- Node appNode = button;
+ button.parentProperty().addListener((obs, oldParent, newParent) ->
+ bindButtonSize(button, newParent));
- if (type == App.MAIL) {
- final StackPane container = new StackPane();
-
- final Circle badge = new Circle(10, Color.RED);
- Label countLabel = new Label();
- countLabel.setTextFill(Color.WHITE);
- countLabel.setFont(Font.font("System", FontWeight.BOLD, 10));
- countLabel.textProperty().bind(mailController.unreadCountProperty().asString());
-
- StackPane badgeUi = new StackPane(badge, countLabel);
- badgeUi.setMouseTransparent(true);
- badgeUi.setAlignment(Pos.CENTER);
- badgeUi.visibleProperty().bind(mailController.unreadCountProperty().greaterThan(0));
+ popupsController.bindOpenButton(button, type);
+ setupDrag(button);
+ return button;
+ }
- container.getChildren().addAll(button, badgeUi);
- StackPane.setAlignment(badgeUi, Pos.TOP_RIGHT);
- StackPane.setMargin(badgeUi, new Insets(-10, -10, 0, 0));
-
- // Bind container size to button size so badge is aligned to button corners
- container.prefWidthProperty().bind(button.prefWidthProperty());
- container.prefHeightProperty().bind(button.prefHeightProperty());
- container.maxWidthProperty().bind(button.prefWidthProperty());
- container.maxHeightProperty().bind(button.prefHeightProperty());
-
- appNode = container;
+ private void bindButtonSize(final Button button, final Object parent) {
+ if (parent instanceof Region region) {
+ button.prefWidthProperty().bind(
+ Bindings.min(
+ region.widthProperty().multiply(0.8),
+ region.heightProperty()
+ ).multiply(0.8)
+ );
+ button.prefHeightProperty().bind(button.prefWidthProperty());
+ } else {
+ button.prefWidthProperty().unbind();
+ button.prefHeightProperty().unbind();
}
+ }
- final Node finalNode = appNode;
- finalNode.parentProperty().addListener((observable, oldParent, newParent) -> {
- if (newParent instanceof Region region) {
- button.prefWidthProperty().bind(
- Bindings.min(
- region.widthProperty().multiply(0.8),
- region.heightProperty()
- ).multiply(0.8)
- );
- button.prefHeightProperty().bind(button.prefWidthProperty());
- } else {
- button.prefWidthProperty().unbind();
- button.prefHeightProperty().unbind();
- }
- });
-
- popupsController.bindOpenButton(button, type);
-
+ private void setupDrag(final Button button) {
button.setOnDragDetected(event -> {
Dragboard dragboard = button.startDragAndDrop(TransferMode.MOVE);
SnapshotParameters params = new SnapshotParameters();
@@ -109,12 +84,6 @@ public Node createAppButton(final App type) {
dragboard.setContent(content);
event.consume();
});
-
- if (type == App.MAIL) {
- return appNode;
- }
-
- return button;
}
/**
@@ -141,4 +110,4 @@ public void configureCellAsDropTarget(final StackPane cell) {
event.consume();
});
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopDialogController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopDialogController.java
index 7565a80..6781e17 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopDialogController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopDialogController.java
@@ -114,7 +114,6 @@ private void wireWeekendRapport() {
*/
public void showDebtWarning() {
warningApp.configure(
- "💔",
"Starting Week in Debt",
"Your balance is negative. Proceeding to next week will cost you a life.",
"Stay on Sunday",
@@ -138,9 +137,8 @@ public void showDebtWarning() {
*/
public void showMarketClosedWarning() {
warningApp.configure(
- "🔒",
+ "It's the WEEKEND!",
"Market Closed",
- "Trading is suspended on weekends.\nThe market reopens on Monday.",
"Got it"
);
warningApp.getPrimaryButton().setOnAction(event -> dismissWarning());
@@ -152,7 +150,7 @@ public void showMarketClosedWarning() {
*/
public void showInsufficientFundsWarning() {
warningApp.configure(
- "🥺",
+ "NO MORE MONEY!",
"Insufficient Funds",
"You don't have enough cash to complete this purchase.",
"I'll be back"
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/StartViewController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/StartViewController.java
index ee24e98..fa23133 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/StartViewController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/StartViewController.java
@@ -97,9 +97,8 @@ public StartViewController(final Millions application, final StartView startView
startView.getLoginButton().setOnAction(event -> {
if (startView.getSelectedMode() == null) {
warningApp.configure(
- "⚠",
+ "OBS",
"Difficulty Required",
- "Choose how much starting money you want before jumping in.",
"Got it"
);
warningApp.getPrimaryButton().setOnAction(e -> popupsController.hide(App.WARNING));
@@ -172,7 +171,6 @@ private boolean isValidName(final String value) {
*/
private void showFileWarning() {
warningApp.configure(
- "⚠",
"Invalid File",
settingsAppController.getErrorMessage(),
"Revert to default file"
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/model/GameFactory.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/model/GameFactory.java
index 710f592..d8949ad 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/model/GameFactory.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/model/GameFactory.java
@@ -26,9 +26,9 @@ public static Player createPlayer(
final String username,
final Difficulty difficulty
) {
- final BigDecimal easyMoney = new BigDecimal("1000");
- final BigDecimal mediumMoney = new BigDecimal("100");
- final BigDecimal hardMoney = new BigDecimal("0");
+ final BigDecimal easyMoney = new BigDecimal("10000");
+ final BigDecimal mediumMoney = new BigDecimal("1000");
+ final BigDecimal hardMoney = new BigDecimal("100");
BigDecimal money = switch (difficulty) {
case EASY -> easyMoney;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/Popup.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/Popup.java
index e4be32b..cd542b5 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/Popup.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/Popup.java
@@ -15,6 +15,8 @@
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
@@ -69,7 +71,28 @@ protected Popup(int width, int height, int x, int y, App type) {
scrollPane.getStyleClass().add("popup-scroll-pane");
scrollPane.setFitToWidth(true);
scrollPane.setFitToHeight(false);
- scrollPane.setPrefSize(width, height);
+ scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
+ scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
+ content.heightProperty().addListener((obs, ov, nv) ->
+ scrollPane.setVbarPolicy(
+ nv.doubleValue() > scrollPane.getHeight()
+ ? ScrollPane.ScrollBarPolicy.AS_NEEDED
+ : ScrollPane.ScrollBarPolicy.NEVER
+ )
+ );
+ scrollPane.heightProperty().addListener((obs, ov, nv) ->
+ scrollPane.setVbarPolicy(
+ content.getHeight() > nv.doubleValue()
+ ? ScrollPane.ScrollBarPolicy.AS_NEEDED
+ : ScrollPane.ScrollBarPolicy.NEVER
+ )
+ );
+ if (width > 0) {
+ scrollPane.setPrefWidth(width);
+ }
+ if (height > 0) {
+ scrollPane.setPrefHeight(height);
+ }
closeButton = buildCloseButton();
header = buildHeader(closeButton, type.getDisplayName());
@@ -83,7 +106,6 @@ protected Popup(int width, int height, int x, int y, App type) {
Rectangle borderOverlay = buildBorderOverlay();
wrapper = new Pane(root, borderOverlay);
- // Bind wrapper size to root's size so centering logic works
wrapper.prefWidthProperty().bind(root.widthProperty());
wrapper.prefHeightProperty().bind(root.heightProperty());
borderOverlay.widthProperty().bind(root.widthProperty());
@@ -96,7 +118,6 @@ protected Popup(int width, int height, int x, int y, App type) {
wrapper.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> wrapper.toFront());
loadStylesheets();
-
}
private Rectangle buildClip(BorderPane target) {
@@ -127,7 +148,6 @@ private void loadStylesheets() {
sheets.add("/css/popup.css");
sheets.add("/css/components.css");
- // Map App to CSS
String appCss = switch (type) {
case BANK -> "/css/bank.css";
case MAIL -> "/css/mail.css";
@@ -142,7 +162,6 @@ private void loadStylesheets() {
sheets.add(appCss);
}
- // Some apps need receipt.css
if (type == App.STOCK || type == App.WEEKENDRAPPORT) {
sheets.add("/css/receipt.css");
}
@@ -169,11 +188,12 @@ private HBox buildHeader(Button closeButton, String title) {
Label titleLabel = new Label(title);
titleLabel.getStyleClass().add("popup-title");
- HBox titleContainer = new HBox(titleLabel);
- titleContainer.setAlignment(Pos.CENTER);
+ StackPane titleContainer = new StackPane(titleLabel);
+ StackPane.setAlignment(titleLabel, Pos.CENTER);
+ titleContainer.setMinHeight(Region.USE_PREF_SIZE);
HBox.setHgrow(titleContainer, Priority.ALWAYS);
- HBox hbox = new HBox(10, closeButton, titleContainer);
+ HBox hbox = new HBox(closeButton, titleContainer);
hbox.setAlignment(Pos.CENTER_LEFT);
hbox.setPadding(new Insets(5, 10, 5, 10));
hbox.getStyleClass().add("popup-header");
@@ -192,11 +212,10 @@ private String resource(final String path) {
public void centerInParent() {
Runnable bind = () -> {
if (wrapper.getParent() instanceof Pane pane) {
- // Use root.widthProperty/heightProperty for centering
wrapper.layoutXProperty().bind(
- pane.widthProperty().subtract(root.widthProperty()).divide(2));
+ pane.widthProperty().subtract(wrapper.prefWidthProperty()).divide(2));
wrapper.layoutYProperty().bind(
- pane.heightProperty().subtract(root.heightProperty()).divide(2));
+ pane.heightProperty().subtract(wrapper.prefHeightProperty()).divide(2));
}
};
bind.run();
@@ -238,5 +257,4 @@ public HBox getHeader() {
public Button getCloseButton() {
return closeButton;
}
-
}
\ No newline at end of file
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/FilePickerApp.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/FilePickerApp.java
index 26d9b3c..bff9896 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/FilePickerApp.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/FilePickerApp.java
@@ -90,7 +90,6 @@ private void buildLayout() {
quickLabel.getStyleClass().add("fp-sidebar-section");
sidebar.getChildren().add(quickLabel);
- String[] icons = { "🏠", "🖥", "📄", "⬇" };
String[] names = { "Home", "Desktop", "Documents", "Downloads" };
for (int i = 0; i < QUICK_ACCESS.length; i++) {
File dir = QUICK_ACCESS[i];
@@ -99,7 +98,7 @@ private void buildLayout() {
continue;
}
- Button btn = new Button(icons[i] + " " + names[i]);
+ Button btn = new Button(names[i]);
btn.getStyleClass().add("fp-sidebar-item");
btn.setMaxWidth(Double.MAX_VALUE);
btn.setAlignment(Pos.CENTER_LEFT);
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/HustlersApp.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/HustlersApp.java
index b29031c..5271734 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/HustlersApp.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/HustlersApp.java
@@ -46,7 +46,7 @@ public class HustlersApp extends Popup {
* including sidebar navigation and content rendering system.
*/
public HustlersApp() {
- super(720, 480, 400, 400, App.HUSTLERS);
+ super(720, 480, 400, 200, App.HUSTLERS);
buildChapters();
buildUi();
show();
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/MailApp.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/MailApp.java
index a5d356c..8931529 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/MailApp.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/MailApp.java
@@ -75,6 +75,7 @@ private VBox createMailItem(Message message) {
Label senderLabel = new Label(message.getAuthor());
senderLabel.setMinWidth(0);
+ senderLabel.setWrapText(true);
senderLabel.getStyleClass().add("mail-sender");
Region spacer = new Region();
@@ -98,7 +99,7 @@ private VBox createMailItem(Message message) {
item.getChildren().addAll(top, subLabel, contentLabel);
- if (message.isSeen()) {
+ if (!message.isSeen()) {
HBox bottom = new HBox();
bottom.setAlignment(Pos.CENTER_RIGHT);
Button seenButton = new Button("Mark as Read");
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/SettingsApp.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/SettingsApp.java
index 2f5b4e1..dd79a08 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/SettingsApp.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/SettingsApp.java
@@ -51,7 +51,7 @@ public record GradientConfig(Color colorA, Color colorB, String direction) {}
* @param isLoggedIn whether the user is logged in
*/
public SettingsApp(final boolean isLoggedIn) {
- super(400, 500, 80, 400, App.SETTINGS);
+ super(400, 0, 80, 400, App.SETTINGS);
this.isLoggedIn = isLoggedIn;
openFileChooserButton = new Button("Import stock file");
@@ -319,7 +319,7 @@ public static String buildCssGradient(
case "Right to Left" -> "to left";
case "Top Left to Bottom Right" -> "to bottom right";
case "Top Right to Bottom Left" -> "to bottom left";
- default -> "to bottom"; // "Top → Bottom"
+ default -> "to bottom";
};
return String.format(
"-fx-background-color: linear-gradient(%s, %s, %s);",
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/StockApp.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/StockApp.java
index c0fbfde..03d20e8 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/StockApp.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/StockApp.java
@@ -146,10 +146,13 @@ public void showStockPage(final Stock stock) {
content.setSpacing(20);
content.getChildren().setAll(topControls, headerBox, priceLabel, graph, receiptCentered);
-
}
- /** Updates the price label. */
+ /**
+ * Updates the price label with the current sales price of the given stock.
+ *
+ * @param stock the stock whose price should be displayed
+ */
public void updatePriceLabel(final Stock stock) {
if (priceLabel != null) {
Platform.runLater(() ->
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/WarningApp.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/WarningApp.java
index 37e958d..2e93cbc 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/WarningApp.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/apps/WarningApp.java
@@ -8,6 +8,8 @@
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.HBox;
+import javafx.scene.layout.Priority;
+import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.text.TextAlignment;
@@ -21,7 +23,6 @@
*/
public final class WarningApp extends Popup {
- private final Label iconLabel = new Label();
private final Label titleLabel = new Label();
private final Label messageLabel = new Label();
private final Button primaryButton = new Button();
@@ -35,10 +36,7 @@ public final class WarningApp extends Popup {
* and can be configured dynamically using {@link #configure}.
*/
public WarningApp() {
- super(370, 270, 0, 0, App.WARNING);
-
- iconLabel.setStyle("-fx-font-size: 30px;");
- iconLabel.setAlignment(Pos.CENTER);
+ super(0, 0, 0, 0, App.WARNING);
titleLabel.getStyleClass().add("warning-title");
titleLabel.setWrapText(true);
@@ -51,14 +49,29 @@ public WarningApp() {
messageLabel.setAlignment(Pos.CENTER);
messageLabel.setTextAlignment(TextAlignment.CENTER);
messageLabel.setMaxWidth(Double.MAX_VALUE);
+ messageLabel.setMinHeight(Region.USE_PREF_SIZE);
ScrollPane messageScroll = new ScrollPane(messageLabel);
messageScroll.setFitToWidth(true);
messageScroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
- messageScroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
- messageScroll.setPrefHeight(200);
+ messageLabel.heightProperty().addListener((obs, ov, nv) ->
+ messageScroll.setVbarPolicy(
+ nv.doubleValue() > messageScroll.getHeight()
+ ? ScrollPane.ScrollBarPolicy.AS_NEEDED
+ : ScrollPane.ScrollBarPolicy.NEVER
+ )
+ );
+ messageScroll.heightProperty().addListener((obs, ov, nv) ->
+ messageScroll.setVbarPolicy(
+ messageLabel.getHeight() > nv.doubleValue()
+ ? ScrollPane.ScrollBarPolicy.AS_NEEDED
+ : ScrollPane.ScrollBarPolicy.NEVER
+ )
+ );
+ messageScroll.setMaxHeight(200);
messageScroll.getStyleClass().add("warning-scroll");
messageScroll.setStyle("-fx-background-color: transparent; -fx-background: transparent;");
+ VBox.setVgrow(messageScroll, Priority.NEVER);
primaryButton.getStyleClass().add("primary-button");
primaryButton.setPrefWidth(150);
@@ -69,8 +82,9 @@ public WarningApp() {
HBox buttons = new HBox(12, secondaryButton, primaryButton);
buttons.setAlignment(Pos.CENTER);
- VBox inner = new VBox(10, iconLabel, titleLabel, messageScroll, buttons);
+ VBox inner = new VBox(10, titleLabel, messageScroll, buttons);
inner.setAlignment(Pos.CENTER);
+ inner.setMinWidth(150);
content.setPadding(new Insets(24, 28, 24, 28));
content.setAlignment(Pos.CENTER);
@@ -80,18 +94,15 @@ public WarningApp() {
/**
* Configures the warning popup with a single primary action button.
*
- * @param icon the icon/emoji displayed at the top of the popup
* @param title the title of the warning
* @param message the detailed warning message
* @param primaryLabel the label for the primary action button
*/
public void configure(
- final String icon,
final String title,
final String message,
final String primaryLabel
) {
- iconLabel.setText(icon);
titleLabel.setText(title);
messageLabel.setText(message);
primaryButton.setText(primaryLabel);
@@ -107,20 +118,17 @@ public void configure(
/**
* Configures the warning popup with both primary and secondary actions.
*
- * @param icon the icon/emoji displayed at the top of the popup
* @param title the title of the warning
* @param message the detailed warning message
* @param secondaryLabel the label for the secondary/cancel button
* @param primaryLabel the label for the primary action button
*/
public void configure(
- final String icon,
final String title,
final String message,
final String secondaryLabel,
final String primaryLabel
) {
- iconLabel.setText(icon);
titleLabel.setText(title);
messageLabel.setText(message);
primaryButton.setText(primaryLabel);
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/StartView.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/StartView.java
index d23c8b8..3c9f4fc 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/StartView.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/StartView.java
@@ -79,9 +79,9 @@ public BorderPane getRoot() {
startingMoneyOptions.setAlignment(Pos.CENTER);
// Starting Money Options
- RadioButton easyCheck = new RadioButton("Easy ($1000)");
- RadioButton mediumCheck = new RadioButton("Medium ($100)");
- RadioButton hardCheck = new RadioButton("Hard ($0)");
+ RadioButton easyCheck = new RadioButton("Easy ($10,000)");
+ RadioButton mediumCheck = new RadioButton("Medium ($1000)");
+ RadioButton hardCheck = new RadioButton("Hard ($100)");
easyCheck.getStyleClass().add("difficulty-label");
mediumCheck.getStyleClass().add("difficulty-label");
hardCheck.getStyleClass().add("difficulty-label");
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/components/DesktopBottomBar.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/components/DesktopBottomBar.java
index 4029551..96585c7 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/components/DesktopBottomBar.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/view/views/components/DesktopBottomBar.java
@@ -1,14 +1,22 @@
package edu.ntnu.idi.idatt2003.gruppe42.view.views.components;
import edu.ntnu.idi.idatt2003.gruppe42.model.Player;
+import javafx.animation.Animation;
+import javafx.animation.KeyFrame;
+import javafx.animation.KeyValue;
+import javafx.animation.Timeline;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
+import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.scene.paint.Color;
+import javafx.util.Duration;
/**
* Bottom status bar for the desktop view.
@@ -61,11 +69,6 @@ public DesktopBottomBar(Player player) {
nextWeekButton = new Button("Advance to next week");
nextWeekButton.getStyleClass().add("primary-button");
- Region spacerLeft = new Region();
- Region spacerRight = new Region();
- HBox.setHgrow(spacerLeft, Priority.ALWAYS);
- HBox.setHgrow(spacerRight, Priority.ALWAYS);
-
weatherLabel = styledLabel("desktop-label");
tempLabel = styledLabel("desktop-label");
dayLabel = styledLabel("desktop-label-bold");
@@ -76,11 +79,25 @@ public DesktopBottomBar(Player player) {
statusBox.setAlignment(Pos.CENTER_RIGHT);
statusBox.setMinWidth(Region.USE_PREF_SIZE);
- getChildren().addAll(
- settingsButton, playerLabel, playerStatusLabel, heartsBox,
- spacerLeft, nextWeekButton, spacerRight,
- statusBox
- );
+ HBox leftGroup = new HBox(10, settingsButton, playerLabel, playerStatusLabel, heartsBox);
+ leftGroup.setAlignment(Pos.CENTER_LEFT);
+ HBox.setHgrow(leftGroup, Priority.ALWAYS);
+
+ HBox rightGroup = new HBox(10, statusBox);
+ rightGroup.setAlignment(Pos.CENTER_RIGHT);
+ HBox.setHgrow(rightGroup, Priority.ALWAYS);
+
+ HBox sidesRow = new HBox(leftGroup, rightGroup);
+ sidesRow.setMaxWidth(Double.MAX_VALUE);
+ HBox.setHgrow(sidesRow, Priority.ALWAYS);
+
+ addGlowAnimation(nextWeekButton);
+ StackPane.setAlignment(nextWeekButton, Pos.CENTER);
+
+ StackPane centerPane = new StackPane(sidesRow, nextWeekButton);
+ HBox.setHgrow(centerPane, Priority.ALWAYS);
+
+ getChildren().add(centerPane);
}
/**
@@ -117,6 +134,29 @@ private HBox buildHeartsBox(final Player player) {
return box;
}
+ /**
+ * Adds a pulsing glow animation to the given button to attract user attention.
+ *
+ * @param button the button to animate
+ */
+ private void addGlowAnimation(final Button button) {
+ DropShadow glow = new DropShadow();
+ glow.setColor(Color.web("#4fc3f7"));
+ glow.setRadius(0);
+ button.setEffect(glow);
+
+ Timeline timeline = new Timeline(
+ new KeyFrame(Duration.ZERO,
+ new KeyValue(glow.radiusProperty(), 0)),
+ new KeyFrame(Duration.seconds(0.9),
+ new KeyValue(glow.radiusProperty(), 18)),
+ new KeyFrame(Duration.seconds(1.8),
+ new KeyValue(glow.radiusProperty(), 0))
+ );
+ timeline.setCycleCount(Animation.INDEFINITE);
+ timeline.play();
+ }
+
/**
* Creates a label with the given CSS style class.
*
@@ -164,4 +204,4 @@ public Button getNextWeekButton() {
public Button getSettingsButton() {
return settingsButton;
}
-}
+}
\ No newline at end of file
diff --git a/src/main/resources/css/mail.css b/src/main/resources/css/mail.css
index 8069bdc..3a32cb4 100644
--- a/src/main/resources/css/mail.css
+++ b/src/main/resources/css/mail.css
@@ -24,7 +24,6 @@
-fx-font-weight: bold;
-fx-font-size: 14px;
-fx-text-fill: #2c3e50;
- -fx-text-overrun: ellipsis;
}
.mail-time {
diff --git a/src/main/resources/stocks.csv b/src/main/resources/stocks.csv
index a771bb5..111804f 100644
--- a/src/main/resources/stocks.csv
+++ b/src/main/resources/stocks.csv
@@ -1,31 +1,31 @@
# Companies by Market Cap
# Ticker,Name,Price
-BAN,Banana Inc.,191.27
-APL,Apple Inc.,276.43
-TIR,Tire Inc.,404.68
-OIL,Oil Inc.,204.62
-SPC,Space Org.,311.20
-WND,Turbine Inc.,311.62
-NUC,Nuclear Inc.,343.35
-CAR,Car Inc.,426.52
-HYD,Hydro Inc.,501.05
-TIP,Q-tip Inc.,128.75
-TED,Teddy Bear Inc.,1014.43
-UNI,NTNU Org.,311.14
-COM,Communication Org.,155.28
-MON,Monsters Inc.,329.54
-AIR,Plane Inc.,240.70
-ATB,Bus Inc.,539.52
-BAT,Battery Inc.,243.43
-KWI,Kiwi Inc.,102.24
-VAC,Vacine Inc.,156.76
-JZZ,Jazz Inc.,230.40
-MET,Metal Inc.,302.89
-FRM,Farm Org.,260.76
-COS,Cosmetic Inc.,403.30
-TXI,Taxi Org.,239.70
-GOR,Gorilla Inc.,503.35
-MKY,Monkey Inc.,67.87
-NET,Network Org.,389.37
-WWW,Internet Org.,402.50
\ No newline at end of file
+BAN,Banana Inc.,73.45
+APL,Apple Inc.,189.32
+TIR,Tire Inc.,445.20
+OIL,Oil Inc.,312.88
+SPC,Space Org.,876.54
+WND,Turbine Inc.,234.17
+NUC,Nuclear Inc.,567.90
+CAR,Car Inc.,389.45
+HYD,Hydro Inc.,623.78
+TIP,Q-tip Inc.,52.33
+TED,Teddy Bear Inc.,10000.00
+UNI,NTNU Org.,145.67
+COM,Communication Org.,289.54
+MON,Monsters Inc.,478.23
+AIR,Plane Inc.,334.89
+ATB,Bus Inc.,712.45
+BAT,Battery Inc.,198.76
+KWI,Kiwi Inc.,85.43
+VAC,Vacine Inc.,167.32
+JZZ,Jazz Inc.,423.67
+MET,Metal Inc.,534.21
+FRM,Farm Org.,278.90
+COS,Cosmetic Inc.,356.78
+TXI,Taxi Org.,201.45
+GOR,Gorilla Inc.,489.67
+MKY,Monkey Inc.,93.21
+NET,Network Org.,645.33
+WWW,Internet Org.,812.56
\ No newline at end of file
diff --git a/src/test/java/edu/ntnu/idi/idatt2003/gruppe42/model/transaction/TransactionArchiveTest.java b/src/test/java/edu/ntnu/idi/idatt2003/gruppe42/model/transaction/TransactionArchiveTest.java
index 0d61c75..9502a4d 100644
--- a/src/test/java/edu/ntnu/idi/idatt2003/gruppe42/model/transaction/TransactionArchiveTest.java
+++ b/src/test/java/edu/ntnu/idi/idatt2003/gruppe42/model/transaction/TransactionArchiveTest.java
@@ -27,7 +27,7 @@ void setUp() {
Stock stock = new Stock("AAPL", "Apple Inc.", new BigDecimal("100"));
Share share = new Share(stock, new BigDecimal("10"), new BigDecimal("90"));
purchase = new Purchase(share, 1);
- sale = new Sale(share, 2);
+ sale = new Sale(share, 2);
}
@Test
From d7975438c955d257de4f11636ac537667b9478bc Mon Sep 17 00:00:00 2001
From: Per Eric Trapnes
Date: Wed, 20 May 2026 18:14:12 +0200
Subject: [PATCH 2/2] added icons
---
.../DesktopComponentFactory.java | 64 +++++++++++++++---
src/main/resources/Images/bankApp_icon.png | Bin 0 -> 146075 bytes
.../resources/Images/hustlersApp_icon.png | Bin 0 -> 153842 bytes
src/main/resources/Images/mailApp_icon.png | Bin 0 -> 144049 bytes
src/main/resources/Images/stockApp_icon.png | Bin 0 -> 53139 bytes
.../Images/windows7_login_background.jpg | Bin 44952 -> 0 bytes
6 files changed, 54 insertions(+), 10 deletions(-)
create mode 100644 src/main/resources/Images/bankApp_icon.png
create mode 100644 src/main/resources/Images/hustlersApp_icon.png
create mode 100644 src/main/resources/Images/mailApp_icon.png
create mode 100644 src/main/resources/Images/stockApp_icon.png
delete mode 100644 src/main/resources/Images/windows7_login_background.jpg
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java
index b166456..631ccca 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/controller/viewcontrollers/DesktopComponentFactory.java
@@ -3,22 +3,19 @@
import edu.ntnu.idi.idatt2003.gruppe42.controller.PopupsController;
import edu.ntnu.idi.idatt2003.gruppe42.controller.appcontrollers.MailController;
import edu.ntnu.idi.idatt2003.gruppe42.model.App;
+import java.util.Objects;
import javafx.beans.binding.Bindings;
-import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Button;
-import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
-import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
-import javafx.scene.shape.Circle;
-import javafx.scene.text.Font;
-import javafx.scene.text.FontWeight;
/**
* Factory class for creating desktop user interface components.
@@ -26,8 +23,6 @@
public record DesktopComponentFactory(
PopupsController popupsController, MailController mailController) {
- private static final double BADGE_RADIUS = 10;
-
/**
* Constructs a DesktopComponentFactory.
*
@@ -44,10 +39,36 @@ public record DesktopComponentFactory(
* @return the created application button node
*/
public Node createAppButton(final App type) {
- Button button = new Button(type.getDisplayName());
- button.getStyleClass().add("app-button");
+ Button button = new Button();
+ button.setStyle(
+ "-fx-background-color: transparent; -fx-padding: 0; -fx-border-color: transparent;"
+ );
button.setMinSize(0, 0);
+ try {
+ String path = iconPath(type);
+ Image img = new javafx.scene.image.Image(
+ Objects.requireNonNull(getClass().getResourceAsStream(Objects.requireNonNull(path))));
+
+ ImageView icon = new javafx.scene.image.ImageView(img);
+ icon.setPreserveRatio(false);
+ icon.fitWidthProperty().bind(button.prefWidthProperty());
+ icon.fitHeightProperty().bind(button.prefHeightProperty());
+
+ button.setGraphic(icon);
+ button.setPadding(javafx.geometry.Insets.EMPTY);
+
+ button.prefWidthProperty().addListener((
+ obs, ov, nv) ->
+ applyIconClip(icon, nv.doubleValue(), button.getPrefHeight()));
+ button.prefHeightProperty().addListener((
+ obs, ov, nv) ->
+ applyIconClip(icon, button.getPrefWidth(), nv.doubleValue()));
+ button.setGraphic(icon);
+ } catch (Exception e) {
+ button.setText(type.getDisplayName());
+ }
+
button.parentProperty().addListener((obs, oldParent, newParent) ->
bindButtonSize(button, newParent));
@@ -56,6 +77,16 @@ public Node createAppButton(final App type) {
return button;
}
+ private String iconPath(final App type) {
+ return switch (type) {
+ case MAIL -> "/Images/mailApp_icon.png";
+ case BANK -> "/Images/bankApp_icon.png";
+ case STOCK -> "/Images/stockApp_icon.png";
+ case HUSTLERS -> "/Images/hustlersApp_icon.png";
+ default -> null;
+ };
+ }
+
private void bindButtonSize(final Button button, final Object parent) {
if (parent instanceof Region region) {
button.prefWidthProperty().bind(
@@ -86,6 +117,19 @@ private void setupDrag(final Button button) {
});
}
+ private void applyIconClip(
+ final javafx.scene.image.ImageView icon,
+ final double w,
+ final double h) {
+ if (w <= 0 || h <= 0) {
+ return;
+ }
+ javafx.scene.shape.Rectangle clip = new javafx.scene.shape.Rectangle(w, h);
+ clip.setArcWidth(w * 0.45);
+ clip.setArcHeight(h * 0.45);
+ icon.setClip(clip);
+ }
+
/**
* Configures a stack pane to accept dragged application buttons.
*
diff --git a/src/main/resources/Images/bankApp_icon.png b/src/main/resources/Images/bankApp_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..642b9a4b5f208c779edeccf06775469aaceb52bb
GIT binary patch
literal 146075
zcmb@vcRbeL|M*WxA|v4{J4Lcv)@2l-BBAW9Qj|R|D|_zw
z5d7s#&*6@PLymJz^73s2?o8R{yoj7Kb{=i6O**~J|F)cMo1=3U
zDZl00y`%24^K9wjVmbK-)@{QojgfM4^UUDC6WE>+jqE7qUo>%21$s6K~s-2R}X>cRNnYnNP
z^P4zyuyGeF+;i#2eRyUoZW~u>i5Hv@YG^c^h9~ZPWGLJiYz~jBcO*4`#J=jJl9V{W
zDuvALtKw8E4SQ6{+u@e0Yr(%me6b1-=Nv8%v`8E}7d$iF0K7N;&-gMb?fIa!R(WoV
z*fgJ8{w5SWDfWsmi_%ZJc*F38KyEM?8T!m#z@EYVuRZP0yy*pOe@uRU&lDl
zd4h!=_`T4{IhQH@*A6P=+O4jsU02Lr4kE`m&%el6_Su%OFSKq8DlO}`_R&7*cB{zWZe_aa`N!p2YL2l^GwpnSZ1|-VwRadC{y~Gz9|ujNH~)Y6zk#pUdqCT
zQ73Zj$8j6NGD3^Fh!*0U|dY0Cr?v3YKGqgI(kQLmtw^$o88lF_1E@h8n%ljpT
zyfgQJnu?9YxK`baRrb}LkW&L&-U4u(L;V$^yZY6&sj$e=XT>u!f+E3-_(21s!M^H!
zV-?@=gVtB2C`s*hEN?oMapiN~Q02={ZI;X3k+>Djq>fnc!Xe}&RpnOZgjY1qLm_L1
z`*_2@5gT6K8f+p(4rX~~R%zA);mu(^PgoYu+FtPYqx8zt=Mtb~Z96OTxo@ldswEE`
z2Qf|f10Ax!Z(ZH+92YATT$q2Ig5rUM=1YWF@88@Oim-ok+pVT@j)k%XoQmUaM|L$3
zVq2jDA657$>JJ=@u$tig*!-ovZh*YcK-$prSq~j*7D9si`|fo8Q8M={Bn&v&EQfXz
z4b!wZVljl^x4~Sb4;7vyEJxJb}`JN+i1!$?ptTSp6klC
zQGmCA;}R!<&a_aty~T?lCdq^OdRywgT}3&V>s|-b?o%0h*qV*jv6dW>>;}jWkdK9a
zSigsMh>Km-FXZ6FENiZWI1XY9M7xo3h%Q@G7vF3~6v_@LjkH|+Ln9v!$oqR~Wh?`q
zm@&Gp`#HEKt*@2yY|u(A4@eOl`Z5z7SJRodHAi2%QAzZ!gG8CbvQDxa9O1@2K+m{rl9sHcMRmaxSx#_nd}-x}}hxd)dfrJTUT361~j
z7LbTkYC@V%)}^oyz4TiF>rQ18IDlFAP%8ZyEjT<+Q2xSJ__PamqQjQ&{pY`S)A4VO
zk2WXKixQGp&J&Wp;0hk~Imf
zDEdcCFEq@ciX19;BC#50wPl!H5Y!Dx%Sf$E`wGIFW^$zjyKFCye$SW1>$PwM4ta@N
z3$~ENci?{DMYOf@*$h>n7Vb_lHxPI4$M3{puH%|~wK@|@&2~2Hbi5xsyE=yMJOV*U
zZ1q!%ID(JvgH$gy->Y07<|PNd+r|jSI84*8OZPPScvUURR)YUkut`c(0gEzoJ>ALa1MuF^c0aQhMOsg6pm+
zCwC-5BV`?Ess5CLYBn`VJGD9V4T+aXC<;{?-3f7;VUMuh15d(R^sGE@@A5qI9_sf+
zwrz47pX4{Q{3M$i?z+Y^$FcDK!B=
zLkbDWCKz%kvIhM83<-97P(dlgqy>Y&JR&c)gmIqX|Li;$FJ4qNd5HwsmM%h+$MTI^G8H|ijx+0
zB!!I{85w2wU8#l2I;(FLr2Kre@~x{<_;)(=EAen_aB;Do?+YaacqqNR@ORAOEAL0e
zU9?zy86cqOXK-jGiHHL70J3gI&_O(`UQh(
zFMHIJz_^n4F@>~{KkVdpZ{~N6#AG<<#+eAPvRYBHdK#nHFm|3gwJLo->et~D!C!b2
z2?w{jvksRfM%GcsI~diTs1`icHT5I?Ib@5lw0%sS2}3r3jL$SdYJqiDhL2$PQ->Gm
zuW*d;4HRt|0ZP^guWwlii-(S|*bj|63)4%Q9+?PHEl_wnkFrC`es(bMQFJl~fqZNB
z@~$C91S-US2A@B|TGZ`|vc#aUsVaZZV?O{)g9>c`>V9Uup#eY?-9
zabfz;bUuLW_HldY45m`KdYf15Oo}y%!$!H$>vrnSR%j*3)ww)EaYAaPqG>08=<0u8
zcb%?}fW0|m&?@i4YCM-tqEhS@4k1fu0v0dG@aCKl@0d^m@tqNb+SfmRf9rqveJ?#9
zVaM5@A(xtmadApqu)Bf<7t)z0>x^ci0e3BRi>)hYQt9#+-=!SCU+z}Nav@;SHD(8F
z69!H+Gv}Bj9UDB}!p!RFeo>WMWuE|J;gfWBfJD5gz{8ox&;M;%*M71cye3bD?{rZn
z^!PNX)?sfZcSV@z#W=^eN*AAaEL}L@<>-IZm}DYUbuHr3H{m0UO^Qj?AP&9;oD8y}
z=99btlc3M<&Ln%-8)Pz%z{%clvBf59vXP28?;X82RZMxLvIV4x{vADb5?i}^DnvFp
z7jDmeE3aqEsWW5nwLadOJe;IvWCdlQUPW{e*BPV`mDxDS(9-t+@60c#Xw(*31_QS1=C?3K%y&vZ~(}4o!X@JxH8t;_klyhvVTH#q-AO9+r+@`3JA!mZ$+r!1H)L!fnoqsqNnlH3=miysGA
z?1w?9DnX$d3PROy{rq~g3&Ra8dI^1SNJ53hGX`GII
z_(*100K4W!-h_+;ec{esO=389lq9_1r`Pz4-;KR?5}&$pZS%dqbl^u
z+6v^GTZO85>gOB!48OzQuBC`Vje~=&I@NYiB1UeWaSY{;e(l4yN=;JP6$w_~Xt7*Q
zIy=A#)Z=oVm=+uQDmE2MNl)(m`qEYJI@NXA>ZNlQac-m2o8~0@;P37+JF_!iHyS2_
zgSj$3%zwY#(OUz4IC8>{!+;%0WL!!9$Vn}mx>1sUXS#1IBF5iR6zu8yuV5p;FdJ_x
z$w|*H#0GM8_sJ_e+A;T^Z_36=uQGHJ0-yYrvs{4O`qugQ_O~^K^^>L-lqlqtRC)0=
zbg0t_&UZKM2-*L*d>wwC0q0TtFg;cer|Es13whX&CVB}2E&Fh<%wK#EQPk35cYB`M
z=|LR4tx3#bG|8sPvOmMiv1pdY#>Sd}Gg*4rzqC>|U`$t}C|lRD45&obc3J-5==f6$
z1djNd;oW-eM=B%Mr_wvm
zG3~K2HOIo2x6>Oo1F7l}#9bcD8LV{tP572(cbUF9>(5UsleUeD-RPxaIXxK_Q4Jb5
zgu9I!6-)8W;SbR_Cy!&i-N@Q_&!?=6KOQqqomal`AwWpl=%V`K*_%;UYo#PK%r);<
zM)SI9j|V5!-1&U|#c`!CE5)3$Y*Lwo3^+a!!%Wx`yG-}-m)VQt!*Rhj7@zsckMWrh
z(f2p)m-CnMI&9NU>qy118>LYQm0G!MuX7P|4y0~#(&7BB&J{Sn{w#fa4Jw=y4NA7
znAYm2VqV30_R@(Szmao5Qxq%boas(yD#mX#M!CJAB@2@ZZLmATfP-Mm_QZ5{%--Qe
zFwTXYPW*)n#qVL7H01`Y54CxBT{9g}{t)rgByY4K#qyPM5>*z`L+$pX3-77w?@^}{
zu}t3E7PzkY8ovCTk3f!@Y}pG4pfdmm<`P#ftd1z@hZx5wdy`hLVp4rZe)E0?k5rhD
z$&ljEt|iJ%`TF1iM^FQ&Dy7tyhAll_GHC?o0MFQQ)4F39uEJ%V{56~1;RnfZN?E>Q
zyBz|baCed%6&>D}`9Q%?Rr|KHOKn_KX+ojQd*!8dTTH>Ttk)kjxHisxr%Ua8P@5*8
zM@>b0a(sx?w)V#H?BKR;#Zcql{0tl;6S
zrNfX_;CrkRg{V4kZ?IA6OZf1$?bHvauBO%F;e6tv!*+OiD{yD)5#k)TZVrJ`^U^HG
zD9`a91s_>;4JGxN&HM3gZ|GX46EBdFPJ9Q|jQ4N}b{8Qf7_!O7&`DX^ZLM3p3Z-lz
zk-g!!crKW1`sY)#MrQf~x@i#Ssz3SOJ|Jq8h*k
zd;r)NJ*ww*x0V9&P6pzAdQf+-(vW4SRtn0Ezpe6J$U)wT<@NUqTv6T4S$owcAEI=d
zvv!BuWddw`JFlF=ig_I26^5t4&O&BnO$O`P?5S(nhrsA{^P{
zSOV4*s=VwniNqp*U{WOuA1Zp(0@|O~nz8s*^WCJ)8z@ut4%RxkUa>JW^6n7h^(cX0
zLL4_=0es93Frn6Uy*}TQIL}g;cTD{j*jnx!1qXAe=Av>Y%{=-cQ9BGv
z4pg7lJ|grM@l^CC5HjR85f#c{EGxM*=RnV6CcPD>sH88Vq+AJh1BNy#~N351I
z2@ETFX{4#At?u*5UcqQjC6}~b8F_6f6m)>hr1bHy$98SPr;NQ0zPI?x@RTw=Cy@&S
zVpV^U)Qpl;(8bp*eJgYBoU$yGihL@-T@Cy(N?6dOSwQ=E&)_8yD_%8Uwokt
zbbh0u@h?u%06B%7aU9h|>YY*$#H)8rjKNh=5Vv#K^d3>k)#pF=z6wsL2X$5a2e~wM
zD}R@MLF|{kU}{D)s9)VJlpk~sTa&x&&^YLwVn32OFN?>770@jeA-ygV3E
zZ>9S=k4ckmV7a^K=S+G_y~y%v%J8-b;yNA6&(bz@?sK?kMqfW`D*mDG$Fn$k?MfMM
zNQ?6?k)CR|)7dOFz@?SBRpG{(l%&SIp4IvfzE8B7O
zIG>xDIilso#COoH7*qi5is6_Yhc3_C?KgCYTgvjT#SL#=GdiW@VbCSS(G0q3du)aN
zs>efm;on4A?M4QVk>On0S->6;6DC2_YNX=~DM0abh{k(u%PCWIlWK+jwVovE6mb=q
z0sZ);x5$#bX20ble;9|9e`ml)w_)47R3v=v^oCzKI|I(EC&)wC-A)bgwM&7`oS?Ne7)KSb&Bw-(Wu@C>v(j#))q27?OO!ch)jR#>jM5vM{lxSMp3D}!t-(2
z#4U9z1_?SMKG?HXh&j_nPLpn^{UgxMA+D+&7IA)^*7AhFN%|qI725Bsg(8dvoS#Mq
zzFju~ap@>Q#RJNm$n#!xGwOh(>ZWr3lV6Rt2|_vwK9{qvRp7aNQJBG=_kHMw7#k+Z
zMMYCVJQ55e7vjYRI}OX-J|ux&3v^ORmnpp%D|W3(>W*VUmzw#9mwq&0dlTRIm`i}T
zuJtv4j%cMua(k66zL&$gYV4(m;|C|ITiTuwg?$>FJQ|R|R@wJ9G6r-;$fMk}u(|Ce
zUJ+v(x%aPnTX5-BLE|YZwDs^0Td-Y2a=nnyxb7rxbbB;Hw={TGW;-s&u0}Ksa;us6
zC7X5_{eaVZ3v&f*+QGlyU5!fHq`3{Hziw5HF4M}pQLLPb%CK@Gvjm+PbvJ&jd+1id%ga4!lc(0hxc_XWL;GpXNFIzVruic^`3I+kEW?vs98
zGiMzIz3aDCvmVXO-uvD~^!@YUysx*eSP@Bm3DZq!E=SV+v9lYZ^Ks_v*LxKI1xPZZ
zcv6S$1)!v|mF!B*v{`OBZ_!tBe?CL*JIRECq7u2&3GJxbx3$1ON-wIVgGwln$iiE~
za5Ki(xp#)QAZau1=$mlEe0-M4YrLA1S3W~WP{Q3K=#0yX!KZqP7I1e0a^IOp8~(rj
zQKfW4%%F@FG|`e?ye~|7F#_v><&-z?E$F`2sS00`
zT`T4+wWD=q$Xr{b&K?}u+Wz>12t*j;ZiH2=lv{hqwG6x13|oDga`&%d`1yxX4X=R!
zgI_ngbawUEZ;?uSM8hqWQ8|NmsC5V(hpYJ_V%_wj{?pn~YLO3t**yCQo=oGc!NE-fx^F>SO
zL>%I69=YbRAM21db64rVIiuTF|M=6ckT`1tQ6>a4gPbsMN#fuokCAnkR29f-e40#e
zi;?C2|0wHZ<2mH`3x^?)R07dS#WmT=#re<+3p0{90p3pakD4j0?#D?r_kI%F?Z6W`**X3l-2Kdd+(x(P=#PRHoq}SnLMmv{d8%=$
zbHW&)^tdI~l&>2MWF6XG?4#o+alV!4!9Mo$qy*avf!wXguG
zkZ}N?q)-Ta-68J7DvN=pDldLLa+3bRh-%vrJq0N<7^KYWPGU!R8ueTCD;Kgskh{k?
z+b9Lqh^_J8vwAw>uF&TWu9rSaI(nea&93#JuVb+Bl~h*hne~Oi2>-FMy}^I$-pfweab-odL*t}$=e4$EU0wD
zP(&1QkX@jhfo4l1xV`s?#AZ(#^l|)^rJe6j33B@&wSgKXrI0M>N(0Y?)L0+K5ax-3
zJ^ZW8yn24A-N*1Vpt)~z{}cl)2<-bwii6S^$R(!2O)mumIGxjSOOK^_JLmeuv;D(w<`+y*;R<~-209X%X`ZuwVK3nu&`7wt=crA(qfo0BvG
z7kg9xju14P!;oinb!7fN({s}sLkodb8<&_fO}w0Sl^bk
zv&+y(b2*R^qGdA7@(_x#^Y*|cvS~5+078Ipi>$x;h?ndCF61nKOV#k3Tjt!1CMbM>
zIWA!2khRRFAjyQIOrB%Fa%ofT5sBgpeMgdTuG?{^)k)evwPy`Pg&lVdNF>5;m_*`j
z!L;?#A*GU6HV@)%CabdTRaN%KV@7TgSS#)FJXPTsoQL3AfrQ`(&1TBmdgqF-!(YRv
zQ-Qcw_TxvApg`aNHwZW-yW-55wqH6#Rr1RG|0^!s{>_K0Pz?z6fUYzTVy-mFhFw-9
z*2vxUd{Ed6@XgiiOx=CCm%6ya-{0(FMIP)Bt_7%~!%t1TEgXwt*;17gD2qhfrpd3-_9u0&NJ@$PgHF7$zvwckZd!
zI!=$*#8euG322=H+m6z&1l4SO5Ni(9_r${E)
zM-R!Q9XaHl-CIL3sRxd{hSd_I0f0@|R%!g7
zp-$TC8QOh~)vfQw3-eKIo!9DU;;wUeT;7cVv*ngIlA_N`$BMaX)>ui~s#is;4uXeG&K{tlTd0q9hb-bMZ9q
zm^2!flm3Z}M6+#Os$|ZW7J0MD@4%01osL%op3JMy-NvFH^_5^ku&@3xWm)7Bi3%jz
zoS9&+Y-@1y6r!af82*2gO~vWsy+95b2>r?g_69l!V31z2t_*G7O>OB16b_R1lClZ;
z;W~$Ufui$Pp-Zn3Y;c-aEJ@hV=iNH@83lRxtS%TteEW^0);ghE#}jgM@Sb7I3MLf|
zC3lq^019z`nX(1Jlj*|@Kqn$$0*Rg!>m{Kp{$E*uVGrcJhD*fozM6;!X4RdbK<_oo
zhzL2w?naUyrjP&)4*D;is$@$4nH>59J9E27;+@r+f0YEH1GbKlKx&;n#HAk$k{eM6
zh#e;_>VdlwW6UB(+`6dK5zGT~o)>7ros#|zzc}d_0eT2{Aa;klK}&BxTiU(ICS`9|+4PMt2h@1QLG9#3dcnYOz3}
zUiubl0~iVIqhV9nc7lf=^u0r$^#B>Pd;efo3fdQ`Bb^B&YNWD7
zq?1?Dy>Ch-A*iAU4X{{2aXdY0?LnO*{Ytt9-{^*&
zmlRAi9R2CKIl9oNlVGl1%woY#A$6o9q5c2i)Bpate#1$dXiFbc23uVGH+nSa#1RA{
ziN!kLsFh$lHj*BBeN$tR4z`;g6G+_gVaR%aGb(aq;9GSu$3kC{tFdF>IJ2qA=4aCG
zGwiEoe+8(NcwYsovt_Zo_YnaJjP;hr=kvE~%-q~8MJEk@o)n3dr`%+@h&rEpW6tNi
zU%~FBLzgI_+y&$9di}dh&rr+`!*q@1O54{eOZf~{0|D@k<$x7RukwHxzbMOIzu~zu`dx*jtWzH(QrT)uBHdpfd%(0C{{xtIvohq8
zQCz8dUY{1@6g#MxaMgoKPY~kv7ORad=48O%z6#=_O9qK8(EmkE{1dTr7O5e;`70f}nx^b7#KtWWw|E=B}weYmP@JlV$BpjpXc;evm|MATRFyeyVnhD$j^~uPy*P5%b2v0
zrY)~dE!OW${{R4Y^}Ih-Gy~W(pkkY-Qzi5t^(=}qqT_|vXwbGUZ)$WVG_AY
zLY0p)Zwj^1yg-~ruSe|l+g0m7B(q4GZoqrmzL%&bCq9cQWPuQ@
zVlMFI^_*A)3*yE=l@gYH+D|&lThynVksc!>@0%Pxp)DvIV({R^t7M;-ZyA7lGqEh9
z4+E~-phCX-X-hEDiQ=8Es`8NSQf2j>CfjyWjBA;CnOPZBC@3!S;U2b(3&WP3X#_kR
zs2|4O*WUHI(y>PNzRf}`&p#v3SelqqJ8)tkZvi?&dSZ@{nLwmV@g@9kry(-r3lPcj
zTO^g~wnq1yh^X&H2sUdVG5d|O{ReS8_RI6N8(bTfYn<`bk23)1JVa7`5S>eY0_Ea<
zZztkZf!Gb8+_J4$4Bu7;??w~`N0h7ym~8V;{E1qjxxBr=m`wXmu_PqdYLE^Gt0>H=
zS^%_TPB3B
z7^6x)-4e(^5qXEE@BR1#Is30fo(yH)Z5&uF*Jg|Tl3L|7_MUgro}K^4*^H(Pg=K5?oC8`
zj(h#g+&M1^*`MyvzHUY#Dv#`8V#Igj+LUixq1B@n8mn~tJ6nTS3mvG%&OCnZ?rzhm
z!VM(9eJq2%W)%PA+D9gvO1)8UjwXRJz{MZ$=JON5Ga`vJpfi?x`40@UHnG}mQ9?bN
zS~iPTrt996N>%#CN8xc&gIW(lk6++Bmv5hB{c?KTDW^AI-)}W5>js5{I@An5Hx+zfWw(B&(rst
zUY&OI%XPmJbvWUSfR~kZ-&FS0_Y$;N)2_FlrV?&6pM-_Jf*9L7Q!J{1)X;4
zYCDr4>L3;)Andm3Ty<-&JV5Y*{J>=b3yR2<9)8~K-4~T>dVW*hG}zmLI-p(y^SO7v
z12Cn|C}*5_TDSHA{v3idtf9zaqfX?DHNUs%P`+TirU@6D2*>?j3FXhAMwbTY>sFXB
zqw$4`8J97_I@yCm?=ey1{p}B?PL|>qHfn;aXzY^I{1A$!SeUMreqD299UBsSPjzwWnyxk27`R`mXw+tSzG+NF*01rUk=)d5T&z-w5>=-W@6?23iqxrm=(mU;nGLnd3ZFQ9-s=KiJRbOb0?g;%
z1$~o>yF?+5hoE&-6390&V&N3@_cIGSb2Puu>X&-v#OTShBz2x@@q#CTME2@ENIqh@
z{6x52?)tlGN#`4H2F5mA$e|LP3f|{D({;@01&51iKW4ecDIl|y5(D12OoGZQ!&y`5
z4V6H0t%bhL`lvnBRj}1^3&Tc=*0QE;8ncecre~a%7H-27q<&sX13^`JZcdnvDG(2?
zo`dEJgn`4qmY!YO)_vaueYR3f2shElw4KIh+xigJaS|Z<3V${k`dlFl((~<-1C9t8
z=zFUOT11?q_GQZSMRbfDf~wL=;r?X&;eOV30DL@Ecb$X1vd9F(uL{hUY=ENko
zwiJGW*Yu*)7p11kK=%h3I;k>|Rk?3AGQ#JBz?UBfcwtS@(0TM`D;?Cs6lJCX2FTl7
zEh?2ZrK9(J`ETB=%kuRu)U-cb_<3>EBHcCV1j}UV_)y*D_gz`HU)`8cqxeC{O{?j|
zvpQTwB@vC#ISj`M(X8ZyS}_%2!r9vhco8AYnNKTQ^K)_|fqY=ITG!4l-?Ep~R78=Q
zRR6-ejhr!mw$x|{puI7Kgiybs!+_+_E#A9n5vum+1}MH5FW%if+48@I4Ez!%AIQlIWtlTq=VuvSxkFqctN
znRlP$p?)bf)X2NwZAJ&}N*3;tt}}YE(bA4cLAmWP4ZIccy?$SxON>9Jkhp7h+WWa?
zfLI-n>1yxa$~C3qXT%S-*`PHm4+F(3{%UPD1I^jG&_{M_m%mxnW^=zLVM(kbVa~kr_a)onHJcmG>OCz5
zSN@14-55yzm0EoJ+W{;^WBrB?+o>oYWN52J9qAbioWXJTKIB*sxLF80JHEu77QC`7N^f9Meu%iI(E
zT70gTS{O}kK+mqMh&NFgfY2sk#eJb7$>2gIiner;&q5fs$p&~PW_uYe8(mg($`5)pVyDcP*REiT_>^mMRc#bRVeGG9wJrmJTld?
zi_H%dbShXuo~?uOg)8c;22a7;y1J8)q?axXlB5U}v($Sb{@;rL+OW>8aID4|Dry0cEO&cVF^>
zDx}^c8`}JdMM!}zj-d7V|rvQ_}YEanheLg@jR0p1c;Jyy~HGO(f8{Z+k3HM;62~pT6fd~=nWO##}
zDoQB}S0e6BeI9vFuu`IRgNOT&IoOy6p?Q6>aq;!5JGx1FvDYC$3uKZsg1>;Lg8vhE
zsvz`K)GZ#L@=VhhJe_D{<$^ha`90{r+P9Q9mc?EQY^tixZEnP=wHR={9MQ
z$qu|OiuJyz7aPw?%HxqwOE!B~`+h+C8wE8)p>h@E74B%S@WE@N`Q;wq#dj7$>o8ui
zKM?!z-+@@OfW^v-MY^%kwt&7>aRl(K<*aE;lGQ0Ed=aAYHx}&M`~3Ezhd&L2V^RNQ)M<>N0(Y9M3NOHq;xOpUQiBZU8EQHO9{=t>
z2k>7*KcpXRm_2pN#s)#aLZ696Sp)IG#eP6?6Nd5%GKUzi@iX+-7(rDjN{!td7lRoT
z#Kd&tsRRr?Ygx9bUAW0?ApplY6XksY+Pdi;B(%_3IX~%L_XHze*%q|m_hokPLd6-ymbPD*+2gQr=wvE37)y
zl@r|NS`rGP_HX#4;U6a1V7NzxArcj2E!B+Y_kN%rOQ8^d1p3kZjSu0?q4Xc{NtYmy
zQYmdOji|M)BW5eaD~mOty}c&q?biXt_*uldNu9uB
zy~l;7<3#@9;P7%Qpi&RD4iYGP-jBjN(TjD8%)bG#D5uy5h($4%4>Xo|KdEfXh5bws
zbAD7MAR^e0#Nvqokok-^``F#_$VK;K;6M@XC32
z1N%EmU7z?rh^`xHo30Bm@98=@+|q01-mvIZLAzo;1Xz0i0ay-?57JUR
zzQMq{@wxn=BID{r@M)3>L0F7Od(ybOn^a@qr<&?w0h2pZLB4EUl))aF2plGL4|h~C
zofaa0;;W-_I-DLtg`vE#I=hFfb)Hr~Gi*O)JX}<8DfK*HJmo$yMM8{ckaBqr_5B?BSyg^{t=kIXh}g8LSyi
z7gz)edd?yAS*qKbY5Qn-rs5geS+IsmvsQz}-)n#lvDBwP=imjPmCk<9m`)cMyj4q_
zo1!W|o)5*sXW`^5;qKaZc#uB
zUqy$NA`P19Ij3kB}?M29LP5Pe-9_
zu(DQiTK3ZX%3Z!p1)c!#fAhof5aAG)VhU}
zIWXH*@OXUw%n_EK5Y`7qQl;1?joXrgBDu0<;47^UUnP8n93Oz(c}lo<)BduYk)CF6aUJcNzf7
z{r0m^OxnM`tB1mglcrw!yK&s&z|U9B5Wz=~bo2KDSg{Kj?{c>`FB}*i_aY*b+B_}G
z-eN_>`UUi{0-m`ow=FKHVx996>BtFu+J-d^9+AGTs#*ckI>54HwvU=MxZC<4e2#q-
z_y%#;C7>hxtD?YyDKA*@=3O1IiHFu%d7^kreSTZDhLi~bZ~^xr)(S*Q#;#32H{>qplhuL
z9Hgbo_U;Zv8L&%NUWbGZdJr1KO&^wu`;9UGj*WlAm^Ivp05i?)lSs(gFbuNPO(l-H
zTk}F({$ra>Rfd&jN*p(vyHpEL;QMdX2P$>YhFe4*KDEw`Eg3w
z1oltnmye0?s*yrcyCm~B0Q^!X
zx4VfPu$&&YT1+?Z<266It_eY-&vYT`oH%jP^%LBwUIYgRJv-1s0Hpi&aL`G~?6Y!j
zg40FJ^Viv#JO*VngPzh42=U3#FaXB|5=FBoBHZf*49NwwUO)0wprmVx^=gk{xb*G(
z%_vkcG-v?bT$LyFP32kP1!eZ(|>_Qglve5ohQ=j}7V)!+;)C
zq~JR^Khn_Ly=2F_AZBD1dP<>RjR91O9^L-FiJf{#iJp20VBp*si%qMPm6I~x@wh%(5M1aBd|faxz*D%8V3G~;-jE`n
zlpF^P_!tV!nu((l4&IKUi5qy
z5~~X5VbVvq->*TS=@}Y|JmnVbz&FC(d5T8eLL;`;qr{9HwV7}5-)sRz2uFFFi^?ee
zs4e8II1Q%1d0Cwcs#ZvgQI@?UGS%h*(FEfe05^R*UG(r6q?aJj@v$g2h~;i6=bX~c
zif?q}k4!v24(0^d97pYzU|`h7YvGh557?mUoS-S$(F5N*ylf9RX$XOnhDGjn?+PF2
zg283y^$x^^hL0xs@}$~3B)k<(N~=-&oSSGQ`zpCOK1QmwaTwM3=1CT=n_AkMzGOe$
z8TN2~T+!;fBj_63WI=fX9$m->E5i4E4)^y_kNMlsM%n#_HsT9O(6>Da3bqt|
zr7l`$H!zO$`ZQUrcPvpczTqujX#973lM`3Zd$&VP@Y2{hSaQSiCYNbZB-wT>aoyNb
ztN{t({KS=-GeTE6Lq~9Np1aUMN7#e{yq-vtdC{Sg4^SMBolNW++sg*-^6D{dg8R~{
z`?1{n7=`hX+>W_u@ce844N2~+$v*dvf;$Lo7F)4mT6^7_OIDZ(y|TCr+|}CdFPv`k
zew=RG?5!Z4$YuOHQD`*S{xACQ?(IIk6+Q?SQR1WNcax&w6gM>U&lNTEFToq{HBUc-
zNClraRuiC;fO=-}C%OMOO-zer+~X!?Z>hHsY_`O(?T&d7dAcpdJ2fsBP&FwRHlYCS
zK>5U^Z3EhC`^?kJknW!iAv(*RB6;#yj_grmr>+xh00s<56ImVLq;1NnoDRk|slm;@~
zWhN@6j|%oqW8YP9%0N!zK6^tup6%KpLWr(Oy&9XSRCDgyG3b?)8|syms{`2XP7PEC
zMi*gYJ7_ny|7Dot^IfES&oD>(&oMhS-XGb*3Wz>!i&IJ`ut81ii~XQWJXme&uDu;n
zoCk)dnJ^)b#hr|}<^ig6$4vs#m<^ST+KK1H~St17gjL$YUqrI>yMYGQ%rqRciak-
zLxjZsQw~8*KfJjgeBB_4{osd~4-V57Wqt(7#pv4iXaJbAP)kSWg$G23(+%;o9zD1*
zflXf9ulG{fzuyU5pFn4i|NVwz4$U-vv#XyIsQ$5>wb23M3?&2rc?4
z-Y`u{czw8GE~S??*!@xyhD{IanL@lJ};47J1$*z!*q!eFaeI
z>a;$b0q2a=FfWufnQWN04+Ji+Z)rk|JjmreV|pDT5|mOQ3bgP`Ejz4j
zyoW6&J^s*RaJenZfewc7kOknCQJyHTbp3)mMSP*rUD+w%Uu^WD%~
z*}&BWLrO9{Vg;;@?qhYNWfouUbd3KsoaSFv^fW%Z0}RPj@l*ed!cLD0{4TpU~S2eVW(sYH;bEoElG1IN2=GLudVtZ>6{s8l*<)hq0Fh0yHOOt5MBK
z9O01717mRH|4l*v5r7Y0A~CKCiGO2HJ(LLGbjyxUb#2CK`Cu%Mo8BdKPEV910tAtt
zxd3X?=@}>2s+SXHF5Rxd4_TE#QeR!}%e!bev>zsJB62>S#oN~sGw0O5w#^W1N5C9a
zLkfeAjyP`!zt|i`ZH|0E
z!t4fz>kYvP!&SM{ghW35+|%_|5(ReeAb?4$$xQ
zmzk
z1%Cs-Kchx}_C%j3^$P^^EM0Gw8&{t5s_uT!d(sP<8~EgZ)6Avxol~YrBxdL6%eYf;CQoX82c9p-Vg)9^G2|oX_0F=islJ6xe8udFss5@t^Y(do^J90LrmE#EaOGNv_E@
zOk4VnMlA7;>zMT<|F`x011KLnd)RBWq5_pGqok_qu(Rkqn3#=pRD>&%2{#M
zmZ5DtB}`5t%fp{cb^Ug1Vy`>Y}_}#kLUcmkXYWFeN1@GZlvO3nw_5v^Hf=Oe+dy3G2-ug=-{L#HZ
zp23wTZ?>}QKR+$cPK1df+idMLXzK^NGe$$crwZJUiu=QuANl#hm}ob7A*;
zzyTTv^?Afo?D~f=kA^za+4S=k%ze@O3*Rcg<$Ho4>JgF9M697yx{qKn&%k14b{E4d
zY&@D0m%+9T8X5Lr^oX8z5W^Eq*9nFrnj<6Qcy^ZH3Z+o$TB^4(G_dy8J_Bq2y0A#_
z2s_v@{bYLqQuDTA75V6ocluZ9jLZ1S`YCcu+Y3ZEnrXs8c^!(Y0wcj(lg$%WYS%AF
z!8a1XV;68h`XMj4OQx@nm)ppVE|gu!U+7cf=z@VErQC+(W6%^`$&8(ywV?Z{!(bB|
zl`eYIBIG7*-(JcUGs1Rt2C
zd0!`PrOzJtIw$g28Q1_rzW$s5RFVNMh`2=@Cgju!kk_jTBNH4Gf=&lJ;Q%To2$X&R
zYX$QQM$9rq6!DCt3;&IP}|qn^YGVUg}AbLGv0tz)(m!
zXvpVk85D3w{toU>F~$x4=nCGJ6aAjs3t>I^MnQh()RsMxZY*G!9;&{P}EeQ
za}vmrX|*HZW`Y#DnPBL0?cu5OzKHxp7=ua&dCs4Ar_X``x3dA{005WxI{-e7dJxv5
z_jJaF38fS;(1)=q;}idwsd5t~^|2p1k*{68wk1Bfn&s2~z-AtZFD8Us1qEjVuFC6WK%m6aW3Of%)>h)1d;^!SHgmi}I?szLrlF6DChSMmA1nFWLK%LwcY>h0Gbk
zDxPBR6C~BQ1;NP6Tii@Eb4}8*Qi{VatKCoE}}uFMY?T
zO1_WHn6Ib(ysif^+#k!FU|eOibxw2K%7@LD%a61CF=BQVAd@RN)^WV4nnGXrk|xwc)@;~5#)l6-Mv0Kjs8!(+iH9SXy~8qmlvez{dMMb*oEq9<<}f9N
zv_p^5&LNbS=szF{h2|at?L4g{A^c3uN?l5ERdiFC6K+1kUyuV^HAg
zl95=Nk!$_9xAEls;@y&&F!n*wc`;vsr7siJ89qmFO$Ple7ryVrht@$WQ-D?$1&$N`
zCO<2A#h*bh3&sv48a*J4-yI_iE($0b|Bl8BYu!3uZs9)9q@IT@NJs5#n
z9dQi3-$~*%W^9w>>g@JY$kl+_xA{g;AZ>Laj~j3eno@HUdu^KgsNR%hMuz9H>a&P$
zKd9x4NMZx?E50f~*B0%q|I3TKXMFNm@R2Dr5u>C$~n$J
ziXQXKdBqnyFPY;F%8~3G{{3Y|V2ty;`=C19ARW53xmRf>MtY>7h*vW9U6SvhDI=H6_JuuK{};Ny0HLhL$hs}z4rQkS4e*`-Oa310I~Goi~+Lsg6gkZAM7}c
zcm}OPjohG)>!cc&rt*Glleq4>S=QIhUif>JpHiTy!DK(sS;c#(xm(~hD4K-cgp;>l
zg4(OyIIhQkAdA^+J&V`o>5$H{hX0~70*c`axMi-4H$D;vIGCV{g>&magXh?uS%5N{
zv)Eyp$s-F@Jr>%6XqV5R$2$tt=T9B{BAu`6e3fRzE`QjT=z}IigzNm{pyuGi(np_I
z9%e@kW+C+?4?^x`Kya^5P+X3;h+HAF4e9_8
zlkbvmsQ|>}B+uF|2Q{0Yu`Zjf(Wk19Kcp)qS!Xl_SfM8PD+3z^tZ-?c!aECo4ta*J
zhKDpDeI4A@m)-BDFnuR40E6@82bGYQFd(-Ax>`v_V-T7Ox)>&d9L
zJ;2@-<_^zC$N}0g2)hCm`(tV$hdSf`s0px$06;;6)vq=+ft{vSh+{ggiw4s^0#4@0TTmu=A1Z7*
zBI<|{UJX#$K5M`suM
zm`>c^_KJ5c{4W?0=t1k8%5C68%DkWv86x3|2{~T#PFeZl%$Cd*Q&npn85HNaR*$3M2qqkhqXZSfdOCm{%Lz#zR>*)oPL`MLw=g)fk&}#
z9JV09qgn9}twgw3&$SqVr
z6So8V#>#+E@7|{6-*AikME)YlE7)7Qe{favT%vT`tp)s*w|X1>KmggSj9d0;9V%
zJmi;K#vjDcd+ECWAclsX9J7x2FCbX?H>0tRd+{jJd;kz~X6$GeU0r#M8aZgChIp>V
zhp*=4E0bM6ffS2!y|WJ@WCPA#R?PzqV?m62jZsVs2%6Z(?uxeX|0&u|$2k=tS)EZ+
zOum9fKDm)-06`MQ!|OhWnDHPf{L7F>vXXDs&($cNs5r`#<_~-<3j$%{xu6CwWe3!n
zpTpa$=hYWZ636Jk2L!b4l@Vo
zXeO@8wKmcwlTKCVbNN9?XeXM^o>m(#o8YfIrFKqO8!?E?JSkQ^lQA
zF6;NvHee{wUpU+U9{FSA0(Qc=&&AIsVsk*}s`G20JFy+zWlrkY=;((sxgF{%5$QZo
z5cA!QrUVeh8SfW{oNWXpsi)R>S}yt=1aW}!{)+Iw&HMkg3IWn%mfXaZz%o6Ic^N;|Pz!e1tOS~*U^e?(e_{U(XbUN6IzZF51jv;yXQQJpQ854>SxP&b
z6B?I{y++;{b_|*2Rpn<~2IifJE6vUY0CVF5knTbqP@YqvKld$Z?yAn|&$R5je9Iue
zy%&>f-^I#o{!dsLMn9Wx`_}q%E}dfl&63;lO|UjTUrn#+)_1>sQ%Qhg#N7!#9W^aM
zzY8oCXz|7=7;Df_tBin{%`9Jo{8aS&}6;cLzikY%qpeR3-!3^+b3`57n((I2Kfyu
z`3W#BhqG7SEe^}>5fk&yx{{vYh{kWp?+aojoeQ6vLK9`k*}&;za>8rz^_K`1#dD%4
zGjAi#j|#Yv-j}X_tH>K-R{uNX1fYXN&8&@u`d;UU+XbNL65&fjS4kx?jBPBZC9M+M*kE*%Dh_z(*)Vh5Qa@*MNz51^7s
z@AJk7$F=6}O`-jE4khaCFNR8c0`jsUwQ=vN%_0K?#<4nxw%=PACa))E@gqI)e^DFg
z-1`>-`0l?&G5x)}=^!qaVl={W8kW^$)6R-QH9VXZry`1@v?PcE73;2m&2|P5(7d*j
z7UwbsR8K|J8!N>iwfsGmy9j~G-E2B*d+G{FLIuRG4t6NCSb`?yQ`P^)u(Kme8DyAC
zMNW1~0vJijQmTL=pt>Gjs0Q>Au2F3t%j`Wg4|Ux?VjHCQ`3Iu@h5P?K=w~i>6Q+LR
zz38Asj38pGptwli&EgT=)|*fzYd3+QpE8G{xJ~EAWA&q4U98!{V}Zu>8=>yv^P-?7
z=1a!`bTouMfE30k@oyFOcii{*rM{^`91Dnq4TOj5P9!)zF8nxly0R)(Kv{*R@vWij
zG)N&9EmN+!x-I5dL&TLwx9mBQd{K|WJN3yErP+?M`(|7Lamv4ll`8_-4wVD(Ih6K-
zJ8{B$<`mq2tTw>O-od2{4lFKbOQ1vJmFViPyV#I_2U98s!OCp6Hjv41PP>$`5jv@W
zB=S7H=IkZj0UeqaTNSFAIvW*U&?9aK9qeXohZ2EkOevH9yJ!J%o>mtNd7WcMx$$qV
zxpyQB^6Eo(3twLgXXhPw^IMOql~RJ>t7Fm#7pisz8-~eP0$9BsOSE$Ya;dDrzowN!5dcDEbSA|w`W82WqMB|
zEj=mb$G~*OAGm{;#mpgUc&dM;hW{2Np*a8C^UEu#@2zYK+i;pva&!t~7y5#G5hxV5
zSnZL~u#W2*7AN2)pkNW9dS3x3%~#nFVH!mB6thKxuF5H=Cgo8a1SoCo0WkNS1E
zYw2@$t(}zxXy689^=+XoRS?a7w%Xnq2>%NC;@O57VL5374CDDsGpk&tuw+nEKRAw<
zJsL4QX{m9Njg8fx>VC%0!=So}2K4qy&<$SIK6y+b?J69lwi}lPxqssOzw#gP{qGNW
z(tkp4RYd9gQ}`G@f@r&WT#^b6h_8!Er(Op%^Xi0-T+Iva+TVzl_thYMCoVzB)^elw
zIBicVND{JF@&T=cOqX{Qe*%x-6T-}p10HVLl-0kv-+wdCp8|~Y!Ltw`4-jbWnQTy=
z0f?9Q*g}RlTI)flCxM1n{0{`o3495MYE&I)LJsuNgS0f0dFc)aYr+cx!aSe?8Bw)6o_s8CGJ0)#qDZey(lAtyFcr&E1K
zegm#r31nH}uF*4KY6VM@9O>a}A8!Gps{e$5ZQ1`gO8_vagDS%#tSm!Wybq`)GlMR`
zEt?l~rwsk7GXh6^;I
zZS2({>1rY@sj7ebe-ih=MoCt$tEBwStO1X|L)!e~tN{r9H5{f-a5JF(!eLlUC(0sq%Rjm8-yKMPgF
zbAhiF0FYFA9}3EDt-i(2b)$PzS8z|dC8Jc#>*6b?ZS0{`YH0*gsrT?rYmG$-c;N;S
z%gha+q15HyD5+YA_6I^tZu7hUffW-u`3F?%|HLLusfL2l2O)8~E-`%oqZPhC(?rQy
zC(D+~F8)sx(Z|fQ4mDfBR;@_D~HP6M0)5>Pu9L1SgMw
zqaONtphycmbkR#u_`7P^9P4s!DierB%DwF0T1xSc<8E2er?)#K5;)uhomyKOuOM-u
z@ItpKiB!D^i3I@0S!w?{Cj#c^?17qz{R7mjQouf~Sga=`_xXf6|4PZh*M9?p*#qvn
zF{{=7gew&jh~AJUDYEV_TxF?tU|oyw=&hf+_KKG!6U$lp6?QfeYu2%(5z^P&4o+c1
zp^ap4iA-qIZvFl>^^+vjQO-WI+4~3R3hLCj{O17J83OT=pT66OegQkw?7z@lGf8CBWnKPqapw5QLzpiWJtc@z@+b#e>tn(1
zMUS&i866Voj+?9D8E3Mj-rsGrKj7`dS!g@wiX-+Xi5Npw>LDV=_PsIKPG@{(R$<$w
zUbCZO%l2$7Wd#!#j{j-m0)$ixp{MXS-saK=@R<`^q@G_+oKjsx-Gz{=4O1T={E+T4
z3OzMn^tt#pz#ZEPhWnUxHBI(m)$_L0eeOkd-@}H9DsD(n1Q-c*BF#(7N
ziKpA#X`sN5988#fd-&U+_C$u(^c>*J4B|yN9fN6ABNLn62CzAROty&|SZ~C>aPPy|
zTx2nmcp1?(0)f8(;CLOwxo0rMi#R!RJ}@STWFLh;7Hmm&qaUTG=W5Pfty%q5IyC4K
zKVZrDty>oYSXS%;ETNL_^{+EV1n_e>FL*H55#33-dKwSw0$}IXIV-d&5*yS;YHF4S
z#8ld~S|zqS6;U*zZ6hHgK|fq3ucv`24^*?2fK+Sm*b4vucx(mxH`~PHVioHeAI>=i
z7)T=GlY7P{3l_Pci4QG?5Fq*5X{c>UzWX*^!;}`q^Aav8zdE+6IED6RH$-A}VRp^g
z+kq3UuLZ!oWkn&`5!Y#nTV|3A0^s>4kLCapcLI*PhCh*N*zyRXY@ZA$5r~c5g<9N&
zI+)UAhVyqu*|>x05WFo<(C^8482v$^44Mp4aHTBIsQ}QOwcb&Fpaz|T;s8zxx_koG
zM8xx)T&~bBMf6-&x7-c}NJGG+FSQe{3&n?9X}=20T`7n$_03uCa(>$dFpUW45s`fe
zMS~ntSv$o@cbpzESxi6R?xxc*>aN1F(ndSa
zo7lqVQ=S7H&-&s0y~~$n#5n@iqh6*$%ucvGxbLaWI(SfxBK&-|pW}dL)Zl_^RCKPp
zh4X5Wp0=*Xf=G09_40C*2%qlO%-|jA^^s{~sjegSA0@Tw%<7kB`?qwTFw8~{rjFeC
z-Y#jvTh%K%aJ;I^DGB*0kScw4awXEGqu%(y;K{A6K|QIF;ex`VhAX}n!JarOdOf`0
zPfta+_tuS4YucV>t2qA6*JJ(sp3a(5tFKln%~zEnp3uP!{~*izZiyvem<=_UTJq!{
zuw#Ub1o`a)>`0YV`Hxc>(1Od&n*|#pa|Is%|}$
zQ-s1l!@sX~bzc3Yr#G;%WW{f_^|ShpuE&T-RCLnT)YzEHR`b}{dbQ_f8h*N(6gRl(
zh?$>C!_?wwfA~;E`I+hI9()@~0GlWd6K#Ikj9wnp)0J9yG3IAEGw3!V!e>?WOFP=J
zdIddJIlG!Twwdd8ZxwgS({}Yo?$-DDsp^erjL1eKzSM2L6~8)P(_LNFRew{f>M2A<
zwOnrSGVW;7#7{7C$@lbF*()ZRsf?V7H`mYG0YD){B{mgqQ!Y_m__OnA83divS}Dzq
z&~<8Mu-Z0%>0$S(5-7sWB%fYISRo;Tq9H++NaeN0c-ouK5dyiS<)}MSTTYrD%d@(=
z9!tj2zuw>n@#|w_{9EXItF;Wpo?}T?xYa?j(?XY62_$Uh@HWRu3P~dO)xL=+N007V
zEvc37x1&|Iu+lnJQy`MYMg})N{<=^TXSMd`p7X3^=h3aIr4(;u?%2j0GiUjWIp=`^
zfsG4+Hxd>8338@AGj?2p@8>yXF;-S1$}3Ka-xvfzYd81fawC?xaGPpDf_axLx>T0C
zveAoOS}L^P@ry%;PC+#95{V>|RY=y>=M(Ww74%g
z{Vl#9q1h{Tw~UTScK+%+AABF4Mxd(_?FYyE396DPT|y^G%c&j2$z+I1T+9lTKOb=a
zYS8uy4w(7L{A3IXk$D|lw;sBHXi8Y5I(w`^KulGK!p#o9+RD%GIhLD+@5Mz|FLig}
z0|(b~=a^lI$hMh6F2e?#jW?4h-4;WtOWkVmEZ)^~B2mlLv+ML*5it7d+>A?fK*uTb
zy@c24>q4BLZ{BHDN;Mg`jwQSTePJ1~ciyr#n;M&gn!Mb$Tb(Zk&8(zH1WCuD)o6ZU
zBbK{tc(0gM`T>M+&&mA=Cw7<%*uEoKR3znXc-@u?Fc|*L&-3GYo0(%{6P_NLRg14l
zMYdEb?+QqOTHh5>-1x`&PbHq~YgVLgYbyAu`Le;a>|cWinl_nlqi5|ud(>SNIrpr*
z(lVy^@uu>b*2#Z}Y;4zO4CoTrgL^oRGvKE2JRg$5X+FF(n{77+?jJ-88s~=qe*&ON
zrUK}{SDumA1uxeSJMiM9=O*x8oy#7x^W)MR0YFv{OHC*q`|zwqZ3iEKG8R;1>n3)g
z#z9fNK8W80(Kzi{>9$BwomYXyCv$n;hQ)t(EcXSOXy4U2vedUKSAQ&(4Frf6@_->K
zgSHdSYd_po!9{-ov$E7~Fi`NzAkKR;DEw4jO*
z6@y3A!$o+NRH1%P2Si@tV)u2*lc@;R?tOPm`1Cf0m+-Z-dK)44R>Nl*PZC!^P75kG
zQ$%=A`jyFOj|Z!L((A?;7}#Cb@DIGsbj;c-mzP4RBU)EPq-E`lJNH=GvEOq(wvkd0
z%^k-ho$$}onE=CAEPP;qr&0pyR*4}XI{>Oo5MC{Go)BolYyIn$4vL>|V17xNIza=h
z{do~FJ>IcTJ%$B2`iH#A=_ivoE8RAyF>%$KCDGB+3&v4nK2((EUIfOeAyf)T8oyli
zw&v%X2Uo>0jnx~NX?$GG4Sesihy6L4u6_Y*jXofx{0+z1MVWcC(#h>7u&y~OCRBLaW^f}8gUQ9Oz1ymucb#A%VP@aft#uTMmDHyFDlW~#6exGA5%d0q
zr}p$xB^yWqGh<-R8|vbZT5nCn5KW>HePx?y7qJa*+ebWxZQZCBZzjFvDR?QV@hy=!
zkPhfF)Ou)aBqF+XGu5-utsXzCRXr8gMPD+zIeGuSQh5nz-wg*Sxe+@?K?X3$LJ@Hh
zA~ARl=1Kff9&l)kERK}!D_NWe^X(rQNbSJGeCe#vXp7?V6_Z6#C~IBEHM&k~nUxJ(
z2_XZB4L;C3&1sW7=9_f)VpEp2j1JXoML`90WaF=%W5&$i8N5|Pwlj23r`?-jEe)Tv
zIhCX7so0HUOVg
zw$$A4vXMa(AcPinVUJl(+Z``$%CUb{SZz5HT$jN8sEn?<
zzpNzusFo>E85NjjgtG)Hh2~r>7C6BAxwPC_o;D
ze^11=F+{~TxMH>SaUL!`8n!iYXV^+kKx2Et%&h?(K^SZq8aF3K2j<)$7|M}gfQZie
zU8DAqzkt~)=om_Zz7H=hiN^TNA+%r4Yz~Oc5Ymmy9269^+DK~ym`ehVf%WibN;pmo
z_ZT%;p{ZN7RP=K^Y3t1OCykJ*KukC>!Upi4qoY)|*1(BwHOflU_=YEQ*N>%!7z-88
zR)cySYddt-F@G99d1rs2{|jUX$#reoaKAeoyfS25bV<0yZ2F*`dZB`xN*}60O^dco
z`&JL!RaG02dC1ZxO{|3%!B@|7W9FMr2^FG1A1@FJ6$-Cd_%vU`h9Bwmq(R{-lQs`&
z7UMD7vQYjvvK*d1(x%ZajPTkklnYPB@kdM
z6Csvbe=1$(Hh&xcy>{JZ_J>s<$%KI6r~Zqj^TUUNo3Nm(nt-xPARDls;IL@n_In+j
zTL6Ft<22i_KY5Kgb)7!Wo6Gb}K&0yIzMsHc!6xmIxcyb2k#iEhghgFKOghx+-9kSf7C2W38z0qt};Y10o^}j
zP~H>-mub5iX&XR-c0l3VtCR4nV`C9p?czPx_dzb~MG`Segs(oZF=_1i(0MjQPp6S<
z%b%JH>^AL6zJVONc&@Rd-G7GFg}sjEf44^$yAViqMOrxhbg2}0XrEx>`1JPB>q3*O
zPW$xS05K-SBJNFrggh8^ImEx*oAggC9;dgW;>x7;awh@Ze>gM-&hZp_8dBr1
zIyO(8_!G~{99`$I+4m^$0K0BoU0_;P5vwErpd{VdoDabU
zDm0}wKHR3?vf9_T&PGb>=|hkPsrupEU!a(Ax|I_7ei8Y9k|guHuAXGYiuAQIV!s4e
zp|iIXc)QmpKcsGim31?F$U)7vIZ!OwrO7O-!xX27n5zu1o@>=^YY)uCJHV?M6xAeR
zxHF+PG%f@}N0MXF%C>T`yCpA)(YbeE*`?jeU)^|!Qv3#yIN(5XcDbIPiK8oRS5C-J%u~j;4H7SiIXP=~dH%vv=#_4%s_xJ!ritO^u>s%)_oJ~3
zFQC6G17}PQbi#a!vEjwT27(#)u?8DNxT#uAbt*(m6ypTd>+{u>FLM|kr}Qj@n&oNP
zTIS1n`et&{I~j!^WZVNoookXnv1dghe;({goo9xIWUc^NijK3TkJ~4kvbb$6U@%GR
zc6RWCojbl-N;3PIWQ1zPQ+R2>)zE5Antvhrz23AWRzlT9pAnNdPTi{ooZ^(s^}GS|IzI`^a4Lk+#w{ovI{73)!kJXKI
z#b}4<46BTL-#}&bfYDgUr(OZ8et`DQyosvu7Kf}Q{#|um1Kw8&U(x%zF%QyfL6SR<
zoB)B*2Q+tnN4XBpv0z*Wf8DWiB@;Qk!Hk|0elY{)ctXQowp|63cZFjtwEb#>obuzfS7E%#{y2tQURJVN4C%N
z{^Gb#B_7lBe54}pHZB)|@iq200SK#ym5~Bgqy=Vx@=Y52YCorjeIOY#Euq?@{wwsm
zw&{zvMTw%d&@#0;7%5hw!qNaOB(*3wTeS1kU&Qq9!Mx9Oa5?x}KoKiw#L+{(f>%fRNi?)q8q!45F)mT@8$i#-a
z$eP{SOC^2i_`{?QZ_DW+@hT%tkBM2g8w`TN+aa(B4hRKFcLrV$(r+b^jF$3l8*%A%
zTd3S@`3SVzAQFImrVw;FVH6&>Us6noyO
zsaaO>Vs(7U-Kw$q=B*d4>lLl*chx&@cc!Ue)J7yW6lP!bbk5okZN5#JzD2Bb;KBHA
zEue`v>UR4jY|0x^0WQn%>v8J&kfYc
zgBXazZZ}lxT3xb0N;EDtUboWlX5VO?F79Hn<_%AadrQDvm{PNg`$|%MSvBeOlN82KUnM<89{pq`
zVw{o-jCt?J?x!kB7rqzd>U=gJSr>OY%Zyn&sre~$HI_uLMfs6YoU#Y8j6TmzL>fsk
z&39x1a^`JFmd}KwN}%`*($c8RWn1~gwy>c=e4PSOLXRVxk6`B_qdQx}uaS>cZh7Q}
zcU2G2Fh$d*!|H;rnC`2{RYJ1Kgc}GP5q3AoV^)-zAd|lL&7*Eu?e5`<*HJwZ$^0kD
zh8LqSkC}7Lyf=?{E>JP05LbU)A@!O%z*azV0H$+__SiEH*r-gtgLU^E*?4JB8D*O@
zKZwLpaBwz4T4Trf^gqONZWsA9kT#7`i_=GxxAoPt9GMRjaTF
z!TKV3;CXGqL%c=x&5fyO!n{VY6L5Se-=n4!ATQ)nGd?Rh>+#CJz`vKW2nFSlA7~8-GNmCPe@HA1b3I9UdIm1euHJ1wRGw2x5_vvOl6`J&By*CBFbI`K)QM(8V!%;cC10*ADZpHo$
z9Q0w2V~MKIW8krvBWBa`!*-MP)>BO7C~ecAPEw)Q^)m4TwxYHp4!n7T;4^KLP$HJ#
zE2tlWkEAlbdocp8rU@$<M^QBBWC4tHF42KOWl$}$JI}?1z~SE8}yP6+)&8Md8WnQV1CBgA-vBifnrHpYD3Or%a@$b+6cA}
zu9~#sZ7Lq$5iehWDws^qOU5U9u#(R
z+>;u5R4lJA+M|yU6G2i$4|EdN;!8iX*Jrw@@X6kKL|znqJ;V_t9jB^J(NQ`4km+p0!ERp@yg_4a*{ex4`sm@q(Jf`a>qmv%;0es}
z$E?lYZ!2)@PYSH7lb#&fHWvyD%r$$pu0KIs)tv>ULIj**((P8B#P(wL`Y?Qp;?wZ5
zMpD7~6nUq7OcV2Z*7J4}XR3+H9i(&(@y9Y^9|C(`y>
z3{xjz91vh6MlPKAgv@2ti#LL3;0C07%n`bG%8SnJzRbB(Z6j(;<0
zJ|lvRM5j$yBjD2^_#??|3J`W0cT^4KDeI?rLGID*-nT9(x#7d=K}-ahixQTu;^vb`
z1+z*1DmKK1XS?f{r?~w|cKVK68z-3dC{XYfV+J|$js?H3nMtS0>uZlKS0Gbe8tQrI
z4L&B5;)B9oXDS~|PRJLgOpVKQQbpDUk(8GOE%W}JeMW$NhPTzF4>@?!1Lt!wBo%P7IDsh4w$I6Y
z_gauTK;>#@XL$c)ijCJ}Lm7rhv2RZ>f;r`2g@)#dwxf0AeRrTV@m)TH)KJaG?QKTY
zGhXXg^<{=2(ZVV>_7Uj}HNdYzs=C&!MB|)p_Bl-CZX+<>2;0;*zhSI^#H7FzG-b
z*xJWovTumi+h{vJ`A$Q5HhHXGw!&0Rf+7jcEEHA#x~qww=!Ws55r0P_WzJ52et(Ll
zheTbn!sIlBL4;=0Y{Z8O5}v5;I$~w6XhLcu
z68CzDa%PKXTZ$ji^8X&A8OLc*H2t|?Uo#0M+~={{mu`Z6l-g&k1XmcdJ_H8mcRUKd
zd2QT6z6J4t3jZOng}0ih>3n2eqb>Wy%X8|lv*<^Na$%tgp$6Lr0;C!&ez|7Vpj9;I
z=na;0W?xQZJ(P5LX`{i%KA_J6;^V+lA)_0m`s<5m4buzgj1vpOC-1|5&S2S0U&NxB
zUyC|WRAl7GAU%k^Y=Q(~SedD(Q|yXjFONA%BHHiTW$d^aGhr3)2GJbBTa7K>&XZ@}
zsZNYj1s`!elsQXof-LO-qL;9a9NMIaNLL8$-7kxvHygG!bl|gP{m3k-@=5CXo>
z;vu_$MtFla)2S~tF%J9va4yJ4*T#?Rcv?KcEF@ueI!0OHFNz)>GR59I1Tp^k_&Kwp*BPen~A`3Gh`EtZ76FXdPsl~YymZ5_LkPvKOR8l
zkPixOH@$$RE6cZ_%fvLb>yNcpv^Ux9LV2{bD`jfqL3BYNsqi_Y(BTnT!%iR;+RNrwxPpO
zQKl@3SdlfSZCy#is)=x-Xd^lCWd6kz3WK??aGX|CaU}VU55qgXSG~#Xav@EXWi?KE
z_f&e#ZuyVxi#pVmV&~(duM$$zsDDcybVE=a%xwy@0Ghh|Cr#C~)bJCzS~spSN0^i+AS=lR8vP&=zCFp(!tm6e`UFA)g-VHx;Q4
zkv+9Iu^a!0M3RNg-LFvuU!&pY<9@qNU+u?E4#NnOQGmgA_Mz$u^6(~->{~pe>bzHc
zhP{5)raF^s(pq5Ou-jReLdFj;=#zXylH(_JUnong(VL@N)|*)|JOHtimaUWFEz8V1
z#<68hg&7JV5L(P+srv}FQ9i6uEU0lH0-b79sCC0uhSen7kfX#@l!+E*&H#LQGR=fS
zg!F|^U9^uL5mIqvW)6YlU7UMsfEI;Qf{{CY`nD3I8r!bsUH6a(vJiP6MZQZHa$Uku
zfXjAQcg#M1I1LH0%b6!n!bZKjxae&&qf#%}pdMn|E4)2|i>+@)iXvr2!2z`nIm3$a
zZj)upWKxeCK}DLSpbl|1%7x$C$pYpuf#nb1V^Ea>ni2Q71a-K~_pU)J!F4&4)DI>Y
z)y1VA{Uo*KL#lIX#Ke!A4;CMwM!^|F3g&En046};9w@7Ex0pmO$8VoVjQQ~wg!>PO
zmUI?WpUO2sZ&w3lKD%S!=kM?Rc|)h{s2)VJLXmntm$bRvd6^1R3J{G^mEjf)A4YMr+BY5w(iWGC>$dx={%pV88kGTa~6QsVSiAT{4k
z!FlFJdDOa;xt&MiNbEC!{9^$Y;beigEr5=$85sYCftr=Zwn%l`?jX#OTJ>>np*V)fUjIEYgJ~1k#b@_+yaM?l}3WgPf&p5Pr
zv(PW@QA^F?ILO+eqcdQQJ7A5v@3x4YHJqCAch>kpSmHt-?3(SzFTvQ@6hj{elYX!_
z-h*ttM^Ut^bOGP^icAL5^ZS0*CMb*ssWgLFl<=QdO@hDTS(M^7xK+06P41&kJKi(`
zyh-|G9s7)rTA9AOppKUh$XJC?#xfDqNIvb~Z5s5ExLnPQPT{ehP5RFpA%B=*r2`5=
zBQC066EfdrXLFCJKbzihr0y%>#ygH=2^{I>S;}FltIric%IbA%RkNChRuGJ5<)K7d
zU%?h>8QRIPc50z-jNV3=zVCSHoZ4VpLgC2w_>|NsC}S~V{P8i8jqPJTuP?FS=v8$IMBP37lHSQalh%
zcP2O0YUP2MO?gpamx}soMH7EtlI;mfLdkmwUEi$*R0<>~a521kQK}DX2j|nSL!atc
zd`M&etwqwBAd8SKsItLTfkn6s=zv9vKzwW1ZjS6&g!my50>nnMK;SyZExtu^6^OfvTKZv@B2PGLA)F|eD9$uCkIymo3w6NlDHdA7;ZG_9h
z%V>R$SB$!uCxu~?H$YCm%DSbb^xf%Zz{o%)IQbHGjeqM^dR&m##(a|d#d5l+ZTfcY(SQ7sZjt-*
zj`KLH53%7Q4#=5)<~~{rJiQO8|G)Jk{%uQ4q?E&-=}bCsW6cSE6lldG*O@5Zj%eM!
zEVT6z54tys+&?%wfgM!itbYqHwUXk=UqAVNXWM1L$lb_4JxSCTExSlTW+SbW$9jX3toCr}
zRO1RU?2zG`aj>3}{&EQ;PabWJ9B&)Dw|Tzk-KNFoOd_NhtFpN#hOyi|H_mUxc~*pg
z51get9>kJdYE7+RSbiA_`@%TO@H=vy@i$L5zJp3LC^+Q^(fB~2KJ{`P>9h@zkGD0Y
zB|p)F^AXCFX@(&+vWkZ*t}B3kN>W}SxM9jz!%Z6^s`DNzFa}(h9??*x;fWLyS_ZhR
zsA6Xuu+t-(5v3xF^w^srqsX0Pp8_&V96jZ*N2$IfpS}Qfc#RSx(e%gEFTveLMVpK~
zzH~LrgaB>3F~Ux-Whp@i!^v>Z;i!b(l8MR-H{EbD2XYnPepz}MB
zVn|0C;}N5njgnP3syL9h5#h!sjLzag-sXu~25Kw`YLH
zv`#eU?`UjnkH&~0jVag3G-=vR78|THQZ=>^J4r!+*0|VhJ7Z0qHAOy83~rL
zkBQ{^J5hVB{3A1K-}hO8D#5kRD5fiPR1#%OUUEVnE4P(jS*()E#9ATfrijL_vAu}J
zCWr!W7O0{LGkuKMt;9jaf-jFQ^ieTnHInj>g=oKiL=vD($>y8cMLLjvQvIeW
zFPE~#&4ss4JvXe0s0tsmZPma`RIg-`t%4P}mm^N|^AsNEidOiA++HB@U4@)n=Z|b(
z*iK}^(SOKqL`_F_qo>qYE{%@jMELd!Pq}!7!ns(TY=wvdOjD&dGR3qkI(2XqUh3zp
zPdInVia)U}Q;gU)@bnps_<6OD1M*Hg!7&tr(3sInT<6eNqi`lc9;CF^C|h!6{C1xE
zp-=hOcG3Zyg!kMo;^atjWruj@kmZCs_7-A?056SX;w+
zmib$O|FFMp)E8vDdJnB6W?~Q5Ayq1HO&kgwK>$&Ok$+kNPy?q#cy3g3>*8{
zKdOY=B8Rk0;7CWdyq(YzBPf&svW#V
zK;`rmmqM72Q=lK&x@g!Vxv`1u1w;r7+zfw*9MU$SM>?|n=L;|=c+u7dOESOnnBDez
zx+o^toM=9EE)yLUZmv$cG;%?Ps~^F=;!ARc>(H)cJN_@rezlj+qvKw`qjzU0
zOv_Lx;~U67Qm5#LZ>0_sOFlWcqcWph$eS)R}DkKpBzCHMX-~c9enOT8iQ5epB7A6@~Zd!_8$DzOms|!
zdrM>Bdf3wBw4QW=_(rx0ENVS^0%TO`llpm#l&{_mBgC>b*lo`9uv)(rP0#A5HezWL
z57SZ=blIp#VuE4!Dvf&3aKcNEsNS{ZZ~;kvhy{G)qc_<5T%c@m^Q_v(j7zqN3=
z&Hx`CdS^I#oIA+TmbnON6ZPB+ZD@TuG^O(x`7fikbRA*aR4eR-$+NPndHEzUW!iv2
zkdcRsBqIyi$kaL)ZY%{=*wmP61bPA8+i_{|RFwMKo!e6PvQKLOZMvw8Oe?@33cK>0JtN
zDovhwMDWMkM`lNbO>KsGxQRp1L#m8&nU{`ymy_g*4(prLc9JNk4?TsZOi&~45}QhYlG9C}i
zCkc)){%@Uoo;x6GGyX;(g~LFgM~oRX3nE4rST$jymrb7*cJV9nnXx+xJF?%O5daA#
zxOf<0)`F5PEistWh<`yzm)5z@$%K94Q1ZwKL?<6}rLtkpZ3b{`F^u&)2yllwg-E
zJ&5(~qSl4My{7ok8Ar+qqAZe5|HCTwKHlX4887^V9lcB|M{$wpW1l#hNO>Dpo;aN<
zxgJ7ed}jZ)K<5GKo>;KS>=E58Y;G4g+%m|?`Z2mp-1Xet{Q_Tdpr11-A0YkA*baUmev2+X
zHs*r`w`&$iKUwajbPth_cJwohkZ-1Artxt!BslVodP70*YV@7b@KpmRV}{b30XKs}
z^GBtr%s?J0AWt%A*1aD_9Fz*A(ct++c?tcXC>eME$!h7XAMqaFMonT4j9bw}jAQx|
zDqlDiXx8p8n(uk0IzG-oBpgs?W#eU=&-<$4Ts$a>ki2AWi7cWjsfAw==yYkua)exp
zmpfBtXk>^}&Vsa~8LYuW2HxiqE`)aU>_1-A+!4ng8l^<-Xg?y;vS9%74XqXWQjXwI
zz7Tf_X(0MVN;)!|o_0X-EL%x%!WWe|#37oR4U6G+w-@gVL};vp6=IUrS>uj;?*ljY
z@w3ZHa8>@|pl8*GCQy;nUXx_!?*6RH&Z|4DSfp#~)MR*gLRCJeCx)?t#;jwwUNh<#
z83m(B6zf;V%f=}|vf%jyH=rQufvCm94c*m^PfsOj~KyZkjkxbF~AvKGsMQ~v|
z_X8nI&{4QKC`pQnG6_q>@~>%tl4Mn+zm~JPnEWWDo3yfsA0mG5o*Rj)4!^wFcbK3X
z29ao*Qbe*Azo^9B{6M?YCvTf8QVs+OLBT~60yb_LmilWzJ10yZJ^pt0`$vY$7|uZP
zavS#hTLe!o8Gh2mn3o{LJ@Ga2mn)C%W)IU`2r>O>YsjFbx?vI;O6c5s$
zH@-=|Oh`Ce2i8q_ijNmMls*a2fn5}d;V@&f^kWGJlZ>9!$+AIm=tSo(
z^C}}E84rN~_7VC`Y#fQ=Bh}t`OA^
z^Q)PphM&Yns!M`9pO2gL;7qC}jYQYg)?}GLqM1s64(^gYebVo$v_gJ1nX}~dadZ>6
zAG+W4EkN5K;CKv__+Hh^hMHo`**|dvYT}v_VqzG1UO5g!35Q*fi7cds$b$M56jJFs
zA*H4zT;JCoMiL{cZkVsZ&1V#LVJnE{VPy7csIU>iSAC1;x&NVv@erw~f~1k_iUS~y
zVojkOQ+yQpvMM&@XCM%y+mI2IoM1}_i)yOiP8UTSqawHYXXl-ORH;k!|
z2gPph2A5vnlWSq=M|!<5I!PZ=G<>#;akLwW73c{b28F|g$y#mnBeJG!Cd7pB(2-dF
zGB+-d;af1$5)jSuCXXS@+#f!$rUl$2&!P0l9yiI?|Kc6*5Piff>_WU;7qWnH1j)%s
zM)Ba^1kmjq`oMroM?tT~&aO0OT2pWJ#P-T9urD3hRt)1itgo^PcQ916
zO;xa@qhPYNm8$Zq`n$u1@zWI&b;@vI>vO4r|sqQ%%mqV$F~hpqcg!>P#4II0omf&v?>R=EDe
zm*A(3cpytx8AYj1Qmwe~f*FUshYw_DzY@4N6KYB}jLJpn!<92uOp{
z-3`(WqJ%UkAuS;#Ag#1?cXvp~w{F67&hwn-{eAzyUbAMdnYH%p>zZw^+W51#``q?k
z!@;m((0mXk5gX@L6C$OK@m%2#<5;3y&~vhwl2Bb~w4>y-*PORlftWFN-Hazm*}KJl
zTdGk`Znn)(GKb@aB~)dGpAE^ufV9Qv{tYxw=_+tyB2$XN&Y)zB%j(-#m$Q9Qe~o>H
zf)i~In5zqm49*1KA`BiD!;s{lH-`i7n{%C2rT;s6QRVLe$sjqNd(#v%XswokG_`7~
zA8xAsmG`iC7k7imhJ;>6eEJ2jBRD!{blE_wCKw7UdN1E_XMx+zqY~z9e)%}5Z-=Vd
zoN4+bfb+FV|DgtO_w598%Yr#>kgD)#3lG-dHo|(O-F>BjNEkfjcgIbzljehX5}o+B
z(r<`2^!?P0>}CC$=cfr-G$USgV+vXmUL#4*`I{|mI_C5^^YSH%v{+Hmc$1M3uRDvV7}4(H{U3b
zW*HvspB20>Z_h{3wIgf>{%K2|s)r-4?Z|-D=ZbPwN>5El)%CKKyTT)hrrSBU469>ivYN5Y
zjVvCi?erVXz+A6(*~JK=7djzsm-pUGwWt3C&2b#?>xzZH#GK8d1LO6{;V=GbzBc
z24_9!SS{893>Q#c9#e{FY;zGG^duJsye&f$G5(2RV&nF}l9)I3W9al3S#Pb7(sC4X
z%;We_)QsN({GOxd;x<7uP7JSS0u17T8I&n_f#hV<{Gc@tdeYQ)e?t#IvM}Y}qxG*y
z2GM$wZsYchU}15{10+3PP=_-_p13M^2J%|)VF2!evau39IBkQlt<^4^l&CUZY>12Y
z!}@>Kqd3xUVHcRLb?XdTgRGLIdr$RyuFPBAW0LziM%_@9NY#L*LEeC-xoEb~@oa}p
zWR1cgzHQe0A@cosR-byp8Q!pBx*W^lvhoph(3eX?fW0~dU0paB+TMv9y`@di#BSno
z;+zCL$Bxv)Da}LXIy|-{S--#R^bwV>pWva5i
z-?9Yf3S~)~X^-yS51E12_+(+r!W%)Rikjj*0;9ZL=8TmISe=fcSotoW23>c>gT@wI
zLI+*vUIdO!96L|Xin~3EKk+*!mv%d8&V4p&`=UQ=wC}^h)OeM#r=V->dM7%UHAJkxPRj8kb?mQ04(<3feT2&z0y>(Q6ecV?D7HBk1x<=x57TlB
znqu7i8{1jB_xJC+W$H`g;Bqx*KFd~aNrJ(&6j>%Y79qB|msi~iTwvzRV@J}P`dx`I>|Bk
z`^_wDuWX;#ZHZ^E8IHERyZPvk!EU7Fw3$&`M@qr@VdO)htSkFF5Stg?lnEZ9%N?kh
zO-pCifx_~+UA>#gKMeW{-fD*9v!T7yLDHT?7me%B^KVbTV#1z|?WCWS=lcnw
zk??#>Km8&a=<(uk%{i8dF`!D|fr>8nJ`mijK`)b7-8^^vj&()oWZF21a=W1x;|paO
zZRPmXn9XHKVMv`Z$K%F!UU{AQu2+$OAzE`Y*8X71o%5cyr~p37?KgKNDQX}$Rr|Pv
zpXp7|si+$w`>G&savf}^Xjbhz2aUaOFX286NW!YjKjytVzH!=dmT-Q!^C{P;PN?mK
z-BLg2BaU@!opwmKU{!@$aZ`Eimzq1{nMeTl5mYb=?G1&UDY9MRI8+OlxF(DZsYP!V
zz7Snd$Q@j6rf_>na
zxZB4;*BP$BNcX+YhINj7p0b*`ug^A^cXY8kU1y;mbC8YET|6){i<%sDB&R%Ia2PwK
z;nk{Is?yv@n}ivEJf*p0Z%WhdYfo)g7n9Ib2+%`vdevxo2<=eD4sl4-w~>lL~B$
zF$A$Q>Nqs|=EhPtqf})r#pd4;c-=d)CzNeAKcF9vi5b*IO)B6qo@eC%X=`Lj5=RK`
zVXavm$L#^DYK*N9W^1ulCi`DDu2Tr=IBib2_HYG^(YU_F+I}T`_i05ciH=)^)oMZG
zg~`)iA2>R6&1qf22QsPrqdBxLslf#3LMJkIX4Sb>Z1cBkvn>}V`%4hw4!^WzY1H1x
z$22-tjz?9Qd7keaRQD2eyzUq(=%Ay5HW$VZ{`8ngMHB{WU5*iU;L03lk|`7Hp$Psc
z`5&Hl`#oK{{K&Q@Tt~hJj5WJgVRgEiQP~e?+|h9x9c`YEd1q
zDopw`b5?j@W%7}R{P==v!}^12kyS8a27mf7)8|=9A;XHqBsUXY2P&QwEnF~JW|`F-
zcLCn;^wZ`;jofr{yZ)d?IAY+(gDJAn(bD(!!)kQ1MryX(r7w{=cV5LRVAXtom@)L!
z3iY}dka24&;g0Od1r+-M6yf*3)S>?hrDZp;+1?gwzyHO!_qWg9QlB5|II(%`aXRX`
zhD6#)@jA_9w;=J&XL@9GDvu43oivd*%}-?}Cl2c;jwYOp4f!f&HeB5**j9y+=5oBA
z=gie-w|;pZkM{9*bRC}~EMrNeSNZcem5C==lySt29#4^HWxye`V0&
zTk&?7d*H*}b>7j*b*kPOCc_;T!5dx#RVuti)}>_WZzMUDP!**buPiErhpbINkE+{^
zcJdm{(x=H2GX%w8d+VS{7@^o8_%Wt0f|cb;{iUhzE=>LC@Ran*R3>2Rq@R0Fc!O?W
zxrEd=@88MVw`K;v8}VB@WGf9r|3#
zU36m{9yFyQM~Yi+m5L(MTcgtHF1#niB;56#h9yrA_K(wd1b0f0e$KUoXa+adA<
zO9^<8I&6B{)DNmWkE7VsVGPILqD&Y#0Z6W9Kdee4Z(HLz?l?1wo1HwP(sv$Q8M#Ba
zpP-t?U>rhRTIHmPNoXTbda4{k!+Cq%ctd#gQR#~|R7vix-@G1v=jI1D3XdCPK#kDU
z*^9NtLAL7Xxx}T{A6zn&a2I}%9&DU0P(~-4uV>j5_NvOmBlP2DZ<@Z_kUc-M6{0r{r8Z!`RU?d`lGV5hc${O3^#+rhq#*{DA54=KK`pKw-!iz
z-`E$mSxV?aG{Rf3qTbHaOHC!#_}LVAv+7q$Y0OGoozB-@LQ_ZM*@C&gW2dgxO7lCdo4LpNl;?pV7hbQe#@+ZF_t
zxH#D2mIhjT7N5yG(Byx@qfzQXsZ=J$3!18T;TGHS$P^acQReT>a^a&o8$B4$ec1;AuEHPv7}MhfIZI2N&Hy3h$xdm%Ap+fodZ<%!KjweBg)Q
z9jG&wH3CAGt{?20`%{}28looU;x8SkSaP)8*K+IUgsPWJ5@Bl}$eeePAz#a}hm-{~
zXsnV~Y%R`ChU(A3w>&JGX2+#PCpZ6o@*Z!{R=EuHi@pDe%0T2tNQ57nr&FZY03c~Y
zv0k&8br*fVZ)F@a3|IY+Ii`oMducG
zxOHNl4g;BnI%D3n8hLIF&iD`Gtj2&on>t23zeb${X0lK@esa35F7U4fTO+bCb16%2
z<~YlsL=3SADSTItNQ(nW>v>hncf$3XNsT^Ar&5@
zU3W`1V-M7C9Pyh)cfKwTY2lQYHfphRZ`e%=uf{h{>K6PZ3#%9Ra3VrTqVyDwVd|3OmQHt|gZ5
z_f%%QZ?*YcIANrdgW@}g?1vy(B$fWdnb1YyHe#4@D+GPUCcwDwZ;t2QyzX)d{>7u~
zN+d}-Iqm13G_uaJ*Dc{5ge4Q3neLbM6|1EYDxIbs5Bfz`90nzt&$4sKco*KE0a
zAKp62_>53lxqkcWdGk3z-+K7Lr_%-?p2J$RLu{IL^bHO$?0n}SRjDwYvqs}CKWbR4
z|3g>GxwJuh#F~<`H}L^W^^L90)2yW1DSP|@C?yL|r82(>>xir|W*ssDsqKFFOx~XU
zta9czSsgVD9WGsSw<3p>ZVk#X(KP|8roO~uTg?~0iRbiop$(&Gx&@L;)M6NmFW0^!
zZGK+DY7=bGw&0YK&gl^E09@mRA43_x7JFnV#5)gNhj&?6lY(vQm>@RMXzP*Bv>t{?
zsdswb>aSlH6;fQSo_*TDa#ndBwbR3D|BX$nOKS6&S>r&Y@WH4wrO;P=R65L#Cqk9R
zOimHp0|g1u<;KO4`a;fKkqNK75Loup2D|(Uxw_8
zk$y^?Q~;{{rlDcNM8-2RiXKB18XBj2<4iMj9N`$*Mf9q#BH8{uXf|M-U(p|_>m+AWFGHMotYlNTts
zDrOqM5)wH-j4u
zUA(Smz3l=V{u8BveYo>r9}c9;HZE;Ix}n)|T{a^Qag=FJ;DzlIERsy%Q8-wh6Tyh3
z+bQl&2kwmzhGY8f8@KWp#a2d)#YbK8caqtVCp8c;9z3{_%`M7;E$wXaa4I8t?Wu?6j*2#kX
zl0J&uMPP1gu+m)8W@{aw4dX#NTa!2GUb|!4T4Scpz*H!&fVKj2J4HGSV+}Ct=dvQw
z7ET0Bj|gIAZmoEOZW&v6IoL}qFL%{97{wlT!3CvzB<{tNhZp{O`z_x0%3s#VIvbA*
z9qyCiB49E?qA+}-xkp}rC7%96zL6ppnz(aZyrioq_&5*dtxl09!6C%g29sTa#00hs
ztAZOl-esqIf>QK3sdL07ZR&$c=~ql|f(DqoP)TvwgvvZj@AE?#a-ZigQi*%L7vB*h
z>-^7rz1@#e1L@MgX9+@%y<@E`1mmVp)>#gy>+GW>b%jMBy)TBr3QhHA?-i#Ic~yAz
z8(N58Cz*crl$&^MFbCJ7%j;zRj)3=5t@u1)^X+dbt^GjI#r_Jqq#6uaNg>{@Ur?l4
z+V8sZ0Hr_-6LBTxnbzIJ)75HpDn$hAG{U>4IJmQ6s9Ma|Jm#)JupN9tA@?(n?LGMF
z3=SJXG*{^y>HkrFSTDCjX$7`JvBO#=gzT$^wp?d!>|3NmjTkg(w*Ruy
zCB$CDzUX!#i2W^|JHr_u_DH97TZtRAc1-T&STuh2Jd3b}x)x&VKVM0EoNUSW#(kQM
zlY|td0+9jVxBr6gi_h2B`PFW!3@wTO3vnzw}RcZjmwl1`tDBncWoJQs|8G2{VCb
z7#-z^x?HDlBw*~RCS602CV$k{%@TpOXPAUoN-W-&K=U9`CieekpRzT)fXVRsN6?rd
zZuain1+m}4@Gosbenfp_BH5Yiyh9TZqcjtb$gcR9^?(aJOaT$Y6=S{N?U1y8Yr2DP
zBu4qZF{X8om#@ekE5lW~c=BR7Z-~s4bds&aa8tZ&qy=!Qs*^d9Rl8}~vt4E`0R!%LhqJs_?po%)ULY>U
z|CeebUBLgbfInEkgBgW97oXQ)l28s&_PQ6)?+0V>l@(^bF4~BC*|7eKsVD?}XrO*{
zH(9&ohi>;3uG=p?ws}V{?Bpz
zxmeJ95tt}?>+F~GI`g;XLC<&GD^@Z2bwIGh(M1wkoF-d;WH-oJn3S=b_bRW$_|Q*7
zi1S9fCU}JmYS~#6kor*;7k~`)O-97CWEy15kf~Z(V>rj}gWslcMQVi*2y{^^lz4iN
z7KfkUU2$1uTQ8C&-xX@v?450boBi(JLoT@TI6N%cDYz{Ie&tc$PjH9Fj$#->R4pqv
zriYb$7X0AoD!rV5Ma4DQl{5uR6}-!U3#)_jrEXBQ$J0QBegEt8oVV{IVRDqZPk(7e
zs>Pr(PHqSLv60M8Oc3Jq5{*Tu%IH`vAZm%MhRo$v5^_6n(`uUv^Th|2-M(T(>snl;
zg{TONU=je*vwx5C#@Q6viCp^&WT%{3UKZ;eG)T`aNA$@1TqliC8~1LNXL3K0fI1?F
zKA2~6}I$faL`y<9-Xs20n^>&0HhmRzs&j@>9;)F&duQ$4FS)ob-
zy~F-_p$N>-c#W$2c`o1a5l66ZWA~6oAH>+HOy{nFOL=t2UJO69M4akI4{1c1EFgcr
zS=$lP>ZNUtDOvb2rrX+pP85pnpyw2c
z@We)OC)Q#Nn|;(qmSrG07pcR2ZVzNap%X8(r4TE|U(d@Ze*89E2}ODb*fa@;_RQC`hJFB%Mk%OC3la)+
z(K`JB-{*D6H8?WA_iMQQIS4=D(>j6m4XFq8
z!1~9R>-+v$pPmDx*aq)Qm+jQ;8^*IO3N76P$T|xwH#Qno^H4NS)X;Arz{J8?
zr(EaBV*_~Yc;||vZ{$d-ULivV;d-68I`9>P8;g3mAHOHU