From faa7aa7ea66bc7371ec3c47fe15c2fc8e9a609f1 Mon Sep 17 00:00:00 2001 From: lethanhdat <91755733+ldss13@users.noreply.github.com> Date: Wed, 1 Jan 2025 01:49:53 -0600 Subject: [PATCH] checkup data recieve fail --- .../client/network/handler/ClientHandler.java | 10 +- .../ui/component/CheckUpPage/CheckUpPage.java | 312 ++++++++++++------ .../ui/component/LoginPage/LoginPage.java | 2 +- .../BsK/client/ui/component/MainFrame.java | 1 + .../packet/req/GetCheckUpQueueRequest.java | 5 + .../packet/res/GetCheckUpQueueResponse.java | 11 + .../java/BsK/server/network/entity/User.java | 2 +- .../server/network/handler/ServerHandler.java | 78 +++-- src/main/resources/icon/add.png | Bin 0 -> 14292 bytes .../BsK/client/ui => resources}/icon/cont.png | Bin .../BsK/client/ui => resources}/icon/data.png | Bin src/main/resources/icon/delete.png | Bin 0 -> 8994 bytes src/main/resources/icon/edit.png | Bin 0 -> 11070 bytes .../BsK/client/ui => resources}/icon/exit.png | Bin .../client/ui => resources}/icon/expense.png | Bin .../client/ui => resources}/icon/income.png | Bin .../BsK/client/ui => resources}/icon/logo.jpg | Bin .../client/ui => resources}/icon/report.png | Bin src/main/resources/icon/save.png | Bin 0 -> 6805 bytes .../BsK/client/ui => resources}/icon/user.png | Bin 20 files changed, 291 insertions(+), 130 deletions(-) create mode 100644 src/main/java/BsK/common/packet/req/GetCheckUpQueueRequest.java create mode 100644 src/main/java/BsK/common/packet/res/GetCheckUpQueueResponse.java create mode 100644 src/main/resources/icon/add.png rename src/main/{java/BsK/client/ui => resources}/icon/cont.png (100%) rename src/main/{java/BsK/client/ui => resources}/icon/data.png (100%) create mode 100644 src/main/resources/icon/delete.png create mode 100644 src/main/resources/icon/edit.png rename src/main/{java/BsK/client/ui => resources}/icon/exit.png (100%) rename src/main/{java/BsK/client/ui => resources}/icon/expense.png (100%) rename src/main/{java/BsK/client/ui => resources}/icon/income.png (100%) rename src/main/{java/BsK/client/ui => resources}/icon/logo.jpg (100%) rename src/main/{java/BsK/client/ui => resources}/icon/report.png (100%) create mode 100644 src/main/resources/icon/save.png rename src/main/{java/BsK/client/ui => resources}/icon/user.png (100%) diff --git a/src/main/java/BsK/client/network/handler/ClientHandler.java b/src/main/java/BsK/client/network/handler/ClientHandler.java index 55f804f..8ce280b 100644 --- a/src/main/java/BsK/client/network/handler/ClientHandler.java +++ b/src/main/java/BsK/client/network/handler/ClientHandler.java @@ -54,14 +54,8 @@ public class ClientHandler extends SimpleChannelInboundHandler { - try { - UIHandler.INSTANCE.showUI(); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); - Thread.start(); + + UIHandler.INSTANCE.showUI(); // When the handshake is complete, the UI is shown return; // No further processing needed for handshake response } diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java index 63bc761..0f320de 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -1,17 +1,49 @@ package BsK.client.ui.component.CheckUpPage; import BsK.client.LocalStorage; +import BsK.client.network.handler.ClientHandler; import BsK.client.ui.component.MainFrame; -import BsK.client.ui.component.common.RoundedButtonUI; import BsK.client.ui.component.common.RoundedPanel; +import BsK.common.packet.req.GetCheckUpQueueRequest; +import BsK.common.packet.res.ErrorResponse; +import BsK.common.packet.res.GetCheckUpQueueResponse; +import BsK.common.packet.res.LoginSuccessResponse; +import BsK.common.util.network.NetworkUtil; +import lombok.extern.slf4j.Slf4j; import javax.swing.*; import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.table.DefaultTableModel; +import static BsK.client.network.handler.ClientHandler.frame; + +@Slf4j public class CheckUpPage extends JPanel { - private boolean debugMode = false; // Enable debug mode + + // update checkup queue + private String[][] queue; + + public void updateQueue() { + + ClientHandler.addResponseListener(GetCheckUpQueueResponse.class, response -> { + log.info("Received update queue: {}", frame.text()); + }); + + ClientHandler.addResponseListener(ErrorResponse.class, response -> { + log.error("Error response: {}", response.getError()); + }); + + NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetCheckUpQueueRequest()); + + + } public CheckUpPage(MainFrame mainFrame) { + + updateQueue(); + setLayout(new BorderLayout()); // Sidebar panel @@ -27,10 +59,6 @@ public class CheckUpPage extends JPanel { GradientPaint gp = new GradientPaint(0, 0, color1, 0, height, color2); g2d.setPaint(gp); g2d.fillRect(0, 0, width, height); - - if (debugMode) { - drawBoundingBox(g2d, this); - } } }; sidebar.setBackground(new Color(63, 81, 181)); @@ -80,15 +108,7 @@ public class CheckUpPage extends JPanel { sidebarScrollPane.setOpaque(false); // Topbar panel - JPanel topbar = new JPanel() { - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - if (debugMode) { - drawBoundingBox((Graphics2D) g, this); - } - } - }; + JPanel topbar = new JPanel(); topbar.setLayout(new BorderLayout()); topbar.setBackground(Color.WHITE); topbar.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); @@ -101,39 +121,11 @@ public class CheckUpPage extends JPanel { userInfo.setHorizontalAlignment(SwingConstants.RIGHT); topbar.add(userInfo, BorderLayout.EAST); - // Main content panel - JPanel mainContent = new JPanel() { - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - if (debugMode) { - drawBoundingBox((Graphics2D) g, this); - } - } - }; - mainContent.setLayout(new BorderLayout()); - mainContent.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // Data table inside a RoundedPanel - RoundedPanel dataTable1 = new RoundedPanel(20, Color.WHITE, false) { - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - if (debugMode) { - drawBoundingBox((Graphics2D) g, this); - } - } - }; + RoundedPanel leftPanel = new RoundedPanel(20, Color.WHITE, false); - RoundedPanel dataTable2 = new RoundedPanel(20, Color.WHITE, false) { - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - if (debugMode) { - drawBoundingBox((Graphics2D) g, this); - } - } - }; + RoundedPanel rightPanel = new RoundedPanel(20, Color.WHITE, false); JLabel titleText1 = new JLabel(); titleText1.setText("Check Up Queue 1"); @@ -142,78 +134,200 @@ public class CheckUpPage extends JPanel { titleText1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Padding JLabel titleText2 = new JLabel(); - titleText2.setText("Check Up Queue 2"); + titleText2.setText("Patient Info"); titleText2.setFont(new Font("Arial", Font.BOLD, 16)); titleText2.setBackground(Color.WHITE); titleText2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Padding - dataTable1.setLayout(new BorderLayout()); - dataTable1.add(titleText1, BorderLayout.NORTH); - dataTable1.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); // Adjust padding for better appearance + leftPanel.setLayout(new BorderLayout()); + leftPanel.add(titleText1, BorderLayout.NORTH); + leftPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); // Adjust padding for better appearance - dataTable2.setLayout(new BorderLayout()); - dataTable2.add(titleText2, BorderLayout.NORTH); - dataTable2.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); // Adjust padding for better appearance + rightPanel.setLayout(new BorderLayout()); + rightPanel.add(titleText2, BorderLayout.NORTH); + rightPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 10)); - String[] columns = {"Name", "Gender", "Course"}; + String[] columns = {"Name", "Gender", "Age"}; String[][] data = { - {"John", "Male", "Java"}, - {"Dara", "Male", "C++"}, - {"Bora", "Male", "C#"}, + {"John", "Male", "20"}, + {"Dara", "Male", "20"}, + {"Bora", "Male", "21"}, }; - JTable table1 = new JTable(data, columns); - JScrollPane tableScroll1 = new JScrollPane(table1); - tableScroll1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding - dataTable1.add(tableScroll1, BorderLayout.CENTER); - JTable table2 = new JTable(data, columns); - JScrollPane tableScroll2 = new JScrollPane(table2); - tableScroll2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding - dataTable2.add(tableScroll2, BorderLayout.CENTER); - - UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); // Remove border - JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, dataTable1, dataTable2); - splitPane.setResizeWeight(0.5); // Split - - // Add the split pane to the main content - mainContent.add(splitPane, BorderLayout.CENTER); - // Notice board - JPanel noticeBoard = new RoundedPanel(20, Color.WHITE, false) { + DefaultTableModel model = new DefaultTableModel(data, columns) { @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - if (debugMode) { - drawBoundingBox((Graphics2D) g, this); - } + public boolean isCellEditable(int row, int column) { + return false; // All cells are non-editable } }; - noticeBoard.setLayout(new BorderLayout()); - noticeBoard.setBorder(BorderFactory.createTitledBorder("Notice Board")); - noticeBoard.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + JTable table1 = new JTable(model); - JTextArea noticeText = new JTextArea("04/10/2021\nHidemode Now\n\n03/10/2021\nFurther Reading\n"); - noticeText.setEditable(false); - noticeBoard.add(new JScrollPane(noticeText), BorderLayout.CENTER); + // Set preferred size for the table + table1.setPreferredScrollableViewportSize(new Dimension(400, 200)); + + // Customize the font for the table header and cells + table1.getTableHeader().setFont(new Font("Arial", Font.BOLD, 14)); + table1.setFont(new Font("Arial", Font.PLAIN, 12)); + table1.setRowHeight(25); + + JScrollPane tableScroll1 = new JScrollPane(table1); + tableScroll1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Inner padding + leftPanel.add(tableScroll1, BorderLayout.CENTER); + + RoundedPanel inputPanel = new RoundedPanel(20, Color.WHITE, false); + inputPanel.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); // Add some padding between components + + // Username label and text field + gbc.gridx = 0; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.WEST; + inputPanel.add(new JLabel("Username:"), gbc); + + gbc.gridx = 1; + JTextField usernameField = new JTextField(10); + inputPanel.add(usernameField, gbc); + + // Sex label and option field + gbc.gridx = 0; + gbc.gridy = 1; + inputPanel.add(new JLabel("Sex:"), gbc); + + gbc.gridx = 1; + String[] sexOptions = {"Male", "Female"}; + JComboBox sexComboBox = new JComboBox<>(sexOptions); + inputPanel.add(sexComboBox, gbc); + + // Age label and number field + gbc.gridx = 0; + gbc.gridy = 2; + inputPanel.add(new JLabel("Age:"), gbc); + + gbc.gridx = 1; + JSpinner ageSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 120, 1)); + inputPanel.add(ageSpinner, gbc); + + + table1.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + int selectedRow = table1.getSelectedRow(); + if (selectedRow != -1) { + // Get the data from the selected row + String name = (String) table1.getValueAt(selectedRow, 0); + String gender = (String) table1.getValueAt(selectedRow, 1); + String age = (String) table1.getValueAt(selectedRow, 2); + + // Transfer the data to the inputPanel fields + usernameField.setText(name); + sexComboBox.setSelectedItem(gender); + ageSpinner.setValue(Integer.parseInt(age)); + } + } + }); + + JPanel iconPanel = new JPanel(); + iconPanel.setLayout(new GridLayout(1, 5)); + iconPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Padding + iconPanel.setBackground(Color.WHITE); + String[] iconName = {"add", "edit", "save", "delete"}; + for (String name : iconName) { + ImageIcon originalIcon = new ImageIcon("src/main/resources/icon/" + name + ".png"); + Image scaledImage = originalIcon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH); // Resize to 32x32 + ImageIcon scaledIcon = new ImageIcon(scaledImage); + JLabel iconLabel = new JLabel(scaledIcon); + iconLabel.setHorizontalAlignment(SwingConstants.CENTER); + iconLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + iconLabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + switch (name) { + case "add": + // Add action + JOptionPane.showMessageDialog(null, "Add action triggered"); + break; + case "edit": + // Edit action + JOptionPane.showMessageDialog(null, "Edit action triggered"); + break; + case "save": { + //Warning message + int option = JOptionPane.showOptionDialog(null, "Do you want to save changes?", + "Save Changes", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, + null, null, null); + if (option == JOptionPane.NO_OPTION) { + return; + } + int selectedRow = table1.getSelectedRow(); + + if (selectedRow != -1) { + // Get the data from the input fields + String name = usernameField.getText(); + String gender = (String) sexComboBox.getSelectedItem(); + int age = (Integer) ageSpinner.getValue(); + + // Update the data in the selected row + table1.setValueAt(name, selectedRow, 0); + table1.setValueAt(gender, selectedRow, 1); + table1.setValueAt(String.valueOf(age), selectedRow, 2); + } else + JOptionPane.showMessageDialog(null, "Please select a row to save changes"); + break; + } + case "delete": + // Delete action + JOptionPane.showMessageDialog(null, "Delete action triggered"); + break; + default: + throw new IllegalStateException("Unexpected value: " + name); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + iconLabel.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2)); + } + + @Override + public void mouseExited(MouseEvent e) { + iconLabel.setBorder(null); + } + }); + iconPanel.add(iconLabel); + } + + rightPanel.add(inputPanel, BorderLayout.CENTER); + rightPanel.add(iconPanel, BorderLayout.SOUTH); + + UIManager.getDefaults().put("SplitPane.border", BorderFactory.createEmptyBorder()); // Remove border + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel); + splitPane.setResizeWeight(0.5); // Split + splitPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Remove border - //mainContent.add(noticeBoard, BorderLayout.EAST); - // Adding panels to the frame add(sidebarScrollPane, BorderLayout.WEST); add(topbar, BorderLayout.NORTH); - add(mainContent, BorderLayout.CENTER); + add(splitPane , BorderLayout.CENTER); } - private void drawBoundingBox(Graphics2D g2d, JComponent component) { - g2d.setColor(Color.RED); - g2d.setStroke(new BasicStroke(2)); - g2d.drawRect(0, 0, component.getWidth() - 1, component.getHeight() - 1); - } - public static void main(String[] args) { -// JFrame frame = new JFrame("Dashboard"); -// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// frame.setSize(800, 600); -// frame.add(new CheckUpPage(); -// frame.setVisible(true); - } + +// @Override +// public void removeNotify() { +// super.removeNotify(); +// // Remove listeners to avoid memory leaks +// ClientHandler.removeResponseListener(GetCheckUpQueueResponse.class, this::handleGetCheckUpQueueResponse); +// ClientHandler.removeResponseListener(ErrorResponse.class, this::handleErrorResponse); +// } +// +// private void handleGetCheckUpQueueResponse(GetCheckUpQueueResponse response) { +// log.debug("Received checkup queue: {}", frame.text()); +// } +// +// private void handleErrorResponse(ErrorResponse response) { +// log.error("Error response: {}", response.getError()); +// } + + } \ No newline at end of file diff --git a/src/main/java/BsK/client/ui/component/LoginPage/LoginPage.java b/src/main/java/BsK/client/ui/component/LoginPage/LoginPage.java index 2f45cb4..beec353 100644 --- a/src/main/java/BsK/client/ui/component/LoginPage/LoginPage.java +++ b/src/main/java/BsK/client/ui/component/LoginPage/LoginPage.java @@ -78,7 +78,7 @@ public class LoginPage extends JPanel { NetworkUtil.sendPacket(ClientHandler.ctx.channel(), loginRequest); }); - // Register listeners for login-related responses + ClientHandler.addResponseListener(LoginSuccessResponse.class, response -> { log.info("Login successful, UserId: {}, Role: {}", response.getUserId(), response.getRole()); LocalStorage.username = loginField.getText(); diff --git a/src/main/java/BsK/client/ui/component/MainFrame.java b/src/main/java/BsK/client/ui/component/MainFrame.java index f9f5e39..c2a98b1 100644 --- a/src/main/java/BsK/client/ui/component/MainFrame.java +++ b/src/main/java/BsK/client/ui/component/MainFrame.java @@ -24,6 +24,7 @@ public class MainFrame extends JFrame { // Add pages to the main panel mainPanel.add(new LandingPage(this), "LandingPage"); + // mainPanel.add(new CheckUpPage(this), "CheckUpPage"); add(mainPanel); } diff --git a/src/main/java/BsK/common/packet/req/GetCheckUpQueueRequest.java b/src/main/java/BsK/common/packet/req/GetCheckUpQueueRequest.java new file mode 100644 index 0000000..38d365b --- /dev/null +++ b/src/main/java/BsK/common/packet/req/GetCheckUpQueueRequest.java @@ -0,0 +1,5 @@ +package BsK.common.packet.req; + +import BsK.common.packet.Packet; + +public class GetCheckUpQueueRequest implements Packet {} diff --git a/src/main/java/BsK/common/packet/res/GetCheckUpQueueResponse.java b/src/main/java/BsK/common/packet/res/GetCheckUpQueueResponse.java new file mode 100644 index 0000000..344e869 --- /dev/null +++ b/src/main/java/BsK/common/packet/res/GetCheckUpQueueResponse.java @@ -0,0 +1,11 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class GetCheckUpQueueResponse implements Packet { + private String[][] queue; +} \ No newline at end of file diff --git a/src/main/java/BsK/server/network/entity/User.java b/src/main/java/BsK/server/network/entity/User.java index 917d480..fe4f5f4 100644 --- a/src/main/java/BsK/server/network/entity/User.java +++ b/src/main/java/BsK/server/network/entity/User.java @@ -33,7 +33,7 @@ public class User { } else { while(rs.next()) { - log.info(rs.getString("name") + " logged in"); + log.info(rs.getString("user_name") + " logged in"); role = Role.valueOf(rs.getString("role_name")); userId = rs.getInt("user_id"); } diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index 25f10e7..0275945 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -2,17 +2,12 @@ package BsK.server.network.handler; import BsK.common.packet.Packet; import BsK.common.packet.PacketSerializer; -import BsK.common.packet.req.GetPatientInfoReq; +import BsK.common.packet.req.GetCheckUpQueueRequest; import BsK.common.packet.req.LoginRequest; import BsK.common.packet.req.RegisterRequest; -import BsK.common.packet.res.ErrorResponse; +import BsK.common.packet.res.*; import BsK.common.packet.res.ErrorResponse.Error; -import BsK.common.packet.res.GetPatientInfoRes; -import BsK.common.packet.res.HandshakeCompleteResponse; -import BsK.common.packet.res.LoginSuccessResponse; import BsK.common.util.network.NetworkUtil; -import BsK.server.database.entity.Patient; -import BsK.server.database.entity.Patient.Sex; import BsK.server.network.manager.SessionManager; import BsK.server.network.util.UserUtil; import io.netty.channel.ChannelHandlerContext; @@ -22,9 +17,14 @@ import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler.Han import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import java.io.IOException; -import java.util.Date; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + import lombok.extern.slf4j.Slf4j; +import static BsK.server.Server.statement; + @Slf4j public class ServerHandler extends SimpleChannelInboundHandler { @@ -54,28 +54,64 @@ public class ServerHandler extends SimpleChannelInboundHandler { - var patientInfo = - new Patient(getPatientInfoReq.getPatientId(), new Date(1999, 01, 01), "test", - Sex.MALE); - var response = new GetPatientInfoRes(patientInfo); - UserUtil.sendPacket(user.getUserId(), response); + if (!rs.isBeforeFirst()) { + System.out.println("No data found in the checkup table."); + } else { + ArrayList resultList = new ArrayList<>(); + while (rs.next()) { + String checkupDate = rs.getString("checkup_date"); + String customerLastName = rs.getString("customer_last_name"); + String customerFirstName = rs.getString("customer_first_name"); + String doctorFirstName = rs.getString("doctor_first_name"); + String doctorLastName = rs.getString("doctor_last_name"); + String symptoms = rs.getString("symptoms"); + String diagnosis = rs.getString("diagnosis"); + String notes = rs.getString("notes"); + String status = rs.getString("status"); + + + String result = String.join(", ", + checkupDate, customerLastName, customerFirstName, + doctorFirstName, doctorLastName, symptoms, + diagnosis, notes, status + ); + + resultList.add(result); + } + + String[] resultString = resultList.toArray(new String[0]); + String[][] resultArray = new String[resultString.length][]; + for (int i = 0; i < resultString.length; i++) { + resultArray[i] = resultString[i].split(", "); + } + + UserUtil.sendPacket(user.getSessionId(), new GetCheckUpQueueResponse(resultArray)); + + } + } catch (SQLException e) { + throw new RuntimeException(e); } - case null, default -> log.warn("Received unknown packet: {}", packet); } } } diff --git a/src/main/resources/icon/add.png b/src/main/resources/icon/add.png new file mode 100644 index 0000000000000000000000000000000000000000..3697b352f6ec42cf8069d0358abf59ef407f8f64 GIT binary patch literal 14292 zcmbVzhhI}m(CA4*kuJUW08$i?DjlUHbVC&s5UwCiKtqw5=vC<@pdv^SLJ3HdjtEgH zR|J$$rAUN}bO?eFsqf@|@4Y|Z;|ITxGrP01v$NArqMeO78?z8I003-Agb4}&py0ny z;0y!!u^Tyh0DjQjyNq-=1OCLE`6~hZ&J=>Ub`Jp9yJ>%rr;6;t;6p*QsSDaZ*asbP z^X@GmA|m2~-<^Pa-Zw*TT?oGGo42Va1OO5M(!|&y^5w>CM8_@1`;_gu{9c~N5d6d| zCRRszk~{tT1p1zfnmi>}t%@1EtyIcfyiyWndv9Bv<>GY%czJl~99VB~;`vt)!alb@ z5*wqJj=g6;v8pT<+#CP?#Xb78v+&E#3#QtwOJ80$?CE^D7QNAAgo7jh_rLgO0!cPT zs5wnw+{4sL==h#g-31l;oTHS}_^LOok?7LXLwQe06>%44J*bl4@toepgQb2+f&?Fc z+6jaXh@=K#2hC5X%ZNV2-V)UdvhN&)AU^>P2nWECc5>`azC*SlvwPmLi^CPXhZ{TV?V}8%0s%9>e4aj?r-9g$}5@Wp}cnD77KQJIFd1`qYl9caPPn8gVmxRJ7 z0b~pEr+@Hx%{M^CugM4H@xxoNb=H)0t4f*2*tafM&nhXi-+|9YWsEYi0ECD&2qTmc z!U#Krja*S%E$hR4##&;Mv7a$=m(_60UJ!}uSw6h-!4*W;`o3IsopS>#Obf=J$^3u? z$-*I1{eT{`8yF2$mWo{wXAR`dOJfM(CrGsNP%o{FW8q2w9OFk!#yUflVa;jQ=DbmW zHitHg_H(qb@hY4J2piiYUd1aP^W&V>tK6R9#?QW_e`y;v<$3M487fr?80A&NJkN;x zA&zXXRjyvYLlz+iqKwH8E;r@UW2OQXLbNHGWJjV-{Yr%d3(}OhLKMVrWRyD919sC^ zkTk#tRx2|*_ncvyhhmRXrQGl|4%9)3@d5r1KjBx7zYzlvjAVqPOPc_debcVu!8M@5 zVF9`SYwmLH_kBx`uxK8t0fmk1+p74A*&9+s3N&snKYfB9`GuFIic+k}miV5(ad_6= ztj)DTGoAFf7dO?_A0rQ02N+}}G;-7c|2NebZ;T;BGt-di>R2ps0((lgnPP2<%MF&I zFpz31IOpSs1$&F?d8m>h>ILlb$S)T~wF?>}qIWSt0**Z!L?(PH0dMymYS%c3-OuPe zn&22Rt^B+|bjE(k;5%!9@?B?p300Ckaei^rq(_PrR;P;_^}2!|JM!f;qzIXf%uA6V zjza?${;5nvU4(DFImesF!@I4x#Gwhk2Jgk1S$45j zD()=!Y(WSmDS=E4rwgIqepq(1@%#lD-f`UMIdkASw;@8vYV`1T3Fg(VwKD&Hg;ACm$jUqa5}2V-oY z;Yl_osPi>)gACXC@)PD;&(uw80ycDUX&xu2=j#mDFSnnRGcFZN3<2ngKyq^HWtY|V zL(D$Z*G#TB>KcIl!bg0LbvBWcB3$i+95GQ4XsOC4^hPZr*6kBrSJ6^9p%pQb%>#bA zrB_0&3`N3a8R5TlVO>Wu)!)a7Ul0pDc=B}zRbOB#*n>3seP}rGTwW=$*>2L6zXsn%u1FwJ%cYP2+(7kjNJX=_$ZyP zrLPv#0&OvoEB1E*8Yi^L${5>>@ICuW1<*}kQzZ52X&gVr&dSyM4O89uI#HD!!Fo|b zh25nBiF|pA2e`f=3nqLjw~>+h>izxOgJN_wf~jj5VWh_|4u+o&O@oL>#2TVlNxht( zlkwnheUj|uonr2*27JKA4g=W`Inw0+_z^zUxdu`rni_z)l!??B@WFd|Dm(Eoy!{co zEZg?H(TL&;uEW8C*>ic)7_y{4oS1Nk%zJ%Z?_lXE5%)EvzmdI;BjjudWw~(EjWgiy z##>Z5v(p;z0ylnqMvTC~in&)RrjZ_d{HZ7RVFm3@PtPNIh>|7o1{{SxNgA)g~{6BNEg;jiT? zFDP9b+YY9-);qN2BdY!>QKoA4UMDSNnM1gH53m(y77%L;1{``uF&+Wl*G*hYBni-3 z`1$t4&acxvI~2>VfZm2;fe;^w-~kA`@S(Y+pVCRv?xgiD{rAU_+3M$GwC~)Q4&%l? zhk3|sMDfpRO`lE1%!wbGOZbJ!0;k4Drn8S*A2f!Lq7Pi3uHaMe3`uv^HcJ|$v-p&D zS~JF39X+~!R}cCUF?GjDsOlQA9JzM6_%P&Cs8GSF#P2{$vckMF8Rh+__IR=U8}c}Z zbwGBIIg+KOt5qOf@_BEd_{=E2FcM0YT0t_&x6ER)kiNPm`@c!^3?xZA+&H-ue{ZTp zc@j5oO!mg#_<^qsy1W|9!8x~Ynbd~g$djr55Q@LCRIEITn)e~q1l#N=e$c_2KGfoh zKcCHIo7sHlnY#ZOs?s*UuYBkQzp`%LUjGN7cu_`WsgtR5l8>?bzsE?Z&#Vv+iIZX_ z$syR@R_%*YR}t2u6ly@}-&AyAkW$l!ND>2lnBQw;L5f6pf|6&4#2FtojqKK)v6Hig zc3K|MPyXAQ)96;{P$`Y^;EX@7ajDa!Jyj~~g9BM)Ub&;J_ZI%$pVDS+Xe*8yP(|1d z(@VZ0sv=s>;LP6w)UI~nvY>U*1QLf5An#Ej+J$`gB2)tO0AP7&TbHL;(BT@u`|J zL+_^_C`?8X7rQ+W)(JBBo%iKzqs6GVgAzC7K6ZOFSSP4$uK>KanOEGMcIij|rn1$| zc@D~l^-D(f5`SsuH~Qr|{EZ~0Cv=4rFCa;)apD`9QCct1$4XKsu4!qtoLHDJym0SBI>W0NU~G*#Y2&8elrIp=!po&ZpNw#6V<%^ z7*C95xMM1x#c?*?*rX?wxWgEH8L6+6vRR;5#}oORY<-UHCog_TAlBHVTb_Eoi^q?F zVm;sYAi)J#H;m-AIR3^M`GCsuYBT3y-){@+yGj)8ZSO0yq2hJckN2{o-iT6wZGNNK zP)OZ3@}Qi2Lp~-TL0oz@EdcSh#-b_5SWCH)JJepB@JTjHb1+d%aW$tPVyiP_9+mxl(b0>>qenuHo`kme`FyZ z@VM&)#R4h)S2DNiSttVAqHoh8p<0s}Q_DAqT=RW7I`bDi7xV_pF66P#7{xrPk=|t7 z`#che6I$M19!h_)gM4xh87m0wyb@zxBVEJj>p0Fclv29nL!A}U(IrqK~=3-&EXj6AN5(q zY+&wpN6aXA(^2!Tv&j+=+}NxH@$|~HHRM_wUL%+Fx^c{t>Vwax$8ADZsBHtYqgIEo zm)La8fb&zGBXeBj>Tj-=C^z)Y!I39#nx45XZFEO`Rq*Ddv|c%u%Z?sm_wcG)^+dT}>Rk`n_+0 z`2O8K6q){#FmmvX;Ks{?Q^b%N4&NkDoWE3d{b658%XmcMmS@{S*PG@HcK5N~#*{X%VMU|O$o#PIAK_U_|oCrkhKW_>Yg zd&gjj&bpE7py2HNyFG$<-(VT=+QFR98v6W9dW$7ob3;5mglvn-InU6&e%^8)PPjM? z<=`|7|C!YF3B*VG(H)U^}G0)w?}%YAvboF~5Yp!1o4F5nRjt>=6dy^?6;3G;MK#LfSgvBUs@? zar=ASyscL}y<@RdcAWGky=MQ6CXVNp^3;yQc>RlMGr<8UANSlPhEz`SE$}O@xan3_ z5hI20y7$r(YFehWLEhV&a028pMx5KQ_h&-aml;hVqGH0<*-P^Zp7{eo(n#xi`i)6( zvV4qE9p__=Vj>9A85N`9%KdqJzHeG&dvS)Xa;q_(Y>uC8+55w zVgXZ?xOL`X@3+=3UHHu$v#EK#sC7~G&S!6Ls)zTTor5r>GGeXoYNfz6W;$t_gKX?2 zUuU`bm|*#-OGggS0(4E~E*5D)%FX0njSHJc@kJYwFipIE3rYysw=2YayvHqmNW^Gi zvCgtMhQnM=wa6a1(CWWyGhfwZyukR)&D8bg8Eqb_!n>`E`?`K1dlCwce#{{(+uqv} zs;uiT-rj7C%0hJ66&q5G=T%9yD)KF%cn|m`_8uWf9G!^ET9?s{yXOdnrs~#5@^Peu%jW;qhGZWUOYV{|*OlzFCJD&Kk+wzxIqRu*Z z_x{Sw^@;v9<;1OthuzP?hwRcP4@KcIKRqtJ%V=b|hVF7_m`Q(oO`-4;KK5MkVOUo^ zFnKPz3O$paaO!!OYD&Df17h;$8l2W!%(gh~Sfr|Kyp7YCLTWjt5tCJgWN;-_q_I zoO>^?sxZ>_M0TZM5b3mL5c_aRe7@ZdzT>5OTjq3+_?DS ze-D@9h4V44OGV3cy~`QPbfXF^*!UzHFChMGzER>Hyz}mw)^)aOh3klzIWfzl8;)#6 zLkfR*Ce4wyTk1AhzJNvS-(G@ups)M``SXba8)rdezLI{%k%>MTHaepM)(|mC5Qm%| zn}y?j9Q8#1nfBXC2D@@={LJ|W!fgU|1T`QSI-YJ*%<&nMZVuiPg+=(MPs2i_0L#{_y#oH}cbj zrlr|<-Lh5$WMRRnHpRB5T=^Jy7*U1NvkX6QSl!rg?RZ4>%Z;0#R}i}5n%Dy1dCTm7 zW_d{y_jnu4J#sZ+Ay#N;>_H$JiW`;O!77`}4L^}2+24tJ%!V=TcE0_tHz>P7$8GU0 zgHcrbdHEgP5>?wI4L=5QQ})iwo&J*-Xj==MLt!-5z9eh;V*#;d7-`hNjL|Za`}*Vw zw$@Zm5-IvykW{-$8c4GNa_xaYIuX8n6Y)+ur39PHIGt5ja``ZF_s8HclhHk9%mjqH zIBR*B3k8utChgP?Gwt5w_uOBG=c0gY?c;d9ka#o~ZZy;v7C|GFvh_}u2grjcr+~*G zXDTOw^!giZX5{xF7^eOTh}2)yH;dp1aR;Zs0h_Xp^7?RKFU_imiQb5+ju5w455$c+ zm7bhqIX+3g05k*a%tNo7KN6jbvohfNgWy^2O74adm!afaZ2!D+UdpJnMxyS;h(}83 zB#LbS>mt8@4tsPev&5aowNhW=NhY3ki$hW$$ z3k!b(XrFO0q#Pe^vym8#aQL5X^sP!Dws&W9gtmJ#>5URcPG!XOB#}4nx}u@_xmI7D zsC>PMexg@g2nqL%W;ZU8CLv(R&&zR{2!{K{IUi$aIw2RlVT z>U3|-p2mx`s)Ia2c?>1m6qz$#UD&@nOK(&?X3enl*;hO*auSQ zQ|g$G!}C6aESbp-mrQlaod?EWH>OD=qjV-9ug&u5iG0KXp}AnY2`DHel1QO{Y|jNa z6P@^gCWG%8*bxw8=M$`lsoe0x4Wwa?qO&i=ZfduS9s_T>;TR}qjV*n6<$?980XE!~HgX($Y4=51n`bVOZV-#h@)4 zU5LP`hszujr{Aq=Rg?hdR<;f6fDC-If?v!W>tsd$e-Hf*;>9S_G!c3V@)|3);kuYS z0UmoJK=JQ)g-aoY-sWM;!JGH~j$>ylJ#pj)H>gJl7e5kHL22-GdaCRm22m+UI)%Kr z!B2yrWRAZoMlpC=dfx5X${ZP^ovcDw5Gb>g_5J*{?Lf}8?X@L!)|s>5?!eK!fE&cV zGHSb$1+$?Lcl`1WeL)JiM+XA#4kV@I!`4+646ns14-S8#cV-~brkL^RECYp)$Sh;c z0{WoNq{v{1-9wxXh$~)Zkh*C%#uClq`6#cLI|DvejK6|yCagZHQUYXgVlbum7s;En ztv0o)fm;o{F~;J24G6q4b*6%jW1btpjq*mA$bEe%PBN&i;4Z108#konl#vcp_+8rqU5;6sZ}TRDgA;u1{)IQ*@e4g{jYrY#Z)spDALer`>O z>tbH~4JH3rh6|BZNwGikFjbgB$b|jSd_%LM-_I7j_$V-Av$|}Z&e^Z?rZwm>W)3za zp`Ro;E6!Td-wLDB-Kx&?uX=uVPP|vhqq>Z#vH?Ri6SmZIb%fonPLm3HFEY!>TC(ZF zdZfjB=T~vlR2DT(WnBAh5<`W*f0&R;Q}M)5&>b{Xw2?Q2odWaRCtt^(;l@S)T2S#1 z)7LqFnu421t%@A3)R{fteRl^uDY_tv1*!JrxtW}l22q`?Mr_Oe{jY;?w)$SMT~D$r zkUhp^v2RR1%pNnu>xi&lXIK}>M?6u2&sJVAmhtv+q&JcovoP(Tw@c^7#PKvT9lo$%L^mcFIDAo5@{++gKde9V=uGO4HEx}2*NfH%$xyb7gIrC|p$k7xd}3I2l!5TmD)$bOCh zK1xo*D*Lj0$yfUC$2W`{mr|KuRpN=2!0bs5cdR~J&5;Quf_p;DJ z(84ZSOuf-L+^?iJisCW(b1Y+XZ23@!Yf?)mk331XPD z9U#vd%Z=*oz|Hq)&$q~rjl_7^W-5*S}G4dz$6?5Nyh3h?CZ{XzvZaHFPTD5c_ zghxMbLhK&ldgFZo1v?bux%V2N`Z$la2bsOdYD8}V9?U8r)B5nu(Bw0VkWlckBZ-6P z_@ji*#1kMIf z3*fNfL}qiKuvU$toS|C@HpS8wLZ|0xY@>In+`(#jb4pYXS`$BG{|qOhP2}l`Ud*m^ zE+~kd1>?Ed2<*fUqHOihEutjxAqYpvFT~5VTs;r;uK+|k9$E_ZF@{N-^~-R@ z2)h3pV-ap^w2~QvJ(=+4yfyb=3s)t)rzG0IAm>VH8W z!cY`v3yEh~XMbsPt=!z=k{%F~fMz>7r~SM}!Ee3L9@LtSfYGJ>`ZA~*XkIGvkhW*m z&%`jd%4mubP{|l^SRXJAIkmd>wyb&ZCn#Yc0V7O~9m^G$h(o-caW-n$D$ud4)5UfP zr7l4kfoRw?EYEHzw!LzL8}!@tv1@vKSyMm6P&cDxLR4>U;HJXWO1PJeL+Op=)c{Y( zS9nWGul#VL`oLKguKaF+8`iFa7c{8a~2O7t{1REoqL-IQ?1bAQV_%39O-U!J8*-xQ8Z41rT zSa1u3g!uN<7G}{LnK^c1<1#!d#LZE8ot4O(2NR}wLY1I;*yH;lMVxA7H^NO-<3mr_ zJzFdPGuJRZ)OPg04yaq_kgKzsAa}^m6g)asp#V8o=)3fDoWd0(YRlr_RYdGlm@j;#yQ=#N3+Mrns61*Weg?j$qFvn$_hb zmnqB@r9sI$Bttw8qv@GnJ&yr^-;~x1Kx2A0mbP{{neg8zPYCawzwEFNOF%n+OUvZi z!r_=>m+_7L%NFfypytQ~^IA4US+U1biz>;ZH{r-d-JD$>Bl!!}3)ZVMoGbG}a{+b>7-^atd~2IT^J#C2275v3qLh=t zL&@&R1UCX|lFvHdD~6!tiwb%Ztx$8+cy=ayvP8!_r(I?_7nwS1e4k$W- z7Cn2KDkw@fK#QkFpYua$k=T1t;?`C3z3#1`Qx=Um+4OTjoEW9x;pCafP@3=-bV!0u zl|J2!-IA~w511;7pzqj{uvkOjM#E}Bi8o)$7#bv4n?QgSaaY^~l%`POsh`|wf#L4* zdi$J8B~WoJu2aND@dJa&HY*V)i0(1lFKEb6ms(??p; zmT)|HxJ-9&He6S)9XJ;x3J^nS*Sz4?6_QdA(hRdx{2c^PZnqcq1LW zIbcwqegXE=_4vw@TRMY$)^|SHvb27xxa&rvPnbt+VVwo3f(yQ00DP1TPPsT^O21%T@3L9AMOx4fW)t z9D}hc#mqC0HnGH=eq9KR%7s+dX0xGyP>3O(gB!d5Khe7{D9AVELwwL&)@qzNj7o}1 zVlW?vuVSSB#|c|&-l@q7{xH8=hg@?Lhl#y`*g3o)Mkf0jZ?*XgVLJrs(}|uA)t;N+V?MD$Grmd_jZja)kh^HEScOp4B=}RG*#37LQx#h+WxN33A*s*jk{gSa2HA># zc4*%}O=Tp@lING5Piy#;ZMa+Xh84!g4dZCm*8~rT&xinsMI$3+iiU3ATu#LdWMz?)4))^K@s+lQshgV8)_Eq* zcaFP%tGBeG+Q5non563H0uxNWL1s~p4cdeExm$+6Zap-U)mVj)`@p;7$44mx(djsw zf#{q;bmMKj-#%_gh%Y{-+tQf6c>$t%-nSISkTK1Eb@oNcuop z?wqw%k{xuf;8;L>u`!EJIPMLlCH^$A=*N*@;?KSnuxraViRs$Z>U1}bM)yZ2oSr>Q zy`+A7&bR5q5}1e!VCE+(l)ppvEt&1F#Vy?blZSUJ`+DS|ACUCrXE0aTq>^V2HSS$y zD`WZT(+T=++Mtf3!C`B0nUjy}T6~Z%gS6z}7Ux{8GjGj_vrR+d)(Dsm-O)m71tDCo z^BiOMgbn|pjah=SfD0=21!F%so|KHqXJK{04ITGtw4RS~@{l^YA_{lMbsQ$(Nz_n z_hdFP*}|A5hf`aJCn6^I3hxS9>ZPT}Ij?ff8~$rN??&Tki}>#^bk|{l*ZK@?@>Q8y z)2OOZ8Puiq>f-WCNmP#eUn6hrIbEIDu+sUvGVLUqq0U|ZR4MGAIW9v@4lWjKbwf*1 zfzO%NmsF1EjMlun=}ivztm#j(R?F;`U|S#i^0Mb@)VGGm-9Pr!Y226J7T+t{ezaaK zCBul@XTshjRaaH79+_9D^+Nc$3}r!#n8ABmDNeP!>}po76e-8WGbCAud7d$LP;|7 zZcKk6y$i#U`R3zHJcAJ9bt77(W1#0)Md;P88uVFT6-WbIW57I7JmB8n(I;Bncfgv4 zZgZh5C6E{_)h1JVsAp^vH{~ltD@X*UMY{cL9>!=&%w{ES z3S63p{a3SzeMGI-Fu!i>+E?`WzTtMhw7C-9-Vm+OvzXeQUUdn~GYVf}Q!hYU`Jv@L zaYoEvTf_CYsBJ|48!YIjWvwv@7NKz0LoX02GVxs1ma%;f&Y~=spkJEll@!>#u4N6? z<$GBs-jx+n&TaS@tXvI&m8*XC?D*#0Ujh*KELyqguDER6(Ex7*%zg))wktTVYh4pb zH>n!DgFxMKXH}AkTOZ(UpusdnThpm&S&B99Q{~_qbK^vj`M!bcp`4q8D7<&#mfocW z;rn^!xHqnhpitFcbOsLqEZ0?zUFwb~e);1v57JtlE+(IXowxP@r* zqHB4TJ*o#L_o+E*cNk=SgCrkO?dNsvhg?it{{rh&6r1_Jo|mc*yaNMLU>77i?H5z- z<3*d{@}yUIahYMTYN)O13zPpYhNl-D7FG0}VGqo0$b=IZ8xZO8=IM_vEyR(2-1UE9 z%Qe?_x34zjAv5y#^h>l4a#tWn*FCR3byQ*v(BhhVf447!5@~__eeF3~>CW!tbKOo_ zO;nE&`msBrab}x$=JjRNZ&`>hx8cvlv_8yvwdO3L)w#s2K*#PSTD?^Nqsdg*0x3$MYka8Dx#?_~`el8Ljb)H%86{E#qP1~_xg-KRmpXv=19#4F3$a3>2kv&n2$4+qoAI2H_eL^^N-yjWniSDbut!Pld%HVti|) zp8@eX<=@~MU$^nfz037wX;do^+!qAQn1LM*iUx@+KHz5QVxCg#OKYf?R3yzmA~W_< z-Hl@UY7~dM<>>I5lhD>2s%mLXE8`^G@-tHLKK)8a{xZ9}^9*!7vvd(|s!a!8pL%>v zqzJ!y)#V$L@*#^k9386Q*vgU6#`u7pr{40EN?Jq5d(aTBhxH}m-+hqLnC2lXcBc!5 z^+n%PFKE7pxR|Nb{BKAc`m_T+Lx z!e?wg1K9QwJC%RO=8v-U#^C%y9P_@Er{p%jiHV+#YmgGb;0pf6al6ju04!XrmABL? z?UgViWAz0anT?!t1Xnlc5_kNdc@OmZ6Ffr{<7@{SfWqCEF#9X=Z+-5yHAq2iP&V__6m1NKQm zSDCc8K;&l-IJP*_?V)a+(16%ilKJhUOP1^Q_&BTz?eHZwXZ!CfcYEkrCzvB_nIpUF z8p9V56Q5(|YiDJ<3pvJLqEbT9Ypk11J%5Po57jG1??#Udikdm|$LqV?v#9Td&4G;Y zw@{MWaQ!J|?DvQbInl#4UprjZy~N;ul^`h#os&Cx;E$SN5lL>L9}VJ0+Omg*X$_C{ zbg_{tP$Mafon}Xm#u{6p+J9lfpIU@zhn(M@@En;JXY_L*5PD&9-0@fq)gh?Q-s~IH zrEsZyPyX0J4OP8y=W0zl(0Z^`C)NX00hM=iy-$S#rAb-F$%$R#xqQ;Z!o9gh)HSfL z#dKmcM|aBL0*`~R6{8IxCUY|7@09{R(EN4uo zB!f`#gG!G63M&SC54$}St<%AVm}8BGQG;NhKsa( zG^P`=v5hUGU<1>aZDpCxt>-+?VR?JQ-%;g(bl0tp=-s@IpxQz?U++~}R%tOsa#Jkl z4FR5KzRMbqnSSyUl$vCQ{nhF}W1J0$uDvBLaBt~y z80X*PM>waYTSV_}kIA6K&lnD<+x{=fim+xmebj;Q{NZ12^X{H=?gn(ofEI2saaYsp zwo`r~pX=j!6eh><`3Dz1$e+xFa@PHsG-O7;1G_k%Qd!=ms#*yV)B22G2Q_yqA6G7z z%#_+!&YY!4dNOVE$GUmThe%R5$$v_MYVM}M_81K;+GiJ>rpJ1q>s(f(nnid$CrWRlpKb{-R#|OVJ z=dzHd6gjLS#W`+vTiWwsQ=EmrQn|+TO;K_o#xT(aU-AszL?BKZqatx^U|wR^LxBV z9yZk9mH+;cIE@ttdzIgV&9h%F5L+-yrgFvQ*H~wmk8*b>f3Oj2F^p1K{t0ZDS%mQR zy4k^_E-jVw7v=Rof5CcV=fJ^wO2Cw#DA}G^IPW`y-p||%Z)IrZY`v$xDLLzUJ2?^m zTVWcahP{E+$LeDS=Sd_1CCJG$^^Gkhr)28l*E`CP&c{{bmW|oFmTNZTw5KN>4|h#I zbPV5qAW6PdQZK*45~u4F^X&^=vy}B(l~PNF*!Ei~9nM8x$k#Ywh+JmcKaOuxGB!UA zxmhbQ{7gRyE~Mj2Jvq)CHU!&$_xe6dT5zDEizsNBB z($Uyu_r}>!CCU~)pH9XvObm8%h8hkwX+Hy-wAWcLclC8^KTXs-vq6_Iw}>+1l_EW4yyYl=A^`v zH7c5pt2zBh`P`L7Yc4NAor*?=feqmPp*j=;l62|nIToNgP?K!M5zt_ISWeVJ=2)B`;vY67 zsV`4~kh~<3w_cdH$L;qi$5%gS0UBkciHmr`M|onWi@Jq%%ioR9mNf9@N6&i7O3Hrm zVWR34DVNBl;3iy4cd!e{wflIDH-MdC8uWyB(g36hm|=}MOAQ5So(kq#dEV=dmpA*U zvYP$`Y-^n;8Reb;Dm*^oe?vTE*bJg!+)~^)oqw6g4a7Xe$jQh06~yYBYD7BQ1^9_` z=FLV8KByctPZG)2z~+Z>y?o^9ClHiqieK|*ffIiC;22()c5@UwzUr^UVDp~71;^Z| z=m!YP#;Itepu7aM*(RBg3Nzn{EtGN0&DZjLxS@qfdV<#`tf)Q6M(5#Cq~|eM#wv?^ zxoa|L2-)u~E3T;n?6Oygx>!S4Gy9Nf(p@=9Vac{jpaRaJHjx-ee%@`{C1iFZR3=1e zGhY%3h(KSO>im5!3Zt1aqY8a#K4sy?ymTJW7#;#&rD!>$3E~hMg%KwZ$%l8?hD>ou zDv9W5vffKxmHwogsIGkL_CXnqG&Mk>CynTaY=B-6a^?O^zO!~fBI80XtUkMimvgoeO+EA)$&B)a6gB5Cb>!|U zu9GJnM!mFva@ZVQobbzJ^|LHM({MQc8nz{CNGgM&{>bulnm7n9^34UP*w~}{j!-xg z&N^he*qYfm^zZ0!mt{5hKFft~1&tU=#jv4VUs(ymedbmH?ZQUEF*fj^#u@-SXKTr7 zUTtV3?{|geVz8N>x&-ru*>;ynk9~$3Sv>o~E&}Obb&D~ zJWQu9yOI>ZGWqd0954NQ2vMxHqRz$^IstuNKW}+@@-+qj0fgSSk~j~a5sv(Rdz~pz z;Dv+b0DTQZ+?4~zc;1!!M?b(9pGemL#Ml(iWIp<{rxq%+Zf7}uVr16#z^jY1^-igw zc#@Tczak4D-`kE)O$?_C7dXBrOhP`HhT1Qnss^};vx+@I#Ojhz;W~*68iZ(&V4tZB z2i8DXAZwuN!P2j;V7frywQXR19T16D|CtfjW4N2rHODq{#r3H&K@uGQ%i7CSwQh5H zP7c&J%zmNs=z=(hjlYLan`dG?S1eBVNyDdmJS)R(fA9;>#YK+~e<>gLd^^?n-@lp$ eN0NXO!^4)yiVt)rD&QM<0MgXPq~@~cgZ~36lhUgI literal 0 HcmV?d00001 diff --git a/src/main/java/BsK/client/ui/icon/cont.png b/src/main/resources/icon/cont.png similarity index 100% rename from src/main/java/BsK/client/ui/icon/cont.png rename to src/main/resources/icon/cont.png diff --git a/src/main/java/BsK/client/ui/icon/data.png b/src/main/resources/icon/data.png similarity index 100% rename from src/main/java/BsK/client/ui/icon/data.png rename to src/main/resources/icon/data.png diff --git a/src/main/resources/icon/delete.png b/src/main/resources/icon/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..0d30fb0646efbb883db75db9d985fb06af304adb GIT binary patch literal 8994 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 I=5_7=0a{3{6951J literal 0 HcmV?d00001 diff --git a/src/main/resources/icon/edit.png b/src/main/resources/icon/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..53c3cf69a18348cd5a5fdb2bb360625d210b3e81 GIT binary patch literal 11070 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