From b5c4c9c2053431578e32d816bb5ea0474e7ad16f Mon Sep 17 00:00:00 2001 From: skylarmt Date: Wed, 17 Dec 2014 23:55:35 -0700 Subject: [PATCH] Improve Python support, add loading screen, add button to close all windows, fix Graph window resize bug --- src/net/apocalypselabs/symat/CodeRunner.java | 10 ++ src/net/apocalypselabs/symat/Graph.form | 2 +- src/net/apocalypselabs/symat/Graph.java | 2 +- src/net/apocalypselabs/symat/Interpreter.form | 56 +++++++- src/net/apocalypselabs/symat/Interpreter.java | 107 ++++++++++++++- src/net/apocalypselabs/symat/MainGUI.form | 34 +++-- src/net/apocalypselabs/symat/MainGUI.java | 69 +++++++--- .../apocalypselabs/symat/SplashScreen.form | 76 +++++++++++ .../apocalypselabs/symat/SplashScreen.java | 123 ++++++++++++++++++ src/net/apocalypselabs/symat/closeall.png | Bin 0 -> 1121 bytes src/net/apocalypselabs/symat/splash.png | Bin 0 -> 26767 bytes 11 files changed, 445 insertions(+), 34 deletions(-) create mode 100644 src/net/apocalypselabs/symat/SplashScreen.form create mode 100644 src/net/apocalypselabs/symat/SplashScreen.java create mode 100644 src/net/apocalypselabs/symat/closeall.png create mode 100644 src/net/apocalypselabs/symat/splash.png diff --git a/src/net/apocalypselabs/symat/CodeRunner.java b/src/net/apocalypselabs/symat/CodeRunner.java index 93f59e4..ab7e83d 100644 --- a/src/net/apocalypselabs/symat/CodeRunner.java +++ b/src/net/apocalypselabs/symat/CodeRunner.java @@ -85,6 +85,16 @@ public class CodeRunner { this(lang); isShell = shell; } + + /** + * Inits the Python engine. + * @param fakeInit Set it to true. + */ + public CodeRunner(boolean fakeInit) { + if (fakeInit) { + se = new ScriptEngineManager().getEngineByName("python"); + } + } private void initError(Exception ex) { JOptionPane.showMessageDialog(null, "Error: " diff --git a/src/net/apocalypselabs/symat/Graph.form b/src/net/apocalypselabs/symat/Graph.form index 974ede2..9355961 100644 --- a/src/net/apocalypselabs/symat/Graph.form +++ b/src/net/apocalypselabs/symat/Graph.form @@ -124,7 +124,7 @@ - + diff --git a/src/net/apocalypselabs/symat/Graph.java b/src/net/apocalypselabs/symat/Graph.java index 42cbf8d..5a69dae 100644 --- a/src/net/apocalypselabs/symat/Graph.java +++ b/src/net/apocalypselabs/symat/Graph.java @@ -226,7 +226,7 @@ public class Graph extends javax.swing.JInternalFrame { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton1)) .addComponent(gLbl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) diff --git a/src/net/apocalypselabs/symat/Interpreter.form b/src/net/apocalypselabs/symat/Interpreter.form index 38718cb..3ea2caa 100644 --- a/src/net/apocalypselabs/symat/Interpreter.form +++ b/src/net/apocalypselabs/symat/Interpreter.form @@ -1,6 +1,59 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -12,6 +65,7 @@ + @@ -42,7 +96,7 @@ - + diff --git a/src/net/apocalypselabs/symat/Interpreter.java b/src/net/apocalypselabs/symat/Interpreter.java index 79fc30e..ec25373 100644 --- a/src/net/apocalypselabs/symat/Interpreter.java +++ b/src/net/apocalypselabs/symat/Interpreter.java @@ -38,15 +38,34 @@ import javax.swing.text.DefaultCaret; */ public class Interpreter extends javax.swing.JInternalFrame { - private final CodeRunner cr = new CodeRunner("javascript", true); + private final CodeRunner cr; private String[] history = new String[10]; // Command history buffer private int historyIndex = 0; // For going back in time and keeping things straight + private String lang = "javascript"; /** * Creates new form Interpreter + * + * @param useLang The script language to use. "javascript", "python", or + * "default". */ - public Interpreter() { + public Interpreter(String useLang) { initComponents(); + + // Setup code runner + lang = useLang; + if (lang.equals("default")) { + lang = PrefStorage.getSetting("shellLang", "javascript"); + } + cr = new CodeRunner(lang, true); + + // Set selected lang menu + if (lang.equals("python")) { + javascriptMenu.setSelected(false); + pythonMenu.setSelected(true); + } + + // Set font int font_size = 12; try { font_size = Integer.valueOf(PrefStorage.getSetting("editfont")); @@ -54,6 +73,8 @@ public class Interpreter extends javax.swing.JInternalFrame { } mainBox.setFont(new Font(Font.MONOSPACED, Font.PLAIN, font_size)); inputBox.setFont(new Font(Font.MONOSPACED, Font.PLAIN, font_size)); + + // Set theme if (PrefStorage.getSetting("theme").equals("dark")) { mainBox.setBackground(Color.BLACK); mainBox.setForeground(Color.WHITE); @@ -67,12 +88,18 @@ public class Interpreter extends javax.swing.JInternalFrame { inputBox.setForeground(Color.BLACK); setBackground(Color.LIGHT_GRAY); } + + // Misc. setup mainBox.setLineWrap(true); mainBox.setWrapStyleWord(true); mainBox.setText(">>"); inputBox.requestFocus(); } + public Interpreter() { + this("default"); + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -82,11 +109,18 @@ public class Interpreter extends javax.swing.JInternalFrame { // //GEN-BEGIN:initComponents private void initComponents() { + langGroup = new javax.swing.ButtonGroup(); jScrollPane1 = new javax.swing.JScrollPane(); mainBox = new javax.swing.JTextArea(); inputBox = new javax.swing.JTextField(); runBtn = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); + jMenuBar1 = new javax.swing.JMenuBar(); + langMenu = new javax.swing.JMenu(); + jMenu1 = new javax.swing.JMenu(); + javascriptMenu = new javax.swing.JRadioButtonMenuItem(); + pythonMenu = new javax.swing.JRadioButtonMenuItem(); + setDefaultLang = new javax.swing.JMenuItem(); setClosable(true); setIconifiable(true); @@ -123,6 +157,43 @@ public class Interpreter extends javax.swing.JInternalFrame { jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText(">>"); + langMenu.setText("Language"); + + jMenu1.setText("Switch"); + + langGroup.add(javascriptMenu); + javascriptMenu.setSelected(true); + javascriptMenu.setText("JavaScript"); + javascriptMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + javascriptMenuActionPerformed(evt); + } + }); + jMenu1.add(javascriptMenu); + + langGroup.add(pythonMenu); + pythonMenu.setText("Python"); + pythonMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + pythonMenuActionPerformed(evt); + } + }); + jMenu1.add(pythonMenu); + + langMenu.add(jMenu1); + + setDefaultLang.setText("Set as default"); + setDefaultLang.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + setDefaultLangActionPerformed(evt); + } + }); + langMenu.add(setDefaultLang); + + jMenuBar1.add(langMenu); + + setJMenuBar(jMenuBar1); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( @@ -138,7 +209,7 @@ public class Interpreter extends javax.swing.JInternalFrame { layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 256, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 239, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(runBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -187,6 +258,29 @@ public class Interpreter extends javax.swing.JInternalFrame { } }//GEN-LAST:event_inputBoxKeyPressed + private void setDefaultLangActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_setDefaultLangActionPerformed + String pref = "javascript"; + if (pythonMenu.isSelected()) { + pref = "python"; + } + PrefStorage.saveSetting("shellLang", pref); + PrefStorage.save(); + }//GEN-LAST:event_setDefaultLangActionPerformed + + private void javascriptMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_javascriptMenuActionPerformed + if (!lang.equals("javascript")) { + MainGUI.loadFrame(new Interpreter("javascript")); + dispose(); + } + }//GEN-LAST:event_javascriptMenuActionPerformed + + private void pythonMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pythonMenuActionPerformed + if (!lang.equals("python")) { + MainGUI.loadFrame(new Interpreter("python")); + dispose(); + } + }//GEN-LAST:event_pythonMenuActionPerformed + private void doRunCode() { String code = inputBox.getText(); mainBox.append(" " + code + "\n"); @@ -207,8 +301,15 @@ public class Interpreter extends javax.swing.JInternalFrame { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField inputBox; private javax.swing.JLabel jLabel1; + private javax.swing.JMenu jMenu1; + private javax.swing.JMenuBar jMenuBar1; private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JRadioButtonMenuItem javascriptMenu; + private javax.swing.ButtonGroup langGroup; + private javax.swing.JMenu langMenu; private javax.swing.JTextArea mainBox; + private javax.swing.JRadioButtonMenuItem pythonMenu; private javax.swing.JButton runBtn; + private javax.swing.JMenuItem setDefaultLang; // End of variables declaration//GEN-END:variables } diff --git a/src/net/apocalypselabs/symat/MainGUI.form b/src/net/apocalypselabs/symat/MainGUI.form index ca9612b..56da12f 100644 --- a/src/net/apocalypselabs/symat/MainGUI.form +++ b/src/net/apocalypselabs/symat/MainGUI.form @@ -9,9 +9,6 @@ - - - @@ -216,18 +213,19 @@ + + - + - - - - + + + @@ -281,6 +279,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/net/apocalypselabs/symat/MainGUI.java b/src/net/apocalypselabs/symat/MainGUI.java index c66e32f..4c11414 100644 --- a/src/net/apocalypselabs/symat/MainGUI.java +++ b/src/net/apocalypselabs/symat/MainGUI.java @@ -1,7 +1,7 @@ -/* +/* * Apocalypse Laboratories * Open Source License - * + * * Source code can be used for any purpose, as long as: * - Compiled binaries are rebranded and trademarks are not * visible by the end user at any time, except to give @@ -14,7 +14,7 @@ * - and you provide your modified source code for download, * under the terms of the GNU LGPL v3 or a comparable * license. - * + * * Compiled binaries cannot be redistributed or mirrored, * unless: * - You have written permission from Apocalypse Laboratories; @@ -22,15 +22,14 @@ * not even behind a paywall or other blocking mechanism; * - or you have received a multi-computer license, in which * case you should take measures to prevent unauthorized - * downloads, such as preventing download access from the + * downloads, such as preventing download access from the * Internet. */ package net.apocalypselabs.symat; import java.awt.Color; -import java.awt.Component; -import java.awt.Font; import java.awt.Graphics; +import java.beans.PropertyVetoException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -45,9 +44,10 @@ import javax.swing.JInternalFrame; */ public class MainGUI extends javax.swing.JFrame { - public static final String APP_NAME = "SyMAT 0.6"; - public static final double APP_CODE = 0.6; + public static final String APP_NAME = "SyMAT 0.7"; + public static final double APP_CODE = 0.7; public static String argfile = ""; + public static boolean skipPython = false; // Skip python init on start? /** * Creates new form MainGUI @@ -122,7 +122,6 @@ public class MainGUI extends javax.swing.JFrame { @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { - java.awt.GridBagConstraints gridBagConstraints; tabs = new javax.swing.JTabbedPane(); jPanel4 = new javax.swing.JPanel(); @@ -135,6 +134,7 @@ public class MainGUI extends javax.swing.JFrame { helpBtn = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); arrangeWindowsBtn = new javax.swing.JButton(); + closeAllBtn = new javax.swing.JButton(); jPanel3 = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); displaySettingsBtn = new javax.swing.JButton(); @@ -155,7 +155,6 @@ public class MainGUI extends javax.swing.JFrame { setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle(APP_NAME); setMinimumSize(new java.awt.Dimension(300, 400)); - setPreferredSize(new java.awt.Dimension(700, 575)); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentShown(java.awt.event.ComponentEvent evt) { formComponentShown(evt); @@ -273,6 +272,19 @@ public class MainGUI extends javax.swing.JFrame { } }); + closeAllBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/closeall.png"))); // NOI18N + closeAllBtn.setText("Close All"); + closeAllBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); + closeAllBtn.setFocusable(false); + closeAllBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + closeAllBtn.setOpaque(false); + closeAllBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + closeAllBtn.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + closeAllBtnActionPerformed(evt); + } + }); + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( @@ -282,15 +294,17 @@ public class MainGUI extends javax.swing.JFrame { .addComponent(helpBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(arrangeWindowsBtn) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(closeAllBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 555, Short.MAX_VALUE)) + .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 492, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(helpBtn) - .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(helpBtn) + .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(arrangeWindowsBtn) + .addComponent(closeAllBtn) ); tabs.addTab("Tools", jPanel2); @@ -403,6 +417,16 @@ public class MainGUI extends javax.swing.JFrame { loadFrame(d); }//GEN-LAST:event_displaySettingsBtnActionPerformed + private void closeAllBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeAllBtnActionPerformed + for (JInternalFrame ji : mainPane.getAllFrames()) { + try { + ji.setClosed(true); + } catch (PropertyVetoException ex) { + ji.dispose(); + } + } + }//GEN-LAST:event_closeAllBtnActionPerformed + /** * Adds the given JInternalFrame to the mainPane. Automatically does layout * and sets visible as well. @@ -471,22 +495,27 @@ public class MainGUI extends javax.swing.JFrame { // + // Command line args + for (String arg : args) { + if (arg.equals("skippython")) { + skipPython = true; + } else { + argfile = args[0]; + } + } + /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { - new MainGUI().setVisible(true); + new SplashScreen().setVisible(true); } }); - - // Trigger open passed script file - if (args.length == 1) { - argfile = args[0]; - } } // Variables declaration - do not modify//GEN-BEGIN:variables public static javax.swing.JButton arrangeWindowsBtn; + public static javax.swing.JButton closeAllBtn; public static javax.swing.JButton displaySettingsBtn; public static javax.swing.JButton editorBtn; public static javax.swing.JButton graphBtn; diff --git a/src/net/apocalypselabs/symat/SplashScreen.form b/src/net/apocalypselabs/symat/SplashScreen.form new file mode 100644 index 0000000..db0eefb --- /dev/null +++ b/src/net/apocalypselabs/symat/SplashScreen.form @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/net/apocalypselabs/symat/SplashScreen.java b/src/net/apocalypselabs/symat/SplashScreen.java new file mode 100644 index 0000000..c44282f --- /dev/null +++ b/src/net/apocalypselabs/symat/SplashScreen.java @@ -0,0 +1,123 @@ +/* + * Apocalypse Laboratories + * Open Source License + * + * Source code can be used for any purpose, as long as: + * - Compiled binaries are rebranded and trademarks are not + * visible by the end user at any time, except to give + * credit to Apocalypse Laboratories, such as by showing + * "Based on by Apocalypse Laboratories" or a + * similar notice; + * - You do not use the code for evil; + * - Rebranded compiled applications have significant + * differences in functionality; + * - and you provide your modified source code for download, + * under the terms of the GNU LGPL v3 or a comparable + * license. + * + * Compiled binaries cannot be redistributed or mirrored, + * unless: + * - You have written permission from Apocalypse Laboratories; + * - Downloads are not available from Apocalypse Laboratories, + * not even behind a paywall or other blocking mechanism; + * - or you have received a multi-computer license, in which + * case you should take measures to prevent unauthorized + * downloads, such as preventing download access from the + * Internet. + */ +package net.apocalypselabs.symat; + +import javax.swing.ImageIcon; + +/** + * + * @author Skylar + */ +public class SplashScreen extends javax.swing.JFrame { + + /** + * Creates new form SplashScreen + */ + public SplashScreen() { + initComponents(); + setIconImage((new ImageIcon(getClass().getResource("icon.png"))).getImage()); + setLocationRelativeTo(null); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jProgressBar1 = new javax.swing.JProgressBar(); + jLabel5 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle(MainGUI.APP_NAME); + setMaximumSize(new java.awt.Dimension(320, 260)); + setMinimumSize(new java.awt.Dimension(320, 260)); + setResizable(false); + addComponentListener(new java.awt.event.ComponentAdapter() { + public void componentShown(java.awt.event.ComponentEvent evt) { + formComponentShown(evt); + } + }); + + jProgressBar1.setIndeterminate(true); + jProgressBar1.setMaximumSize(new java.awt.Dimension(32767, 20)); + jProgressBar1.setMinimumSize(new java.awt.Dimension(10, 20)); + jProgressBar1.setPreferredSize(new java.awt.Dimension(146, 20)); + + jLabel5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/splash.png"))); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel5) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel5) + .addGap(0, 0, 0) + .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown + new Loader().start(); + }//GEN-LAST:event_formComponentShown + + /** + * Load things that take a while. + */ + private class Loader extends Thread { + + @Override + public void run() { + if (!MainGUI.skipPython) { + // Python laggggsss when used for first time, this fixes the wait later. + System.out.println("Warming up Python engine, to skip run with argument 'skippython'"); + try { + CodeRunner python = new CodeRunner(true); + } catch (Exception ex) { + // Ignore + } + } + new MainGUI().setVisible(true); + dispose(); + } + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel5; + private javax.swing.JProgressBar jProgressBar1; + // End of variables declaration//GEN-END:variables +} diff --git a/src/net/apocalypselabs/symat/closeall.png b/src/net/apocalypselabs/symat/closeall.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbe367cc9a0958ff9170741e6e2331eeb75de85 GIT binary patch literal 1121 zcmV-n1fKheP)$FQ^#v+$_h=kS$%c=`l)RkH^#oQb?f1yet*$`1He(gzwBi} zIKsXp2)->PC57gBE^R3(!Ha_6V_h8QDKv}`c?7}DG7Q5O8pMcLhGB~m{E3Ph-fDE< z-0CXASFS)!rvU&J4hODvbl_QE{`q7Qq269ROr-z-wJsNaX>T{Yu^4{m-5iImUAquh z6vPz;W3r56!^6)U(>XAJzZVt|R}{!=Yxpz}FtsC^S~i`2Kiao%C;q!w3|Hgv4g3B$ zIf>uy+#&vKeLY@vI?cqJU-Lbo5K8TK;*a$AW9iYOygsulE9e>;BEHq@Mc3}#W~0r+ zdw3of8XJjEJOv5>hawRy=O*N|*>Eu&rgDIyQf>B0681|H@jp#Y;@8{~`R3+L{5dm2 z+AaixsN#7VvGhvi`KO@X9T-6L!2_I#M#;1Nl7zR{P13BW!8>g>d>;-IKc7q@c=<9` za;5YILBRQ7kX9T3%9~W1*NgZ3e&Qc%8i4Et;bJHRr_Dw)j{Xk&WkUnX*Hs??c-`$r zi`Pp#iaz}BQ&X5vCi9++%+2A_?c21Y=)%vaDmn)TH*9-OXAD~pmS z;!Gew+N~^$A6i;qw^#sV%jdyJ1gT8MY_xg!?uiNfv$zN#ThDu%o8hqLUlV+#r8r$z zM|^B?5uZ_5KBnMrEiK{mbr6SqKD_DK_&$HEx*FBx<-~W7k0X|wv{9LYKM{?RkH6Gz z#~1bW|Jm2dviP>CiJT_WnwEF&F(Sk8{j;<9V|tqSk85l5&h;B9;CAO7%&x}cxOVTJ zQ3T_6*eae!e@6%L4V9If8h5U-5%28WNxa9z@z^l@4pGDoQGD)kWp+E7a%I%4iu$Jy zR@Zf{&=5wX>AJ?stE-7ZgBVdlRp;0#RgEdR+fK1aNv9E4)tE)qG?}+p-g=|5k}EXS nW_9kyjfLL3caJm0{I|}(m?cR3uj71p00000NkvXXu0mjfUDh2m literal 0 HcmV?d00001 diff --git a/src/net/apocalypselabs/symat/splash.png b/src/net/apocalypselabs/symat/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..99b4989e5c6bc058b3cafd086a90427d7b9e052d GIT binary patch literal 26767 zcmdRV1y>wRwC$i7+$|71xNC5?-~@MfcXxLQ7Cb<3cXx;2?oM!bdHvnD?)wjqwT6+^ z(_Phd&ffd%Qxl;eCxHb286E@zAxTM!DuF-{g23xbFf8!jfxg2Ec!G8kmQn@-f8Jo@ zaNs?hy`+W{aQxzb4+vqZ40qr|JZCX==O1>a&Ta;dCLlLAHwFt^D<>lZdlLpbN3)D` z-p?QqF-S^ONZCE}RL9L5Q|!a{o*{Ju16}x&&@U>G-Xj}Xc%ZL2nex)h$Skacm+rjxPm6ymZ!IbHlwle^V9VZ?L;5`oUt?S)$zu| zPS!deG%yJ?EFvzG!Y6~$b68v^{cb^*9%4Z#Sj0IETxj!d{{U`;AP^F8fSCbmE(8?p zF&!c#8*o%sh>$<<#o{_9@RUCUlnXX2#Ahb`+`qm5pM6caQ8$mhyH!v`0-cQlObS#^X1Wx0R8rW#F`n>Ym4O0RG+$TyR?@I`a`BE&1tvgC8s_=q8 ze-bY`Un*POA|g*J+vKJXfYYJ3t?L%v@n7|0M0)o1_Lde@_JyG&ZEfj``NVu?Ck+V+ z;U73(ZK{%A3~S1XjD*iwc{{1?p;JM(`F`7=2=Pp`|jSgk5s)T~Aw1PUa6tmv%JYTBvldKXS*(6OJD z<$R*I?f%{RL%}W~HB}-pF|k-Db~;}o34>D3e(1ZjG?~-k->+{k50qW6*V0&xD_*C| zbrKC3SQr>0u|xvrP0x{0QBrNLXUZqqt%$57z0**IhZDa_4+9CuXQJoud~3mCGK$G! zwLoXsp!tT*I;CjT)=lJdi&k4#hjpFKYGyc+_|<%)oy)C!p+d`Ora)?`-U7q6c^lS` zW7aO$#czO$imJO!$zewn6BCol`0DBkeHjRb zh^7tCF}pihmha!c+n=v-6%-T@fBg!x>3xHQOvE2;v)Tv&y1u>!fuy9Q_!mv;maDCo zSwP)TD7^ka?B*CPK+mZ|zHWyRVb%^0OUnFWEBUPX<8BLYbFIz{#dI?J%t;5I)3(1i z1cCibF7w;AlMblbcAdLir%jdAYPt67!FYO*nx2n}!N>I&BN-pxI-|=c7P)L*IFR{5 zIUb0Zg9Do)2`-Du(lMSXvq`IXU^G_Ts@rMnY0jkZy-(o=^}h|4vtZ)rAwyv5Ye$rq2YU$tpcJhL!%+Vpua zm@ieSUOgjRrmboZ41oId`$v(SZUZeRCr%vib-3{RRuIa6w;erQKyui!Vdq~_j_NRQ zKYfBjLk-uO9n_ocN#5UI?BXiR%MmAeZx9#CHFlle0-`fB2|$9{+64ZiH+;s!sG_2x z`XBFa_TLE1XaB@Z-tF!08vuX=fZX5&=jN$X`{$73^B}LN4BJ*IW_~g-B$v~HO!6G3 z_oKa-4}hzbaz(Rc?!XJR{tPZBirG%H$!z!+my?AA;6SRqv(+Zb{r!F22CM#Xv`F`d zH769{^Jw9Xat+q1V^kwxRFTbO;?eO-)~k&%+=R_Gs~kBeY9cOi5VlLz0W#UV>8G1r zdU;yFbkcb}Shzf{3nuUAv>Kx|dGMTgcL~RMhuqilmAVPou^VMzuooYXZB? z3g&;XsidTYX*Zq8MEQ4P5)zU~TkjlxpJEgp`Cn`!c1GC&(K9nj zQcnO~h-+$o{>5ey_(wKF$>;j!rseO%a-EsORyPC?zPUi+`dZk@3delyzS<2 z0;u3uaqpYzWOhHx?TQh^i(IM837 z|4H;p?g&WN8oN#Ya}J$mdkA^nt6)(IFk}jyM&QwrdD?{Oz*78#>5cPjd(T|S53I>* zzPq^}b8zLHo8CXJ8vFG8-U^>StI3AGWJcyRjZaPv9nY5;aAYtW_Jd0|N0Vu$& z=_g@tUoC%uv1kk+1T>A^)Ibyt>t>LQy!=oUV`n&r%}Opn9cgS9=#6%p=Ppeaw@1^F zQrG~+qVPZZ^9%xm!&=`A4+qabSngj8Kq~P1djrY39m{hbKm7iD!gvrDjH}gXeZ>p8 zEncQt!DKXuIL{4n0cQ`OVkF{Q%VD;NvoqW5;j&rIoea47Kd?~K^%yAQfac!W-Q`1R zx>#?+X>+>}2U2t}_RE;JHZ3`M|ILvCa581JsHeAwO@ju_>5?Bsnr$ml6s0cEGxFa6 zl=nDDHWz8=VYFZ92LTerbVy7}0suGS z&&7B;D^@3V)Ib$VK%3%v60z;il$6BVTj#`_oJkYArqvN(c;3FBS{QOwQFHNe7xDkFZ<`pP1eJb|!z{Pv z*C>Dj9UW_XKhE1O7Uq!&q2VDu7jw_iKw^^7(nir~)CMCG@n`lA3|OEWh>Al0hbki@ zBh%4*9@oYpenoOwY;QnH4kwR{F#9|^hinF+@JlwhaAy_B=kUY7O!B|T7`z_x+6ZcUy=F_BN(E!k#jP`GO9DWf)6ha*aAl$h@3;`Bm z!FNs*60>jHJ|4IsNvV3i8aHnXz`<7hD9OpmVx**`n4Kq!Rcd$mT#f~5>AR0tyI8)! zW$9+$0YyVjM<-*L^Yf>uqmvUKhg?yTw%^-b>%GB1B-UCw6;fegVSzzkXe2HI4#Qro zkmUZg8Gs?G{r@(*x+=eEGJ&h_^W{);33%Mj$@3-RC`{|pzX#qO&y(Td;gvFH`@MUF z=mGGbjv{VmYKk5;@VhvS@&=FFx%hV_0A^*+>_n-^)Gq%5=4Xh|=~6UCBY=XMCYWCfSGX-J^~R!^SaVtRg~uA^o<~rLCf5nip%YsKn=gD{rbBYAFW#D z-0f^icA2FXwjFOj1&E*o3SbkXjgR zeR*wK^kG8&4Mgm&?6`iv{XX6w0rf-{8tFO)q=vJ-0f*!-~$9WzKfeC z4*v^=NX&ms2)(F9%{HES#a*siCc2PoAkzN4aw0*?0D-&VjU%+5IeXDX85c>13aP<(N*#%5+e zR$a;IWm))#jvKi%gS~6_ewa40U5!viOh^?I(e8`9go$Z2eo)m=X;l-aNFQ-K2Ja44Oluyw7>cNhGGwc-O zrh8Fv(AwPTW?VAWjj6hR{ZA;?TtEUBBm#=8-e!m0%d@7<<9B&mpv+VUv`DMlg`Cc` zF(7He4V<6$fFflO5Hj=$Xu|eD1R9+zRG>for*;3EAT0w#{Fr+>9|Z??u;4Sq%guS< zgTu$sboONNbpBP(?}6~h*ah}(aUKc)h6`2*1$+s{1ON#8xczB{hW`2ZMn7lv?(Jx) zrdUD)`~7ZFFKFJhZBK+tS1$Px)>6Q74_9A90}s&5G2`PhblT0R0I-Omrq5*x|gq4$OhZn?w+G{kCRT5-}lVq zat0-$aExAq;hZHLGGYRHxFbGG`2!L!V8?GJB_+jhv(u+_p*yM1n8g4f=rm@d&_g}s zFi37dSGme-TX1K zBa}IN=ie{v(fI4Ix95OZDd z90eltx-wV%LE|-V0(!Q!n^o6Cqh?LTTNrXMI;Z<|^tw^+)!{-~-TfPde1fSzDBk0o z0Ndv>pz~RqS%ax{q~Q}g3)Jac2?n>zaWGKEe*z%!5lB{t$4i6Pn@NFhuBW&xtgMR4 z%E3TI9Ac-e{L_s33RuZ}fB}!D^FNW2k-g0{=81&uRJNV>0t`l-&~?9J6&@a*>&h2l zF2c~&Y9t|(!LLIqFJ;la_-114QjV{77V3H;9{V}uzSd7-s#S+4qH5k!EaU#{DyMPw ztLqmYH*t640?Ul{^9XeP@kcl+YHA1)(L{RKuwZvFRVY|w;om1Y32m#%KQm=wOm1_n zD4>PCAB&J7kO3cPXUA~Knj<(YjEs&BF;Jl)^%%fChqH#o@2y8bjn&_HwraqV{--bDj%Ih(PdNZj6cOnlYpp+zKt7zBpG zfrW4coE(ih(>&=^26KQ(0TVz$T|FGYbHF-5q*X2N2DHN0k6d0VD)2@73&ZoKXPH?d z#APgKURQDVtB49-(4O};zuwR-Sn=wPw3vbfJt3>g*c{a$CSV%opc`;~oZnWv`};+` zYdqNj1e_4__GIPD0V{;aU^UWk+nwH_`)Ah(ezqua3F`QAf?-$Y;uYi2`wM~$YOfp6 zfz78tvNL)2gJ0cNq|H~#)AtnN>}vTctQG0Ad9h_D6H7+!R*ILc&>++}7i^@*aJjNn zP7+L9Ade3Hk1s4Sm|1%L0e6z%Kf^%j#}9|SVKl&X=>=Rn!@xk;MqIm(;Lo!C*(hza) zanLl(LIivf27skt1e7phaO4P5gg#&)3C3r znCMA%R-?|&ar-((`C0_HOyGD7W#OC9NAFBj2!@30%5$cl`lF@#O2MBjlL-0wK8o@% zl1LWw8QIeHQ4M5+flCUipyx0^7Q|;yLKhne2TSOg5Jy**OsN6g0;d^i>yp7K|3if5z9Z70ZTd|HiVk61WFdx1%a znnghj7!RagUFVpX_eM0*aq`s>B;1CK_b?^-o>69C?wVhA1WHq0+EhP3I+wvDF21O` z3lmrYHoIK@CSz82BFv)bk6C;+BeZ)5riD}Cehi)AX2tu^TH3_ktgkd>RDVZIHEdwUe`%pef)L%rq zIy;PgcZA8(8(${K$Y{y$Ts}4;9e(`V#i8Y`gIrj(N!`HCI7lUuTizf3dN%2f*;=K` z1vQ6oW>(fe`kaLp7GZ-tgqO3XHzi{LZm&_inU@XZjY0issbiccBDJd?Pb> zmRRUQ@o)oLF+LSp_=e)dC?Q#QXE)ISHM?qAPeq5$l9O4MGPNXmU|p-BiJi>^QfKHo zb=Arj;g|zGT`&P}Duz25f(9&CI98T2@enKQW{-+R0^r$!s(SUKk|l$ zK@=H*#8@lzi=JMj&?N#1eJ+k$#NTme=j^&PVR@gNU$b#Y#IqF~FZ{={^F4TP!%Ssw zk|#4M)189fyF?mI&sh2^e@!&i86x^z7`KrBJGlTm%T4kl8(e%4(|qGs6WC>yPfrmi zx$E78Toq{VxPrGFDLA4>zI);^YyHc_XAXGmJa(@64Ed@U#L3NIu>(q;KQWJ5AygU; z>itDgATGEnZn!DhDfND7@VQgpGE#DVz+nP*Q$;y41s?jvX+JmAad885F)^udf@0&k zt9I}o){|LsZgH)C#|4h4+c|KotH{l$`Bd$03yDf|@MJ7&ettp(>8vt|Fm_FeiTm|v z^9D1;t%jkPI8`01Y50=@E!>pWHA1+9(04D3mw}lPDfyU7_gVqj>-_lgNNRuSx-?5y z$A*OonfbDKk_lZKUO5C_3?j?r+@@WhYn!XRaG}7JVi)LPQUUtf8B&4IdH+V9+rRQx zTE`{bI%5!1wp^j-+7^|j-P#Y#k58F*dajU-Ud|oQ93NjtKTwAQOK%I5iF+gh7146E z88>PRhX_~GwR|1W!_uzh_=~hN`H!U=Y4zWsOIFJ8wSuP7f(I^VkFjt5zFT%Ajgty# z$^=0_DOiD-;)mmSPV(m}hEPDKt~}PNv|#_OcvNT&I&WyIHm}?GoRq&rx$D)?$()VQ zoon-%qEwXl55{m0r0}GUMy75AuGuzta4a@JP>5EL24gg{8u@SrKgl)Vt(El1&@IC1?LlFE)ydP^VJpVM-l?* ziozI(QSDwLYJXPt9~p@!IHWI!TfErpUQJwlZi$ql3?7}0Sge9rPzqLz41T&%f`W{g zFp!RcA#}o4Lfe}c><=hAz+3|GIKMa-)wS)5YZ#Pi9p2U5F<{0zIvLbyk~D`iaxf4c zkWW`Tly?`4r7`})g-v;XSfOrOr5X0(%{2Hz&Vtv&e44XiaPO_69j?!87&|_930ZY&WXd3fpm43D3}S|g5#*q z;S>uY3@?^0?5vXhr1;T;ww1$^tPMZVa176Y7QY(CH7!&o5wiBmxA7?yiEStR?Suue z@<#1U*LOWwzSw0REvXx437`N&TWWR(CF|^tJDE*4_RTY;PkeK{v{U|;MGUf5#iz-X zvy>U&gn+-kQPkB%?lJBi$Ry~WFAH1CB*+wSQ#I6M{0ft2uuV12DCpQX2=ea@gcKd@ zKc*1e@QWLf_OH*_)EbVMKD3_BXv>)m9qntz-Xu#XoPib8R&X?sA%ac2r|e7Tjt@ztRRE2Fe+QW zxbn!oI$@r1y9Oqq5$b&Mhny+FV>dRkbEAV7tMU%_#aGqRqV%f!-y zR()e!Yn%nI=ZkP7{b9PK1xr7MuEN=z=4z8pJS0&+bAUolsqW@Y(907}AilGF6Q-o= z=>IcBLCJ$3I1>EWFB-@Hup?${reYc@l%mgOyFie#rEi?g6LplP9xNuxRLAeeCBTUz zCybgA4}v7-r2G^(vPUg42iw#Igw^1PGe|JVbOMb4{ddOgtB`*?PQt>3`0SVoq?MLJ zlYvi^&%E_lmVmxNdJMMP-yGG3PnP-B7(ZKE!#_*-qbnK4=eVzK?hPf4lpLEhI%cI* zq;&L#2Hn8uj+7)6UsCS|RE-alq+sdHGm*55C(&lNLNzy2{v z9$3!%m7@nY(~u|SNy<|idp{xcGxE*&v`u?Z=TCgbxt<&z-VZzOEH_ft*fxeQS8MB% z*`G4`8vT!jVd_Ii+lmuyQnNTY5-q`LI#$I`^UQO&kjiA74ddeHI8=K@;)WaOIhrZO zRvGAFu0BMrpqa`L1zhmb0)6 z8~2EOK8Gygqwh;v3SX5ZA#ce7^rCWwnU>*DI7v-%Ls4a(I4Ut?fX8TXWvZFlnrLxj zg^+K1Fa;&6>`eY?(Mpr>ATb{ySude2#LLEtenptYDt1(%dLywU&>Y^K4 z7dO+F|Lu_gp6fsT8bf#(%KFgcDst zpn=mtaJP)y!E1eAmd#~DPwby2Ze%TzGZ;#l0QyADwQnj%8~Kz;udzh3L9=(n_4+J% zVkaDg9qXn+0I0k;I=!q~bEpRfu}dkP@w}OT4nHxl7GlavFVkIMo?U^JJ*UMeT{F>L z4?Z`_r=UMZqzK+^ea%se_ast<=OzNqUn)#-#Izv}m9!9znsGu2^NN&#_jVBGi5e%^{D zk2(m{5L=@?Jmx{u{+mfDK5Otxu~@9-$ErvfeYpd#!>qSPlKj}Wp8ZafKVJE zqG90{QIBp()T1llR+bf_&*d- z&wZ_Vdr3(h?&qYuIs6E@o!gMN6B3TRhVvh(kC6%2&>pz*V%Ov8*4$|oQ zr-Hxk`qlE}aBvix7A-AE1IqV<;M+++=uWy9FsGqT8X;<_@Doz%Fij&_BS;*cV46K>KGLPN%bO~dR zHFEDxdX?eao*7z(x_shQ30kh1maF$3M|~~fg+n>J)rE;89L_|?p z!T;#d9griKdk3WCyaac>ebYCMJk_UXoM>oRG5EG$f|vR|i9w{l8R;hn$OT8^AeBc| zkSYN$^+*MV#y8P{Jyp=9eNr0TS*>SvUgZudi@al|Y)%CqExxK(%2r)?a@ah$w{^Q? zUfNpcznuZR0=9?;K8=}WS&=rR$vNMCg`${EcHchWkdU)sV#!frf7nr=C!QD$i^O@J zG8kutjac8y6!(Aq>UEsOdB^n=6MN^$P2h5Awv%raaR;FpK?qjp{%jeWilxFX6-Blv z9&W|8d~pYJ^|xn<>rdB_rhS(uk;&P=E8+fQp!r%<4{RvG2CI__T?1)`}OrY;*WYX|qfga?aqUIv#?dT(gzg`mw ze_gZF(Zpx#fFPa(pz>csf;>lC>^z02p zMOGus)QCob3c6`UNoj*asHbUu$LstvCmYzau+V#>kr$(asoj|;)Yakv#kwE#PTB&z zSMJ{KyK@}SZUVL%hj2|9Lf0B^?iZ~JiR^yY+>rs3QHRvUibAL>MMkT90qgo#OAN?BkV_VH zZ)1{Pvoii~MWP{?B8>xUGFi&TZ4vDvAQ9~~F6e4R(e(sSN*QAlLNE?kWGG3!G*8a%ZMiO6n zemfv5J9|pblvz!qaLnBgpMm*QZ3MfcAzHT?1M{Dm8Q4f^iggjA^$fFF%8*J$i)-oq zsy${SC-pf#| zJ|_h1e3LLMd*&0~IeUgTXaZLrXd(X*Yt@Fk!R(N~K1$3U`U0Y&LtBGFZth>ga17Bg zK_jIMGPPt1e&*_!66LA#;>Bo~D0ol8mYUGic3s)rRxG7iAc%hxRq=|}C7m=J{+ z*q5e$K(Fze+cRb&K1b_q+^|Y*A4{r_QqXs=jEPYAFesAkZQ^2Yrq3WclDuK=jDYw{ zdq5A9e(b=I7qG?mbNM}E9s_AqJxta8HG}8LVf@kX%W+G}QK|j6_|&AB#9m?T>~)(W*mC;B`^ z2@Y_~QpENx-09_8P3l%_RJhySX=)F1$3-VmeofbW8~FC+63BzEM6RS%-*Dv%?z=x0yrZ6FGZfD>6r!L&^eb+HZMKWssdkI` z7dm7uyU&o!aFC;P@=^NjGa^~;uO@x<`Njc`_zmt25sz!d3!FmcIy@mV1^FW+H-%3k ze~K1*inUIynpPcb90?ZAo{%Ogtl|BxzrCQ~$DaIn*&Td#P_L1;ydZ}T z(q!)$5;zxD${)m?YKKTUe@3$6*9?E$d#+AS1-jhC6#NjBA5wirvwB1HNIRF)j9qyS zWebT$oF4*{#4Oyf`5!lldrR0jdq&Db9O|i+8+Y@)4>^937b(8cX~Ckm%|6wOMlPBT z3qH-DL;0NE=EaZ0A6|EXhZCQKw6OtYw1E{=co>n_`U}{>LF#AOMs=m(5*4Q-E8Z{( z=@lNTV2r6{XUv;KB%_x=H*DAgcuhvP6(#Q5)1Mr!mjpom_)0HEgF9c-THN7G>2w1Z zaTtZ-AcBC@-6~l$Gdk^7mce%#(M5$WK*kT4(5n!BPUs7lEe{KRrq1RL0<;J)$8U6q zu4PyU#0Y~O-1tebg@y-4C_DAE$RN!9{k&}~dTNOtf#$o;X^{V{#H{zP;;BdspqNkW zg{<23LU^(dSt0wrbMmvqtp7d(Dc{%QMdRvjbkC*keBxIm00Erd+=`fadh+eXyq2$` z*8JXxI$pQE9X__gioOt?@7~n5ZLLVKI_t1a|2_29VfB34!O-37yA+0RJw``s`8b5< zUKo+^@PZ&jd{*R5h8Ii$yI1UzK5@z87|1;ag7cZ8yMxM*ytsQu_{T)vnb5SG^l2IzHQ8?1lW4Ck$IwQTdh8 z*@QbQu8AK7$AsH`@~3!oc-?lF~?*mFvf+1mfCHR z0N1P9yiZ(opr0v16;%cd58t~`wMfiQ4R=ww84g}Ve*#VU_4Appw$LVO*EMB%-il{f zwYlF;tm=fEb8f;nAHV%OVGo!7-ka%ykGB0RK&s~2jtzJB<8nUGBk?&%MA+e>fchsN zWaZgNw%*Sgxp8cpJS1zDlD_Bu^-dLCbaeKt@);> zrGdOqbFZB6+;xJg1YKtCm@p3=zYV2Xi;?gQ8e{_{Yrm4x&oYRI$XFL0$m24r9GecP zJYpnsl+?d0^>kf5Y^>=kPR<%SVeDj_-OW5+_pYmkMs}KG`+P;R)`z>lr0B^9|wo zzZ!}GJAvM!LzL#Cx5%EmInn|F)!|@3c&kZy-3F#gf{<%3S*NR44jx+Phm&S1e?|Kf z3(m_#CIvH?g%*Wr@4v_Y^H{any6z!L$2Rs{$IBj9YwBX$D?!hgulyD1p95n$;t^D9 z?Xk=9Mh#Esx57_t+)vzj9Qqh0Ns_-jVqEVIkGBi`;%!q(&9(dNyg5&-i~#YxE2ugj zK^7T9L#znPyqFxtFqL<*hAPK{oGvU!#e$@5D_r(((d=##((1K0kmRP7KYhFkr(Em6 z#I<;V0%{&guL^C$N=QxSOQUCxN)ApxL2>Z{L-k~rH8%@&hq#JRnxS9De54A(L0);i zvV+5ywKn`DyNkG?A9lT^9(E<1b0HJ7{Cx{5v}|V_^m?Ty0SB#!8$=d9yEV*_zN%n?zUf; zEJqR2T8^!pJD#v74o;ov!(8rS_}FZC9;61$?8f^UH!BzGE5{R z;&KcA9u>vQ@^JmbPJj<>p_b(xN_hyaScKJc=Qt*h(^Xcq0V9{jTWVGXv7_Ug+=mwd zCwocU@}%70TM6IQIqfWO>pvr+p78TUL*oaltLtV75NHU6sDJL$g@}PKVKyE=?vGFu z@fD&^mqUyKyDexz%=I=1uPs(Zl!Fm{pP0|y(Wt0t`lHA`866Mz40B}!^u63~UHNi) zp1yOwqglTkBYzNV3{vW+T%j5_YdQ zLjhxr@4B)u0Vf)qlY@mPJ*j3}qT6%(bbVv~mgUd2B)P2Jf>KWwU}QKUQD?T9xIf!d zb}!Q%@&eFd!NlLlq1T^p`?jH8u+Av&#C#%txI!&?U{z#=x{-zJZGOp1-Evvh_ z%~c-vJQd1BqtDqFccB+h(b^t+y5lUhlq}{TB?eb>BR2{#paZ*3fZrzcf2G)oHkT@8 zrF<8&7A6IC8^Ybc-Vk#EZgF)A^$@znS@TVT!=vwV(bC&n(-D~_e^dj(!juC>O=hik z3jTb{tFo+6ZgeWl478XH*&qNCetE5Oavynp4zE)}bnZ6X8-6z2?|javoGAFnAfS4d zFn9mf`FiQ|`g#VN$>lq~yI7!NW&L<-^jdF_B`PP9pHeXez;1aa&rn@6l|l=_g1l8% z@MFv%fLC-cT^f&8i<6Q2bs+bYoK}aev-hPp?vP*KLF^6dDlxz|m3bGIU37GZ&ESaa z>tW{Ic!e&0!=2r$fA?9{S`~mkeKcN`19}=>r|%b0?BDL>KO?`sCXsKD{V2+x#-hJk zja%hKF@*^W-XR=hQGE;D4C2UY`)=xGF=hZ)xnJk1kTMAgY4lXm8ZAhgFK8+4lB}gncKNN!z_CA=`(RKxp(BtH9=`pjGJTtCx zK`mdJsqL{HC{Hy#1A3X<&#PktpW8K}0~!R_J$@I6qZ1o<&P(~X-iM)SMS)PxmqVZg zZ2FL(>?FpJ7Zu{DFC5ha8ef%j^J%~e7o&74QvT!I4Tkv8M|`D`AfX5?46uTYAEGj2 zGaOkrT>R%%;_hx-sPb5-;nGKw!9+OQ=PkEh7bGeBEs;B=Y)l z(%Vv}PNmt2czM3kQE5lR|GFt-{b9<-8v5G$vK6zOcKPa8ZF@*aUURJc05K`)3@Cnl4-rR{A6j(?MwhI=v>HcxptgaB?ABC;O&WogmIQ;kZR>gf(vGiY`k9(S z%CpPXOO}sW)yPFlWB)!Ug(@6BQ{J)@gUSh%uA|blbp_$Y=4nB5i^EjoV*^1tmA#ZN z?~owgxid?;Wk1yE%CN5W)Sn9imWx_doK)i-;YW|q1#kDXy3Hr9<v=o-9(^Eq=h2d=Yr$97G`uzIf-4tiEKD=POTN z^7`SmTgbU7{$j;_oV{N-06Ub3VOfp^^V)vgDqO#_ zXS^RkCAfa3xplFgnsPV_NFso2B>8bzCbuWEc&4_W@zKz}1YHhOIXAzHzqUAq4cV=9 z^j+?R^Q7Nd%#Q`-f4Vn1NSl7NSXV1`J@=c`P*V2~rLT-Xs$coX&**pljK>&_8{M|j z*sa&*N>dq=vrshKV*8CBAc4h2g&q% zwQ#?hWioT{CzsuB=z9}Qt+XbeMb}%TTMMg26eb00>0r z@vmXjhZq`21Br!yKO}8uFqh5bb|bj#@>eICED1BLyzT}XI-Yk*w7jJEJ^&k1z`I6! zB_*#fA;X2xL24xJBgYKrNfR?r{H~#=K@$ZI_Lg1c~-J$sOgn)zJAx<9P zSuJ}c7&z{bydnR$7}5tZ`oMt}y=B=T@|30G$8$wF2tHjnaIp zuJ@yrsxIM9izlTe8;&)eCoW~>Z5q9att1o%92`(s?U#x{k|F>#*hTTYSbj6Clv(axI()kq08s3-!Kw z|N2x(pJBg97H2TE{^04|M@FikoC}y;+VUD2)PLk~qwc@(^q>=rH&l5J*2Y|QgEUba zzJp_g*evg^7QTX0Sz4C*MG5R(V!$-1eU{6eLB>S=SHw}&DTQn$+8f_(-Cp|Q40g?= zx2ji}+{d9o-3f0m)!Rv8>h(?nq`!@r8qGMrOFy9*!=;Qn+G=)Uj%}n-*Wf+Pv6?S5 z@-6t)Pt_rBkC25i>CXib;|)@iF^?`H+_fz zxMK5Jb!kHe;^*7-D!=pbvP50hP7MR+-dO4#z9WuO*hUD}MF$e7*=~nCZgWE9yw@@H z^_`M}x-v-M{#5)e^mc!Et#KO-O}*2E$M$3e&I5;mn4dYpQsVB=_|KSZT0kfuKU9Qw zjd}QjVZSue`7zsm;U+*Z>xg}-lKliC5O7AVOYxTbDp0{~OW=-g%6pG0F7Tl@DH!8F znyjBP?hON2{_ii-EFeJ{VN!So?e2FQ0b;-<8;y*juGp1GqSgA39QthQ@;p}WoA)<9 z*^hOgP@RHFsHo}sac(xCK|sUex6i`~-}47z7gXVZn0mEMs@fd~y350!y<0||Tu$!_ z3eFaQH1=;5LB)+8%Nk2{|9Jk3x*#uC5}sYe%I0IsdDof0=~@T6o#O^|d19;g<~x>V z@fsfZaQ=o$Ltmm$1NGcq!<$kn_DC~;{Ti7983E9E5TmO@*J??Md4}q%lGQ6jK?VU2 zsZx`o;0D@JtCPf#;Lx3fq9RFSU}MXp^~>K;W|A_j9NW!^w8v4r>41l5;Urp3%f{99 z*oDgdicW98>;fAg3}rk|_+)&&0uBc)r`lmmy=$=jUSG*NUrsS@n~lQFO3E`X@IpfA z3uwixwtH}j@(rR=zFp386!Q@fgCRH8s_~wpk5 z2O69wA0wLGUPXtQ?Vgp{Y?k3|DqHFa(pT8cS<<)c`Rt^uGE%w>H>o;ZzV0UFYZ3-Q zEJcCbjdxJ?6EG{ppkJ?xqrb1S`RVF;wC!^&o3S!oE%3X04-%|7zvxHE<{Eu8(m!4n ze(29=UF7LBos_n5$xN;M>)c)knn!e?&z^BI3ZopAnh|b#>7gd8uDQBzm?1-S^5EcYEL}-#SDt-)-{I;De_leUawWH#CDWt6sbQ=JdeoX9w^D)pnJ(kysE=I&zCi*WWf`f=Rw+d*ysn!@f=nU1AvtFdpVnk6@2aeIV|(mjZaXHX@~k(6av97^DO zyp{G#wB#W^exh?U%0{8*BWv6Qe#|kpIvH7|HYlPXV3&{@p=qaGXY;arBK<;n} zazaxLHLJ4>@9lg_(%`6fpHug(R{W`hZ2A1Q+GKE5t|kPM$-d#x)LBOpwWb9Hn)AlH zTJQbm#idOM9dYgug1R>*@cH6=fsWSEhM#|F2R6WE|LMW;)mM!FP-}P0ph>glJwF8Z zb}K)zNlIORVDtZVB@Qh)V_u;_UfNeMAnYiZ#kL*0SD<5&`!FY!;G<_xVNqm`z zLx$(OtNJ2XKGyOA63RRMr@GvoN(}@yBCT#xNSdsHu_iz;QWU z8W%pHM@3fA79uT|Z{oQ>8y8`fy!;`cSB zC*LY-`)nngy?Ip&vxG&J>;H6UzV`owbvIe2;RP_g^|k}=f3~uH3mT|;#Tkjo06O!_ zMnt{&j2)qX7w(T592_Eq3ewWR8?W3S{B6WIfP*2g^c`wkw-H_*2`~8Mc|Cfnnu!`h z(N~{jRz!9(z9jjsf4W?6D{3-vURjw3VzftEE_ayitsbo8Ul1iV8$@+-NFCMIY8Fd0 zbZNV|wUXhvGgbA%w6&p_cI|hez^Lt}<~H~!QSCJ=4(h&ZLhMGk@cTbK-E~lu(cS>y zWm!60x?$-K5pXGKP-;n~K}teN2>}t71_?#FLs%N5K}u3V=?*0%L_|s&?&03~z8U^- z27LG3)A2jc2|et_+nXAv(0!M)VNB?}uzO_6g`pHJkBuL(+I z|Gsi=R|zTlI#Q3a3o!Y&xL-=TIkF@5`@~!J?7R5>TkYgDh4p^J^`WbeoXB)dl!TEf znFwr?m4wXHfh=aGv9#}q@?O3`+}ynsi-1vhT1EG={H1E_?d$DW9zou&YVDno<2cr) zh9|DSaGK8}v`+koh0101nir<9r@eaGStRmIe+i}@Ox|s3v|$)JzfyZ(I!1aC9rwYm z9wKthA~JXtT~^t5s?S|=56|Zs4YqGsZ@&+A3IIb7=NEM4Kga9}j6m`KEy&86em&fz zAHQ_65s$s;KYc$`O*M~4n1-avAqpHnT(f_|3N}!5cdY;ZAR7NWcF9hbkq~*F^8$+` zT_OYmmYa>$1M-LNLq^^|ab-Ncgt#<2b0iMIUZlNcDz%G;Sc2Mov*ii%E1wGj0}k`G zLX`wIbpG5)I?nz(@%wrg7!_Y-m>=m!l2>5X{!P|j!@9{we5dhpbFS5+SrD45u^V{* z{Fz)!@e))|`osO$&f=0OuT0OOe zZ5sdEieMP1=j)hO0(R_Fk273x%&sYVUd9qLiqn4=x}+_>de9x@znhYfa-Q+;%cE5O zc4iNoU%rD+!P}ZaK^*3AL5SUR9Uu6mqM|4?(fNB$8q>87nLe)7W<&&6ZhO zt1?Z*WbKy;F15Seqxddh87}-4CPh6rDvHHCm zuV(XT%jodzc_uOdei=@R2MG;}U>B2N+@|h`2dcr3-+MN2$O7_*#6{gdjX#ryl}~0^ zP8=D$Up8WaQQS<6ALqWu2P}wM;9?AjkimSfqk9yP>+ynT?)uVAIO6Ca+-m?Cs5zdE zqlkYsv&RmGm#rH{{`Wq;_k8HK2VFWJrW`s65HAw8h*qgWskuzOC=qhm95LL@%_>BK@EP5=dWYbAaG{7FbYRC zx3ljyMu(RYJ)BbqGqMt1QY#eOkH5#8VkyEYSmISct#+vgKP%l8(qt4gyEQrW9wgdK zTHP#i*K3Z)NtJf>Qv#{|Udt^z9VQ|uwqYqxdYon&_jx57x3e5EBlEO5FpqmXbhU4_ z*%U=9rQIw;=`1ObEK3w)nH{YvXbOVb#$GXV+)IH5ff@Dc*4^(a)*de>oJZipZMBf% zxFW;3!AKIej^iSf3PqA#IftzpD|335lkv|ptgqR+>wC+w`tv#!F{}f5_4p92s)VRP z;x;u^T6a6YdWj%RT|C)F�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 Gq5lJDrhQ!i literal 0 HcmV?d00001